feat: surface registry repository and packages on catalog entries - #5076
Open
daviddanialy wants to merge 2 commits into
Open
feat: surface registry repository and packages on catalog entries#5076daviddanialy wants to merge 2 commits into
daviddanialy wants to merge 2 commits into
Conversation
The registry client parsed only remotes, dropping the linked source repository and the published packages a registry declares for a server. Both now ride on ExternalMCPServerEntry: the repository with its hosting source and monorepo subfolder, and each package with registry type, identifier, version, runtime hint, and artifact digest when one is published. Absence stays meaningful: a registry that links nothing surfaces as absent rather than as empty links, and a package entry too incomplete to identify an artifact is dropped rather than surfaced as an empty declaration. Both fields are registry claims — nothing verifies a remote endpoint runs the linked code — and the API descriptions carry that framing, since these feed the approval evidence surface and the artifact pin-and-fetch work that must not overstate them. The registry cache schema version bumps so previously cached catalog pages, which lack the new fields, are refetched rather than served as if the registry had declared nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
🦋 Changeset detectedLatest commit: 04a0a9b The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Contributor
There was a problem hiding this comment.
cubic analysis
All reported issues were addressed across 18 files
Linked issue analysis
Linked issue: AIS-468: feat: assemble every known signal about an MCP server
| Status | Acceptance criteria | Notes |
|---|---|---|
| ✅ | Parse and expose the registry's `repository` declaration on ExternalMCPServerEntry (as a repository object) | The registry JSON -> types mapping and API schemas now include ExternalMCPRepository and ExternalMCPServerEntry.repository; marshalling/unmarshalling and generated types were added. |
| ✅ | Parse and expose declared `packages` from the registry on ExternalMCPServerEntry | New ExternalMCPPackage type and packages field are added to the server entry schema and types; conversion from registry package JSON is implemented and surfaced. |
| ✅ | Drop package entries that are too incomplete to identify an artifact rather than surfacing empty declarations | Conversion function explicitly skips entries missing required registry_type, identifier, or version; tests assert incomplete entries are dropped. |
| ✅ | Represent absent repository/packages as absent (nil/empty) rather than as empty links | toExternalMCPRepository returns nil when repository is absent or URL empty; packages returns an empty slice when none; tests assert repository is nil and packages empty for the 'bare' case. |
| ✅ | Bump registry cache schema so previously cached listings don't falsely show absence of the new fields | registryCacheSchemaVersion was incremented (v2 -> v3) to ensure old cached entries don't read back as missing the new fields. |
Reply with feedback, questions, or to request a fix.
Fix all with cubic | Re-trigger cubic
A package's declared transport and environment variables are approval signals the ticket names outright — "this server requires you to give it a secret named ADMIN_API_KEY" is exactly what an approver wants in front of them — and the first cut dropped both. Each package now carries its execution transport and every named environment variable with the publisher's secret and required markings; nameless declarations identify nothing and are dropped. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Completes the registry-parsing slice of AIS-468. The registry client parsed only
remotes, silently dropping the linked source repository and published packages a registry declares for a server — the two fields the approval evidence surface and the artifact pin-and-fetch work (AIS-479) both need.What it does
ExternalMCPServerEntrygains two optional fields, parsed from the standard MCP registryserver.jsonshape (verified against the live registry):repository— URL, hosting source, and monorepo subfolder.packages— registry type, identifier, version, runtime hint, and artifact digest when the registry publishes one.Framing
Both are registry declarations: nothing ties a linked repository or package to what a remote endpoint actually runs. The API descriptions say so explicitly, because these feed an approval surface that must not present a repo link as attestation.
Absence stays meaningful: a registry that links nothing surfaces as absent rather than as empty links, and a package entry too incomplete to identify an artifact is dropped rather than surfaced as an empty declaration.
Cache
The registry cache schema version bumps (v2 → v3): previously cached catalog pages lack the new fields, and serving them would read as "the registry declared nothing" for every server until natural expiry.
Not in this PR
The server detail endpoint (
getServerDetails) keeps its current shape — the catalog list is what the approval evidence reads. License is deliberately absent: verified earlier that registry responses carry no license field anywhere; package licenses come from the registry-metadata lookups that already exist in the approval evidence packages.Testing
New list-parse test covering both fields, the incomplete-package drop, and the nothing-linked case; 63 externalmcp tests green.
mise run lint:server,mise run gen:sdk, andpnpm -F dashboard type-checkall pass.AIS-468
🤖 Generated with Claude Code
Summary by cubic
Expose registry-linked source repository and published packages on catalog entries, including package transport and demanded environment variables, so admins see provenance and install/auth requirements. Supports AIS-468’s evidence panel and prepares for artifact pin-and-fetch.
New Features
repositoryandpackagesfrom registryserver.jsononExternalMCPServerEntry.ExternalMCPRepositoryandExternalMCPPackageto API/OpenAPI/SDK, plusExternalMCPPackageEnvironmentVariable.registry_type,identifier,version,runtime_hint,transport_type,file_sha256,registry_base_url, andenvironment_variables(name,is_secret,is_required,description). Nameless variables and incomplete package entries are dropped.Migration
Written for commit 04a0a9b. Summary will update on new commits.