har-mcp
Analyzes HAR captures exported from Firefox DevTools, providing timing phase breakdowns, slowest and failed requests, waterfall timelines with critical path, and request details for performance and failure debugging.
Analyzes HAR files exported from Postman (including its UTF-8 BOM, string status, UTC offset and page-less variants), providing timing analysis, failure inspection, waterfall rendering and sanitized HAR redaction.
Analyzes HAR captures exported from Safari, providing timing phase breakdowns, slowest and failed requests, waterfall timelines with critical path, and request details for performance and failure debugging.
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., "@har-mcpanalyze my latest HAR and show the slowest requests with timings"
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.
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.
waterfalldraws 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_harwrites a sanitized copy you can attach to a bug report. It never overwrites.A
--dirsandbox 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 betweenRelated 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 |
| Entries, pages and page timings, time range, totals by type / domain / status class, transferred vs uncompressed bytes, cache hit/304 stats. Start here. |
| Top N by total time, each with its phase breakdown and the dominant phase plus a hint. |
| 4xx/5xx, status 0 and browser-flagged errors ( |
| Filter by URL substring or regex, method, status ( |
| One request by |
| ASCII timeline with DOMContentLoaded/load markers and the critical path. |
| 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
-1or a missing key means "does not apply" and counts as 0 ms.Per the HAR spec
sslis part ofconnect; the report shows TCP connect and TLS separately (connect 10 ms | tls 30 msfor aconnect: 40, ssl: 30entry) and does not double count. If a tool reportsssllarger thanconnect, it is treated as separate and added.The total is the entry's
timewhen 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, elseheadersSize + bodySize. "Served from cache" means Chrome's_fromCacheor a HARcache.beforeRequest; HTTP 304 is counted as revalidated.The critical path follows redirects and
_initiatorlinks 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_regexrun against the masked URL, so the agent cannot binary-search a masked token through filters.include_secrets=trueis 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_harrefuses to overwrite and refusesoutput == 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 withbody_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 srcThe 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 toolsfailed_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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| include_secrets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mime | No | ||
| path | Yes | ||
| limit | No | ||
| domain | No | ||
| end_ms | No | ||
| method | No | ||
| status | No | ||
| start_ms | No | ||
| url_regex | No | ||
| url_contains | No | ||
| include_secrets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| output | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| index | Yes | ||
| body_chars | No | ||
| include_secrets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| include_secrets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| path | Yes | ||
| width | No | ||
| max_rows | No | ||
| include_secrets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
failed_requests - First observed
find_requests - First observed
har_overview - First observed
redact_har - First observed
request_detail - First observed
slowest_requests - First observed
waterfall
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
Analyze web performance and get optimization insights from GTmetrix, directly in your AI workflow.
Website health, SEO, security-header, SSL and broken-link audits for AI agents.
71AI agent observability for production traces, natural-language insights, and improvement loops.
Agent tools: clean web screenshots/PDFs, PDF & image OCR to Markdown, PageSpeed audits, email checks
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to call web APIs extracted from HAR files, turning browser traffic into MCP tools.17 npm1MIT
- AlicenseAqualityDmaintenanceAn MCP server for parsing and analyzing HAR files, enabling AI assistants to inspect network traffic with automatic redaction of sensitive authentication headers.7MIT
- FlicenseNot gradedqualityDmaintenanceCaptures website HAR data via headless Chromium and provides 20 tools for performance/security auditing, API reverse engineering, and code generation.-
- AlicenseNot gradedqualityDmaintenanceAudits HAR captures locally with MCP tools for triage, findings, vendor blast radius, CSP generation, and sanitization—no network calls, redacted by default.119 npm1MIT