Memory Tools
The fifteen tools the memory server exposes, the resources and prompts alongside them, and the two scopes that decide what a connection may do.
Reading memory
Ten of the fifteen tools only read. All fifteen exist on every deployment; which ones a given client is offered depends on the permission you approve when you connect it. A connection granted mcp:read and nothing else is offered exactly these, because a tool the connection cannot call is withheld rather than advertised and then refused.
| Tool | Scope | Takes | Returns |
|---|---|---|---|
search_memory | mcp:read | query, optional limit, and the shared filters: source, event_type, tier, tags, created_after, created_before. | Ranked memories with a relevance score, plus paging fields. |
list_memories | mcp:read | Optional limit, offset and the same shared filters. No query. | Memories newest first, with count, has_more and next_offset. |
get_memory | mcp:read | memory_id, as returned by search or list. | One memory with its full text, metadata and timestamps. |
get_related_memories | mcp:read | memory_id, optional relationship_types, direction and limit. | Connected memories with the edge type, direction and confidence. |
list_entities | mcp:read | Optional entity_type: source, category or type. | Groupings of your memory with a count and last-activity date for each. |
list_memory_events | mcp:read | Optional limit, offset, memory_id, event_type, source and a created window. | The lifecycle log newest first: adds, forgets, summaries and imports. |
get_event_status | mcp:read | memory_id returned by add_memory. | Where the memory is in the ingestion pipeline and whether it is searchable yet. |
get_memory_profile | mcp:read | Optional lookback_days between 1 and 365. | The standing profile derived from stored memory: style, topics, work context, preferences. |
list_connected_sources | mcp:read | Nothing. | Connected knowledge sources and their sync state. |
whoami | mcp:read | Nothing. | How this client authenticated, its granted scopes and whether it may write or delete. |
get_related_memories is the one worth knowing about. Search answers “what is relevant”; this answers “what is connected”. MemorySync records typed, confidence-weighted edges between memories — including contradiction — so an assistant can find the memory that conflicts with what it just read instead of averaging the two.
{"memory_id": "m_412","relationship_types": ["contradiction"]}
Writing and deleting memory
| Tool | Scope | Takes | Returns |
|---|---|---|---|
add_memory | mcp:write | text, optional source and metadata. | created with the new memory ids, or skipped when nothing was worth keeping. |
update_memory | mcp:write | memory_id plus at least one of tags, importance, metadata, source, event_type. | The changed field names and the updated memory. |
delete_memory | mcp:write | memory_ids, up to 100 per call. | The ids actually deleted. |
delete_entity | mcp:write | entity_type and entity_id from list_entities. Optional dry_run, default true. | A count to confirm, or the number deleted once dry_run is false. |
delete_all_memories | mcp:write | dry_run, default true, and an exact confirm string to act for real. | A count to confirm, or the ids deleted. |
add_memory runs the same extraction pipeline as the REST API, so conversational filler is discarded and near-duplicates are merged. A skipped result is a normal outcome, not an error, and an assistant should not retry it.
update_memory edits labels only. The memory body is encrypted and embedded, so correcting a fact means calling add_memory with the correction and letting extraction supersede the stale record.
The two bulk deletes preview by default, so clearing a scope takes two deliberate steps.
delete_all_memories {}-> { "dry_run": true, "would_delete_count": 412,"confirmation_required": "DELETE ALL MEMORIES" }delete_all_memories { "dry_run": false, "confirm": "DELETE ALL MEMORIES" }-> { "dry_run": false, "deleted_count": 412 }
Resources and prompts
A resource is context a client can attach without the model deciding to call a tool, which matters because the profile is most useful before the first question — when the model has no reason to think it needs anything. All four are read-only and derived from data the same connection could already reach.
| Resource | What it returns |
|---|---|
memorysync://profile | The standing profile derived from stored memory: communication style, recurring topics, work context and learned preferences. |
memorysync://sources | Connected knowledge sources and their sync state, so the assistant can say where a retrieved memory came from. |
memorysync://entities | How the memory is grouped by source, category and type, with counts. Useful for orienting before a first search. |
memorysync://access | How this client authenticated and what it may do — the same content whoami returns, without a tool call. |
A prompt is a ready-made message you insert from a slash menu or prompt picker. These exist so the right workflow does not depend on you knowing how to ask for it.
recall- Takes a
question. Assembles your profile plus the relevant memory, then instructs the model to answer from it and to say so when the memory is silent rather than inventing an answer. audit_memory- Takes a
memory_id. Shows that memory alongside everything recorded as contradicting it, and asks the model to work out which version holds now — checking with you before deleting anything.
Scopes and read-only access
A dynamically registered MCP client may request only two scopes. It cannot ask for anything administrative.
| Scope | Grants |
|---|---|
mcp:read | Search and read memory, list entities and events, read the profile and connected sources. |
mcp:write | Everything in mcp:read, plus add, update and delete. Deletes require this scope. |
This is a per-connection choice, not a deployment setting. The write and delete tools are always implemented; approving only mcp:read at the consent screen means this one client is not offered them, and the assistant sees a coherent read-only server rather than tools that fail when called. Connect a second client and approve mcp:write, and that client gets the full set. Tokens issued to an existing OAuth app with the equivalent memory scopes are accepted too, so an integration you already authorized keeps working without re-consent.
Call whoami from the client at any time to see exactly which scopes were granted. It is the tool to reach for when a write is refused and you need to explain why rather than guess. The sign-in section covers how consent is granted and re-granted.
Every tool declares an output schema, so a client can validate the structured result and a model can plan its next call from the schema rather than from the shape of the last response.