Skip to main content
Glama

har-mcp

Let your AI agent debug web performance and failures from a HAR file, without ever seeing your secrets.

har-mcp is an MCP server that analyzes HAR files exported from browser DevTools (Chrome, Firefox, Safari, Postman, mitmproxy). It answers the questions you actually ask of a capture: what is slow and why (blocked, DNS, connect, TLS, server wait or download), what failed and what triggered it, what the page-load waterfall and critical path look like, and what is inside one specific request.

How it differs from the other HAR MCP servers. Several exist (tjamet/har-mcp, katana-security/har-mcp, xuxu777xu/har-mcp, naotaka3/mcp-har-server, polybeta2/har-mcp-server). From their READMEs they lean towards listing endpoints, security auditing or reverse-engineering an API (replay, curl export). har-mcp is built for the other job, performance and failure debugging, and adds:

  • Timing math, not just a list. Every request gets a phase breakdown and the dominant phase with a plain-English hint. waterfall draws the timeline and computes the critical path.

  • Real streaming. A hand-rolled incremental JSON reader decodes one entry at a time. A 100 MB HAR is indexed in under a second using about 30 MB of RAM (measured, and tested). No database, no dependencies beyond mcp.

  • Secrets are masked by default, and that is tested. Authorization, cookies, tokens in URLs, headers and JSON/form bodies, JWTs and API-key shapes show as <redacted:N> (name and length only). The test suite plants 18 distinct fake secrets in a HAR and asserts none of them appears in the output of any tool.

  • redact_har writes a sanitized copy you can attach to a bug report. It never overwrites.

  • A --dir sandbox so the agent can only read and write where you allow.

What it looks like

Real output on a generated Chrome-style capture:

> slowest_requests limit=2
Slowest 2 of 15 requests by total time:
  1. #3 GET 200 910 ms  https://example.com/api/data?api_key=<redacted:20>&page=2
       send 1 ms | wait 900 ms | receive 9 ms
       dominated by wait (99%): the server took long to answer (time to first byte): look at the backend, not the network
  2. #11 POST 503 630 ms  https://api.example.com/oauth/token#access_token=<redacted:20>
       dns 8 ms | connect 5 ms | tls 15 ms | send 1 ms | wait 600 ms | receive 1 ms
       dominated by wait (95%): ...

> request_detail index=0
#0 GET https://example.com/
Status: 200 OK   h2   server 93.184.216.34   connection 443
Timings: blocked 5 ms | dns 20 ms | connect 10 ms | tls 30 ms | send 1 ms | wait 200 ms | receive 50 ms
Request headers (3):
  Authorization: Bearer <redacted:31>
  Cookie: sessionid=<redacted:23>; theme=<redacted:4>
  X-Custom: <redacted:57>
Response headers (2):
  Set-Cookie: refresh=<redacted:23>; Path=/; HttpOnly

> waterfall
   0 GET  200 example.com/                   ds========rr 316 ms
   1 GET  200 example.com/app.js                         ====rrrrrrrrrrrrrrr 503 ms
   3 GET  200 example.com/api/data?api_ke...                                 ================================== 910 ms
Critical path (4 requests, basis: initiator and redirect links): 2086 ms wall-clock from #0 start to #6 end, 1140 ms busy, 946 ms idle between

Related MCP server: py-har-mcp

Install

You need uv (or pip).

Claude Code

claude mcp add har -- uvx har-mcp --dir "/path/to/your/hars"

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "har": {
      "command": "uvx",
      "args": ["har-mcp", "--dir", "C:\\Users\\you\\Downloads"]
    }
  }
}

--dir is the folder the server may read HARs from and write redacted copies to. Repeat it for several folders. Without it, the current directory is used, which for a desktop app is rarely what you want, so set it. Relative paths in tool calls are resolved against the first --dir.

With pip: pip install har-mcp, then run har-mcp --dir <folder>.

Tools

Tool

What it does

har_overview

Entries, pages and page timings, time range, totals by type / domain / status class, transferred vs uncompressed bytes, cache hit/304 stats. Start here.

slowest_requests

Top N by total time, each with its phase breakdown and the dominant phase plus a hint.

failed_requests

4xx/5xx, status 0 and browser-flagged errors (net::ERR_...), with the reason and the initiator when recorded.

find_requests

Filter by URL substring or regex, method, status (404, 4xx, 200-299), MIME, domain, start-time window. Capped, with the total match count.

request_detail

One request by #index: headers, query params, sizes, timings, redirect chain, initiator, body preview (truncated, binary-safe, base64-aware).

waterfall

ASCII timeline with DOMContentLoaded/load markers and the critical path.

redact_har

Write a sanitized copy. Never overwrites.

Every tool except har_overview and redact_har takes include_secrets (default false).

Try asking

  • "Open C:\Users\me\Downloads\checkout.har. Why is the page slow?"

  • "Which three requests dominate load time, and is it the server or the network?"

  • "What failed in this capture, and what script triggered each failure?"

  • "Show me the waterfall for page_1 and tell me what the critical path is."

  • "Find all POSTs to /api/ that returned 5xx and show me the first one in detail."

  • "Is anything blocked behind a long TLS handshake or DNS lookup?"

  • "Make a redacted copy of this HAR I can attach to a support ticket."

Timing math (so you can trust the numbers)

  • A timing of -1 or a missing key means "does not apply" and counts as 0 ms.

  • Per the HAR spec ssl is part of connect; the report shows TCP connect and TLS separately (connect 10 ms | tls 30 ms for a connect: 40, ssl: 30 entry) and does not double count. If a tool reports ssl larger than connect, it is treated as separate and added.

  • The total is the entry's time when present, otherwise the sum of the phases.

  • "Dominant phase" is the largest phase as a share of the summed phases.

  • Transfer size prefers Chrome's _transferSize, else headersSize + bodySize. "Served from cache" means Chrome's _fromCache or a HAR cache.beforeRequest; HTTP 304 is counted as revalidated.

  • The critical path follows redirects and _initiator links to the chain that finishes last. If the HAR has neither (most non-Chrome exports), it falls back to the set of non-overlapping requests with the most busy time and says so.

Security

HAR files hold everything a browser sent: session cookies, bearer tokens, OAuth codes, passwords.

  • Masked by default. URLs, headers, cookies, query parameters, request and response bodies pass through the masker before they reach the model. A masked value is <redacted:N> where N is its length. Masking works by name (authorization, cookie, token, password, api_key, ...), by shape (JWT, GitHub, AWS, Slack, Stripe, Google keys, Bearer ...) and by context (token=... in text, "password": "..." in JSON, <apiKey>..</apiKey> in XML, multipart fields).

  • Filters match what you may see. url_contains / url_regex run against the masked URL, so the agent cannot binary-search a masked token through filters.

  • include_secrets=true is opt-in per call. Only use it when you asked for raw values.

  • Sandbox. Only files under --dir (symlinks resolved, .. rejected) can be read or written. redact_har refuses to overwrite and refuses output == input.

  • Limits you should know. A secret with an innocent name and shape in a URL path, an HTML page or a binary body is not recognised. Binary bodies are copied unchanged by redact_har. Always skim a redacted HAR before sharing it. Response bodies sent to the model are text previews you can shorten with body_chars.

  • Nothing is sent anywhere by har-mcp itself. It makes no network requests.

Compatibility

Tested with generated Chrome, Firefox, Safari, Postman (UTF-8 BOM, string status, UTC offsets, no pages) and mitmproxy (microsecond timestamps, missing timings and time, no startedDateTime on some entries) shaped files. Chrome extensions _initiator, _priority, _resourceType, _transferSize, _fromCache, _error are used when present and not required. I have not run it on hand-exported captures from every browser version, so tell me if a real file misbehaves.

Entries are numbered by their 0-based position in log.entries. If a file has no startedDateTime for an entry, it is listed but cannot be drawn on the waterfall; the output says so.

Tests

uv sync --extra test
uv run pytest tests            # 148 tests, ~10 s
uv run pytest tests -m slow    # builds and indexes a 100 MB HAR, asserts bounded memory
uv run ruff check src tests && uv run mypy --strict src

The tests generate realistic HARs with hand-computed numbers (every total, dominant phase, byte count and critical path is asserted exactly), the reader is checked against json.load at chunk sizes from 1 byte up, and a stdio test launches the real server and calls every tool over MCP.

Learn how it is built

har-mcp-the-hard-way is a 7-module tutorial that builds a minimal version from scratch: HAR anatomy, streaming JSON, timing math, redaction design, waterfall rendering, the MCP wrapper and testing.

License

MIT

Available Tools

7 tools
failed_requestsB

List failed requests: HTTP 4xx/5xx, status 0 (blocked, cancelled, offline) and any request the browser flagged with an error (e.g. net::ERR_BLOCKED_BY_CLIENT), with the reason and, when the HAR records it, the initiator (what triggered the request).

NameRequiredDescriptionDefault
pathYes
limitNo
include_secretsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full disclosure burden, and it does add real value by describing what is returned (failure reason, and the initiator when the HAR records it). It says nothing about ordering, whether limit truncates silently, or how secrets are handled in returned URLs/headers, all of which matter for a diagnostic listing tool with no readOnly/destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with a tight parenthetical enumeration; every clause adds information about what counts as a failure. Slightly dense but no filler.

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

Completeness3/5

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

The output schema means return values need not be re-explained, and the failure taxonomy is thorough, so core semantics are covered. The remaining hole is input-side: with three undocumented parameters and no sibling routing, an agent can identify the tool but not confidently supply arguments or choose it over find_requests.

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

Parameters2/5

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

Schema description coverage is 0% and the description never mentions any of the three parameters. The required 'path' parameter in particular is undefined — an agent must guess that it is the location of a HAR file. The significance of include_secrets for a tool that returns the initiator is not explained either, so the description does not compensate for the schema gap.

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

Purpose4/5

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

States a specific verb and resource ('List failed requests') and then defines the exact inclusion criteria: HTTP 4xx/5xx, status 0 cases (blocked, cancelled, offline), and browser-flagged errors such as net::ERR_BLOCKED_BY_CLIENT. That is far more precise than the name alone. It does not, however, distinguish itself from the sibling find_requests, so an agent cannot tell from the description alone which of the two is the right entry point for a status-4xx query.

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

Usage Guidelines3/5

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

The enumerated failure categories imply when this tool is applicable (diagnosing failed loads) but no explicit when-to-use, exclusions, or alternative tool is ever named among the six siblings. Usage must be inferred from what the filter set covers rather than stated.

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

find_requestsA

Find requests and get their #index numbers (for request_detail). All filters are ANDed. url_contains / url_regex are case-insensitive and match the URL as displayed (masked unless include_secrets=true). status: 404, 4xx, 200-299, 0, or a comma list. mime and domain are substring matches. start_ms/end_ms keep requests that START within that window, in ms from the first request in the file. Results are capped by limit (max 500); the total match count is always reported.

NameRequiredDescriptionDefault
mimeNo
pathYes
limitNo
domainNo
end_msNo
methodNo
statusNo
start_msNo
url_regexNo
url_containsNo
include_secretsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the limit cap (max 500), that the total match count is always reported even when results are truncated, and that URLs are masked unless include_secrets=true — a security-relevant default an agent would otherwise miss. It never states read-only/non-destructive behavior or whether the HAR file is modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and output contract, then packs filter semantics into tight clauses with zero filler. Every sentence conveys a distinct, actionable constraint.

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

Completeness4/5

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

An output schema exists, so return-value detail is unnecessary and correctly absent; the description still adds the truncation/count behavior. For an 11-parameter tool it is nearly complete, missing only the meaning of the required `path` input and the `method` filter.

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

Parameters4/5

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

Schema description coverage is 0% across 11 params, so the description must compensate, and it largely does: it explains url_contains/url_regex matching mode, status value formats, mime/domain substring semantics, the start_ms/end_ms reference origin, the limit ceiling, and include_secrets. The required `path` parameter and `method` are never explained anywhere, which is the main remaining gap.

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

Purpose4/5

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

States a specific verb+resource ("Find requests") and pairs it with the concrete output contract ("get their #index numbers"), plus names the downstream tool request_detail. It does not explicitly separate itself from slowest_requests or failed_requests, which overlap with the status filter it documents.

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

Usage Guidelines4/5

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

Gives real usage rules: all filters are ANDed, url_contains/url_regex are case-insensitive, status accepts 404/4xx/200-299/0/comma lists, mime and domain are substring matches, and start_ms/end_ms select on request start time in ms from the first request. No explicit when-not or sibling routing guidance (e.g., "prefer failed_requests for 4xx/5xx overview").

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

har_overviewA

Summarize a HAR file: entry and page counts, time range, page load timings, totals by resource type / domain / status class, bytes transferred vs uncompressed, and cache hit statistics. Start here. The file is streamed (safe for 100+ MB). Entry numbers (#N) used by other tools are 0-based positions in the HAR.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and delivers two non-obvious traits: the file is streamed so 100+ MB HARs are safe, and entry numbers (#N) referenced by other tools are 0-based positions. It omits failure behavior (missing/unreadable/invalid HAR) and confirms nothing about read-only safety, though a summarizer is self-evidently non-mutating.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and its outputs, then two short operational notes (start here, streaming safety, 0-based numbering). Every sentence adds information an agent would otherwise have to guess; no filler.

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

Completeness4/5

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

An output schema exists, so the enumerated return dimensions are a bonus rather than a necessity, and the streaming/0-based numbering notes cover the highest-risk behavioral unknowns. The remaining gap is input-path semantics and error handling for an unannotated tool.

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

Parameters3/5

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

A single required `path` parameter with 0% schema description coverage; the description only implies via "The file is streamed" that this is a local filesystem path. It does not say whether the path must be absolute, whether relative paths resolve, or how the file is located, so it only partially compensates for the schema gap.

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

Purpose5/5

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

States a specific verb (summarize) and resource (HAR file) and enumerates the exact aggregates produced: entry/page counts, time range, load timings, totals by resource type/domain/status class, byte comparisons, cache hits. That enumeration makes it unmistakably the overview tool rather than slowest_requests, failed_requests, or waterfall.

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

Usage Guidelines4/5

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

"Start here" is explicit entry-point guidance and, combined with the sibling set, implies this is the first call before drilling into specialized tools. It stops short of naming a specific sibling or stating when-not to use it, e.g. when a single request's detail is needed instead.

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

redact_harA

Write a sanitized copy of a HAR that is safe to share: masks Authorization, Cookie/Set-Cookie, tokens/passwords/API keys in headers, query strings, JSON and form bodies (and JWT/GitHub/AWS-shaped values anywhere). Streamed, so large files work. NEVER overwrites: fails if output exists. output must be inside the allowed directories. Review the result before sharing: secrets with innocent names buried in URL paths or HTML cannot be recognised.

NameRequiredDescriptionDefault
pathYes
outputYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses streaming behavior for large files, a hard no-overwrite guarantee ('fails if `output` exists'), a path sandbox restriction ('must be inside the allowed directories'), and an honest limitation that innocent-named secrets in URL paths or HTML cannot be recognised. These are exactly the operational traits an agent needs before invoking a file-writing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the action and redaction scope, then constraints, then the caveat. Every clause delivers actionable information; there is no filler or restatement of the name.

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

Completeness5/5

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

For a two-parameter file-writing tool with no annotations and an output schema available, this covers the essentials: what is masked, write safety, sandbox limits, and residual risk. Return values are correctly omitted since the output schema exists, and no contradicting or missing behavior leaves the agent unable to call it correctly.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does for `output`: it is inside allowed directories and must not already exist. `path` (the source HAR) is only implicitly identifiable from 'of a HAR' — its existence requirements and path-format expectations are never stated, leaving one of two parameters under-specified.

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

Purpose5/5

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

Opens with a specific verb+resource+outcome: 'Write a sanitized copy of a HAR that is safe to share'. It then enumerates exactly what is redacted (Authorization, Cookie/Set-Cookie, tokens/passwords/API keys in headers, query strings, JSON and form bodies), which distinguishes it unambiguously from the read-only analysis siblings like har_overview and request_detail.

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

Usage Guidelines3/5

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

The use case is implied rather than stated: 'safe to share' plus 'Review the result before sharing' signals this is a pre-sharing sanitization step. However, it never explicitly says when to pick this over siblings, nor does it name any alternative or exclusion case (e.g. what to do if the user just wants to inspect a HAR).

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

request_detailA

Everything about one request (index from find_requests / slowest_requests): URL, status, timings and what dominates, sizes, cache state, initiator, redirect chain, query parameters, request and response headers, and a response body preview cut to body_chars (max 20000). Binary or base64 bodies are described, not dumped. Authorization, cookies, tokens and passwords are masked as redacted:N by default.

NameRequiredDescriptionDefault
pathYes
indexYes
body_charsNo
include_secretsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does substantial work: it discloses body truncation (cut to body_chars, hard cap 20000), that binary/base64 bodies are described rather than dumped, and that authorization, cookies, tokens and passwords are masked as <redacted:N> by default. It omits error behavior for a bad index/path and whether the operation is strictly read-only, but the masking and truncation disclosures are the behaviorally important ones.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded paragraph opening with the core purpose, then a facet list and two constraint sentences. The enumeration is long but each item is a real capability the agent needs to know; no filler text or repetition.

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

Completeness4/5

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

An output schema exists, so return values need no prose. For a 4-parameter drill-down tool the description covers payload shape, truncation limits and redaction defaults well; the only real hole is the undocumented 'path' parameter and index-boundary behavior.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It explains body_chars (truncation length, max 20000) and indirectly explains include_secrets (masking is the default). However, 'path' is never given meaning — presumably the HAR file path — and 'index' is only described as coming from sibling tools, leaving its addressing semantics implicit. Partial compensation, not full.

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

Purpose5/5

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

States a specific resource and scope: full detail for exactly one request, then enumerates the returned facets (URL, status, timings, sizes, cache state, initiator, redirect chain, params, headers, body preview). It also distinguishes itself from siblings by naming find_requests and slowest_requests as the sources of the index it consumes.

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

Usage Guidelines4/5

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

Clear workflow context: this is the drill-down step after find_requests or slowest_requests, which tells the agent when to reach for it. It stops short of explicit exclusions (e.g. 'use har_overview for aggregate stats instead') or what happens with an out-of-range index, so it is strong but not fully routing.

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

slowest_requestsB

List the slowest requests by total time, each with its timing breakdown (blocked, dns, connect, tls, send, wait, receive) and which phase dominates, with a plain-English hint (e.g. long 'wait' = slow server, long 'blocked' = queueing). URLs are masked by default (include_secrets=false).

NameRequiredDescriptionDefault
pathYes
limitNo
include_secretsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden. It usefully discloses the default privacy behavior ('URLs are masked by default') and the interpretation hints for dominant phases, but says nothing about ordering guarantees, whether it reads an already-loaded HAR, or any size/perf limits. The masking disclosure is the main piece of genuine behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A tight three-sentence block that front-loads the core purpose and uses parenthetical examples efficiently. Slight redundancy in enumerating the seven timing phases, which the output schema likely already conveys, but nothing is bloated.

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

Completeness3/5

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

An output schema exists, so the long enumeration of return fields is largely redundant, while the more consequential gap — what the required `path` argument means — is unaddressed. For a three-parameter read tool this is adequate but leaves a real ambiguity in the only required input.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description must compensate and it largely does not. It explains include_secrets only indirectly ('URLs are masked by default'), and leaves the required `path` parameter and `limit` completely undefined — an agent must guess whether path is a filesystem path, a URL, or an identifier.

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

Purpose4/5

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

States a specific verb and resource with scope: 'List the slowest requests by total time', and further specifies the per-entry payload (timing breakdown plus dominant phase). It is clearly distinguishable from siblings like failed_requests or find_requests by its ranking criterion, though it never names an alternative explicitly.

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

Usage Guidelines3/5

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

Usage is only implied — the description suggests a performance-triage use case via the 'which phase dominates' framing, but never says when to choose this over waterfall, request_detail, or find_requests. No exclusions or preconditions are given.

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

waterfallC

ASCII timeline of the page load: one row per request in start order, drawn with its phases (. blocked, d dns, c connect, s tls, > send, = wait, r receive), page DOMContentLoaded / load markers, then the critical path (the longest dependency chain, from initiators and redirects when the HAR has them, otherwise from timing alone). page: a page id from har_overview to restrict to one page load.

NameRequiredDescriptionDefault
pageNo
pathYes
widthNo
max_rowsNo
include_secretsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations, so the description carries the whole burden. It does disclose ordering, the phase legend, and that the critical path falls back to timing alone when initiators/redirects are absent, but it says nothing about truncation via max_rows, width clipping, or what include_secrets does — a security-relevant flag left entirely unexplained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The legend and critical-path definition are front-loaded and useful, but the single long run-on sentence mixes output format, phase codes, and a trailing note about the page parameter, making it harder to scan than necessary.

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

Completeness3/5

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

With an output schema present the description need not explain return values, yet it spends most of its length on the visual format while leaving four of five parameters and the secrets-handling behavior unaddressed for a five-parameter HAR tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, and it only covers one of five parameters (page). path, width, max_rows, and especially include_secrets are undocumented; the last is a redaction toggle that an agent could easily mis-set.

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

Purpose4/5

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

States a specific verb and artifact: an ASCII timeline of the page load, one row per request in start order, plus DOMContentLoaded/load markers and a critical path. This is concrete enough to distinguish it from har_overview, though it never explicitly contrasts with siblings like slowest_requests or request_detail.

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

Usage Guidelines3/5

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

Implies usage by naming har_overview as the source of page ids and noting page restricts to a single page load, but gives no explicit when-to-use versus when-to-pick-another-sibling guidance, and no exclusions.

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

Tool Schema Changelog

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

  1. 7 tool updatesv0.1.0
    • First observedfailed_requests
    • First observedfind_requests
    • First observedhar_overview
    • First observedredact_har
    • First observedrequest_detail
    • First observedslowest_requests
    • First observedwaterfall

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a distinct role in the HAR workflow: overview, slowest requests, failed requests, discovery, single-request detail, timeline visualization, and sanitization. Although find_requests overlaps conceptually with slowest_requests and failed_requests, their outputs and intended use are clearly differentiated.

Naming Consistency3/5

All names use snake_case and are readable, but they mix noun-phrase names (har_overview, slowest_requests, failed_requests, request_detail, waterfall) with verb-phrase names (find_requests, redact_har). The convention is not a single predictable pattern, though it remains understandable.

Tool Count5/5

Seven tools is well-scoped for HAR analysis, covering discovery, drill-down, visualization, and sanitization without redundant endpoints. Each tool earns its place and supports a clear step in the analysis workflow.

Completeness5/5

The surface covers the full practical lifecycle for examining and sharing a HAR: high-level summary, bottleneck and failure inspection, request lookup and detail, page-load visualization, and safe redaction. No obvious operational gap remains for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers