Repository navigation
Conversation
|
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
Contributor
📦 Build ArtifactsWorkflow Run: View Run Available Artifacts
How to DownloadOption 1: GitHub Web UI (easiest)
Option 2: GitHub CLI gh run download 38072457148 --repo smart-mcp-proxy/mcpproxy-go
|
…ded review loads (UX-01)
Deploying mcpproxy-docs with
|
| Latest commit: |
e0982f8
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://317be927.mcpproxy-docs.pages.dev |
| Branch Preview URL: | https://fix-qa070-ux01-create-only-a.mcpproxy-docs.pages.dev |
…ver; complete review-screen refresh mock (UX-01)
…ds; reap removed servers a save resurrected (UX-01)
… keep pending removal when a config only carries the name forward (UX-01)
…hot against the live config (UX-01)
… lock; reap removals a save resurrected before a stale sync (UX-01)
… supervisor actions against the live config (UX-01)
…blication, gate process launch on retirement, purge approvals on config-driven removal (UX-01)
… commit, gate HTTP/SSE requests on retirement, retire review captures, purge prompt approvals (UX-01)
…ic on retirement, hide pending-removal servers from saves and the supervisor, serialize approvals with removal and bind scan approvals to the reviewed server, purge the index when an update quarantines (UX-01)
This was referenced Oct 11, 2026
Closed
Dumbris
added a commit
that referenced
this pull request
Oct 11, 2026
Server add is create-only on every surface: an atomic bbolt create plus a runtime-config check, create and publish under one mutex. Duplicate adds are refused with REST 409, an MCP isError result naming update/patch, CLI exit 1 (--if-not-exists exit 0) and a Web UI error, with no side effects. Concurrent creates of one name yield exactly one success. Delete then re-add of the same name works. Same-name config entries are replaced rather than appended, and import reports rename conflicts and post-add failures. Live-verified on a rebuilt daemon; OpenCode gpt-6.1-sol VERDICT: PASS at 2030ffe. Supersedes #1553; follow-ups #1558-#1564.
Member
Author
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.
Summary
UX-01: adding a server whose name already exists silently replaced it. The MCP
upstream_servers addtool (which the Web UI Manual form calls) had no existence check, so an approved server was re-quarantined, re-argued, itscreatedreset and its connection dropped. REST/CLI only failed in the sequential case, and the check-then-write inServer.AddServerwas racy (40 parallel creates of one name gave up to 33 successes on main).Changes
BoltDB.CreateUpstream/Manager.CreateUpstreamServerdo the existence check and write in one bbolt transaction and returnErrUpstreamExists. The record builder is shared withSaveUpstreamServer, so the two cannot drift.SaveUpstreamServerstays an upsert for update, patch, quarantine and reconcile.Server.createServer, used byServer.AddServer(REST, CLI, registry, import) and by MCPupstream_servers add. Under one mutex it rejects names already in the runtime config or in storage, writes atomically, then publishes to the runtime config copy-on-write. A refused add changes nothing (no config publish, no activity row, no supervisor reconcile).configWithAppendedServernow replaces a same-name entry instead of appending a second one.isErrortool result:server 'X' already exists; use operation 'update' or 'patch' to modify it, or choose another name. It does not echo the existing config.already_exists, and a failed post-add is reported inskipped/failedinstead of being logged and still listed as imported.Compatibility decisions
server '%s' already existsis unchanged: REST 409,cliclient,upstream add --if-not-existsand the registryErrDuplicateNamemapping match on it.addis no longer an idempotent upsert. Callers re-adding a name get an error that namesupdate/patch. Tool schema and description are untouched (frozen goldens unaffected)./api/v1/tools/callalready turns the MCP error result into an error response, so the Manual form shows the message and its existing secret rollback runs.appctx.StorageManagerinterface is not changed.Server.AddServer.Verification
go test -raceon storage, server, httpapi (new tests listed in the commits),golangci-lintv2 with the CI config bare and--build-tags=server: no findings in changed files.bigdaemon (26 servers, large-review approved with 180 tools): duplicate add via REST (409), MCP (isError), CLI (exit 1,--if-not-existsexit 0, add-json exit 1), import (skipped), Web UI Manual form (error banner) all left args, quarantine, created, tool count and connection unchanged. 3x40 parallel REST creates, 12 parallel MCP creates and a mixed REST+MCP race each gave exactly one success. State persisted across a daemon restart.🤖 Generated with Claude Code