Repository navigation
Let a host add curated servers at runtime, never badged official - #178
Conversation
Hosts supply extra curated servers in McpRegistryAuthConfig, merged with the built-in list everywhere it is used today, validated at open, with a runtime entry replacing a built-in of the same name.
The curated first-party servers were a compiled-in const, so adding or correcting one took a tinymcp release and a bump in every host (tinyhumansai#49). Hosts now supply extra entries in McpRegistryAuthConfig::curated_servers (contract 1.31, CuratedServerEntry). For openhuman that is [[mcp_client.registry_auth.curated_servers]] in config.toml, which already reaches the module through the client config, so adding a server is a config edit and a restart. The issue proposed a file the module reads. tinymcp reads no files at runtime and hosts own storage, so the entries travel in the settings instead. The registry dispatcher validates them once when it takes the settings: https with a host and no credentials, non-blank names, no duplicates. A bad entry is dropped with a warning, and the rest load. CuratedCatalog merges them over the built-in list for the local-index merge, the cache fallback and the detail fallback. Runtime entries are never promoted. Only a built-in server nobody replaced is badged official, leads a first page or ranks as curated, because a configuration line must not make an arbitrary endpoint look vetted. An entry naming a built-in replaces its endpoint and takes the badge away, logged at warn with both URLs. Closes tinyhumansai#49
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
Tiny Sweeper reviewVerdict: Incomplete · Priority: none Diagnostics and supporting detailsFull summaryPull request purpose (title): Let a host add curated servers at runtime, never badged official. The pull request adds an optional `McpRegistryAuthConfig::curated_servers` list so a host can supply curated servers at runtime, merged with the compiled-in list, removing the need for a tinymcp release and host version bump to add, correct or remove a curated entry. Runtime entries are listed, searched and described like built-ins but are never badged official, never lead a first search page and never rank as curated; an entry naming a built-in replaces its endpoint and loses the badge. The bus contract takes an additive minor bump to 1.31. No findings were reported by any lane. Unreviewed paths
Partial review reasons
Review snapshot
Completeness: Incomplete What changedtinymcp-bus gains `CuratedServerEntry`, `CuratedEntryTransport` and `CuratedEntryAuth` plus the `curated_servers` field on `McpRegistryAuthConfig` (serde default, omitted when empty, unknown fields refused), re-exported from the crate and documented in the README, with `CONTRACT_VERSION` moved to 1.31. In tinymcp, a new `CuratedCatalog` merges built-ins with validated runtime entries, exposes summary/detail conversion, and centralizes official badging and promotion so only built-ins nobody replaced qualify. Runtime entries are validated once when the registry dispatcher takes the settings (`validated_runtime_entries`), and the merged list is threaded into local-index search, cache fallback, the curated lead on first pages, curated-first ranking and the detail fallback. `docs/specs/runtime-curated-servers.md` records the behaviour and contract. The latest-push delta is unavailable: the review state has the prior reviewed head and rendered evidence, but no trusted base-to-head diff comparison between `3a0898e7a26aab0ba2059289778b49827640a967` and `1f72f34835f1a033f7846999d439ad307bcdde17`. Features
Tests
FindingsNo active actionable findings. Before merge
Agent review detailscritique
security
tests
commits
description
Evidence and run details
|
# Conflicts: # crates/tinymcp-bus/README.md # crates/tinymcp-bus/src/version/mod.rs # crates/tinymcp-bus/src/version/mod_tests.rs # crates/tinymcp/src/registry/sources/official/mod.rs # crates/tinymcp/src/registry/sources/official/mod_tests.rs
# Conflicts: # crates/tinymcp/src/registry/sources/types.rs
Summary
The curated first-party servers were a compiled-in
const. Adding, correcting or removing one took a tinymcp release and a version bump in every host (#49).A host can now supply extra curated servers at runtime in
McpRegistryAuthConfig.curated_servers. They're merged with the built-in list for the local-index merge, the cache fallback and the detail fallback.Why not the file the issue proposed: tinymcp reads no files at runtime, and hosts own storage, so the entries travel in the registry settings the host already sends. For OpenHuman that's
[[mcp_client.registry_auth.curated_servers]]inconfig.toml. That already deserializes into this type and reaches the module through the client config, so adding a server is still a file edit and a restart, with no OpenHuman code change.Runtime entries are never promoted. Only a built-in server nobody replaced is badged official, leads a first search page or ranks as curated. A configuration line must not be able to make an arbitrary endpoint look vetted. An entry naming a built-in replaces its endpoint (so a moved endpoint can be fixed without a release) and takes its badge away. That's logged at warn with both URLs.
Related issue
Closes #49. Spec:
docs/specs/runtime-curated-servers.md.API or behavior changes
Contract minor bump: tinymcp-bus → 1.31. It lands after #164 (1.29) and the OAuth endpoint guard (1.30). A host built on this bus requires a module at 1.31.
McpRegistryAuthConfig.curated_servers: Vec<CuratedServerEntry>(serde default, omitted when empty). New typesCuratedServerEntry(unknown fields refused),CuratedEntryTransportandCuratedEntryAuth.httpswith a host and no credentials (remote and icon), non-blank names, no duplicates. A bad entry is dropped with a warning; the rest load.CuratedCatalog,entry_summary,entry_detail,validated_runtime_entriesandCuratedServer::to_entry.OFFICIAL_SERVERS,CURATED_SERVERSandtag_officialkeep their built-in-only meaning; no host reads them today.Validation
On our Linux CI runner, at 838cd11:
cargo fmt --all -- --check: clean.cargo clippy --all-targets --all-features -- -D warnings: 0 errors, same as main.cargo buildandRUSTDOCFLAGS="-D warnings" cargo doc: ok.-p tinymcp-bus config(10 passed) andversion(7);-p tinymcp registry::curation(34);registry::sources::official(151).cargo test --workspace --no-fail-fast, against main in a separate build: no failures unique to this branch. Two timeouts showed on this side only (registry::boot,tinybus_module::directories); both are known full-suite flakes and passed 3 of 3 isolated reruns on both sides.a_runtime_entry_is_listed_but_never_badged_or_promotedfails;http:validation_drops_each_bad_entry_and_keeps_the_restfails;a_runtime_curated_server_does_not_lead_a_pagefails, withio.zebra/mcpleading the page.Merge note: #173 also changes
lead_with_curated. Whichever lands second needs a small rebase there.Tests
http, credentials, missing hosts, bad icons, blank names and duplicates, and keeps the rest;httpfails the validation test.Documentation
The spec, the tinymcp-bus README's contract note, and rustdoc.
Checklist
#[allow(...)],#[ignore], or relaxed lints.envcontents in the diff or the description