Skip to main content
Glama

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-docs

Step 2: Install Dependencies

npm install

Step 3: Build the Project

npm run build

Step 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 chromium

Verify 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 stop

Quick 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_list

Configuration

OpenCode Setup

Step 1: Find Your Config File

The OpenCode config file is located at:

  • Linux/macOS: ~/.config/opencode/opencode.json

  • Windows: %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.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.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_list

Output: Shows all sources with their IDs, page counts, and descriptions.


Search across all local documentation.

docs_search query="authentication"
docs_search query="routing" sourceId="expressjs"
docs_search query="hooks" limit=10

Parameters:

Parameter

Type

Required

Description

query

string

Yes

Search query

sourceId

string

No

Limit search to specific source

limit

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

sourceId

string

Yes

Source ID

pagePath

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

url

string

required

The URL to scrape

sourceId

string

auto

Custom source ID

name

string

auto

Display name for the source

description

string

auto

Description for the source

usePlaywright

boolean

false

Use Playwright for JS-rendered pages

recursive

boolean

false

Recursively crawl linked pages

maxPages

number

20

Max pages to crawl (recursive mode)

maxDepth

number

2

Max link depth (recursive mode)

urlPattern

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

sitemapUrl

string

required

Sitemap URL

sourceId

string

auto

Custom source ID

name

string

auto

Display name

maxPages

number

50

Max pages to crawl

urlPattern

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=true

docs_preview

Preview scraped content without saving.

docs_preview url="https://example.com/docs"
docs_preview url="https://example.com/docs" showLinks=true usePlaywright=true

docs_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=true

Usage Examples

# 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

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.gz

Option 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
# ... etc

Full Migration Checklist

  1. Clone the repository on the new device:

    git clone https://github.com/salmenkhelifi1/opencode-docs.git
    cd opencode-docs
    npm install
    npm run build
  2. Copy configuration (optional, for credentials):

    # Copy credentials file if you have API auth saved
    scp old-device:~/.config/opencode/docs/credentials.json ~/.config/opencode/docs/
  3. Copy documentation or re-scrape:

    # Copy existing docs
    scp -r old-device:~/.config/opencode/docs ~/.config/opencode/
    
    # OR re-scrape (see examples above)
  4. Configure your AI assistant (OpenCode, Claude Desktop, etc.)

  5. 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-docs

Docker Compose

version: '3.8'
services:
  opencode-docs:
    build: .
    volumes:
      - ~/.config/opencode/docs:/root/.config/opencode/docs
    stdin_open: true
    tty: true

Troubleshooting

Common Issues

"Playwright is not installed"

npm install playwright
npx playwright install chromium

"Failed to fetch URL: 403 Forbidden"

Some sites block scrapers. Try:

  1. Using Playwright: usePlaywright=true

  2. Adding 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:

  1. The path in your config is correct

  2. The project is built (npm run build)

  3. Restart your AI assistant

Docs directory not found

Create it manually:

mkdir -p ~/.config/opencode/docs

Debug Mode

Run the server directly to see logs:

node /path/to/opencode-docs/dist/index.js

Development

Run in Development Mode

npm run dev

Watch Mode

npm run watch

Clean Build

npm run clean && npm run build

Project 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.md

License

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_update tool for refreshing documentation

  • Added docs_preview tool for testing scrapes

  • Enhanced 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 tools
docs_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe OpenAPI JSON URL (e.g., "https://api.example.com/openapi.json")
nameNoOptional: display name for the API documentation
apiKeyNoOptional: API key to include in headers
sourceIdNoOptional: custom source ID (auto-generated from URL if not provided)
authHeaderNoOptional: Authorization header value (e.g., "Bearer your-token")
descriptionNoOptional: description for the source

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional: display name for the source
maxPagesNoMaximum number of pages to crawl (default: 50, max: 200)
sourceIdNoOptional: custom source ID (auto-generated from URL if not provided)
sitemapUrlYesThe sitemap URL (e.g., "https://docs.example.com/sitemap.xml")
urlPatternNoOptional: regex pattern to filter URLs (e.g., "/docs/" to only include URLs containing /docs/)
descriptionNoOptional: description for the source

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe Swagger UI page URL (e.g., "https://api.example.com/swagger")
nameNoOptional: display name for the API documentation
sourceIdNoOptional: custom source ID (auto-generated from API title if not provided)
descriptionNoOptional: description for the source

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to scrape
nameNoOptional: display name for the source
maxDepthNoMaximum depth for recursive crawling (default: 2)
maxPagesNoMaximum pages to crawl when recursive is true (default: 20)
sourceIdNoOptional: custom source ID (auto-generated from URL if not provided)
recursiveNoRecursively crawl linked pages
urlPatternNoOptional: regex pattern to filter URLs during recursive crawl
descriptionNoOptional: description for the source
usePlaywrightNoUse Playwright for JS-rendered pages (slower but handles React/Vue/Angular sites)

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHost/domain for the credential (e.g., "vps.madani.agency"). Required for add, remove, get.
typeNoAuth type: bearer (token), cookie, apikey, or basic. Required for add.
valueNoThe credential value (token, cookie string, api key). Required for add.
actionYesAction to perform: add, list, remove, or get
descriptionNoOptional description for the credential

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to preview
showLinksNoShow discovered internal links
usePlaywrightNoUse Playwright for JS-rendered pages
maxContentLengthNoMaximum content length to show (default: 3000)

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagePathNoThe page path within the source (e.g., "hooks/useEffect"). If not provided, lists all pages in the source.
sourceIdYesThe source ID (e.g., "react", "nextjs")

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet to true to confirm deletion
sourceIdYesThe source ID to remove (use docs_list to see available sources)

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_updateA

Update/refresh existing documentation by re-scraping. Can update an entire source or a single page. Detects changes and shows diff summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagePathNoOptional: specific page path to update (updates all pages if not provided)
sourceIdYesThe source ID to update
usePlaywrightNoUse Playwright for JS-rendered pages

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 11 tool updatesv1.1.0
    • First observeddocs_add_openapi
    • First observeddocs_add_sitemap
    • First observeddocs_add_swagger
    • First observeddocs_add_url
    • First observeddocs_auth
    • First observeddocs_list
    • First observeddocs_preview
    • First observeddocs_read
    • First observeddocs_remove
    • First observeddocs_search
    • First observeddocs_update

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Indexes 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.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Creates 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
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides tools for ingesting documents into a local vector database and retrieving relevant information via semantic search, enabling retrieval-augmented generation for MCP clients.
    6
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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