opencode-docs
Allows scraping and searching Express.js official documentation.
Allows scraping and searching n8n documentation for workflow automation.
Allows scraping and searching Next.js official documentation for use in AI coding assistants.
Allows scraping and searching Node.js API documentation.
Allows scraping and searching React official documentation (requires Playwright for JS-rendered content).
Allows importing and searching API documentation from OpenAPI/Swagger specifications.
Allows scraping and searching Tailwind CSS documentation.
Allows scraping and searching Vue.js official documentation.
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., "@opencode-docssearch documentation for authentication"
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.
opencode-docs
A powerful MCP (Model Context Protocol) server for scraping, storing, and searching documentation locally. Built for use with OpenCode, Claude Desktop, and other MCP-compatible AI coding assistants.
Features
Smart Scraping: Extracts main content from documentation pages with intelligent noise filtering
Playwright Support: Optional browser-based scraping for JavaScript-rendered sites (React, Vue, Next.js, etc.)
Recursive Crawling: Automatically discovers and follows internal links to build complete documentation sets
Full-Text Search: Fast search across all stored documentation using FlexSearch
OpenAPI/Swagger Import: Import API documentation from OpenAPI specs or Swagger UI pages
Metadata Extraction: Captures descriptions, keywords, authors, and last-modified dates
Update Detection: Re-scrape existing docs and see what changed
Related MCP server: LocalDocs MCP
Table of Contents
Installation
Prerequisites
Node.js 18+ (check with
node --version)npm or pnpm
Git (for cloning)
Step 1: Clone the Repository
git clone https://github.com/salmenkhelifi1/opencode-docs.git
cd opencode-docsStep 2: Install Dependencies
npm installStep 3: Build the Project
npm run buildStep 4 (Optional): Install Playwright for JS-rendered Sites
If you need to scrape JavaScript-heavy sites (React, Vue, Next.js docs, etc.):
# Install Playwright
npm install playwright
# Install Chromium browser
npx playwright install chromiumVerify Installation
# Test that the server starts
node dist/index.js
# You should see:
# [opencode-docs] Docs directory: /home/username/.config/opencode/docs
# [opencode-docs] MCP server started (v1.1.0)
# Press Ctrl+C to stopQuick Start
After installation, add some documentation:
# Start your AI assistant (OpenCode, Claude Desktop, etc.)
# Then use these commands:
# Add Next.js documentation (recursive crawl)
docs_add_url url="https://nextjs.org/docs" recursive=true maxPages=30
# Add Express.js documentation
docs_add_url url="https://expressjs.com/en/starter/installing.html" recursive=true maxPages=30
# Search your docs
docs_search query="middleware"
# List all sources
docs_listConfiguration
OpenCode Setup
Step 1: Find Your Config File
The OpenCode config file is located at:
Linux/macOS:
~/.config/opencode/opencode.jsonWindows:
%APPDATA%\opencode\opencode.json
Step 2: Add the MCP Server
Add the docs MCP server to your config:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"docs": {
"type": "local",
"command": ["node", "/full/path/to/opencode-docs/dist/index.js"],
"enabled": true
}
}
}Important: Replace /full/path/to/opencode-docs with the actual path where you cloned the repository.
Step 3: Restart OpenCode
Restart OpenCode to load the new MCP server. You should see the docs tools available.
Full OpenCode Config Example
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"docs": {
"type": "local",
"command": ["node", "/home/username/opencode-docs/dist/index.js"],
"enabled": true
}
}
}Claude Desktop Setup
Step 1: Find Your Config File
The Claude Desktop config file is located at:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Step 2: Add the MCP Server
{
"mcpServers": {
"docs": {
"command": "node",
"args": ["/full/path/to/opencode-docs/dist/index.js"]
}
}
}Step 3: Restart Claude Desktop
Quit and restart Claude Desktop. The docs tools should now be available.
VS Code with Continue Extension
Add to your Continue config (.continue/config.json):
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "node",
"args": ["/full/path/to/opencode-docs/dist/index.js"]
}
}
]
}
}Available Tools
docs_list
List all available documentation sources stored locally.
docs_listOutput: Shows all sources with their IDs, page counts, and descriptions.
docs_search
Search across all local documentation.
docs_search query="authentication"
docs_search query="routing" sourceId="expressjs"
docs_search query="hooks" limit=10Parameters:
Parameter | Type | Required | Description |
| string | Yes | Search query |
| string | No | Limit search to specific source |
| number | No | Max results (default: 10) |
docs_read
Read a specific documentation page or list all pages in a source.
# List all pages in a source
docs_read sourceId="nextjs"
# Read a specific page
docs_read sourceId="nextjs" pagePath="docs-app-getting-started.md"Parameters:
Parameter | Type | Required | Description |
| string | Yes | Source ID |
| string | No | Page path (omit to list all pages) |
docs_add_url
Add documentation from a URL with optional recursive crawling.
# Single page
docs_add_url url="https://nextjs.org/docs"
# Recursive crawl (follows links)
docs_add_url url="https://nextjs.org/docs" recursive=true maxPages=50 maxDepth=3
# For JavaScript-rendered sites
docs_add_url url="https://react.dev/learn" usePlaywright=true recursive=true
# With URL filter pattern
docs_add_url url="https://docs.example.com" recursive=true urlPattern="/api/"Parameters:
Parameter | Type | Default | Description |
| string | required | The URL to scrape |
| string | auto | Custom source ID |
| string | auto | Display name for the source |
| string | auto | Description for the source |
| boolean | false | Use Playwright for JS-rendered pages |
| boolean | false | Recursively crawl linked pages |
| number | 20 | Max pages to crawl (recursive mode) |
| number | 2 | Max link depth (recursive mode) |
| string | - | Regex pattern to filter URLs |
docs_add_sitemap
Crawl an entire documentation site from its sitemap.xml.
docs_add_sitemap sitemapUrl="https://docs.example.com/sitemap.xml"
docs_add_sitemap sitemapUrl="https://docs.example.com/sitemap.xml" maxPages=100 urlPattern="/docs/"Parameters:
Parameter | Type | Default | Description |
| string | required | Sitemap URL |
| string | auto | Custom source ID |
| string | auto | Display name |
| number | 50 | Max pages to crawl |
| string | - | Regex to filter URLs |
docs_add_openapi
Import an OpenAPI/Swagger specification from a direct JSON URL.
docs_add_openapi url="https://api.example.com/openapi.json" sourceId="my-api"docs_add_swagger
Import documentation from a Swagger UI page (auto-detects spec URL).
docs_add_swagger url="https://api.example.com/swagger"docs_update
Update/refresh existing documentation by re-scraping.
# Update entire source
docs_update sourceId="nextjs"
# Update single page
docs_update sourceId="nextjs" pagePath="docs.md"
# With Playwright
docs_update sourceId="react" usePlaywright=truedocs_preview
Preview scraped content without saving.
docs_preview url="https://example.com/docs"
docs_preview url="https://example.com/docs" showLinks=true usePlaywright=truedocs_auth
Manage authentication credentials for API documentation.
# Add bearer token
docs_auth action="add" host="api.example.com" type="bearer" token="your-token"
# Add basic auth
docs_auth action="add" host="api.example.com" type="basic" username="user" password="pass"
# List all credentials
docs_auth action="list"
# Remove credentials
docs_auth action="remove" host="api.example.com"docs_remove
Remove a documentation source and all its pages.
docs_remove sourceId="old-docs" confirm=trueUsage Examples
Add Popular Documentation Sites
# Next.js (React framework)
docs_add_url url="https://nextjs.org/docs" recursive=true maxPages=50 sourceId="nextjs" name="Next.js"
# Express.js (Node.js web framework)
docs_add_url url="https://expressjs.com/en/starter/installing.html" recursive=true maxPages=30 sourceId="expressjs" name="Express.js"
# Node.js API Documentation
docs_add_url url="https://nodejs.org/docs/latest/api/" recursive=true maxPages=40 sourceId="nodejs" name="Node.js"
# n8n (Workflow Automation)
docs_add_url url="https://docs.n8n.io/" recursive=true maxPages=30 sourceId="n8n" name="n8n"
# React (needs Playwright for JS rendering)
docs_add_url url="https://react.dev/learn" usePlaywright=true recursive=true maxPages=30 sourceId="react" name="React"
# Vue.js
docs_add_url url="https://vuejs.org/guide/introduction.html" recursive=true maxPages=30 sourceId="vuejs" name="Vue.js"
# Tailwind CSS
docs_add_url url="https://tailwindcss.com/docs/installation" recursive=true maxPages=50 sourceId="tailwind" name="Tailwind CSS"Search Examples
# Search all documentation
docs_search query="authentication"
# Search specific source
docs_search query="middleware" sourceId="expressjs"
# Search with limit
docs_search query="hooks" limit=5
# Search for error handling
docs_search query="error handling"Import API Documentation
# From OpenAPI JSON
docs_add_openapi url="https://petstore.swagger.io/v2/swagger.json" sourceId="petstore"
# From Swagger UI page
docs_add_swagger url="https://api.example.com/swagger-ui"
# With authentication
docs_auth action="add" host="api.mycompany.com" type="bearer" token="my-api-key"
docs_add_openapi url="https://api.mycompany.com/openapi.json" sourceId="internal-api"Migrating to Another Device
Option 1: Copy Documentation (Recommended)
Copy the entire docs directory to your new device:
# On old device - compress docs
cd ~/.config/opencode
tar -czvf docs-backup.tar.gz docs/
# Transfer docs-backup.tar.gz to new device
# On new device - extract docs
mkdir -p ~/.config/opencode
cd ~/.config/opencode
tar -xzvf docs-backup.tar.gzOption 2: Re-scrape Documentation
On the new device, after installation:
# Re-add all your documentation sources
docs_add_url url="https://nextjs.org/docs" recursive=true maxPages=50
docs_add_url url="https://expressjs.com/en/starter/installing.html" recursive=true maxPages=30
# ... etcFull Migration Checklist
Clone the repository on the new device:
git clone https://github.com/salmenkhelifi1/opencode-docs.git cd opencode-docs npm install npm run buildCopy configuration (optional, for credentials):
# Copy credentials file if you have API auth saved scp old-device:~/.config/opencode/docs/credentials.json ~/.config/opencode/docs/Copy documentation or re-scrape:
# Copy existing docs scp -r old-device:~/.config/opencode/docs ~/.config/opencode/ # OR re-scrape (see examples above)Configure your AI assistant (OpenCode, Claude Desktop, etc.)
Test:
docs_list docs_search query="test"
Storage Location
Documentation is stored in ~/.config/opencode/docs/:
~/.config/opencode/docs/
├── manifest.json # Index of all sources and pages
├── credentials.json # Saved API credentials (if any)
├── nextjs/ # Source directory
│ ├── docs.md
│ ├── docs-app-getting-started.md
│ └── ...
├── expressjs/
│ └── ...
└── nodejs/
└── ...Supported Documentation Sites
The scraper includes optimized selectors for:
Framework | Notes |
Docusaurus | React docs, many OSS projects |
Nextra | Next.js docs |
GitBook | Many startups use this |
ReadTheDocs | Python projects |
VuePress/VitePress | Vue.js ecosystem |
MkDocs | Material for MkDocs |
Generic HTML | Works with most sites |
For JavaScript-heavy sites, enable Playwright with usePlaywright=true.
Docker
Build the Image
docker build -t opencode-docs .Run with Volume Mount
docker run -v ~/.config/opencode/docs:/root/.config/opencode/docs opencode-docsDocker Compose
version: '3.8'
services:
opencode-docs:
build: .
volumes:
- ~/.config/opencode/docs:/root/.config/opencode/docs
stdin_open: true
tty: trueTroubleshooting
Common Issues
"Playwright is not installed"
npm install playwright
npx playwright install chromium"Failed to fetch URL: 403 Forbidden"
Some sites block scrapers. Try:
Using Playwright:
usePlaywright=trueAdding a delay between requests (automatic in recursive mode)
"No content extracted"
The site might use JavaScript rendering. Try:
docs_add_url url="..." usePlaywright=true"Command not found: docs_list"
The MCP server isn't configured. Check:
The path in your config is correct
The project is built (
npm run build)Restart your AI assistant
Docs directory not found
Create it manually:
mkdir -p ~/.config/opencode/docsDebug Mode
Run the server directly to see logs:
node /path/to/opencode-docs/dist/index.jsDevelopment
Run in Development Mode
npm run devWatch Mode
npm run watchClean Build
npm run clean && npm run buildProject Structure
opencode-docs/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── types.ts # TypeScript types
│ ├── services/
│ │ ├── scraper.ts # HTML to Markdown conversion
│ │ ├── crawler.ts # Sitemap and recursive crawling
│ │ ├── storage.ts # File system management
│ │ ├── search.ts # FlexSearch integration
│ │ └── credentials.ts # Auth credential management
│ └── tools/
│ ├── docs-add-url.ts
│ ├── docs-add-sitemap.ts
│ ├── docs-search.ts
│ └── ... (other tools)
├── dist/ # Compiled JavaScript
├── package.json
├── tsconfig.json
└── README.mdLicense
MIT
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
Changelog
v1.1.0
Added Playwright support for JS-rendered pages
Added recursive crawling with link discovery
Added
docs_updatetool for refreshing documentationAdded
docs_previewtool for testing scrapesEnhanced content selectors for Docusaurus, Nextra, GitBook, etc.
Smart content detection with text density scoring
Improved noise filtering (removes nav, breadcrumbs, edit links)
Metadata extraction (description, keywords, author, lastModified)
Title deduplication
v1.0.0
Initial release
Basic scraping with cheerio
Sitemap crawling
OpenAPI/Swagger import
Full-text search
Available Tools
11 toolsdocs_add_openapiB
Import an OpenAPI/Swagger specification from a direct JSON URL. Converts all API endpoints to searchable documentation. Automatically uses saved credentials for the host.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The OpenAPI JSON URL (e.g., "https://api.example.com/openapi.json") | |
| name | No | Optional: display name for the API documentation | |
| apiKey | No | Optional: API key to include in headers | |
| sourceId | No | Optional: custom source ID (auto-generated from URL if not provided) | |
| authHeader | No | Optional: Authorization header value (e.g., "Bearer your-token") | |
| description | No | Optional: description for the source |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden itself. It does disclose two useful traits beyond the schema: all endpoints become searchable documentation, and saved credentials for the host are applied automatically (a real auth-behavior detail). It says nothing about failures on an invalid spec, duplicate-import behavior, or what is returned, so the coverage is partial.
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, front-loaded with the core action and input form, then behavior. Nothing is bloated, though the middle sentence restates the product's core purpose rather than adding selection-relevant information.
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 write-side import tool with no annotations and no output schema, the description covers the essentials of what it does and how it authenticates, but omits return/error behavior and any duplicate or overwrite semantics. Adequate as a minimum viable definition, not fully complete.
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 all six parameters including examples. The description adds no syntax or format detail beyond that, so the baseline of 3 applies; there is no compensating value here, but no harm either.
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?
The description gives a specific verb (import) and resource (OpenAPI/Swagger specification) plus the input form (direct JSON URL), so an agent can tell roughly what happens. However, it never distinguishes itself from the sibling docs_add_swagger, and by calling the resource 'OpenAPI/Swagger' it arguably blurs the two further.
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?
There is no explicit when-to-use guidance and no alternatives are named. The phrase 'direct JSON URL' weakly implies this is for a spec URL rather than a site crawl (docs_add_url/docs_add_sitemap), but the agent is left to infer the choice against docs_add_swagger on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_add_sitemapA
Crawl an entire documentation site from its sitemap.xml. Scrapes all pages (up to maxPages), converts to Markdown, and stores locally. Use for adding complete doc sites.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional: display name for the source | |
| maxPages | No | Maximum number of pages to crawl (default: 50, max: 200) | |
| sourceId | No | Optional: custom source ID (auto-generated from URL if not provided) | |
| sitemapUrl | Yes | The sitemap URL (e.g., "https://docs.example.com/sitemap.xml") | |
| urlPattern | No | Optional: regex pattern to filter URLs (e.g., "/docs/" to only include URLs containing /docs/) | |
| description | No | Optional: description for the source |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does reveal useful behavior — bounded crawl via maxPages, conversion to Markdown, local storage — but says nothing about required auth (docs_auth exists as a sibling), rate limiting, handling of existing sources, or what happens when the crawl fails partway.
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: what it does, mechanical effect, and when to use it. The purpose is front-loaded and no sentence repeats the schema or the tool name.
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 6-parameter mutation tool with no annotations and no output schema, the description covers the main flow adequately but omits permissions, storage location, deduplication/overwrite behavior and post-crawl verification. Those gaps are meaningful for an agent deciding how to sequence this with docs_auth and docs_preview.
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 every parameter including maxPages, urlPattern, name, sourceId and description is already documented in the schema. The description adds only the implicit note that maxPages bounds the crawl, 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+resource ('Crawl an entire documentation site from its sitemap.xml') and explains the pipeline (scrape, convert to Markdown, store locally), which naturally distinguishes it from the URL- and spec-based siblings. It never names an alternative outright, so sibling differentiation is inferred rather than stated.
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?
'Use for adding complete doc sites' gives the intended context, but there is no when-not guidance and no mention of docs_add_url, docs_add_swagger or docs_add_openapi, which an agent must choose between for other source types. Usage is implied by the sitemap framing rather than explicitly scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_add_swaggerB
Import documentation from a Swagger UI page. Automatically detects the OpenAPI spec URL by trying common patterns. Use this when you have a Swagger UI URL like /swagger or /api-docs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The Swagger UI page URL (e.g., "https://api.example.com/swagger") | |
| name | No | Optional: display name for the API documentation | |
| sourceId | No | Optional: custom source ID (auto-generated from API title if not provided) | |
| description | No | Optional: description for the source |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the auto-detection of the spec URL, which is genuinely useful behavior, but says nothing about side effects, idempotency, what happens if detection fails, whether an existing source is overwritten, or permission/auth requirements. For a mutation/import tool, this is a significant gap.
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. The primary action is front-loaded, the auto-detection behavior follows, and the usage cue closes. Every sentence earns its place.
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 mutation tool with no annotations and no output schema, the description is thin. It covers purpose, the detection behavior, and a usage hint, but omits side effects, failure handling, and auth needs. Adequate to trigger the right call, not enough to predict outcomes.
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 all four parameters with examples and optionality. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 is appropriate.
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+resource: 'Import documentation from a Swagger UI page.' This clearly distinguishes it from siblings like docs_add_url, docs_add_sitemap, and docs_add_openapi, which target other source types. It could be sharper about what 'import' produces (a source? a doc set?) but the purpose is unambiguous.
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 implied usage condition: 'Use this when you have a Swagger UI URL like /swagger or /api-docs.' This helps distinguish it from docs_add_openapi (raw spec), but it does not explicitly state when NOT to use it or name the alternative for when you already have the spec file. The routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_add_urlB
Add documentation from a URL. Features: recursive crawling (follows links), Playwright support for JS-rendered sites (React, Vue, etc.), smart content detection. Use recursive=true to crawl multiple pages.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape | |
| name | No | Optional: display name for the source | |
| maxDepth | No | Maximum depth for recursive crawling (default: 2) | |
| maxPages | No | Maximum pages to crawl when recursive is true (default: 20) | |
| sourceId | No | Optional: custom source ID (auto-generated from URL if not provided) | |
| recursive | No | Recursively crawl linked pages | |
| urlPattern | No | Optional: regex pattern to filter URLs during recursive crawl | |
| description | No | Optional: description for the source | |
| usePlaywright | No | Use Playwright for JS-rendered pages (slower but handles React/Vue/Angular sites) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses crawling behavior, Playwright/JS-rendering support, and content detection, but says nothing about whether docs are persisted as a source, auth requirements, rate limits, or failure behavior for an add/mutation operation.
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?
Compact and front-loaded: purpose first, then feature/parameter notes. Each sentence carries some weight, though the feature list is somewhat marketing-flavored and could be tightened.
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 mutation tool with no annotations and no output schema, the description covers the headline behavior but omits persistence semantics, auth, and result shape. Adequate but incomplete for the tool's complexity.
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 all 9 parameters, and the baseline is 3. The description largely restates schema facts (recursive crawling, Playwright for JS-rendered sites) rather than adding new meaning beyond what the input schema provides.
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?
The description states a specific verb and resource: 'Add documentation from a URL.' It is clear what the tool does, but it does not differentiate itself from siblings like docs_add_sitemap, docs_add_openapi, and docs_add_swagger, which all also ingest docs from a URL source. Clear but not sibling-aware.
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?
The only guidance is 'Use recursive=true to crawl multiple pages,' which is a parameter hint rather than when-to-use guidance. Nothing says when to pick this tool over docs_add_sitemap/docs_add_openapi, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_authB
Manage authentication credentials for documentation sources. Actions: add (save credentials), list (show all), remove (delete), get (show one). Credentials are automatically used when fetching APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Host/domain for the credential (e.g., "vps.madani.agency"). Required for add, remove, get. | |
| type | No | Auth type: bearer (token), cookie, apikey, or basic. Required for add. | |
| value | No | The credential value (token, cookie string, api key). Required for add. | |
| action | Yes | Action to perform: add, list, remove, or get | |
| description | No | Optional description for the credential |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds one valuable behavioral fact — stored credentials are automatically applied during API fetching — but omits key traits for a mutation tool: whether 'remove' is irreversible, where credentials are stored, what 'get' exposes, and any error behavior for missing hosts.
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 with the core purpose front-loaded and the action inventory second. No filler, and the automatic-use fact is placed last where it functions as context rather than definition; the parenthetical action glosses are slightly redundant but cheap.
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 five-parameter tool with no annotations and no output schema, the description covers purpose and the auto-use behavior but leaves the return shape of 'list'/'get' and the destructive consequences of 'remove' unaddressed. It is workable to invoke correctly but not complete.
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 every parameter, including per-action requirements (host/type/value for add, host for remove/get). The description's action list is largely redundant with the schema's own action enumeration, adding only the 'save/show/delete' glosses, so baseline 3 is appropriate.
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 purpose ('Manage authentication credentials for documentation sources') and enumerates the four supported actions with parenthetical glosses, so an agent knows exactly what the tool covers. It distinguishes itself from the content-oriented siblings (docs_add_swagger, docs_search, etc.) by domain, though it never explicitly names a sibling it is not.
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?
The closing line, 'Credentials are automatically used when fetching APIs,' implies when this tool matters (before fetching a host that needs auth), which is genuinely useful context. However, there is no explicit when-to-use versus when-not, no statement of prerequisites or ordering relative to the fetch tools, so usage remains inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_listA
List all available documentation sources stored locally. Shows source names, page counts, and descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that sources are stored locally and what each entry contains (names, page counts, descriptions), implying a safe read. It says nothing about pagination, ordering, or whether an empty result is possible.
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?
Two short sentences with the core action front-loaded and the return shape immediately after. No filler or redundancy.
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 or annotations exist, so the description must convey enough to call and interpret the tool. It names the returned fields well, but leaves minor gaps around result size and ordering that an agent might want to know.
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?
The tool takes zero parameters, so there is nothing to misinterpret and the description has no syntax to document. Per the baseline for zero-param tools, a 4 is appropriate.
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 (List) and resource (available documentation sources stored locally), which cleanly separates it from siblings like docs_search and docs_read. It does not explicitly name a sibling to disambiguate against, so it falls just short of a 5.
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?
Usage is implied: enumerating local sources is naturally the discovery step before docs_read or docs_search. However, the description never states when to prefer it over siblings or any prerequisites, so the guidance remains implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_previewA
Preview scraped content without saving. Use this to test scraping before adding docs. Shows extracted content, metadata, and discovered links.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to preview | |
| showLinks | No | Show discovered internal links | |
| usePlaywright | No | Use Playwright for JS-rendered pages | |
| maxContentLength | No | Maximum content length to show (default: 3000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses the key behavioral trait ('without saving') and what is shown ('extracted content, metadata, and discovered links'), but does not mention potential side effects (e.g., network requests, rate limits) or authentication requirements. It covers the core non-destructive nature but lacks other operational details.
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?
Two sentences, front-loaded with the core purpose and usage guidance. No unnecessary words; every sentence earns its place.
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?
Given no annotations, no output schema, and a simple 4-parameter tool, the description covers purpose, usage, and basic output (content, metadata, links). It could be more complete by noting any limitations (e.g., does not follow redirects, may require auth), but it is sufficient for an agent to call the tool correctly.
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 all parameters. The description adds minimal parameter-specific meaning beyond the schema, but the tool's purpose implies the parameters are used for preview configuration. Baseline 3, but the 'without saving' context slightly clarifies that parameters like 'usePlaywright' affect the preview only, not stored docs.
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?
The description clearly states a specific verb ('Preview') and resource ('scraped content'), and distinguishes it from the sibling 'docs_add_url' by emphasizing 'without saving' and 'test scraping before adding docs'.
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?
It gives explicit when-to-use guidance: 'Use this to test scraping before adding docs.' This directly names the alternative action (adding docs) and the condition (testing).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_readA
Read a specific documentation page. Provide sourceId and pagePath to read the full content. If pagePath is omitted, lists all pages in the source.
| Name | Required | Description | Default |
|---|---|---|---|
| pagePath | No | The page path within the source (e.g., "hooks/useEffect"). If not provided, lists all pages in the source. | |
| sourceId | Yes | The source ID (e.g., "react", "nextjs") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the two operating modes (read one page vs. list all), but says nothing about auth requirements (despite a docs_auth sibling), error behavior for invalid sourceId/pagePath, or response shape. Read-only nature is only implied.
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 waste, with the core action front-loaded and the conditional mode immediately after.
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 and no annotations, the description is the only behavioral source. It covers the main mechanics but omits authentication prerequisites and result shape, which are material for a docs retrieval tool in a suite containing docs_auth.
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% and each parameter's description already explains its role, including the omitted-pagePath behavior, so the schema does the heavy lifting. The description repeats this without adding format or validation detail (e.g., what a valid sourceId looks like beyond examples).
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+resource ('Read a specific documentation page') and discloses the dual-mode behavior when pagePath is omitted. It does not explicitly distinguish itself from siblings like docs_list or docs_search, which could plausibly retrieve the same content.
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?
The description gives a clear conditional ('If pagePath is omitted, lists all pages'), which implies usage but doesn't state when to prefer this over docs_list, docs_search, or docs_preview for retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_removeA
Remove a documentation source and all its pages. Requires confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set to true to confirm deletion | |
| sourceId | Yes | The source ID to remove (use docs_list to see available sources) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does disclose the two most important traits: the operation is destructive and it cascades to 'all its pages', plus a confirmation gate. It omits whether deletion is permanent/irreversible and whether elevated permissions are needed, which keeps it from 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?
Two short sentences, zero filler, with the destructive scope front-loaded before the confirmation caveat. Nothing is wasted and nothing essential is buried.
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 destructive, two-parameter tool with no annotations and no output schema, the description covers scope, cascade effect, and the confirmation requirement. Gaps remain around reversibility and authorization, which an agent would need before committing to a delete.
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% (confirm and sourceId are both documented, including a pointer to docs_list), so the baseline is 3. The description's 'Requires confirmation' adds only a faint echo of the confirm parameter and no new syntax or format detail.
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 (Remove) and resource (a documentation source) plus its blast radius ('and all its pages'), which clearly separates it from docs_update or the docs_add_* family. It stops short of naming a sibling as an alternative, so it lands at 4 rather than 5.
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?
'Requires confirmation' implies the preconditions for invoking the tool, and the intent to delete a source is self-evident. However, there is no explicit when-to-use versus docs_update, no warning about when deletion is inappropriate, and no statement of the required permission level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_searchB
Search across all local documentation. Returns matching pages with snippets. Use this to find relevant documentation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 10) | |
| query | Yes | The search query | |
| sourceId | No | Optional: limit search to a specific source |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the return shape ('matching pages with snippets'), which is genuinely useful since there is no output schema. It says nothing about result ranking, whether all sources are searched by default, pagination, or permissions, leaving meaningful behavioral gaps.
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?
The first two sentences are front-loaded and informative, but the third sentence ('Use this to find relevant documentation') is circular filler that duplicates the opening. The definition is short but not fully waste-free.
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 search tool with no annotations and no output schema, the description covers the basics (what it searches, what it returns) but omits result ordering, default source scope, and any auth/permission notes. Adequate as a minimum-viable definition, not complete.
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% (query, limit, sourceId all documented), so the schema already does the heavy lifting and a baseline 3 is appropriate. The phrase 'across all local documentation' implicitly clarifies that sourceId narrows scope rather than being required, but adds no further syntax or format detail.
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 ('Search across all local documentation') and notes the scope ('local'), which separates it from remote/URL-based ingestion siblings. However, it never names or differentiates itself from the closest siblings such as docs_list or docs_read, so an agent must infer the boundary.
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?
The only guidance is 'Use this to find relevant documentation,' which simply restates the purpose rather than telling the agent when to choose this over docs_list or docs_read. No conditions, prerequisites, or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_updateA
Update/refresh existing documentation by re-scraping. Can update an entire source or a single page. Detects changes and shows diff summary.
| Name | Required | Description | Default |
|---|---|---|---|
| pagePath | No | Optional: specific page path to update (updates all pages if not provided) | |
| sourceId | Yes | The source ID to update | |
| usePlaywright | No | Use Playwright for JS-rendered pages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that the operation re-scrapes remote content, detects changes, and returns a diff summary, which implies a mutating, network-dependent write. It does not say whether existing docs are overwritten or preserved, whether the change is reversible, or what auth/permission is required.
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, and the core action and scope are front-loaded before the diff-summary note. 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?
For a mutating tool with no annotations and no output schema, the description does provide the one important return signal (diff summary) and the scoping behavior. It still omits the safety/permission and overwrite semantics an agent should know before triggering a re-scrape of an entire source.
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 three parameters are already documented, including the pagePath-omitted behavior. The description adds no syntax, format, or constraint detail beyond what the schema states, so the baseline of 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 ('Update/refresh existing documentation by re-scraping') plus the two supported scopes (whole source vs single page). It is distinguishable from docs_add_url/add_sitemap by the re-scrape framing, but it never names a sibling tool, so differentiation is implicit rather than explicit.
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?
'Can update an entire source or a single page' implies when each mode applies via pagePath, but there is no explicit when-to-use guidance, no statement of prerequisites (e.g., that sourceId must come from docs_list), and no mention of when to prefer re-adding via docs_add_url instead.
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.
11 tool updates
v1.1.0- First observed
docs_add_openapi - First observed
docs_add_sitemap - First observed
docs_add_swagger - First observed
docs_add_url - First observed
docs_auth - First observed
docs_list - First observed
docs_preview - First observed
docs_read - First observed
docs_remove - First observed
docs_search - First observed
docs_update
TDQS
Scored across 11 tools
The four add tools (url, sitemap, swagger, openapi) target distinct source types, but overlap exists between generic URL crawling and sitemap crawling, and between Swagger UI and OpenAPI JSON imports. Descriptions clarify the intended use, but an agent may still hesitate when both could work.
All tools share the 'docs_' prefix and use consistent snake_case, with predictable forms like docs_add_*, docs_list, docs_search, docs_read, docs_update, docs_remove. No mixing of conventions (e.g., camelCase) occurs.
11 tools is well within the ideal 3-15 range. Each tool covers a distinct operation in documentation ingestion, management, or retrieval, with no obvious redundancy.
Core lifecycle operations are present: add from multiple sources, list, search, read, update, remove, preview, and auth management. Minor gaps include no page-level deletion (only source removal) and no credential editing, but these are workaroundable.
Maintenance
Related MCP Connectors
Versioned documentation registry and semantic search for AI tools and coding assistants.
MCP server for querying Forkast documentation
Hosted markdown project wikis your team's AI assistants read, search, and update over MCP.
Team docs served to AI agents over MCP - search, Markdown reads, version pinning, read audit.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceIndexes documentation sites by base URL and serves keyword search, optional semantic search, and Markdown page retrieval as MCP tools, all from a single SQLite file.-
- FlicenseNot gradedqualityDmaintenanceCreates a local database of indexed technical documentation from web crawls and local files, enabling AI agents to efficiently search and retrieve documentation through MCP tools.1-
- FlicenseNot gradedqualityDmaintenanceProvides tools for ingesting documents into a local vector database and retrieving relevant information via semantic search, enabling retrieval-augmented generation for MCP clients.6-
- AlicenseNot gradedqualityBmaintenanceA documentation MCP server that crawls websites and Git repositories, stores them as Markdown, and provides tools to search and retrieve documentation for local LLMs and AI agents.Apache 2.0