mindlm-mcp
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., "@mindlm-mcpmake a mind map from https://example.com/article"
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.
mindlm-mcp
Turn text, web pages and PDFs into interactive mind maps — an MCP server and a command-line tool, with no API key required.
npx -y mindlm-mcp demoThat renders a built-in example and opens it. One HTML file, no build step, no account, no key.
Three inputs. Plain text or Markdown, an http(s) page, or a local PDF.
Two outputs. A Markdown outline you can edit, and a standalone HTML mind map (markmap) that works offline — every script is inlined.
Zero keys. Over MCP the server hands your own model a draft plus the cleaned source text and lets it write the final outline. Set your own API key only if you want the server to call a model itself. See How the outline gets written.
Docs and a live demo: https://qingchejun.github.io/mindlm-io/ · Source: https://github.com/qingchejun/mindlm-io
Quick start
Every client runs the same command — npx -y mindlm-mcp serve — and needs no environment
variables. MINDMAP_OUTPUT_DIR below is optional; it just decides where exported files land.
Claude Code
claude mcp add mindlm -- npx -y mindlm-mcp serveScope it to one project with --scope project, and pass environment variables with -e:
claude mcp add mindlm -e MINDMAP_OUTPUT_DIR=~/Documents/mindmaps -- npx -y mindlm-mcp serveCheck it with claude mcp list, or /mcp inside a session.
Claude Desktop
Add this to claude_desktop_config.json, then restart the app:
{
"mcpServers": {
"mindlm": {
"command": "npx",
"args": ["-y", "mindlm-mcp", "serve"],
"env": {
"MINDMAP_OUTPUT_DIR": "~/Documents/mindmaps"
}
}
}
}macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Cursor
The same block goes in ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"mindlm": {
"command": "npx",
"args": ["-y", "mindlm-mcp", "serve"]
}
}
}Ready-to-copy versions of all three live in examples/configs/.
Then ask for a mind map in plain language — "make a mind map of this PDF", "map out https://example.com/article" — and the client picks the right tool.
Related MCP server: gobbler-mcp
Tools
Four tools, always advertised in this order. The three *_to_mindmap tools return a Markdown
outline; export_mindmap turns an outline into an HTML file. Every result carries both a readable
text block and structuredContent.
text_to_mindmap
Outline text or Markdown you already have — a draft, notes, a transcript, a pasted chapter.
Field | Type | Notes |
| string, required | The content to map. Capped by |
|
| Default |
| string | Root node title. Derived from the source if omitted. |
| int 2–6 | Levels including the root. Default 4. |
| int 3–15 | Children kept per node. Default 8. |
| string | e.g. |
| boolean | Also render an HTML file and return its path. |
| string | Where that file goes. |
Input:
{
"text": "# Tides\n\nSpring tides are the largest of the month.\n\n## Neap\n\nNeap tides are the smallest.\n"
}structuredContent (default auto mode with no API key, i.e. client mode):
{
"title": "Tides",
"markdown": "# Tides\n\n## Spring tides are the largest of the month.\n\n### Neap\n- Neap tides are the smallest.\n",
"mode": "client",
"stats": { "inputChars": 79, "nodes": 4, "depth": 4, "truncated": false },
"sourceText": "# Tides\n\nSpring tides are the largest of the month.\n\n## Neap\n\nNeap tides are the smallest.",
"instructions": "This is a DRAFT outline produced by a rule-based algorithm. …"
}With "mode": "heuristic" (or when an API key makes it "llm") the result is the same minus
sourceText and instructions — the outline is final and ready to export.
url_to_mindmap
Fetch a page and outline its main content. Article text is extracted with
Readability; navigation, footers and boilerplate are
dropped. Page furniture goes too: reference markers ([1]), "[edit]" links, notes above the
article, image captions, navigation boxes, and the trailing See also / References / Notes /
Further reading / External links / Bibliography sections, which are link lists rather than
content. A URL that serves a PDF is handed to the PDF pipeline automatically.
Field | Type | Notes |
| string, required | http(s) only. Private and loopback addresses are refused. |
… | plus every option from |
Input:
{ "url": "https://example.com/tide-tables", "mode": "heuristic" }structuredContent adds a source block describing where the text came from:
{
"title": "Tide tables",
"markdown": "# Tide tables\n\n## Spring tides …\n\n## Neap tides …\n",
"mode": "heuristic",
"stats": { "inputChars": 1042, "nodes": 9, "depth": 3, "truncated": false },
"source": {
"url": "https://example.com/tide-tables",
"finalUrl": "https://example.com/tide-tables",
"title": "Tide tables",
"siteName": "Example",
"fetchedAt": "2026-09-27T10:21:04.512Z",
"contentType": "text/html"
}
}pdf_to_mindmap
Read a local PDF, using its bookmarks as the skeleton when it has them. A PDF stores positioned lines rather than paragraphs, so the soft-wrapped lines of one paragraph are rejoined before sentences are split — otherwise a browser's "print to PDF" would yield nodes like "releases oxygen." instead of whole sentences.
Field | Type | Notes |
| string, required | Path to a local PDF. |
| string | 1-based selection: |
… | plus every option from |
Input:
{ "path": "~/papers/attention.pdf", "pages": "1-12", "mode": "heuristic" }structuredContent:
{
"title": "mindlm-mcp PDF fixture",
"markdown": "# mindlm-mcp PDF fixture\n\n## 1. Introduction\n\n### Mind maps turn a wall of prose into something you can scan…\n",
"mode": "heuristic",
"stats": { "inputChars": 769, "nodes": 12, "depth": 4, "truncated": false },
"source": { "path": "/home/you/papers/attention.pdf", "totalPages": 3, "hasOutline": true }
}export_mindmap
Render a Markdown outline into a standalone HTML mind map. Call this after you (or your model) have written the outline. It will not overwrite an existing file unless you ask.
Field | Type | Notes |
| string, required | One |
| string | Page title. Defaults to the outline root. |
| string | File, or a directory to generate a name in. |
| boolean | Inline every script. Default |
| boolean | Zoom / fit / expand toolbar. Default |
| int −1–6 | Levels expanded on open; |
| int 0–6 | Stop changing branch colour below this level. |
| int 0–2000 | Maximum node width in pixels; |
| boolean | Replace the file if it exists. Default |
| boolean | Include the whole document in the result. Default |
| boolean | Add a small "Made with mindlm-mcp" footer link. Default |
Input:
{
"markdown": "# Tides\n\n## Spring\n\n- Sun and moon in line\n\n## Neap\n\n- At right angles\n"
}structuredContent:
{
"path": "/home/you/mindmaps/tides-20260927-183322.html",
"fileUrl": "file:///home/you/mindmaps/tides-20260927-183322.html",
"bytes": 344349,
"nodes": 5,
"offline": true
}Prompt
The server also exposes one prompt, mindmap_outline, which returns the outline rules
(optionally in a given language) followed by an instruction to call export_mindmap.
Command line
The same pipeline without a client. With no arguments and no terminal attached, mindlm-mcp
starts the MCP server — which is what an MCP client wants.
mindlm-mcp demo # render a built-in example and open it
mindlm-mcp text notes.md -o notes.html # a file, or "-" to read stdin
mindlm-mcp url https://example.com/article --open
mindlm-mcp pdf paper.pdf --pages 1-20
mindlm-mcp export outline.md -o map.html # an outline you wrote yourself
mindlm-mcp serve # MCP server on stdio
mindlm-mcp doctor # runtime, LLM config, output directoryCommand | What it does |
| Start the MCP server on stdio. |
| Render the built-in example ( |
| Outline a |
| Fetch a page and outline its main content. |
| Outline a local PDF. |
| Render an existing Markdown outline. |
| Report what is configured and where files will be written. |
Options on the conversion commands:
Option | Meaning |
| Write here. A |
| Root node title and page title. |
| Print the Markdown outline to stdout. |
| How the outline is written. |
| Shape of the tree. |
| Language for the node labels. |
| Override the LLM configuration. |
| Link CDN assets instead of inlining them. |
| Hide the mind map toolbar. |
| Open the result in a browser. |
| Replace the output file if it exists. |
| Add the "Made with mindlm-mcp" footer link. |
| Only print results, no progress. |
| Load environment variables from a file first. |
Results a script might consume (a file path, an outline) go to stdout; progress and diagnostics go
to stderr. Exit codes: 0 ok, 1 usage error, 2 input error, 3 LLM error.
There is also a small programmatic API — textToOutline, urlToOutline, pdfToOutline,
renderMindmapHtml, exportMindmap — exported from the package root.
How the outline gets written
Deciding what belongs in the tree is the hard part, and there are three ways to do it. You never have to supply a key for any of this to work.
Mode | When it is used | What happens |
| MCP default with no key | The server returns a rule-based draft, the cleaned source text and instructions. Your client's model — the one you are already talking to — rewrites the outline and calls |
| CLI default with no key | Rules only, no network: headings become branches, ranked sentences become leaves. Fast, deterministic, offline. |
| Whenever | The server calls that model itself, over plain |
mode: "auto" (the default everywhere) picks the row that applies. You can always force one with
mode over MCP or --mode on the CLI. Run mindlm-mcp doctor to see which one auto resolves to
right now.
There is no hosted service behind any of this: no telemetry, no update check, no call home.
Configuration
Every variable is optional. Copy .env.example to .env and pass it explicitly
with --env-file .env — nothing is loaded automatically — or set the variables in your MCP
client's env block.
Variable | Default | Meaning |
|
| Where exported HTML files go. |
| auto-detected |
|
| — | Switches |
| — | Same, for any OpenAI-compatible endpoint. |
|
| The endpoint used with |
|
| Model name. Required for OpenAI-compatible endpoints, where no name is portable. |
|
| Let |
|
| Hard cap on characters read from any one input. |
|
| Cap on the source text returned in |
The exported HTML
One file, openable with a double click. By default every script and stylesheet — d3, markmap-view,
the toolbar — is inlined, so the map keeps working with no network, on a locked-down machine, or
five years from now when a CDN has moved on. That costs about 340 KB per file; pass
offline: false (--no-offline) if you would rather link the CDN copies.
The KaTeX and highlight.js markmap plugins are deliberately disabled: both pull stylesheets from a
CDN, which would quietly break an "offline" export. Raw HTML in the outline is not rendered
(markdown-it runs with html: false), so text extracted from a hostile page cannot inject
script into the file you open.
Exports carry no attribution by default. --branding / branding: true adds one small footer
line if you want it.
Limitations
JavaScript-only pages.
url_to_mindmapreads the HTML the server sends. A single-page app that renders its content client-side will come back empty or nearly so — copy the text and usetext_to_mindmapinstead. There is no headless browser.Scanned PDFs. A PDF needs a real text layer. Scans and image-only exports are rejected with a clear error; there is no OCR.
Long documents are truncated, not chunked, at
MINDMAP_MAX_INPUT_CHARS. Usepageson a long PDF, or map it a section at a time.The heuristic is a draft. It ranks sentences by position and term frequency. It is stable and fast, and it will sometimes pick the wrong sentence. That is exactly why
clientmode exists.Paywalls, logins and robots. The fetcher sends no cookies and does not log in.
Security
SSRF guard.
url_to_mindmapresolves the host first and refuses loopback, private, link-local (including the169.254.169.254cloud metadata address), CGNAT and multicast ranges unless you setMINDMAP_ALLOW_PRIVATE_HOSTS=true. Onlyhttp:andhttps:are accepted.Limits. 5 MB per fetched response, a 15 s timeout, at most 5 redirects, 50 MB / 300 pages per PDF, and a character cap on every input.
No telemetry, no update check, no hosted backend. The only network calls are the URL you ask for and — if you configured a key — your own LLM endpoint.
No raw HTML in exports, and inlined JSON has
</script>escaped.Reporting a vulnerability, and the known DNS-rebinding caveat: SECURITY.md.
Launch materials and directory listings
This section is a placeholder owned by the outreach lead. Announcement copy, awesome-list entries
and MCP directory submissions (mcp.so, Glama, Smithery, PulseMCP, the official MCP Registry) are
tracked in docs/launch.md and are intentionally empty here.
Contributing
Issues and pull requests are welcome — see CONTRIBUTING.md. Requires Node ≥ 22.12.
npm ci && npm run lint && npm run typecheck && npm test && npm run buildWant a full editor?
mindlm-mcp is deliberately small: outline in, one HTML file out. If you want to keep editing the map afterwards — drag nodes around, restyle branches, collaborate, keep a library of maps — that is what mindlm.io is for. This package works completely on its own and never talks to it.
License
MIT © 2026 青澈君
Available Tools
4 toolsexport_mindmapExport a mind mapA
Render a Markdown outline into a standalone HTML mind map — interactive, single file, no network needed. Call this after you have written or refined an outline. Returns the file path; it does not overwrite an existing file unless you ask it to.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Page title. Defaults to the outline root. | |
| offline | No | Inline every script so the file works with no network (default true). | |
| toolbar | No | Show the zoom / fit / expand toolbar (default true). | |
| branding | No | Add a small "Made with mindlm-mcp" footer link (default false). | |
| markdown | Yes | The Markdown outline to render: one "# " root, "##"/"###", then "-" bullets. | |
| maxWidth | No | Maximum node width in pixels; 0 means unlimited. | |
| overwrite | No | Replace the file if it already exists (default false). | |
| outputPath | No | Output file or directory. Defaults to $MINDMAP_OUTPUT_DIR or ./mindmaps/. | |
| returnHtml | No | Include the full HTML in the result. Only useful for small maps (default false). | |
| colorFreezeLevel | No | Stop changing branch colour below this level. | |
| initialExpandLevel | No | Levels expanded on open; -1 expands everything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false and openWorldHint=false; the description corroborates this by stating it writes a file, returns the path, does not overwrite by default, and needs no network. That overwrite-safety and offline detail is genuine added context beyond the annotations, though permissions and error behavior are unmentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero padding: capability, output form, then invocation timing and the overwrite caveat. The most important constraint (no accidental overwrite) is placed where it is read.
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 writer with no output schema, the description covers the return value ('Returns the file path'), the non-destructive default, and the offline guarantee, so an agent can call it safely. Missing only the default output location, which the outputPath schema already supplies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters are already documented, and the description adds no per-parameter detail. It does reinforce the overwrite default in prose, which slightly clarifies the most consequential flag, but otherwise the schema does the work.
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 ('Render a Markdown outline into a standalone HTML mind map') plus the output characteristics (interactive, single file, no network). It implies the distinction from the url/pdf/text_to_mindmap siblings by framing itself as the step after an outline already exists, but never names or contrasts them 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?
'Call this after you have written or refined an outline' gives a clear triggering condition for the tool, which is the key decision point given the conversion-oriented siblings. It stops short of naming an alternative or stating 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.
pdf_to_mindmapPDF to mind mapARead-only
Read a local PDF and turn it into a mind-map outline, using its bookmarks as the skeleton when it has them. Scanned PDFs with no text layer are rejected — there is no OCR. Use pages to limit long documents.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto (default): use a configured API key if there is one, otherwise "client". client: get a draft plus the source text back and write the outline yourself. llm: the server calls the model configured by ANTHROPIC_API_KEY / OPENAI_API_KEY. heuristic: rule-based only, no model. | |
| path | Yes | Path to a local PDF file. "~" is expanded. | |
| pages | No | Page selection, 1-based, e.g. "1-20", "3" or "1-5,9". All pages by default. | |
| title | No | Root node title. Derived from the source if omitted. | |
| export | No | Also render the outline to a standalone HTML file and return its path. | |
| language | No | Language for the node labels, e.g. "English" or "中文". Defaults to the source language. | |
| maxDepth | No | Levels including the root (default 4). | |
| outputPath | No | Where to write the HTML when export is true. A directory gets a generated file name. Defaults to $MINDMAP_OUTPUT_DIR or ./mindmaps/. | |
| maxChildren | No | Children kept per node before the rest collapse into "…(+N)" (default 8). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the readOnlyHint/openWorldHint annotations: the no-OCR limitation and the bookmark-skeleton heuristic are things an agent cannot infer from the schema. It stays quiet on cost/latency of the LLM modes and on failure modes for malformed PDFs, so not quite a 5.
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 tight sentences, zero filler, with the core transform stated first and constraints (bookmarks, no OCR, pages) following. Nothing to cut.
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 9-parameter read tool with no output schema, the description covers purpose, source limitations, and scoping. It never hints at the shape of the produced outline (especially the draft-plus-source-text behavior in client mode), but that gap is largely filled by the mode parameter's own schema text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains mode, pages, export, title and the rest. The description only echoes the 'pages' parameter with the long-document hint, adding little beyond the schema. Baseline 3 applies.
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?
Specific verb ('Read a local PDF and turn it into a mind-map outline') plus the exact resource and behavior. It is instantly distinguishable from the siblings url_to_mindmap and text_to_mindmap, which take a different input source.
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 concrete conditions: bookmarks are used as the skeleton when present, scanned PDFs without a text layer are rejected, and 'pages' should be used for long documents. It lacks an explicit 'use this instead of url_to_mindmap when...' routing sentence, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_to_mindmapText to mind mapARead-only
Turn text or Markdown into a mind-map outline. Use this for content you already have — a draft, notes, a transcript, a chunk of a document. Returns a Markdown outline; pass export: true, or call export_mindmap afterwards, to get an HTML file.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | auto (default): use a configured API key if there is one, otherwise "client". client: get a draft plus the source text back and write the outline yourself. llm: the server calls the model configured by ANTHROPIC_API_KEY / OPENAI_API_KEY. heuristic: rule-based only, no model. | |
| text | Yes | The text or Markdown to map. Capped by MINDMAP_MAX_INPUT_CHARS (200k by default). | |
| title | No | Root node title. Derived from the source if omitted. | |
| export | No | Also render the outline to a standalone HTML file and return its path. | |
| language | No | Language for the node labels, e.g. "English" or "中文". Defaults to the source language. | |
| maxDepth | No | Levels including the root (default 4). | |
| outputPath | No | Where to write the HTML when export is true. A directory gets a generated file name. Defaults to $MINDMAP_OUTPUT_DIR or ./mindmaps/. | |
| maxChildren | No | Children kept per node before the rest collapse into "…(+N)" (default 8). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered; the description adds the return type ('Markdown outline') and the export side-effect path, which is the key behavioral fact. One minor tension: export writes an HTML file to disk while readOnlyHint=true, but that is a local artifact rather than remote state mutation, so it is not a real contradiction.
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 short sentences, zero filler, with the operation stated first and the export/escalation path last. Every sentence carries information an agent needs.
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?
No output schema exists, and the description correctly fills that gap by naming the return format and the HTML alternative. Combined with a fully documented 8-parameter schema, an agent has enough to call it, though the internal shape of the outline is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents mode, text, title, export, language, maxDepth, outputPath and maxChildren in detail. The description only restates the export flag and never adds syntax or defaults beyond the schema, so the baseline 3 applies.
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 ('Turn text or Markdown into a mind-map outline') and immediately scopes the input type ('content you already have') which implicitly separates it from url_to_mindmap and pdf_to_mindmap. An agent can pick this tool without opening any schema.
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 concrete input examples (draft, notes, transcript, document chunk) and explicitly routes the export case to the sibling ('pass export: true, or call export_mindmap afterwards'). It lacks an explicit when-not statement, but the 'content you already have' framing covers that implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
url_to_mindmapURL to mind mapARead-only
Fetch an http(s) page (or a PDF served over http) and turn its main content into a mind-map outline. Article text is extracted with Readability; navigation and boilerplate are dropped. Pages that render entirely in JavaScript will come back empty — paste the text into text_to_mindmap instead.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | An http(s) page or PDF. Server-rendered pages only — a JS-only SPA will come back empty. | |
| mode | No | auto (default): use a configured API key if there is one, otherwise "client". client: get a draft plus the source text back and write the outline yourself. llm: the server calls the model configured by ANTHROPIC_API_KEY / OPENAI_API_KEY. heuristic: rule-based only, no model. | |
| title | No | Root node title. Derived from the source if omitted. | |
| export | No | Also render the outline to a standalone HTML file and return its path. | |
| language | No | Language for the node labels, e.g. "English" or "中文". Defaults to the source language. | |
| maxDepth | No | Levels including the root (default 4). | |
| outputPath | No | Where to write the HTML when export is true. A directory gets a generated file name. Defaults to $MINDMAP_OUTPUT_DIR or ./mindmaps/. | |
| maxChildren | No | Children kept per node before the rest collapse into "…(+N)" (default 8). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds real behavioral context the annotations cannot: Readability extraction, dropping of navigation/boilerplate, and the hard failure mode of empty results on JS-rendered pages. It does not note network/auth constraints for fetching, but the failure-mode disclosure is the valuable part.
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, front-loaded with the core action, then extraction detail, then the failure mode and fallback. No filler; each sentence carries a distinct fact.
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 output schema, the description does tell the agent what comes back (a mind-map outline, plus source text in client mode). Given eight parameters fully documented in the schema and annotations covering the safety profile, this is nearly complete; only the PDF-vs-pdf_to_mindmap overlap is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter already carries its own enum explanation, default, and range. The description adds nothing parameter-specific beyond what the schema states. Baseline 3 is appropriate when the schema does all the work.
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: fetch an http(s) page/PDF and convert its main content into a mind-map outline. It names Readability as the extraction mechanism, which tells the agent exactly what content is used. It does not, however, clarify its boundary against the pdf_to_mindmap sibling, despite explicitly advertising PDF support.
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 an explicit exclusion and a named alternative: JS-only pages will come back empty, so use text_to_mindmap instead. That is exactly the kind of routing guidance an agent needs. It does not mention when to prefer pdf_to_mindmap or export_mindmap, so the routing is partial rather than complete.
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.
4 tool updates
v0.1.0- First observed
export_mindmap - First observed
pdf_to_mindmap - First observed
text_to_mindmap - First observed
url_to_mindmap
TDQS
Scored across 4 tools
Each tool maps to a clearly distinct input source (raw text, URL, local PDF) plus one distinct output operation (HTML export). The only mild overlap is url_to_mindmap also accepting remotely-served PDFs, but the descriptions explicitly differentiate remote vs. local handling.
Three tools share a clean {source}_to_mindmap pattern (text/url/pdf), and all four share the 'mindmap' suffix, making the set cohesive. export_mindmap deviates by using a verb_noun form rather than the source_to pattern, a minor inconsistency.
Four tools is compact and each earns its place: three input adapters and one exporter form a coherent pipeline. It leans slightly thin—no redundancy, but little room for edge operations—so not quite ideal.
The surface covers the core lifecycle: acquire content from text/URL/PDF, produce an outline, and render standalone HTML. Gaps are minor—no import of an existing outline file and no alternative export formats (PNG/SVG/OPML)—but agents can work around them.
Maintenance
Related MCP Connectors
Turn outlines and hierarchical notes into interactive mind maps through a hosted remote MCP server.
Convert documents and web pages to clean Markdown: PDF, DOCX, XLSX, EPUB, scanned files, any URL.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Convert files, URLs, and documents to clean, AI-ready Markdown via MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that converts Markdown text to interactive mind maps with support for rich interactive operations and multi-format exports.1539 npm287MIT
- AlicenseNot gradedqualityAmaintenanceConverts YouTube videos, audio, documents, and web pages to clean markdown with YAML frontmatter, providing AI assistants with structured content via the MCP protocol.4MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that converts PDF, video, web, and audio inputs into structured Markdown notes with support for checkpointing, batch processing, and Obsidian integration.-
- AlicenseAqualityBmaintenanceConverts documents, web pages, media, and more to Markdown via an MCP server with tools for conversion, inspection, vault capture, and format listing, all running locally with privacy-first design.51MIT