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
* feat(registries): MCP-866 trust/provenance model foundation (config + merge)
Foundation layer for user-added registries. CLI add-source, server-add-time
stamping/enforcement, REST/MCP surface, and docs follow in subsequent commits.
- Add registry provenance trust tags (official/trusted vs custom/unverified) to
both config and registries RegistryEntry, with IsTrusted() helpers.
- DefaultRegistries are tagged official/trusted.
- SetRegistriesFromConfig recomputes provenance AUTHORITATIVELY by ID: a
shipped-default ID is always official; anything user-added is
custom/unverified — a user cannot self-assert trust via config.
- ServerConfig gains SourceRegistryID + SourceRegistryProvenance so a server's
origin is recorded for the approval/quarantine view.
- Config validation rejects skip_quarantine for servers sourced from a
custom/unverified registry (quarantine-always; no user allowlist).
- RegistriesLocked enterprise stub knob (doc + add-source rejection only).
- Tests: provenance JSON round-trip, authoritative merge recompute (incl.
rejecting self-asserted trust), skip_quarantine rejection/allowance. config +
registries suites green with -race; golangci-lint 0 issues.
Refs MCP-866.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
* feat(registries): add-source CLI + REST/MCP surface + quarantine enforcement (MCP-866)
Builds on the provenance foundation to let users add their own MCP registry
sources, always tagged custom/unverified so their servers can never escape
quarantine. There is no allowlist a user can add themselves into.
- `mcpproxy registry add-source <https-url> [--protocol|--id|--name]`: daemon-first
CLI that adds a generic modelcontextprotocol/registry v0.1 endpoint. Writes
cfg.Registries copy-on-write via UpdateConfig + persists, and rebuilds the
effective catalog so the source is immediately searchable.
- Server keystone (add_from_registry): stamp SourceRegistryID/Provenance onto the
derived ServerConfig from the resolved registry; a custom/unverified source
forces Quarantined=true and SkipQuarantine=false regardless of the global
default (CN-002 extended).
- New add-source op (add_registry_source.go): pure URL→entry derivation (https
validation, id-from-host slug, v0.1 servers-url derivation) + guardrails
(registries_locked, no shadowing a built-in id, no duplicate). Stable
cross-surface error codes: invalid_registry_url / registries_locked /
registry_shadows_builtin / duplicate_registry.
- REST POST /api/v1/registries; cliclient.AddRegistrySource; provenance + trusted
surfaced in list_registries across runtime REST + MCP so a UI can show the
one-time third-party-registry warning.
- Docs: docs/registries.md trust model + add-source + registries_locked stub.
- OpenAPI regenerated.
TDD: add-source derivation/validation unit tests, custom-origin quarantine-always
keystone tests, and a registries integration test proving a user-added v0.1
endpoint is searchable AND tagged custom/unverified. Local: go build ./...,
config/registries/server/httpapi/cliclient/contracts/cmd suites green (-race on
the pure-logic packages), binary API + MCP e2e green, golangci-lint 0 issues,
approval-hash stability canary green.
Related MCP-866
Co-Authored-By: Paperclip <noreply@paperclip.ing>
* fix(storage): persist registry origin/provenance on UpstreamRecord (MCP-866)
CI caught the new ServerConfig fields tripping the storage field-coverage
canary (TestSaveServerSyncFieldCoverage) — they were unpersisted. Persist them
so a server's registry origin survives a restart; otherwise a reloaded
custom-origin server would lose its provenance and the skip_quarantine guard
plus the approval/quarantine view would silently stop working.
- Add SourceRegistryID + SourceRegistryProvenance to UpstreamRecord.
- Carry them through every config<->record conversion (async saveServerSync,
Manager.SaveUpstreamServer, GetUpstreamServer, ListUpstreamServers,
ListQuarantinedUpstreamServers).
- Extend the field-coverage canary's expectedFields; add a save->reload
round-trip test (incl. via the quarantine listing).
Fixes the Unit Tests / E2E / Build Binaries CI failures on #573 (all ran
go test ./... and hit the same storage canary). storage suite green with -race;
go build ./... clean; gofmt clean.
Related MCP-866
Co-Authored-By: Paperclip <noreply@paperclip.ing>
* fix(api): surface registry provenance + trusted in GET /api/v1/registries (MCP-866)
Add Provenance and Trusted fields to contracts.Registry so the REST API
surfaces the trust tag for each registry. Copy from the internal registry
entry in handleListRegistries.
Provenance is derived authoritatively at merge time (MCP-866):
- Built-in defaults get provenance=official/trusted, trusted=true
- User-added registries get provenance=custom/unverified, trusted=false
Regenerated swagger.yaml. Test asserts a custom registry shows
provenance=custom/unverified and trusted=false.
Related #573
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>
EnabledTools []string`json:"enabled_tools,omitempty" mapstructure:"enabled_tools"`// Allowlist: only these tools are exposed; mutually exclusive with disabled_tools
253
260
DisabledTools []string`json:"disabled_tools,omitempty" mapstructure:"disabled_tools"`// Denylist: these tools are hidden; mutually exclusive with enabled_tools
261
+
262
+
// SourceRegistryID records which registry this server was added from (empty
263
+
// for manually-configured servers). MCP-866: surfaced in the approval /
264
+
// quarantine view so a reviewer can see a server's origin.
0 commit comments