Skip to content

Make MCP servers and skills personal, not managed - #438

Open
david-siqi-liu wants to merge 1 commit into
mainfrom
david/personal-mcp-skills
Open

Make MCP servers and skills personal, not managed#438
david-siqi-liu wants to merge 1 commit into
mainfrom
david/personal-mcp-skills

Conversation

@david-siqi-liu

@david-siqi-liu david-siqi-liu commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

🥞 Stack (AIGTWY-4342 ucode configure)

Superseded: #437 (folded into #433, so the draft slot arrives together with its first writer).


What did you change, and why?

MCP servers and UC Skills were carried inside the managed config, which meant an admin publishing a
config could silently rewrite a developer's own MCP registrations. Both are per-developer settings,
so they come out of the managed path entirely and stay with the commands that own them, ucode mcp
and ucode skills.

  • Managed manifests no longer carry MCP servers or skills, and the authoring wizard no longer asks
    for them.
  • ucode skills moves out from under ucode configure, since it configures nothing managed.
  • Net effect is about 1200 lines deleted: the managed MCP and skills reconciliation logic plus the
    tests that only existed to cover it.
  • Reviewer focus: the upgrade path in src/ucode/mcp.py that unregisters servers a previous managed
    config had installed and then drops the managed_mcp_servers marker. That is the only part of this
    PR that touches a developer's existing state rather than just deleting code. Two things about it
    are load-bearing. It diffs from the marker list, not from the developer's mcp_servers, because
    the old apply path deliberately kept managed servers out of that list. And it narrows the work to
    agents whose CLI is still on PATH: a marker outlives the agent it names, unregistering shells out
    to that agent's CLI, and this runs on the launch path, so a marker naming a since-uninstalled agent
    would otherwise take down every launch with a FileNotFoundError before the agent the developer
    actually asked for ever starts, markers still in place so the next launch fails the same way.

How do you know it works?

The MCP, skills, wizard, and CLI suites were reworked to the new boundary, including cases for the
upgrade path above: markers naming a mix of installed and uninstalled agents, markers naming only
uninstalled agents, and the skills variant. Each was checked against the unfixed source first and
fails there, so they exercise the launch crash rather than restating current behavior. Full unit
suite green locally at this layer, with one pre-existing exception, test_e2e_user_agent.py's
gateway assertion, which fails identically without this PR's changes applied. The total test count
drops relative to main because the tests for the removed managed MCP and skills path are deleted
with it.

An admin could publish `mcp_servers` and `skills` in the workspace's managed
config, and every launch applied them to each developer's coding tools. That is
the wrong owner: which MCP servers and skills a developer wants is a property of
their machine and their project, not of workspace policy, and a managed launch
silently rewrote registrations they had made themselves.

Move both out of the managed config entirely. The manifest no longer reads,
authors, serializes, or applies them; `ucode setup mcps` and `ucode setup skills`
are gone, and the personal commands move to the top level as `ucode mcp` and
`ucode skills`. A launch calls `migrate_off_managed_mcp_and_skills` once to drop
the registrations a previous managed launch installed, so a developer isn't left
with servers nobody owns.

That migration unregisters what the marker recorded rather than diffing
`mcp_servers`. The old apply path kept managed servers out of `mcp_servers`, so
diffing that list found nothing to undo: the marker was cleared and the developer
told the servers were removed while they stayed registered.

A marker outlives the agent it names, so the migration only targets agents whose
CLI is still installed. Unregistering shells out to that CLI, and a marker naming
an agent the developer has since removed would make every launch die on
`FileNotFoundError` before reaching the agent they actually asked for, with the
markers still in place so the next launch failed the same way.

`publish` keeps `mcp_servers` and `skills` in the update mask so publishing
clears whatever a workspace already has, and it ignores those fields in a config
file exported by an older ucode rather than rejecting the file.

Co-authored-by: Isaac <no-reply@databricks.com>
@david-siqi-liu
david-siqi-liu force-pushed the david/personal-mcp-skills branch from b2e5ea5 to 3ceeae9 Compare September 3, 2026 02:32
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.

1 participant