plugin-mcp
| Version | 2026.178.1430 |
| Repo | superproject |
| Plugin | yes — see the plugin reference |
OUT-OF-TREE charly plugin serving TWO MCP capabilities — a standalone Go module (go.mod + main.go) that speaks the Model Context Protocol over go-plugin gRPC via the charly plugin SDK (github.com/opencharly/sdk). charly’s loader fetches this candy’s repo, go-builds the provider binary on the HOST, and serves it OUT-OF-PROCESS via LocalTransport, so the github.com/modelcontextprotocol/go-sdk library lives HERE, out of charly’s core:
-
verb:mcp — the
mcpMCP-protocol CHECK verb (the go-sdk CLIENT). Since the schema-compaction cutover an authoredmcp:step desugars to the internal plugin/plugin_input envelope, and every mcp-exclusive modifier (method/mcp_name/tool/uri/input) lives in the plugin’s OWN #McpInput (schema/mcp.cue); the verb dispatches through the provider registry exactly like a built-in (ResolveVerb → grpcProvider → invokeVerbProvider). The plugin resolves the declared mcp_provides (cc.ResolveImageLabel) + the picked, host-routable dial endpoint (cc.ResolveEndpoint) via the generic reverse-legs (the host owns the podman / OCI-label / port-mapping machinery) — so this plugin needs no container inspection. Full 7-method surface (ping/servers/list-tools/list-resources/list-prompts/call/read). -
command:mcp —
charly mcp …(the go-sdk SERVER), the externalized MCP bridge ported out of charly’s core (the deleted charly/mcp_server.go; the C1 dep-shed that removes go-sdk from the core binary entirely). It builds the tool surface from the host CLI MODEL (charly __cli-model→ sdk.CLIModel) and fork/execscharly <cmd>per tool call — the host stamps CHARLY_BIN with the spawning binary. charly DISPATCHES the command by fork/exec’ing this binary in CLI mode (sdk.Main → cliMain), so it owns real terminal stdio:--stdioserves the editor/LLM integration over stdin/stdout,--listenserves Streamable HTTP (the in-container supervised deployment).
verb:mcp is served over gRPC (the provider registry); command:mcp is served
via the CLI fork/exec path — so command:mcp is declared in plugin.providers
(for the CLI-grammar prescan + baked manifest) but NOT advertised in Describe.
The R10 consumer is an MCP-providing pod bed whose check composes this plugin
(e.g. jupyter / chrome-devtools-mcp) plus the charly-mcp candy that runs
charly mcp serve.
Acceptance plan
Section titled “Acceptance plan”This candy’s plan: — the runnable spec charly check executes against a live deployment. check: steps are idempotent probes; run: steps change state.
| Intent | Step |
|---|---|
check |
the mcp verb dispatches through the provider registry and pings the declared MCP servers on a live deployment (the out-of-process plugin verb dials the host-resolved MCP endpoint) |
check |
the out-of-tree plugin ships a buildable Go module providing command:mcp (the externalized charly mcp server) the host can build + fork/exec; the full charly mcp serve end-to-end is exercised by the live R10 |