mcp-agent-docparser
An MCP server that turns documentation websites into clean markdown for LLM contexts, with receipt-based site profiles, parsing, crawling, and discovery tools.
Receipt management: list, view, add, edit, delete, and reload site profiles (
receipt_list,receipt_show,receipt_add,receipt_edit,receipt_delete,receipt_reload).Parse docs: parse a saved receipt (
doc_parse), parse an arbitrary URL using a receipt as template (doc_parse_url), or crawl a whole site via sitemaps/robots with concurrency and politeness (doc_crawl).Discover site structure: probe pages statically (
doc_probe) or via headless Chromium for JS-rendered sites (doc_probe_js), including Copy-as-Markdown detection.Inspect outputs: list emitted markdown files (
doc_output).Utility: get current local/UTC datetime (
get_current_datetime).Output: writes timestamped
.mdfiles todoc_output/and returns rendered markdown inline for direct use by the model.Flexible receipt options: CSS selectors, strip tags, section limits, JS rendering, markdown passthrough, language/code-language overrides, and dry-run previews.
Provides a preconfigured receipt to parse LangChain DeepAgents documentation into clean markdown.
Provides a preconfigured receipt to parse Pydantic AI documentation into clean markdown.
Provides a preconfigured receipt to parse React.dev documentation, including JS-rendered pages with Sandpack, into markdown.
Provides a preconfigured receipt to fetch and extract documentation from the Rust programming language's official docs into clean markdown.
Provides a preconfigured receipt to parse SearXNG documentation into clean markdown.
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., "@mcp-agent-docparserParse https://docs.python.org/3/library/json.html into markdown"
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.
mcp-agent-docparser
SDK documentation extractor as a local MCP server. Point an
MCP-aware agent harness at a documentation site, and it fetches the pages,
strips navigation noise, converts HTML to clean markdown, and returns (or
writes) a .md file ready to drop into any LLM context window.
Pipeline: fetch → extract → emit.
This is the terminal-menu docparser (a standalone project) rebuilt as an
MCP tool for the agent-tools stack. The interactive REPL commands became
MCP tools: receipt management, parse, and probe are now callable by any
harness (Claude, opencode, etc.) over stdio.
Tool surface
Domain | Tools |
Receipts |
|
Parse |
|
Discovery |
|
Utility |
|
Related MCP server: sosumi.ai
Receipts
A receipt is a named profile that tells docparser how to fetch and
extract one documentation site. Receipts live in receipts.json — never in
the Python source. The repo ships a host of prefilled examples covering a
wide range of real documentation stacks: Memvid (memvid-python, static
Mintlify), LM Studio (lmstudio-python and lmstudio-bionic,
JS-rendered Next.js with a Copy-as-Markdown button), Mojo, Rust,
React.dev (Sandpack), Hermes Agent, MCP Specification, Pydantic
AI, HuggingFace smolagents, Google ADK, LangChain DeepAgents,
Invidious and SearXNG — see the urls, selectors, and strip_tags
in receipts.json for ready-made examples per site theme. Delete them or
keep them; they are regular receipts.
Receipt schema
{
"my-sdk-python": {
// Required
"name": "My SDK (Python)", // human label
"language": "python", // used in code blocks and header
"urls": ["https://docs.example.com/overview"], // fetched in order
"selectors": ["#content", ".prose", "article", "body"],
// Optional
"strip_tags": ["nav", "footer", "header", "script", "style"],
"section": null, // restrict to content after this H2 text
"js_render": false, // use Playwright instead of requests
"markdown_passthrough": false, // treat extracted <pre> as raw markdown
"notes": "", // free-text notes about the site
// Managed automatically
"last_fetched": null, // ISO date of last successful parse
"last_output": null // filename of last emitted .md
}
}Workflow for a new site
1. doc_probe → paste the docs URL, see which selectors match and
(or doc_probe_js what H2s exist. Nothing matched? The site is
for JS-rendered) probably JS-rendered — retry with doc_probe_js.
2. receipt_add → save the findings as a receipt (best_selector +
strip_tags / js_render / markdown_passthrough).
3. doc_parse(key) → fetch, extract, emit .md into doc_output/. Returns
the rendered markdown directly. doc_parse with
dry_run=true previews what will be fetched.For a single unfamiliar page that matches an existing receipt's template,
doc_parse_url(template_key, url) parses it without persisting a receipt.
Whole-site ingestion with doc_crawl
1. doc_probe / doc_probe_js → confirm the site renders + pick a template
receipt whose selectors fit.
2. doc_crawl(key, url) with dry_run=true → discovery only: sitemaps/robots
are read, candidate URLs are listed, nothing is fetched. Scope with
max_pages and path_prefix if the list is too big.
3. doc_crawl(key, url) → fetches the discovered pages concurrently, emits one
combined {name}_{timestamp}.md, and returns the markup inline.Crawl discovery order: robots.txt Sitemap: directives → sitemap index →
leaf sitemaps (a .xml seed is parsed directly) → same-host link walk as a
fallback for sites without a sitemap. Politeness is robots-strict: every URL
passes through the site's robots.txt before fetching, a declared
Crawl-delay throttles the workers, and results are deduped, same-origin,
and capped at max_pages (default 200). Crawls never modify the registry —
they are one-shot like doc_parse_url.
Requirements
Python 3.13+
Playwright Chromium (only for
js_renderreceipts):uv sync && uv run playwright install chromium
Install
git clone <repo-url> mcp_agent_docparser
cd mcp_agent_docparser
uv syncUsage
Run as an MCP server (stdio — what harnesses expect)
uv run mcp-agent-docparserOverride paths via environment variables (defaults resolve relative to the project root, never the process CWD):
Var | Default | Purpose |
|
| Path to the receipts registry |
|
| Where emitted |
|
| Rotating DEBUG logs (5×5 MB) |
To serve over HTTP (streamable-http) instead:
uv run mcp-agent-docparser serve --http --port 8000Register in an MCP client
{
"mcpServers": {
"mcp-agent-docparser": {
"command": "uv",
"args": ["--project", "C:/path/to/mcp_agent_docparser", "run", "mcp-agent-docparser"]
}
}
}CLI commands
Command | Purpose |
| Run the MCP server. |
| Offline diagnostics: paths, registry state, emitted files |
Output
Files are written to doc_output/ as {receipt_name}_{YYYYMMDD_HHMMSS}.md.
Each file contains a header block (language, fetch timestamp, source URLs),
the receipt's notes if set, and one <!-- SOURCE: url --> section per
fetched page. doc_parse also returns the rendered markdown in its result,
so the model can use the content even if the harness has no filesystem view.
Development
uv run ruff check .
uv run pytest -qTests cover the receipt registry, config path resolution, extraction, the parse pipeline (mocked fetch), and the full tool surface — no network needed.
Agent skill: fixing noisy fetched pages
When a fetched page comes out malformed (wrong code-fence language, blank
lines in code blocks, leaked navigation noise, heading-anchor junk, CRLF
copy-markdown), opencode loads the docparser-page-fixes skill from
.opencode/skills/docparser-page-fixes/SKILL.md. It teaches the
reproduce → isolate → fix → test → restart loop, maps the real
symptom/cause/fix cases from this repo's history, and lists the extractor's
gotchas (MULTILINE regexes, trailing-newline traps, the stale-MCP-module
restart requirement). Extend it whenever the extractor grows a new fix.
License
MIT © 2026 Christof Milius
Available Tools
12 toolsdoc_outputA
List the extracted .md files currently in the output directory.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. The description is straightforward for a read-only listing operation, but it does not mention whether the list is sorted, only top-level files, or if it includes subdirectories. The lack of annotations and minimal behavioral details makes it adequate but not fully transparent.
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 immediately conveys the core function. It is front-loaded with the action and resource, with no wasted words. It could arguably be longer to address usage or behavior, but as a concise summary it is excellent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters and has an output schema which likely defines the return structure. The description is sufficient for an agent to understand the basic operation. However, it could benefit from specifying whether it lists all files or only those extracted by the doc_parse tools, and whether the output includes full paths or just filenames. But given its simplicity, the description covers the essential context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to add parameter details. Since there are no parameters, the description is not required to compensate for missing parameter documentation. A baseline of 4 is appropriate for parameter-free tools.
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 'List' with a concrete resource 'the extracted .md files' and a specific location 'output directory'. It is clear from the description that the tool returns a list of markdown files, distinguishing it from other doc_* tools that parse or probe URLs, though it does not explicitly name a 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 context implies when to use it: after extraction, to see what files are available. However, there is no explicit guidance on when not to use it or alternatives. Given the sibling tools like doc_parse and doc_probe, one might infer it is for post-extraction listing, but the description does not state this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_parseA
Parse a saved receipt: fetch all its URLs, extract the content, and write a timestamped .md file into the output directory.
Returns the emitted filename plus a per-URL character count and the full rendered markdown. With dry_run=true, reports what would be fetched without making any network requests.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| dry_run | 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 provided, the description carries the full behavioral burden and does well: it discloses network fetching, file creation, return contents, and the dry_run behavior that avoids network requests. It does not mention failure handling or permission requirements, but the primary side effects are transparent.
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 three tight sentences with no filler. It front-loads the primary action, then states the return value, and ends with the dry_run modifier. Every sentence 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 two-parameter tool with an output schema, the description covers the main flow, success outputs, and the special dry-run mode. Minor edge cases like unreachable URLs or existing-file behavior are omitted, but they are not essential for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It fully explains dry_run ('With dry_run=true, reports what would be fetched without making any network requests') and implies that key identifies the saved receipt, but it never explicitly defines the required key parameter or its expected format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Parse a saved receipt: fetch all its URLs, extract the content, and write a timestamped .md file into the output directory.' This makes the tool's core operation clear and distinguishes it from siblings like doc_parse_url or receipt_show.
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 frames the tool as being for saved receipts, which gives an agent a clear context for when it is appropriate. It does not explicitly name alternative tools or exclusions, so it stops short of full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_parse_urlA
Parse an arbitrary URL using an existing receipt as a template for its selectors/strip_tags/language. Does not persist the result as a receipt.
Returns the emitted filename and the rendered markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| url | 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 provided, the description carries the full burden of behavioral disclosure. It discloses the non-persistence side effect and the return value (filename and rendered markdown), which is helpful. However, it does not mention other behavioral aspects such as potential network calls, error conditions, or whether it requires any prerequisites like the receipt existing, leaving some gaps.
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 primary purpose, and every phrase adds value. It avoids redundancy and delivers the essential information (template usage, non-persistence, return type) without 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 two-parameter tool with an output schema, the description covers the key functional points but leaves critical details unspecified. It does not explain what 'key' refers to, does not mention prerequisites (e.g., the receipt must exist), and does not address potential errors or edge cases. While the output schema may cover return details, the lack of parameter definitions is a notable gap.
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. It only hints that 'key' refers to an existing receipt ('using an existing receipt as a template') but does not explicitly define either parameter. 'key' remains ambiguous without further clarification, and 'url' is only inferred from the tool name. This is insufficient given the lack of schema descriptions.
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 parses an arbitrary URL using an existing receipt as a template, and explicitly notes it does not persist the result. This specific verb-resource pair and the non-persistence differentiator set it apart from sibling tools like doc_parse or receipt_add, making its 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?
It provides clear context for when to use the tool: when an existing receipt should serve as the template for selectors/strip_tags/language. It also implicitly advises against using it when persistence is needed by stating 'Does not persist the result as a receipt.' However, it does not explicitly name alternative tools or state when not to use it, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_probeA
Probe a documentation page to discover its selector structure.
Fetches the URL statically and reports which candidate CSS selectors match, the H2 section structure, and sample internal links. The findings' best_selector can be used to create a new receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| url | 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 behavioral burden. It discloses that the tool fetches the URL statically, reports matching candidate CSS selectors, H2 sections, and sample internal links. It does not mention errors, auth, or rate limits, but for a read-only probe with an output schema this is a reasonable 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?
Three sentences, no filler. The purpose is front-loaded, the second sentence details the behavior, and the third explains how the result is used. Every sentence 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?
The tool is simple: one required string parameter, no nested objects, and an output schema exists, so return values need not be explained. The description covers purpose, behavior, and downstream use. The only notable omission is explicit guidance about when to choose doc_probe_js, though 'statically' already hints at the boundary.
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 only parameter, url, has no schema description (0% coverage). The description compensates by identifying the URL as a documentation page and stating that it is fetched statically. Format constraints are not given, but the single param's role is obvious from the tool name and 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 opens with a specific verb and resource: 'Probe a documentation page to discover its selector structure.' It clearly conveys the tool's unique role among siblings by emphasizing static fetching and selector-oriented output, and even connects the result to creating a receipt.
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 context: use this to probe a documentation page and discover its selector structure for making a receipt. The word 'statically' implies choosing this over a JS-rendering alternative, but it does not explicitly name doc_probe_js or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_probe_jsA
Probe a JS-rendered documentation page via headless Chromium.
Same selector report as doc_probe, but over the rendered DOM, plus detection of a 'Copy as Markdown' button (a saved receipt then pre-fills js_render and markdown_passthrough). Requires Playwright Chromium installed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 a meaningful side effect: a saved receipt that 'pre-fills js_render and markdown_passthrough,' plus the headless-Chromium mechanism. But it remains silent on whether the operation is read-only, failure modes (e.g., if Chromium is missing or the page never renders), and network behavior toward external pages, so the disclosure is partial.
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 compact sentences with no filler: the first front-loads the core purpose, the second contrasts with doc_probe and adds the Markdown detection, the third notes the prerequisite and side effect. Each sentence earns its place, though the second sentence packs several ideas together slightly densely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers the mechanism, prerequisite, the distinction from doc_probe, and the receipt side effect. It references js_render and markdown_passthrough, which are not among the listed siblings, creating minor ambiguity about those targets, but overall the definition is substantially complete for a single-parameter tool with an output schema.
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. It never explicitly documents the url parameter, though the tool's purpose makes it obvious that url is the documentation page to probe. Since there is only one trivial parameter, the implied meaning mostly suffices, but there is no explicit parameter guidance to offset the 0% 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 states a specific action ('Probe a JS-rendered documentation page'), a concrete resource, and the mechanism (headless Chromium). It differentiates itself from doc_probe by noting it operates 'over the rendered DOM' and adds a Markdown-copy detector. It relies on the reader already knowing what doc_probe's 'selector report' is, so it's clear but slightly dependent on sibling 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 'Same selector report as doc_probe, but over the rendered DOM' clause communicates the intended use case: dynamic/JS-rendered pages that static probing would miss. It also states a concrete prerequisite ('Requires Playwright Chromium installed'). However, the when-to-use vs. alternatives guidance is implied through the contrast with doc_probe rather than stated as an explicit rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_datetimeA
Return the current local and UTC date/time in ISO 8601 format.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for disclosing behavioral traits. It does state the return format and that the tool returns a value, which implies a read-only operation, but it does not explicitly mention absence of side effects, authentication requirements, or reliability characteristics. This is a gap for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the operation, scope (local and UTC), and format (ISO 8601) without 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?
For a zero-parameter utility with an output schema present, this description is complete. It specifies the output format, and the output schema will handle the exact return structure. Nothing an agent needs to invoke this tool correctly appears to be 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?
The tool has zero parameters, so the baseline for this dimension is 4. There is no parameter information to add, and the description appropriately avoids inventing semantics for parameters that do not 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 description states a specific verb ('return'), a clear resource ('current local and UTC date/time'), and an exact output format ('ISO 8601'). It is distinct from all sibling tools, none of which are date/time related, so an agent can easily identify what this tool does.
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 usage: use this when you need the current date/time in ISO 8601. However, it does not explicitly state when to use it, nor are there any alternative datetime tools among the siblings to differentiate from. The context is clear enough but entirely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_addA
Create a new receipt (or replace an existing one).
Required: key, name, language, urls, selectors. Optional: strip_tags, section, js_render, markdown_passthrough, notes, code_language. Validates before writing; returns validation errors if the receipt is malformed.
language is the human language of the documentation. code_language
optionally overrides the ``` fence language when the page's blocks are
in another language (e.g. a React SDK doc in English that emits
TypeScript). When omitted, the fence language is auto-detected from the
page and falls back to language only if it names a code language.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| name | Yes | ||
| urls | Yes | ||
| notes | No | ||
| section | No | ||
| language | Yes | ||
| js_render | No | ||
| selectors | Yes | ||
| strip_tags | No | ||
| code_language | No | ||
| markdown_passthrough | 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 behavioral burden and does meaningful work: it discloses upsert semantics, validation-before-write, validation error returns, and the language/code_language fallback behavior. It does not cover permissions or whether omitted fields are cleared on replacement, but the main side effects are visible.
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 compact and front-loaded: a one-sentence purpose, a terse required/optional list, and then focused detail on the ambiguous language parameters. Every sentence adds information and there is no filler 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?
For an 11-parameter tool, the description provides the most decision-critical facts: what the tool does, what must be supplied, and how language/code_language interact. It stops short of defining urls, selectors, strip_tags, js_render, and markdown_passthrough, leaving an agent partly reliant on parameter names, though the core invocation path is still clear.
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 for the input schema's silence. It thoroughly explains the two least obvious parameters, language and code_language, including auto-detection and fallback behavior, but the other nine parameters are only named and not semantically defined.
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 a specific action and resource: 'Create a new receipt (or replace an existing one).' This makes the core purpose clear and distinguishes it from list/show/delete tools, but it does not explicitly contrast itself with the sibling receipt_edit, leaving some add-vs-edit ambiguity.
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 identifies required versus optional parameters and states that validation runs before writing, which gives useful preconditions for calling the tool. However, it never explicitly says when to prefer receipt_add over receipt_edit or when replacement would be inappropriate, so usage guidance is mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_deleteA
Delete a receipt by key. Returns false if the key does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait: returns false if the key does not exist, which is useful for an agent to know the outcome of a delete attempt. However, with no annotations provided, the description carries the burden of behavioral disclosure; it does not mention whether deletion is permanent, whether it requires confirmation, or any side effects beyond the return 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?
The description is two short sentences with no wasted words. It front-loads the action and resource, then adds the return behavior. Every sentence 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 simple one-parameter delete tool, the description is mostly complete: it states the action, the target, and the return value for a missing key. However, it lacks context about whether the deletion is permanent, any prerequisites (e.g., the receipt must exist), or how the key is structured. The output schema exists but the description doesn't need to explain return values beyond the false case.
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 for the single parameter 'key'. The description says 'by key' but does not explain what a key is, its format, or how to obtain it. Since there is only one parameter and the description names it, it provides minimal but not complete semantics.
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 ('delete') and resource ('receipt by key'), and distinguishes itself from siblings like receipt_edit and receipt_add. It clearly identifies the operation and the target, though it doesn't explicitly contrast with sibling 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 implies usage: call this when you need to delete a receipt by its key. It does not explicitly state when not to use it or mention alternatives, but the sibling context (receipt_edit, receipt_add) makes the intended use reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_editA
Patch specific fields of an existing receipt.
updates is a JSON object of field → value. Allowed fields: name,
language, urls, selectors, strip_tags, section, js_render,
markdown_passthrough, notes, code_language. Returns false if the key
does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| updates | 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 burden of behavioral disclosure. It does disclose a meaningful behavior: 'Returns false if the key does not exist.' It also lists allowed fields, implying invalid fields are not permitted. However, it does not address what happens for invalid field names/value types, whether changes persist immediately, or any permission/reversibility concerns.
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 compact and front-loaded with the core purpose, then adds the necessary `updates` contract, allowed fields, and failure behavior. Every sentence earns its place, and the allowed-field list is formatted for easy scanning.
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 that an output schema exists and siblings like receipt_list/receipt_show can supply keys, the description covers the essential call contract: what it patches, which fields are allowed, and what happens if the receipt key is missing. It could be slightly more explicit about `key` being the receipt identifier and how partial updates interact with existing values, but it is adequate for a 2-parameter 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 add meaning to both parameters. It thoroughly explains `updates` as a JSON object of field → value and lists the allowed fields. The `key` parameter is only indirectly explained through 'existing receipt' and 'Returns false if the key does not exist,' which is useful but could be more explicit.
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 a specific verb and resource: 'Patch specific fields of an existing receipt.' It clearly differentiates from sibling tools like receipt_add, receipt_delete, and receipt_show by indicating this is an update/modification operation, and it enumerates the allowed updatable fields.
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 phrase 'Patch specific fields of an existing receipt' gives clear context for when to use this tool: modifying an already-created receipt rather than adding, deleting, or reading it. It does not explicitly name alternatives or state when not to use it, but the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_listA
List all registered receipts with key, language, and last-fetch status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. 'List all registered receipts' communicates a read-only enumeration action, and naming the returned fields gives an agent a clear expectation of the output. It does not describe sorting, pagination, or potential empty results, but those are minor for such a simple 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 single front-loaded sentence with no filler. Every element—verb, scope, and return fields—earns its place and directly supports agent decision-making.
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 no parameters and an output schema present, the description is complete enough for an agent to invoke the tool correctly. It clearly states that the tool lists all registered receipts and indicates what information is returned. No additional context is necessary for a simple listing 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 input schema has zero parameters, so the baseline is 4. The description reinforces that the tool lists 'all' receipts, implying no filtering is possible or needed. There are no parameter semantics to clarify further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List all registered receipts.' It clearly identifies the operation's scope ('all') and names the output fields ('key, language, and last-fetch status'), making it distinct from sibling tools like receipt_show or receipt_delete.
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 states what the tool does but provides no guidance about when to prefer it over alternatives, such as receipt_show for a single receipt or receipt_add for creating one. It does not mention any context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_reloadA
Re-read receipts.json from disk (pick up external edits).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 of behavior. It discloses that the tool re-reads from disk, which implies refreshing state, but it does not warn that unsaved in-memory edits from receipt_edit might be overwritten. That is a meaningful behavioral gap for a reload 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 single sentence that states the operation, the resource, and the intent without any filler. 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 no-parameter tool with an output schema present, the description is nearly complete. The only missing context is an explicit note about whether reloading discards unsaved in-memory edits, which would help an agent avoid unintended state loss.
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 description coverage is 100%, so no parameter documentation is needed. The baseline for zero-param tools is 4, and the description does not need to add parameter-level detail.
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 names a specific verb ('re-read') and resource ('receipts.json from disk') and gives the reason: to pick up external edits. This clearly distinguishes it from siblings like receipt_list or receipt_show, which inspect receipts rather than refresh the state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pick up external edits' communicates when to use the tool: after receipts.json has been modified outside of the MCP tooling. It does not explicitly list when not to use it or name alternatives, but the intended use case is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
receipt_showB
Show the full JSON of a single receipt by its key.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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, but it only conveys that this is a read ('show') operation. It doesn't disclose behavior on a missing/invalid key, whether the receipt must already exist, or any size/pagination constraints on the returned JSON. Given zero annotation coverage, this is a significant 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?
A single sentence with no wasted words. The core operation, scope (single receipt), output type (full JSON), and argument (key) are all front-loaded efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and only one required parameter, the description covers the basic call contract. However, it omits how the key is obtained (likely from receipt_list) and doesn't address error cases, leaving minor gaps for an otherwise simple retrieval 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 bare schema offers only a 'Key' string property. The description adds meaning by stating the key identifies a single receipt and that the result is the full JSON. It doesn't explain key format or provenance, but it does clarify the parameter's role beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and resource ('the full JSON of a single receipt') and clarifies it operates on a single item 'by its key,' which distinguishes it from receipt_list (multiple receipts) and the mutation siblings (add/edit/delete). It doesn't explicitly name a sibling, but the single-vs-list distinction 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 is given on when to use this versus receipt_list or the other receipt tools. There's no stated prerequisite (e.g., that the key is obtained from receipt_list) or explicit exclusion of alternatives. Any sense of when to call it must be inferred from the name and the word 'single.'
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.
12 tool updates
v0.1.0- First observed
doc_output - First observed
doc_parse - First observed
doc_parse_url - First observed
doc_probe - First observed
doc_probe_js - First observed
get_current_datetime - First observed
receipt_add - First observed
receipt_delete - First observed
receipt_edit - First observed
receipt_list - First observed
receipt_reload - First observed
receipt_show
TDQS
Scored across 12 tools
The receipt CRUD, parse, and probe tools are clearly separated by resource and action. The only potentially confusable pair is doc_parse vs doc_parse_url, but their descriptions distinguish saved-receipt parsing from arbitrary-URL parsing; get_current_datetime is unrelated but unambiguous.
Most tools follow an object_verb pattern such as receipt_list, receipt_add, doc_parse, and doc_probe, making the set predictable. get_current_datetime breaks the pattern, and doc_output is noun-styled, but the prefix grouping keeps names readable and consistent overall.
Twelve tools is a reasonable, well-scoped count for managing receipt configurations, parsing documentation, probing selectors, and listing outputs. The get_current_datetime tool feels slightly out of place, but the set is not bloated or thin.
The receipt lifecycle is fully covered with list/show/add/edit/delete/reload, and the parse/probe workflow handles both static and JS-rendered pages plus dry runs. A minor gap is the inability to read the contents of already-generated output files, since doc_output only lists filenames.
Maintenance
Related MCP Connectors
Convert files, URLs, and documents to clean, AI-ready Markdown via MCP.
MCP server (stdio): fetch web pages as clean readable markdown via the AgentForge API
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
Publish and share access-controlled Markdown documents from any MCP-enabled AI tool.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that allows AI agents to fetch and process llms.txt documentation from various sources. Fetch documentation from any HTTPS URL and automatically convert HTML content to readable markdown.24 npm2MIT
- AlicenseNot gradedqualityAmaintenanceConverts Apple Developer documentation, HIG, WWDC transcripts, and external Swift-DocC pages into Markdown for AI consumption via MCP tools and HTTP API.310 npm476MIT
- FlicenseAqualityDmaintenanceConverts files (PDF, DOCX, PPTX, XLSX, images via OCR) and URLs to Markdown, enabling AI clients to read them via a single MCP tool.1-
- AlicenseNot gradedqualityAmaintenanceMCP server that fetches and converts website pages into clean markdown for agents, with sitemap-based discovery, disk caching, and polite crawling (robots.txt, rate limiting).7 npm2MIT