Development record
The MCP Front Door Opens — abcd's Core Verbs From Any MCP-Capable Harness
Press Release
abcd's second front door is open: MCP. The same transport-agnostic core the CLI drives is now reachable as
mcp:abcd:*tools from any MCP-capable harness — no plugin, no per-host adaptor, no waiting for an integration. Register the server, and intents, capture, guard checks, rules, and history are on the harness's tool palette, returning the same structured results the CLI returns. Under the host-tier policy (adr-39) this is the universal floor: the guarantee every harness starts from, before any native adaptor makes it richer."Our harness had no abcd integration, and it didn't matter," said Alice. "One MCP server entry and the whole record was drivable from the agent. When a native adaptor shipped later, nothing we'd built on the floor had to change."
Why This Matters
adr-23 committed to the MCP server as the second thin front door over the unchanged core, and Phase 3 schedules it ("MCP front door opens") — but no intent, spec, or code exists for it; internal/surface/mcp is a reserved, empty seam. adr-39 raises the stakes: the MCP front door is the floor of the whole multi-harness policy — the tier every MCP-capable harness gets with zero per-host work, and the fallback rung every adaptor ladder ends on. Nothing above the floor (per-host adoptions, the eventual open-source default) is credible until the floor exists.
What's In Scope
internal/surface/mcpas a thin front door: core verbs exposed asmcp:abcd:*tools, each returning the same structured result the core hands the CLI — the front door owns transport and input validation at the boundary (adr-23), never logic.- Server lifecycle from the binary (an explicit serve verb) — stdio transport first; the CLI stays the reliable default front door (brief invariant: every capability reachable with no plugin host present).
- Registration docs: how any MCP-capable harness registers the server (host-neutral; per-host pages arrive with per-host adoptions).
- Parity evidence: an MCP client invoking a verb gets a result equivalent to the CLI invocation — the floor row of itd-22's parity suite.
- The one stable contract a tool built on abcd reads (proposed 2026-11-01, to confirm at planning): a verb-shaped addition for a repository's product lives in the host's own plugin format or a script, and reaches abcd only through these tools' structured results and the JSON Schemas generated for them, so extending abcd never means loading code into it.
What's Out of Scope
- Per-host adaptors, native plugins, and concept mapping — itd-22's lineage and per-host adoption intents (adr-39).
- abcd acting as an MCP client (oracle adapters over MCP) — adr-25's separate seam.
- Remote/HTTP transport — stdio first; a further transport is its own decision.
- Any new hook or context-injection behaviour — the floor exposes verbs; dynamic features are what native rungs add.
Acceptance Criteria
BDD format, per
itd-1-acceptance-gates. Seeded criteria are proposals until the planning interview confirms them.
- Given the abcd binary with no plugin host present, when the MCP server verb is invoked over stdio by a conforming MCP client, then the advertised tool list covers the core verbs designated for the floor AND each tool call returns the same structured result the corresponding CLI invocation returns for the same repository state.
- Given an unrecognized or malformed tool input, when a mutating verb receives it over MCP, then the call fails closed with a structured error and writes nothing (unrecognized input never writes).
- Given the MCP front door is live, when the surface registry and brief are linted, then the new surface has its brief row and surface-registry entry in the same change (spec moves with the surface).
- Given a Go MCP dependency is proposed for the implementation, when the intent reaches planning, then the dependency passes the sota-per-intent path decision with explicit maintainer approval before any
go get(hard stop).
SOTA
Surveyed on 2026-10-23; sources, evidence tiers and the local fit risks are in the harness, interop and lifeboats SOTA note.
- The current MCP revision is 2026-07-28: the
initializehandshake and protocol sessions are gone, every request carries its version and capabilities in_meta, servers MUST answerserver/discover, results carryresultType, roots/sampling/logging are deprecated, andtools/listshould be deterministic for prompt caching (MCP changelog). Dated revisions through 2025-11-25 still use the stateful handshake (conformance framework), and which revision each host negotiates today was not found, so the floor answers both. - Structured results map straight onto
outputSchemaandstructuredContent; input failures are tool errors (isError), unknown tools are JSON-RPC errors; tool annotations are untrusted to clients; a no-argument tool uses{"type":"object","additionalProperties":false}(MCP tools page). - The official Go SDK (
modelcontextprotocol/go-sdk, with Google) supports 2026-07-28 at v1.7.0+ but itsgo.modrequires eight direct modules includingx/tools,x/oauth2and a JWT library;mark3labs/mcp-gois at 2025-11-25 and "under active development". Either is a new dependency needing explicit sign-off before anygo get. - The no-dependency cost is measured for the older handshake and estimated for the new: the guard's approve sub-verb already serves
initialize,ping,tools/listandtools/callover stdio in 312 lines of standard library (internal/surface/cli/guard_approve.go), speaking 2025-06-18, and the RepoPrompt route is a Streamable HTTP client beside a test server. The 2026-07-28 deltas on top of that areserver/discover, per-request_metaparsing,resultTypeon every result, the requiredttlMsandcacheScopeon list results (CacheableResult), andUnsupportedProtocolVersionError(-32022) on a version mismatch;pingandlogging/setLevelare removed in the new revision, sopingandinitializestay only for pre-2026-07-28 clients. - Every host prefixes tool names itself (
mcp__abcd__<tool>in Claude Code for a user- or project-scoped server andmcp__plugin_abcd_abcd__<tool>when the server is bundled in the plugin, which is the route abcd ships;mcp_abcd_<tool>in Gemini CLI, which also splits policy rules on the first underscore), so abcd's names stay plain[a-z0-9_]; themcp:abcd:*spelling in this record is a label, not a wire name. - Registration is three config shapes:
claude mcp addwith.mcp.jsonat project scope (approval asked),[mcp_servers.<name>]in Codex'sconfig.toml(startup_timeout_sec10,tool_timeout_sec60),mcpServersin Gemini'ssettings.json(trustoff by default). - Codex's
writesapproval mode prompts for every tool "not marked read-only", soreadOnlyHint/destructiveHinton each verb decide whether a harness asks first. - The conformance framework (
npx @modelcontextprotocol/conformance) is the parity evidence; it is a Node tool, a lab dependency and never a build step.
Path 2 — a native stdio server shaped to the 2026-07-28 specification, extending the hand-rolled server the binary already carries, with the official Go SDK named as the later replacement for the framing layer only; adopting the SDK instead is a hard stop needing the maintainer's sign-off. The independent fit-challenge runs at plan time.
Open Questions
- Which subset of core verbs is the floor's v1 tool list — all read verbs plus which mutating ones?
- MCP SDK versus hand-rolled protocol: the anticipated SDK is a new dependency (hard stop); what is the no-dependency alternative's real cost?
- How does the server resolve the target repository — cwd at launch, a per-call argument, or both?
- (SOTA 2026-10-23) Should the guard's approve server and the front door become one server package before the floor ships, so the binary carries one MCP dispatcher rather than two?
- (SOTA 2026-10-23) Which mutating verbs carry
destructiveHint, given Codex'swritesmode prompts on every tool not marked read-only?
Audit Notes
Empty. Populated by intent-fidelity-reviewer when intent moves to shipped/.
Frontmatter
| id | itd-113 |
|---|---|
| type | intent |
| lifecycle | drafts |
| kind | standalone |
| severity | major |
.abcd/development/intents/drafts/itd-113-abcd-s-core-verbs-are-reachable-over-mcp.md
open on GitHub ↗ · commit history ↗
Referenced by2
- adr-2611011813195749abcd never runs a foreign executable under its own name, and no code that writes records is loaded at run timerelated
- iss-2610262039030685itd-113 calls MCP abcd's second front door; 03-configuration calls an mcp/ door adr-23's thirdrelated
mentions7
- adr-23A transport-agnostic Go core behind thin front doors
- adr-25The LLM is host-delegated by default; oracles are opt-in adapters
- adr-39Host-tier policy — MCP floor, reference host, open-source default
- dcn-26081600000000012026-08-16 — the multi-harness routing ADOPTED at maintainer confirmation (itd-84 hand-run graded into the decomposition-calibration note, entry 3): adr-39 filed — the host-tier policy (MCP front door as the universal floor; the current plugin host's integration as the reference implementation, the assumed SOTA surface for the time being; the shipping default ultimately an open-source harness, flipping only on the parity suite plus a deliberate maintainer act; adaptor ladder most-native-first; per-host adoption one intent each at an explicit decision, nameless until adopted). itd-22 renamed `harness-portability` (id unchanged) and reworked to carry the shared machinery only — host profile seam, ladder semantics, parity conformance suite — with a retire-the-name ban (`retired-itd-22-slug`) on the old slug. itd-113 minted: the MCP front door intent (the floor is the first build). The never-double-write stance routed into adr-39 rather than a new principle — it restates one-canonical-primitive at the host boundary.
- dcn-26110113323065712026-11-01 — The technical facilitator's ruling of 2026-11-01 on publishing schemas: abcd generates JSON Schemas for its boundary documents from the Go types in this repository, record front-matter included and run-state excluded, gated against drift and shipped with each release under a stable location-independent $id namespace; the work folds into itd-113, whose MCP front door needs per-tool input schemas anyway, and the OpenAI-compatible oracle adapter sends a reply's schema with each request so a local model server can constrain its answer. A separate schema repository, superseding adr-28, is reopened only when a non-Go implementation needs its own cadence or a second organisation proposes a schema change. Reverse by superseding adr-28.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-22abcd Reaches Any Harness Through an Adaptor