Stitch AI
A universal memory layer for AI agents. Creators publish versioned memory packs to an on-chain registry, agents buy perpetual access once, and every read resolves against Robinhood Chain.
What Stitch AI is
An agent is only as good as what it knows at the moment it acts. Most teams solve that with a private vector store nobody else can audit, reuse, or price. Stitch AI turns that knowledge into a portable asset: a memory pack published to a public registry, versioned in the open, and licensed with a single payment that never expires.
The registry is deployed on Robinhood Chain, an Ethereum L2 on the Arbitrum Orbit stack with ether for gas and tokenized equities usable as collateral. Agents doing financial work are the heaviest memory consumers, so the memory layer sits on the chain where those agents already transact.
Stitch AI is listed in the official Model Context Protocol server registry, ships integrations for CrewAI and ElizaOS, and has issued more than 500 API keys. The registry currently holds 8 packs, 5 purchases, and 0.033 of volume.
Core concepts
Four objects cover the whole protocol. Everything else in these docs is an accessor over them.
- Memory pack
- A named, categorized unit of agent knowledge. On chain it holds the creator, price, current URI, version counter, purchase counter, and an active flag. The payload lives off chain behind that URI.
- Version
- Every pack starts at version 1 and increments each time the creator pushes a new URI. The full list of URIs stays on chain, so any buyer can replay the history. Buyers keep access to future versions at no extra cost.
- Access grant
- A boolean in the registry keyed by pack id and address. It is written when a buyer calls purchase with exactly the listed price, and it is set for the creator at publish time. No expiry, no subscription.
- Creator earnings
- A purchase credits 95 percent of the payment to the creator balance and 5 percent to the treasury. Nothing is transferred during the purchase itself. Both sides pull their funds later with withdraw.
Network details
Everything below is production. There is no staging registry and no mock data anywhere on this site; the catalogue under Explore is read from these addresses.
| Key | Value |
|---|---|
| Network | Robinhood Chain mainnet, Arbitrum Orbit stack |
| Chain ID | 4663 |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | https://robinhoodchain.blockscout.com |
| Gas token | Ether, 18 decimals |
| Registry | 0x2E681c71416E1AA1f16bf7403276882E13Ed66Ad |
| Treasury | 0xa7c7F04164db3fB97f6D48916F00A8BE52a6C602 |
| Protocol fee | 500 basis points, 5 percent of each purchase |
| MCP endpoint | https://stitch-ai.net/api/mcp |
| Testnet | 46630 · https://rpc.testnet.chain.robinhood.com |
Quickstart
Three steps, no API key, no account. Reading the registry is a public RPC call. Install viem, define the chain, then read a pack.
npm install viemviem does not ship a built in chain for Robinhood Chain, so define it once and export a client plus the registry ABI. The human readable ABI below is the exact surface the deployed contract exposes.
// stitch.ts
import { createPublicClient, defineChain, http, parseAbi } from "viem";
export const robinhoodChain = defineChain({
id: 4663,
name: "Robinhood Chain",
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
rpcUrls: { default: { http: ["https://rpc.mainnet.chain.robinhood.com"] } },
blockExplorers: {
default: { name: "Blockscout", url: "https://robinhoodchain.blockscout.com" },
},
});
export const REGISTRY = "0x2E681c71416E1AA1f16bf7403276882E13Ed66Ad" as const;
export const registryAbi = parseAbi([
"struct Pack { address creator; uint96 price; string name; string category; string uri; uint32 version; uint32 purchases; uint64 createdAt; uint64 updatedAt; bool active; }",
"function getPack(uint256 packId) view returns (Pack)",
"function listPacks(uint256 offset, uint256 limit) view returns (Pack[] page, uint256 total)",
"function versionHistory(uint256 packId) view returns (string[])",
"function hasAccess(uint256 packId, address account) view returns (bool)",
"function purchase(uint256 packId) payable",
"function stats() view returns (uint256 packs, uint256 totalPurchases, uint256 totalVolume)",
]);
export const client = createPublicClient({ chain: robinhoodChain, transport: http() });getPack returns the full struct with named fields, so no tuple index gymnastics. Prices are uint96 wei, which viem gives you as a bigint.
// read-pack.ts
import { formatEther } from "viem";
import { client, REGISTRY, registryAbi } from "./stitch";
const pack = await client.readContract({
address: REGISTRY,
abi: registryAbi,
functionName: "getPack",
args: [1n],
});
console.log(pack.name, pack.category, formatEther(pack.price), pack.version, pack.uri);Against the live registry that prints:
Robinhood Chain RWA Primitives onchain 0.004 2 https://pub-dd7413f0f0a94cbfa2cbeb26c62dc9ae.r2.dev/stitch/packs/1/v2.json