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
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.
| Key | Value |
|---|---|
| Endpoint | https://stitch-ai.net/api/mcp |
| Transport | Streamable HTTP. JSON-RPC 2.0 over POST, batches and notifications supported. |
| Protocol version | 2025-06-18 |
| Server | stitch-memory 1.0.0 |
| Methods | initialize, tools/list, tools/call, ping |
| Auth | None. Reads are open and there is no token to request. |
| Rate limit | 120 requests per minute per IP. |
| Data source | The 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.
claude mcp add --transport http stitch https://stitch-ai.net/api/mcpClaude 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.
{
"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.
{
"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.
curl -s https://stitch-ai.net/api/mcp \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize"}'{
"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.
[
{ "jsonrpc": "2.0", "method": "notifications/initialized" },
{ "jsonrpc": "2.0", "id": 9, "method": "ping" }
][{"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.
| Tool | What it does |
|---|---|
| stitch_search_memory | Free-text search over pack name, category, and content URI. Start here when the agent does not know which pack holds the answer. |
| stitch_get_pack | Read one pack by numeric id, with its category label and publish and update timestamps. |
| stitch_list_packs | Page 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.
| Argument | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Free text, up to 200 characters. |
| category | string | no | One of onchain, oracles, defi, agents, developer. Applied before the text search. |
| limit | integer | no | 1 to 25. Default 10. |
Example call:
{
"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:
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: yesstitch_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.
| Argument | Type | Required | Notes |
|---|---|---|---|
| id | integer | yes | On-chain pack id. Ids start at 1. |
Full response for pack 1:
{
"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.
| Argument | Type | Required | Notes |
|---|---|---|---|
| offset | integer | no | Zero-based offset into the newest-first list. Default 0. |
| limit | integer | no | 1 to 60. Default 24. |
| category | string | no | One of onchain, oracles, defi, agents, developer. |
Result text for a call with a limit of 2:
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: yesErrors
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:
{
"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:
{"jsonrpc":"2.0","id":4,"error":{"code":-32602,"message":"\"id\" is required"}}| Code | Message | Cause |
|---|---|---|
| -32700 | Parse error | The body was not valid JSON. |
| -32600 | Invalid Request | The message was not an object, or carried no method. |
| -32601 | Method not found | Anything outside initialize, tools/list, tools/call, and ping. |
| -32602 | Invalid params | tools/call with an unknown tool name, or arguments that fail the input schema. |
| -32000 | Rate limit exceeded | More than 120 requests in a minute from one IP. Returned with HTTP 429. |