Skip to content

docs(mcp): Step-1 inventory for the SPARK wiring audit + two corrections - #2503

Merged
POWERFULMOVES merged 2 commits into
mainfrom
docs/mcp-inventory-spark
Aug 9, 2026
Merged

POWERFULMOVES merged 2 commits into
mainfrom
docs/mcp-inventory-spark

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Aug 9, 2026 •

Copy link
Copy Markdown
Owner

What

MCP_WIRING_AUDIT_SPARK_2026-08-09.md hands SPARK a fleet-wide audit whose Step 1 is the inventory. This is that step, done ahead of pickup so SPARK starts from a matrix with blockers named. Not a claim on the lane — SPARK still CLAIMs it.

Two corrections, both to things I had repeated

1. PMOVES-jcodemunch-mcp is not an n8n MCP. Verified against upstream jgravelle/jcodemunch-mcp: it's a code-exploration server — tree-sitter AST indexing, symbol-level retrieval, 90+ tools (search_symbols, get_symbol_source, find_importers, get_blast_radius, get_call_hierarchy, check_edit_safe), 70+ languages, ~96% claimed token reduction. pip install jcodemunch-mcp, local-first, no API key for core functionality.

So it isn't blocked on the n8n owner-password reset — that story is real but belongs to a different surface. It moves from operator-gated to one of the three cheapest wires available.

Worth noting what it actually pairs with: jcodemunch plus a consumer-side MCP client is symbol-level retrieval without loading files. That's capability-in-the-field applied to code reading — a small model asks for a symbol instead of ingesting a repo.

2. flute-gateway/mcp_bridge.py is mounted, and authenticated. An earlier pass called it dead code. main.py:617-625 imports create_mcp_router, mounts it, and passes dependencies=[Depends(verify_api_key)] — the auth arrived via #2491's fix commit.

The gating only works because create_mcp_router returns a real APIRouter; include_router(dependencies=…) does not apply to a Starlette Mount. Plausible silent no-op that happens to be correct. It's live but unregistered, not dead.

The structural finding

Three registration surfaces, and they disagree:

  1. .claude/mcp.json — 13 entries, and Claude Code needs --mcp-config to read it at all, so presence ≠ callable
  2. pmoves/config/mcp_inventory.json — the canonical generator source, and the one actually out of sync (hirag, e2b, jcodemunch, flute-bridge, gradio-tts absent from it too)
  3. pmoves/config/mcp/*.yaml — descriptors, one of which literally says "Install the pmoves n8n MCP adaptor (todo)"

Recommendation: generate .claude/mcp.json from mcp_inventory.json. Two hand-maintained lists of the same thing is the exact drift this repo has been paying for all week — four copies of cleanup logic, two claude-pmoves.sh, a deny-list duplicating patterns.yaml.

Ranked cheapest-first

  1. pmoves-hirag-mcp — populated, tests, README ships copy-paste JSON, defaults already correct. Zero code, zero secrets.
  2. Ultimate-TTS Gradio MCP — already running, GRADIO_MCP_SERVER defaults "true". One SSE entry.
  3. PMOVES-jcodemunch-mcp — uvx + one entry, no secrets.

Those three are one sitting and need nothing from the operator.

The n8n lane has two independent blockers: n8n-bootstrap is operator-gated on an owner password reset, and n8n-agent.yaml describes a container that doesn't exist in any compose file.

Also documented

Three unrelated things are called "MCP" here — real servers, consumer-side clients (pipecat MCPClient, Archon per-node config), and the "GRADIO MCP" TAC rail which is a gradio_client test harness and not the protocol. Anyone asked to "wire the MCP" has three wrong answers available.

Verification

$ make -C pmoves validate-command-anchors
Anchor findings: 435 total, 435 baselined, 0 new
PASS

Open questions for SPARK are listed in the doc, along with what wasn't verified this pass.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Added an MCP wiring audit handoff with a verified inventory of servers, clients, test harnesses, and registration surfaces.
    • Documented authentication and secret requirements, including key integration status and unregistered services.
    • Clarified wiring priorities, retired or parked integrations, missing configuration entries, and unresolved questions across several connected systems.

MCP_WIRING_AUDIT_SPARK_2026-08-09.md hands SPARK a fleet-wide audit whose Step 1
is the inventory. This is that step, done ahead of pickup so SPARK starts from a
matrix with blockers named rather than a blank page. Not a claim on the lane.

TWO CORRECTIONS, both to things I had also repeated:

1. PMOVES-jcodemunch-mcp is NOT an n8n MCP. Verified against upstream
   jgravelle/jcodemunch-mcp: it is a CODE-EXPLORATION server — tree-sitter AST
   indexing, symbol-level retrieval, 90+ tools (search_symbols, get_symbol_source,
   find_importers, get_blast_radius, get_call_hierarchy, check_edit_safe), 70+
   languages, ~96% claimed token reduction. `pip install jcodemunch-mcp`,
   local-first index, NO API KEY for core functionality.

   So it is not blocked on the n8n owner-password reset — that story is real but
   belongs to a different surface. It moves from "operator-gated" to one of the
   three cheapest wires available.

2. flute-gateway/mcp_bridge.py is mounted AND authenticated. An earlier pass
   called it dead code. main.py:617-625 imports create_mcp_router, mounts it, and
   passes dependencies=[Depends(verify_api_key)]. The auth arrived via #2491's fix
   commit. Worth noting the gating only works because create_mcp_router returns a
   real APIRouter — include_router(dependencies=...) does NOT apply to a Starlette
   Mount, so this was a plausible silent no-op that happens to be correct. It is
   live-but-unregistered, not dead.

THE STRUCTURAL FINDING: there are THREE registration surfaces and they disagree.
.claude/mcp.json (13 entries, and Claude Code needs --mcp-config to read it at
all), pmoves/config/mcp_inventory.json (the canonical generator source, and the
one actually out of sync — hirag/e2b/jcodemunch/flute-bridge/gradio-tts are
absent from it too), and pmoves/config/mcp/*.yaml (descriptors, one of which says
"todo"). Recommendation: generate .claude/mcp.json FROM mcp_inventory.json. Two
hand-maintained lists of the same thing is the exact drift this repo has been
paying for all week.

Also documents that three unrelated things are called "MCP" here — real servers,
consumer-side clients (pipecat MCPClient, Archon per-node config), and the
"GRADIO MCP" TAC rail which is a gradio_client test harness and not the protocol.

Ranked cheapest-first: hirag-mcp (zero code, zero secrets, README ships the
JSON), Gradio-TTS (already live, MCP on by default), jcodemunch (no secrets).
Those three are one sitting and need nothing from the operator. The n8n lane has
TWO independent blockers, one operator-gated and one needing a compose service
written.

Verified: make -C pmoves validate-command-anchors passes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: bf586037-21ea-446f-a3c1-04d88653545d

📥 Commits

Reviewing files that changed from the base of the PR and between 0135978 and 4f8513f.

📒 Files selected for processing (1)
  • pmoves/docs/handoffs/MCP_WIRING_INVENTORY_2026-08-09.md

📝 Walkthrough

Walkthrough

The handoff adds a corrected MCP wiring audit. It inventories server and client surfaces, documents registration layers, ranks wiring work, and records unresolved deployment and authentication questions.

Changes

MCP wiring audit

Layer / File(s) Summary
MCP surface classification
pmoves/docs/handoffs/MCP_WIRING_INVENTORY_2026-08-09.md
The handoff corrects the jCodeMunch and flute-gateway classifications and adds a wiring matrix for MCP-related surfaces.
Registration and consumer model
pmoves/docs/handoffs/MCP_WIRING_INVENTORY_2026-08-09.md
The document describes three registration layers and distinguishes MCP servers, consumer-side clients, and the Gradio test harness.
Wiring priorities and open questions
pmoves/docs/handoffs/MCP_WIRING_INVENTORY_2026-08-09.md
The document ranks wiring work and records unresolved profile, endpoint, attribution, and verification questions.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Suggested labels: governance

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/mcp-inventory-spark

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the docs Documentation label Aug 9, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d2d32cca80

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

)
```

Mounted **and** gated by `verify_api_key`. The auth arrived via PR #2491's fix commit. Note the gating only works because `create_mcp_router` returns a real `APIRouter` — `include_router(dependencies=…)` does **not** apply to a Starlette `Mount`, so this was a plausible silent no-op that happens to be correct.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark Flute authentication as conditional

When FLUTE_API_KEY is unset—the documented default and the Compose fallback—verify_api_key() returns successfully without requiring X-API-Key, so the bridge is not unconditionally authenticated. Calling it gated here and “authed” in the ranking could lead SPARK to register a control surface without first provisioning a key; document the condition and require the key through the canonical secrets funnel before registration.

AGENTS.md reference: AGENTS.md:L175-L177

Useful? React with 👍 / 👎.

| `agent-zero` `:8080/mcp` | http | none noted | both ✔ | **wired** |
| `pmoves-nats-mcp` | stdio | `NATS_URL` today | both ✔ | **wired**; PR #2496 adds CORE `.creds` + CHIT-signed publish |
| `pmoves-hirag-mcp` | stdio | none (proxies HIRAG_URL) | **absent from both** | **UNWIRED — cheapest fix in the audit** |
| Ultimate-TTS Gradio MCP | Gradio built-in SSE | none | absent | **UNWIRED but ALREADY LIVE** — `GRADIO_MCP_SERVER` defaults `"true"` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enable Gradio MCP before registering it

In the canonical media/full Compose configuration inspected, pmoves/docker-compose.media.yml:322 explicitly sets GRADIO_MCP_SERVER=false because the image still needs the gradio[mcp] extra and a rebuild. Therefore this surface is not already live, and adding the recommended SSE entry alone will fail; the inventory should retain the image rebuild and enablement as prerequisites.

Useful? React with 👍 / 👎.

| Surface | Transport | Auth | Registered | Status |
|---|---|---|---|---|
| `pmoves-cipher` `:8105` | SSE `/mcp/sse` | Bearer `CIPHER_API_TOKEN` | `.claude/mcp.json` ✔ · `mcp_inventory.json` ✔ | **wired + working** |
| `agent-zero` `:8080/mcp` | http | none noted | both ✔ | **wired** |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reconcile the two Agent Zero registrations

The two registrations are not equivalent: .claude/mcp.json uses unauthenticated HTTP at localhost:8080/mcp, while mcp_inventory.json declares token-authenticated SSE at localhost:8081/mcp/t-${AGENT_ZERO_MCP_TOKEN}/sse. Marking this as “both ✔” hides exactly the drift the audit is intended to find, and generating the Claude config from the inventory would silently change its port, transport, and authentication requirements; identify the authoritative endpoint before recommending generation.

Useful? React with 👍 / 👎.


| Surface | Transport | Auth | Registered | Status |
|---|---|---|---|---|
| `pmoves-cipher` `:8105` | SSE `/mcp/sse` | Bearer `CIPHER_API_TOKEN` | `.claude/mcp.json` ✔ · `mcp_inventory.json` ✔ | **wired + working** |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Correct the Cipher SSE path

Both registration files point Cipher at /api/mcp/sse, not /mcp/sse as recorded in this matrix. Anyone using this inventory to reconstruct or validate the registration would probe the wrong endpoint, so the transport cell should retain the /api prefix.

Useful? React with 👍 / 👎.

@POWERFULMOVES
POWERFULMOVES merged commit bea96b1 into main Aug 9, 2026
14 of 15 checks passed
@POWERFULMOVES
POWERFULMOVES deleted the docs/mcp-inventory-spark branch August 9, 2026 23:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant