Add a guarded-CLI example over the published MCP reference server #343
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
sunday-sprint
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/umbra!343
Loading…
Reference in a new issue
No description provided.
Delete branch "examples-mcp-cli"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Makes the demo from the #337 walkthrough durable, as an
examples/entry pointing at a real upstream.Why a second MCP example
examples/mcpverb/imports the engine and starts its own server in-process. That makes it run with nothing installed, and it never exercises stdio.This one is the product path: KDL policy plus a committed lock, no Go at all, against a server this repository does not control.
The upstream
@modelcontextprotocol/server-everything, the protocol's own reference implementation, overnpxstdio. Public, maintained by the MCP project, and reproducible by any contributor.Deliberately not the node-stats server on kai-server that the original walkthrough used. umbra is the generic engine at the base of the stack, and a guardfile naming one operator's host would leak an estate into a repo that should know nothing about it.
What the example demonstrates
Three leaves from fourteen upstream tools:
get-envis denied by name, since a tool that reads the process environment is the obvious thing to close. The other ten are named by no sentence at all. Both come back identically absent - that is deny-by-absence in one--help, and a reader cannot tell which tools exist upstream.Flags are typed from the server's own JSON Schema:
-aand-bare floats onget-sum, and--locationcarries(one of: New York, Chicago, Los Angeles)because an enum is the constraint a caller cannot infer from a type.What is committed, and what is not
The tool lock is committed, so the granted surface is readable without running anything.
specverb.lockis not: it pins an umbra module version that is the reader's rather than this repository's, and a lock made with--umbra-replaceadditionally carries an absolute local path. So the README is a two-stepspecgen lock && specgen build.Verification
Every command in the README was run against the live server rather than written from the schema. That caught one error:
get-structured-content'slocationis an enum of three cities, so the value I first wrote was rejected upstream. Fixed, and the enum-in-help behaviour it exposed is now called out in the README.Also confirmed against the real server: the contradiction check (
can call get-envbeside theneverfails the lock closed rather than resolving it),--dry-run, and the JMESPath projection.go test ./...,golangci-lint run ./..., andpre-commit run --all-filespass.This is the first end-to-end exercise of the stdio transport against a real published server. The mcpverb tests cover stdio's argv gate but drive HTTP.