jDocMunch MCP

Indexes documentation by heading so a coding agent can fetch one section instead of a whole file

By J. Gravelle (individual) Python Local · stdio Developer toolsKnowledge and memory

56 popularity score ★ 206 ↓ 5.5k/mo

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add jdocmunch -- uvx jdocmunch-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "jdocmunch": {
      "command": "uvx",
      "args": [
        "jdocmunch-mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "jdocmunch": {
      "command": "uvx",
      "args": [
        "jdocmunch-mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "jdocmunch": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "jdocmunch-mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.jdocmunch]
command = "uvx"
args = ["jdocmunch-mcp"]
Gemini CLITerminal
gemini mcp add --scope user jdocmunch uvx -- jdocmunch-mcp

Settings 12

GITHUB_TOKEN secret Optional: GitHub token for higher API limits and private repositories.
DOC_INDEX_PATH Optional: Folder where indexes are stored. Default ~/.doc-index.
JDOCMUNCH_SHARE_SAVINGS Optional: Set to 0 to stop the anonymous savings counter. Default 1.
Set together: summaries
ANTHROPIC_API_KEY secret Optional: Claude key for section summaries, used only when the provider is named or JDOCMUNCH_ALLOW_PAID_SUMMARIES=1.
JDOCMUNCH_SUMMARIZER_PROVIDER Optional: Names the summary provider, which also allows a paid one.
Set together: embeddings
GOOGLE_API_KEY secret Optional: Gemini key for summaries or embeddings, used only when the provider is named or the matching JDOCMUNCH_ALLOW_PAID setting is 1.
OPENAI_API_KEY secret Optional: OpenAI key for summaries or embeddings, used only when the provider is named or the matching JDOCMUNCH_ALLOW_PAID setting is 1.
JDOCMUNCH_EMBEDDING_PROVIDER Optional: Names the embedding provider: gemini, openai, openai-compatible, fastembed, sentence-transformers or none.
Set together: ocr
JDOCMUNCH_OCR Optional: Set to 1 to allow OCR of scanned PDFs (the call must also ask for it).
JDOCMUNCH_TESSERACT_PATH Optional: Path to a Tesseract program, checked before PATH.
JDOCMUNCH_OCR_ENGINE Optional: OCR engine: auto, tesseract or windows. Default auto.
JDOCMUNCH_OCR_LANG Optional: Installed Tesseract languages to use. Default eng.

What it does

jDocMunch MCP is a local Python server that breaks a documentation set into a tree of sections keyed by headings. For each section it records byte offsets into the source file. An agent can then search the docs, pick the section it wants and read just that part instead of the whole file.

You point it at a local folder or at the docs of a GitHub repository. Local folders can hold Markdown/MDX, reStructuredText, AsciiDoc, Jupyter notebooks, HTML, plain text, OpenAPI YAML, JSON, XML and Godot scenes. PDF, DOCX, PPTX and EPUB need the optional [office] extra. Since 1.149.0 there is also an [ocr] extra for scanned PDFs, which uses Tesseract or the built-in Windows OCR if one is already installed. Search is BM25 keyword ranking until you configure an embedding provider (Gemini, OpenAI, an OpenAI-compatible endpoint, or a local FastEmbed or sentence-transformers model), and then it ranks by both. Other tools walk the heading tree, query OpenAPI specs and report doc health such as broken links and orphan pages.

Version 1.150.1 registers 64 tools in server.py. JDOCMUNCH_TOOL_PROFILE (core, standard or full, with full as the default) and JDOCMUNCH_DISABLED_TOOLS cut that list down. A folder too big to index within a client's tool timeout can be indexed from a shell with `jdocmunch-mcp index-local`, which writes to the same store. Indexes live under ~/.doc-index/ unless DOC_INDEX_PATH is set.

The code is stricter about paid providers than the README lets on. A cloud key sitting in the environment is ignored for summaries and embeddings unless you name the provider in JDOCMUNCH_SUMMARIZER_PROVIDER or JDOCMUNCH_EMBEDDING_PROVIDER, or set JDOCMUNCH_ALLOW_PAID_SUMMARIES=1 or JDOCMUNCH_ALLOW_PAID_EMBEDDINGS=1 (summarizer/batch_summarize.py and embeddings/provider.py at v1.150.1).

It is dual-licensed. Personal and non-commercial use is free, and commercial use needs a paid one-time licence from jMunch LLC.

What it needs

RuntimePython 3.10+
Runs onmacOS, Windows, Linux
Also
  • uv, for the uvx launch command
  • Tesseract or Windows OCR already installed, only for scanned PDFs

Local indexing and keyword search need no account or key. GITHUB_TOKEN raises the GitHub API limit. Cloud summaries or embeddings need a key plus the provider named (JDOCMUNCH_SUMMARIZER_PROVIDER, JDOCMUNCH_EMBEDDING_PROVIDER) or JDOCMUNCH_ALLOW_PAID_SUMMARIES=1 / JDOCMUNCH_ALLOW_PAID_EMBEDDINGS=1. OpenAI-compatible summarizers need `uvx --with openai jdocmunch-mcp`. Local embeddings need the [fastembed] extra and a one-time model download. Office formats need the [office] extra. Scanned PDFs need the [ocr] extra, an engine already installed, JDOCMUNCH_OCR=1 and ocr=true on the call. Commercial use needs a paid licence.

Limits

  • Not covered doc_index_repo fetches only .md and .txt files from GitHub. The other formats, office files and OCR work for local folders only.
  • Size cap Files over 5 MB are skipped by default (JDOCMUNCH_MAX_FILE_SIZE), and a folder is capped at 10,000 files, newest first, unless max_files is raised.
  • Limit Without an embedding provider, search is keyword-only and weaker on paraphrased questions.
  • Limit Section retrieval saves little on small files with a single heading.
  • Limit Freshness is reported, not guaranteed. A section whose source can't be checked is marked unknown.
  • Not covered It does not parse source code. Its makers point to jcodemunch-mcp for code and jdatamunch-mcp for tabular data.
  • Limit OCR reads printed prose well, but tables and forms may come out scrambled and black-letter or handwritten text is not read.
  • Size cap Over MCP, OCR gets a 60-second budget per call and reads the first 50 scanned images of a document by default. The CLI has no time budget.
  • Limit Hooks need an installed copy (uv tool install, pipx or pip), not uvx.
  • Cost Commercial use needs a paid one-time licence from jMunch LLC.

Indexing a GitHub repository with doc_index_repo picks up only .md and .txt files; the other formats and the office formats work only for local folders (server.py at v1.146.0). Files over 5 MB are skipped by default (JDOCMUNCH_MAX_FILE_SIZE). Without an embedding provider, search is keyword-only and weaker on paraphrased questions. Section retrieval saves little on small files with one heading. Freshness is reported, not guaranteed: a section whose source can't be checked is marked unknown. It doesn't parse source code; its makers point to jcodemunch-mcp for code and jdatamunch-mcp for tabular data. Hooks need an installed copy (uv tool install, pipx or pip), not uvx.

Who it suits

Suits developers whose agents read large documentation sets, such as framework docs, internal wikis or OpenAPI specs, who want section-sized reads and want everything kept on their own machine. Keyword search works offline with no keys. It suits personal and non-commercial projects without cost; a company using it needs a paid licence. For code symbols, its makers point to jcodemunch-mcp, and for tabular data to jdatamunch-mcp, both from the same author. On small doc sets with few headings it adds little over reading the files directly.

Tools 60 of 64

55 only read, 4 change things, 1 can delete or overwrite. A ? marks an optional parameter.

index_local changes
Index a local documentation folder into sections, with OCR for scans when enabledpath: stringuse_ai_summaries?: booleanuse_embeddings?: anyextra_ignore_patterns?: arrayocr?: booleanocr_budget_seconds?: numberocr_max_pages?: integerinclude_dot_dirs?: arrayfollow_symlinks?: booleanmax_files?: integersort_by?: enumname?: stringincremental?: booleanautotune?: booleanpaths?: arrayworktree_mode?: enumlegacy_reconcile?: enum
doc_index_repo changes
Index the .md and .txt docs of a GitHub repositoryurl: stringref?: stringuse_ai_summaries?: booleanuse_embeddings?: anyname?: stringincremental?: boolean
doc_list_repos
List the documentation indexes already built
get_index_overview
Summarise one index: doc and section counts, formats, top tagsrepo: stringtop_n?: integer
get_doc
Show detail for one indexed documentrepo: stringdoc_path: string
list_docs
List every document in an index with size and section countrepo: stringpath_glob?: stringlimit?: integeroffset?: integer
get_toc
Flat table of contents for an index, without contentrepo: stringpath_glob?: stringlimit?: integeroffset?: integer
get_toc_tree
Nested heading tree per document, without contentrepo: stringpath_glob?: stringlimit?: integeroffset?: integer
get_document_outline
Heading hierarchy of a single documentrepo: stringdoc_path: string
search_sections
Ranked section search, keyword or hybrid with embeddingsrepo?: stringquery: stringdoc_path?: stringpath_glob?: stringmax_results?: integersemantic?: booleansemantic_only?: booleansemantic_weight?: numberrole?: stringprofile?: enumdedupe?: booleanmin_answerability?: numbermin_quotability?: numbermin_level?: integermax_level?: integertags?: arrayexclude_tags?: arrayroles?: arrayexclude_roles?: arraymin_byte_length?: integer
count_sections
Count sections matching search filtersrepo: stringdoc_path?: stringpath_glob?: stringrole?: stringroles?: arrayexclude_roles?: arraytags?: arrayexclude_tags?: arraymin_level?: integermax_level?: integermin_byte_length?: integermax_byte_length?: integer
search_titles
Quick match on section headings onlyrepo: stringquery: stringmax_results?: integer
get_section
Read the full text of one sectionrepo: stringsection_id: stringverify?: booleanstrip_boilerplate?: booleancompress_code?: boolean
get_sections
Read several sections in one callrepo: stringsection_ids: arrayverify?: booleanstrip_boilerplate?: booleancompress_code?: boolean
get_section_context
Read a section with its parent headings and child summariesrepo: stringsection_id: stringmax_tokens?: integerinclude_children?: booleaninclude_related?: booleanstrip_boilerplate?: boolean
describe_section
Metadata, breadcrumb and neighbours for one sectionrepo: stringsection_id: string
section_neighbors
Previous, next, parent and first child of a sectionrepo: stringsection_id: string
get_recent_changes
List sections whose source changed since indexingrepo: stringinclude_stale?: booleaninclude_edited?: booleanlive_source?: boolean
get_all_roles
List section role classes with countsrepo: stringsample_size?: integer
get_all_tags
List hashtags used in the docs with countsrepo: stringmin_section_count?: integer
get_section_descendants
List every section below a headingrepo: stringsection_id: stringmax_depth?: integer
get_section_excerpts
Short previews for several sectionsrepo: stringsection_ids: arraymax_bytes?: integer
get_section_excerpt
Short preview of one section, 500 bytes by defaultrepo: stringsection_id: stringmax_bytes?: integer
get_section_path
Breadcrumb from the document root to a sectionrepo: stringsection_id: string
get_orphan_sections
Find docs no other doc links torepo: stringinclude_same_doc?: boolean
get_section_summary
Full stored metadata for one sectionrepo: stringsection_id: string
get_section_summaries
Stored metadata for many sectionsrepo: stringsection_ids: array
delete_index deletes
Delete an index and its cached filesrepo: string
get_broken_links
Find internal links that no longer resolverepo: string
get_doc_coverage
Check which jcodemunch code symbols have docsrepo: stringsymbol_ids: array
get_backlinks
Find sections linking to a documentrepo: stringdoc_path: string
get_stale_pages
Find wiki pages whose declared sources changedrepo: stringsources_dir?: string
get_wiki_stats
Wiki health summary: orphans, links, stalenessrepo: string
get_watch_status
Report doc-watcher coverage and login-service state
finalize_handoff
Assemble a Markdown report from sections read this sessionrepo: stringtask: stringsections: arrayevidence_refs: arrayprofile?: stringappendices?: array
find_code_examples
Search fenced code blocks in the docsrepo: stringquery: stringlang?: stringdoc_path?: stringpath_glob?: stringmax_results?: integer
link_code_to_symbols
Match doc code blocks to jcodemunch code symbolsrepo: stringcode_repo: stringmax_examples?: integermax_symbols_per_block?: integer
resolve_related_code_repos
Find jcodemunch code indexes matching a docs indexrepo: string
doc_resolve_repo
Map a file path to the index that covers itpath: string
find_endpoint
Find OpenAPI operations by path, method or tagrepo: stringpath?: stringmethod?: stringtag?: string
list_endpoints_by_tag
List OpenAPI operations with a given tagrepo: stringtag: string
find_operations_using_schema
List OpenAPI operations that use a schemarepo: stringschema_name: string
get_schema_graph
Walk the references from one OpenAPI schemarepo: stringschema_name: stringmax_depth?: integer
lookup_term
Look up a glossary termrepo: stringterm: string
list_terms
List glossary terms, optionally by prefixrepo: stringprefix?: stringmax_results?: integer
get_related_sections
Sections related to one by structure and linksrepo: stringsection_id: stringmode?: enumtop_n?: integermin_score?: numbermax_per_kind?: integer
get_section_diff
Diff a section's indexed text against the file on diskrepo: stringsection_id: string
get_doc_health
Health diagnostics for an indexrepo: string
doc_health_radar
Six-axis health score for a doc setrepo: string
get_doc_pr_risk_profile
Risk score for a set of doc changesrepo: stringchanged_sections: array
get_tutorial_path
Rebuild an ordered tutorial sequence from a sectionrepo: stringsection_id: string
get_undocumented_symbols
List code symbols in a jcodemunch index with no docsrepo: stringcode_repo: stringmax_symbols?: integer
list_repo_groups
List named groups of indexes
define_repo_group changes
Create, replace or delete a named group of indexesname: stringrepos: array
tune_weights changes
Propose and save a search weight from telemetry (needs JDOCMUNCH_PERF_TELEMETRY=1)repo?: stringmin_events?: integerdry_run?: booleanmax_age_days?: integerset_weight?: number
verify_index
Check stored byte offsets still match the filesrepo: stringsample?: integersource?: enum
find_similar_sections
Find near-duplicate sectionsrepo: stringmin_score?: numbernear_duplicate_threshold?: numbermax_clusters?: integerexclude_same_doc?: booleanmax_sections?: integer
get_section_blast_radius
What else is affected by changing a sectionrepo: stringsection_id: stringmax_depth?: integer
check_section_delete_safe
Preflight check before deleting a sectionrepo: stringsection_id: stringtransitive_depth?: integerrecent_edit_days?: integer
jdocmunch_guide
Return the usage policy text for an agent's instructions file

Similar servers