Live-refresh connectors after marketplace reinstall
Nightly Build / build (push) Successful in 6m45s

After a reinstall the catalog entry carries new llm_short_description,
icon and code. Previously the running servers (global + per-user) kept
their old metadata and code until the next login.

- Add refresh_connector_after_reinstall on Skald: re-snapshots the
  description from the catalog, reconciles local files on per-user
  connectors, and restarts both the global and per-user servers
- Add set_description db accessor for mcp_global_servers
- user_row_spec_resolved now injects the live catalog description
  (over the bare name) so user-runtime connectors show the right blurb
- marketplace install() fetches a fresh feed instead of the browse
  cache, so a reinstall reflects the changed manifest immediately
This commit is contained in:
2026-07-22 23:21:03 +01:00
parent aa4f31ec64
commit 42c0eaf2ec
4 changed files with 99 additions and 1 deletions
+11
View File
@@ -669,6 +669,17 @@ pub async fn user_row_spec_resolved(
if let Some(catalog_name) = row.catalog_name.as_deref() {
if let Ok(Some(entry)) = crate::db::mcp_catalog::get_by_name(registry, catalog_name).await {
spec.tool_titles = crate::db::mcp_catalog::parse_tool_titles(entry.tool_meta_json.as_deref());
// The catalog's `description` is the connector's `llm_short_description` —
// the line the model reads when deciding whether to `activate_tools()` on
// this server (see `render_mcp_list`). `user_row_spec` only had the bare
// catalog name to fall back on; inject the real blurb here (this is the
// "the caller injects it if richer" the sync builder defers to), and keep
// the name when the catalog has none. Because it is read from the catalog
// live, a marketplace reinstall that rewrites the description is reflected
// the next time this spec is built.
if let Some(desc) = entry.description {
spec.description = Some(desc);
}
}
}
if let (Some(provider), Some(deliver), Some(refresh)) =