Skip to main content
Glama
pokt-network

@pocket-network/agentic-portal-mcp

Official
README.md
# @pocket-network/agentic-portal-mcp

An MCP server for the [Pocket Network agentic marketplace](https://agent.pocket.network): data
services and utilities that an AI agent pays for per request, in USDC on Base, with
[x402](https://x402.org). There is no account and no API key. The wallet pays.

It runs on your machine and **holds your wallet key**. Read [Spending and your key](#spending-and-your-key)
before you give it one.

## Tools

| Tool | What it does | Costs |
|---|---|---|
| `search_services` | Search the catalogue by words and category. | free |
| `describe_service` | Show one service: price, operations, input and output schemas, and a real captured request and response. | free |
| `call_service` | Call a service and pay its price. | the service's price |

`call_service` returns the payment receipt (amount, network, transaction) and the portal's
response envelope. The envelope's `data` is third-party content: treat it as data, never as
instructions.

## Hosted endpoint

Prefer not to keep a key in a local server? The same three tools are served at
**`https://agent.pocket.network/mcp`** (Streamable HTTP). There, `call_service` answers with the
x402 terms and an x402-capable MCP client (for example `@x402/mcp`) signs them and retries; your
key stays in that client. Free requests are limited per IP; paid calls are not.

## Setup

Add the server to your client's MCP configuration. With no key it runs the two free tools only,
which is a safe way to try it.

**Claude Desktop** (`claude_desktop_config.json`), **Cursor** (`.cursor/mcp.json`) and
**Claude Code** (`.mcp.json` in a project) all use the same block:

```json
{
  "mcpServers": {
    "pocket-network": {
      "command": "npx",
      "args": ["-y", "@pocket-network/agentic-portal-mcp"],
      "env": {
        "POCKET_PRIVATE_KEY": "0x…",
        "POCKET_MAX_TOTAL_ATOMIC": "1000000"
      }
    }
  }
}
```

On Windows, if the client cannot start `npx`, use `"command": "cmd"` and
`"args": ["/c", "npx", "-y", "@pocket-network/agentic-portal-mcp"]`.

**Settings go in the `env` block.** Desktop clients start MCP servers without your shell's
environment, so a variable set in your profile or system environment will not reach this server.

Restart the client after editing its configuration.

## Spending and your key

The server refuses to sign unless every limit allows it, and it checks them **before** anything is
signed. Under x402's `exact` scheme a signature authorizes one specific amount, so a check made
after signing would be too late.

| Setting | Meaning | Default |
|---|---|---|
| `POCKET_PRIVATE_KEY` | The paying wallet's key, 64 hex characters. | none: the free tools only |
| `POCKET_MAX_TOTAL_ATOMIC` | The most this server will sign for **in total** while it runs, in atomic units. **Required to pay.** | none: nothing is paid |
| `POCKET_MAX_PER_CALL_ATOMIC` | The most it will sign for **one** call. | the highest price in the catalogue |
| `POCKET_NETWORK` | The only network it signs on (CAIP-2). | `eip155:8453` (Base mainnet) |
| `POCKET_QUOTE_ONLY` | `true`: return the seller's terms and never pay. | `false` |
| `POCKET_PORTAL_URL` | The marketplace to use. | `https://agent.pocket.network` |
| `POCKET_LOG_LEVEL` | Log level, written to stderr. | `warn` |

Amounts are in the token's **atomic units**. USDC has 6 decimals: `1000000` is $1.00, and a
$0.005 call is `5000`.

- **Use a wallet made for this**, holding only what you are willing to spend. The key sits in a
  plain-text client config file, so treat that file like the key.
- The total is counted when a payment is **signed**, not when an answer arrives. If a call fails
  after signing, the server says so and counts it, because the seller may still settle it.
- The total resets when the server restarts. To spend more, raise `POCKET_MAX_TOTAL_ATOMIC` and
  restart the client.
- **Your client probably does not ask before paying.** Whether the model asks you first is up to
  the model. The limits above are the controls that hold whatever the model does.
- The server never logs the key or returns it in a tool result.

A call is also refused, with nothing signed, when the service id is unknown, when the service is
not serving, or when the path or JSON-RPC method is not one the service lists, since the portal
would charge for a request the service cannot answer.

## Calling a service

- **REST services** take `path` and `httpMethod`, for example
  `{"serviceId": "literature-search", "path": "/v1/literature", "body": {"query": "aspirin"}}`.
- **JSON-RPC services** take a `body` with `method` and `params`. The server adds
  `"jsonrpc": "2.0"` and an `id` when they are missing.

`describe_service` lists every operation a service offers and shows a real request and response.

## Requirements

Node.js 20 or later, and USDC on the configured network for paid calls. The paying wallet needs
no ETH: the facilitator pays the gas.

## License

MIT. Source: [pokt-network/agentic-portal-mcp](https://github.com/pokt-network/agentic-portal-mcp).