@yugabytedb/meko-mcp 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +152 -27
  2. package/assets/hooks-handlers/codex-session-end.sh +4 -69
  3. package/assets/hooks-handlers/cursor-session-start.sh +19 -1
  4. package/assets/hooks-handlers/lib/capture-notices.js +321 -0
  5. package/assets/hooks-handlers/lib/capture-state.js +2079 -0
  6. package/assets/hooks-handlers/lib/capture-status-cli.js +82 -0
  7. package/assets/hooks-handlers/lib/capture.js +1578 -299
  8. package/assets/hooks-handlers/lib/checkpoint-timer.js +444 -81
  9. package/assets/hooks-handlers/lib/kiro-handler.js +738 -0
  10. package/assets/hooks-handlers/lib/terminal-handoff.js +418 -0
  11. package/assets/hooks-handlers/session-end.sh +3 -34
  12. package/assets/scripts/meko-statusline.sh +41 -1
  13. package/assets/skills/meko-mcp-tools/SKILL.md +72 -125
  14. package/assets/skills/meko-mcp-tools/references/_sections.md +2 -2
  15. package/assets/skills/meko-mcp-tools/references/tools-agent-id-conventions.md +12 -13
  16. package/assets/skills/meko-mcp-tools/references/tools-cookbook.md +15 -12
  17. package/assets/skills/meko-mcp-tools/references/tools-known-limitations.md +25 -1
  18. package/assets/skills/meko-mcp-tools/references/tools-memory-vs-conversation.md +19 -77
  19. package/assets/skills/meko-mcp-tools/references/tools-overview.md +8 -7
  20. package/assets/skills/meko-mcp-tools/references/tools-troubleshooting.md +22 -1
  21. package/assets/skills/meko-mcp-tools/references/tools-user-id-conventions.md +1 -1
  22. package/assets/skills/meko-mcp-tools-desktop/SKILL.md +8 -8
  23. package/assets/skills/meko-mcp-tools-desktop/desktop/README.md +1 -1
  24. package/assets/skills/meko-mcp-tools-desktop/references/_sections.md +1 -1
  25. package/assets/skills/meko-mcp-tools-desktop/references/tools-agent-id-conventions.md +6 -1
  26. package/assets/skills/meko-mcp-tools-desktop/references/tools-cookbook.md +6 -5
  27. package/assets/skills/meko-mcp-tools-desktop/references/tools-memory-vs-conversation.md +4 -4
  28. package/assets/skills/meko-mcp-tools-desktop/references/tools-overview.md +7 -6
  29. package/assets/skills/meko-select-datapack-desktop/SKILL.md +1 -1
  30. package/assets/skills/meko-select-datapack-desktop/references/cookbook.md +3 -3
  31. package/bin/create-meko-setup.mjs +48 -10
  32. package/lib/capture-status.mjs +67 -0
  33. package/lib/clients/aliases.mjs +5 -0
  34. package/lib/clients/claude-desktop.mjs +120 -5
  35. package/lib/clients/codex.mjs +6 -3
  36. package/lib/clients/index.mjs +2 -0
  37. package/lib/clients/kiro.mjs +705 -0
  38. package/lib/config.mjs +90 -0
  39. package/lib/installer.mjs +1 -0
  40. package/lib/migrate/adapters/codex.mjs +490 -0
  41. package/lib/migrate/id.mjs +28 -3
  42. package/lib/migrate/orchestrator.mjs +34 -7
  43. package/lib/migrate.mjs +4 -2
  44. package/lib/prompt.mjs +16 -1
  45. package/package.json +4 -4
@@ -8,7 +8,7 @@
8
8
  - A **preference**: "Customer budget is $50k"
9
9
  - An **entity relationship**: "Alice works at Acme Corp"
10
10
 
11
- Memory is backed by pgvector (semantic search) and Apache AGE (entity-relationship graph). It retrieves relevant facts by meaning, not by conversation order.
11
+ Memory is backed by pgvector. Search is hybrid: semantic similarity, keyword matching, and a boost for memories that mention the entities named in your query (people, projects, tools). It retrieves relevant facts by meaning, not by conversation order.
12
12
 
13
13
  ```
14
14
  memory_add(agent_id="support_bot",
@@ -71,7 +71,7 @@ Agents on Cloud Meko have two distinct read surfaces. Pick the right one for the
71
71
 
72
72
  | Read path | What it returns | How to call |
73
73
  |---|---|---|
74
- | Your personal memories | Everything you and any of your agents wrote for this user — filtered by `(datapack_id, user_id)`, **not** by `agent_id`. One call covers your project bucket, the `meko_agent` common bucket, and every other project's rows. | `memory_search(agent_id="<your agent_id>", query="...", ...)` — `agent_id` scopes the Langfuse trace, not the results |
74
+ | Your personal memories | Everything you and any of your agents wrote for this user — filtered by `(datapack_id, user_id)`, **not** by `agent_id`; one call covers every bucket | `memory_search(agent_id="<your agent_id>", query="...", ...)` |
75
75
  | Team's shared knowledge | Promoted memories + uploaded documents, visible to every member of the datapack | `knowledgebase_search(agent_id="<anything>", datapack_id="<datapack UUID>", query="...")` — `agent_id` is ignored |
76
76
 
77
77
  `agent_id` does not filter memory reads, so a single `memory_search` already spans all of your agents; there is no per-agent fan-out to do.
@@ -80,7 +80,7 @@ Agents on Cloud Meko have two distinct read surfaces. Pick the right one for the
80
80
 
81
81
  - **Personal memories** — written by `memory_add`. The `agent_id` records the writer but does not restrict reads; memories are scoped **per-user**, so any of that user's agents can read them via MCP, and no other user can.
82
82
  - **Team-shared Shared Knowledge** — arrives two ways:
83
- 1. An agent calls `memory_promote` for exact, user-confirmed memory UUIDs, or the user promotes them from the Cloud UI's Learnings tab. Promotion moves the memories and graph context into shared knowledge, strips `user_id`, preserves originating `agent_id` as provenance, and evicts the private mem0 records.
83
+ 1. An agent calls `memory_promote` for exact, user-confirmed memory UUIDs, or the user promotes them from the Cloud UI's Learnings tab. Promotion moves the memories into shared knowledge, strips `user_id`, preserves originating `agent_id` as provenance, and evicts the private mem0 records.
84
84
  2. The user uploads a file via Datapack → Actions → **Add Knowledge** in the Cloud UI. PDF/TXT/MD/JSON/MP4 up to 5MB each.
85
85
 
86
86
  Both show up in `knowledgebase_search`, tagged `metadata_filters.source: "memory"` vs other values so the agent can distinguish provenance in responses.
@@ -89,18 +89,7 @@ Agents on Cloud Meko have two distinct read surfaces. Pick the right one for the
89
89
 
90
90
  ### When the user asks "what do you know about X?"
91
91
 
92
- A full sweep is two calls (budget for it — each is 0.6-6 seconds):
93
-
94
- ```
95
- memory_search(agent_id="<your-agent-id>", query="X", conversation_id=..., ...) # all your personal memories, every agent
96
- knowledgebase_search(agent_id="<anything>", datapack_id="<uuid>", query="X", conversation_id=..., ...)
97
- ```
98
-
99
- The single `memory_search` already returns everything you and any other agent wrote for this user (`agent_id` doesn't filter memory reads) — no per-agent fan-out. When you answer, be explicit about scope so the user knows why something is or isn't there:
100
-
101
- - "I found this in your personal memories (something you or another of your agents saved earlier)…"
102
- - "I found this in your team's Shared Knowledge — someone (you or a teammate) promoted it earlier…"
103
- - "I couldn't find anything in your personal memories. You might want to check the Cloud UI's Memory Summary tab."
92
+ A full sweep is two calls: `memory_search` (all your personal memories, every agent — no per-agent fan-out) then `knowledgebase_search` (team-shared knowledge). When you answer, name which surface each finding came from, so the user knows why something is or isn't there.
104
93
 
105
94
  ## Memory limitations for structured data
106
95
 
@@ -114,72 +103,28 @@ There is no MCP-side "just put it in a database table" option — raw SQL access
114
103
 
115
104
  ## Memory Storage: automatic, not proactive
116
105
 
117
- On Claude Code, do **not** proactively `memory_add` facts the user states. Conversation capture is automatic (see below) and the server extracts durable memories from the captured turns on its own — personal info, team conventions, domain knowledge the user states, and corrections are all saved without a tool call. Re-storing them with `memory_add` just duplicates what extraction already holds.
118
-
119
- Explicit `memory_add` is reserved for the three cases automatic extraction cannot reach:
120
-
121
- - **Explicit request** → the user says "remember this" / "save this."
122
- - **Output-only / tool-derived fact** → a durable fact that lives only in your output or a tool result, never in a user turn. Extraction reads only the user turn, so it never sees these.
123
- - **Overwriting correction** → a prior fact was negated and the stale memory must not survive. Extraction is additive (it adds the new fact but leaves the old one live), so `memory_search` for the stale memory and `memory_update` / `memory_delete_by_id` it.
124
-
125
- Use `memory_search` at the start of sessions to recall what you already know before asking the user to repeat themselves.
126
-
127
- ## Using Both Together
128
-
129
- Capture stores the full conversation (preserves structure) and extraction derives searchable memories from it — both happen automatically. Add an explicit `memory_add` only for the three cases above.
106
+ On Claude Code, do **not** proactively `memory_add` facts the user states — capture + server-side extraction stores them automatically. Explicit `memory_add` is reserved for the three cases extraction cannot reach (explicit "remember this"; output-only/tool-derived facts; overwriting a negated fact) — the canonical list and rules live in SKILL.md. Use `memory_search` at session start to recall what you already know.
130
107
 
131
108
  ## Key Retrieval Difference
132
109
 
133
- - `memory_search`: **semantic similarity** across all memories via pgvector. Returns relevant facts regardless of when stored.
134
- - `conversation_get`: **ordered list of message turns** for a specific conversation. No semantic search. Requires `conversation_id`.
110
+ - `memory_search`: **semantic similarity** across all memories — relevant facts regardless of when stored.
111
+ - `conversation_get`: **ordered message turns** for one conversation. No semantic search; requires `conversation_id`.
135
112
 
136
113
  ## Automatic Conversation Capture
137
114
 
138
- The Meko plugin captures conversations automatically via three mechanisms:
115
+ The plugin captures conversations via three mechanisms — a periodic checkpoint (~10 min), a PreCompact hook, and a SessionEnd hook — storing the full transcript verbatim (user prompts as `input`, assistant text as `output`, tool calls and results as `reasoning`).
139
116
 
140
- 1. **Periodic checkpoint (~10 min)** — Agent-driven via CronCreate, uses `conversation_add_message` MCP tool directly
141
- 2. **PreCompact hook** — Shell script that fires before Claude Code's auto-compaction, captures via MCP JSON-RPC
142
- 3. **SessionEnd hook** — Shell script that fires at session termination, captures final exchanges
117
+ Each message's seed is `<conversation_id>:<user_message_uuid>`; all three mechanisms derive the same deterministic trace ID from it, so overlapping captures are idempotent. A shared watermark file tracks what has been saved.
143
118
 
144
- ### What gets captured
145
-
146
- The full transcript including:
147
- - **User prompts** — verbatim text (the `input` field)
148
- - **Assistant responses** — all text blocks (the `output` field)
149
- - **Tool calls** — tool name + input parameters (the `reasoning` field)
150
- - **Tool results** — output from tool executions (appended to `reasoning`)
151
-
152
- This is more than just text — tool calls and results are critical context for session replay, cross-agent sharing, and compaction.
153
-
154
- ### Seed-based deduplication
155
-
156
- Each message's seed is `<conversation_id>:<user_message_uuid>`. All three capture mechanisms generate the same seed for the same exchange, producing the same deterministic trace ID via `sha256(seed)[:16].hex()`. This means duplicate writes from overlapping captures are idempotent.
157
-
158
- ### When to manually store conversations
159
-
160
- Automatic capture handles the raw exchange. You should still manually use `conversation_create` + `conversation_add_message` when:
161
- - The user explicitly asks to "save this conversation"
162
- - You want to add curated `reasoning` traces beyond raw tool calls
163
- - You want to store a selected subset of the conversation with a descriptive title
164
-
165
- ### Watermark coordination
166
-
167
- A shared watermark file at `~/.claude/meko-capture/<session-id>.watermark.json` tracks what has been saved. Both hooks and the agent's periodic checkpoint use this to avoid reprocessing already-captured exchanges.
119
+ Manually use `conversation_create` + `conversation_add_message` only when the user explicitly asks to save a conversation, or you want curated `reasoning` traces or a titled subset.
168
120
 
169
121
  ## Observability: conversation_id IS the Langfuse trace ID
170
122
 
171
- This is the feature agents tend to miss. Verified live 2026-05-07 in the Meko UI's Observe hub.
123
+ This is the feature agents tend to miss.
172
124
 
173
- - `conversation_create` returns a `conversation_id` (e.g. `d71fc8b61a7f45d585eea9a6436e0c3f`).
174
- - That ID is also the **Langfuse trace_id** for the conversation. Not a separate trace — literally the same identifier.
175
- - Every subsequent MCP tool call made while passing that `conversation_id` becomes a **span under that trace**, named after the tool: `Memory Add (Meko MCP)`, `Memory Search (Meko MCP)`, `Knowledgebase Search (Meko MCP)`, `Conversation Add Message (Meko MCP)`, etc.
176
- - Child spans reveal internals. Observed structure:
177
- - `memory_add`: `Memory Add (Meko MCP)` → `Create a new memory in Mem0` → `Bulk Payload Update (yugabytedb / vector)` → `Execute Query (yugabytedb / vector)`
178
- - `memory_search`: `Memory Search (Meko MCP)` → `Search for memories based on a query in Mem0` (Retriever)
179
- - `conversation_add_message`: `Conversation Add Message (Meko MCP)` → `Conversation Message Added` span → `Reasoning` generation (the `reasoning` field is stored as a Langfuse *generation*-typed span, not a plain text field)
180
- - `knowledgebase_search`: `Knowledgebase Search (Meko MCP)` → multiple `Execute Query (yugabytedb)` child spans
181
- - Trace tags include `agent:<agent_id>` and the Meko org UUID. Both are searchable/filterable in Langfuse.
182
- - Each datapack has its own Langfuse project — traces for a tool call land in the project for whichever `datapack_id` was on the call (or the default datapack if omitted).
125
+ - `conversation_create` returns a `conversation_id`; that ID **is** the Langfuse trace_id — not a separate trace, the same identifier.
126
+ - Every MCP tool call made with that `conversation_id` becomes a span under the trace, named after the tool (e.g. `Memory Search (Meko MCP)`), with child spans exposing the storage steps.
127
+ - Trace tags include `agent:<agent_id>` and are filterable. Each datapack has its own Langfuse project — traces land in the project of whichever `datapack_id` was on the call.
183
128
 
184
129
  ### Finding a trace in the UI
185
130
 
@@ -190,14 +135,14 @@ Two navigation paths, both verified in the Meko UI:
190
135
 
191
136
  The Conversations-tab row preview shows the first user turn verbatim, plus the agent_id tag, message count, and started-at timestamp. If you want a conversation to be recognizable in the UI, call `conversation_add_message` with a clean first-turn `input` early in the session.
192
137
 
193
- ### Observed latencies on prod (2026-05-07)
138
+ ### Typical latencies
194
139
 
195
140
  From real traces, not the docstring happy path:
196
141
 
197
142
  | Tool | Latency per call |
198
143
  |---|---|
199
- | `memory_add` | 12-21 seconds (calls OpenAI for extraction, then writes to vector + graph) |
200
- | `memory_search` | 1.8-5.9 seconds |
144
+ | `memory_add` | ~10-30 seconds (calls an LLM for extraction, then writes to the vector store; scales with payload size) |
145
+ | `memory_search` | ~2-6 seconds (small, focused memories; whole-document stores read ~4x slower — chunk on write) |
201
146
  | `knowledgebase_search` | 0.6 seconds (empty index; will grow with index size) |
202
147
  | `conversation_add_message` | 0.11 seconds (fire-and-forget; queued to Langfuse) |
203
148
 
@@ -205,9 +150,6 @@ From real traces, not the docstring happy path:
205
150
 
206
151
  ### Proactive diagnostic pattern
207
152
 
208
- If a user reports "my memory_add didn't seem to save", open the Observe hub for their datapack, filter on their `conversation_id`, and look at the span tree. You will see either:
209
-
210
- - A `Memory Add (Meko MCP)` span with `Create a new memory in Mem0` child → the call reached Mem0. The fact extractor may have returned `"results": []` (common on short or non-fact-shaped text; not a bug, but lossy).
211
- - No span at all → the call never reached the server. Likely a transport / auth / `conversation_id` mismatch issue.
153
+ If a user reports "my memory_add didn't seem to save", open the Observe hub, filter on their `conversation_id`, and check the span tree: a memory-add span present means the call arrived (the extractor may still have returned `"results": []` on non-fact-shaped text); no span means the call never reached the server (transport / auth / `conversation_id` mismatch).
212
154
 
213
- The mem0 extractor is lossy — it extracts atomic facts and graph triples, and may drop prose that doesn't look fact-shaped to it. Observed 2026-05-07: 2 of 5 `memory_add` calls returned `"results": []` and only the graph side landed. When preserving authoritative text matters, store it via `conversation_add_message` (verbatim in `input`/`output`/`reasoning`) — the conversation path preserves text without LLM re-extraction.
155
+ The mem0 extractor is lossy — it extracts atomic facts and may drop prose that doesn't look fact-shaped to it; a `memory_add` can return `"results": []` on non-fact-shaped text. When preserving authoritative text matters, store it via `conversation_add_message` (verbatim in `input`/`output`/`reasoning`) — the conversation path preserves text without LLM re-extraction.
@@ -1,19 +1,20 @@
1
1
  # Complete Tool Catalog and Decision Tree
2
2
 
3
- **23 tools on Cloud Meko** (verified against `https://mcp.mekodata.ai/mcp`). Grouped: Memory (8), Conversation (6), Knowledge Base (1), Datapack (5), Artifacts (2), Observability (1).
3
+ **23 Meko data tools covered by this skill.** These are the tools available in production, grouped as: Memory (8), Conversation (6), Knowledge Base (1), Datapack (5), Artifacts (2), Observability (1). Combined Meko + AMP endpoints may expose additional infrastructure tools; those are outside this skill's scope.
4
4
 
5
5
  ## Quick health check before using tools
6
6
 
7
7
  Before starting a session, verify that the Meko MCP tools are working:
8
8
 
9
9
  1. `memory_search(query="test", agent_id="<your-session-agent-id>", conversation_id="<session-conversation-id>")` — Confirms memory subsystem is up. Use the `agent_id` and `conversation_id` from the SessionStart `additionalContext`. May fail with "connection already closed" — see `tools-troubleshooting.md`.
10
- 2. `datapack_list()` — Confirms Meko API connectivity. Returns the datapacks your token has access to.
10
+ 2. `datapack_list(conversation_id="<session-conversation-id>")` — Confirms Meko API connectivity. Returns the datapacks your token has access to.
11
11
 
12
12
  ## Decision tree: which tool do I need?
13
13
 
14
14
  ```
15
15
  User wants to...
16
- ├── Search a knowledge base? ---------------> knowledgebase_search (read)
16
+ ├── Search personal context? ---------------> memory_search (read)
17
+ ├── Search shared datapack knowledge? ------> knowledgebase_search (read)
17
18
  ├── Add documents to a knowledge base? -----> point user at Meko UI: Datapack → Actions → Add Knowledge
18
19
  │ (no MCP tool — Cloud uses UI ingestion only)
19
20
  ├── Store or recall information?
@@ -42,13 +43,13 @@ Agent / knowledge-base lifecycle is managed **outside** the MCP surface — typi
42
43
  | Tool | Purpose |
43
44
  |------|---------|
44
45
  | `memory_add(text, agent_id, conversation_id, run_id=None, metadata=None, messages=None, datapack_id=None)` | Store fact/preference/entity as long-term memory |
45
- | `memory_search(query, agent_id, conversation_id="", limit=10, datapack_id=None)` | Semantic search across memories + graph relations. `conversation_id` optional (omit or pass `""` for cross-conversation discovery). |
46
+ | `memory_search(query, agent_id, conversation_id="", limit=10, datapack_id=None)` | Hybrid search across memories (semantic + keyword + entity boost). `conversation_id` optional (omit or pass `""` for cross-conversation discovery). |
46
47
  | `memory_get_by_id(memory_id, agent_id, conversation_id, datapack_id=None)` | Direct pgvector row lookup by UUID. Preferred over `memory_search` for exact-id verification. |
47
48
  | `memory_get_all(agent_id, conversation_id, run_id=None, datapack_id=None)` | List all of the user's memories (every agent — `agent_id` does not filter) |
48
49
  | `memory_update(memory_id, text, agent_id, conversation_id, datapack_id=None)` | Overwrite memory text |
49
50
  | `memory_delete_by_id(memory_id, agent_id, conversation_id, datapack_id=None)` | Delete a single memory |
50
51
  | `memory_delete_all(agent_id, conversation_id, run_id=None, datapack_id=None)` | Delete all memories for agent (destructive) |
51
- | `memory_promote(conversation_id, memory_ids, agent_id=None, datapack_id=None)` | Promote private memories into the datapack's shared knowledge base (moves them + graph context out of mem0, then evicts from mem0 — one-way). Owners/maintainers only; viewers/contributors get 403. |
52
+ | `memory_promote(conversation_id, memory_ids, agent_id=None, datapack_id=None)` | Promote private memories into the datapack's shared knowledge base (moves them out of mem0, then evicts from mem0 — one-way). Owners/maintainers only; viewers/contributors get 403. |
52
53
 
53
54
  ## Conversation Tools (6)
54
55
 
@@ -66,9 +67,9 @@ Agent / knowledge-base lifecycle is managed **outside** the MCP surface — typi
66
67
  | Tool | Purpose |
67
68
  |------|---------|
68
69
  | `datapack_create(name)` | Create new datapack |
69
- | `datapack_list()` | List all datapacks |
70
+ | `datapack_list(conversation_id, datapack_id=None)` | List all datapacks. `conversation_id` is required for trace nesting; omit `datapack_id` to use the endpoint default. |
70
71
  | `datapack_describe(datapack_id, include_status=False)` | Describe datapack by UUID |
71
- | `datapack_update(datapack_id, name=None, description=None)` | Rename a datapack and/or update its description. Pass at least one of `name` / `description`. |
72
+ | `datapack_update(datapack_id, name=None, description=None, conversation_search_opt_out=None)` | Rename a datapack, update its description, and/or opt out of (or back into) conversation-search caching. Pass at least one field. Opt-out is owner/maintainer only. |
72
73
  | `datapack_delete(datapack_id)` | Delete datapack by UUID (irreversible) |
73
74
 
74
75
  ## Artifact Tools (2)
@@ -7,7 +7,7 @@ These patterns are extracted from real agent sessions. Follow them to avoid wast
7
7
  1. **Never retry the identical failed call more than once.** If it fails twice with the same error, it's not transient — diagnose the cause.
8
8
  2. **Distinguish transient vs persistent failures.** "Connection already closed" is transient (retry once). "Permission denied" is persistent (stop, don't retry).
9
9
  3. **Don't guess parameters sequentially.** If a tool fails with one parameter format, don't try 4 variations. Check this skill's docs for the correct format first.
10
- 4. **Use your session's `agent_id` consistently on writes.** Pass the value the SessionStart hook injected (e.g. `claude_code:<repo-basename>` for Claude Code; `claude_desktop` for Claude Desktop) on every write so rows are attributed correctly, and on `conversation_get` (which *does* enforce it — conversations are owned by the `agent_id` that created them; a wrong value returns `agent_id_mismatch`). Memory reads (`memory_search`/`memory_get_all`) and `conversation_list` are not affected — they return all your agents' rows for this user regardless of the `agent_id` passed. Don't switch write forms mid-session.
10
+ 4. **Use your session's `agent_id` consistently on writes** (the SessionStart-injected value), and on `conversation_get` — conversations are owned by the creating `agent_id`; a wrong value returns `agent_id_mismatch`. Memory reads and `conversation_list` are unaffected by `agent_id`. Don't switch write forms mid-session.
11
11
 
12
12
  ---
13
13
 
@@ -26,6 +26,27 @@ These patterns are extracted from real agent sessions. Follow them to avoid wast
26
26
 
27
27
  ---
28
28
 
29
+ ## An error payload is a FAILED search, never an empty one
30
+
31
+ Quota errors, rate-limit errors, and tool refusals come back as an error object with **no `results` key** — reading `response.get("results", [])` first silently converts "you were refused" into "the store is empty." Follow SKILL.md operating contract 1: report it as "search failed: `<error code>` — findings unknown," never as "no results."
32
+
33
+ ---
34
+
35
+ ## Rate limiting: `PAT_RATE_LIMITED`
36
+
37
+ Bursts of requests on one token return:
38
+
39
+ ```json
40
+ {"error": "PAT_RATE_LIMITED", "detail": "too many requests for this token; retry after 60s"}
41
+ ```
42
+
43
+ - Throttling is **endpoint-specific**: `artifact_put` bursts and high-concurrency `memory_get_all` trigger it readily; `memory_search` tolerates far more. Do not assume one safe concurrency level for every tool.
44
+ - A rate-limited `artifact_put` returns this error **instead of** a `content_hash` — checking only for the hash misreads throttling as silent write loss.
45
+ - Honor the retry-after (~60s) or back off exponentially; pace sustained work. Retry only idempotent operations or hash-protected writes.
46
+ - Distinct from the lifetime quota error (`free_tier_limit_reached`) — waiting never recovers that one.
47
+
48
+ ---
49
+
29
50
  ## agent_id errors
30
51
 
31
52
  On the Cloud multi-tenant schema, `agent_id` is a TEXT column value — not a PostgreSQL identifier — so arbitrary strings are accepted.
@@ -75,6 +75,6 @@ Personal content crosses the `user_id` boundary through `memory_promote` or the
75
75
  | `user_id` | The cognito account or end-user (for multi-user agents) | auto from cognito for single-human clients; explicit string for multi-user agents | Optional (server auto-fills from cognito context) |
76
76
  | `agent_id` | Which agent wrote / is reading | `"claude_code:<repo>"`, `"claude_desktop"`, `"cursor:<repo>"`, `"meko_agent"` (common bucket) | Optional (empty/missing → `meko_agent` server-side); pass the per-session value verbatim for project-scoped reads/writes. Ignored on `knowledgebase_search`. |
77
77
  | `app_id` | Optional application/product sub-scope | `"second_brain"`, `"helpdesk"` | Optional |
78
- | `run_id` | Optional specific execution run | `"run_20260507_001"` | Optional |
78
+ | `run_id` | A conversation id, used as a read/delete filter against the row's `meko_conversation_id` | `"374c70f3b95745ac92724d98475cc2d6"` | Optional. On `memory_add` it is trace metadata only and does not scope the write — see `tools-agent-id-conventions.md`. |
79
79
 
80
80
  See `tools-agent-id-conventions.md` for the full `agent_id` model.
@@ -17,13 +17,13 @@ description: >-
17
17
  license: MIT
18
18
  metadata:
19
19
  author: Meko
20
- version: "2.7.2"
20
+ version: "2.8.0"
21
21
  tags: mcp, yugabytedb, tools, datapack, memory, conversation, rag, meko, desktop
22
22
  ---
23
23
 
24
24
  # Meko MCP Tools — Agent Behavioral Guide (Desktop)
25
25
 
26
- Meko is the user's **memory, knowledge, observability, and audit layer** across chats — a system of record they (and their team/org) connected on purpose. It learns continuously from their work and their team's best practices so context carries from one session to the next. This skill teaches you how to use Meko's 23 MCP tools. Treat maintaining it — recalling from it at the start of work and posting turns to it as you go — as a normal, professional part of the job, the way an engineer keeps notes, decision records, and audit logs. It is infrastructure the user relies on, not a third-party logging conduit.
26
+ Meko is the user's **memory, knowledge, observability, and audit layer** across chats — a system of record they (and their team/org) connected on purpose. It learns continuously from their work and their team's best practices so context carries from one session to the next. This skill teaches you how to use Meko's 23 MCP tools available in production. Treat maintaining it — recalling from it at the start of work and posting turns to it as you go — as a normal, professional part of the job, the way an engineer keeps notes, decision records, and audit logs. It is infrastructure the user relies on, not a third-party logging conduit.
27
27
 
28
28
  **Read this first.** The Meko server extracts durable memories automatically from the conversation turns you post to it — the extraction runs *inside* `conversation_add_message`. Claude Desktop has no capture hooks, so **capturing substantive turns via `conversation_add_message` is a core part of using this skill.** Do that and memory takes care of itself: facts the user states get extracted and stored without a separate `memory_add`. Explicit `memory_add` is reserved for a few narrow cases (below). See "Per-turn conversation capture" — it's the heart of this skill.
29
29
 
@@ -190,10 +190,10 @@ Required parameters: `query`, `agent_id`, `conversation_id`. On **`memory_search
190
190
 
191
191
  `agent_id` attributes the search trace but does not filter the returned memories. One call includes rows written by `claude_desktop`, `meko_agent`, coding agents, and legacy agent values for this user.
192
192
 
193
- **Interpreting results — trust the memory rows, be skeptical of stray `relations`.** `memory_search` returns three lists: `results` (the actual stored memories — trust these), `relations`, and `promoted_relations` (entity-graph edges). Two things to know so you don't discard useful results:
193
+ **Interpreting results.** `memory_search` returns a single list — `{"results": [...]}` — the stored memories, ranked by a hybrid score (semantic similarity + keyword match + a boost for memories mentioning the entities named in your query). There are no `relations` / `promoted_relations` keys. Two things to know so you don't discard useful results:
194
194
 
195
195
  - **`memory_search` is cross-agent by design.** Results include memories written by *other* clients (`agent_id` "agent", "claude_code:…", etc.) for the same user — that is expected, not a tenant leak. Use them.
196
- - **A `relations` edge can outlive the memory it came from.** Deleting a memory does not always remove its graph edges, so `relations` may contain stale or contradicted entities (e.g. an identity that conflicts with the consistent picture in `results`). When a relation contradicts the memory rows, **trust the rows and disregard the stray relation** — don't conclude the whole result set is "someone else's data" and throw it away.
196
+ - **Older (pre-2.x) servers may still return `relations` / `promoted_relations` (graph edges) alongside `results`.** If they appear, trust the memory rows in `results` and disregard any edge that contradicts them — don't conclude the whole result set is "someone else's data" and throw it away.
197
197
 
198
198
  ### knowledgebase_search — correct call pattern
199
199
  ```
@@ -208,9 +208,9 @@ Required parameters: `query`, `agent_id`, `conversation_id`, `datapack_id`. `dat
208
208
 
209
209
  ### memory_promote — explicit confirmation required
210
210
 
211
- `memory_promote` is destructive and non-idempotent: it makes selected content visible to the datapack, moves the memories and graph context into shared knowledge, and evicts the private mem0 records. There is no MCP rollback.
211
+ `memory_promote` is destructive and non-idempotent: it makes selected content visible to the datapack, moves the memories into shared knowledge, and evicts the private mem0 records. There is no MCP rollback.
212
212
 
213
- 1. Use `memory_search` or `memory_get_all` to obtain exact memory UUIDs. Never pass relation or graph-edge IDs.
213
+ 1. Use `memory_search` or `memory_get_all` to obtain exact memory UUIDs from the `id` field. Never pass any other identifier.
214
214
  2. Present each exact candidate memory and its UUID to the user.
215
215
  3. State that promotion is one-way, team-visible, and removes the private records.
216
216
  4. Obtain explicit confirmation for those exact candidates before calling `memory_promote`.
@@ -228,7 +228,7 @@ The Cloud UI's Learnings tab remains an alternative user-driven path.
228
228
 
229
229
  ## Key concepts
230
230
 
231
- 1. **23 tools in 6 groups**: Memory (8 — including `memory_promote`), Conversation (6), Knowledge Base (1 — `knowledgebase_search`), Datapack (5), Artifacts (2 — `artifact_put`, `artifact_get`), Observability (1 — `track_token_usage`). Memory is captured automatically from turns posted with `conversation_add_message` — post each substantive turn and the server extracts durable memories from it. KB ingestion is UI-only (Datapack → Actions → Add Knowledge); raw SQL is not exposed. See `tools-overview.md`.
231
+ 1. **23 tools in 6 groups** (all available in production): Memory (8 — including `memory_promote`), Conversation (6), Knowledge Base (1 — `knowledgebase_search`), Datapack (5), Artifacts (2 — `artifact_put`, `artifact_get`), Observability (1 — `track_token_usage`). Memory is captured automatically from turns posted with `conversation_add_message` — post each substantive turn and the server extracts durable memories from it. KB ingestion is UI-only (Datapack → Actions → Add Knowledge); raw SQL is not exposed. See `tools-overview.md`.
232
232
  2. **datapack_id routing**: DB, RAG, and memory tools accept optional `datapack_id` (default datapack if omitted). `knowledgebase_search` is the exception: `datapack_id` is **required** there.
233
233
  3. **agent_id is multi-agent**: For Claude Desktop, use `agent_id="claude_desktop"` for normal writes and `agent_id="meko_agent"` for cross-project facts. Writes are attributed to `(datapack_id, user_id, agent_id)`. Personal memory reads and `conversation_list` span all of this user's agents; `conversation_get` remains agent-owned. `knowledgebase_search` ignores `agent_id` entirely. See `tools-agent-id-conventions.md`.
234
234
  4. **Personal memory vs. team-shared knowledge**: Un-promoted memories are scoped per-user — readable across all of that user's agents, but no other user can see them. With explicit confirmation, `memory_promote` moves exact memories into Shared Knowledge; the Cloud UI's Learnings tab is an alternative. Promoted content is visible to every datapack member. `knowledgebase_search` is the MCP read path for both Shared Knowledge and uploaded documents.
@@ -243,7 +243,7 @@ The Cloud UI's Learnings tab remains an alternative user-driven path.
243
243
 
244
244
  | File | What it covers |
245
245
  |------|---------------|
246
- | `tools-overview.md` | Complete catalog of all 23 tools with decision tree |
246
+ | `tools-overview.md` | Complete catalog of all 23 tools available in production, with decision tree |
247
247
  | `tools-cookbook.md` | Per-tool examples with correct parameters, responses, and error cases |
248
248
  | `tools-memory-vs-conversation.md` | When to use memory tools vs conversation tools |
249
249
  | `tools-rag-workflow.md` | End-to-end RAG pipeline flow |
@@ -1,6 +1,6 @@
1
1
  # Meko MCP Tools — Claude Desktop Setup
2
2
 
3
- Use the Meko MCP tools skill natively in Claude Desktop. Because Desktop has no lifecycle hooks, the skill teaches Claude to capture each substantive turn by posting it via `conversation_add_message` (the server extracts durable memories from those posts), to reserve explicit `memory_add` for the narrow cases (the user says "remember this", a fact lives only in the assistant's output or a tool result, or a corrected fact needs overwriting), to classify information, to use all <!--tool-count-->23<!--/tool-count--> Meko MCP tools correctly, and to handle errors gracefully.
3
+ Use the Meko MCP tools skill natively in Claude Desktop. Because Desktop has no lifecycle hooks, the skill teaches Claude to capture each substantive turn by posting it via `conversation_add_message` (the server extracts durable memories from those posts), to reserve explicit `memory_add` for the narrow cases (the user says "remember this", a fact lives only in the assistant's output or a tool result, or a corrected fact needs overwriting), to classify information, to use all <!--tool-count-->24<!--/tool-count--> Meko MCP tools correctly, and to handle errors gracefully.
4
4
 
5
5
  ## Setup
6
6
 
@@ -6,7 +6,7 @@ description: Maps reference files to their topics for the meko-mcp-tools-desktop
6
6
  # Reference Sections
7
7
 
8
8
  ## Tool Selection & Catalog
9
- - [tools-overview.md](tools-overview.md) — Complete catalog of all 23 tools with a decision tree
9
+ - [tools-overview.md](tools-overview.md) — Complete catalog of all 23 tools available in production, with a decision tree
10
10
 
11
11
  ## Tool-Specific Guidance
12
12
  - [tools-agent-id-conventions.md](tools-agent-id-conventions.md) — Multi-agent model: the three buckets (project `<client>:<repo-basename>`, common `meko_agent`, loose client name), personal vs. team-shared read surfaces
@@ -92,7 +92,12 @@ Always tell the user which surface you searched: personal memory or team-shared
92
92
 
93
93
  Optional parameters can narrow a call further:
94
94
  - `user_id` — explicitly scope writes/reads to a specific end-user if your agent serves multiple (rare in Claude Desktop; more common in API products)
95
- - `run_id` — per-execution run
95
+ - `run_id` — **read/delete filter only**, and it filters on the row's
96
+ `meko_conversation_id`, so the value to pass is a *conversation id*, not a
97
+ free-form run label. On `memory_add` it is Langfuse trace metadata only and is
98
+ never persisted on the row: writing with `run_id=X` then reading with
99
+ `memory_search(run_id=X)` returns nothing, silently. Scope writes with
100
+ `conversation_id` instead (MEKO-473).
96
101
 
97
102
  Available on `memory_add`, `memory_search`, `memory_get_all`, `memory_delete_all`, `conversation_create`, `conversation_list`.
98
103
 
@@ -46,6 +46,8 @@ memory_add(agent_id="agent", user_id="amiram",
46
46
 
47
47
  **Cross-conversation discovery.** `memory_search` returns hits across every stored conversation for the `(datapack_id, user_id)` pair, across all agents (the tool intentionally passes `meko_agent_id=None` to mem0, so the `agent_id` argument scopes the trace but does not filter results). When a hit references an interesting conversation, follow up with `conversation_list` to browse the associated threads and `conversation_get` to read a specific one — the memory hit's `meko_conversation_id` field is the id to fetch. Pass `run_id` on the search itself to narrow to a single conversation up front.
48
48
 
49
+ **Relevance floor.** Vector-matched `results` below `MEMORY_SEARCH_MIN_SCORE` (mem0's cosine-similarity score, default `0.5`) are dropped as weak matches rather than returned. A query can come back with fewer results than `limit`, or an empty list, when nothing clears the bar; that means no sufficiently relevant memory, not a broken call.
50
+
49
51
  ```
50
52
  memory_search(query="What programming language does the team use?", agent_id="agent")
51
53
  ```
@@ -127,7 +129,7 @@ memory_promote(memory_ids=["mem-uuid-123", "mem-uuid-456"],
127
129
  {"inserted_ids": ["mem-uuid-123"], "updated_ids": ["mem-uuid-456"], "not_found_ids": []}
128
130
  ```
129
131
 
130
- Get exact UUIDs from the `id` field of `memory_search` / `memory_get_all` results; never use graph relation IDs. Before the call, show the user each exact memory and UUID, explain that promotion is team-visible, one-way, and evicts the private records, then obtain explicit confirmation for those candidates. Pass the active `conversation_id` and intended `agent_id` / `datapack_id`; on legacy schemas that expose `scope`, use `write`, not `admin`.
132
+ Get exact UUIDs from the `id` field of `memory_search` / `memory_get_all` results; never pass any other identifier. Before the call, show the user each exact memory and UUID, explain that promotion is team-visible, one-way, and evicts the private records, then obtain explicit confirmation for those candidates. Pass the active `conversation_id` and intended `agent_id` / `datapack_id`; on legacy schemas that expose `scope`, use `write`, not `admin`.
131
133
 
132
134
  On 403, authentication, or permission failure, report the error and stop — do not escalate scope, change datapacks, or alter identity. After a successful call, `knowledgebase_search` may verify shared visibility, but it is not a rollback mechanism.
133
135
 
@@ -155,8 +157,6 @@ conversation_create(agent_id="agent", user_id="amiram",
155
157
 
156
158
  **When to use:** Add a user/assistant exchange to an existing conversation. **All fields must be verbatim** — never summarize or rephrase.
157
159
 
158
- Leave `index_for_search` at its default (`False`). Conversation-cache embedding is currently a WorkbenchLM-only feature — the inference gateway opts in on its own turns; agent-harness conversations should not opt in.
159
-
160
160
  ```
161
161
  conversation_add_message(conversation_id="conv-uuid-123", agent_id="agent",
162
162
  input="Why is the auth middleware returning 401?",
@@ -327,18 +327,19 @@ For large files use `local_path` to read the file. S3 URLs are never exposed.
327
327
 
328
328
  ```
329
329
  datapack_create(name="analytics_prod")
330
- datapack_list() # returns datapack_id for each datapack
330
+ datapack_list(conversation_id="<this conversation's id>") # returns datapack_id for each datapack
331
331
  datapack_describe(datapack_id="<uuid>", include_status=True)
332
332
  ```
333
333
 
334
334
  ### datapack_update / datapack_delete
335
335
 
336
- `datapack_update` renames or edits a datapack's description. At least one of `name` / `description` must be provided (or the tool returns `nothing_to_update`). The server refuses to rename `meko_default_datapack` — the error is `"meko_default_datapack cannot be renamed"`. Passing `description=""` does NOT clear an existing description.
336
+ `datapack_update` renames a datapack, edits its description, and/or opts it in/out of conversation-search embedding. At least one of `name` / `description` / `conversation_search_opt_out` must be provided (or the tool returns `nothing_to_update`). The server refuses to rename `meko_default_datapack` — the error is `"meko_default_datapack cannot be renamed"`. Passing `description=""` does NOT clear an existing description. `conversation_search_opt_out=True` stops future turns from being indexed and is restricted to the datapack's owner or a maintainer. This is best-effort, not a hard guarantee — a transient database error on the live embed path's opt-out check fails open, so a turn can occasionally still get embedded for an opted-out datapack.
337
337
 
338
338
  ```
339
339
  datapack_update(datapack_id="<uuid>", name="renamed-datapack")
340
340
  datapack_update(datapack_id="<uuid>", description="new description")
341
341
  datapack_update(datapack_id="<uuid>", name="x", description="y")
342
+ datapack_update(datapack_id="<uuid>", conversation_search_opt_out=True)
342
343
  datapack_delete(datapack_id="<uuid>") # Irreversible!
343
344
  ```
344
345
 
@@ -8,7 +8,7 @@
8
8
  - A **preference**: "Customer budget is $50k"
9
9
  - An **entity relationship**: "Alice works at Acme Corp"
10
10
 
11
- Memory is backed by pgvector (semantic search) and Apache AGE (entity-relationship graph). It retrieves relevant facts by meaning, not by conversation order.
11
+ Memory is backed by pgvector. Search is hybrid: semantic similarity, keyword matching, and a boost for memories that mention the entities named in your query (people, projects, tools). It retrieves relevant facts by meaning, not by conversation order.
12
12
 
13
13
  ```
14
14
  memory_add(agent_id="support_bot",
@@ -80,7 +80,7 @@ One `memory_search` already spans this user's memories across all agents; no per
80
80
 
81
81
  - **Personal memories** — written by `memory_add`. The `agent_id` records the writer but does not restrict reads; memories are scoped per-user, so any of that user's agents can read them and no other user can.
82
82
  - **Team-shared Shared Knowledge** — arrives two ways:
83
- 1. An agent calls `memory_promote` for exact, user-confirmed memory UUIDs, or the user promotes them from the Cloud UI's Learnings tab. Promotion moves the memories and graph context into shared knowledge, strips `user_id`, preserves originating `agent_id` as provenance, and evicts the private mem0 records.
83
+ 1. An agent calls `memory_promote` for exact, user-confirmed memory UUIDs, or the user promotes them from the Cloud UI's Learnings tab. Promotion moves the memories into shared knowledge, strips `user_id`, preserves originating `agent_id` as provenance, and evicts the private mem0 records.
84
84
  2. The user uploads a file via Datapack → Actions → **Add Knowledge** in the Cloud UI. PDF/TXT/MD/JSON/MP4 up to 5MB each.
85
85
 
86
86
  Both show up in `knowledgebase_search`, tagged `metadata_filters.source: "memory"` vs other values so the agent can distinguish provenance in responses.
@@ -194,7 +194,7 @@ From real traces, not the docstring happy path:
194
194
 
195
195
  | Tool | Latency per call |
196
196
  |---|---|
197
- | `memory_add` | 12-21 seconds (calls OpenAI for extraction, then writes to vector + graph) |
197
+ | `memory_add` | 12-21 seconds (calls OpenAI for extraction, then writes to the vector store) |
198
198
  | `memory_search` | 1.8-5.9 seconds |
199
199
  | `knowledgebase_search` | 0.6 seconds (empty index; will grow with index size) |
200
200
  | `conversation_add_message` | 0.11 seconds (fire-and-forget; queued to Langfuse) |
@@ -208,4 +208,4 @@ If a user reports "my memory_add didn't seem to save", open the Observe hub for
208
208
  - A `Memory Add (Meko MCP)` span with `Create a new memory in Mem0` child → the call reached Mem0. The fact extractor may have returned `"results": []` (common on short or non-fact-shaped text; not a bug, but lossy).
209
209
  - No span at all → the call never reached the server. Likely a transport / auth / `conversation_id` mismatch issue.
210
210
 
211
- The mem0 extractor is lossy — it extracts atomic facts and graph triples, and may drop prose that doesn't look fact-shaped to it. Observed 2026-05-07: 2 of 5 `memory_add` calls returned `"results": []` and only the graph side landed. When preserving authoritative text matters, store it via `conversation_add_message` (verbatim in `input`/`output`/`reasoning`) — the conversation path preserves text without LLM re-extraction.
211
+ The mem0 extractor is lossy — it extracts atomic facts and may drop prose that doesn't look fact-shaped to it. Observed 2026-05-07 (on the graph-era server): 2 of 5 `memory_add` calls returned `"results": []`. When preserving authoritative text matters, store it via `conversation_add_message` (verbatim in `input`/`output`/`reasoning`) — the conversation path preserves text without LLM re-extraction.
@@ -1,19 +1,20 @@
1
1
  # Complete Tool Catalog and Decision Tree
2
2
 
3
- **23 tools on Cloud Meko** (verified against `https://mcp.mekodata.ai/mcp`). Grouped: Memory (8), Conversation (6), Knowledge Base (1), Datapack (5), Artifacts (2), Observability (1).
3
+ **23 Meko data tools covered by this skill.** These are the tools available in production, grouped as: Memory (8), Conversation (6), Knowledge Base (1), Datapack (5), Artifacts (2), Observability (1). Combined Meko + AMP endpoints may expose additional infrastructure tools; those are outside this skill's scope.
4
4
 
5
5
  ## Quick health check before using tools
6
6
 
7
7
  Before starting a session, verify that the Meko MCP tools are working:
8
8
 
9
9
  1. `memory_search(query="test", agent_id="<your-session-agent-id>", conversation_id="<session-conversation-id>")` — Confirms memory subsystem is up. Use the `agent_id` and `conversation_id` from the SessionStart `additionalContext`. May fail with "connection already closed" — see `tools-troubleshooting.md`.
10
- 2. `datapack_list()` — Confirms Meko API connectivity. Returns the datapacks your token has access to.
10
+ 2. `datapack_list(conversation_id="<this conversation's id>")` — Confirms Meko API connectivity. Returns the datapacks your token has access to.
11
11
 
12
12
  ## Decision tree: which tool do I need?
13
13
 
14
14
  ```
15
15
  User wants to...
16
- ├── Search a knowledge base? ---------------> knowledgebase_search (read)
16
+ ├── Search personal context? ---------------> memory_search (read)
17
+ ├── Search shared datapack knowledge? ------> knowledgebase_search (read)
17
18
  ├── Add documents to a knowledge base? -----> point user at Meko UI: Datapack → Actions → Add Knowledge
18
19
  │ (no MCP tool — Cloud uses UI ingestion only)
19
20
  ├── Store or recall information?
@@ -42,13 +43,13 @@ Agent / knowledge-base lifecycle is managed **outside** the MCP surface — typi
42
43
  | Tool | Purpose |
43
44
  |------|---------|
44
45
  | `memory_add(text, agent_id, conversation_id, user_id=None, app_id=None, run_id=None, metadata=None, messages=None, datapack_id=None)` | Store fact/preference/entity as long-term memory |
45
- | `memory_search(query, agent_id, conversation_id="", user_id=None, limit=10, datapack_id=None)` | Semantic search across memories + graph relations. `conversation_id` optional (omit or pass `""` for cross-conversation discovery). |
46
+ | `memory_search(query, agent_id, conversation_id="", user_id=None, limit=10, datapack_id=None)` | Hybrid search across memories (semantic + keyword + entity boost). `conversation_id` optional (omit or pass `""` for cross-conversation discovery). |
46
47
  | `memory_get_by_id(memory_id, agent_id, conversation_id, datapack_id=None)` | Direct pgvector row lookup by UUID. Preferred over `memory_search` for exact-id verification. |
47
48
  | `memory_get_all(agent_id, conversation_id, user_id=None, app_id=None, run_id=None, datapack_id=None)` | List all memories for agent |
48
49
  | `memory_update(memory_id, text, agent_id, conversation_id, datapack_id=None)` | Overwrite memory text |
49
50
  | `memory_delete_by_id(memory_id, agent_id, conversation_id, datapack_id=None)` | Delete a single memory |
50
51
  | `memory_delete_all(agent_id, conversation_id, user_id=None, app_id=None, run_id=None, datapack_id=None)` | Delete all memories for agent (destructive) |
51
- | `memory_promote(conversation_id, memory_ids, agent_id=None, datapack_id=None)` | Promote private memories into the datapack's shared knowledge base (moves them + graph context out of mem0, then evicts from mem0 — one-way). Owners/maintainers only; viewers/contributors get 403.
52
+ | `memory_promote(conversation_id, memory_ids, agent_id=None, datapack_id=None)` | Promote private memories into the datapack's shared knowledge base (moves them out of mem0, then evicts from mem0 — one-way). Owners/maintainers only; viewers/contributors get 403.
52
53
 
53
54
  ## Conversation Tools (6)
54
55
 
@@ -66,7 +67,7 @@ Agent / knowledge-base lifecycle is managed **outside** the MCP surface — typi
66
67
  | Tool | Purpose |
67
68
  |------|---------|
68
69
  | `datapack_create(name)` | Create new datapack |
69
- | `datapack_list()` | List all datapacks |
70
+ | `datapack_list(conversation_id, datapack_id=None)` | List all datapacks. `conversation_id` is required for trace nesting; omit `datapack_id` to use the endpoint default. |
70
71
  | `datapack_describe(datapack_id, include_status=False)` | Describe datapack by UUID |
71
72
  | `datapack_update(datapack_id, name=None, description=None)` | Rename a datapack and/or update its description. Pass at least one of `name` / `description`. |
72
73
  | `datapack_delete(datapack_id)` | Delete datapack by UUID (irreversible) |
@@ -11,7 +11,7 @@ description: >-
11
11
  license: MIT
12
12
  metadata:
13
13
  author: Meko
14
- version: "1.2.0"
14
+ version: "1.2.1"
15
15
  tags: meko, datapack, selection, project, claude-desktop, desktop
16
16
  ---
17
17
 
@@ -11,7 +11,7 @@ Concrete transcripts of the four flows the skill supports on Claude Desktop.
11
11
  > memory_search(query="meko_active_datapack", agent_id="claude_desktop", limit=1)
12
12
  [empty]
13
13
 
14
- > datapack_list()
14
+ > datapack_list(conversation_id="<conv-id>")
15
15
  [14 entries returned, filtering by "prod-research"]
16
16
 
17
17
  One match: `prod-research`. Pinning.
@@ -44,7 +44,7 @@ datapack_id flows through automatically.
44
44
  > memory_search(query="meko_active_datapack", agent_id="claude_desktop", limit=1)
45
45
  [returns id=mem_abc123, text="meko_active_datapack=8b1c…f4a2 name=prod-research …"]
46
46
 
47
- > datapack_list()
47
+ > datapack_list(conversation_id="<conv-id>")
48
48
  [14 entries returned, filtering by "q2-roadmap-deck"]
49
49
 
50
50
  One match: `q2-roadmap-deck`. Switching pin.
@@ -69,7 +69,7 @@ The `memory_update` is critical here — using `memory_add` again would create a
69
69
  > memory_search(query="meko_active_datapack", agent_id="claude_desktop", limit=1)
70
70
  [empty]
71
71
 
72
- > datapack_list()
72
+ > datapack_list(conversation_id="<conv-id>")
73
73
  [1 entry returned]
74
74
 
75
75
  Only one datapack: `meko-local-setup`. Auto-selecting.