Unplug MCP
Model Context Protocol server for Unplug — LLM defense layer.
Integrates with Claude Code, Cursor, Windsurf, and any MCP-compatible client.
Installation
pip install unplug-mcp
Optional ML span scanner:
pip install "unplug-mcp[ml]"
Run without a prior install (recommended for MCP clients):
uvx unplug-mcp
See examples/mcp.json for copy-paste client configs.
Usage
Local mode (default)
Add to your MCP client configuration:
Cursor — .cursor/mcp.json or Settings → MCP:
{
"mcpServers": {
"unplug": {
"command": "unplug-mcp",
"args": []
}
}
}
With uvx (no pip install):
{
"mcpServers": {
"unplug": {
"command": "uvx",
"args": ["unplug-mcp"]
}
}
}
Claude Desktop — claude_desktop_config.json:
{
"mcpServers": {
"unplug": {
"command": "unplug-mcp",
"args": []
}
}
}
Hosted server mode
Point at your Unplug API (same wire format as Guard(mode="server")):
{
"mcpServers": {
"unplug": {
"command": "unplug-mcp",
"env": {
"UNPLUG_MODE": "server",
"UNPLUG_SERVER_URL": "https://api.unplug-ai.org/v1",
"UNPLUG_API_KEY": "up_live_xxx"
}
}
}
}
Configuration
| Variable | Default | Purpose |
|---|---|---|
UNPLUG_MODE |
local |
local or server |
UNPLUG_CONFIG |
— | Path to Unplug TOML config |
UNPLUG_SERVER_URL |
— | Hosted API base URL (server mode) |
UNPLUG_API_KEY |
— | API key (server mode) |
UNPLUG_ACTIVE_MODEL |
— | ML model name override |
UNPLUG_MODEL_PATH |
— | Local ML checkpoint path |
Tools
| Tool | Purpose |
|---|---|
scan_text |
Scan text for injection/leakage (default source=retrieved, session-tainting) |
scan_tool_result |
Scan tool output before the agent reads it |
check_destructive |
Gate side-effect tool calls |
wrap_untrusted_content |
Boundary markers + scan for RAG/web content |
session_status |
Session taint state for agent hardening |
notify_taint_source |
Record an untrusted content source in session state |
notify_trusted_user_turn |
Host-only: clear session taint after a real user message |
scan_text source parameter
scan_text defaults to source="retrieved" so scans participate in session taint and
check_destructive can require human review after untrusted input (fail-closed for agent hosts).
source |
Session taint | When to use |
|---|---|---|
retrieved (default) |
Yes | RAG chunks, docs, or any content when provenance is unclear |
user, system |
No (clean session only) | Host-attested direct user or system messages only |
web_fetch, email, file, external, … |
Yes | Mapped to retrieved; prefer wrap_untrusted_content for web/RAG |
Once the session is tainted, later scan_text calls cannot downgrade gates by claiming
source="user". Only the host may clear taint via notify_trusted_user_turn (see below).
Session taint reset (host-only)
notify_trusted_user_turn replaces the old reset_session_taint tool. It requires
confirm_trusted_user_turn=true; without it the session stays tainted (fail-closed).
Threat model: Prompt injection in untrusted content may instruct an agent to call
taint-reset tools. Agents must never call notify_trusted_user_turn after reading
retrieved, web, email, or tool output. MCP hosts (Cursor, Claude Desktop) should:
- Wire
notify_trusted_user_turn(confirm_trusted_user_turn=true)to user-turn hooks (when a new human message arrives), not to agent tool lists. - Omit this tool from configs where the agent can invoke every registered MCP tool.
Naive calls without confirmation leave destructive tools gated at review.
All tools fail closed: scan failures return safe=false and action=block so agents never proceed on errors. session_status and taint helpers conservatively mark the session tainted when they cannot read state.
CI
ci.yml— lint + pytest against PyPIunplug-aipr-scan.yml— regex Guard scan on changed agent/MCP config files (viaUnplugAI/unplug-scan-action@v1)publish-pypi.yml— PyPI release on GitHub Release or manual dispatch
Development
uv sync --extra dev
uv run pytest -q
uv run unplug-mcp
Local SDK path override (monorepo): tool.uv.sources in pyproject.toml.
Distribution
See MARKETPLACE.md for MCP registry listing steps and PUBLISH.md for PyPI release workflow.
Related
- unplug-ai — Python SDK
- unplug-scan-action — GitHub Actions agent scan
- unplug-server — hosted scan API
License
Apache-2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file unplug_mcp-0.1.6.tar.gz.
File metadata
- Download URL: unplug_mcp-0.1.6.tar.gz
- Upload date:
- Size: 135.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c47a404c25deb83b2e8ec94d40bcc5eef10780ca3f53630318bf5124126c061e
|
|
| MD5 |
eb58b94a5bea2caba26562eed22a57ce
|
|
| BLAKE2b-256 |
0a144c5dfadb2c2b5d0de73fce960fc0a4507a3f36493df21938f6268a433c54
|
File details
Details for the file unplug_mcp-0.1.6-py3-none-any.whl.
File metadata
- Download URL: unplug_mcp-0.1.6-py3-none-any.whl
- Upload date:
- Size: 28.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62b34eb46997209a0272c5274b8fe271e7b57771f45ec5e4540e2094eb74fbdd
|
|
| MD5 |
ae947c0f6718a4c4ce68867623bc9857
|
|
| BLAKE2b-256 |
7f186b8b1fdb4d916debb27e792b2188c4e3f72c0cc8f209a1067cef1d1a7196
|