You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of #9515 — the last mile: make the standardized servers discoverable, published, and unified behind one client entry. metagraphed's discovery layer is the model, including one hard lesson:
server.json (MCP registry manifest, streamable-http remote) published by an OIDC mcp-publisher workflow;
/.well-known/mcp/server-card.jsoncomputed at request time — an earlier committed version caused a merge conflict on every concurrent tool PR;
/.well-known/agent-tools/{index,openai,anthropic}.json as pure projections of listToolDefinitions();
LoopOver today has none of this: no server.json, no .well-known MCP surfaces, serverInfo.version hardcoded "0.1.0" (src/mcp/server.ts:2169), and two-to-three separate client configs for what should feel like one product (loopover-mcp init-client for ORB stdio, a hand-written second entry for loopover-miner-mcp, and no client story at all for the remote /mcp).
server.json + registry publish: manifest at repo root (io.github.JSONbored/loopover, remotes: [{type: "streamable-http", url: "https://api.loopover.ai/mcp"}] plus the npm stdio package entry), validated field-by-field in CI against the tri-lock (mcp: validate:mcp contract validator — Ajv output enforcement, per-tool smoke gate, version tri-lock across all three servers #9520); a workflow_dispatch, main-only publish workflow using GitHub OIDC and a SHA-pinned mcp-publisher. Anti-rot guard: the workflow fails loudly if any path it watches is absent from HEAD; the version source is @loopover/mcp's package.json via the existing release automation — no new hand-bumped constants (serverInfo.version and src/services/mcp-compatibility.ts both derive from it).
Gateway mode for the stdio bin (decision recorded here): when a loopover-mcp login session exists, the stdio server mounts the remote server's tools — fetch tools/list from the authenticated /mcp, re-register each remote-only tool as a passthrough proxy (schemas come across the wire; nothing duplicated), refresh on listChanged. Name collisions cannot occur by construction: post-contract(remote): migrate the remote MCP server's tools to @loopover/contract — typed handlers, real output schemas #9518 a tool name is either locality local-git (served locally) or remote (proxied) in the one contract registry — assert this invariant in validate:mcp. Offline/unauthenticated ⇒ local tools only plus one structured advisory resource, never an error. Opt-out flag --no-remote for byte-identical current behavior. init-client output and generated docs updated accordingly.
AMS bin decision (recorded here):loopover-miner-mcpstays a separate stdio server — Epic: hosted AMS chat platform — sign up, connect GitHub, converse with your miner #9184's hard constraint is that local UX must not regress, and a dual-role operator's two-entry config is already documented and pin-tested. Revisit folding miner tools into the gateway only after the gateway has shipped and real dual-role usage data exists (reopen here with that data).
AMS-separate decision recorded; regenerated client-config docs for all three modes
Transport-tagged telemetry
Expected outcome
https://api.loopover.ai/.well-known/mcp.json and the MCP registry describe the live server truthfully on every deploy with no hand-bumped versions and no committable drift; a contributor configures exactly one stdio server and transparently sees every local + remote tool their session entitles them to; and the #9183/#9184 chat platforms consume their tool catalogs from the same .well-known projections — one contract, three runtimes, one front door, done.
References
Part of #9515. Blocked by #9518 and #9520. Advances #9183 / #9184 (catalog endpoints) and #4877 Phase B (self-serve/discovery). Pattern source: metagraphed server.json / publish-mcp-registry.yml / worker-computed server card — plus its version-sync rot as the cautionary spec here.
Context
Part of #9515 — the last mile: make the standardized servers discoverable, published, and unified behind one client entry. metagraphed's discovery layer is the model, including one hard lesson:
server.json(MCP registry manifest,streamable-httpremote) published by an OIDCmcp-publisherworkflow;/.well-known/mcp/server-card.jsoncomputed at request time — an earlier committed version caused a merge conflict on every concurrent tool PR;/.well-known/agent-tools/{index,openai,anthropic}.jsonas pure projections oflistToolDefinitions();LoopOver today has none of this: no
server.json, no.well-knownMCP surfaces,serverInfo.versionhardcoded"0.1.0"(src/mcp/server.ts:2169), and two-to-three separate client configs for what should feel like one product (loopover-mcp init-clientfor ORB stdio, a hand-written second entry forloopover-miner-mcp, and no client story at all for the remote/mcp).Requirements
/.well-known/mcp.json→ server card (tools vialistToolDefinitions(), capabilities, version, deterministicgenerated_at, weak ETag/304);/.well-known/agent-tools/index.json+openai.json+anthropic.jsonvia the contract: create @loopover/contract — the single zod source for tool/API schemas, with a six-tool pilot #9517 spec builders, with the executor block pointing at/mcp+tools/call. Self-host serves the same routes scoped to its own availability-filtered tool set. Routes registered through the api: one route-registration seam — runtime zod validation + spec emission, with a route↔spec ratchet to zero unspecced routes #9519 seam (specced like everything else).server.json+ registry publish: manifest at repo root (io.github.JSONbored/loopover,remotes: [{type: "streamable-http", url: "https://api.loopover.ai/mcp"}]plus the npm stdio package entry), validated field-by-field in CI against the tri-lock (mcp: validate:mcp contract validator — Ajv output enforcement, per-tool smoke gate, version tri-lock across all three servers #9520); aworkflow_dispatch, main-only publish workflow using GitHub OIDC and a SHA-pinnedmcp-publisher. Anti-rot guard: the workflow fails loudly if any path it watches is absent from HEAD; the version source is@loopover/mcp'spackage.jsonvia the existing release automation — no new hand-bumped constants (serverInfo.versionandsrc/services/mcp-compatibility.tsboth derive from it).loopover-mcp loginsession exists, the stdio server mounts the remote server's tools — fetchtools/listfrom the authenticated/mcp, re-register each remote-only tool as a passthrough proxy (schemas come across the wire; nothing duplicated), refresh onlistChanged. Name collisions cannot occur by construction: post-contract(remote): migrate the remote MCP server's tools to @loopover/contract — typed handlers, real output schemas #9518 a tool name is either localitylocal-git(served locally) orremote(proxied) in the one contract registry — assert this invariant invalidate:mcp. Offline/unauthenticated ⇒ local tools only plus one structured advisory resource, never an error. Opt-out flag--no-remotefor byte-identical current behavior.init-clientoutput and generated docs updated accordingly.loopover-miner-mcpstays a separate stdio server — Epic: hosted AMS chat platform — sign up, connect GitHub, converse with your miner #9184's hard constraint is that local UX must not regress, and a dual-role operator's two-entry config is already documented and pin-tested. Revisit folding miner tools into the gateway only after the gateway has shipped and real dual-role usage data exists (reopen here with that data).mcp-clients.mdx,init-client --printoutputs — all derived, drift-checked, covering the three connection modes (stdio gateway, remote streamable-http direct, miner stdio).transportproperty so gateway adoption is measurable.Non-goals
Deliverables
server.json+ OIDC publish workflow with the anti-rot path guard and tri-lock validation--no-remote), locality invariant asserted invalidate:mcpExpected outcome
https://api.loopover.ai/.well-known/mcp.jsonand the MCP registry describe the live server truthfully on every deploy with no hand-bumped versions and no committable drift; a contributor configures exactly one stdio server and transparently sees every local + remote tool their session entitles them to; and the #9183/#9184 chat platforms consume their tool catalogs from the same.well-knownprojections — one contract, three runtimes, one front door, done.References
Part of #9515. Blocked by #9518 and #9520. Advances #9183 / #9184 (catalog endpoints) and #4877 Phase B (self-serve/discovery). Pattern source: metagraphed
server.json/publish-mcp-registry.yml/ worker-computed server card — plus its version-sync rot as the cautionary spec here.