Signal Desk
README.md
# Signal Desk
[](https://github.com/huntercarver24/signal-desk/actions/workflows/monitor.yml)
Pay-per-call tools for AI agents, paid in USDC on Base through [x402](https://www.x402.org). No account and no API key: the first call answers `402 Payment Required` with the price, the agent's wallet signs a transfer for exactly that amount, and the second call gets the result plus a receipt. Settlement happens only after the work succeeded, so a call the service refuses is never charged.
| tool | HTTP route | price | what the agent gets |
|---|---|---|---|
| `render_page` | `POST /render` | $0.01 | a public page opened in a real headless Chrome, returned as clean Markdown, a PNG screenshot or a PDF |
| `host_file` | `POST /files` | $0.01 | up to 10 MB stored at a public link for 1 to 168 hours, free to download |
| `schedule_callback` | `POST /later` | $0.005 | a URL called 60 seconds to 7 days from now (GET, or POST with a JSON body), plus a free status page |
| `recent_launches` | `POST /launches` | $0.005 | every pump.fun token created in the last N minutes, with its creator, the creator's 7-day launch count, and the live Google Trends or Polymarket topic its name matches |
| `trending_topics` | `POST /trends` | $0.01 | what is trending now across Google Trends (US) and Polymarket, merged by topic, strongest first, with score, velocity, a type label and the headlines behind it |
| endpoint | URL |
|---|---|
| HTTP routes | `https://x402-paywall.huntercarver24.workers.dev` |
| MCP, all five tools | `https://x402-mcp.huntercarver24.workers.dev/mcp` (registry: `io.github.huntercarver24/signal-desk`) |
| MCP, the two feeds only | `https://x402-mcp.huntercarver24.workers.dev/feeds/mcp` (registry: `io.github.huntercarver24/pumpfun-trends`) |
Every route's fields, limits and an example are in its 402 answer and in `GET /` on the HTTP host. Every refusal (bad input, private address, executable upload) carries the same usage object, free.
## Use it
Use a throwaway wallet holding a few cents of USDC on Base, never a main wallet.
### Any HTTP client
```js
import { x402Client } from "@x402/core/client";
import { toClientEvmSigner } from "@x402/evm";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { wrapFetchWithPayment } from "@x402/fetch";
import { privateKeyToAccount } from "viem/accounts";
const client = new x402Client();
registerExactEvmScheme(client, {
signer: toClientEvmSigner(privateKeyToAccount(process.env.X402_PRIVATE_KEY)),
});
const payingFetch = wrapFetchWithPayment(fetch, client);
const res = await payingFetch("https://x402-paywall.huntercarver24.workers.dev/render", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ url: "https://example.com", format: "markdown" }),
});
console.log(res.status, await res.text());
```
`npm install @x402/core @x402/evm @x402/fetch viem`, Node 20 or later, saved as an `.mjs` file.
### Claude Code
```bash
claude plugin marketplace add huntercarver24/signal-desk
claude plugin install x402-pay@signal-desk
export X402_PRIVATE_KEY=0x...
```
The `x402-pay` skill teaches Claude the five routes and pays them with `scripts/pay.mjs`. Claude says the price before the first paid call, and each payment runs as a command you approve.
### MCP clients that pay x402
An MCP client needs x402 support to pay; any other client still lists the tools and sees each price in a payment-required result. With [`@x402/mcp`](https://www.npmjs.com/package/@x402/mcp):
```js
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { x402Client } from "@x402/core/client";
import { toClientEvmSigner } from "@x402/evm";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { wrapMCPClientWithPayment } from "@x402/mcp";
import { privateKeyToAccount } from "viem/accounts";
const mcp = new Client({ name: "my-agent", version: "1.0.0" });
await mcp.connect(
new StreamableHTTPClientTransport(new URL("https://x402-mcp.huntercarver24.workers.dev/feeds/mcp"))
);
const payment = new x402Client();
registerExactEvmScheme(payment, {
signer: toClientEvmSigner(privateKeyToAccount(process.env.X402_PRIVATE_KEY)),
});
const paying = wrapMCPClientWithPayment(mcp, payment);
const result = await paying.callTool("trending_topics", { hours: 6, limit: 10 });
console.log(result.content[0].text);
```
`npm install @modelcontextprotocol/sdk @x402/core @x402/evm @x402/mcp viem`.
### OpenCode
```bash
mkdir -p .opencode/plugins && curl -fsSL https://raw.githubusercontent.com/huntercarver24/signal-desk/main/opencode/x402-tools.ts -o .opencode/plugins/x402-tools.ts
```
Then add the dependencies listed in [`opencode/package.json`](opencode/package.json) to `.opencode/package.json`; OpenCode installs them at startup. The agent gets the five tools.
## House rules
- A refused call costs nothing. Neither does a feed that has fallen behind its source: it answers 503 with `retry-after` instead of charging for stale data.
- The launch feed and the trend radar are data only. Nothing in them rates, recommends or trades a token. Sports topics and markets are filtered out, by keywords and by a model check on each topic before it is shown.
- No caller has an account, so nothing is stored about you beyond the payment on chain. Hosted files expire at the time you choose.
## Status
[`monitor/check.mjs`](monitor/check.mjs) probes every surface a paying agent touches, for free, every 15 minutes: the paywall's health and configuration, a live 402 with its terms, the trend sources' freshness, the launch feed's lag, and both MCP endpoints. The badge above is its latest result.
Known issue: the launch feed's Solana data provider has blocked the project since October 29, 2026. Until that clears, `POST /launches` and `recent_launches` refuse with a free 503; the other four tools are unaffected.
## License
MIT. The services themselves are run by Hunter Carver; this repository holds the clients, the uptime check and these docs.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues