@yugabytedb/meko-mcp 2.3.0 → 2.5.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 (40) hide show
  1. package/README.md +72 -33
  2. package/assets/hooks-handlers/lib/capture-cleanup-cli.js +735 -74
  3. package/assets/hooks-handlers/lib/capture-notices.js +94 -1
  4. package/assets/hooks-handlers/lib/capture-state.js +111 -0
  5. package/assets/hooks-handlers/lib/capture.js +129 -4
  6. package/assets/hooks-handlers/lib/checkpoint-timer.js +394 -8
  7. package/assets/hooks-handlers/lib/opencode-handler.js +29 -6
  8. package/assets/scripts/meko-statusline.sh +17 -1
  9. package/assets/skills/meko-mcp-tools/SKILL.md +5 -5
  10. package/assets/skills/meko-mcp-tools/references/_sections.md +1 -1
  11. package/assets/skills/meko-mcp-tools/references/tools-cookbook.md +193 -9
  12. package/assets/skills/meko-mcp-tools/references/tools-datapack-workflow.md +6 -3
  13. package/assets/skills/meko-mcp-tools/references/tools-known-limitations.md +11 -6
  14. package/assets/skills/meko-mcp-tools/references/tools-memory-vs-conversation.md +4 -4
  15. package/assets/skills/meko-mcp-tools/references/tools-overview.md +16 -11
  16. package/assets/skills/meko-mcp-tools/references/tools-rag-workflow.md +67 -8
  17. package/assets/skills/meko-mcp-tools/references/tools-troubleshooting.md +3 -1
  18. package/assets/skills/meko-mcp-tools-desktop/SKILL.md +7 -7
  19. package/assets/skills/meko-mcp-tools-desktop/desktop/README.md +4 -4
  20. package/assets/skills/meko-mcp-tools-desktop/references/_sections.md +1 -1
  21. package/assets/skills/meko-mcp-tools-desktop/references/tools-cookbook.md +193 -9
  22. package/assets/skills/meko-mcp-tools-desktop/references/tools-known-limitations.md +10 -5
  23. package/assets/skills/meko-mcp-tools-desktop/references/tools-memory-vs-conversation.md +4 -4
  24. package/assets/skills/meko-mcp-tools-desktop/references/tools-overview.md +16 -11
  25. package/assets/skills/meko-mcp-tools-desktop/references/tools-rag-workflow.md +67 -8
  26. package/assets/skills/meko-mcp-tools-desktop/references/tools-troubleshooting.md +3 -1
  27. package/assets/skills/meko-select-datapack-desktop/SKILL.md +91 -12
  28. package/assets/skills/meko-select-datapack-desktop/references/cookbook.md +39 -7
  29. package/assets/skills/meko-select-datapack-desktop/references/role-display-future.md +8 -6
  30. package/assets/skills/meko-select-datapack-desktop/references/troubleshooting.md +13 -1
  31. package/bin/create-meko-setup.mjs +117 -24
  32. package/lib/autofix.mjs +100 -0
  33. package/lib/browser-login.mjs +495 -0
  34. package/lib/clients/opencode.mjs +6 -1
  35. package/lib/migrate/datapack.mjs +254 -16
  36. package/lib/migrate/mcp-client.mjs +34 -0
  37. package/lib/migrate/orchestrator.mjs +1 -1
  38. package/lib/migrate.mjs +1 -1
  39. package/lib/validate.mjs +111 -22
  40. package/package.json +5 -5
package/README.md CHANGED
@@ -6,19 +6,38 @@ Reduces manual setup to a single command.
6
6
 
7
7
  ## What this installer authenticates with
8
8
 
9
- The installer configures **API-key authentication only**. Every supported
10
- client sends `Authorization: Bearer <your-api-key>` on the wire, plus the
9
+ Every client the installer configures authenticates with a Meko API key. Each
10
+ one sends `Authorization: Bearer <your-api-key>` on the wire, plus the
11
11
  `User-Agent` the Cloud WAF requires. Most adapters store the header value in
12
12
  client config. Codex stores `bearer_token_env_var = "MEKO_API_KEY"` and resolves
13
13
  the key from its runtime environment; Claude Desktop passes the same variable
14
- through `mcp-remote` header interpolation.
15
-
16
- Cloud Meko also accepts a browser **OAuth** flow, but that path is out of scope
17
- here: you turn it on inside a client's own UI, and it uses no API key. Don't
18
- configure both against the same client — see [Two authentication
19
- modes](../README.md#two-authentication-modes--pick-one-dont-mix-them) for the
20
- comparison and the failure modes, including why OAuth with a loopback callback
21
- still fails against the DEV environment.
14
+ through `mcp-remote` header interpolation. Capture hooks use the same key.
15
+
16
+ You don't need to have a key already. The installer gets one in this order:
17
+
18
+ 1. `--api-key <key>`.
19
+ 2. The `MEKO_API_KEY` environment variable.
20
+ 3. **Browser sign-in (the default).** The installer opens the Meko sign-in page,
21
+ and after you sign in it creates a key named `Meko installer (<host>)
22
+ <timestamp>`. It uses the MCP server's OAuth flow with a `localhost`
23
+ callback, then calls the server's `POST /api-keys`. The OAuth session is
24
+ discarded; only the key is kept.
25
+
26
+ Sign in with the same method you use for the Meko console. If the browser
27
+ signs in as a user with no Meko account (for example Google here, email and
28
+ password in the console), the server refuses to create a key, and the
29
+ installer tells you how to retry or fall back to `--api-key`.
30
+
31
+ The new key counts toward your 10 active keys and expires after 365 days. You
32
+ can revoke it at cloud.mekodata.ai > **Settings > API Keys**. Use `--no-browser`
33
+ to print the sign-in URL instead of opening a browser, for example over SSH.
34
+ Runs with no terminal attached (CI, scripts, redirected stdin) skip sign-in and
35
+ require a key, with or without `--yes`.
36
+
37
+ Separately, some clients can run their own browser **OAuth** flow against Cloud
38
+ Meko, configured in the client's own UI with no API key. The installer doesn't
39
+ set that up. Don't configure both against the same client; see [Two
40
+ authentication modes](../README.md#two-authentication-modes--pick-one-dont-mix-them).
22
41
 
23
42
  **Note:** The server accepts the key only as `Authorization: Bearer …` on the
24
43
  wire. An `API_KEY` or `MEKO_API_KEY` environment variable does nothing unless
@@ -48,7 +67,7 @@ Claude Desktop has two install paths: a one-click `.mcpb` Desktop Extension down
48
67
  npx @yugabytedb/meko-mcp
49
68
  ```
50
69
 
51
- The installer walks you through connection type, URL, API key, and skills installation with guided prompts.
70
+ The installer walks you through connection type and URL, signs you in through your browser to create an API key (unless you pass `--api-key` or set `$MEKO_API_KEY`), then asks about skills.
52
71
 
53
72
  **Local one-liner (docker-compose stack already running):**
54
73
 
@@ -88,7 +107,7 @@ You can also combine both: install via `.mcpb` for the MCP wiring, then run Opti
88
107
 
89
108
  **Option A — Desktop Extension (`.mcpb`), one-click:**
90
109
 
91
- 1. Download `meko-<version>.mcpb` from the [GitHub Releases page](https://github.com/yugabyte/meko-mcp-server/releases) (e.g. `meko-1.1.0.mcpb`).
110
+ 1. Download `meko-<version>.mcpb` from the [GitHub Releases page](https://github.com/yugabyte/meko-mcp-server/releases) (e.g. `meko-2.5.0.mcpb`). From 2.5.0, the `.mcpb`, the npm installer, and the public plugin share one version number.
92
111
  2. Open **Claude Desktop > Settings > Extensions > Install from file** and select the file (or drag the file onto that pane).
93
112
  3. When prompted, paste your Meko MCP URL and API key.
94
113
  4. Quit and relaunch Claude Desktop.
@@ -136,7 +155,13 @@ npx @yugabytedb/meko-mcp --client all --local --yes
136
155
 
137
156
  Each client is installed sequentially. A failure on one does not abort the others — the command exits with status 2 on partial success, 1 on total failure.
138
157
 
139
- **CI / non-interactive (Cloud Meko):**
158
+ **Cloud Meko (signs in through your browser):**
159
+
160
+ ```bash
161
+ npx @yugabytedb/meko-mcp --url https://mcp.mekodata.ai/mcp --client claude-code
162
+ ```
163
+
164
+ **CI / non-interactive (Cloud Meko, existing API key):**
140
165
 
141
166
  ```bash
142
167
  npx @yugabytedb/meko-mcp \
@@ -155,13 +180,13 @@ The installer performs up to 5 steps (some are skippable via flags):
155
180
  | 2 | Set hook environment vars | Writes `MEKO_MCP_URL` and `MEKO_API_KEY` into `~/.claude/settings.json` under the `env` key. Also prunes any stale Meko hook entries in `settings.json.hooks` that point at a prior install path (e.g. a previous `npx` cache or homebrew-global copy) so only the current install's hooks fire. |
156
181
  | 3 | Register public plugin marketplace | `claude plugin marketplace add https://github.com/yugabyte/meko-skills.git --scope user` |
157
182
  | 4 | Install skills plugin | `claude plugin install meko-agent-skills --scope user` |
158
- | 5 | Validate setup | Config check via `claude mcp list`, MCP `initialize` handshake, `tools/list` verification, and a canary `datapack_list` call |
183
+ | 5 | Validate setup | Config check via `claude mcp list`, MCP `initialize` handshake, `tools/list` verification, and a canary `datapack_search` call (`datapack_list` on older servers) |
159
184
 
160
185
  ### Post-install validation (canary)
161
186
 
162
- Step 5 includes a **canary call** that invokes the read-only `datapack_list` tool and asserts the response is a non-empty JSON array of datapack records. This proves the part of the stack that connectivity + `tools/list` don't cover: the API token authenticated as a real Meko identity, the tenant resolver found an account for it, and datapack routing wired up the user's actual workspace. A successful `tools/list` only proves the server speaks MCP — it says nothing about whether a Meko tool call would actually find the user's data.
187
+ Step 5 includes a **canary call** that invokes the read-only `datapack_search(limit=1)` tool and asserts it returns at least one datapack. On a server whose `tools/list` has no `datapack_search`, it calls `datapack_list` instead and asserts a non-empty JSON array; `datapack_search` reads one page whatever the account size, where `datapack_list` reads the whole account. This proves the part of the stack that connectivity + `tools/list` don't cover: the API token authenticated as a real Meko identity, the tenant resolver found an account for it, and datapack routing wired up the user's actual workspace. A successful `tools/list` only proves the server speaks MCP — it says nothing about whether a Meko tool call would actually find the user's data.
163
188
 
164
- The canary used to do a `memory_add` → `memory_get_by_id` → `memory_delete_by_id` round-trip, but mem0's LLM fact-extractor is non-deterministic for synthetic test text — for the same input it sometimes returned `results: []` (no facts extracted) while still adding graph relations, which the installer reported as "no memory id" and surfaced as a validation failure even when the server was healthy. `datapack_list` is a single SQL read with no LLM in the path and returns deterministically.
189
+ The canary used to do a `memory_add` → `memory_get_by_id` → `memory_delete_by_id` round-trip, but mem0's LLM fact-extractor is non-deterministic for synthetic test text — for the same input it sometimes returned `results: []` (no facts extracted) while still adding graph relations, which the installer reported as "no memory id" and surfaced as a validation failure even when the server was healthy. Both datapack tools are a single SQL read with no LLM in the path and return deterministically.
165
190
 
166
191
  `--no-canary` skips the canary entirely. The `initialize` and `tools/list` checks still run. Use this when you've already proved the round-trip in a prior step (CI, pre-flight smoke).
167
192
 
@@ -203,7 +228,7 @@ The canary used to do a `memory_add` → `memory_get_by_id` → `memory_delete_b
203
228
  - Steering file: `~/.kiro/steering/meko.md` or `.kiro/steering/meko.md`. It follows hook capture when the session-start marker is present and falls back to agent-driven persistence only when hooks are disabled, untrusted, or a different CLI 2.x agent is selected. See [Kiro notes](#kiro-notes).
204
229
  - **OpenCode CLI/TUI 1.18.x**
205
230
  - User plugin: `$OPENCODE_CONFIG_DIR/plugins/meko.js` when set, otherwise `~/.config/opencode/plugins/meko.js`; project plugin: `<project>/.opencode/plugins/meko.js`.
206
- - Stable runtime and private environment: `$OPENCODE_CONFIG_DIR/meko/` when set, otherwise `~/.config/opencode/meko/`, or `<project>/.opencode/meko/`. `opencode-hook-env.json` is mode 0600 and contains the MCP URL, API key, server name, User-Agent, hook client, stable Node executable, and watermark dir. Automatic capture uses the server-default datapack in this release. `--datapack` applies only to `--migrate`. OpenCode does not read `pin-<slug>.json` (no SessionStart, and `meko-select-datapack` is not installed).
231
+ - Stable runtime and private environment: `$OPENCODE_CONFIG_DIR/meko/` when set, otherwise `~/.config/opencode/meko/`, or `<project>/.opencode/meko/`. `opencode-hook-env.json` is mode 0600 and contains the MCP URL, API key, server name, User-Agent, hook client, stable Node executable, and watermark dir. Edits to this file reach the next capture attempt, including the retries of a running capture timer. Removing `MEKO_MCP_URL` or `MEKO_API_KEY` from the file, as `--uninstall` does, also removes it from a running timer's next attempt. Automatic capture uses the server-default datapack in this release. `--datapack` applies only to `--migrate`. OpenCode does not read `pin-<slug>.json` (no SessionStart, and `meko-select-datapack` is not installed).
207
232
  - Skill: `$OPENCODE_CONFIG_DIR/skills/meko-mcp-tools/` when set, otherwise `~/.config/opencode/skills/meko-mcp-tools/`, or `<project>/.opencode/skills/meko-mcp-tools/`.
208
233
  - The plugin mutates OpenCode's resolved configuration at runtime with a native remote MCP entry (`type: remote`, `enabled: true`, `oauth: false`). It does **not** edit `opencode.json` or `opencode.jsonc`; validation runs `opencode debug config` and verifies the resolved entry.
209
234
  - Restart OpenCode after install. Reinstall upgrades installer-owned assets while preserving durable capture state and user-owned collisions.
@@ -231,14 +256,15 @@ Usage:
231
256
  |------|-------------|---------|
232
257
  | `--client <list>` | Target client(s): one or more of `claude-code`, `claude-desktop`, `cursor`, `codex`, `kiro`, `opencode`. Comma-separated, or `all`. `codex` covers both the OpenAI Codex CLI and the Codex Desktop App (they share `~/.codex/config.toml`); `kiro` covers both the Kiro IDE and `kiro-cli` (they share `~/.kiro/settings/mcp.json`). OpenCode is version-gated to CLI/TUI 1.18.x. Aliases: `claude` → `claude-code`, `kiro-cli` / `kiro-ide` → `kiro`. | `claude-code` |
233
258
  | `--url <url>` | MCP server URL (from cloud.mekodata.ai > Datapacks > Connect) | Shared existing endpoint, otherwise production; conflicts prompt or require `--url` under `--yes` |
234
- | `--api-key <key>` | API key for Cloud Meko authentication. If a Cloud `--url` is supplied without this flag, the installer falls back to `$MEKO_API_KEY`, then to an interactive prompt on a TTY. Only fails hard when running under `--yes` or with no TTY attached. | _(interactive prompt or `$MEKO_API_KEY` env)_ |
259
+ | `--api-key <key>` | Use an existing Cloud Meko API key instead of signing in. Without this flag, the installer falls back to `$MEKO_API_KEY`, then to browser sign-in, which creates a key. Fails hard when no TTY is attached, with or without `--yes`. | _(`$MEKO_API_KEY`, else browser sign-in)_ |
260
+ | `--no-browser` | Print the sign-in URL instead of opening a browser. | `false` |
235
261
  | `--local` | Use local Meko at `http://localhost:8000/mcp` (no API key needed) | `false` |
236
262
  | `--scope <scope>` | Config scope: `user` or `project` (`claude-desktop` uses user scope config) | `user` |
237
263
  | `--name <name>` | MCP server name in config | `meko` |
238
264
  | `--cursor-hook-mode <mode>` | Cursor hook strategy: `native` or `claude-compat` | `native` |
239
265
  | `--skip-skills` | Skip plugin marketplace and skills installation (steps 3-4) | `false` |
240
266
  | `--skip-validation` | Skip post-install validation (step 5) | `false` |
241
- | `--no-canary` | Skip the canary `datapack_list` call. Basic connectivity + tools/list still run. | `false` |
267
+ | `--no-canary` | Skip the canary `datapack_search` / `datapack_list` call. Basic connectivity + tools/list still run. | `false` |
242
268
  | `--dry-run` | Show what would be done without making changes | `false` |
243
269
  | `--uninstall` | Remove Meko MCP server, skills, env vars, and marketplace entry | `false` |
244
270
  | `--verbose` | Show detailed output (API keys are always redacted) | `false` |
@@ -252,7 +278,9 @@ Capture health flags (durable outbox / recovery — Capture V2):
252
278
  |------|-------------|---------|
253
279
  | `--capture-status` | Report aggregate conversation-capture health from `~/.claude/meko-capture` (or `MEKO_WATERMARK_DIR`). Exit `0` = healthy\|catching_up, `2` = degraded_retrying, `3` = blocked_action_required. | `false` |
254
280
  | `--json` | With `--capture-status`, print machine-readable JSON matching the capture-health cache shape. Also accepted by `--capture-cleanup`. | `false` |
255
- | `--capture-cleanup <action>` | Inspect and clean up stuck capture on this machine. Actions: `status`, `stop`, `resume`, `drain`, `discard`, `repair`. See [Clean up stuck capture](../OPERATIONS.md#clean-up-stuck-capture). Exit `0` = done, `1` = error, `2` = partly done. | |
281
+ | `--no-autofix` | Turn off automatic capture repair. The capture timer otherwise runs `--capture-cleanup fix` every 30 minutes (`MEKO_AUTOFIX_INTERVAL`) when a session is stuck. Saved for every client; a reinstall keeps it. | `false` |
282
+ | `--autofix` | Turn automatic capture repair back on. | `false` |
283
+ | `--capture-cleanup <action>` | Inspect and clean up stuck capture on this machine. Actions: `status`, `fix`, `stop`, `resume`, `drain`, `discard`, `repair`. Start with `fix`. See [Clean up stuck capture](../OPERATIONS.md#clean-up-stuck-capture). Exit `0` = done, `1` = error, `2` = partly done. | |
256
284
  | `--session <id>` | With `--capture-cleanup`, act on one session. Repeatable; a unique prefix of the ID is enough. A bare ID after the action works too: `--capture-cleanup drain c0acdeb2`. | |
257
285
  | `--all` | With `--capture-cleanup`, act on every session. `drain` and `discard` need `--session` or `--all`. | `false` |
258
286
  | `--max-exchanges <n>` | With `--capture-cleanup drain`, stop after sending this many exchanges in total. | `200` |
@@ -397,6 +425,14 @@ auth skipped: 0 (calls dropped on a mid-run 401/403; re-run to re
397
425
  - **`--yes` without `--with-migrate`**: install succeeds silently and prints a one-line tip pointing at `create-meko-setup --migrate`. No migration is started.
398
426
  - **`--yes --with-migrate`**: install succeeds, then the detached migration is started automatically. Progress via `--migrate-status`.
399
427
 
428
+ ### Destination datapack
429
+
430
+ `--datapack <name|id>` picks the datapack the migration writes to; without it the migration uses `meko_default_datapack`, or the server's own default when that row isn't visible. The resolved destination is printed before the run starts.
431
+
432
+ - A name is looked up with `datapack_search(name=...)`, preferring a datapack you own over a shared one with the same name. A miss lists similar names.
433
+ - A UUID is looked up with `datapack_describe`, so any datapack the API key can open resolves, however many the account has.
434
+ - On a server whose `tools/list` has no `datapack_search`, both are matched against the `datapack_list` response instead.
435
+
400
436
  ### Idempotency, resume, and state
401
437
 
402
438
  - Per-run logs: `~/.meko/migrate/<run-id>/log.ndjson` (one JSON object per line). `tail -f | jq .` is a reasonable debug loop. This is the file the start banner points at, and the only one with run diagnostics in it.
@@ -412,7 +448,7 @@ auth skipped: 0 (calls dropped on a mid-run 401/403; re-run to re
412
448
  ### What does NOT get migrated (v1)
413
449
 
414
450
  - Slash-command skills, hooks, and `.claude/settings.json` — those remain in Claude Code's own config; Meko has no equivalent tool.
415
- - Knowledge-base documents — KB ingestion is UI-only (Datapack → Actions → Add Knowledge); not exposed via MCP.
451
+ - Knowledge-base documents — this migration doesn't re-upload old KB files; add them via `knowledgebase_upload_document` or the UI (Datapack → Actions → Add Knowledge) after migrating.
416
452
  - Transcripts from unregistered coding agents (for example Aider, Continue.dev, or Windsurf).
417
453
  - `user_id` is left null on every call (the server fills it from the API key). Multi-user routing is a follow-up.
418
454
 
@@ -442,8 +478,8 @@ Cursor previously had a hybrid hook mode that also wrote Claude-compatible hooks
442
478
  **Never use the `mcp-remote` bridge with Kiro.** Kiro speaks remote MCP natively, so the installer registers `{ url, headers }` directly.
443
479
 
444
480
  What was measured against `https://mcp.mekodata.ai` before 2026-09-24. Production
445
- now accepts loopback redirects on `/register`, `/authorize`, and `/token`; DEV
446
- (`mcp.mekodev.com`) still refuses them. The `mcp-remote` findings below still
481
+ now accepts loopback redirects on `/register`, `/authorize`, and `/token`, and a
482
+ 2026-10-07 re-measure found DEV (`mcp.mekodev.com`) accepts them too ([#277](https://github.com/yugabyte/meko-mcp-server/issues/277)). The `mcp-remote` findings below still
447
483
  apply, because an API key behind the bridge is never sent.
448
484
 
449
485
  - `mcp-remote@0.1.38` reads no auth env var (its only `process.env` reference is `MCP_REMOTE_CONFIG_DIR`), so `MEKO_API_KEY` is never sent; headers come only from `--header`. It therefore connects unauthenticated and begins OAuth.
@@ -460,7 +496,7 @@ Confirmed on `kiro-cli` 2.18.1 itself. Its DCR registration is:
460
496
 
461
497
  so against Cloud Meko it fails with `Dynamic registration failed: Registration failed: HTTP 403 Forbidden`. Its first `POST /mcp` also goes out with **no `User-Agent`**, which trips a second HTML-403 rule independently. With Mode 1 headers and a valid `mko_tkn_…` key it connects and lists all 23 tools — no OAuth, no 403.
462
498
 
463
- Both surfaces are verified against Cloud Meko with a real key. On the **Kiro IDE** (1.0.337), the installer's config produces `[meko] Connected` in its `Kiro - MCP Logs` output. On **`kiro-cli`** (2.18.1) the agent enumerates all 23 tools. The steering file is confirmed to reach the model, not just disk: asked with tools disabled what its Meko steering requires, the agent answered that it must call `memory_add` when the user states a durable fact and that this "explicitly overrides the meko-mcp-tools skill", which assumes capture hooks are running.
499
+ Both surfaces are verified against Cloud Meko with a real key. On the **Kiro IDE** (1.0.337), the installer's config produces `[meko] Connected` in its `Kiro - MCP Logs` output. On **`kiro-cli`** (2.18.1) the agent enumerated all 23 tools the server had at the time; production now lists 42, including 14 `amp_*` tools. The steering file is confirmed to reach the model, not just disk: asked with tools disabled what its Meko steering requires, the agent answered that it must call `memory_add` when the user states a durable fact and that this "explicitly overrides the meko-mcp-tools skill", which assumes capture hooks are running.
464
500
 
465
501
  One naming correction worth knowing, since it has caused confusion: **`Q DEV CLI` is not an OAuth client id.** It is the MCP `initialize` handshake's `clientInfo.name` (`"clientInfo":{"name":"Q DEV CLI","version":"1.0.0"}`); the string appears nowhere in the `kiro-cli` binary's OAuth path, and its actual DCR `client_name` is `kiro`. There is nothing named `Q DEV CLI` to allowlist. See [#277](https://github.com/yugabyte/meko-mcp-server/issues/277).
466
502
 
@@ -481,12 +517,12 @@ Uninstall removes only files carrying installer ownership markers: the three sta
481
517
  | | Cloud Meko | Local Meko |
482
518
  |---|-----------|-----------|
483
519
  | **URL** | `https://mcp.mekodata.ai/mcp` (or the endpoint shown by cloud.mekodata.ai) | `http://localhost:8000/mcp` |
484
- | **Authentication** | Requires `--api-key` or `$MEKO_API_KEY` env var | None |
520
+ | **Authentication** | Browser sign-in creates an API key, or pass `--api-key` / `$MEKO_API_KEY` | None |
485
521
  | **MCP registration** | Includes `-H "Authorization: Bearer <key>"` header | No auth header |
486
522
  | **Hook env vars** | Both `MEKO_MCP_URL` and `MEKO_API_KEY` written to settings | Only `MEKO_MCP_URL` written |
487
523
  | **Infrastructure** | Hosted, no local setup needed | Requires `docker compose up -d` running the Meko stack |
488
524
  | **Use case** | Production, team collaboration | Development, testing |
489
- | **Flag** | `--url <url> --api-key <key>` | `--local` |
525
+ | **Flag** | `--url <url>` (optionally `--api-key <key>`) | `--local` |
490
526
 
491
527
  The installer auto-detects cloud vs local based on the URL: any URL containing `localhost` or `127.0.0.1` is treated as local (no API key required). All other URLs are cloud and require authentication.
492
528
 
@@ -558,7 +594,7 @@ Re-running the installer is idempotent but not inert. A re-run:
558
594
 
559
595
  ### Updating the skills plugin (Claude Code)
560
596
 
561
- The `meko-agent-skills` plugin is distributed via the Claude Code plugin marketplace and versions independently of the installer npm package. Re-running the installer now picks up the latest skill definitions automatically: it probes `claude plugin list` and, when the plugin is already present, calls
597
+ The `meko-agent-skills` plugin is distributed via the Claude Code plugin marketplace from yugabyte/meko-skills, not npm. It also carries the Claude Code capture hooks. From 2.5.0, the plugin, the installer, and the `.mcpb` share one version number. Re-running the installer now picks up the latest skill definitions automatically: it probes `claude plugin list` and, when the plugin is already present, calls
562
598
 
563
599
  ```bash
564
600
  claude plugin update meko-agent-skills@meko-agent-skills --scope <scope>
@@ -725,10 +761,11 @@ Three known causes:
725
761
  - **No `User-Agent` header.** The WAF refuses any request without one. Add
726
762
  `User-Agent: meko-mcp-installer/1.0`. The installer always does; hand-written
727
763
  configs and some native MCP clients don't.
728
- - **An OAuth callback on a loopback address (DEV only).** The DEV WAF refuses
729
- any `redirect_uri` pointing at an internal host, so dynamic client
730
- registration fails there for any client that registers such a callback,
731
- including IDEs. Production accepts these callbacks as of 2026-09-24. Tracked in
764
+ - **An OAuth callback on a loopback address (DEV, historically).** The DEV WAF
765
+ refused any `redirect_uri` pointing at an internal host, so dynamic client
766
+ registration failed there for any client that registers such a callback,
767
+ including IDEs. Production accepts these callbacks as of 2026-09-24, and a
768
+ 2026-10-07 re-measure didn't reproduce the DEV block. Tracked in
732
769
  [#277](https://github.com/yugabyte/meko-mcp-server/issues/277).
733
770
  - **Message text that looks like a path.** Capture writes containing `../` or
734
771
  absolute paths can trip a traversal rule. Tracked in
@@ -745,7 +782,7 @@ API-key checks:
745
782
  - If using `$MEKO_API_KEY` env var, ensure it is exported in the current shell.
746
783
  - Confirm the key environment matches the URL: PATs minted on `app.mekodev.com` only validate against `mcp.mekodev.com`; PATs minted on `cloud.mekodata.ai` only validate against `mcp.mekodata.ai`.
747
784
  - The installer normalizes API keys (trims surrounding whitespace and a single matching pair of quotes) so a paste with a trailing newline or a literal `"…"` from a `.env` file is fine — but your raw shell variable might still be contaminated. Echo it (`echo "[$MEKO_API_KEY]"`) and check the brackets bracket the key tightly with no extra characters.
748
- - Re-run the installer interactively to re-enter the key.
785
+ - Re-run the installer in a terminal without `--api-key` and with `$MEKO_API_KEY` unset to sign in through the browser and create a new key, or pass a new key with `--api-key`.
749
786
 
750
787
  ### Plugin marketplace already registered
751
788
 
@@ -774,7 +811,7 @@ cp ~/.claude/settings.json.bak ~/.claude/settings.json
774
811
  Missing core tools: memory_search, memory_get_by_id, conversation_create. Found 0 tool(s) total.
775
812
  ```
776
813
 
777
- The MCP server responded but does not expose the expected tools (`memory_search`, `memory_get_by_id`, `conversation_create`, `datapack_list`). This usually means a server version mismatch. Update the MCP server or check which datapack is connected. `memory_get_by_id` is used by the canary round-trip for direct-row verification (see [Post-install validation](#post-install-validation-canary-round-trip) above), so an older server that exposes `memory_search` but not `memory_get_by_id` will fail the canary check.
814
+ The MCP server responded but does not expose the expected tools (`memory_search`, `memory_get_by_id`, `conversation_create`, `datapack_list`). This usually means a server version mismatch. Update the MCP server or check which datapack is connected. The canary itself calls `datapack_search`, or `datapack_list` on a server without it (see [Post-install validation](#post-install-validation-canary) above).
778
815
 
779
816
  ### DNS lookup failed
780
817
 
@@ -862,6 +899,8 @@ node installer/bin/create-meko-setup.mjs --uninstall --verbose
862
899
  |---|----------|-------|-----------------|
863
900
  | M1 | Fresh local install | `node installer/bin/create-meko-setup.mjs --local --yes` with docker stack running | All 5 steps pass, validation shows 3 green checks |
864
901
  | M2 | Fresh cloud install | Run interactively, provide Cloud Meko URL + API key | MCP registered with `Authorization: Bearer` header, env vars set, validation passes |
902
+ | M2b | Browser sign-in | In a terminal with `$MEKO_API_KEY` unset, run `--url https://mcp.mekodata.ai/mcp` without `--api-key` and sign in | A key is created through `POST /api-keys`; validation passes |
903
+ | M2c | No terminal, no key | Pipe stdin (or run under CI) with no `--api-key` and no `$MEKO_API_KEY` | Exits with "API key is required for Cloud Meko" |
865
904
  | M3 | Existing config | Run installer when `meko` MCP is already registered | Prompts to overwrite; answering No keeps existing config |
866
905
  | M4 | No claude CLI | Run on a machine without `claude` in PATH | Exits with error message and install link |
867
906
  | M5 | Server unreachable | Install with `--skip-validation`, then re-run without it | Install succeeds; validation warns about connectivity |