proxy-mcp
This MCP server runs a local HTTPS MITM proxy to intercept, mock, and transform network traffic from Android devices and emulators, with no app source changes.
Proxy Management: Start/stop the proxy on a configurable port, with optional passthrough hosts and host rewrites (e.g., map 10.0.2.2 to 127.0.0.1). Check proxy health for state, rule counts, captured traffic, and warnings.
Mock Responses: Register static mock responses for URL patterns (glob, substring, regex) with method matching, custom status/headers, and body from inline or file. List and clear mock rules.
Response Transforms: Intercept requests, forward to backend, apply JSON patches in-place. Use dotted paths, array wildcards (
[]),whereconditions, and dynamic timestamp macros (__NOW__,__NOW_PLUS_<N><UNIT>__). Add, idempotently upsert, list, or clear transform rules.Request Transforms: Modify outgoing requests before forwarding: set/remove headers, query params, or body. Add, upsert, list, clear request transform rules.
Dry-Run Probes: Perform a one-shot dry-run of response transforms on a URL without registering, showing before/after values.
Traffic Inspection: List captured traffic with transform outcomes (
patched,no_match,error), patches applied, and optional body previews. Export to JSON or HAR; sensitive headers redacted by default.Persistence: Save and load all active response and request transform rules to/from a JSON file for reuse across proxy restarts.
CA Certificate: Display CA SHA-256 fingerprint and setup instructions; optionally push the Charles Proxy CA to a USB-connected Android device via adb.
Enables network-level HTTP/HTTPS MITM proxying and mock response injection for real Android devices and emulators via adb, allowing AI agents to intercept and transform traffic from Android apps without source changes.
Uses the Charles Proxy CA certificate for SSL interception, requiring the Charles-exported cert and key to enable HTTPS MITM on the proxy.
Provides automatic passthrough of Metro bundler requests on port 8081 to the local dev server, stripping certain headers to avoid breaking the bundler.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@proxy-mcpstart proxy on port 8889 and passthrough localhost:8081"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
proxy-mcp
MCP server for AI agents to run a local HTTPS MITM proxy and mock headend/backend responses on real Android devices — at the network level, with zero app source changes.
Intercepts HTTP/HTTPS traffic from physical devices and emulators
Registers mock responses and JSON transform rules via MCP tools
Modifies outgoing requests (headers / query / body) via request-transform rules
Probes transforms before registering (one-shot dry-run patch)
Persists/restores transform rules across proxy restarts
Tracks per-request transform outcomes — distinguish patched, no_match, error
Gzip-safe — transparently decompresses, patches, and recompresses
Rewrites passthrough hosts (e.g. Android emulator
10.0.2.2→127.0.0.1)Simulates slow servers on mocks:
delayMsprocessing time +bandwidthKbpsstreaming capCapture scoping (
proxy_scope): retain only the hosts you're investigating so the log stays smallCLI fallback when MCP is unavailable
Charles-only CA
This proxy must use the same CA certificate that the target app's network_security_config.xml trusts. The only supported path is the Charles Proxy CA — no auto-generation, no Frida, no alternative CAs.
Related MCP server: proxy-mcp
Requirements
Node >= 18
adbon PATH (for device proxy setup)Charles Proxy CA (cert + key exported from Charles)
Setup
No clone needed. The server is installed from the npm registry (prebuilt dist/ — no devDeps, no build step), then registered with your MCP client.
# verify the CLI works once
npx -y @shahfazliz/proxy-mcp@latest --helpUpdates: use
@latestso new releases are picked up automatically — no cache clearing, no config changes. If you need reproducibility (e.g. comparing behavior across sessions), pin a specific version like@0.1.1instead.
1. Extract your Charles Proxy CA
Charles stores its CA at ~/Library/Application Support/Charles/ca/. Extract the cert and key into your project's .proxy-ca/ directory:
Step 1: Export the Charles CA (one-time setup)
In Charles: Help → SSL Proxying → Export Charles Certificate and Private Key
Save as
.p12file (password-protected or empty password - your choice)
Step 2: Extract to .proxy-ca/
.proxy-ca can be anywhere on your computer. I like to put them in ~/.certificates/ where I put all other certs there
# If exported with password
npx proxy-mcp-cli ca:import --p12 ~/path/to/charles-ssl-proxying.p12 --password yourpassword
# If exported with empty password (default)
npx proxy-mcp-cli ca:import --p12 ~/path/to/charles-ssl-proxying.p12
# Or manually extract
mkdir -p .proxy-ca
openssl pkcs12 -in ~/path/to/charles-ssl-proxying.p12 \
-nocerts -nodes -passin pass:yourpassword -out /path/to/.proxy-ca/key.pem
openssl pkcs12 -in ~/path/to/charles-ssl-proxying.p12 \
-clcerts -nokeys -passin pass:yourpassword -out /path/to/.proxy-ca/cert.pemBoth files must be clean PEM (no Bag Attributes, no PKCS12 wrapping). The key must be an unencrypted RSA private key.
2. Register with Cursor / any MCP client
Use @latest to always get the newest release (see the note in Setup):
{
"mcpServers": {
"shah-proxy": {
"command": "npx",
"args": [
"-y",
"@shahfazliz/proxy-mcp@latest",
"--ca-dir",
"/absolute/path/to/.proxy-ca"
],
"enabled": true
}
}
}Alternative for zero-npx: npm install -g @shahfazliz/proxy-mcp, then set command to proxy-mcp with the same args. Update with npm update -g @shahfazliz/proxy-mcp.
--ca-dir must point to a directory containing cert.pem and key.pem (see step 1). If you omit it entirely, the server auto-discovers the CA in order: <cwd>/.proxy-ca, ~/.proxy-ca, then ~/Library/Application Support/Charles/ca — and reports which source it used (see proxy_health.caStatus → source).
Quick start
# 1. Start proxy (port 8889, Metro dev server passthrough)
proxy_start --passthroughHosts '["localhost:8081"]'
# On an Android emulator, also map its 10.0.2.2 alias to the host loopback
# so Metro/dev-server passthrough can reach the Mac:
proxy_start --port 8889 --passthroughHosts '["10.0.2.2:8081"]' \
--hostRewrites '[{ "match": "10.0.2.2:8081", "upstream": "127.0.0.1:8081" }]'
# 2. Point device at the proxy
adb -e shell settings put global http_proxy 10.0.2.2:8889 # emulator
adb -s <ip> shell settings put global http_proxy <lan>:8889 # physical
# 3. Probe a transform before registering (dry-run)
proxy_probe_transform --url https://api.example.com/items \
--patches '[{ "path": "items[]", "set": { "endTime": "__NOW_PLUS_2M__" } }]'
# 4. Register the transform
proxy_update_transform --method GET --url viewMultiviews \
--patches '[{ "path": "items[]", "where": { "isMultiview": true }, "set": { "endTime": "__NOW_PLUS_2M__" } }]'
# 5. Traffic observability — check transform outcomes per request
proxy_list_traffic --filter viewMultiviews
# 6. Clean up
adb -e shell settings put global http_proxy :0
proxy_stopMCP tools (21)
Tool | Purpose |
| Start/stop the MITM proxy |
| Full preflight: running state, version, capabilities, CA status (cert/key present + matching + fingerprint), detected LAN IP, port availability, suggested |
| Static mock response for a URL pattern |
| JSON transform rule for a URL pattern |
| Idempotent upsert of a transform rule |
| Manage mock responses |
| Manage transform rules |
| Modify outgoing requests (headers/query/body) before forwarding |
| Manage request-transform rules |
| Idempotent upsert of a request-transform rule |
| Captured requests with transform outcomes + optional body previews |
| One-shot fetch + dry-run patch, returns before/after |
| Persist/restore response + request transforms to JSON file |
| Set/clear capture scope: which hosts' traffic is retained in the log |
| Running vs published version + changelog of recent releases |
| CA fingerprint, trust model (app-bundled vs device install), setup instructions |
The server also ships an instructions block (delivered during MCP initialization) that tells agents the canonical workflow and gotchas, so they don't need this README to get a first run working.
Full parameter docs for each tool live in the proxy_start / proxy_* tool schemas (visible to MCP clients), plus the project wiki (a local Obsidian vault — not committed to this repo).
App dependency
Your debug APK must trust the proxy's CA. For an Android TV app:
Set
enableSystemProxy=trueinapps/tv/android/gradle.propertiesThis bakes the CA cert into the APK via
res/raw/cacertVerify the fingerprint from
ca_infomatches the app's bundled cert
No device-side CA installation, no root, no Magisk needed — trust is app-bundled.
CLI fallback
npx proxy-mcp-cli start --port 8889 --passthrough 10.0.2.2:8081 --host-rewrite 10.0.2.2:8081=127.0.0.1:8081
npx proxy-mcp-cli status
npx proxy-mcp-cli ca-info
npx proxy-mcp-cli ca:import --p12 /path/to/charles-ssl-proxying.p12
npx proxy-mcp-cli transform add GET "https://..." patches.json
npx proxy-mcp-cli req-transform add GET viewBundle setHeaders='{"x-custom":"v"}' list
npx proxy-mcp-cli traffic --filter example
npx proxy-mcp-cli mock add GET "https://example.com/api/people" /tmp/fixture.json --delay 2000 --bandwidth 50
npx proxy-mcp-cli scope set api.example.com # retain only interesting hosts
npx proxy-mcp-cli scope getMock speed control
proxy_mock_response (and the CLI mock add command) accept two optional knobs to simulate a slow, far-away server — useful when you want to reproduce loading states, spinners, or timeouts on the device:
delayMs— server processing time. The proxy waits this long before sending a single byte.bandwidthKbps— network bandwidth cap. The body is re-streamed at this rate (KB/s), so a large payload arrives progressively instead of all at once.
{
"method": "GET",
"url": "api.example.com/v1/user",
"bodyFile": "/tmp/user.json",
"delayMs": 2000,
"bandwidthKbps": 50
}Both are optional and independent; combine them for a full "slow server" experience.
Capture scoping
During bug investigation, proxy_list_traffic returns every captured host into the agent's context — noisy and token-heavy. scope restricts which traffic is retained:
The proxy still MITMs and serves all hosts (discovery is unaffected) — scope only controls what appears in the log.
Scope by hostname, not path:
api.example.comkeeps that host plus its subdomains (sub.api.example.com);*.example.comwildcards are also accepted.Narrow it mid-session: start wide, then scope once the interesting host shows up.
Already-captured entries are unaffected when you change scope.
At start (via proxy_start or CLI):
{ "scope": ["api.example.com"] }npx proxy-mcp-cli start --port 8889 --scope api.example.com,cdn.example.comAt runtime (MCP tool or CLI):
proxy_scope --hosts '["api.example.com"]' # set scope
proxy_scope # clear scope (retain all)npx proxy-mcp-cli scope set api.example.com,cdn.example.com
npx proxy-mcp-cli scope clear
npx proxy-mcp-cli scope getDefault scope: [] (or unset) = capture all traffic, matching the pre-scoping behavior.
Allowed directories
File-access tools (bodyFile on mocks, proxy_save_transforms, proxy_load_transforms, and CLI patch files) only read/write inside the folder the proxy was launched from. Add other directories at launch with a repeatable --allowed-dir <path> flag or the SHAH_PROXY_ALLOWED_DIRS env var (comma-separated). The list is fixed at startup — tools cannot widen it at runtime.
npx proxy-mcp-cli --allowed-dir /Users/me/shared-fixtures startMetro passthrough
The proxy automatically forwards Metro bundler requests (:8081) to the local dev server. Headers like newrelic, traceparent, tracestate, and accept-encoding are stripped from forwarded Metro requests to avoid breaking the bundler.
localhost:8081, 127.0.0.1:8081, and the detected LAN IP at :8081 are always auto-added to passthrough — pass passthroughHosts only for additional hosts.
Android emulator host rewrites (hostRewrites)
Android emulators reach the host machine's loopback via the special alias 10.0.2.2. That address only exists inside the emulator's network namespace — it is not a real, reachable address from the Mac. When the app calls Metro through the proxy with Host: 10.0.2.2:8081, the proxy must translate it to 127.0.0.1:8081 before dialing, or the fetch hangs / returns 502 Error communicating with upstream server.
Pass hostRewrites to proxy_start:
{
"port": 8889,
"passthroughHosts": ["10.0.2.2:8081"],
"hostRewrites": [
{ "match": "10.0.2.2:8081", "upstream": "127.0.0.1:8081" }
]
}match— the host:port as it arrives in the request (hostname orhostname:port).upstream— the host:port the proxy should actually dial instead.Applies to both HTTP passthrough and WebSocket passthrough targets.
Add
10.0.2.2(and its port) topassthroughHostsas well, so the request is not MITM'd before the rewrite happens.proxy_healthreports the activehostRewritesandpassthroughHosts, so the agent can verify the mapping took effect.CLI equivalent:
--host-rewrite 10.0.2.2:8081=127.0.0.1:8081.
Releasing
Publish a new version to npm. Users on @latest get it automatically on next launch — no git installs, no cache clearing:
npm run release:patch # or release:minor / release:majorThis runs npm version <level> (bump + tag) then npm publish (builds, publishes, sets the latest tag). Prefer semver: patch for bug fixes, minor for new features, major for breaking changes.
Git-ignored (keep local)
.proxy-ca/— CA private key + certtransforms.json— auto-saved on proxy stoptraffic-*.json/*.har— exported traffic logs*.p12,cacert.pem— raw Charles exports
License
UNLICENSED — internal tool. Not distributed publicly.
Available Tools
21 toolsca_infoCA path, trust model, and install instructionsA
Report the CA in use (directory, source, fingerprint, and whether cert.pem/key.pem are present AND match) plus per-platform instructions. There are two distinct trust paths: (1) app-bundled trust for TV / debug builds — the cert is compiled into the app (res/raw/cacert) and the README's 'No device-side CA install, no root, no Magisk' workflow applies; (2) explicit device CA install for phones/browsers — install once via Settings, or adbPush=true over USB (this does NOT apply to TV builds). Use proxy_health.caStatus for the same validity checks without the instructions.
| Name | Required | Description | Default |
|---|---|---|---|
| adbPush | No | If true, run `adb push` to copy the CA cert to a USB-connected Android PHONE (not TV/debug builds). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that the tool reports CA information and can also run adb push when adbPush=true, which modifies the device, while noting this does not apply to TV builds. It clearly separates read-only reporting from the installation side effect.
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?
The description is concise despite its length, organized with numbered trust paths and a clear pointer to an alternative tool. Every sentence adds meaningful information, and the structure makes it easy to parse key usage conditions.
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?
Given the tool's moderate complexity (one optional parameter, no output schema, no annotations), the description is comprehensive. It covers the tool's output, platform-specific behavior, trust model distinction, and parameter usage, leaving no critical gaps for an agent to invoke it correctly.
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 single parameter adbPush is fully described in the schema (100% coverage), but the tool description adds contextual meaning by linking it to the device CA install trust path and explicitly excluding TV builds. This goes beyond the schema, aiding correct parameter selection.
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 the tool's purpose: to report the CA in use, including directory, source, fingerprint, and presence/match of cert.pem/key.pem, along with per-platform instructions. It distinguishes itself from the sibling proxy_health by pointing to proxy_health.caStatus for validation-only checks, making the unique value explicit.
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 description explicitly explains when to use this tool versus an alternative: 'Use proxy_health.caStatus for the same validity checks without the instructions.' It also provides detailed context for two trust paths and clarifies that adbPush applies only to phones/browsers, not TV/debug builds, preventing misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_clear_mocksClear mock rulesA
Remove one mock rule by id, or all rules if no id is given.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Rule id to remove. Omit to clear all rules. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses the destructive behavior ('remove... all rules if no id is given'), which is important. However, it doesn't disclose whether this is reversible, whether bulk clearing affects shared state, or what happens if an id doesn't exist. The core mutation behavior is adequately disclosed.
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 sentence that fully communicates both usage modes. Zero wasted words. Every element earns its place. Ideal conciseness for a simple 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?
This is a simple tool: 1 optional parameter, no output schema, no nested objects. The description covers the two modes adequately. However, for a destructive operation with no annotations, it could note whether the operation returns confirmation, affects persistent state, or has cascade effects on transforms referencing removed mock rules. Given the low complexity, the description is mostly sufficient but leaves some behavioral gaps.
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 100% and there is only 1 parameter (id), already documented with 'Rule id to remove. Omit to clear all rules.' The description adds the alternative behavior (omit = clear all), which is valuable context beyond the schema. Baseline 3 is appropriate for full coverage with a single well-documented parameter.
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 what the tool does: 'Remove one mock rule by id, or all rules if no id is given.' It uses a specific verb (remove/clear) with a specific resource (mock rules). Distinguishes from siblings like proxy_clear_transforms by naming mock rules specifically. Could mention it's a destruction-like operation but the core purpose is clear.
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 description explains the two modes of use (by id vs. clear all), which is useful guidance. However, it doesn't explicitly state when to use this tool vs alternatives like proxy_clear_transforms or proxy_update_transform, nor does it warn about destructive effects of omitting the id. The dual-mode behavior is implied but the consequences aren't spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_clear_request_transformsClear request-modification rulesA
Remove one request transform rule by id, or all rules if no id is given.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Rule id to remove. Omit to clear all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. 'Remove' implies a destructive action, and the dual mode (single vs all) is disclosed. However, it does not reveal side effects — e.g., whether clearing all rules has irreversible consequences, whether a non-existent id errors or silently succeeds, or any confirmation/undo behavior. For a destructive operation this is a moderate gap.
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?
The description is a single concise sentence that packs both purpose and the two usage modes with zero wasted words. It is perfectly front-loaded: verb first, resource second, scope condition immediately after. Nothing extraneous.
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 single-parameter tool with no output schema, the description is reasonably complete: it explains purpose, the two modes, and the conditional semantics of the parameter. Given the tool's low complexity, this is largely adequate. A small gap: no guidance on behavior for invalid/nonexistent ids and no explicit callout that this is a destructive operation, but the 'Remove' verb already conveys that.
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 100% — the single 'id' parameter is documented ('Rule id to remove. Omit to clear all.'). The description's phrase 'by id, or all rules if no id is given' reinforces the parameter's conditional semantics and explicitly covers the omit-to-clear-all usage. This adds modest value beyond the schema's own description but does not go deeper (e.g., id format, validation behavior).
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 the verb ('Remove') and resource (request transform rule) with scope distinction: 'by id, or all rules if no id is given'. It distinguishes from siblings like proxy_update_request_transform (which modifies instead of removes) and proxy_clear_transforms (which clears a different resource type — transforms vs request transforms). The title adds redundant information but the description carries clear intent.
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 description clarifies the two usage modes (single rule by id vs all rules when id omitted), which is useful guidance. However, it does not explicitly state when to prefer this over proxy_clear_transforms or when not to use it (e.g., if rules need to be preserved). The context around when 'clear all' is risky vs selective removal is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_clear_transformsClear transform rulesB
Remove one transform rule by id, or all transform rules if no id is given.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Transform rule id to remove. Omit to clear all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description indicates a destructive/removal action ('remove', 'clear all'), but it doesn't state whether removal is reversible, whether 'clear all' is destructive without confirmation, whether saved transform rules are affected, or whether the operation persists across restarts. For a destructive operation with zero annotation coverage, this is a meaningful gap.
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 sentence, zero waste. It communicates the primary action and the id-optional behavior efficiently. There is nothing extraneous to trim.
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 simple single-parameter, no-output-schema tool, the description is largely adequate. However, given the destructive 'clear all' behavior and a large sibling family (including proxy_clear_request_transforms and proxy_clear_mocks), the lack of guidance about what 'transforms' encompasses as a category, and the absence of any note about persistence or reversibility, leaves the description slightly under-complete for a destructive tool with no annotations.
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 100%, so the schema already documents the single 'id' parameter well ('Transform rule id to remove. Omit to clear all.'). The description reiterates this but adds no additional semantic value beyond the schema—it restates the same mode logic without adding format, validation, or example details. Baseline 3 is appropriate when schema does the heavy lifting.
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 ('remove') with a clear resource ('transform rule'), and explicitly states the two modes: remove one by id, or clear all if no id given. This is clear, though it doesn't explicitly distinguish from sibling tools like proxy_clear_request_transforms, which is a separate resource.
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 description clearly states when to remove one vs all rules (by whether an id is given). However, it doesn't explicitly direct the user to a specific sibling tool for the alternative case, nor does it explain when NOT to use this tool in favor of proxy_clear_request_transforms, proxy_update_transform, or proxy_clear_mocks. The mode distinction is helpful but exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_healthCheck proxy health and diagnostics (preflight)A
Full preflight/diagnostics. Always returns: running, version, capabilities, caStatus (dir, source, fingerprint, whether cert.pem/key.pem match), rule counts, captured-traffic count, and warnings. While the proxy is stopped it also returns detectedLanIp, whether the default port is free, and suggestedStart (ready-to-use proxy_start arguments). Use this first — it tells you everything needed to get running without shelling out.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It thoroughly discloses the tool's behavior: 'Always returns' a specific list of fields, and conditionally returns additional fields 'While the proxy is stopped.' This transparently explains the state-dependent behavior and that it is a read-only diagnostic.
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?
The description is concise and front-loaded with 'Full preflight/diagnostics.' It efficiently lists the return fields and conditional behavior in two sentences without unnecessary fluff, earning every sentence's 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?
Despite having no output schema, the description thoroughly enumerates all return values and their conditional presence. It also includes usage guidance, making it a complete and self-contained description for a simple, parameterless tool.
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 has zero parameters and schema coverage is trivially 100%. Baseline for zero parameters is 4. The description adds meaning by explaining what the tool returns rather than parameters, which is appropriate since there are none to document.
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 the tool's purpose: 'Full preflight/diagnostics' for proxy health. It distinguishes itself from siblings by emphasizing this is the initial check to run, and the title 'Check proxy health and diagnostics (preflight)' reinforces the specific verb and resource.
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 description explicitly says 'Use this first — it tells you everything needed to get running without shelling out.' This provides a clear when-to-use directive, positioning it as the preflight step before starting the proxy. It does not name alternatives or explicitly say when not to use, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_list_mocksList active mock rulesB
View the active in-memory mock rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description only states that the tool lists 'active in-memory mock rules' but does not disclose what exactly is returned (format, structure), whether the list reflects only unexpired or all rules, or any side effects. While it's likely a read-only operation, the lack of explicit non-mutating behavior disclosure is a gap, especially 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?
The description is a single, clear sentence with zero waste. It's appropriately sized for a zero-parameter list tool. Slightly more context on the return value could have been included, but the description is efficiently compact for what it needs to communicate.
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 zero-parameter, no-output-schema tool, the description is reasonably complete but could be richer. It doesn't describe what the returned mock rules list looks like (fields, format) or how it relates to the mock lifecycle siblings like proxy_mock_response and proxy_clear_mocks. Given the tool's simplicity and no schema/output schema to lean on, a bit more behavioral context would improve completeness.
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?
This tool has 0 parameters, so there are no parameter semantics to convey. Per the guidelines, 0 params earns a baseline of 4. The description doesn't need to add anything about parameters since there are none to explain.
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 'View the active in-memory mock rules' clearly uses a specific verb (view/list) and resource (active in-memory mock rules). It distinguishes from siblings like proxy_list_transforms and proxy_list_traffic since it specifies 'mock rules' specifically. The title 'List active mock rules' reinforces the purpose without being a pure tautology since it adds 'in-memory' context.
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 description implies the tool is for viewing mock rules that are in-memory (as opposed to persisted or transforms), which gives some usage context. However, there is no explicit when-to-use guidance, no exclusions, and no mention that it pairs with proxy_add_mock / proxy_clear_mocks for managing the mock rules lifecycle. The purpose is clear but the guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_list_request_transformsList active request-modification rulesB
View the active request transform rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. The description only states it views the rules, with no mention of what 'active' means, whether results are sorted, whether it's a read-only safe operation, or what the output format is. With zero annotation coverage, this is a minimal disclosure.
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?
The description is a single concise sentence ('View the active request transform rules') with zero waste. However, it arguably lacks enough substance to be 'front-loaded' with meaningful content, making it minimal rather than rich.
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 read-only listing tool with no parameters, no annotations, and no output schema, the description is thin. It would benefit from stating that this is a safe read operation (especially given no annotations exist), clarifying the distinction from 'active' vs 'saved' transforms, and noting read-only characteristics given other sibling tools like proxy_update_request_transform and proxy_save_transforms exist.
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 has 0 parameters and 100% schema coverage (trivially, since properties is empty). Per the rubric, 0 params = baseline 4. The description appropriately doesn't need to document parameters that don't exist.
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 title 'List active request-modification rules' is specific (verb='list', resource='request-modification rules'), and the description 'View the active request transform rules' confirms the purpose. However, the description itself is somewhat generic and doesn't differentiate from sibling tools like proxy_list_transforms or proxy_list_mocks, though the title provides clearer differentiation.
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?
No guidance on when to use this tool vs alternatives. Given sibling tools like proxy_list_transforms, proxy_list_mocks, and proxy_list_traffic, it would be valuable to clarify when request transforms are relevant (e.g., for HTTP request interception vs response mocking). The description does not address any usage exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_list_trafficList / export captured trafficA
Confirm a rule matched the intended request by inspecting captured traffic. Each entry includes transformOutcome (patched|no_match|not_json|error) and patchesApplied count. Sensitive headers (authorization, cookies, api keys) are redacted by default — set includeSensitiveHeaders=true to see raw values. Use includeRequestBodyPreviews=true to see POST/PUT body content. Use includeResponseBodyPreviews=true for response samples. Optionally export to JSON or HAR (replaces the Charles log-export workflow).
| Name | Required | Description | Default |
|---|---|---|---|
| export | No | Write captured traffic to a file. | |
| filter | No | Case-insensitive substring filter on method or URL. | |
| includeBodies | No | Include response body previews (default false). Deprecated: use includeResponseBodyPreviews. | |
| includeSensitiveHeaders | No | Include raw sensitive headers (authorization, cookies, api keys) in the output. Default false — values are redacted as [REDACTED]. | |
| includeRequestBodyPreviews | No | Include request body previews (default false). | |
| includeResponseBodyPreviews | No | Include response body previews (default false). |
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, and it performs well. It discloses the transformOutcome values and patchesApplied count available, explicitly states sensitive headers are redacted by default and how to opt into raw values, and explains body preview options. This is substantial behavioral detail that significantly aids agent decision-making. Notably, it doesn't flag any destructive or side-effect behavior, which is important for a read/list operation.
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?
The description is a tight, information-dense paragraph with zero redundancy. Every sentence adds value: purpose, output traits, redaction behavior, three boolean flag explanations, and export capability. It front-loads the purpose and progressively adds options. No wasted words.
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 read-only listing tool with 100% schema coverage and no output schema required, the description is thorough. It covers the key behavioral concerns (redaction, preview options, export formats), explains output fields (transformOutcome, patchesApplied), and provides the use case. It's complete enough for an agent to confidently select and invoke this tool.
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 100%, so the baseline is 3, and the description adds meaningful value beyond the schema. It clarifies the export parameter's JSON/HAR format rationale (Charles log-export replacement) and explains what includeSensitiveHeaders does in prose (explaining redaction default). The description reinforces parameter purpose and adds context about what each inclusion flag reveals. It loses one point because it doesn't fully clarify the 'filter' parameter semantics beyond what the schema already states.
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 clear purpose: inspect captured traffic to confirm a rule matched the intended request. It specifies the tool operates on 'captured traffic' and its sibling context (proxy_list_* tools) distinguishes it from mocks/transforms listing tools. It doesn't explicitly name siblings as alternatives but the context makes differentiation reasonably clear. A specific verb+resource with clear purpose, though it could explicitly distinguish from proxy_list_transforms.
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 description implicitly conveys usage context (confirm a rule matched) and explains when to use flags like includeSensitiveHeaders, includeRequestBodyPreviews, and export for JSON/HAR. It doesn't explicitly say when NOT to use this vs alternatives, but the sibling tool names and context strongly imply the alternatives. The export functionality positions it as a replacement for Charles log-export workflow, giving additional context. Could be improved with explicit exclusions but is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_list_transformsList active transform rulesB
View the active intercept-and-transform rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description only says 'View' which implies a read-only operation, but doesn't describe the return format, whether the output is structured or free-form, pagination, or any side effects. For a read-only tool with no annotation fallback, this is thin.
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 concise sentence that states the purpose clearly with zero filler words. Every word earns its 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?
For a zero-parameter read-only tool, the description is functionally adequate for invoking the tool. However, with no output schema and no annotation coverage, it lacks behavioral context entirely. The agent cannot know what the response will contain, which matters given the many sibling tools that might produce similar-looking output.
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 has 0 parameters with 100% schema coverage (empty schema properties). Since there are no parameters to document, the description doesn't need to add parameter semantics. Baseline of 4 for a 0-parameter tool is appropriate.
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 'View the active intercept-and-transform rules' states a clear verb (View) and specific resource (active intercept-and-transform rules). It distinguishes from siblings like proxy_list_request_transforms and proxy_list_mocks by specifying 'intercept-and-transform rules'. Could be slightly clearer about what distinguishes 'transform rules' from request transforms, but the purpose is clear.
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?
No guidance on when to use this tool vs alternatives. With 18 siblings including proxy_list_request_transforms, proxy_list_mocks, and proxy_list_traffic, the description does not help an agent choose between listing transforms versus request transforms versus mocks. No when/when-not guidance or exclusions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_load_transformsLoad transform rules from a JSON fileB
Load transform rules previously saved with proxy_save_transforms. Uses idempotent upsert (requires proxy to be running).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path to load from (default: transforms.json in project root). Must be inside the proxy's allowed directories (default: the folder the proxy was launched from); extend with --allowed-dir <path>. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the 'requires proxy to be running' prerequisite and mentions 'idempotent upsert' semantics, which is useful. However, it doesn't disclose failure behavior (e.g., what happens with invalid JSON), whether existing rules are replaced or merged, or any error conditions beyond proxy not running.
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 compact sentences that convey the purpose, the pairing with the save counterpart, and the key behavioral note (idempotent upsert, requires running proxy). The parameter-relevant detail is appropriately pushed into the schema. No wasted words.
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 single-parameter tool with full schema coverage and no output schema, the description covers the essentials: what it does, what it needs, and the operational prerequisite. The 'idempotent upsert' phrasing is a bit terse and could benefit from explaining what upsert means in this context (merge vs replace semantics). But given the simplicity of the tool, this is reasonably complete.
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 100%, so the schema documents the 'path' parameter well. The description adds valuable context beyond the schema: it explains the default value behavior ('transforms.json in project root'), the allowed-directories constraint, and how to extend the allowed paths with --allowed-dir. This compensates beyond what the schema alone provides.
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 the action ('Load transform rules') with a specific resource ('from a JSON file') and references the sibling tool proxy_save_transforms as the counterpart. However, it doesn't strongly differentiate itself from proxy_update_transform or other transform-related siblings in terms of what makes this distinct.
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 mentions 'previously saved with proxy_save_transforms' implying the pairing relationship, and notes 'requires proxy to be running' as a prerequisite. However, it doesn't explicitly state when NOT to use this versus alternatives like proxy_update_transform, leaving the agent to infer when bulk-loading is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_mock_responseAdd a mock ruleA
Add an in-memory mock rule. Matches on HTTP method + URL pattern (glob/substring by default against the full URL; set regex=true for a raw regex). Body is supplied inline or via a fixture file on disk. Provide either 'body' or 'bodyFile', not both. Optionally simulate a slow server: delayMs waits before responding (processing time), bandwidthKbps streams the body at a KB/s rate (slow network / big object from far away).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL pattern. Default is glob/substring matched against the full absolute URL (e.g. 'api.example.com/v1/user' or '*/v1/user'). With regex=true, a raw JS regex source. | |
| body | No | Inline response body (small payloads). | |
| regex | No | Treat 'url' as a raw regex (default false). | |
| method | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, or OPTIONS. | |
| status | No | Response status code (default 200). | |
| delayMs | No | Simulated server processing time: delay in milliseconds before the response starts (e.g. 3000 = 3s before the first byte). | |
| headers | No | Response headers, e.g. { "content-type": "application/json" }. | |
| bodyFile | No | Path to a fixture file whose contents become the response body (large payloads). Must be inside the proxy's allowed directories (default: the folder the proxy was launched from). Add --allowed-dir <path> at launch to permit others. | |
| bandwidthKbps | No | Simulated network bandwidth cap: stream the body at this many KB/s (e.g. 50 = slow-network feel, big objects arrive progressively). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does an excellent job. It discloses key behaviors: default glob/substring matching against full URL, regex option, mutual exclusivity of body/bodyFile, delayMs processing time, bandwidthKbps streaming, and bodyFile directory restrictions. This goes well beyond a basic description and gives the agent critical operational context.
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?
The description is two sentences, front-loaded with the core purpose, and every clause earns its place. It efficiently packs matching logic, body options, and simulation parameters without redundancy or fluff.
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 tool with 9 parameters, complex interactions (body/bodyFile exclusivity, regex vs glob, delay/bandwidth), and no output schema, the description provides enough context for an agent to use it correctly. It covers the main behavioral aspects and edge constraints, making it a complete standalone reference.
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 100%, so the baseline is 3. However, the description adds meaningful cross-parameter guidance (e.g., 'Provide either body or bodyFile, not both'), clarifies the matching default and regex flag, and explains the semantics of delayMs and bandwidthKbps in a way not fully captured by each parameter's individual description.
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 the verb 'Add' and the resource 'in-memory mock rule', and specifies matching on HTTP method + URL pattern. It distinguishes from proxy_stop/health/list tools, though it does not explicitly differentiate from the transform-based mock tools (e.g., proxy_mock_transform), so sibling differentiation is not fully explicit.
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 description explains how the tool works (matching, body options, slow-server simulation) but does not provide explicit guidance on when to use this tool versus alternatives like proxy_mock_transform or proxy_request_transform. Usage is implied through the functional details, but no when-not or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_mock_transformAdd an intercept-and-transform ruleA
Intercept a request, forward it to the real backend, parse the JSON response, apply in-place patches (path + optional where + set), and return the modified response. Use [] for array wildcards in path, where for conditional matching, and __NOW__ / __NOW_PLUS_<N><UNIT>__ macros for dynamic timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL pattern. Default is glob/substring matched against the full absolute URL. With regex=true, a raw JS regex source. | |
| regex | No | Treat 'url' as a raw regex (default false). | |
| method | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, or OPTIONS. | |
| patches | Yes | One or more JSON patch operations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the transformation behavior (patches, macros, wildcards) and the flow. However, it doesn't disclose side effects: whether this persists across sessions, whether it only applies to matching requests, whether it modifies backend behavior or just the observed response, or what happens to non-JSON responses. The in-place nature is mentioned but operational side effects are not covered.
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?
The description is a single well-structured sentence explaining the end-to-end mechanism, followed by a helpful syntax hint sentence. It's front-loaded with the core purpose. Reasonably efficient, though it could be tightened—the detail about macros and where-clauses is valuable enough to justify the second sentence.
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?
Given no output schema (so return format is undefined) and no annotation, the description covers the mechanism well: how patches are applied, what the matching semantics are, and the macro syntax. It could mention edge cases (non-JSON responses, matched-URL specificity), but for an intercept-transform tool with 4 params fully described in schema, this is reasonably complete.
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 100%, so the baseline is 3. The description adds useful semantic detail about the patch format (path wildcards, where, macros) which complements the schema nicely. However, it doesn't add anything beyond what the schema parameter descriptions already specify, so it stays at the baseline 3.
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 the action: intercept a request, forward to backend, parse JSON, apply in-place patches, return modified response. It distinguishes itself from mock tools (mocking responses) and other transform tools by specifying the in-place intercept-and-transform flow. However, it doesn't explicitly differentiate from the sibling proxy_transform tools (proxy_mock_transform vs proxy_transform vs proxy_update_transform), so it loses one point on sibling differentiation.
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 description includes usage details on how to use path wildcards (`[]`), `where` for conditional matching, and time macros. It explains the execution pipeline (intercept, forward, parse, patch, return). It doesn't explicitly state when NOT to use this vs proxy_mock_response or proxy_transform, but the mechanism is fairly clear from the flow description, giving it a borderline 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_probe_transformOne-shot: test transform rules without registering themA
Fetch a URL directly, apply the given patches, and return a sample of modified fields (before/after values) plus match count. Useful for verifying patch paths and wire values before calling proxy_update_transform. Does NOT require the proxy to be running.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL to fetch and patch (e.g. https://api.cld.dtvce.com/...). | |
| patches | Yes | JSON patch operations to test. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose several behavioral traits beyond the schema: it fetches a URL directly (side effect), applies patches non-persistently ('without registering them'), returns a sample with before/after values plus match count, and doesn't require the proxy running. However, it doesn't specify what happens on fetch failure, whether patches are applied in order, or whether the sample is a subset or all matches. Decent but not exhaustive.
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?
Three sentences with zero waste. The front-loaded opening sentence contains the core purpose, the second sentence frames the use case and ties to the sibling tool, and the third sentence states the one operational caveat. Efficient and well-structured.
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 self-contained probe tool with 100% schema coverage and no output schema, the description covers the essential operational details: what it returns (modified samples + match count), when to use it (pre-update_transform validation), and a key runtime prerequisite (proxy not required). The only slight gap is describing failure behavior on network errors, but given the schema richness and clarity of purpose, the description is nearly complete.
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 100%, with both parameters (url, patches) already described in detail in the JSON schema, including the patch sub-object structure (path, set, where), wildcard syntax examples, and special token formats like __NOW__ and __NOW_PLUS_<N><UNIT>__. The description adds the conceptual role of these parameters as a validation pipeline but doesn't substantially extend the schema's parameter-level docs. Baseline 3 is appropriate given full schema 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 clearly states the tool fetches a URL, applies given patches, returns a sample of modified fields (before/after) plus match count. It explicitly says this is a 'one-shot' test of transform rules without registering them, which clearly differentiates it from siblings like proxy_update_transform (which registers rules). The verb+resource+outcome are all specific.
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 description explicitly states when to use this tool: 'Useful for verifying patch paths and wire values before calling proxy_update_transform.' This directly frames it as a pre-validation step before a sibling tool. It also discloses 'Does NOT require the proxy to be running,' which clarifies the operational precondition. This is explicit when/when-not guidance naming the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_request_transformAdd a request-modification ruleA
Intercept a request matching method+URL, modify it (headers, query params, body), forward to the real backend, and return the response. Use setHeaders/removeHeaders to modify headers, setQuery/removeQuery for URL params, and body to replace the request body.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL pattern (glob/substring by default, regex=true for raw regex). | |
| body | No | Replace the request body (for POST/PUT). | |
| regex | No | Treat 'url' as a raw regex (default false). | |
| method | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, or OPTIONS. | |
| setQuery | No | Query params to add or override (e.g. { "include": "extended" }). | |
| setHeaders | No | Headers to add or override (e.g. { "x-custom": "val" }). | |
| removeQuery | No | Query params to strip from the URL (e.g. ["legacy"]). | |
| removeHeaders | No | Headers to strip from the outgoing request (e.g. ["x-newrelic"]). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does disclose that this is an interception tool that modifies requests before forwarding to the real backend, which implies a live-traffic side effect distinct from pure mocks. It covers the key modification dimensions (headers, query, body). However, it doesn't disclose whether rules are additive, whether existing matching rules get overwritten, or any persistence behavior.
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?
The description is two sentences with zero waste. The first sentence states the purpose and flow, the second provides practical parameter usage guidance. Every word contributes value.
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 an 8-parameter tool with nested objects and no output schema, the description is reasonably complete—it explains the core flow (intercept, modify, forward, return) and how to use the major parameter groups. However, it doesn't explain the URL matching semantics (glob/substring vs regex) beyond what the schema already states, nor does it clarify edge cases like whether removing and setting a header in the same rule is supported. Given that schema covers all parameters, this is adequate.
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 100%, so all 8 parameters are documented in the schema. The description adds meaningful value by grouping parameters into functional categories (setHeaders/removeHeaders for headers, setQuery/removeQuery for URL params, body for body replacement), which is helpful orientation beyond the schema's individual descriptions. This exceeds the baseline 3 for full 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 clearly states the tool intercepts and modifies requests: 'Intercept a request matching method+URL, modify it (headers, query params, body), forward to the real backend, and return the response.' It uses specific verbs (intercept, modify, forward) and explicitly lists the resources being modified. It distinguishes from sibling mock tools by framing this as request modification with real backend forwarding, though it doesn't explicitly name the distinguishing sibling.
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 description gives clear operational guidance on how to use the tool: 'Use setHeaders/removeHeaders to modify headers, setQuery/removeQuery for URL params, and body to replace the request body.' This effectively explains which parameters to use for each modification type. However, it does not explicitly state when NOT to use this tool versus alternatives like proxy_mock_transform or proxy_mock_response, though the context implies this is for real-traffic interception rather than canned mock responses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_save_transformsPersist all transform rules to a JSON fileA
Save both response and request transform rules to a JSON file for reuse after a proxy restart. Reload with proxy_load_transforms.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path to save to (default: transforms.json in project root). Must be inside the proxy's allowed directories (default: the folder the proxy was launched from); extend with --allowed-dir <path>. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description does disclose that the tool persists to a file and overwrites/reuses after restart, which is useful. However, it does not mention potential side effects (e.g., whether it overwrites an existing file, whether file I/O failures are handled, or what happens if transforms are empty). With zero annotations, more detail would be warranted.
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?
The description is two sentences with zero wasted words. It front-loads the core action and purpose, then adds the complementary reload reference. It's appropriately concise; the only minor gap is the absence of side-effect disclosure, but structurally it's efficient.
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 single-parameter persistence tool with no output schema and no nested objects, the description covers the essential aspects well: what is saved, where, to what format, and how to retrieve it. The file-path restrictions are handled in the schema. This is reasonably complete for a tool of this simplicity.
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 100%, so the schema fully documents the path parameter including default location and the --allowed-dir constraint. The description does not add parameter semantics beyond the schema. Per the rubric, a baseline of 3 applies since the schema does the heavy lifting.
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 the verb ('Save'), the resource ('both response and request transform rules'), and the output format ('to a JSON file'). It also specifies the persistence/reuse intent ('for reuse after a proxy restart'), and explicitly names the complementary sibling tool (proxy_load_transforms) to disambiguate from other proxy tools.
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 description mentions the reload counterpart (proxy_load_transforms), giving context on the save/load workflow. However, it does not explicitly state when to use this tool vs. alternatives, nor does it mention any prerequisites like whether both request and response transforms must exist before saving. Usage context is implied but not fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_scopeSet or clear the capture scope (retention scoping)A
Restrict which traffic is retained in the proxy log (proxy_list_traffic). The proxy still intercepts and serves all hosts — this only controls what is kept, so the agent's context stays small during bug investigation. Pass 'hosts' to retain only matching hostnames (their subdomains are included, and '*.example.com' wildcards are allowed); omit 'hosts' or pass [] to clear scoping and retain all traffic again. Returns the active scope and current captured-traffic count. Already-captured entries are unaffected.
| Name | Required | Description | Default |
|---|---|---|---|
| hosts | No | Hostnames to retain, e.g. ['api.cld.example.com']. Omit or [] = retain all traffic (no scoping). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses that interception is unaffected, describes the effect on retained traffic, notes that already-captured entries are unaffected, and states that the active scope and captured-traffic count are returned. These are meaningful behavioral traits beyond the schema.
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?
The description is four sentences, with the main purpose stated immediately. Each sentence adds useful information (scope semantics, wildcards, return value, non-destructive behavior) without redundancy or fluff.
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?
Given the tool's low complexity (one optional parameter, no output schema), the description is complete: it covers what the tool does, when to use it, parameter behavior, return value, and side effects. Nothing critical is missing.
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 100%, but the description adds valuable parameter semantics: subdomains are included, wildcards like '*.example.com' are allowed, and the omission/empty-array behavior is explained. This goes beyond the schema's simple example and improves agent understanding.
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 specific verb ('Restrict') and resource ('which traffic is retained in the proxy log'), clearly distinguishing it from sibling tools that control interception (proxy_start/stop) or serve mocks. It explicitly references the affected log (proxy_list_traffic), making the tool's purpose unambiguous.
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 description gives a clear use case ('so the agent's context stays small during bug investigation') and clarifies that the proxy still intercepts all traffic, indicating this tool is for retention scoping only. However, it does not explicitly name alternative tools or state when not to use it beyond this distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_startStart MITM proxyA
Bring up the mockttp HTTPS MITM proxy. Returns the LAN IP : port to type into the device's manual Wi-Fi proxy settings. Unmatched requests pass through to the real headend. If the device is an Android emulator, pass hostRewrites to map its 10.0.2.2 alias (means 'host loopback', only valid inside the emulator) to 127.0.0.1 so Metro/dev-server passthrough can reach the Mac.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | TCP port to listen on (default 8889). | |
| scope | No | Capture-scope hostnames: only traffic for these hosts (and their subdomains) is retained in the log, to keep agent context small. Default [] (or omitted) = retain all captured traffic. Entries are hostnames or wildcard '*.example.com'. The proxy still MITMs and serves ALL hosts — scope only controls what is retained in proxy_list_traffic. Adjust at runtime with proxy_scope. | |
| hostRewrites | No | Rewrite the upstream dial target for passthrough traffic. Use this when a device reaches the dev PC via a special alias that is not a real address on the Mac — e.g. the Android emulator's 10.0.2.2:8081 (maps to host loopback only from inside the emulator) -> 127.0.0.1:8081. | |
| passthroughHosts | No | Host:port entries whose traffic should bypass MITM interception entirely (e.g. the React Native Metro bundler). Each entry is 'hostname' or 'hostname:port'. The hostname is matched against CONNECT tunnels; port globs (e.g. ':808*') are recorded for future HTTP-level filtering. Example: ['192.168.0.2:8081', 'localhost:8081']. | |
| restoreTransforms | No | Path to a JSON file previously saved by proxy_save_transforms. Transforms are restored idempotently (by method+url+regex). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so exceptionally well. It discloses that unmatched requests pass through, that scope only affects retained logs (not MITM behavior), and that the proxy still MITMs all hosts. This goes beyond a simple 'start' operation and sets accurate expectations, including a caveat about the Android emulator alias.
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?
The description is a single paragraph of four sentences, front-loading the core purpose in the first sentence. Each sentence earns its place: purpose/output, passthrough behavior, and a specific configuration hint. No redundant filler, perfectly sized for the tool's complexity.
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?
Given the tool's complexity (5 parameters, no output schema, no annotations), the description offers a complete picture: what it does, what it returns (LAN IP:port), how to use it with emulators, and how scope affects logging. It even warns about the proxy MITMing all hosts despite scope, covering edge cases. This is sufficient for an agent to invoke and interpret the result correctly.
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 input schema already has 100% coverage with detailed per-parameter descriptions, so baseline is 3. The description adds extra value by explicitly explaining the practical use of hostRewrites (mapping 10.0.2.2 to 127.0.0.1) and clarifying that scope only controls log retention, not actual MITM behavior. This enriches the schema's information, justifying a 4.
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 the tool's primary action: 'Bring up the mockttp HTTPS MITM proxy.' It also specifies the output ('Returns the LAN IP : port') and distinguishes itself from siblings by being the start operation, unlike proxy_stop or proxy_list_traffic. The verb 'Bring up' is specific to the resource.
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 provides valuable contextual guidance, such as using hostRewrites for Android emulator devices and clarifying that unmatched requests pass through to the real headend. However, it does not explicitly contrast with alternatives like proxy_mock_response or proxy_scope, though the tool's role as the start command makes this implicit. The guidance is specific enough to be actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_stopStop MITM proxyA
Stop the proxy. Transform rules are auto-saved to transforms.json for next restart. Device proxy may still be set on the device — use proxy_health to detect this.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses valuable behavioral traits: auto-saving transforms to transforms.json and the side-effect that device proxy configuration may persist after stopping. This is meaningful behavioral transparency beyond the basic 'stop' action, though it could mention whether traffic is affected or requires restart.
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 concise sentences, zero wasted words. Front-loaded with the core action ('Stop the proxy') followed by important side-effects. Each sentence earns its place, though it could arguably be more dense with additional behavioral context.
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 zero-parameter, no-output-schema tool, the description is reasonably complete. It covers the action, the persistence behavior, and a follow-up recommendation. It could benefit from noting whether stopping is idempotent or whether the proxy must be running first, and what the return indicates, but these are minor gaps for a simple stop operation.
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 has 0 parameters, so schema coverage is trivially 100% and there's nothing for the description to add about parameter semantics. The baseline of 4 for zero-parameter tools applies. The description correctly focuses on behavior rather than parameters.
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 the tool stops the proxy. It distinguishes effectively from siblings by referencing start ('Stop the proxy' vs proxy_start), health checking (proxy_health), and transform saving (proxy_save_transforms). The verb+resource is specific and clear, though it doesn't explicitly name the sibling alternative.
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 description provides clear operational context: transforms are auto-saved for next restart, and it warns that the device proxy may still be set, recommending proxy_health to detect this. It implies usage context well with the health check recommendation, though it doesn't explicitly enumerate when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_update_request_transformAdd or update a request-modification rule (idempotent upsert)A
Idempotently upsert a request transform rule by (method + url + regex) key. If a rule with the same key exists, its properties are replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL pattern (glob/substring by default, regex=true for raw regex). | |
| body | No | Replace the request body. | |
| regex | No | Treat 'url' as a raw regex (default false). | |
| method | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, or OPTIONS. | |
| setQuery | No | Query params to add or override. | |
| setHeaders | No | Headers to add or override. | |
| removeQuery | No | Query params to strip from the URL. | |
| removeHeaders | No | Headers to strip from the outgoing request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the idempotent upsert semantics and that existing same-key properties are replaced, which is valuable. However, it does not disclose mutation effects, whether existing rules get destroyed, auth/permission requirements, or any side effects on other rules sharing the same method+url.
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?
The description is just two sentences and both earn their place: the first explains what the tool does, the second clarifies the idempotent replacement semantics. Efficient and front-loaded with the primary action.
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?
With 8 parameters, 2 required, nested objects, and no annotations or output schema, the description is reasonably complete for purpose but could clarify relationships to sibling transform tools and explain the upsert key more. The core behavior is clear, though behavioral side-effects and return value expectations are undocumented.
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 100%, so all 8 parameters are already documented in the schema. The description adds the 'idempotent upsert' key concept that ties method+url+regex together but does not add per-parameter meaning beyond schema. Baseline 3 is appropriate given the full schema 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 title and description state a specific verb+resource ('Add or update a request-modification rule'), and the description names the exact key ('method + url + regex') used for upsert semantics. It clearly distinguishes from siblings like proxy_mock_transform (mocking) and proxy_update_transform (transforms generally) by specifying it handles REQUEST transforms specifically.
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 description explains the idempotent upsert behavior and the uniqueness key, which conveys when this replaces versus inserts. However, it does not explicitly name sibling alternatives or state when NOT to use this tool versus proxy_request_transform, proxy_update_transform, or proxy_save_transforms. The differentiation from siblings is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_update_transformAdd or update an intercept-and-transform rule (idempotent upsert)A
Idempotently upsert a transform rule by (method + url + regex) key. If a rule with the same key exists, its patches are replaced. Use this instead of clear+re-add to avoid auto-review friction.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL pattern. Default is glob/substring matched against the full absolute URL. Use a short substring like 'viewMultiviews' to avoid classifier issues with full URLs. | |
| regex | No | Treat 'url' as a raw regex (default false). | |
| method | Yes | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, or OPTIONS. | |
| patches | Yes | One or more JSON patch operations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose the key idempotency behavior ('if a rule with the same key exists, its patches are replaced'), which is the critical behavioral trait. However, it doesn't fully disclose what happens with non-key fields, whether partial updates occur, or confirmation/return behavior. Still, the key behavioral aspect is well covered.
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 sentences accomplish everything needed: the primary action with the key structure, the replacement behavior, and when-to-use guidance. Zero waste, front-loaded with the verb and purpose. Efficient and dense.
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 tool with no output schema and no annotations, the description plus the very well-documented schema (100% coverage) gives a complete picture. The patches parameter has rich documentation about __NOW__ macros and dotted-path syntax. The only gap is the lack of return-value/confirmation info, which is common for such tools and not severe given no output schema exists.
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 100%, so the schema already documents all 4 parameters well. The description adds value by explaining the logical key structure (method + url + regex) that ties the parameters together conceptually, which the schema doesn't convey. The url description in schema already provides substantive guidance about glob/substring matching and short substring advice.
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 the tool's function: idempotently upsert a transform rule keyed by (method + url + regex). It explicitly distinguishes this from clear+re-add approaches and names the sibling proxy_mock_transform context. The title adds 'intercept-and-transform rule' clarity. This is specific verb+resource+behavior.
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 description explicitly says 'Use this instead of clear+re-add to avoid auto-review friction,' providing direct usage guidance and a rationale. It implies when to use this vs alternatives by highlighting the idempotent upsert benefit over clearing and re-adding rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
proxy_whats_newWhat's new in this server?A
Report the running server version, the changelog for recent releases (optionally since a specific version), and whether a newer version is published on npm. Use this to learn what changed in recent releases — e.g. when in-repo skills seem out of date — without leaving the MCP.
| Name | Required | Description | Default |
|---|---|---|---|
| sinceVersion | No | Only list changes after this version, e.g. '0.1.0'. Omit for all releases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It identifies the operation as reporting versions, changelog, and npm status, which implies a read-only action with no destructive consequence. It does not explicitly assert 'no side effects' or mention the network dependency for the npm check, but the described behavior is unambiguous.
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?
The description is two sentences, front-loads the specific outputs, and then adds a practical use case. Every clause contributes and there is no redundancy.
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?
With one optional parameter, full schema coverage, and no output schema, the description adequately covers the tool's purpose and report categories. It explains what the tool returns (version, changelog, npm status) and gives a motivating example, making it complete for a simple informational tool.
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 single optional sinceVersion parameter is fully documented in the schema ('Only list changes after this version, e.g. '0.1.0'. Omit for all releases.'). The description reinforces this with 'optionally since a specific version' but adds no format-level meaning beyond the schema, so baseline 3 is appropriate.
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 opens with 'Report the running server version, the changelog for recent releases..., and whether a newer version is published on npm,' using a specific verb and enumerating concrete outputs. This clearly distinguishes it from sibling control tools like proxy_stop or proxy_update_transform by focusing on version/release information.
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 explicitly states 'Use this to learn what changed in recent releases — e.g. when in-repo skills seem out of date — without leaving the MCP,' giving a clear when-to-use scenario. However, it does not mention alternatives or when not to use it, so it stops short of a 5.
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.
5 tool updates
v0.1.2- Changed
ca_info1 field changed- changed
Input schema / properties / adbPush / descriptionPrevious value: -"If true, run `adb push` to copy the CA cert to a USB-connected Android device."New value: +"If true, run `adb push` to copy the CA cert to a USB-connected Android PHONE (not TV/debug builds)."
- Changed
proxy_mock_response2 fields changed- added
Input schema / properties / bandwidthKbpsAdded value: +{ + "description": "Simulated network bandwidth cap: stream the body at this many KB/s (e.g. 50 = slow-network feel, big objects arrive progressively).", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / delayMsAdded value: +{ + "description": "Simulated server processing time: delay in milliseconds before the response starts (e.g. 3000 = 3s before the first byte).", + "exclusiveMinimum": 0, + "type": "integer" +}
- Added
proxy_scope - Changed
proxy_start2 fields changed- added
Input schema / properties / hostRewritesAdded value: +{ + "description": "Rewrite the upstream dial target for passthrough traffic. Use this when a device reaches the dev PC via a special alias that is not a real address on the Mac — e.g. the Android emulator's 10.0.2.2:8081 (maps to host loopback only from inside the emulator) -> 127.0.0.1:8081.", + "items": { + "additionalProperties": false, + "properties": { + "match": { + "description": "Host or host:port as it arrives in the request, e.g. '10.0.2.2:8081'.", + "type": "string" + }, + "upstream": { + "description": "Host or host:port to dial instead, e.g. '127.0.0.1:8081'.", + "type": "string" + } + }, + "required": [ + "match", + "upstream" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / scopeAdded value: +{ + "description": "Capture-scope hostnames: only traffic for these hosts (and their subdomains) is retained in the log, to keep agent context small. Default [] (or omitted) = retain all captured traffic. Entries are hostnames or wildcard '*.example.com'. The proxy still MITMs and serves ALL hosts — scope only controls what is retained in proxy_list_traffic. Adjust at runtime with proxy_scope.", + "items": { + "type": "string" + }, + "type": "array" +}
- Added
proxy_whats_new
19 tool updates
v0.1.0- First observed
ca_info - First observed
proxy_clear_mocks - First observed
proxy_clear_request_transforms - First observed
proxy_clear_transforms - First observed
proxy_health - First observed
proxy_list_mocks - First observed
proxy_list_request_transforms - First observed
proxy_list_traffic - First observed
proxy_list_transforms - First observed
proxy_load_transforms - First observed
proxy_mock_response - First observed
proxy_mock_transform - First observed
proxy_probe_transform - First observed
proxy_request_transform - First observed
proxy_save_transforms - First observed
proxy_start - First observed
proxy_stop - First observed
proxy_update_request_transform - First observed
proxy_update_transform
TDQS
Scored across 21 tools
Each tool has a clearly distinct purpose: lifecycle (start/stop/health), mock responses, response transforms, request transforms, traffic inspection, CA info, scoping, and persistence. The three rule types (mock_response, mock_transform, request_transform) are clearly separated, and their list/clear/update operations are named distinctly.
All tools share the proxy_ prefix and use snake_case, but the pattern is not perfectly uniform. Most are verb_noun (proxy_list_mocks, proxy_clear_transforms), but some are noun-like (proxy_health, proxy_ca_info, proxy_scope) or phrases (proxy_whats_new). This is a minor deviation from a strict verb_noun convention.
At 21 tools, the set is on the heavy side. While each tool serves a legitimate purpose across rule lifecycle, traffic inspection, and diagnostics, the count borders on excessive for a typical proxy MCP, making it feel slightly bloated compared to the 3-15 range.
The surface covers the core proxy workflows well: start/stop, health checks, mock responses, response/request transforms with update and persistence, traffic inspection, and CA management. Minor gaps include lack of an update operation for mock_response rules and no explicit way to clear captured traffic, though proxy_scope mitigates the latter.
Maintenance
Related MCP Connectors
Capture, inspect & debug HTTPS traffic across iOS, Android, browsers & backends — 304 MCP tools.
AI-native mock API server with MCP. Create REST/SOAP mocks from Claude, Cursor, or Windsurf.
Debug webhooks from your AI agent: inspect and replay captured webhooks on localhost.
Anonymous webhook capture, inspection, waiting, and response configuration for AI agents.
Related MCP Servers
- AlicenseAqualityFmaintenanceAn MCP server that enables AI assistants to capture and analyze HTTP/HTTPS traffic from Android devices. It supports smart searching of network requests and provides tools for detailed traffic analysis via natural language.11231MIT
- FlicenseBqualityCmaintenanceAn HTTP/HTTPS MITM proxy server that enables capture, modification, and mocking of network traffic across Chrome, CLI tools, Docker containers, and Android devices. It supports advanced capabilities like JA3/JA4 TLS fingerprinting, JA3 spoofing, and upstream proxy chaining.8929 npm9-
- AlicenseCqualityBmaintenanceTransforms mitmproxy into a toolset for AI agents to inspect, modify, and replay HTTP/HTTPS traffic in real-time.25149 PyPI116MIT
- AlicenseAqualityDmaintenanceMCP server for intercepting and mocking HTTP(S) traffic via a Mockttp proxy, with tools for Android emulator setup, traffic inspection, protobuf analysis, and rule-based manipulation.3514 npmMIT