Skip to main content
Glama

Documentation: docs/ · Source: github.com/chancecreate/charles-mcp


charles-mcp lets MCP clients like Claude Code, Codex and Cursor read the HTTP(S) traffic that Charles Proxy is capturing, while it's being captured.

A small bridge runs inside Charles and listens to every request and response through Charles's own proxy API. Your agent asks something like "why is the checkout call returning 422?" and answers it from traffic that's actually on the wire. You don't need to export sessions, and the Web Interface isn't polled.

The key features are:

  • Live: events come out of Charles as requests start, get responses and finish, with Charles's own timestamps.

  • Native: hooks Charles's public listener API, so no Charles bytecode is modified.

  • Private by default: credentials are redacted twice, bodies stay off until you enable them, and the bridge only answers authenticated local clients.

  • Safe for Charles: queues are bounded and nothing blocks a proxy thread. If the bridge stops, Charles carries on.

  • Token-efficient: compact, paginated, typed tool results, with cursors for "what's new since last time?"

  • Read-only: no replay, no traffic modification, no certificate access. It's an inspection tool.

Quickstart

No build tools needed. You need Charles Proxy 4.6.x on Windows (4.6.8 is the latest) and Python 3.11+.

  1. Download charles-mcp-<version>-windows.zip from the latest release and unzip it.

  2. Close Charles, then double-click Install.cmd. Click Yes when Windows asks for permission.

  3. Start Charles. If you use Claude Code, it's already connected. Just ask about your traffic.

To remove it, double-click Uninstall.cmd.

Related MCP server: Charles MCP Server

Installation from source

Requirements: Charles Proxy 4.6.x on Windows, Python 3.11+, and JDK 11+.

Build the agent and install it into Charles. Run this from an elevated PowerShell if Charles is in Program Files. The installer backs up Charles.ini, and -Uninstall puts it back.

$ cd java && ./mvnw -B package && cd ..
$ .\scripts\install-windows.ps1

Then install the MCP server:

$ pip install ./python

Example

Connect it

Add the server to your MCP client. For Claude Code:

$ claude mcp add charles -- charles-mcp

Configs for Codex and Cursor are in examples/.

Check it

Restart Charles, browse something, then run:

$ charles-mcp status
{
  "bridge_connected": true,
  "charles_version": "4.6.8",
  "recording": true,
  "session_id": "s-cd075c67",
  ...
}

Ask it

Your agent now has these tools:

Tool

What it does

list_requests

Recent requests, newest first. Filter by host, method, status, URL, content type or time. Pass after to get only new ones.

get_request

Method, URL, headers, timing and sizes, plus the body if you ask for it.

get_response

Status, headers, timing, TLS details and errors, plus the body if you ask for it.

search_traffic

Searches URLs, headers and (if enabled) bodies, and returns snippets.

get_session_summary

Counts by host, method and status, recent errors and totals.

watch_requests

Raw lifecycle events since a cursor.

get_status

Bridge health, recording state and drop counters.

Here's a get_response result from a live capture, trimmed, with secrets already redacted:

{
  "status": 200,
  "state": "complete",
  "headers": [
    { "name": "Content-Type", "value": "application/json; charset=utf-8" },
    { "name": "Set-Cookie", "value": "[REDACTED]" }
  ],
  "body": {
    "kind": "json",
    "text": "{ \"user\": \"demo\", \"access_token\": \"[REDACTED]\", \"profile\": { \"password\": \"[REDACTED]\", \"plan\": \"free\" } }",
    "untrusted": true
  }
}

Request bodies

Bodies are off by default. Turn them on when you need them:

$ claude mcp add charles --env CHARLES_MCP_ALLOW_BODIES=1 -- charles-mcp

Even when they're on, bodies are size-capped and redacted, and binary content is never decoded into text. Captured content is also marked as untrusted, so your agent treats it as data rather than instructions.

Host filters limit what the agent can see:

# charles-mcp.toml
[charles_mcp]
allow_bodies = true
host_allowlist = ["api.example.com", "*.staging.example.com"]

Every setting is listed in examples/charles-mcp.toml.

How it works

 Charles 4.6.x                                 charles-mcp                     your agent
┌─────────────────────────────────────┐      ┌──────────────────────┐      ┌──────────────┐
│ proxy ─▶ listener ─▶ bounded queue  │      │ index ─▶ redaction   │      │ Claude Code  │
│       ─▶ event store ─▶ bridge      ├─────▶│       ─▶ MCP tools   │◀────▶│ Codex        │
│         127.0.0.1 · token auth      │ TCP  │                      │stdio │ Cursor       │
└─────────────────────────────────────┘      └──────────────────────┘      └──────────────┘

Charles's bundled Java runtime can't load -javaagent, so the installer points Charles.ini at a tiny launcher instead. The launcher starts the bridge and then hands control to Charles as usual. More detail is in architecture and the internals notes.

Security

Your MCP client may send tool output to a cloud model, so only enable bodies for traffic you'd be fine sharing, and use host allowlists. Redaction works from header and key names and from known token formats, which means a secret with no recognisable name or shape can get through. The full threat model is in docs/security.md.

Troubleshooting

Symptom

Fix

discovery file not found

Charles isn't running with the bridge. Re-run the installer and restart Charles.

stale discovery file

Charles exited abruptly. Restart it.

recording: false

Start recording in Charles.

Requests from your app are missing

Check that the app uses Charles as its proxy, and check your host filters.

agent_state: unsupported

Your Charles version isn't supported yet, so the bridge stays off. Charles still runs normally.

Development

$ cd java && ./mvnw -B verify
$ cd python && pip install -e ".[dev]" && pytest

To try the tools without Charles, run the mock bridge and point the server at its discovery file:

$ charles-mcp mock-bridge --fixture fixtures/sample-bridge.json --discovery ./mock.json
$ CHARLES_MCP_DISCOVERY_FILE=./mock.json charles-mcp

See testing and contributing.

License

This project is licensed under the terms of the MIT license.

Charles Proxy is a product of XK72 Ltd. This project isn't affiliated with or endorsed by XK72.

Available Tools

7 tools
get_requestC

Request line, headers (redacted), timing, sizes and optionally the bounded/redacted request body.

NameRequiredDescriptionDefault
include_bodyNoFetch a bounded, redacted request body (needs bodies enabled)
max_body_bytesNo
transaction_idYestransaction_id from list_requests (e.g. 't42').

Output Schema

NameRequiredDescription
urlYes
bodyYes
hostYes
portYes
stateYes
methodYes
schemeYes
timingYes
headersYes
body_bytesYes
redactionsYesNumber of values replaced with [REDACTED] in this result.
session_idYes
content_typeYes
header_bytesYes
transaction_idYes
protocol_versionYes
attached_to_sessionNoFalse once cleared from the Charles session.

TDQS

C2.9/5.0
Behavior3/5

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

With no annotations, the description bears the full disclosure burden, and it does add real value: headers and body are redacted, the body is bounded and only returned on request, and bodies must be enabled server-side. It does not state that this is a read-only operation or what happens when bodies are disabled.

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?

A single compact clause with no filler and the optional-body caveat placed at the end where it reads naturally. It is efficient, though the missing subject makes it read as a fragment rather than a purposeful statement.

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?

An output schema exists, so return-value explanation is not required, and the redaction/bounding notes cover the riskiest behavior. What remains missing is routing versus get_response and how to obtain the required transaction_id, which matters for a 3-parameter lookup tool in a crowded sibling set.

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 67%, and the description reinforces the include_body/max_body_bytes semantics (optional, bounded, redacted), though most of that detail is already in the schema. The required transaction_id is not mentioned in the description at all, so it adds little beyond the structured fields.

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

Purpose3/5

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

The description is a noun-phrase inventory of what comes back (request line, redacted headers, timing, sizes, optional body) rather than a verb+resource statement. It hints strongly that this retrieves the HTTP request for a transaction, but it never says so outright and does not distinguish itself from the sibling get_response.

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?

There is no when-to-use guidance, no mention of the sibling alternatives (get_response, list_requests, search_traffic), and no note that transaction_id should be sourced from list_requests — that hint lives only in the schema. Usage must be inferred entirely from the name.

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

get_responseC

Status, headers (redacted), timing, TLS/connection info and optionally the bounded/redacted response body.

NameRequiredDescriptionDefault
include_bodyNoFetch a bounded, redacted response body (needs bodies enabled)
max_body_bytesNo
transaction_idYestransaction_id from list_requests (e.g. 't42').

Output Schema

NameRequiredDescription
bodyYes
errorYes
stateYes
statusYes
timingYes
headersYes
body_bytesYes
connectionYes
redactionsYes
content_typeYes
header_bytesYes
charles_statusYes
transaction_idYes

TDQS

C2.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose meaningful behavior: headers are redacted, the body is bounded and redacted, and body retrieval is optional and gated behind a 'bodies enabled' switch. It does not cover failure modes (e.g., missing/expired transaction, body unavailable) or permission requirements, leaving notable gaps for a read tool.

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?

A single compact sentence with no filler, and the most important information (status, headers) is front-loaded. The parenthetical redaction qualifiers are efficient and earn their place.

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 output schema exists, so the field inventory is somewhat redundant, yet the description omits practical context such as where transaction_id comes from (only in the schema) and when to prefer this over get_request. For a 3-parameter read tool it is adequate but leaves routing decisions to inference.

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 67%, and the schema itself documents include_body ('needs bodies enabled') and gives a transaction_id example. The description only echoes the optional/redacted nature of include_body and adds no semantics for max_body_bytes, so it is roughly at the baseline rather than compensating for the gap.

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

Purpose3/5

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

The description is a noun-phrase inventory of return fields ('Status, headers, timing, TLS/connection info... response body') rather than a verb+resource statement, so the action ('retrieve the response for a transaction') is only implied. It never distinguishes itself from siblings like get_request or get_status, which an agent must infer from the field list alone.

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?

There is no guidance on when to call this versus get_request, get_status, or get_session_summary. The 'optionally... (needs bodies enabled)' phrase hints at a prerequisite but frames no usage conditions or exclusions.

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

get_session_summaryC

Counts by host/method/status, recent errors and total sizes for indexed traffic.

NameRequiredDescriptionDefault
topNo
session_idNoLimit to one Charles session

Output Schema

NameRequiredDescription
failedYes
by_hostYes
removedYes
completeYes
by_methodYes
by_statusYes
in_flightYes
session_idsYes
transactionsYes
last_start_msYes
recent_errorsYes
first_start_msYes
by_status_classYes
bridge_connectedYes
total_request_bytesYes
total_response_bytesYes

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses output content categories but does not state that the operation is read-only, whether it has side effects, permission requirements, pagination/limits, or what 'indexed traffic' excludes.

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?

It is a single compact sentence with no filler, and the summary content is front-loaded. It is slightly fragmentary but still appropriately sized for the tool.

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?

An output schema exists, so return values need not be fully described, and the description identifies the main aggregate categories. However, with no annotations and an undocumented top parameter, it is only minimally complete for correct invocation.

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

Parameters2/5

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

Schema description coverage is only 50%: session_id is documented in the schema, but the top parameter has only a default and min/max constraints. The description does not explain what top controls or how session_id scopes the summary.

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?

The description clearly states that the tool produces aggregate counts by host/method/status, recent errors, and total sizes for indexed traffic. That distinguishes it from request-level siblings like list_requests and get_request, though it does not name alternatives explicitly.

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?

It implies the tool is for summarized/indexed traffic rather than individual request retrieval, but gives no explicit when-to-use guidance, prerequisites, or comparison to sibling tools such as search_traffic or list_requests.

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

get_statusB

Bridge connectivity, Charles version, recording state, queue/drop counters and active safety settings.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
indexYes
queueNo
settingsYes
recordingNoInferred: a recording session is attached in Charles.
session_idNo
agent_stateNo
bridge_errorNo
dropped_eventsNoEvents dropped by the in-JVM queue (backpressure).
evicted_eventsNo
charles_versionNo
sidecar_versionYes
bridge_connectedYes
charles_version_testedNoTrue if this exact Charles version was verified.
supported_charles_versionsNo

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden, and it does convey that this is a state-reporting read exposing counters and safety settings. It omits whether the call is side-effect free, whether it is cached/cheap, or any auth/latency context an agent would want before polling it.

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?

A single compact clause with zero padding, front-loading the most important item (bridge connectivity). It is a noun phrase rather than a sentence, so it reads as a return-value stub rather than a self-contained definition.

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 output schema already documents return values, so the description's field enumeration largely duplicates structured data instead of adding the guidance an agent needs (when to poll, how it relates to session/traffic tools). For a zero-param diagnostic getter the bar is low, but the description still stops short of full context.

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?

The tool takes zero parameters and the schema is empty, so there is no parameter semantics to explain; baseline 4 applies. The field list in the description maps to returned data rather than inputs, and adds no confusion.

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?

The description enumerates exactly what the tool reports (bridge connectivity, Charles version, recording state, counters, safety settings), so the resource is unmistakable even though there's no explicit verb. It does not differentiate from siblings such as get_session_summary, which could plausibly overlap in reporting state.

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?

There is no statement of when to call this versus get_session_summary or watch_requests, and no exclusions or prerequisites. The agent must infer that this is a health/diagnostic snapshot call.

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

list_requestsB

List captured requests (compact summaries, redacted URLs) with filters and cursor pagination.

NameRequiredDescriptionDefault
hostNoSubstring or glob, e.g. 'api.example.com' or '*.example.com'
afterNoReturn only requests first seen after this cursor (oldest first). Omit to get the most recent requests.
limitNo
stateNo
methodNo
statusNo
since_msNoOnly requests started at/after this epoch ms
until_msNoOnly requests started at/before this epoch ms
url_globNofnmatch pattern on the redacted URL
content_typeNoSubstring of the response MIME type
status_classNo
url_containsNo

Output Schema

NameRequiredDescription
noteNo
itemsYes
matchedYesTotal requests in the index matching the filters.
returnedYes
index_sizeYes
next_afterYesPass as `after` next time to receive only newer requests.
events_lostNoTrue if the bridge evicted events before we could read them.
bridge_connectedYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose two meaningful traits: results are compact summaries with redacted URLs, and pagination is cursor-based. It does not state defaults, ordering semantics beyond what the schema says, safety/read-only nature explicitly, or rate limits. Useful but incomplete for a 12-param tool with zero annotation coverage.

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?

One compact sentence with the resource and the two most important behavioral facts front-loaded. Efficient, though the terseness leaves the 12-parameter surface under-explained.

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?

An output schema exists, so return shape need not be spelled out, and the description does hint at redaction and compactness. But for a tool with 12 optional filter parameters, no annotations, and a non-obvious cursor-vs-time-filter relationship, the description is thinner than the complexity warrants.

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

Parameters2/5

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

Schema description coverage is only 50%; limit, state, method, status, status_class, and url_contains have no descriptions in the schema. The description says only 'with filters,' adding no meaning about what can be filtered, no note on how the filters combine, and no clarification of the since_ms/until_ms vs cursor 'after' relationship — the single most confusing interaction in this schema.

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?

States a specific verb (List) and resource (captured requests), and adds useful scope detail — compact summaries, redacted URLs, cursor pagination — that clarifies what kind of listing this is. It does not explicitly differentiate itself from search_traffic or watch_requests, which is the only thing keeping it from a 5.

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

Usage Guidelines3/5

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

The mention of filters and cursor pagination implies the browse/paginate use case, but there is no explicit when-to-use guidance and no reference to alternatives like search_traffic (broader search) or watch_requests (live streaming). The agent must infer the routing decision from sibling names alone.

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

search_trafficB

Bounded search over redacted URLs, headers and (if enabled) bodies of recent traffic.

NameRequiredDescriptionDefault
hostNo
limitNo
queryYesCase-insensitive substring
fieldsNo
max_scanNoMost recent transactions to scan for headers/bodies

Output Schema

NameRequiredDescription
noteNo
queryYes
matchesYes
bodies_searchedYes
scan_limit_reachedYes
scanned_transactionsYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses that the search is bounded, over recent traffic, and uses redacted URLs/headers while bodies are only searched if enabled, but it does not explicitly state read-only behavior, permissions, performance limits, or what 'bounded' means operationally.

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?

A single compact sentence with no wasted words. The scope ('bounded'), target ('recent traffic'), and field-level caveat ('if enabled') are front-loaded efficiently.

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

Completeness2/5

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

For a 5-parameter search tool with no annotations and only 40% schema coverage, the description is too sparse. The output schema reduces the need to explain return values, but missing guidance on parameter roles, alternatives, and bounded-scan behavior leaves the definition incomplete.

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?

The description maps 'URLs, headers and (if enabled) bodies' to the fields parameter and adds the important redaction qualifier. It does not mention host, limit, max_scan, or the query parameter's semantics, leaving notable gaps given only 40% schema description coverage.

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?

The description uses a specific verb and scope ('Bounded search over ... recent traffic') and names the searchable surfaces (URLs, headers, bodies). It is clear this is a search operation rather than a list or fetch, though it does not explicitly contrast itself with siblings like list_requests or get_request.

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

Usage Guidelines3/5

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

Usage is implied by 'search over ... recent traffic', which suggests a scoped lookup use case. However, there is no explicit guidance about when to choose this over list_requests, get_request, or watch_requests, nor are exclusions or prerequisites stated.

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

watch_requestsB

Raw lifecycle events (request_created ... response_complete/failed) since a cursor. This is a pull: call it again with next_after to get newer events; it does not stream.

NameRequiredDescriptionDefault
afterNoBridge event cursor; 0 = from the oldest retained event
limitNo

Output Schema

NameRequiredDescription
eventsYes
next_afterYes
events_lostYes
bridge_connectedYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the most important trait: this is a non-streaming pull loop, not a subscription. It omits retention/expiry behavior for old cursors, ordering guarantees, and any rate-limit or cost note, which matter for a repeated-poll tool.

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?

Two short sentences, payload first, calling mechanics second — well front-loaded with almost no waste. The only inefficiency is the ambiguous 'next_after' reference, which costs a moment of interpretation rather than adding clarity.

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 tool is simple and an output schema exists, so return values need not be explained. Still, for a cursor-based poller the description should resolve what the next cursor is and what happens when 'after' is stale or past retention, and it leaves that gap plus the next_after/after ambiguity unresolved.

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 50%: 'after' is documented in the schema while 'limit' is not. The description adds cursor-advance semantics but refers to 'next_after', a name that does not exist in the input schema, leaving the agent to guess whether that is a response field or the same thing as 'after'.

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?

The description states a concrete payload: raw lifecycle events (request_created through response_complete/failed) retrieved since a cursor. That is specific enough to separate it from list_requests or get_status, though it never names a sibling or explicitly contrasts 'raw events' with the summarized views the other tools return.

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

Usage Guidelines3/5

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

It explains the calling pattern well — this is a pull, re-invoke to get newer events, it does not stream — which is genuine usage guidance for polling. However it gives no selection criteria against siblings (list_requests, search_traffic, get_session_summary), so an agent knows how to call it but not when to prefer it.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedget_request
    • First observedget_response
    • First observedget_session_summary
    • First observedget_status
    • First observedlist_requests
    • First observedsearch_traffic
    • First observedwatch_requests

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation4/5

The tools mostly target distinct inspection needs: status, compact listing, single request, single response, search, aggregate summary, and lifecycle events. Some overlap exists between list_requests, search_traffic, and watch_requests, but their descriptions clarify filtering, bounded search, and cursor-based event pulling respectively.

Naming Consistency5/5

All names use consistent snake_case and a clear verb_noun pattern such as get_status, list_requests, get_request, and search_traffic. The set is predictable and easy to scan.

Tool Count5/5

Seven tools is well-scoped for a traffic inspection server, covering listing, detail views, search, summary, status, and event watching without obvious redundancy. Each tool has a clear place in the inspection workflow.

Completeness4/5

The surface covers the core read-only inspection lifecycle, including status, captured requests, request/response details, search, summary, and live event polling. It lacks control or maintenance operations such as starting/stopping recording, clearing traffic, or exporting captures, but those may be intentionally out of scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    The self-hosted MCP bridge between Claude Chat and Claude Code.
    46
    AGPL 3.0
  • A
    license
    B
    quality
    B
    maintenance
    Integrates Charles Proxy with MCP clients to provide real-time and historical network traffic capture and structured analysis. It features a summary-first approach that filters noise and desensitizes data for efficient, low-token agent debugging and monitoring.
    18
    107 PyPI
    326
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Read-only MCP server that brings Reqable's captured HTTP traffic into Claude Code conversations, enabling querying, searching, waiting for, and analyzing requests without requiring Reqable Pro.
    7
    MIT