Integrations

MCP server

Stitch AI hosts the Model Context Protocol server. There is nothing to install and no key to request: point your client at one URL and it gets three tools for searching, inspecting, and enumerating agent memory.

Hosted endpoint

MCP endpoint
https://stitch-ai.net/api/mcp

JSON-RPC 2.0 over HTTP POST. No install, no account, no key.

Stitch AI is published in the official Model Context Protocol server registry, which is how clients discover it without a hardcoded list. The machine readable descriptor lives at /api/mcp/manifest and carries the server identity, chain details, and the JSON schema of every tool below.

KeyValue
Endpointhttps://stitch-ai.net/api/mcp
TransportStreamable HTTP. JSON-RPC 2.0 over POST, batches and notifications supported.
Protocol version2025-06-18
Serverstitch-memory 1.0.0
Methodsinitialize, tools/list, tools/call, ping
AuthNone. Reads are open and there is no token to request.
Rate limit120 requests per minute per IP.
Data sourceThe registry at 0x2E681c71416E1AA1f16bf7403276882E13Ed66Ad on chain 4663.
Manifest/api/mcp/manifest

The server is read only. It never asks for a private key and never signs anything. Buying access is a wallet action you take yourself, covered in the SDK guide.

Connect a client

In Claude Code, one command registers the server. Run it in any project and the three tools are available on the next turn.

bash
claude mcp add --transport http stitch https://stitch-ai.net/api/mcp

Claude Desktop reads claude_desktop_config.json. On macOS that is ~/Library/Application Support/Claude/claude_desktop_config.json, on Windows %APPDATA%\Claude\claude_desktop_config.json. Add the stitch entry in its remote form and restart the app. Any client with native HTTP transport takes the same object.

claude_desktop_config.json
{
  "mcpServers": {
    "stitch": {
      "type": "http",
      "url": "https://stitch-ai.net/api/mcp"
    }
  }
}

Fallback for clients without HTTP transport

Some older clients still only speak stdio. For those, the mcp-remote bridge proxies stdio to our endpoint. It is a client side shim, not a Stitch server: you are still talking to the hosted one.

claude_desktop_config.json
{
  "mcpServers": {
    "stitch": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://stitch-ai.net/api/mcp"]
    }
  }
}

Verify it

The endpoint answers plain JSON-RPC, so you can check it before touching any client config.

bash
curl -s https://stitch-ai.net/api/mcp \
  -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'
response
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2025-06-18",
    "capabilities": { "tools": { "listChanged": false } },
    "serverInfo": {
      "name": "stitch-memory",
      "title": "Stitch AI Memory",
      "version": "1.0.0"
    },
    "instructions": "Stitch AI is the decentralized knowledge hub for AI agents. ..."
  }
}

Protocol

Every call is a POST of a JSON-RPC 2.0 message to https://stitch-ai.net/api/mcp. Four methods are implemented: initialize returns the server info above, ping returns an empty result, tools/list returns the three tool definitions, and tools/call runs one.

Arrays are treated as batches and answered with an array of results. Messages without an id are notifications and produce no response entry, so a batch of only notifications comes back as HTTP 202 with no body.

batch request
[
  { "jsonrpc": "2.0", "method": "notifications/initialized" },
  { "jsonrpc": "2.0", "id": 9, "method": "ping" }
]
response
[{"jsonrpc":"2.0","id":9,"result":{}}]

A GET on the same URL returns the server description plus a transport hint rather than a 405, which makes it easy to probe from a browser.

Tools

Every tools/call result is { content: [{ type: "text", text }], isError }. The text is a plain-text pack listing meant to be read by a model, not a JSON object to parse.

ToolWhat it does
stitch_search_memoryFree-text search over pack name, category, and content URI. Start here when the agent does not know which pack holds the answer.
stitch_get_packRead one pack by numeric id, with its category label and publish and update timestamps.
stitch_list_packsPage the whole catalogue newest first, with an optional category filter.

stitch_search_memory

The tool an agent reaches for on its own. The search is case-insensitive and runs over pack name, category, and content URI, so it finds the pack rather than the passage. Read the pack payload once you know which one you want.

ArgumentTypeRequiredNotes
querystringyesFree text, up to 200 characters.
categorystringnoOne of onchain, oracles, defi, agents, developer. Applied before the text search.
limitintegerno1 to 25. Default 10.

Example call:

request
{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "stitch_search_memory",
    "arguments": { "query": "stock token", "limit": 2 }
  }
}

The text field of the result, rendered:

result text
1 of 8 memory packs matched "stock token".

#2 Stock Token Mechanics & Oracles
  category: onchain
  price: 0.006 ETH
  version: v2
  purchases: 1
  uri: https://pub-dd7413f0f0a94cbfa2cbeb26c62dc9ae.r2.dev/stitch/packs/2/v2.json
  creator: 0xa7c7F04164db3fB97f6D48916F00A8BE52a6C602
  active: yes

stitch_get_pack

A direct read of one pack from the registry contract, with the human readable category label and ISO timestamps appended to the same block.

ArgumentTypeRequiredNotes
idintegeryesOn-chain pack id. Ids start at 1.

Full response for pack 1:

response
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "#1 Robinhood Chain RWA Primitives\n  category: onchain\n  price: 0.004 ETH\n  version: v2\n  purchases: 1\n  uri: https://pub-dd7413f0f0a94cbfa2cbeb26c62dc9ae.r2.dev/stitch/packs/1/v2.json\n  creator: 0xa7c7F04164db3fB97f6D48916F00A8BE52a6C602\n  active: yes\n  label: On-chain\n  published: 2026-08-31T03:53:58.000Z\n  updated: 2026-08-31T04:17:20.000Z"
      }
    ],
    "isError": false
  }
}

stitch_list_packs

Pages the catalogue newest first, matching the ordering of the listPacks view on the contract. Use it to let a model choose its own memory rather than hardcoding pack ids.

ArgumentTypeRequiredNotes
offsetintegernoZero-based offset into the newest-first list. Default 0.
limitintegerno1 to 60. Default 24.
categorystringnoOne of onchain, oracles, defi, agents, developer.

Result text for a call with a limit of 2:

result text
Showing 2 of 8 memory packs (offset 0).

#8 Arbitrum Orbit Deploy Checklist
  category: developer
  price: free
  version: v2
  purchases: 0
  uri: https://pub-dd7413f0f0a94cbfa2cbeb26c62dc9ae.r2.dev/stitch/packs/8/v2.json
  creator: 0xa7c7F04164db3fB97f6D48916F00A8BE52a6C602
  active: yes

#7 MCP Server Integration Notes
  category: developer
  price: free
  version: v2
  purchases: 0
  uri: https://pub-dd7413f0f0a94cbfa2cbeb26c62dc9ae.r2.dev/stitch/packs/7/v2.json
  creator: 0xa7c7F04164db3fB97f6D48916F00A8BE52a6C602
  active: yes

Errors

There are two failure layers. A tool that runs but finds nothing returns a normal result with isError set to true, so the model reads the reason and moves on:

tool error
{
  "jsonrpc": "2.0",
  "id": 8,
  "result": {
    "content": [
      { "type": "text", "text": "No memory pack with id 99 exists on the Stitch registry." }
    ],
    "isError": true
  }
}

A malformed request never reaches a tool and comes back as a JSON-RPC error instead:

protocol error
{"jsonrpc":"2.0","id":4,"error":{"code":-32602,"message":"\"id\" is required"}}
CodeMessageCause
-32700Parse errorThe body was not valid JSON.
-32600Invalid RequestThe message was not an object, or carried no method.
-32601Method not foundAnything outside initialize, tools/list, tools/call, and ping.
-32602Invalid paramstools/call with an unknown tool name, or arguments that fail the input schema.
-32000Rate limit exceededMore than 120 requests in a minute from one IP. Returned with HTTP 429.