Caido MCP Server

johnmatrix Purple Teamer - AI security, offensive tooling about →

MCP server and CLI for the Caido web proxy. Browse, replay, and analyze HTTP traffic from AI assistants or your terminal. Built on the community Go SDK with 66 tools and 6 read-only resources, OAuth + static token auth, HTTPQL filtering, session cookie jars, batch operations, WebSocket inspection, race condition testing, and full Caido feature coverage.

Source: c0tton-fluff/caido-mcp-server

Architecture

Claude Code  -->  stdio  -->  caido-mcp-server (Go)  -->  GraphQL  -->  Caido (port 8080)
Terminal     -->  caido-cli  -->  same GraphQL API

Both MCP and CLI share internal packages. Uses caido-community/sdk-go for type-safe GraphQL communication.

Install

curl -fsSL https://raw.githubusercontent.com/c0tton-fluff/caido-mcp-server/main/install.sh | bash

Pre-built binaries on Releases (macOS, Linux, Windows - amd64/arm64).

Build from source:

git clone https://github.com/c0tton-fluff/caido-mcp-server.git
cd caido-mcp-server
go build -ldflags "-X main.version=$(git describe --tags)" -o caido-mcp-server ./cmd/mcp

Auth

Option A: Static access token (recommended)

This server talks to the local Caido app’s GraphQL API, which authenticates with the access token from your Caido login session – not a Caido Cloud Personal Access Token. A Cloud PAT (prefixed caido_) is for the cloud/dashboard API and will not work.

Grab the access token from the Caido GUI: open developer tools (CTRL+SHIFT+I) and run in the Console:

JSON.parse(localStorage.CAIDO_AUTHENTICATION).accessToken

Pass it via CAIDO_ACCESS_TOKEN. The older CAIDO_PAT variable is accepted as a deprecated alias.

This token expires after ~7 days. For long-lived setups, use Option B (OAuth auto-refreshes).

Option B: OAuth device flow

CAIDO_URL=http://localhost:8080 caido-mcp-server login

Opens browser, saves token to ~/.caido-mcp/token.json. Auto-refreshes mid-session.

Claude Code Config

{
  "mcpServers": {
    "caido": {
      "command": "caido-mcp-server",
      "args": ["serve"],
      "env": {
        "CAIDO_URL": "http://127.0.0.1:8080",
        "CAIDO_ACCESS_TOKEN": "your-caido-access-token"
      }
    }
  }
}

For authorized engagements where you need real credential values in tool output (to replay captured authenticated requests or produce working curl PoCs), add "CAIDO_ALLOW_SENSITIVE_HEADERS": "true". Without it, sensitive headers (Authorization, Cookie, Set-Cookie, API keys) are replaced with [REDACTED] in all tool output.

MCP Tools (66)

Proxy History & Replay

ToolWhat it does
list_requestsProxy history with HTTPQL filter and pagination
get_requestRequest details (metadata, headers, body) with configurable limit + offset
diff_responsesStructural diff of two responses by request ID: status/size change flags, compact body/header summary
send_requestSend HTTP via Replay. Auto-injects session cookies, persists Set-Cookie, polls up to 10s. Supports marker for response reflection detection
batch_sendParallel requests (BAC sweeps, param fuzzing, endpoint sweeps). Max 50 per batch
edit_requestModify and resend an existing request. Preserves auth/cookies while changing method, path, headers, or body
export_curlConvert a request to an executable curl command for PoC reports

Replay Sessions & Collections

ToolWhat it does
create_replay_sessionCreate named replay session, optionally seed with a request
list_replay_sessionsList replay sessions
delete_replay_sessionsBulk delete replay sessions by ID
move_replay_sessionMove a session to a different collection
get_replay_entryGet replay entry with request/response
clear_session_cookiesWipe in-memory cookie jar for a session
get_session_cookiesList cookie metadata stored in a session jar (values not returned)
list_replay_collectionsList replay session collections
create_replay_collectionCreate a named replay collection
rename_replay_collectionRename a replay collection
delete_replay_collectionDelete a replay collection

Automate (Fuzzing)

ToolWhat it does
list_automate_sessionsList fuzzing sessions
get_automate_sessionSession details with entry list
get_automate_entryFuzz results with payloads
automate_task_controlStart/pause/resume/cancel fuzzing tasks

Findings

ToolWhat it does
list_findingsList security findings
create_findingCreate finding linked to a request
delete_findingsDelete findings by IDs or reporter name
export_findingsExport findings for reporting

Sitemap & Scopes

ToolWhat it does
get_sitemapBrowse discovered endpoint hierarchy
list_scopesList target scopes
is_in_scopeCheck if a host/URL is in project scope; returns matching scope and allow/deny rule
create_scopeCreate scope with allow/deny lists
rename_scopeRename a scope
delete_scopeDelete a scope

Projects

ToolWhat it does
list_projectsList projects, marks current
select_projectSwitch active project
create_projectCreate a new project
rename_projectRename a project
delete_projectDelete a project

Workflows

ToolWhat it does
list_workflowsList automation workflows
run_workflowExecute an active or convert workflow
toggle_workflowEnable or disable a workflow

Tamper Rules (Match & Replace)

ToolWhat it does
list_tamper_rulesList Match & Replace rule collections
create_tamper_ruleCreate a tamper rule in a collection
update_tamper_ruleUpdate an existing tamper rule
toggle_tamper_ruleEnable or disable a tamper rule
delete_tamper_ruleDelete a tamper rule

Intercept

ToolWhat it does
intercept_statusGet intercept status (PAUSED/RUNNING)
intercept_controlPause or resume intercept
list_intercept_entriesList queued intercept entries with HTTPQL filtering
forward_interceptForward intercepted request, optionally with modifications
drop_interceptDrop intercepted request

Environments

ToolWhat it does
list_environmentsList environments and their variables
select_environmentSwitch active environment
create_environmentCreate a new environment
delete_environmentDelete an environment

Filters

ToolWhat it does
list_filtersList saved HTTPQL filter presets
create_filterSave an HTTPQL query as a named filter preset
delete_filterDelete a filter preset

WebSocket

ToolWhat it does
list_ws_streamsList WebSocket streams (connections) from the WebSocket tab
list_ws_messagesList WebSocket frames for a stream (direction, format, decoded body)

Utilities

ToolWhat it does
convert_bodyConvert a request body between JSON, form-urlencoded, XML, and multipart
race_window_sendFire raw HTTP/1.1 requests with synchronized last-byte send for race-condition testing (bypasses Caido proxy)
get_instanceGet Caido version and platform info

Admin

ToolWhat it does
list_hosted_filesList hosted payload files
list_tasksList running background tasks
cancel_taskCancel a running task by ID
list_pluginsList installed plugin packages

MCP Resources (6)

Read-only data exposed via the MCP resources protocol. Agents can read these without consuming tool calls.

URIDescription
caido://requests/{id}Full HTTP request and response for a given request ID
caido://replay-sessions/{id}Replay session details with entry list
caido://sitemapRoot domains from the sitemap
caido://findingsSecurity finding summaries (up to 100)
caido://scopesAll target scopes with their allow/deny rules
caido://projectCurrent project, instance version, and connection status

The server maintains an RFC 6265-compliant in-memory cookie jar per replay session. Any Set-Cookie from a response is stored and auto-injected into subsequent requests targeting the same domain/path.

Key behaviours:

  • Pass useCookieJar: false on a single call to disable injection (useful for session-fixation testing or verifying auth gates)
  • clear_session_cookies wipes the jar between test runs
  • get_session_cookies introspects stored cookies (metadata only, values not returned)
  • Each send_request response includes a cookieJar block showing injectedCookies (names sent) and storedCookies (names captured)

Multi-step authenticated flows work out of the box – login once, subsequent requests carry the session automatically.

Built-in Protections

  • Credential redaction – Authorization, Cookie, Set-Cookie, Proxy-Authorization, and API key headers replaced with [REDACTED] in all tool output (opt out with CAIDO_ALLOW_SENSITIVE_HEADERS)
  • Tool annotations – every tool declares readOnlyHint/destructiveHint/idempotentHint/openWorldHint so MCP clients distinguish read-only, destructive, and external-network tools
  • Adaptive body limits – JSON gets 4KB, HTML 3KB, binary 200B (override with explicit bodyLimit)
  • Response fingerprinting – auto-detects content kind (json/html/xml/text/binary)
  • Response diff – repeated identical responses in the same session collapse to a one-line summary, saving tokens
  • Input validation – length limits on all string inputs to prevent context flooding
  • Token auto-refresh – expired OAuth tokens refresh mid-session automatically
  • Session reuse – single replay session per server lifetime, no sprawl

CLI

Standalone terminal client for Caido. No MCP required.

# Install
curl -fsSL https://raw.githubusercontent.com/c0tton-fluff/caido-mcp-server/main/install.sh | TOOL=cli bash

# Check connection
caido-cli status -u http://localhost:8080

# Send structured requests
caido-cli send GET https://target.com/api/users
caido-cli send POST https://target.com/api/login -j '{"user":"admin","pass":"test"}'
caido-cli send PUT https://target.com/api/profile -H "Authorization: Bearer tok" -j '{"role":"admin"}'

# Send raw HTTP
caido-cli raw 'GET /api/users HTTP/1.1\r\nHost: target.com\r\n\r\n'
caido-cli raw -f request.txt --host target.com --port 8443

# Parallel requests (BAC sweeps, param fuzzing, endpoint sweeps)
caido-cli batch sweep https://target.com/api/profile -t "owner=eyJ1...,cross=eyJ2...,noauth=eyJ3"
caido-cli batch fuzz "https://target.com/api/search?q=test" -p q -v "test,test',1 OR 1=1"
caido-cli batch ep -t eyJ... https://target.com/dashboard https://target.com/admin

# Browse proxy history
caido-cli history
caido-cli history -f 'req.host.eq:"target.com"' -n 20

# Get full request/response
caido-cli request 12345

# Encode/decode
caido-cli encode base64 "hello world"
caido-cli decode url "%3Cscript%3E"

Caido vs Burp MCP

FeatureCaido MCPBurp MCP
TransportGo > GraphQLGo > SSE
Tools66 + 6 resources10
FilteringHTTPQL (req.host.eq:"...")Regex
Batch opsbatch_send (50 parallel)batch_send (10 parallel)
Cookie jarRFC 6265 per-sessionNo
FuzzingAutomate sessionsSend to Intruder
ScannerNo built-inget_scanner_issues
Match & ReplaceFull CRUD (5 tools)No
InterceptFull control + modificationsNo
WebSocketlist_ws_streams + list_ws_messagesNo
Race conditionsrace_window_sendNo
Body conversionconvert_body (JSON/form/XML/multipart)No
ProjectsFull CRUDNo
ScopesFull CRUD + is_in_scope checkNo
EnvironmentsFull CRUDNo
AuthOAuth + static tokenNone (localhost)

Use Caido for: daily proxy work, HTTPQL filtering, multi-step authenticated flows, fuzzing with Automate, workflow automation, batch testing, intercept control, WebSocket inspection, race condition testing.

Use Burp for: active scanning, Collaborator/blind testing, extension ecosystem (Autorize, Param Miner).

Port Notes

  • Caido default proxy: 127.0.0.1:8080
  • Burp default proxy: 127.0.0.1:8080 (conflict)
  • Change one (e.g., Caido to 127.0.0.1:1234)
  • MCP servers use different ports: Caido GraphQL (8080) vs Burp SSE (9876) – no conflict

Related