Skip to main content
Glama

Release Build Go Report Card Go Reference License: MIT GitHub stars OpenSSF Scorecard

The demo above shows the embedded web UI. The MCPProxy core is a single binary for macOS, Linux, and Windows — the web UI ships inside it, with no extra service to run. On macOS, an optional menu‑bar app adds one‑click convenience (start/stop, server health, quarantine, logs).

Why MCPProxy?

  • Scale beyond API limits – Federate hundreds of MCP servers while bypassing Cursor's 40-tool limit and OpenAI's 128-function cap.

  • Save tokens & accelerate responses – Agents load just one retrieve_tools function instead of hundreds of schemas. Research shows ~99 % token reduction with 43 % accuracy improvement.

  • Advanced security protection – Automatic quarantine blocks Tool Poisoning Attacks until you manually approve new servers.

  • Pluggable security scanners – Run Snyk, Semgrep, Trivy, Cisco, and other Docker-based scanners against quarantined servers before you approve them; findings are normalized to SARIF with a composite risk score. See Security scanner plugins.

  • Works offline & cross-platform – A single core binary for macOS (Intel & Apple Silicon), Windows (x64 & ARM64), and Linux (x64 & ARM64), with the web UI embedded. macOS additionally ships an optional menu-bar app.


Related MCP server: proxy-mcp

Quick Start

1. Install

macOS (Recommended - DMG Installer):

Download the latest DMG installer for your architecture:

  • Apple Silicon (M1/M2): Download DMGmcpproxy-*-darwin-arm64.dmg

  • Intel Mac: Download DMGmcpproxy-*-darwin-amd64.dmg

Windows (Recommended - Installer):

Download the latest Windows installer for your architecture:

The installer automatically:

  • Installs both mcpproxy.exe (core server) and mcpproxy-tray.exe (system tray app) to Program Files

  • Adds MCPProxy to your system PATH for command-line access

  • Creates Start Menu shortcuts

  • Supports silent installation: .\mcpproxy-setup.exe /VERYSILENT

Alternative install methods:

macOS (Homebrew):

# macOS — GUI tray app (recommended):
brew install --cask smart-mcp-proxy/mcpproxy/mcpproxy

# macOS / Linux — headless CLI only:
brew install smart-mcp-proxy/mcpproxy/mcpproxy

The cask installs the menu-bar app (bundles the CLI); the formula is the CLI binary only. Both update via brew upgrade.

Linux (Debian/Ubuntu) — apt repository, auto-updates via apt upgrade:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://apt.mcpproxy.app/mcpproxy.gpg \
  | sudo tee /etc/apt/keyrings/mcpproxy.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/mcpproxy.gpg] https://apt.mcpproxy.app stable main" \
  | sudo tee /etc/apt/sources.list.d/mcpproxy.list > /dev/null
sudo apt update && sudo apt install mcpproxy

Linux (Fedora / RHEL / Rocky / AlmaLinux) — dnf repository, auto-updates via dnf upgrade:

sudo dnf config-manager --add-repo https://rpm.mcpproxy.app/mcpproxy.repo
# Fedora 41+ (dnf5): sudo curl -fsSL https://rpm.mcpproxy.app/mcpproxy.repo -o /etc/yum.repos.d/mcpproxy.repo
sudo dnf install -y mcpproxy

Arch Linux (AUR): mcpproxy-bin

yay -S mcpproxy-bin
# or
git clone https://aur.archlinux.org/mcpproxy-bin.git && cd mcpproxy-bin && makepkg -si

The apt and dnf packages ship a hardened systemd unit and start the service automatically. Repository signing key fingerprint: 3B6F A1AD 5D53 59DA 51F1 8DDC E1B5 9B9B A1CB 8A3B.

For one-off .deb / .rpm downloads (air-gapped installs), grab them from the latest release.

Manual download (all platforms):

Prerelease Builds (Latest Features):

Want to try the newest features? Download prerelease builds from the next branch:

  1. Go to GitHub Actions

  2. Click the latest successful "Prerelease" workflow run

  3. Download from Artifacts:

    • dmg-darwin-arm64 (Apple Silicon Macs)

    • dmg-darwin-amd64 (Intel Macs)

    • versioned-linux-amd64, versioned-windows-amd64 (other platforms)

Note: Prerelease builds are signed and notarized for macOS but contain cutting-edge features that may be unstable.

Anywhere with Go 1.25+:

go install github.com/smart-mcp-proxy/mcpproxy-go/cmd/mcpproxy@latest

2. Run

mcpproxy serve          # starts HTTP server on :8080 and shows tray

3. Add your first server

Create or edit ~/.mcpproxy/mcp_config.json:

{
  "listen": "127.0.0.1:8080",
  "mcpServers": [
    { "name": "local-python", "command": "python", "args": ["-m", "my_server"], "protocol": "stdio", "enabled": true },
    { "name": "remote-http", "url": "http://localhost:3001", "protocol": "http", "enabled": true }
  ]
}

See Configuration and Upstream Servers for the full reference.

4. Connect to your IDE/AI tool

📖 Complete Setup Guide - Detailed instructions for Cursor, VS Code, Claude Desktop, and Goose

Add proxy to Cursor

One-click install into Cursor IDE

Install in Cursor IDE

Manual install

  1. Open Cursor Settings

  2. Click "Tools & Integrations"

  3. Add MCP server

    "MCPProxy": {
      "type": "http",
      "url": "http://localhost:8080/mcp/"
    }

How AI Agents Work Through MCPProxy

Once connected, your agent sees a handful of built-in MCPProxy tools instead of hundreds of upstream schemas. A typical session has three beats — discover, call, audit — plus an optional preflight gate for unattended automations.

1. Discover — spend one query, not your context window

The agent asks for what it needs in plain keywords via retrieve_tools:

{ "query": "create github issue", "limit": 5 }

MCPProxy runs a BM25 search across every connected server and returns only the top-ranked matches — each with a call_with hint recommending the right call variant for its annotations:

{
  "tools": [
    { "name": "github:create_issue", "score": 0.89, "call_with": "call_tool_write" },
    { "name": "gitlab:create_issue", "score": 0.72, "call_with": "call_tool_write" }
  ]
}

This is where the token savings come from: the schemas of the hundreds of tools the agent didn't need never enter its context. The agent loads full schemas on demand with describe_tool (batch up to 5 ids) only for the tools it's about to use.

2. Call — with declared intent

The agent executes the tool through the variant matching its intent (call_tool_read, call_tool_write, or call_tool_destructive), addressing it as server:tool:

{
  "name": "github:create_issue",
  "args_json": "{\"repo\": \"acme/api\", \"title\": \"Bug report\"}",
  "intent": { "operation_type": "write", "reason": "Filing bug per user request" }
}

MCPProxy validates the intent against the tool's annotations (a "read" call can't reach a destructive tool), checks quarantine and approval state, and scans arguments and responses for sensitive data before anything leaves the machine.

3. Audit — every call is on the record

Every call lands in the local Activity Log with a request ID, so you can reconstruct exactly what an agent did:

mcpproxy activity list                          # everything, newest first
mcpproxy activity list --request-id <id>        # one workflow, correlated

Gate automations before they burn tokens

For recurring headless jobs (cron, CI, n8n), don't let the agent discover a missing tool the expensive way. One preflight command checks that every required tool is ready — without contacting any upstream server — and reports exactly why when it isn't (server quarantined, tool changed since approval, OAuth expired, typo'd id):

mcpproxy tools preflight gh-ops:sync_issues slack:post_message --wait 10s
case $? in
  0)  run-agent-session ;;   # all ready — go
  10) exit 75 ;;             # transient (server starting) — let the next cron tick retry
  11) page-operator ;;       # blocked — someone must approve / enable / log in
  12) fail-pipeline ;;       # unknown tool id — the automation itself is misconfigured
esac

See Required-Tools Preflight for the full reason taxonomy, REST endpoint, and GitHub Actions / n8n recipes.


🔐 Optional HTTPS Setup

MCPProxy works with HTTP by default for easy setup. HTTPS is optional and primarily useful for production environments or when stricter security is required.

💡 Note: Most users can stick with HTTP (the default) as it works perfectly with all supported clients including Claude Desktop, Cursor, and VS Code.

Quick HTTPS Setup

1. Enable HTTPS (choose one method):

# Method 1: Environment variable
export MCPPROXY_TLS_ENABLED=true
mcpproxy serve

# Method 2: Config file
# Edit ~/.mcpproxy/mcp_config.json and set "tls.enabled": true

2. Trust the certificate (one-time setup):

mcpproxy trust-cert

3. Use HTTPS URLs:

  • MCP endpoint: https://localhost:8080/mcp

  • Web UI: https://localhost:8080/ui/

Claude Desktop Integration

For Claude Desktop, add this to your claude_desktop_config.json:

HTTP (Default - Recommended):

{
  "mcpServers": {
    "mcpproxy": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "http://localhost:8080/mcp"
      ]
    }
  }
}

HTTPS (With Certificate Trust):

{
  "mcpServers": {
    "mcpproxy": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://localhost:8080/mcp"
      ],
      "env": {
        "NODE_EXTRA_CA_CERTS": "~/.mcpproxy/certs/ca.pem"
      }
    }
  }
}

Certificate Management

  • Automatic generation: Certificates created on first HTTPS startup

  • Multi-domain support: Works with localhost, 127.0.0.1, ::1

  • Trust installation: Use mcpproxy trust-cert to add to system keychain

  • Certificate location: ~/.mcpproxy/certs/ (ca.pem, server.pem, server-key.pem)

Troubleshooting HTTPS

Certificate trust issues:

# Re-trust certificate
mcpproxy trust-cert --force

# Check certificate location
ls ~/.mcpproxy/certs/

# Test HTTPS connection
curl -k https://localhost:8080/api/v1/status

Claude Desktop connection issues:

  • Ensure NODE_EXTRA_CA_CERTS points to the correct ca.pem file

  • Restart Claude Desktop after config changes

  • Verify HTTPS is enabled: mcpproxy serve --log-level=debug


Documentation

Getting Started

Configuration

Features

CLI Reference

API


Contributing

We welcome issues, feature ideas, and PRs!

Development Setup

make dev-setup                # Install swag, frontend deps, Playwright
brew install prek             # Install pre-commit hook runner (or: uv tool install prek)
prek install                  # Install pre-commit hooks
prek install --hook-type pre-push  # Install pre-push hooks

Pre-commit Hooks

We use prek to catch issues before they reach CI:

Hook

Stage

What it does

gofmt

pre-commit

Auto-formats staged Go files

trailing-whitespace

pre-commit

Removes trailing whitespace

end-of-file-fixer

pre-commit

Ensures files end with newline

check-merge-conflict

pre-commit

Detects merge conflict markers

swagger-verify

pre-push

Fails if OpenAPI spec is out of date

go-build

pre-push

Verifies the project compiles

Run hooks manually: prek run --all-files

Build & Test

make build          # Build frontend + backend
make swagger        # Regenerate OpenAPI spec
make test           # Unit tests
make test-e2e       # E2E tests
make lint           # Run linters

Available Tools

9 tools
call_tool_destructiveA
Destructive

Execute a DESTRUCTIVE tool. WORKFLOW: 1) Call retrieve_tools first to find tools, 2) Use the exact 'name' field from results. DECISION RULE: Use this when the tool name contains: delete, remove, drop, revoke, disable, destroy, purge, reset, clear, unsubscribe, cancel, terminate, close, archive, ban, block, disconnect, kill, wipe, truncate, force, hard. Examples: delete_repo, remove_user, drop_table, revoke_access, clear_cache, terminate_session. Use for irreversible or high-impact operations.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments to pass to the upstream tool as a native JSON object. Refer to the tool's inputSchema from retrieve_tools for required parameters. Example: {"path": "src/index.ts", "limit": 20}. This is the preferred parameter — it eliminates JSON escaping overhead. Use 'args_json' only if your client cannot produce nested JSON objects.
nameYesTool name in format 'server:tool' (e.g., 'github:delete_repo'). CRITICAL: You MUST use exact names from retrieve_tools results - do NOT guess or invent server names. Unknown servers will fail.
args_jsonNoLegacy: arguments as a pre-serialized JSON string. Prefer the 'args' parameter instead — it accepts a native JSON object and eliminates escaping overhead. If both are provided, 'args_json' wins for backward compatibility.
intent_reasonNoWhy is this deletion needed? Provide justification like 'User confirmed cleanup' or 'Removing obsolete data'.
intent_data_sensitivityNoClassify data being deleted: public, internal, private, or unknown. Important for tracking destructive operations on sensitive data.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true; description adds context that operations are irreversible/high-impact and emphasizes using exact names from retrieve_tools. No contradiction, but doesn't detail further behavioral traits like auth needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief (3 sentences), front-loaded, and uses clear structure with numbered steps and a keyword list. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers workflow, decision rule, and required parameter. Missing some context like conflict resolution between args and args_json, but schema handles that. Adequate for a meta-tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage with detailed descriptions for all 5 parameters. The description adds no additional parameter information beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it executes a destructive tool and provides a decision rule listing keywords for when to use, with examples. It distinguishes from siblings like call_tool_read and call_tool_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a workflow (call retrieve_tools first) and a decision rule based on tool name keywords, explicitly guiding when to use this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

call_tool_readA
Read-onlyDestructive

Execute a READ-ONLY tool. WORKFLOW: 1) Call retrieve_tools first to find tools, 2) Use the exact 'name' field from results. DECISION RULE: Use this when the tool name contains: search, query, list, get, fetch, find, check, view, read, show, describe, lookup, retrieve, browse, explore, discover, scan, inspect, analyze, examine, validate, verify. Examples: search_files, get_user, list_repositories, query_database, find_issues, check_status. This is the DEFAULT choice when unsure - most tools are read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments to pass to the upstream tool as a native JSON object. Refer to the tool's inputSchema from retrieve_tools for required parameters. Example: {"path": "src/index.ts", "limit": 20}. This is the preferred parameter — it eliminates JSON escaping overhead. Use 'args_json' only if your client cannot produce nested JSON objects.
nameYesTool name in format 'server:tool' (e.g., 'github:get_user'). CRITICAL: You MUST use exact names from retrieve_tools results - do NOT guess or invent server names. Unknown servers will fail.
args_jsonNoLegacy: arguments as a pre-serialized JSON string. Prefer the 'args' parameter instead — it accepts a native JSON object and eliminates escaping overhead. If both are provided, 'args_json' wins for backward compatibility.
intent_reasonNoWhy is this tool being called? Provide context like 'User asked to check status' or 'Gathering data for report'.
intent_data_sensitivityNoClassify data being accessed: public, internal, private, or unknown. Helps track sensitive data access patterns.

TDQS

A3.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description claims the tool is read-only ('READ-ONLY tool'), but the annotations set destructiveHint=true, indicating potential destructive behavior. This is a clear contradiction. The description does not address or reconcile this inconsistency, nor does it disclose other behavioral traits like authorization needs or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a clear workflow and decision rule, front-loading the purpose. However, it is somewhat lengthy due to the list of keywords and examples. It could be slightly more concise, but the structure is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (5 parameters, no output schema, contradictory annotations), the description covers usage context well but fails to address the annotation contradiction or describe return values. It provides examples and decision rules but is incomplete in behavioral transparency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add any additional meaning beyond what the schema provides. The parameters are fully described in the input schema itself, so the description adds no extra value for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Execute a READ-ONLY tool' and provides a specific verb ('execute') and resource ('tool'). It distinguishes from siblings by specifying it's for tools whose names match read-related patterns like search, get, list, etc. The default choice statement further clarifies its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidelines: a workflow (call retrieve_tools first, use exact name), a decision rule with a comprehensive list of name patterns, examples, and a default choice instruction. It implicitly excludes destructive/write tools without naming them directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

call_tool_writeA

Execute a STATE-MODIFYING tool. WORKFLOW: 1) Call retrieve_tools first to find tools, 2) Use the exact 'name' field from results. DECISION RULE: Use this when the tool name contains: create, update, modify, add, set, send, edit, change, write, post, put, patch, insert, upload, submit, assign, configure, enable, register, subscribe, publish, move, copy, rename, merge. Examples: create_issue, update_file, send_message, add_comment, set_status, edit_page. Use only when explicitly modifying state.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments to pass to the upstream tool as a native JSON object. Refer to the tool's inputSchema from retrieve_tools for required parameters. Example: {"path": "src/index.ts", "limit": 20}. This is the preferred parameter — it eliminates JSON escaping overhead. Use 'args_json' only if your client cannot produce nested JSON objects.
nameYesTool name in format 'server:tool' (e.g., 'github:create_issue'). CRITICAL: You MUST use exact names from retrieve_tools results - do NOT guess or invent server names. Unknown servers will fail.
args_jsonNoLegacy: arguments as a pre-serialized JSON string. Prefer the 'args' parameter instead — it accepts a native JSON object and eliminates escaping overhead. If both are provided, 'args_json' wins for backward compatibility.
intent_reasonNoWhy is this modification needed? Provide context like 'User requested update' or 'Fixing reported issue'.
intent_data_sensitivityNoClassify data being modified: public, internal, private, or unknown. Helps track sensitive data changes.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, and the description adds that this is a state-modifying caller. It explains the meta-calling nature but does not detail error handling or failure modes, which would further enhance transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a workflow, decision rule, and examples. It is slightly verbose but efficient in conveying necessary information. Could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity as a meta-caller, the description covers workflow, parameter usage, and decision logic. However, it omits what the tool returns (varies by upstream tool) and potential error scenarios, which would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds extra guidance: preferring 'args' over 'args_json', the 'server:tool' format for 'name', and rationale for intent parameters. This goes beyond the schema's baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Execute a STATE-MODIFYING tool', specifies a decision rule based on tool name verbs, and uses examples. This differentiates it from sibling tools like call_tool_destructive and call_tool_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a workflow (retrieve_tools first, use exact name), a decision rule listing verb triggers, and cautions against guessing server names. This fully guides the agent on when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_registriesA
Read-onlyDestructive

📋 List all available MCP registries. Use this FIRST to discover which registries you can search with the 'search_servers' tool. Each registry contains different collections of MCP servers that can be added as upstreams.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description adds that it lists registries. However, the destructiveHint=true in annotations contradicts the non-destructive nature of listing, which is not addressed in the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with an emoji, front-loaded with purpose, no superfluous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with no output schema, the description fully explains its purpose and usage context relative to other tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, and schema coverage is 100%. The description does not need to add parameter info; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes a specific verb ('list') and resource ('available MCP registries'), and distinguishes itself from sibling 'search_servers' by recommending its prior use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Use this FIRST' and explains its relationship with 'search_servers', but does not provide when-not-to-use guidance for other siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

quarantine_securityB
Destructive

Security quarantine management for MCP servers and tools. Review and manage quarantined servers and tools to prevent Tool Poisoning Attacks (TPAs). Supports server-level quarantine and tool-level approval for individual tool description/schema changes. NOTE: Unquarantining servers is only available through manual config editing or system tray UI for security.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoServer name (required for inspect_quarantined, quarantine_server, inspect_tools, approve_tool, approve_all_tools)
operationYesSecurity operation: list_quarantined, inspect_quarantined, quarantine_server, inspect_tools, approve_tool, approve_all_tools
tool_nameNoTool name (required for approve_tool operation)

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, and description mentions quarantining/approving as destructive actions. The NOTE adds transparency about unquarantining limitations. However, details on side effects of each operation are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: two sentences plus a note, front-loaded with purpose. Every sentence adds necessary context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers overall purpose but lacks per-operation details (e.g., return values, what each operation does). With no output schema, more specific descriptions for each operation would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. Description enumerates operations but adds no additional semantic depth beyond the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool manages quarantine of MCP servers and tools to prevent TPAs, with specific operations listed. It distinguishes from siblings like call_tool_*, but does not explicitly contrast with all alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like call_tool_read or retrieve_tools. The NOTE on unquarantining is a constraint but does not help choose among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_cacheA
Read-onlyDestructive

Retrieve paginated data when mcpproxy indicates a tool response was truncated. Use the cache key provided in truncation messages to access the complete dataset with pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesCache key provided by mcpproxy when a response was truncated (e.g. 'Use read_cache tool: key="abc123def..."')
limitNoMaximum number of records to return per page (default: 50, max: 1000)
offsetNoStarting record offset for pagination (default: 0)

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description describes a read-only retrieval operation, but annotations declare destructiveHint=true, creating a contradiction. Beyond this, the description does not add detail about pagination behavior or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and usage, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic trigger and parameter source, but lacks information about return format (no output schema) and does not resolve the contradiction between read-only description and destructive annotation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description adds only marginal context (e.g., where to find the key). The description does not explain limit/offset beyond their defaults and max.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves paginated data when a response is truncated, using a cache key. It distinguishes from unrelated siblings by specifying a unique trigger condition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use the tool (after truncation) and how to obtain the cache key, but does not mention alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retrieve_toolsA
Read-onlyDestructive

🔍 CALL THIS FIRST to discover relevant tools! This is the primary tool discovery mechanism that searches across ALL upstream MCP servers using intelligent BM25 full-text search. Always use this before attempting to call any specific tools. Use natural language to describe what you want to accomplish (e.g., 'create GitHub repository', 'query database', 'weather forecast'). Results include 'annotations' (tool behavior hints like destructiveHint) and 'call_with' recommendation indicating which tool variant to use (call_tool_read/write/destructive). Then use the recommended variant with an 'intent' parameter. NOTE: Quarantined servers are excluded from search results for security. Use 'quarantine_security' tool to examine and manage quarantined servers. TO ADD NEW SERVERS: Use 'list_registries' then 'search_servers' to find and add new MCP servers.

ParametersJSON Schema
NameRequiredDescriptionDefault
debugNoEnable debug mode with detailed scoring and ranking explanations (default: false)
limitNoMaximum number of tools to return (default: configured tools_limit, max: 100)
queryYesNatural language description of what you want to accomplish. Be specific about your task (e.g., 'create a new GitHub repository', 'get weather for London', 'query SQLite database for users'). The search will find the most relevant tools across all connected servers.
explain_toolNoWhen debug=true, explain why a specific tool was ranked low (format: 'server:tool')
include_statsNoInclude usage statistics for returned tools (default: false)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations provide readOnlyHint=true (read-only) and destructiveHint=true (contradictory internally), the description explains the tool's behavior well: it performs BM25 search, excludes quarantined servers, and returns results with annotations and call_with recommendations. It does not contradict annotations but adds context beyond them. The internal annotation contradiction is not reflected in the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured and front-loaded with the most critical instruction. Each sentence provides useful information (usage guidance, search algorithm, result contents, exclusions, server addition). While it could be slightly more concise, the structured information justifies the length for an important tool discovery mechanism.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 parameters, no output schema, annotations present), the description covers purpose, usage guidelines, behavioral details, parameter usage, and related tools. It partially covers output by mentioning 'annotations' and 'call_with' recommendations. It could mention pagination or error handling, but the existing information is largely sufficient for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context for parameters: it explains that 'query' should be a natural language description with examples, that 'debug' enables ranking explanations, and how 'explain_tool' works in debug mode. This adds value beyond what the schema provides, justifying a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'CALL THIS FIRST to discover relevant tools!' It specifically identifies the action (retrieve tools), the resource (tools across all MCP servers), and the method (BM25 full-text search). It distinguishes itself from sibling tools by being the primary discovery mechanism and explicitly advises using it before calling any specific tools. The verb 'retrieve' combined with the explanatory text provides excellent clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: 'Always use this before attempting to call any specific tools' and 'Use natural language to describe what you want to accomplish.' It also tells when not to use this tool (quarantined servers) and directs to alternatives: 'Use 'quarantine_security' tool to examine and manage quarantined servers' and 'Use 'list_registries' then 'search_servers' to find and add new MCP servers.' This clearly differentiates when to use this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_serversA
Read-onlyDestructive

🔍 Discover MCP servers from known registries with repository type detection. Search and filter servers from embedded registry list to find new MCP servers that can be added as upstreams. Features npm/PyPI package detection for enhanced install commands. WORKFLOW: 1) Call 'list_registries' first to see available registries, 2) Use this tool with a registry ID to search servers. Results include server URLs and repository information ready for direct use with upstream_servers add command.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter servers by tag/category (if supported by registry)
limitNoMaximum number of results to return (default: 10, max: 50)
searchNoSearch term to filter servers by name or description (case-insensitive)
registryYesRegistry ID or name to search (e.g., 'smithery', 'mcprun', 'pulse'). Use 'list_registries' tool first to see available registries.

TDQS

A3.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states the tool is for searching and discovering, implying read-only behavior. However, annotations include both readOnlyHint=true and destructiveHint=true, which contradict each other and the description. This contradiction severely undermines behavioral transparency, as it's unclear whether the tool is safe or destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately concise, with a clear structure: a purpose statement followed by a workflow. It could be more concise (e.g., removing the emoji or slightly redundant phrasing), but overall it is focused and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains that results include server URLs and repository information ready for use with upstream_servers. This is sufficient for the agent to understand the return value. However, it lacks details on pagination or limits, which are partially covered by the limit parameter description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds context about workflow but does not provide additional meaning for the parameters beyond what the schema offers. Baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to discover and search for MCP servers from known registries. It specifies the verb ('discover', 'search'), resource ('MCP servers'), and the outcome (finding servers to add as upstreams). It also distinguishes itself from sibling tools like list_registries and upstream_servers by describing the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit workflow guidance: '1) Call 'list_registries' first to see available registries, 2) Use this tool with a registry ID to search servers.' This tells the agent when and how to use the tool, including prerequisites and follow-up actions with upstream_servers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upstream_serversA
Destructive

Manage upstream MCP servers - add, remove, update, and list servers. Includes Docker isolation configuration and connection status monitoring. SECURITY: Newly added servers are automatically quarantined to prevent Tool Poisoning Attacks (TPAs). Use 'quarantine_security' tool to review and manage quarantined servers. NOTE: Unquarantining servers is only available through manual config editing or system tray UI for security.

Docker Isolation: Use 'isolation_json' parameter to configure per-server Docker images, CPU/memory limits, and network isolation. Example: {"enabled": true, "image": "node:20", "network_mode": "bridge"}.

SMART PATCHING (update/patch): Uses deep merge - only specify fields you want to change. Omitted fields are PRESERVED, not removed. Examples:

  • Enable server: {"operation": "patch", "name": "my-server", "enabled": true} - only enabled changes

  • Enable isolation: {"operation": "patch", "name": "my-server", "isolation_json": "{"enabled": true}"} - enables isolation with defaults

  • Update image: {"operation": "patch", "name": "my-server", "isolation_json": "{"image": "python:3.12"}"} - other isolation fields preserved

  • Add env var: env_json merges with existing vars

  • Replace args: args_json replaces entirely (arrays not merged)

  • Remove field: use 'null' (e.g., isolation_json: "null" removes isolation)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoServer URL for HTTP/SSE servers (e.g., 'http://localhost:3001')
nameNoServer name (required for add/remove/update/patch/tail_log operations)
linesNoNumber of lines to tail from server log (default: 50, max: 500) - used with tail_log operation
commandNoCommand to run for stdio servers (e.g., 'uvx', 'python')
enabledNoWhether server should be enabled (default: true)
env_jsonNoEnvironment variables for stdio servers as JSON object (e.g., '{"API_KEY": "value"}'). For update/patch: MERGES with existing vars (new keys added, existing keys updated).
protocolNoTransport protocol: stdio, http, sse, streamable-http, auto (default: auto-detect)
args_jsonNoCommand arguments for stdio servers as a JSON array of strings (e.g., '["mcp-server-sqlite", "--db-path", "/path/to/db"]'). For update/patch: REPLACES all existing args (arrays are not merged).
operationYesOperation: list, add, remove, update, patch, tail_log. 'update' and 'patch' use smart merge - only specified fields change, others preserved. For quarantine operations, use the 'quarantine_security' tool.
oauth_jsonNoOAuth config as JSON object. MERGES with existing settings. Use 'null' to remove OAuth entirely. Fields: client_id, client_secret, scopes (array - replaces).
headers_jsonNoHTTP headers for authentication as JSON object (e.g., '{"Authorization": "Bearer token"}'). For update/patch: MERGES with existing headers (new keys added, existing keys updated).
isolation_jsonNoDocker isolation config as JSON object. MERGES with existing settings - only provided fields change. Use 'null' to remove isolation entirely. Example: '{"image": "python:3.12"}' updates only the image.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: automatic quarantine for security, Docker isolation, smart merging for updates, and that unquarantining requires manual config. Annotations partially cover safety, but description adds critical context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with summary, security note, Docker isolation, and smart patching examples. Slightly lengthy but each section adds value. Front-loaded with most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully covers tool complexity: all 12 parameters, 6 operations, security interactions, merging rules, and integration with quarantine tool. No output schema, so not required. Very complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value with detailed operation-specific behavior, merging rules, and examples (e.g., env_json merge, args_json replace). Not perfect but exceeds baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages upstream MCP servers with specific operations (add, remove, update, list). It distinguishes from siblings like quarantine_security and search_servers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool vs alternatives (e.g., quarantine operations go to quarantine_security). Explains each operation's use and provides examples for smart patching.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.1/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: three call variants for execution, registry listing, security management, cache reading, tool discovery, server search, and server management. No overlap or ambiguity between tools.

Naming Consistency4/5

Most tools follow a consistent verb_noun snake_case pattern (e.g., list_registries, read_cache). The three call_tool_* variants have a slightly different structure but are internally consistent. Minor deviation prevents a perfect score.

Tool Count5/5

9 tools is well-scoped for an MCP proxy server. The set covers discovery, execution, management, security, and pagination without being overwhelming or sparse.

Completeness5/5

The tool surface fully covers the domain: tool discovery, execution (read/write/destructive), server management, server search, security quarantine, and truncated response handling. No obvious gaps for the stated purpose.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Self-hosted MCP proxy and aggregation platform. Register multiple upstream MCP servers and expose them through a single unified endpoint with namespace routing, multi-transport support (HTTP/SSE, stdio, OpenAPI→MCP), per-tool overrides, and a web admin UI.
    16
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Universal MCP proxy server that discovers, searches, and executes tools across all configured MCP servers from a single entry point.
    7
  • A
    license
    A
    quality
    A
    maintenance
    MCP gateway/proxy: multiplexes tool calls across upstream MCP servers into one aggregated, namespaced catalog and logs every call. Local, single-user, $0/month by default.
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/smart-mcp-proxy/mcpproxy-go'

If you have feedback or need assistance with the MCP directory API, please join our Discord server