Skip to content

feat(registries): adopt official MCP registry v0.1 protocol + standardize defaults (MCP-865)#572

Merged
Dumbris merged 3 commits into
mainfrom
feat/official-registry-protocol
Jun 2, 2026
Merged

feat(registries): adopt official MCP registry v0.1 protocol + standardize defaults (MCP-865)#572
Dumbris merged 3 commits into
mainfrom
feat/official-registry-protocol

Conversation

@Dumbris

@Dumbris Dumbris commented Jun 2, 2026

Copy link
Copy Markdown
Member

Summary

Keystone backend for goal MCP-856 — adopt the official Model Context Protocol registry protocol and standardize the shipped default registries. Implements the board-decided design (MCP-856 plan, BOARD-DECIDED section, 2026-06-02). Resolves GH #566 and #567 by design.

Spec: specs/071-official-registry-protocol/.

What changed

  • Official v0.1 parser (internal/registries/official.go): descends the wrapped { server, _meta } envelope; skips deleted/deprecated/non-latest by default; cursor pagination (bounded) with version=latest + search passthrough; versioned User-Agent (registry: Pulse search fails with 410 Gone — fetchServers sends no User-Agent #566). Tolerates camelCase and snake_case wire fields.
  • Per-entry classification (the registry: Fleur servers wrongly shown as Remote (URL synthesized for local stdio apps) — same class as #483 #567 root fix): packages[]stdio (InstallCmd set, URL empty), remotes[]remote (URL set), hybrid → prefer the package and keep the remote as ConnectURL. Never "remotes present ⇒ remote".
  • Curated built-in reference source (reference.go): @modelcontextprotocol servers (filesystem, fetch, memory, time, git, sequentialthinking, everything) shipped in-binary so the basics stay discoverable offline (servers#3047).
  • Default-registry rewire (config.go): add Official (primary, no key) + Reference; keep Docker MCP catalog; demote Pulse + Smithery to opt-in (RequiresKey); drop Azure-demo, mcp.run, mcpstore, Fleur, remote-mcp-servers. Removed the dropped bespoke parsers and all constructServerURL URL synthesis.
  • Docs (same PR, ENG-9): new docs/registries.md; registry-add.md examples switched to the zero-config official registry.

How classification stays consistent

Every add surface (MCP / REST / CLI) funnels through AddServerFromRegistryRefbuildToServerConfig, which derives transport from the entry (InstallCmd ⇒ stdio, else URL ⇒ http). The fix lives entirely in the parser choosing which field to set, so all surfaces inherit it.

Testing (TDD, ENG-7/8)

  • Golden fixture testdata/official_v0.1_servers.json + unit tests: envelope parse, status/isLatest filter, classification matrix, cursor pagination (httptest two-page), offline reference.
  • internal/server/consistency_official_test.go: cross-surface registry: Fleur servers wrongly shown as Remote (URL synthesized for local stdio apps) — same class as #483 #567 regression (packages→stdio, remotes→http identical across REST + CLI).
  • Local green: go build ./..., gofmt, ./scripts/run-linter.sh (0 issues), go test ./internal/... -race, ./scripts/test-api-e2e.sh (65/65, validated against the live official registry).

Scope / follow-ups

  • User-added registries + provenance/trust + registry add-source CLI → MCP-866 (blocked by this).
  • Smithery (opt-in) currently uses the official parser as a best-effort default; exact Smithery-shape parsing is a future refinement (gated behind RequiresKey, skipped without a key).

Related #566
Related #567

Dumbris and others added 2 commits June 2, 2026 07:31
…dize defaults

Implements the board-decided design for goal MCP-856: adopt the official
Model Context Protocol registry protocol and standardize the shipped default
registries. Resolves GH #566 (Pulse v0beta 410) and #567 (remotes-present
misclassification) by design.

- Official v0.1 parser (internal/registries/official.go): descend the wrapped
  { server, _meta } envelope; skip deleted/deprecated/non-latest by default;
  cursor pagination (bounded) with version=latest + search passthrough;
  versioned User-Agent (#566). Tolerates camelCase + snake_case wire fields.
- Per-entry classification (the #567 root fix): packages[] => stdio (InstallCmd
  set, URL empty), remotes[] => remote (URL set), hybrid => prefer the package
  and keep the remote as ConnectURL. Never "remotes present => remote".
- Curated built-in 'reference' source (reference.go): @modelcontextprotocol
  servers shipped in-binary so the basics stay discoverable offline (servers#3047).
- Default-registry rewire (config.go): add Official (primary, no key) + Reference;
  keep Docker MCP catalog; demote Pulse + Smithery to opt-in RequiresKey; drop
  Azure-demo, mcp.run, mcpstore, Fleur, remote-mcp-servers. Remove their bespoke
  parsers and all constructServerURL URL synthesis.
- Cross-surface consistency regression (server/consistency_official_test.go):
  packages-only => stdio, remotes-only => http identical across REST + CLI.

TDD: golden fixture + parser/classification/pagination/reference unit tests.
Local: build, gofmt, golangci-lint (0 issues), go test ./internal/... -race,
and test-api-e2e.sh (65/65, validated against the live official registry) green.

Related #566
Related #567

Co-Authored-By: Paperclip <noreply@paperclip.ing>
…ult set

- New docs/registries.md: default registry table, official v0.1 protocol,
  per-entry transport classification, opt-in API keys, offline reference set.
- registry-add.md: switch examples from the now-opt-in pulse to the zero-config
  official registry.
- specs/071-official-registry-protocol: spec / plan / tasks (speckit format).

Related #566
Related #567

Co-Authored-By: Paperclip <noreply@paperclip.ing>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 2, 2026

Copy link
Copy Markdown

Deploying mcpproxy-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: b7a2747
Status: ✅  Deploy successful!
Preview URL: https://37dc657b.mcpproxy-docs.pages.dev
Branch Preview URL: https://feat-official-registry-proto.mcpproxy-docs.pages.dev

View logs

@codecov-commenter

codecov-commenter commented Jun 2, 2026

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 71.47541% with 87 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/registries/official.go 68.24% 49 Missing and 25 partials ⚠️
internal/registries/search.go 51.85% 10 Missing and 3 partials ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown

📦 Build Artifacts

Workflow Run: View Run
Branch: feat/official-registry-protocol

Available Artifacts

  • archive-darwin-amd64 (28 MB)
  • archive-darwin-arm64 (25 MB)
  • archive-linux-amd64 (16 MB)
  • archive-linux-arm64 (14 MB)
  • archive-windows-amd64 (28 MB)
  • archive-windows-arm64 (24 MB)
  • frontend-dist-pr (0 MB)
  • installer-dmg-darwin-amd64 (21 MB)
  • installer-dmg-darwin-arm64 (19 MB)

How to Download

Option 1: GitHub Web UI (easiest)

  1. Go to the workflow run page linked above
  2. Scroll to the bottom "Artifacts" section
  3. Click on the artifact you want to download

Option 2: GitHub CLI

gh run download 26800669281 --repo smart-mcp-proxy/mcpproxy-go

Note: Artifacts expire in 14 days.

…e opt-in registry API key

- FindServerByID now matches against the FULL registry listing instead of
  the 50-entry SearchServers UI cap, so a server beyond the first page is
  addable, not merely searchable (Codex RV #1). Forwards the ID as a
  server-side search hint with a full-fetch fallback; drops the dead
  findServerByIDLimit const.
- Send the configured MCPPROXY_REGISTRY_<ID>_API_KEY as an
  "Authorization: Bearer" header in both request builders (generic + official
  protocol) so the opt-in Pulse/Smithery registries authenticate as
  documented instead of reading the key but querying unauthenticated
  (Codex RV #2).
- docs/registries.md: document the Bearer scheme.
- Tests: beyond-limit add lookup, key-on-wire (generic + official),
  no-key-no-header.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
@Dumbris Dumbris merged commit 4a08ce1 into main Jun 2, 2026
31 checks passed
@Dumbris Dumbris deleted the feat/official-registry-protocol branch June 2, 2026 06:40
Dumbris added a commit that referenced this pull request Jul 2, 2026
…iorities, audit fixes (#797)

A multi-agent consistency audit (2026-07-02) found roadmap.yaml stale versus
merged PRs and carrying several false progress badges from wrong spec links.
Corrected CI-filtered telemetry also re-prioritized the personal-edition work.

Statuses corrected per merged PRs:
- scanner-simplification children: US1 #786 / US2 #792 / US4 #794 marked done;
  US3 #793 in_review. Epic stays in_progress. Added deep-scan trust-fix task
  and flagged docs T037-T039 as merge-blocking for #793.
- registries-official-protocol marked done (spec 071 shipped 12/12, #572).

False badges / wrong provenance fixed (per the file's own convention — link
dropped, provenance moved into the note):
- sandbox-isolation no longer links spec 054 (unrelated security-gateway spec).
- ux-audit no longer links spec 064 (unrelated agent-fleet cockpit spec).
- marketplace no longer links spec 070 (that is the registries-search-add spec).
- action-log-transparency no longer links spec 024 (shipped backend, not the
  progress driver for the at-a-glance UX epic).

New epics (telemetry- and audit-driven replan):
- upgrade-nudge (P0, spec 079): ~60% of active installs run pre-v0.40.
- connect-trust (P0, spec 078): 72.4% skip the connect step.
- telemetry-identity (P1, in_progress): hashed machine_id + CI-filter hardening.
- planning-hygiene (P2): automate the checks this audit did by hand.

Windows QA gate: new first child windows-tray-funnel-qa (downloads→actives
12:1 vs macOS 4:1); windows-tray-window now depends on it.

ROADMAP.md regenerated; gen-roadmap.py --check passes.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants