← Discover MCPs and Agents
c
MCPAI & MLGitHub

caido-mcp-server

MCP server for Caido proxy integration. Enables AI assistants like Claude Code to browse, analyse, and interact with HTTP traffic.

Links

README

From the repo.

Caido

caido-mcp-server

MCP server and CLI for Caido web proxy - browse, replay, and analyze HTTP traffic from AI assistants or your terminal.

Go License Release MCP CI


What It Does

Two ways to interact with your Caido proxy:

  • MCP Server - expose 67 tools and 6 read-only resources to AI assistants (Claude Code, Cursor, etc.) via the Model Context Protocol
  • CLI - standalone terminal client for pentesters who prefer the command line

Both share the same auth token, the same Go SDK, and the same codebase.

Features

CategoryCapabilities
Proxy HistorySearch requests with HTTPQL, get full request/response details, diff two responses
ReplaySend HTTP requests, get response inline (status, headers, body). Per-session cookie jar auto-persists Set-Cookie between calls
AutomateAccess fuzzing sessions, results, and payloads. Start/pause/resume/cancel tasks
FindingsCreate, list, delete, and export security findings
SitemapBrowse discovered endpoints
ScopesFull lifecycle: create, rename, delete target scope definitions; check if a host/URL is in scope
ProjectsFull lifecycle: create, rename, select, delete projects
WorkflowsList, run, and toggle automation workflows
TamperList, create, update, toggle, and delete Match & Replace rules in all four GUI modes (update raw, update value, add, remove); dry-run a rule against a raw request before committing it
InterceptCheck status, pause/resume, list/forward/drop intercepted requests
EnvironmentsCreate, select, delete variable environments (tokens, keys)
FiltersCreate, list, and delete saved HTTPQL filter presets
Hosted FilesList payload files served by Caido
TasksList and cancel running background tasks
PluginsList installed plugin packages
InstanceGet Caido version and platform info

Built-in security and performance:

  • Credential redaction - Authorization, Cookie, and API key headers are redacted in tool output by default (including raw request/response dumps and the caido://requests/{id} resource); opt out with CAIDO_ALLOW_SENSITIVE_HEADERS (see Revealing sensitive headers)
  • Tool annotations - every tool declares readOnlyHint/destructiveHint/idempotentHint/openWorldHint so MCP clients can distinguish read-only, destructive, and external-network tools
  • Session cookie jar - RFC 6265 jar per replay session; Set-Cookie from a response is auto-attached to the next send_request against the same session
  • Response fingerprinting - auto-detects content kind (json/html/xml/text/binary) so agents know what they're dealing with
  • Adaptive body limits - JSON gets 4KB, HTML 3KB, binary 200B (override with explicit bodyLimit)
  • 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

Session cookie jar

The caido_send_request tool maintains an in-memory http.CookieJar per replay session. Cookies set via Set-Cookie in any response are stored and auto-injected into subsequent requests targeting the same RFC 6265 domain/path. Pass useCookieJar: false to a single call to disable injection (useful for session-fixation testing or to verify auth gates). Use caido_clear_session_cookies to wipe a session jar between test runs and caido_get_session_cookies to introspect what is stored (cookie values are not returned, only metadata).

The output of caido_send_request includes a cookieJar block with injectedCookies (names sent on this call) and storedCookies (names captured from Set-Cookie), so the LLM can verify the chain stayed authenticated.

Response fingerprinting

Every caido_send_request / caido_batch_send response includes a compact fingerprint so an agent can reason about a response without the full body:

  • title - HTML <title>, if present
  • redirect - Location target on a 3xx
  • cookieNames - names set via Set-Cookie (values are never included)
  • wordCount - body word count, for size/diff comparison
  • notableHeaders - non-standard response headers (Server, X-Powered-By, custom X-*). App and flag signal often hides here - check these on every response, including 4xx/5xx.

The fingerprint stays populated even when includeBody: false.

Revealing sensitive headers

By default, sensitive headers (Authorization, Cookie, Set-Cookie, Proxy-Authorization, X-Api-Key, X-Auth-Token, X-CSRF-Token, X-XSRF-Token) are replaced with [REDACTED] in tool output to avoid leaking credentials into the model context. On an authorized engagement where you need the real values — to analyze or replay a captured authenticated request, or to produce a working caido_export_curl PoC — set CAIDO_ALLOW_SENSITIVE_HEADERS to a truthy value (1, true):

{
  "mcpServers": {
    "caido": {
      "command": "caido-mcp-server",
      "args": ["serve"],
      "env": {
        "CAIDO_URL": "http://127.0.0.1:8080",
        "CAIDO_ALLOW_SENSITIVE_HEADERS": "true"
      }
    }
  }
}

When enabled, real credential values flow through tool output to the model; leave it unset to keep redaction. This toggle does not affect the session cookie jar, which only ever reports cookie names and metadata, never values.


MCP Server

Install

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

Or download a pre-built binary from Releases (macOS, Linux, Windows - amd64/arm64).

Or install with the Go toolchain (Go 1.25+):

go install github.com/c0tton-fluff/caido-mcp-server/v4/cmd/caido-mcp-server@latest

The binary lands in $(go env GOPATH)/bin (add it to your PATH). The installed binary reports its module version via caido-mcp-server --version.

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

Quick Start

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 sessionnot a Caido Cloud Personal Access Token. A Cloud PAT (prefixed caido_) is for the cloud/dashboard API and will not authenticate against your local instance.

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

JSON.parse(localStorage.CAIDO_AUTHENTICATION).accessToken

Pass it via the CAIDO_ACCESS_TOKEN environment variable. No login command needed.

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

Note: this token expires after ~7 days; for a long-lived setup use Option B (OAuth), which refreshes automatically. The older CAIDO_PAT variable is still accepted as a deprecated alias for CAIDO_ACCESS_TOKEN.

Option B: OAuth device flow

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

This opens your browser for OAuth authentication and saves the token under ~/.caido-mcp/tokens/. Then configure your MCP client:

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

Credentials are stored per instance, keyed by the canonical CAIDO_URL, so you can stay logged in to several Caido instances at once and switch between them without re-authenticating. Run login once per instance. An existing ~/.caido-mcp/token.json from an earlier version is migrated automatically the first time you use it, so upgrading does not require a fresh login.

3. Use it

"List all POST requests to /api"
"Send this request with a modified user ID"
"Create a finding for this IDOR"
"Show fuzzing results from Automate session 1"
"What's in scope?"

MCP Tools (66)

ToolDescription
caido_list_requestsList requests with HTTPQL filter and pagination
caido_get_requestGet request details (metadata, headers, body). 2KB body limit default
caido_diff_responsesStructural diff of two responses by Caido request ID: status/size change flags and a compact body/header summary (never dumps full bodies)
caido_send_requestSend HTTP request via Replay, returns response inline. Polls up to 10s. Auto-injects session cookies and persists Set-Cookie (toggle with useCookieJar)
caido_batch_sendSend multiple requests in parallel (BAC sweeps, parameter fuzzing, endpoint sweeps). Max 50 per batch
caido_edit_requestModify and resend an existing request. Preserves auth/cookies while changing method, path, headers, or body
caido_export_curlConvert a request to an executable curl command for PoC reports
caido_create_replay_sessionCreate a named replay session, optionally seed with a request
caido_list_replay_sessionsList replay sessions
caido_delete_replay_sessionsBulk delete replay sessions by ID
caido_move_replay_sessionMove a session to a different collection
caido_get_replay_entryGet replay entry with response. 2KB body limit default
caido_clear_session_cookiesWipe the in-memory cookie jar for a replay session
caido_get_session_cookiesList metadata for cookies stored in a session jar matching a URL (values not returned)
caido_list_replay_collectionsList replay session collections
caido_create_replay_collectionCreate a named replay collection
caido_rename_replay_collectionRename a replay collection
caido_delete_replay_collectionDelete a replay collection
caido_list_automate_sessionsList fuzzing sessions
caido_get_automate_sessionGet session details with entry list
caido_get_automate_entryGet fuzz results and payloads
caido_automate_task_controlStart/pause/resume/cancel fuzzing tasks
caido_list_findingsList security findings
caido_create_findingCreate finding linked to a request
caido_delete_findingsDelete findings by IDs or reporter name
caido_export_findingsExport findings for reporting
caido_get_sitemapBrowse sitemap hierarchy
caido_list_scopesList target scopes
caido_is_in_scopeCheck whether a host or URL is in the project scope; returns the matching scope and the allow/deny rule that decided it
caido_create_scopeCreate new scope with allow/deny lists
caido_rename_scopeRename a scope
caido_delete_scopeDelete a scope
caido_list_projectsList projects, marks current
caido_select_projectSwitch active project
caido_create_projectCreate a new project
caido_rename_projectRename a project
caido_delete_projectDelete a project
caido_list_workflowsList automation workflows
caido_run_workflowExecute an active or convert workflow
caido_toggle_workflowEnable or disable a workflow
caido_list_tamper_rulesList Match & Replace rule collections
caido_create_tamper_ruleCreate a tamper rule in a collection
caido_update_tamper_ruleUpdate an existing tamper rule
caido_test_tamper_ruleDry-run a tamper rule against a raw request
caido_toggle_tamper_ruleEnable or disable a tamper rule
caido_delete_tamper_ruleDelete a tamper rule
caido_get_instanceGet Caido version and platform info
caido_intercept_statusGet intercept status (PAUSED/RUNNING)
caido_intercept_controlPause or resume intercept
caido_list_intercept_entriesList queued intercept entries with HTTPQL filtering
caido_forward_interceptForward intercepted request, optionally with modifications
caido_drop_interceptDrop intercepted request
caido_list_environmentsList environments and their variables
caido_select_environmentSwitch active environment
caido_create_environmentCreate a new environment
caido_delete_environmentDelete an environment
caido_list_filtersList saved HTTPQL filter presets
caido_create_filterSave an HTTPQL query as a named filter preset
caido_delete_filterDelete a filter preset
caido_list_hosted_filesList hosted payload files
caido_list_tasksList running background tasks
caido_cancel_taskCancel a running task by ID
caido_list_pluginsList installed plugin packages
caido_list_ws_streamsList WebSocket streams (connections) from the WebSocket tab
caido_list_ws_messagesList WebSocket frames for a stream (direction/format/decoded body)
caido_convert_bodyConvert a request body between JSON, form-urlencoded, XML, and multipart
caido_race_window_sendFire raw HTTP/1.1 requests with synchronized last-byte send for race-condition testing (bypasses Caido proxy)

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
Parameter reference

caido_list_requests

ParameterTypeDescription
httpqlstringHTTPQL filter query
limitintMax requests (default 20, max 100)
afterstringPagination cursor

caido_get_request

ParameterTypeDescription
idsstring[]Request IDs (required)
includestring[]requestHeaders, requestBody, responseHeaders, responseBody
bodyOffsetintByte offset
bodyLimitintByte limit (default 2000)

caido_send_request

ParameterTypeDescription
rawstringFull HTTP request (required)
hoststringTarget host (overrides Host header)
portintTarget port
tlsboolUse HTTPS (default true)
sessionIdstringReplay session (auto-managed if omitted)
bodyLimitintResponse body byte limit (default 2000)
bodyOffsetintResponse body byte offset (default 0)
useCookieJarboolAuto-inject session cookies and persist Set-Cookie (default true); set false to disable for this call only
includeBodyboolInclude response body text (default true); the fingerprint is always populated
markerstringString to search for in the response body; when set, output.reflected reports whether it was found

caido_get_replay_entry

ParameterTypeDescription
idstringReplay entry ID (required)
bodyOffsetintByte offset
bodyLimitintByte limit (default 2000)

caido_get_automate_entry

ParameterTypeDescription
idstringEntry ID (required)
limitintMax results
afterstringPagination cursor

caido_create_finding

ParameterTypeDescription
requestIdstringAssociated request (required)
titlestringFinding title (required)
descriptionstringFinding description

caido_create_scope

ParameterTypeDescription
namestringScope name (required)
allowliststring[]Hostnames to include, e.g. example.com, *.example.com (required)
denyliststring[]Hostnames to exclude

caido_select_project

ParameterTypeDescription
idstringProject ID to switch to (required)

caido_intercept_control

ParameterTypeDescription
actionstringpause or resume (required)

caido_list_intercept_entries

ParameterTypeDescription
filterstringHTTPQL filter query
limitintMax entries (default 20, max 100)
afterstringPagination cursor

caido_forward_intercept

ParameterTypeDescription
idstringIntercept entry ID (required)
rawstringModified raw HTTP request (base64-encoded, optional)

caido_drop_intercept

ParameterTypeDescription
idstringIntercept entry ID (required)

caido_automate_task_control

ParameterTypeDescription
actionstringstart, pause, resume, or cancel (required)
session_idstringAutomate session ID (required for start)
task_idstringAutomate task ID (required for pause/resume/cancel)

caido_delete_findings

ParameterTypeDescription
idsstring[]Finding IDs to delete
reporterstringDelete all findings by this reporter

caido_export_findings

ParameterTypeDescription
idsstring[]Finding IDs to export
reporterstringExport all findings by this reporter

caido_list_environments

No parameters required. Returns all environments with variables and selected/global context.

caido_select_environment

ParameterTypeDescription
idstringEnvironment ID (required, empty string to deselect)

caido_run_workflow

ParameterTypeDescription
idstringWorkflow ID (required)
typestringactive or convert (required)
request_idstringRequest ID (required for active workflows)
inputstringInput data (required for convert workflows)

caido_toggle_workflow

ParameterTypeDescription
idstringWorkflow ID (required)
enabledboolEnable or disable (required)

caido_list_tamper_rules

No parameters required. Returns all tamper rule collections with nested rules (id, name, section, enabled, condition, sources).

caido_create_tamper_rule

ParameterTypeDescription
collection_idstringCollection ID (required)
namestringRule name (required)
sectionstringSection to match (required), see below
operationobjectOperation mode and parameters, see below
matchstringLegacy shorthand for operation.match
replacestringLegacy shorthand for operation.value
conditionstringHTTPQL filter condition
sourcesstring[]Traffic sources: INTERCEPT, REPLAY, AUTOMATE, IMPORT, PLUGIN, WORKFLOW, SAMPLE
Operation modes
operation.kindMeaningFields
updateRawPattern match over the raw section textmatch, match_kind, value
updateValueSet the value of a named header or query paramname, value
addInsert a new header or query paramname, value
removeDelete a named header or query paramname

match_kind selects how match is read: regex (default), value (literal substring, no escaping) or full (the entire section, match must be omitted). Use workflow_id instead of value to supply the replacement from a convert workflow.

All four modes are available on requestHeader, responseHeader and requestQuery. Every other section supports exactly one mode, and asking for another returns an error naming the modes it does support: requestAll, requestBody, requestFirstLine, requestPath, responseAll, responseBody, responseFirstLine take updateRaw; requestMethod, requestSNI, responseStatusCode take updateValue (they always apply, so they accept no match or name).

Omitting operation entirely falls back to the section's default mode with the legacy match/replace fields, so existing callers keep working unchanged.

caido_update_tamper_rule

Full update: pass the complete rule state, not a partial patch. Accepts the same section, operation and legacy match/replace parameters as caido_create_tamper_rule.

ParameterTypeDescription
idstringTamper rule ID (required)
namestringRule name (required)
sectionstringSection to match (required)
operationobjectOperation mode and parameters
matchstringLegacy shorthand for operation.match
replacestringLegacy shorthand for operation.value
conditionstringHTTPQL filter condition
sourcesstring[]Traffic sources

caido_test_tamper_rule

Dry-run a rule against a raw HTTP request or response and return the transformed result. Nothing is persisted and no traffic is sent. Accepts the same section, operation and legacy match/replace parameters as caido_create_tamper_rule.

ParameterTypeDescription
rawstringRaw HTTP request or response to transform (required)
sectionstringSection to match (required)
operationobjectOperation mode and parameters

Returns raw (the transformed message) and changed (whether the rule matched anything at all), which is the quickest way to catch a rule that silently matches nothing.

caido_toggle_tamper_rule

ParameterTypeDescription
idstringTamper rule ID (required)
enabledboolEnable or disable (required)

caido_delete_tamper_rule

ParameterTypeDescription
idstringTamper rule ID (required)

CLI

Standalone terminal client for Caido. No MCP required - use it directly from your shell.

Install

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

Or download from Releases.

Or install with the Go toolchain (Go 1.25+):

go install github.com/c0tton-fluff/caido-mcp-server/v4/cmd/caido-cli@latest
Build from source
git clone https://github.com/c0tton-fluff/caido-mcp-server.git
cd caido-mcp-server
go build -o caido-cli ./cmd/caido-cli

Usage

Requires authentication - run caido-mcp-server login first to store a token. (The CLI reads the stored login token; it does not consume the CAIDO_ACCESS_TOKEN env var that the MCP server uses.)

# Check connection and auth
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 requests
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
echo -n 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | caido-cli raw -

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

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

# Get full request/response details
caido-cli request 12345

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

Commands

CommandDescription
statusCheck Caido instance health and auth token
send METHOD URLSend structured HTTP request via Replay API
rawSend raw HTTP request (argument, file with -f, or stdin with -)
batch MODEParallel requests via Replay: sweep (N tokens), fuzz (N values), ep (N URLs), file (JSON spec)
historyList proxy history with HTTPQL filtering
request IDGet full request/response by ID
encode TYPE VALUEEncode value (url, base64, hex)
decode TYPE VALUEDecode value (url, base64, hex)

Global Flags

FlagDescription
-u, --urlCaido instance URL (or set CAIDO_URL)
-b, --body-limitResponse body byte limit (default 2000)

Architecture

caido-mcp-server/
  cmd/
    caido-mcp-server/   MCP server (stdio transport)
    caido-cli/          Standalone CLI
  internal/
    auth/         OAuth device flow, static access token (CAIDO_ACCESS_TOKEN), token store, auto-refresh
    buildinfo/    Version resolution (ldflag or go-install module version)
    httputil/     HTTP parsing, fingerprinting, response diff, CRLF normalization
    replay/       Replay session management, cookie jar, response polling
    resources/    MCP read-only resources (requests, sessions, sitemap, findings)
    tools/        MCP tool definitions (one file per tool)
    testutil/     Mock GraphQL server, MCP test helpers, fixtures

The cmd/ directory names match the installed binary names so go install .../cmd/caido-mcp-server@latest produces a correctly-named binary. Both commands share internal/ packages. The project uses caido-community/sdk-go for all GraphQL communication with Caido.


Troubleshooting

ErrorFix
Invalid tokenCAIDO_ACCESS_TOKEN must be the local Caido access token (not a Cloud PAT) — re-grab it from the GUI console, or run caido-mcp-server login again
token expired, no refresh tokenThe static access token expires after ~7 days; re-grab it into CAIDO_ACCESS_TOKEN, or use caido-mcp-server login (OAuth auto-refreshes)
poll failed: timed outTarget server slow; use get_replay_entry with the returned entryId
no authentication token foundSet CAIDO_ACCESS_TOKEN env var or run caido-mcp-server login before serve

MCP server logs: ~/.cache/claude-cli-nodejs/*/mcp-logs-caido/


Security

Sensitive HTTP headers (Authorization, Cookie, Set-Cookie, API keys) are redacted everywhere output leaves the server - structured tool output, raw request/response dumps, fuzz templates, and the caido://requests/{id} resource all pass through a single redaction choke-point to prevent credential leakage to LLM context. On an authorized engagement you can opt out with CAIDO_ALLOW_SENSITIVE_HEADERS (see Revealing sensitive headers). All string inputs are length-validated server-side, and request batch sizes are capped.

Access tokens (via CAIDO_ACCESS_TOKEN) and OAuth tokens are stored with 0600 permissions and never appear in process arguments or log output.

To report a security issue, open a GitHub issue or contact the maintainer directly.


Contributing

  1. Fork the repo
  2. Create a feature branch
  3. go build ./... and go test ./... -race
  4. Open a PR (CI runs build, test, vet, staticcheck)

Local pre-push gate

A tracked .githooks/pre-push runs the same checks as CI's lint + test jobs (gofmt, go vet, golangci-lint run ./..., go test ./... -race) so failures are caught before they reach CI. Enable it once per clone:

git config core.hooksPath .githooks
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.12.2

Built with caido-community/sdk-go and modelcontextprotocol/go-sdk.

License

MIT

Collected info

  • 106 stars
  • 23 forks
  • Language: Go
  • Source updated: 8/4/2026

Config for your environment

Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.

Tool

OS

Config file: ~/.cursor/mcp.json

{
  "mcpServers": {
    "mcp-server": {
      "url": "{MCP_ENDPOINT_URL}"
    }
  }
}

Paste into mcpServers in the config file. Restart Cursor after saving.

If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.