charles-mcp
Provides read-only, live access to the HTTP(S) traffic Charles Proxy is currently capturing, allowing agents to list recent requests, inspect request/response headers, timing, TLS details and (optionally) bodies, search traffic, and get session summaries — with credentials redacted and host allowlists limiting visibility.
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+.
Download
charles-mcp-<version>-windows.zipfrom the latest release and unzip it.Close Charles, then double-click
Install.cmd. Click Yes when Windows asks for permission.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.ps1Then install the MCP server:
$ pip install ./pythonExample
Connect it
Add the server to your MCP client. For Claude Code:
$ claude mcp add charles -- charles-mcpConfigs 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 |
| Recent requests, newest first. Filter by host, method, status, URL, content type or time. Pass |
| Method, URL, headers, timing and sizes, plus the body if you ask for it. |
| Status, headers, timing, TLS details and errors, plus the body if you ask for it. |
| Searches URLs, headers and (if enabled) bodies, and returns snippets. |
| Counts by host, method and status, recent errors and totals. |
| Raw lifecycle events since a cursor. |
| 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-mcpEven 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 |
| Charles isn't running with the bridge. Re-run the installer and restart Charles. |
| Charles exited abruptly. Restart it. |
| Start recording in Charles. |
Requests from your app are missing | Check that the app uses Charles as its proxy, and check your host filters. |
| 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]" && pytestTo 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-mcpSee 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 toolsget_requestC
Request line, headers (redacted), timing, sizes and optionally the bounded/redacted request body.
| Name | Required | Description | Default |
|---|---|---|---|
| include_body | No | Fetch a bounded, redacted request body (needs bodies enabled) | |
| max_body_bytes | No | ||
| transaction_id | Yes | transaction_id from list_requests (e.g. 't42'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| body | Yes | |
| host | Yes | |
| port | Yes | |
| state | Yes | |
| method | Yes | |
| scheme | Yes | |
| timing | Yes | |
| headers | Yes | |
| body_bytes | Yes | |
| redactions | Yes | Number of values replaced with [REDACTED] in this result. |
| session_id | Yes | |
| content_type | Yes | |
| header_bytes | Yes | |
| transaction_id | Yes | |
| protocol_version | Yes | |
| attached_to_session | No | False once cleared from the Charles session. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include_body | No | Fetch a bounded, redacted response body (needs bodies enabled) | |
| max_body_bytes | No | ||
| transaction_id | Yes | transaction_id from list_requests (e.g. 't42'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| error | Yes | |
| state | Yes | |
| status | Yes | |
| timing | Yes | |
| headers | Yes | |
| body_bytes | Yes | |
| connection | Yes | |
| redactions | Yes | |
| content_type | Yes | |
| header_bytes | Yes | |
| charles_status | Yes | |
| transaction_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| session_id | No | Limit to one Charles session |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | Yes | |
| by_host | Yes | |
| removed | Yes | |
| complete | Yes | |
| by_method | Yes | |
| by_status | Yes | |
| in_flight | Yes | |
| session_ids | Yes | |
| transactions | Yes | |
| last_start_ms | Yes | |
| recent_errors | Yes | |
| first_start_ms | Yes | |
| by_status_class | Yes | |
| bridge_connected | Yes | |
| total_request_bytes | Yes | |
| total_response_bytes | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| index | Yes | |
| queue | No | |
| settings | Yes | |
| recording | No | Inferred: a recording session is attached in Charles. |
| session_id | No | |
| agent_state | No | |
| bridge_error | No | |
| dropped_events | No | Events dropped by the in-JVM queue (backpressure). |
| evicted_events | No | |
| charles_version | No | |
| sidecar_version | Yes | |
| bridge_connected | Yes | |
| charles_version_tested | No | True if this exact Charles version was verified. |
| supported_charles_versions | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Substring or glob, e.g. 'api.example.com' or '*.example.com' | |
| after | No | Return only requests first seen after this cursor (oldest first). Omit to get the most recent requests. | |
| limit | No | ||
| state | No | ||
| method | No | ||
| status | No | ||
| since_ms | No | Only requests started at/after this epoch ms | |
| until_ms | No | Only requests started at/before this epoch ms | |
| url_glob | No | fnmatch pattern on the redacted URL | |
| content_type | No | Substring of the response MIME type | |
| status_class | No | ||
| url_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| items | Yes | |
| matched | Yes | Total requests in the index matching the filters. |
| returned | Yes | |
| index_size | Yes | |
| next_after | Yes | Pass as `after` next time to receive only newer requests. |
| events_lost | No | True if the bridge evicted events before we could read them. |
| bridge_connected | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| limit | No | ||
| query | Yes | Case-insensitive substring | |
| fields | No | ||
| max_scan | No | Most recent transactions to scan for headers/bodies |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| query | Yes | |
| matches | Yes | |
| bodies_searched | Yes | |
| scan_limit_reached | Yes | |
| scanned_transactions | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Bridge event cursor; 0 = from the oldest retained event | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| events | Yes | |
| next_after | Yes | |
| events_lost | Yes | |
| bridge_connected | Yes |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
get_request - First observed
get_response - First observed
get_session_summary - First observed
get_status - First observed
list_requests - First observed
search_traffic - First observed
watch_requests
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Hosted X (Twitter) MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceThe self-hosted MCP bridge between Claude Chat and Claude Code.46AGPL 3.0
- AlicenseBqualityBmaintenanceIntegrates 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.18107 PyPI326MIT
- AlicenseNot gradedqualityDmaintenanceRead-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.7MIT
- AlicenseNot gradedqualityDmaintenanceLocal MCP bridge that exposes the ChatGPT Figma connector to OpenCode without launching Codex, using the existing authenticated session.MIT