Files
hq/03-DESIGN/00-as-is/13-the-console.md
T
jschoubben 418261213c
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: THE CHANGE ALTERS ITS OWN CHECK (merge-check.sh): main's version judged it; the change's judges the pull requests after it merges; it…
mesh/delivery superseded: a newer head of the same pull request
Remove the decision records and research efforts, which the knowledge base now holds whole (issue 426)
ADR 0290 rule 9: once the import is checked record by record, hq keeps no copy.
The records and efforts are removed; every link or path to them reads "ADR NNNN" or
"research NNN"; a design's decisions: lists "ADR NNNN". 02-DECISIONS keeps a pointer
README with the reading order's six topics, which the knowledge base reads through the
records module; 01-RESEARCH keeps a pointer README. The checks drop the rules that
judged records (the knowledge base holds each at propose; checks/README.md says where)
and refuse a record written here again. Playbooks 01 and 02 and the skills write and
read records with the knowledge base's verbs.
2026-10-11 12:56:09 +02:00

4.3 KiB

layer, status, code, updated, decisions
layer status code updated decisions
as-is implemented
mesh-catalog modules/mesh-console
mesh-tools src/mesh.ts
mesh-tools src/http.ts
mesh-tools src/runtime.ts
mesh-controller internal/broker
mesh-controller cmd/mesh-controller/check.go
mesh-controller cmd/mesh-controller/seatverbs.go
2026-10-10
ADR 0152
ADR 0095
ADR 0037
ADR 0154

The mesh MCP server, as it runs

The mesh's tools reach a person through a module the mesh assigned to their machine. Since 2026-09-30 a workstation that is a node can be assigned mesh-console; the mesh mints a bus account <node>.mesh-console, seals its credential to the machine, and the container binds 127.0.0.1:<port> with the port the mesh assigned for the manifest's declared one. An agent on the machine is pointed at http://127.0.0.1:<port>/mcp and sees the mesh's tools; a person uses the same endpoint. Nothing on the machine holds a credential a person had to carry.

What it answers

initialize, tools/list, tools/call, over HTTP, one JSON body per request, no session and no event stream. tools/list is what the running modules answered: every tool runner built on or after that day serves a tools verb for its module, and the mesh MCP server asks the catalogue for the roster and each module for its tools. A module that did not answer is named in the list's _meta.notAnswering. On the day it shipped that was 36 of 51 modules — those that serve no tools at all, and those whose rebuilt runtime the mesh records rather than rolls out — and 62 tools from the rest.

tools/call reaches any tool by <module>.<tool>, listed or not. The mesh MCP server's grant is *, so what it may call is every tool on the mesh; its account may publish nothing else and subscribes nothing.

No call is refused for want of a person's approval: a tool runner serves every call it is issued, whoever made it, and cannot tell an agent from the operator (ADR 0259 §6, issue 340). An act waits for the operator's warrant only where its module asks first, in its own code: the agent module's instruction proposals, and the controller's settings proposals and the actions it offers on a condition.

The mesh's own verbs

Since 2026-09-30 evening (ADR 0154). The mesh MCP server asks the mesh-controller seat's tools verb beside the modules and lists every role's tools as <seat>.<verb> — mesh-controller.status, mesh-controller.push and the other ten. A call to <prefix>.<name> reaches the seat when the prefix is a seat declaring that verb, and the module otherwise; seat:<seat>.<verb> says so outright. When the controller does not answer, the list names mesh-controller (seat) as not answering and carries the modules' tools regardless. The mesh-controller module is always named as not answering: it serves no module tools, only its seat's.

Around it

  • invokes in a manifest is the grant. It is composed into the bus's user list exactly as a person's account is; the mesh MCP server is the only module that declares it.
  • module check <file|dir>… on the controller's binary judges a manifest with no mesh: the strict parse, every per-manifest problem, and the rules between the manifests given. It prints what it cannot judge without a store rather than refusing. The mesh MCP server's own manifest was the first thing checked with it, and the whole catalogue passes.
  • The person's client remains. operator issue and mesh tools|call|mcp with a credential file still work, for a machine that is not a node and for a mesh not yet able to assign anything. mesh tools --console <url> goes through a running mesh MCP server with no credential; it is covered by the runtime repository's tests and was not exercised on the live mesh.

What shipped bent

  • A module registered by hand from the catalogue with --source <url> --path modules/<m> records a URL, not a place on the git seat: --self takes the forge path form (<owner>/<repository>), which the operator did not pass. The rebuild-on-merge matched the URL anyway.
  • Modules whose upgrade policy is record — the forge among them — answered tools only once something pushed their rebuilt runtime; until then they are listed as not answering while still callable. That is the policy doing what it says, not a fault of the mesh MCP server.