Agent memory is not a separate engine. It's write, read, and search on _memory/* folders — the same primitives you already use for everything else.
context
Architecture, decisions, bugs, patterns
Agent writes what it learned
context includes everything from before
-- Step 1: Load full development context context -- Step 2: Record what you learned while working save _memory/bugs @deleted-entity-check title: "read returns a deleted marker" fix: "Check if entity is deleted before reading .payload" date: "2026-02-11" -- Step 3: Search previous development notes search _memory "entity deletion handling" top 10
context is just a query: find everything under _memory/*, then pick title and description from each entry. No special engine, no separate service — the same read and search you already know. Zero new concepts, zero overhead.
As you work, save what you learn to _memory/{category} folders. Each entry has a unique key — saving with the same key updates the existing record instead of creating a duplicate.
| Folder | Purpose | What's stored |
|---|---|---|
| _memory/decisions | Architecture and design decisions you made | A title, the reasoning behind it, and the date |
| _memory/bugs | Bugs you found and how you fixed them | A title, description of the bug, how it was fixed, and the date |
| _memory/patterns | Code patterns you discovered in the codebase | A title, description of the pattern, and which files it applies to |
| _memory/preferences | Owner preferences for workflow or style | The preference name and its value |
| _memory/tasks | Work you completed or started | A title, current status, description, and the date |
| _memory/architecture | How components and files relate to each other | The component name, a description, and its dependencies |
These are conventions, not constraints. You can create any sub-folder under _memory/. The context command auto-discovers and summarizes all of them. All _memory/ folders require your key — your development history is private by default.
One URL connects any agent. Replace YOUR_KEY with your Ocean Key.
Don't have a key yet? Sign up free — takes 10 seconds.
https://api.infiniteocean.io/mcp/ocean?key=YOUR_KEY
Settings → Connectors → Add → paste the URL. Done.
Settings → MCP → Add → paste the URL. Done.
GPT Builder → import spec from view.infiniteocean.io/openapi/ → set auth to API Key, header X-Ocean-Key.
Add your key to CLAUDE.md:
Ocean Key: `YOUR_KEY`
Endpoint: POST /exec
Header: X-Ocean-Key: YOUR_KEY
Body: {"query":"your drops command"}
Docs: /drops
One endpoint does everything. Send Drops commands as plain English:
curl -X POST https://api.infiniteocean.io/exec \
-H "Content-Type: application/json" \
-H "X-Ocean-Key: YOUR_KEY" \
-d '{"query":"save _memory/decisions @first title: \"Chose IO\" reasoning: \"Simple\""}'
MCP connections get 4 tools: exec, get_context, remember, recall. The exec tool does everything — see /drops for the full language.
When an agent connects via MCP, it automatically receives behavioral instructions — no extra setup. Every agent knows how to use InfiniteOcean from the first message.
You can also write custom skills that teach agents project-specific behavior. The instructions are injected at connection time via the MCP instructions field.
Every MCP connection receives this automatically. Teaches the agent the IO workflow: call get_context first, use exec for data, remember/recall for memory, blob upload-url for files.
Write a skill entity and every agent that connects to your project gets it injected. Perfect for coding conventions, deploy procedures, or domain rules.
// Write your project skill save _mcp/YOUR_KEY @skill "This is a Next.js 14 app. Always use App Router, never Pages. Tests: vitest, not jest. Deploy: git push to main triggers CI. Database: Supabase, never raw SQL." // Or via the payload parameter for longer text query="save _mcp/YOUR_KEY @skill" payload="Your full project skill text..."
When an MCP client sends initialize, the server returns an instructions field containing the built-in skill plus your custom skill (if one exists at _mcp/YOUR_KEY @skill). MCP clients like Claude Desktop, Cursor, and Windsurf read this field and use it as behavioral guidance for the entire session. Update your skill anytime — the next connection picks it up.
Your AI can pull related information from anywhere — link a decision to the bug it fixed, or a pattern to the files it applies to. Everything connects.
With universal fields, your agent just asks a question — and gets answers from every folder in one call.
Finds meetings she organized, invoices she sent, projects she's on — across all folders.
{
"identifiers": {
"$has": {
"type": "email",
"value": "[email protected]"
}
}
}
Meetings, deadlines, invoices, events — anything with a date in that range.
{
"dates": {
"$gte": "2026-03-01",
"$lt": "2026-04-01"
}
}
Office locations, delivery addresses, event venues — anything within range of a point.
{
"locations": { "$near": {
"lat": 55.68, "lon": 12.57,
"radius_km": 5
}}
}
Invoices, budgets, purchase orders — any record with USD amounts over a threshold.
{
"amounts": {
"$gte": 10000,
"$unit": "USD"
}
}
Connected agents get the query_primitives tool automatically. All filters combine with AND — "Alice's meetings in March near Copenhagen over $1000" is one query.
Agents can compose data from multiple sources without copying it. Place a $embed reference in any content — the server resolves it on read, keeping the original creator's ownership, billing, and counters intact.
Think YouTube embeds — the content stays with its creator, the embedder just places a reference. Views, revenue, and version updates all flow back to the source.
embed_views counter increments on every readFull content returned — for calculations, dashboards, data pipelines.
{
"hero": {
"$embed": {
"route": "photos/nature",
"key": "sunset-001"
}
}
}
Returns a view_url — no content transfer, cheaper for visual rendering.
{
"chart": {
"$embed": {
"route": "charts/revenue",
"key": "q4",
"mode": "view"
}
}
}
Add "live": true to bypass the 5-minute cache — always get the latest value.
References can contain other references. Default depth 1, max 5 via ?embed_depth=N.
Creators set price (one-time) or price_per_read (recurring) — references respect both.
Connected agents use the write tool with $embed references in content. The read tool resolves them automatically. Use resolve: true in the query tool for batch resolution.
This is a live context response right now:
# 1. Get an Ocean Key (free, instant) — POST /drop on any route you pick curl -X POST https://api.infiniteocean.io/drop \ -H "Content-Type: application/json" \ -d '{"route":"my-app/notes","key":"hello","payload":{"message":"hello world"}}' # Response includes keypair.public AND keypair.private. Save both. # public → your X-Ocean-Key for future requests # private → keep secret; never sent over the wire after this # 2. Fetch your development context context # 3. Record something you learned save _memory/decisions @first-decision title: "Chose immutable data history" reasoning: "Every write is versioned, nothing lost" date: "2026-01-01" # 4. Fetch context again — your note is there context # 5. Search your memories search _memory "immutable" top 5
Send commands through one place. Learn Drops →