Agent Kit exposes MCP tools over POST /mcp (JSON-RPC tools/list and tools/call). Do not rely on a fixed tool list in documentation — names and count change as Agent Kit grows.
Discover on every connect. Call tools/list (or open the dashboard Tools page) for the live catalog: each entry includes name, description, and inputSchema. Wire your LLM or backend from that response.

Authentication

POST https://agent-kit.abstraxn.com/mcp
Authorization: <application-api-key-or-agent-api-key>
Content-Type: application/json
Key typeagent_id in arguments
Application API key (dashboard Overview)Required when multiple agents exist
Per-agent API key (createAgentagent.apiKey)Optional; must match that agent if provided

Tool categories (OAuth scopes)

OAuth and consent use scopes, not individual tool names. New tools are included when they fit the same category.
ScopeWhat it covers
mcp:tools:readWallet/chain reads and x402 catalog discovery
mcp:tools:transferUnsigned transfer intents — your backend signs and broadcasts
mcp:tools:paidFixed-price and external x402 HTTP calls
After OAuth or API-key connect, call tools/list to see which names are available for your granted scopes.

Calling a tool

  1. tools/list → pick a name and read inputSchema.
  2. tools/call with params.name and params.arguments (JSON object matching the schema).
  3. For application API keys, pass agent_id in arguments when the schema requires an agent (typical for wallet actions).
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "<from-tools-list>",
    "arguments": {
      "agent_id": "AGENT_UUID"
    }
  }
}
Some tools return payment required (-32402) on the first call. That is expected:
  1. Parse accepts / payment metadata from the error or tool result.
  2. On your backend, sign paymentPayload with the agent accessKey.
  3. Retry tools/call with paymentPayload at the top level of params (sibling to name / arguments).
Unsigned transfer intents are different: Agent Kit returns an unsigned transaction; your backend signs with accessKey and broadcasts — it does not use the x402 retry flow. Details: x402 payments.

Example: list tools

APP_KEY="<dashboard-api-key>"
MCP="https://agent-kit.abstraxn.com/mcp"

curl -s -X POST "$MCP" \
  -H "Authorization: $APP_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq .
Use a name from result.tools[] for any tools/call example in Smoke test.

LLM integration pattern

The sample backend API (NestJS reference):
  1. Sets MCP_SERVER_URL + MCP_SERVER_AUTH_TOKEN (= application API key).
  2. On startup (and after reconnect), runs initialize + tools/list — map whatever the server returns.
  3. Maps discovered tools to OpenAI (or other LLM) function definitions.
  4. During chat, the LLM may call tools/call; results are fed back into the model.
  5. Paid tools trigger x402 signing in AgentSigningService.
Your frontend only talks to your JWT API — never to MCP directly.

Next steps