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
{{ message }}
Repository navigation
Commit 472314b
Browse filesBrowse the repository at this point in the historyBrowse files
Completes the prompt-aggregation feature at the MCP/REST level for release.
- Rug-pull approve surface (spec 100 FR-7): quarantine_security gains
inspect_prompts, approve_prompt, approve_all_prompts operations, delegating to
the ApprovePrompt/ApproveAllPrompts mutators. A held (pending/changed) prompt
is now approvable by an agent/operator via any MCP client instead of only
programmatically or by flipping the server to trust:auto.
- F9: the upstream_servers MCP tool gains the expose_prompts arg (add/patch), so
the per-server prompt-aggregation override is reachable from the tool, not just
the REST PATCH shipped in #1006.
- Regenerated the three frozen tool-surface goldens for both schema additions
(merge-base via the write-goldens env hook; pre099 via byte-preserving splice;
prefeature via map update).
- Docs: security-quarantine.md documents the prompt rug-pull baseline and the new
quarantine_security prompt operations.
Tests: quarantine_security prompt op handlers (inspect/approve/approve-all +
missing-arg error) and the F9 patch-builder expose_prompts mapping.
Fast-follow (Web UI): a per-server expose_prompts toggle and a rug-pull "N
prompts need approval" banner in ServerDetail.vue (the latter needs REST twins).
The feature is complete via MCP + REST; the operator UI is polish.
Claude-Session: https://claude.ai/code/session_01H7J8Yv5zr4tMQZaY3ot3Za
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/features/security-quarantine.md
+18Lines changed: 18 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -152,6 +152,24 @@ built-in `tpa-descriptions` scanner. Its findings appear in the scan report
152
152
`threat_level`, `confidence`, and the contributing check `signals`. See
153
153
[Tool Scanner](/features/tool-scanner) for the full rule reference.
154
154
155
+
## Prompt rug-pull baseline (spec 100)
156
+
157
+
When upstream **prompt aggregation** is enabled (`aggregate_upstream_prompts: true`, off by default), mcpproxy keeps a per-prompt approval baseline that mirrors the tool rug-pull machinery. A trusted server that ships a benign prompt and later mutates its **advertised metadata** (name, description, or argument descriptions) has that changed prompt **withheld from `prompts/list`** until it is approved — closing the gap where a subtler injection that passes the poison scanner could still slip in via a later edit.
158
+
159
+
-**Scope — metadata only.** The baseline hashes the prompt's advertised metadata, not its `prompts/get` message content (which is materialised fresh per call and has no list-time artifact to baseline). Content is defended separately by output sanitisation and size caps. This is an inherent limit, not a shortcut.
160
+
-**Enforcement is by withholding.** A held prompt is simply not registered, so it is absent from `prompts/list` and `prompts/get` on it fails natively. There is no separate runtime gate.
161
+
-**Trust parity.** A server with `trust_mode: auto` (or `auto_approve_tool_changes: true`) auto-approves its prompt changes; `manual` holds them. Disabling quarantine globally (`quarantine_enabled: false`) auto-approves.
162
+
163
+
Manage held prompts with the `quarantine_security` MCP tool:
164
+
165
+
```jsonc
166
+
// see what is held (all servers, or one via "name")
mcp.Description("Per-server trust tier governing new-server admission AND tool-change approval (spec 086): 'auto' = approve without scanning; 'scan' = auto-approve only when the fast offline TPA scan is green, else hold for review; 'manual' = human reviews every change. Empty → manual (secure default). Used with add/update/patch."),
1153
1153
mcp.Enum("auto", "scan", "manual"),
1154
1154
),
1155
+
mcp.WithBoolean("expose_prompts",
1156
+
mcp.Description("Per-server prompt-aggregation override (F9): true = include this server's MCP prompts in mcpproxy's aggregated prompts/list; false = exclude them regardless of capability. Omit to leave unchanged (patch) / inherit the default (aggregate if advertised). Only meaningful when aggregate_upstream_prompts is enabled globally. Used with add/update/patch."),
mcp.Description("Security operation: list_quarantined, inspect_quarantined, quarantine_server, inspect_tools, approve_tool, approve_all_tools, block_tool, block_all_tools, enable_tool, disable_tool. 'block_tool'/'block_all_tools' atomically approve AND disable a tool (acknowledge it but keep it hidden) — all-or-nothing so a tool is never left approved+enabled."),
mcp.Description("Security operation: list_quarantined, inspect_quarantined, quarantine_server, inspect_tools, approve_tool, approve_all_tools, block_tool, block_all_tools, enable_tool, disable_tool, inspect_prompts, approve_prompt, approve_all_prompts. 'block_tool'/'block_all_tools' atomically approve AND disable a tool (acknowledge it but keep it hidden) — all-or-nothing so a tool is never left approved+enabled. The prompt operations (spec 100) manage aggregated upstream prompts held by the metadata rug-pull baseline: a prompt whose advertised metadata changed since approval is withheld from prompts/list until approved."),
0 commit comments