Skip to main content

A lightweight MCP server for MkDocs documentation sites

Project description

papermoon-mkdocs-mcp

A lightweight MCP server for MkDocs documentation sites. Reads markdown files directly from disk, provides full-text and optional semantic search, and exposes project structure through the Model Context Protocol.

Features

  • 5 MCP tools -- search, read_document, list_documents, get_project_info, get_document_outline
  • SQLite FTS5 keyword search with BM25 ranking (zero external dependencies)
  • Optional semantic vector search via sentence-transformers
  • Hybrid search combining keyword + vector results with Reciprocal Rank Fusion
  • Incremental indexing -- fast updates when files change
  • Persistent SQLite index that survives server restarts
  • Navigation-aware -- parses mkdocs.yml and .nav.yml
  • Security-first -- path traversal prevention, read-only search connections
  • Minimal dependencies -- 3 required, 2 optional

Installation

pip install papermoon-mkdocs-mcp

To enable vector search:

pip install papermoon-mkdocs-mcp[vector]

Quick Start

Run from the root of any MkDocs project (where mkdocs.yml lives):

cd /path/to/your/mkdocs-project
papermoon-mkdocs-mcp

Or point to a specific config file:

papermoon-mkdocs-mcp --config /path/to/mkdocs.yml

The server auto-detects mkdocs.yml in the current directory when --config is omitted.

Transport Options

By default the server uses stdio transport. You can switch to a network transport for remote or multi-client setups:

# Streamable HTTP (recommended for network access)
mkdocs-mcp --transport streamable-http --host 0.0.0.0 --port 9000

# SSE (legacy client compatibility)
mkdocs-mcp --transport sse --port 8080
Flag Default Description
--transport stdio stdio, sse, or streamable-http
--host 127.0.0.1 Bind address (network transports only)
--port 8000 Bind port (network transports only)

Security note: When binding to a non-loopback address, place the server behind a reverse proxy (e.g. nginx, Caddy) that terminates TLS.

MCP Client Configuration

Claude Desktop

Add to your Claude Desktop configuration file:

{
  "mcpServers": {
    "mkdocs": {
      "command": "papermoon-mkdocs-mcp",
      "args": ["--config", "/path/to/mkdocs.yml"]
    }
  }
}

Note: If Claude Desktop can't find the command (Failed to spawn process: No such file or directory), use the full path to the executable instead of just mkdocs-mcp:

{
  "mcpServers": {
    "mkdocs": {
      "command": "/path/to/.venv/bin/mkdocs-mcp",
      "args": ["--config", "/path/to/mkdocs.yml"]
    }
  }
}

This is common when the package is installed in a virtual environment whose bin/ directory isn't in Claude Desktop's PATH.

Claude Code / VS Code

Add to .mcp.json in your project root:

{
  "mcpServers": {
    "mkdocs": {
      "command": "papermoon-mkdocs-mcp",
      "args": ["--config", "/path/to/mkdocs.yml"]
    }
  }
}

Available Tools

search

Search documentation using keyword, semantic, or hybrid search.

Parameter Type Default Description
query str (required) The search query string
search_type str "hybrid" "keyword", "vector", or "hybrid"
max_results int 10 Maximum results to return (1--100)

Returns ranked results with path, title, relevance score (normalized 0.0--1.0), and text snippet.

read_document

Read a documentation file by its relative path.

Parameter Type Default Description
path str (required) Relative path from docs dir (e.g. guide/setup.md)

Returns the markdown body (frontmatter stripped), parsed frontmatter as a separate field, heading structure, and file metadata.

list_documents

List all documentation files, optionally filtered by section.

Parameter Type Default Description
section str or null null Directory prefix to filter by (e.g. guide)

Returns document metadata (path, title, description, categories, size, mtime).

get_project_info

Get MkDocs project metadata. Takes no parameters.

Returns site name, site URL, docs directory, theme, navigation tree, document count, and index status.

get_document_outline

Get the heading structure (table of contents) for a document.

Parameter Type Default Description
path str (required) Relative path from docs dir (e.g. guide/setup.md)

Returns the document title and a list of headings with level, text, and anchor.

Architecture

src/mkdocs_mcp/
  config.py      -- MkDocs config detection and nav parsing
  repository.py  -- SQLite schema and CRUD operations
  indexer.py     -- Index orchestration with incremental updates
  searcher.py    -- Keyword, vector, and hybrid search
  server.py      -- FastMCP server with 5 tool definitions
  utils.py       -- Path validation, frontmatter parsing, text extraction
  models.py      -- Pydantic response models

At startup the server reads mkdocs.yml, scans the docs directory, and builds (or incrementally updates) a SQLite FTS5 index. Search queries hit the index directly; vector search embeds the query with all-MiniLM-L6-v2 and compares against stored document embeddings. Hybrid mode fuses both result lists using Reciprocal Rank Fusion.

Development

git clone https://github.com/aspect-build/mkdocs-mcp.git
cd mkdocs-mcp
pip install -e ".[dev]"
pytest

Linting and type checking:

ruff check .
mypy src/

Requirements

  • Python >= 3.10
  • Required: fastmcp (>=3.0, <4), pydantic (>=2.0, <3), pyyaml (>=6.0), markdown (>=3.4)
  • Optional (vector search): sentence-transformers (>=3.0), numpy (>=1.24)

License

See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

papermoon_mkdocs_mcp-0.1.1.tar.gz (53.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

papermoon_mkdocs_mcp-0.1.1-py3-none-any.whl (27.3 kB view details)

Uploaded Python 3

File details

Details for the file papermoon_mkdocs_mcp-0.1.1.tar.gz.

File metadata

  • Download URL: papermoon_mkdocs_mcp-0.1.1.tar.gz
  • Upload date:
  • Size: 53.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for papermoon_mkdocs_mcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a8db216f03baad699dca7fa88c6ba5832a6567d043460a2c6fdae3dd6f2c17f3
MD5 f55065bd19f85ee3edc17115e265ba7d
BLAKE2b-256 7a391d66825d37c283a8798b9f0436e13cb8c6906e42604d55459cbf296ba11e

See more details on using hashes here.

Provenance

The following attestation bundles were made for papermoon_mkdocs_mcp-0.1.1.tar.gz:

Publisher: release.yml on papermoonio/mkdocs-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file papermoon_mkdocs_mcp-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for papermoon_mkdocs_mcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 52d327a851ce4b4709a43392b9dc4c9b90b9343dae4e810136c32305d732b925
MD5 c0c67adae6e2e6e8916f710d60f182fb
BLAKE2b-256 8091198181f5674edab75b82a0866251ef38c2e26c402519f20f3bb7a4a3b568

See more details on using hashes here.

Provenance

The following attestation bundles were made for papermoon_mkdocs_mcp-0.1.1-py3-none-any.whl:

Publisher: release.yml on papermoonio/mkdocs-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page