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
Copy link
Copy Markdown
Member

@Dumbris Dumbris commented Jun 2, 2026

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
Copy link
Copy Markdown

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

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
Copy link
Copy Markdown

codecov-commenter commented Jun 2, 2026

⚠️ 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
Copy link
Copy Markdown

github-actions Bot commented Jun 2, 2026

📦 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>
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