Agent Press Wire MCP Server
# Agent Press Wire MCP server
An MCP server that lets AI agents (Claude Desktop, Claude Code, Cursor, any MCP client) announce product launches and distribute press releases through [Agent Press Wire](https://agentpresswire.dev). Each call is paid in USDC on Base over [x402](https://x402.org), from **your own wallet**. No account, no API key.
## Tools
| Tool | Price | What it does |
| --- | --- | --- |
| `announce_launch_newsroom` | $1 USDC | Drafts a 350-450 word AP-style press release from your product URL and publishes it on a public, search-indexed newsroom page. About 20 seconds. |
| `distribute_press_release` | `tier: "wire"` $99 USDC, `tier: "premium"` $299 USDC | Drafts a 450-600 word release and distributes it over a newswire to 500+ news sites plus 100+ TV and radio network sites. Premium adds AP News, USA Today, Barchart and StreetInsider. Requires `city`, `country`, `contact_email`. Returns an `order_id`. |
| `get_release_status` | Free | Status and live coverage links for a wire order. |
The service only charges when the job succeeds. Failed drafts, rejected topics and wire rejections are not charged.
## Safety: quote mode by default
Paid tools **charge real USDC**. Settings that control spending:
- `X402_PRIVATE_KEY`: private key of your own Base wallet holding USDC. Without it the server only quotes.
- `MAX_SPEND_USD`: the most the server may pay for a single call. Default `0`, which means quote only: every paid tool returns the x402 price terms and never pays.
- `MAX_TOTAL_SPEND_USD`: lifetime cap across all calls and restarts. Defaults to `MAX_SPEND_USD`, so out of the box you get at most one paid call until you raise it. Spend is tracked in a ledger at `~/.agent-press-wire/spend.json` (override the directory with `AGENT_PRESS_WIRE_HOME`). Every signed payment authorization is counted, whatever the HTTP outcome, because the server could still settle it until it expires. If a call failed and your wallet shows no transfer for its nonce after `valid_before`, you can delete that entry from the ledger.
Paying takes two calls. The first call (without `confirm_token`, or with `quote_only: true`) returns the price and a `confirm_token`. The agent shows the user the exact price, and after the user approves it calls again with the **same parameters** and that `confirm_token`. Tokens are single use, expire after 10 minutes, and are bound to the endpoint, a hash of the request parameters and the price.
A payment only happens when all of these hold:
- the key is set, the price is at or below `MAX_SPEND_USD`, and the lifetime total stays at or below `MAX_TOTAL_SPEND_USD`;
- a valid `confirm_token` was passed and `quote_only` is not true;
- the server's x402 terms match values pinned in this package: pay to `0xF7887C1fAf0DbAedc80C78F9D396D594B69eba95`, exactly $1 for `/v1/press-release`, $99 for `/v1/wire-release`, $299 for `/v1/wire-release/premium`, USDC on Base mainnet, scheme `exact` with an EIP-3009 transfer authorization, and `maxTimeoutSeconds` of 600 or less. Any mismatch is refused, so a compromised server or a wrong `PRESS_API_URL` cannot redirect funds or raise the price.
The per-call cap is enforced twice: by this server before signing, and by the x402 client's own spend controls.
If a paid call fails after the authorization was signed, the result says the payment was **not settled per the server** and includes the authorization `nonce`, `valid_before` and payer address. Check your wallet before retrying.
Examples: `MAX_SPEND_USD=1 MAX_TOTAL_SPEND_USD=5` allows up to five $1 newsroom releases and only quotes the wire tiers. `MAX_SPEND_USD=99 MAX_TOTAL_SPEND_USD=99` allows one standard wire release. Use a dedicated wallet funded with only what you intend to spend.
## Install
Requires Node 20+.
### Claude Code
```bash
claude mcp add agent-press-wire \
-e X402_PRIVATE_KEY=0xYOUR_KEY -e MAX_SPEND_USD=1 -e MAX_TOTAL_SPEND_USD=5 \
-- npx -y agent-press-wire-mcp
```
Quote only (no wallet): `claude mcp add agent-press-wire -- npx -y agent-press-wire-mcp`
### Claude Desktop
Edit `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`, Windows: `%APPDATA%\Claude\claude_desktop_config.json`):
```json
{
"mcpServers": {
"agent-press-wire": {
"command": "npx",
"args": ["-y", "agent-press-wire-mcp"],
"env": {
"X402_PRIVATE_KEY": "0xYOUR_KEY",
"MAX_SPEND_USD": "1",
"MAX_TOTAL_SPEND_USD": "5"
}
}
}
}
```
### Cursor
Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):
```json
{
"mcpServers": {
"agent-press-wire": {
"command": "npx",
"args": ["-y", "agent-press-wire-mcp"],
"env": {
"X402_PRIVATE_KEY": "0xYOUR_KEY",
"MAX_SPEND_USD": "1",
"MAX_TOTAL_SPEND_USD": "5"
}
}
}
}
```
Other clients: run `npx -y agent-press-wire-mcp` as a stdio server with the same environment variables.
## Example prompts
- "Announce my launch: https://example.com, we just shipped v2 with offline mode."
- "Write and distribute a press release for https://example.com. We're in Austin, United States, press@example.com."
- "How much would it cost to get press coverage for my product?" (the agent calls with `quote_only: true`)
- After the user approves a quoted price, the agent repeats the call with the returned `confirm_token`.
- "Check the status of press release w_3f9d0a1b2c."
## Quote response
```json
{
"mode": "quote",
"paid": false,
"reason": "no confirm_token: this was a quote",
"quote": { "price_usd": 99, "asset": "USDC", "network": "Base mainnet (eip155:8453)", "pay_to": "0xF7887C1fAf0DbAedc80C78F9D396D594B69eba95" },
"spend": { "spent_total_usd": 0, "max_total_spend_usd": 99, "max_spend_usd": 99 },
"confirm_token": "ct1.1791069332201.6cba...d563",
"confirm_token_expires_in_seconds": 600
}
```
## Development
```bash
npm install
npm run build
npm test # offline guard-rail tests against a localhost mock x402 server; never pays
npm run test:quote # quote-mode smoke test against production; never pays
npx @modelcontextprotocol/inspector node dist/index.js
```
`PRESS_API_URL` overrides the API base URL for testing.
## License
MIT
TDQS
Scored across 3 tools
announce_launch_newsroom and distribute_press_release both draft a press release from a product URL, so a generic request like 'write a press release' could initially blur the boundary. However, the descriptions clearly separate cheap self-publishing from paid newswire distribution and cross-reference each other, while get_release_status is unmistakably a free status lookup.
All tool names use snake_case with a verb-object structure: announce_launch_newsroom, distribute_press_release, get_release_status. The pattern is predictable and readable despite the first name being slightly compound.
Three tools cleanly map to the service's distinct stages: low-cost newsroom announcement, paid newswire distribution, and status checking. Each tool earns its place, and the count is well-scoped for this narrow paid PR workflow.
The core lifecycle is covered: announce/publish, distribute to a newswire, and check distribution status. Minor gaps exist around listing prior orders, cancelling a distribution, or checking status for the self-published newsroom announcement, but these are not fatal for the main workflows.