R82.D — Launcher Config Audit
Task: R82.D · launcher config reality
Scope: .mcp.json, .vscode/mcp-settings.example.json
Round: R82 phase-0-1-stabilization, Wave 2
Author: T3 executor
Date: 2026-04-19
Greek letter: γ (Server Lifecycle) + α (System Core)
1. Intent
Both launcher configs at the repo root drifted from the live Phase 0 env-var contract. .mcp.json is outright wrong (AMS donor namespace + nonexistent src/server.js + “Phase 0 not started” inline note). .vscode/mcp-settings.example.json is partially wrong (COLIBRI_DB instead of COLIBRI_DB_PATH, COLIBRI_WATCH_MODE instead of COLIBRI_MODE, COLIBRI_ROOT not read by any live code). R82.D reconciles both files to what src/config.ts + src/modes.ts actually accept.
2. Surface inventory
2.1. .mcp.json (as of b88d7ca0, 18 lines)
{
"mcpServers": {
"ams-unified": {
"command": "node",
"args": [
"E:/AMS/src/server.js"
],
"env": {
"AMS_ROOT": "E:/AMS",
"AMS_WATCH_MODE": "none"
},
"_note": "Phase 0 not started — src/server.js does not exist yet. Update when P0.2 completes."
},
"github": {
"url": "http://localhost:3000/sse"
}
}
}
2.2. .vscode/mcp-settings.example.json (as of b88d7ca0, 36 lines)
{
"_comment_r75_wave_h": [ /* 9-line R75 Wave H annotation block */ ],
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
}
},
"_colibri_phase_0_placeholder": {
"_enabled_when": "Rename the key to 'colibri' to activate; src/server.ts and data/colibri.db are live as of R75 Wave H",
"command": "node",
"args": ["--loader", "tsx", "${workspaceFolder}/src/server.ts"],
"env": {
"COLIBRI_ROOT": "${workspaceFolder}",
"COLIBRI_DB": "${workspaceFolder}/data/colibri.db",
"COLIBRI_WATCH_MODE": "none"
}
}
}
}
3. Drift items (with live-code citations)
| # | File | Line | Current value | Correct value | Source of truth |
|---|---|---|---|---|---|
| D1 | .mcp.json |
3 | key "ams-unified" |
"colibri" |
Server identity per package.json:2 "name": "colibri" and .vscode/mcp-settings.example.json placeholder rename note |
| D2 | .mcp.json |
4 | "command": "node" |
"command": "node" with tsx loader args (see D3) |
src/server.ts (TypeScript) runs under tsx per package.json:20 "dev": "tsx watch src/server.ts" |
| D3 | .mcp.json |
6 | ["E:/AMS/src/server.js"] |
["--loader", "tsx", "${workspaceFolder}/src/server.ts"] |
src/server.js does NOT exist; only src/server.ts (2026-04-17 mtime). VS Code example uses node --loader tsx ${workspaceFolder}/src/server.ts — adopt same invocation |
| D4 | .mcp.json |
9 | "AMS_ROOT": "E:/AMS" |
REMOVE | src/config.ts:26-33 rejects any AMS_* variable at load time. No live code reads COLIBRI_ROOT (verified: only reference is in the VS Code example itself + CONTRIBUTING.md doc placeholder) |
| D5 | .mcp.json |
10 | "AMS_WATCH_MODE": "none" |
"COLIBRI_MODE": "FULL" |
src/modes.ts:84-89 rejects AMS_MODE; src/modes.ts:90 reads env.COLIBRI_MODE; valid values FULL | READONLY | TEST | MINIMAL per src/modes.ts:31. Default behavior when unset = FULL per src/modes.ts:91-93 |
| D6 | .mcp.json |
12 | "_note": "Phase 0 not started..." |
REMOVE or rewrite | Phase 0 is 28/28 sealed at R75 Wave I (d5f6a1ff); src/server.ts + data/colibri.db shipped. This banner is factually obsolete |
| D7 | .vscode/mcp-settings.example.json |
30 | "COLIBRI_ROOT": "${workspaceFolder}" |
REMOVE | grep -rn COLIBRI_ROOT src/ returns zero reads. Only CONTRIBUTING.md:65 references it (as an author-facing path placeholder, not a runtime variable). No live code consumes it |
| D8 | .vscode/mcp-settings.example.json |
31 | "COLIBRI_DB" |
"COLIBRI_DB_PATH" |
src/config.ts:48 reads COLIBRI_DB_PATH |
| D9 | .vscode/mcp-settings.example.json |
32 | "COLIBRI_WATCH_MODE" |
"COLIBRI_MODE" |
src/modes.ts:90 reads env.COLIBRI_MODE |
| D10 | .vscode/mcp-settings.example.json |
2-16 | _comment_r75_wave_h |
APPEND R82.D note | Annotation block is intentional doc; R82.D should land a reality note for the next round that touches it |
| D11 | .vscode/mcp-settings.example.json |
26 | _enabled_when text |
Update to drop “Wave H” framing (Phase 0 is sealed); keep rename hint | Annotation still useful but reflects stale waypoint |
4. Live-code env map
Verified via Grep process\.env\.(COLIBRI_|AMS_) src/:
| Env key | Read by | Accepted? | Default |
|---|---|---|---|
NODE_ENV |
src/config.ts:44 |
yes (required) | none |
COLIBRI_DB_PATH |
src/config.ts:48 |
yes | data/colibri.db |
COLIBRI_LOG_LEVEL |
src/config.ts:49-51 |
yes | info |
COLIBRI_WEBHOOK_URL |
src/config.ts:65 |
yes (optional) | — |
ANTHROPIC_API_KEY |
src/config.ts:79 |
yes (optional, call-time validation) | — |
COLIBRI_ANTHROPIC_MODEL |
src/config.ts:84 |
yes | claude-sonnet-4-5 |
COLIBRI_ANTHROPIC_TIMEOUT_MS |
src/config.ts:88-94 |
yes | 30000 |
COLIBRI_STARTUP_TIMEOUT_MS |
src/config.ts:95-101 |
yes | 30000 |
COLIBRI_MCP_TIMEOUT |
src/config.ts:111-117 |
yes | 30000 |
COLIBRI_MODE |
src/modes.ts:90 |
yes | FULL if unset |
AMS_* (any) |
src/config.ts:26-33 |
REJECTED at load time | — |
AMS_MODE |
src/modes.ts:84-89 |
REJECTED | — |
COLIBRI_ROOT |
(no reader) | not consumed | — |
5. Downstream impact
.mcp.jsonis read by Claude Code / MCP clients at workspace boot. With current drift, theams-unifiedserver fails twice: (a)src/server.jsdoes not exist, (b)src/config.ts:29would throwColibri does not support the legacy AMS_* namespace. Found: AMS_ROOT, AMS_WATCH_MODE. Rename to COLIBRI_* or unset.even if the entry point were correct..vscode/mcp-settings.example.jsonis the canonical copy-and-rename template for per-user VS Code MCP config. With current drift, copied config would passAMS_*guard (Colibri-prefixed keys) but fail at first DB open becauseCOLIBRI_DB_PATHis unset (config.ts:48defaultdata/colibri.dbwould kick in silently — the user’s intended${workspaceFolder}/data/colibri.dboverride is lost) andCOLIBRI_MODEdefaults to FULL instead of the user’s intendednone/READONLY.- Fix is config-only; no
src/or test changes required.
6. Out of scope (this task)
- The
githubMCP server entry in both files — unchanged. CONTRIBUTING.md:65$COLIBRI_ROOTplaceholder — author-facing doc, not runtime env. Leave alone.- Any other config file (
package.json,tsconfig.json,.env.example). Scope is exactly the two launcher files. src/runtime code. R82 is docs+config only (per manifest §Out-of-scope).
7. Next step
Contract — see docs/contracts/r82-d-launcher-contract.md (Step 2).
R82.D audit. Inventoried 11 drift items (D1–D11) across two launcher configs, cited live-code source of truth at src/config.ts:26-117 + src/modes.ts:83-101. All fixes are config-only; no code changes.