@chr33s/mcpdoc
v0.1.1
Published
Server llms-txt documentation over MCP (Node.js/TypeScript)
Downloads
18
Readme
MCP LLMS-TXT Documentation Server
Overview
llms.txt is a website index for LLMs, providing background information, guidance, and links to detailed markdown files. IDEs like Cursor and Windsurf or apps like Claude Code/Desktop can use llms.txt to retrieve context for tasks. However, these apps use different built-in tools to read and process files like llms.txt. The retrieval process can be opaque, and there is not always a way to audit the tool calls or the context returned.
MCP offers a way for developers to have full control over tools used by these applications. Here, we create an open source MCP server to provide MCP host applications (e.g., Cursor, Windsurf, Claude Code/Desktop) with (1) a user-defined list of llms.txt files and (2) a simple fetch_docs tool read URLs within any of the provided llms.txt files. This allows the user to audit each tool call as well as the context returned.
Technology Stack
This project is built with Node.js v22 and TypeScript, providing:
- 🚀 Modern JavaScript/TypeScript: ES modules with full type safety
- 📦 Node.js 22: Latest LTS with built-in test runner and enhanced performance
- 🔧 TypeScript: Configured with
erasableSyntaxOnlyfor clean compilation - 🧪 Built-in Testing: Using Node.js built-in test runner (no external dependencies)
- 🔗 MCP SDK: Official Model Context Protocol SDK for robust integration
- 📝 Commander.js: Professional CLI argument parsing
- 🌍 Cross-Platform: Works on Windows, macOS, and Linux
Migration from Python
This project was originally written in Python and has been completely rewritten in Node.js/TypeScript while maintaining 100% feature compatibility. The migration provides:
- ✅ Same CLI interface - All command line arguments work identically
- ✅ Same MCP tools -
list_doc_sourcesandfetch_docswith identical behavior - ✅ Same configuration - JSON config files use the same format
- ✅ Enhanced testing - 29 comprehensive tests vs previous Python test suite
- ✅ Better IDE integration - Full TypeScript support in modern IDEs
- ✅ npm ecosystem - Easy installation and distribution via npm
llms-txt
You can find llms.txt files for langgraph and langchain here:
| Library | llms.txt | | ---------------- | ---------------------------------------------------------------------------------------------------------- | | LangGraph Python | https://langchain-ai.github.io/langgraph/llms.txt | | LangGraph JS | https://langchain-ai.github.io/langgraphjs/llms.txt | | LangChain Python | https://python.langchain.com/llms.txt | | LangChain JS | https://js.langchain.com/llms.txt |
Quickstart
Install Node.js
- This project requires Node.js v22 or later. Please see official Node.js docs for installation instructions.
- You can verify your Node.js version with:
node --version
Install mcpdoc
# Install globally for command line usage
npm install -g @chr33s/mcpdoc
# Or use npx to run without installing (requires network access)
npx @chr33s/mcpdoc --helpNote: Once published to npm, mcpdoc will be available as a standard Node.js package. For development and testing, you can build from source using the instructions in the Development section below.
Verify installation
# Check that mcpdoc is available
mcpdoc --version
# View help and available options
mcpdoc --helpChoose an llms.txt file to use.
- For example, here's the LangGraph
llms.txtfile.
Note: Security and Domain Access Control
For security reasons, mcpdoc implements strict domain access controls:
- Remote llms.txt files: When you specify a remote llms.txt URL (e.g.,
https://langchain-ai.github.io/langgraph/llms.txt), mcpdoc automatically adds only that specific domain (langchain-ai.github.io) to the allowed domains list. This means the tool can only fetch documentation from URLs on that domain.- Local llms.txt files: When using a local file, NO domains are automatically added to the allowed list. You MUST explicitly specify which domains to allow using the
--allowed-domainsparameter.- Adding additional domains: To allow fetching from domains beyond those automatically included:
- Use
--allowed-domains domain1.com domain2.comto add specific domains- Use
--allowed-domains '*'to allow all domains (use with caution)This security measure prevents unauthorized access to domains not explicitly approved by the user, ensuring that documentation can only be retrieved from trusted sources.
(Optional) Test the MCP server locally with your llms.txt file(s) of choice:
mcpdoc \
--urls "LangGraph:https://langchain-ai.github.io/langgraph/llms.txt" "LangChain:https://python.langchain.com/llms.txt" \
--transport sse \
--port 8082 \
--host localhost- This should run at: http://localhost:8082
- Run MCP inspector and connect to the running server:
npx @modelcontextprotocol/inspector- Here, you can test the
toolcalls.
Connect to Cursor
- Open
Cursor SettingsandMCPtab. - This will open the
~/.cursor/mcp.jsonfile.
- Paste the following into the file (we use the
langgraph-docs-mcpname and link to the LangGraphllms.txt).
{
"mcpServers": {
"langgraph-docs-mcp": {
"command": "mcpdoc",
"args": [
"--urls",
"LangGraph:https://langchain-ai.github.io/langgraph/llms.txt",
"LangChain:https://python.langchain.com/llms.txt",
"--transport",
"stdio"
]
}
}
}- Confirm that the server is running in your
Cursor Settings/MCPtab. - Best practice is to then update Cursor Global (User) rules.
- Open Cursor
Settings/Rulesand updateUser Ruleswith the following (or similar):
for ANY question about LangGraph, use the langgraph-docs-mcp server to help answer --
+ call list_doc_sources tool to get the available llms.txt file
+ call fetch_docs tool to read it
+ reflect on the urls in llms.txt
+ reflect on the input question
+ call fetch_docs on any urls relevant to the question
+ use this to answer the questionCMD+L(on Mac) to open chat.- Ensure
agentis selected.
Then, try an example prompt, such as:
what are types of memory in LangGraph?Connect to Windsurf
- Open Cascade with
CMD+L(on Mac). - Click
Configure MCPto open the config file,~/.codeium/windsurf/mcp_config.json. - Update with
langgraph-docs-mcpusing the Node.js configuration:
{
"mcpServers": {
"langgraph-docs-mcp": {
"command": "mcpdoc",
"args": [
"--urls",
"LangGraph:https://langchain-ai.github.io/langgraph/llms.txt",
"LangChain:https://python.langchain.com/llms.txt",
"--transport",
"stdio"
]
}
}
}- Update
Windsurf Rules/Global ruleswith the following (or similar):
for ANY question about LangGraph, use the langgraph-docs-mcp server to help answer --
+ call list_doc_sources tool to get the available llms.txt file
+ call fetch_docs tool to read it
+ reflect on the urls in llms.txt
+ reflect on the input question
+ call fetch_docs on any urls relevant to the questionThen, try the example prompt:
- It will perform your tool calls.
Connect to Claude Desktop
- Open
Settings/Developerto update~/Library/Application\ Support/Claude/claude_desktop_config.json. - Update with the Node.js configuration:
{
"mcpServers": {
"langgraph-docs-mcp": {
"command": "mcpdoc",
"args": [
"--urls",
"LangGraph:https://langchain-ai.github.io/langgraph/llms.txt",
"LangChain:https://python.langchain.com/llms.txt",
"--transport",
"stdio"
]
}
}
}- Restart Claude Desktop app.
[!Note] Make sure you have mcpdoc installed globally with
npm install -g @chr33s/mcpdocor usenpx @chr33s/mcpdocif you prefer not to install globally.{ "mcpServers": { "langgraph-docs-mcp": { "command": "npx", "args": [ "mcpdoc", "--urls", "LangGraph:https://langchain-ai.github.io/langgraph/llms.txt", "--transport", "stdio" ] } } }
[!Note] Currently (3/21/25) it appears that Claude Desktop does not support
rulesfor global rules, so appending the following to your prompt.
<rules>
for ANY question about LangGraph, use the langgraph-docs-mcp server to help answer --
+ call list_doc_sources tool to get the available llms.txt file
+ call fetch_docs tool to read it
+ reflect on the urls in llms.txt
+ reflect on the input question
+ call fetch_docs on any urls relevant to the question
</rules>- You will see your tools visible in the bottom right of your chat input.
Then, try the example prompt:
- It will ask to approve tool calls as it processes your request.
Connect to Claude Code
- In a terminal after installing Claude Code, run this command to add the MCP server to your project:
claude mcp add-json langgraph-docs '{"type":"stdio","command":"mcpdoc","args":["--urls", "LangGraph:https://langchain-ai.github.io/langgraph/llms.txt", "LangChain:https://python.langchain.com/llms.txt"]}' -s local- You will see
~/.claude.jsonupdated. - Test by launching Claude Code and running to view your tools:
$ Claude
$ /mcp[!Note] Currently (3/21/25) it appears that Claude Code does not support
rulesfor global rules, so appending the following to your prompt.
<rules>
for ANY question about LangGraph, use the langgraph-docs-mcp server to help answer --
+ call list_doc_sources tool to get the available llms.txt file
+ call fetch_docs tool to read it
+ reflect on the urls in llms.txt
+ reflect on the input question
+ call fetch_docs on any urls relevant to the question
</rules>Then, try the example prompt:
- It will ask to approve tool calls.
Command-line Interface
The mcpdoc command provides a simple CLI for launching the documentation server.
You can specify documentation sources in two ways, and these can be combined:
- Using a JSON config file:
- This will load the LangGraph Python documentation from the
sample_config.jsonfile in this repo.
mcpdoc --config sample_config.json- Directly specifying llms.txt URLs with optional names:
- URLs can be specified either as plain URLs or with optional names using the format
name:url. - You can specify multiple URLs by using the
--urlsparameter multiple times. - This is how we loaded
llms.txtfor the MCP server above.
mcpdoc --urls LangGraph:https://langchain-ai.github.io/langgraph/llms.txt --urls LangChain:https://python.langchain.com/llms.txtYou can also combine these methods to merge documentation sources:
mcpdoc --config sample_config.json --urls LangGraph:https://langchain-ai.github.io/langgraph/llms.txt --urls LangChain:https://python.langchain.com/llms.txtAdditional Options
--follow-redirects: Follow HTTP redirects (defaults to False)--timeout SECONDS: HTTP request timeout in seconds (defaults to 10.0)
Example with additional options:
mcpdoc --config sample_config.json --follow-redirects --timeout 15This will load the documentation specified in the JSON file with a 15-second timeout and follow any HTTP redirects if necessary.
Configuration Format
JSON configuration files should contain a list of documentation sources.
Each source must include an llms_txt URL and can optionally include a name:
JSON Configuration Example (sample_config.json)
[
{
"name": "LangGraph Python",
"llms_txt": "https://langchain-ai.github.io/langgraph/llms.txt"
}
]Programmatic Usage
import { createServer } from "@chr33s/mcpdoc";
// Create a server with documentation sources
const server = createServer(
[
{
name: "LangGraph Python",
llms_txt: "https://langchain-ai.github.io/langgraph/llms.txt",
},
// You can add multiple documentation sources
// {
// name: "Another Documentation",
// llms_txt: "https://example.com/llms.txt",
// },
],
{
followRedirects: true,
timeout: 15.0,
},
);
// Run the server
server.run("stdio");Development
This project is built with Node.js and TypeScript. Here are the development commands:
# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Lint and type check
npm run lint
# Clean build artifacts
npm run clean
# Development mode (build and run)
npm run dev
# Watch for changes and rebuild
npm run watch
# Show all available commands
npm run helpBuilding from Source
# Clone the repository
git clone https://github.com/chr33s/mcpdoc.git
cd mcpdoc
# Install dependencies
npm install
# Build the project
npm run build
# Run tests to verify everything works
npm test
# Install globally for command line usage
npm install -g .