save_memory
What it does
Stores a typed note in the workspace memory. Future agents call recall_memory to honor brand rules and preferences they didn't set themselves — the killer differentiator vs Frame.io for AI workflows.
When a topic is provided and already exists, the row is UPSERTed in place (so re-saving a memory with the same topic refines it).
Input schema
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| type | string | required | — |
preference · rule · fact · brand_note · editorial_decision. |
| content | string | required | — |
The actual note (max ~8 KB). |
| topic | string | optional | — |
Kebab-case label used for grouping + upsert. Optional but strongly recommended. |
| importance | number | optional | 5 |
1 (trivial) to 10 (critical). 8+ for hard brand rules. |
Example call
json{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "save_memory", "arguments": { "type": "rule", "topic": "brand-corposost-no-scale-closeups", "content": "CorpoSostenibile NEVER wants a closeup of a person on a scale — Meta flags it as body-shaming.", "importance": 9 } } }
Response shape
json{ "ok": true, "was_updated": false, "memory": { "id": "mem_4f2a8c19e3b7", "workspace_id": "ws_lumika-team", "type": "rule", "topic": "brand-corposost-no-scale-closeups", "content": "CorpoSostenibile NEVER wants...", "importance": 9, "source": "claude", "created_at": 1747830000, "updated_at": 1747830000, "last_accessed_at": null } }
Usage from Claude Desktop
prompt"Remember: CorpoSostenibile never wants scale closeups. It's a hard rule, importance 9."
Usage from Python
pythonimport requests LUMIQA = "https://lumiqa.io/mcp/your-slug" HEADERS = {"Authorization": "Bearer lk_live_xxxxxxxxxxxx"} r = requests.post(LUMIQA, headers=HEADERS, json={ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "save_memory", "arguments": {"type": "rule", "topic": "brand-corposost-no-scale", "content": "No scale closeups.", "importance": 9} }, }) print(r.json())
Usage from Node
javascriptconst r = await fetch("https://lumiqa.io/mcp/your-slug", { method: "POST", headers: { "Authorization": "Bearer lk_live_xxxxxxxxxxxx", "Content-Type": "application/json", }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "save_memory", arguments: { type: "rule", topic: "brand-corposost-no-scale", content: "No scale closeups.", importance: 9 }, }, }), }); const data = await r.json(); console.log(data);
Required env vars / integrations
- D1 table
workspace_memories(migration0037_workspace_memories.sql). - No external APIs.
Known limitations
- Content capped at 8 KB; topic at 200 B.
typeis closed-set; using anything else throws.- Upsert key is
(workspace_id, topic)— same topic always overwrites.