Skip to main content
Glama

docs-mcp

Documentation RAG system: crawl a docs site → chunk + embed locally (HuggingFace) → store in Postgres+pgvector → semantic search via MCP server, REST API, and web UI.

Demo

live at https://docs-mcp.veermehta.dev

Related MCP server: MCPDocSearch

Architecture

flowchart LR
    A[Browser] --> B[API Server]
    B --> D[Web UI]
    B --> C[(Postgres + pgvector)]
    B --> G[Ingestion Pipeline]
    G --> H[Scraper Subprocess]
    G --> C
    I[AI Client<br/>Claude Code, OpenCode] -->|MCP over stdio| F[MCP Server]
    F --> C

Quick start

git clone ... docs-mcp && cd docs-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[local]"
docker compose up -d
cp .env.example .env              # set LLM_API_KEY
.venv/bin/docs-mcp-api            # http://127.0.0.1:8000

MCP tools

add_documentation · estimate_documentation · search_documentation · list_sources · get_ingest_status · add_local_docs

REST API

Endpoint

What

GET /search?q=...

Semantic search

GET /sources

Indexed sources

POST /upload

Upload files

POST /upload-folder

Index a local folder

GET /llm-chat?q=...

Chat with docs

GET /about

System info

GET /docs

Interactive OpenAPI documentation

GET /openapi.json

OpenAPI schema

OpenCode

~/.config/opencode/opencode.jsonc:

{
  "mcp": {
    "docs-mcp": {
      "type": "local",
      "command": ["/path/to/docs-mcp/.venv/bin/python", "-m", "docs_mcp.mcp"]
    }
  }
}

verify it with:

echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | /path/to/docs-mcp/.venv/bin/python -m docs_mcp.mcp

Config

Copy .env.example to .env — set EMBEDDING_PROVIDER=api + EMBEDDING_API_KEY for remote embeddings (Jina, OpenAI, etc.), or leave as local for HuggingFace.

Available Tools

5 tools
add_documentationA

Crawl a framework/library documentation site and index it for semantic search.

Re-ingesting an existing source is incremental: pages whose extracted markdown is unchanged are skipped (no re-embedding).

Args: name: Short identifier for the framework, e.g. "react". version: Version string, e.g. "18.3" or "latest". base_url: Entry point URL of the documentation site. max_depth: How many link hops to follow from base_url. max_pages: Hard cap on the number of pages crawled. background: If true, start the crawl and return a job id immediately; track it with get_ingest_status. Large sites should use this to avoid tool timeouts. prune_missing: If true, delete indexed pages that this crawl did not visit. Only enable when depth/page caps cover the whole site, otherwise capped crawls would delete valid pages. lang: ISO 639-1 language code to filter pages (e.g. "en"). Only pages matching this language are crawled. sitemap: If true, discover pages from sitemap.xml instead of following links. Gives better coverage for docs sites that expose a sitemap.

Inputs: name (required), version (required), base_url (required), lang, +5 more. Returns: result

add_local_docsA

Index local documentation files from a folder on disk.

Walks the folder, finds supported files (HTML, Markdown, PDF, TXT), extracts text, chunks, embeds, and stores them for semantic search.

Args: name: Short identifier for this collection, e.g. "internal-api". path: Absolute or relative path to the folder on the server. recursive: If true, descend into subdirectories (default true).

Inputs: name (required), path (required), recursive. Returns: result

get_ingest_statusA

Check progress of a background add_documentation job.

Args: job_id: The id returned when the job was submitted with background=true.

Inputs: job_id (required). Returns: result

list_sourcesA

List all indexed documentation sources with page and chunk counts.

Inputs: no named parameters. Returns: result

search_documentationA

Semantic search over indexed documentation.

Returns the most relevant markdown chunks with their source URL and heading path. Use add_documentation first if nothing is indexed yet.

Args: query: What to look for, e.g. "how to define a loader". name: Optional framework name filter, e.g. "react". version: Optional version filter, e.g. "18.3". k: Number of chunks to return (1-20). mode: "hybrid" (default) fuses vector + keyword ranking; "vector" or "keyword" force a single strategy.

Inputs: query (required), k, mode, name, +1 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 5 tools

    Disambiguation5/5

    Each tool targets a distinct operation: web ingestion (add_documentation), local ingestion (add_local_docs), job tracking (get_ingest_status), search (search_documentation), and enumeration (list_sources). The two ingest tools could superficially be confused, but their descriptions clearly separate web-crawl vs local-folder scopes.

    Naming Consistency5/5

    All tools use consistent snake_case verb_noun naming: add_documentation, add_local_docs, get_ingest_status, search_documentation, list_sources. The verb set (add/get/search/list) is predictable and readable throughout.

    Tool Count5/5

    Five tools is well-scoped for a documentation indexing/search server, covering ingestion, async job tracking, retrieval, and listing. No tool feels redundant or gratuitous.

    Completeness4/5

    The surface covers ingest (web + local), status, search, and list, which handles the core RAG lifecycle. However, there is no tool to delete or remove an indexed source, and no way to inspect job history or cancel a running job, leaving minor gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers