Skip to main content
Glama

devdocs-mcp

An MCP (stdio) server that gives AI agents token-efficient access to DevDocs documentation. Docsets are fetched once as static JSON from DevDocs' own endpoints, cached locally, and served offline as compact rows and markdown — no DevDocs fork, no Docker, no browser.

Install

pnpm install
pnpm build

Node 20+ required (uses global fetch).

Related MCP server: MCP Framework Documentation Server

Register with your harness

All harnesses run the same thing: node /absolute/path/to/devdocs-mcp/dist/index.js over stdio. Substitute your real absolute path below.

Claude Code

claude mcp add devdocs -- node /absolute/path/to/devdocs-mcp/dist/index.js

Add --scope user to register it for all projects instead of the current one.

Anything that reads an mcpServers JSON block

Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json), Cline, Windsurf, VS Code (.vscode/mcp.json, under "servers"), and most other MCP clients:

{
  "mcpServers": {
    "devdocs": {
      "command": "node",
      "args": ["/absolute/path/to/devdocs-mcp/dist/index.js"]
    }
  }
}

Codex CLI

In ~/.codex/config.toml:

[mcp_servers.devdocs]
command = "node"
args = ["/absolute/path/to/devdocs-mcp/dist/index.js"]

DeepSeek Harness (dsh)

dsh has no built-in MCP support — it comes from the official bridge plugin, one plugin instance per MCP server, wired per profile (headless, web, tui):

dsh plugin --profile headless add @deepseek-ai/dsh-mcp-client@0.0.1-rc.1

(The declares no dsh.bundle — installed as a plain dependency warning is normal; it means manual wiring is required.) Then add an insert block to $DSH_HOME/profiles/headless/cordis.patch.yml — a bare - id: row would be treated as an override of an existing entry and fail:

- insert:
    - id: mcp-devdocs
      name: "@deepseek-ai/dsh-mcp-client"
      config:
        serverName: devdocs
        transport: stdio
        command: node
        args: ["/absolute/path/to/devdocs-mcp/dist/index.js"]
        # failOnStartupError: true   # enable while debugging: loud failures

Verify with dsh --profile headless --dump-config | grep -A6 mcp-devdocs, then a live probe (dsh startup failures are silent by default):

dsh --profile headless "use the devdocs list_docsets tool; if no devdocs tools are available say NO-TOOLS"

Tools appear to the model as mcp__devdocs__<tool> in dsh and Claude Code.

Tools

Tool

Arguments

What it returns

list_docsets

installed?=true, filter?

Cached docsets (slug name release), or catalog matches when installed=false (requires filter, capped at 30)

install_docset

slug

Downloads index.json + db.json into the cache; re-downloads only when upstream is newer

remove_docset

slug

Deletes that docset from the cache

search

query, docsets?, limit?=20

Fuzzy entry-name matches as slug<TAB>type<TAB>name<TAB>path rows

read

docset, path, offset?=0

Page as markdown. path#anchor returns just that section. Output is capped at ~8000 chars with a offset=<N> continuation hint

toc

docset, path

Heading outline as h2<TAB>Title<TAB>#anchor rows — pick a section, then read path#anchor

Typical flow: list_docsets {installed:false, filter:"vite"}install_docset {slug:"vite"}search {query:"defineConfig"}toc / read with the path from the search rows.

Teaching agents to use it (AGENTS.md / CLAUDE.md)

The tools are self-describing, but agents won't form the habit of checking DevDocs on their own. Paste this into your project's AGENTS.md / CLAUDE.md (or your global one), and edit the docset list for your stack:

## Documentation lookup (devdocs MCP)

Before writing code against a library or API you haven't recently worked
with, check its documentation via the `devdocs` MCP tools — don't guess
from memory and don't reach for web search first. The docs are local,
offline, and current.

- One-time per docset: `install_docset` (find slugs with
  `list_docsets {installed: false, filter: "..."}`). This project uses:
  `typescript`, `react`, `vite`, `node`.
- Lookup flow: `search {query}` → pick a row → `toc {docset, path}` →
  `read {docset, path: "page#anchor"}` for just the section you need.
  Read whole pages only when short; follow `offset` hints to continue.
- If `search` misses, try a shorter query or the docset's own naming
  (e.g. "shared options" rather than "defineConfig options").

Cache

~/.cache/devdocs-mcp/ by default, overridable with DEVDOCS_CACHE_DIR:

docs.json          # DevDocs manifest, refreshed when older than 24h
<slug>/index.json  # entry list
<slug>/db.json     # page path -> HTML
<slug>/meta.json   # {slug, name, release, mtime, installedAt}

The cache is shared across sessions; delete a <slug>/ directory (or call remove_docset) to reclaim space.

Development

pnpm test    # vitest, fully offline (fixtures only)
pnpm build   # tsc -> dist/
pnpm smoke   # live: spawns dist/index.js, installs vite, searches/reads/tocs

Unit tests cover the pure modules (search, render, path handling); the six tool handlers are thin wiring over those and are exercised end-to-end by the smoke script instead.

Credits

Documentation content comes from DevDocs (maintained by freeCodeCamp), which aggregates and re-publishes the documentation of each upstream project. This server only fetches and reformats it: all content remains under the license and copyright of its respective upstream project, and each docset's attribution is included in the DevDocs manifest.

Available Tools

6 tools
install_docsetInstall docsetA

Download a DevDocs docset into the local cache (re-downloads only if upstream is newer).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesDocset slug, e.g. 'vite'.

TDQS

A3.6/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 behavioral burden. It does disclose the specific behavior 're-downloads only if upstream is newer' and the action 'Download', but it omits details about potential side effects such as overwriting existing cache entries or network requirements.

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?

A single well-written sentence covers the action, the target, and the key idempotency behavior. No unnecessary words or redundant information are included, and the main verb is appropriately front-loaded.

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 tool with only one parameter, no output schema, and no annotations, the description covers the essential context:, the command, what gets downloaded, where it goes, and the caching update policy. It is missing potential edge-case details like error handling, but those are not required for correct invocation.

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?

The parameter `slug` is already fully documented in the schema with a definition and example ('Docset slug, e.g. 'vite''), achieving 100% schema coverage. The description adds no additional information about the parameter's meaning or syntax beyond that baseline.

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 identifies the verb ('Download'), resource ('DevDocs docset'), and target ('local cache'). This distinguishes it from siblings like remove_docset and list_docsets, which handle deletion and listing, respectively.

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 description does not explicitly say when to use this tool versus alternatives or when not to use it. While its purpose implies its use for installing docsets, no direct guidance or written mention of alternatives exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_docsetsList docsetsA

List installed (cached) docsets, or search the DevDocs catalog for installable ones (installed=false requires filter).

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoSubstring match on slug or name.
installedNotrue: cached docsets. false: search the DevDocs catalog.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It reveals that installed=false requires a filter and that the catalog path is for installable docsets, which is useful. However, it does not disclose what happens if the filter is omitted (error vs empty result), whether network access is involved, or the general return shape, leaving behavioral cliff.

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?

The entire description is a single sentence with no filler. It front-loads the core action, then packages the alternate mode and a critical constraint in a parenthetical. Every word contributes value.

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 simple tool with two optional parameters and no output schema, the description covers the main execution paths and a key invocation rule. It lacks detail on error behavior when the filter is missing and on the response format, but it is mostly sufficient for an agent to call the tool reasonably.

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 baseline is 3. The description adds meaningful cross-parameter semantics not present in the schema: it states that installed=false requires a filter, linking the two parameters in a way the schema does not. This exceeded the baseline.

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 explicitly names the action ('List') and the resource (docsets), and it distinguishes two operating modes: listing cached docsets vs searching the DevDocs catalog. It is clear about its primary functionality, though it does not explicitly differentiate itself from the sibling 'search' tool, so it stops short of a full sibling-distinguishing statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear guidance about how to select each behavior through the 'installed' flag, and it states an important constraint ('installed=false requires filter'). It does not, however, mention when to prefer the alternative sibling tools (e.g., 'search' or 'install_docset'), so it lacks explicit into tool-vs-tool routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

readRead pageA

Read a docset page as markdown. Append #anchor to the path to get just that section. Long pages paginate via offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPage path from search/toc, optionally with #anchor.
docsetYesDocset slug, e.g. 'vite'.
offsetNoCharacter offset into the markdown (from a truncation hint).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the behavioral burden. It discloses the markdown output, the #anchor behavior, and pagination via offset. This is solid coverage for a read-only tool, though it omits error behavior and the precise pagination protocol.

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 concise sentences, with the primary purpose front-loaded and the pagination detail following naturally. Every sentence earns its place with no 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?

For a simple read tool, the description covers the core behavior, markdown output, section anchoring, and pagination. It does not address errors or absent pages, but the missing details are unlikely to block correct invocation.

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%, but the description adds meaning beyond the schema by explaining how #anchor affects the path and that long pages paginate via offset. This enriches the schema's bare parameter definitions.

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 'Read a docset page as markdown' — a specific verb and resource. This distinguishes it from sibling tools like remove_docset, search, toc, and install_docset.

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 description does not explicitly state when to use this tool versus alternatives such as search or toc. The path schema hints that paths come from search/toc, but the description itself gives no usage guidance or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_docsetRemove docsetA

Delete a docset from the local cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesDocset slug, e.g. 'vite'.

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 of behavioral disclosure. It communicates the destructive action and the specific scope ('local cache'), but it does not state whether deletion is permanent, what happens for a missing slug, or whether any side effects occur for dependent features like search or read.

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?

The description is a single short sentence with no wasted words. It is front-loaded with the core action and includes the useful 'local cache' qualifier without redundancy.

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?

The tool is simple and has one well-documented parameter, so the description is minimally viable. However, with no annotations and no output schema, an agent would benefit from more detail about result/error behavior and reversibility, making the definition adequate but 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%, and the schema already fully documents the single 'slug' parameter with an example. The description adds no additional parameter meaning beyond what the schema provides, so the baseline of 3 applies.

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 states a clear verb ('Delete') and a clear resource ('a docset from the local cache'), making the action unambiguous. It also distinguishes this tool from siblings like install_docset and list_docsets by focusing specifically on cache deletion.

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 description gives no guidance about when to use this tool versus alternatives such as install_docset or list_docsets. It also does not mention prerequisites, such as the docset needing to already exist in the local cache, or when deletion might be inappropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tocPage outlineA

Heading outline of a page: level, title, anchor. Pick a section and read path#anchor instead of paging the whole page.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPage path (any #anchor is ignored).
docsetYesDocset slug, e.g. 'vite'.

TDQS

A4.3/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 burden. It accurately conveys that the tool provides a navigation outline rather than full page content, which is the key behavioral trait. It could mention that no page text is returned, but 'heading outline' and the anchor-based reading tip make this sufficiently clear.

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, no fluff. The output contents are front-loaded, and the usage guidance is compact and actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with no output schema, the description is sufficient: it states what the result contains, how to use it, and how to proceed with a sibling tool. Nothing necessary for correct invocation is missing.

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 docset and path. The description adds useful workflow context around path#anchor, but it does not need to redefine parameters. 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?

The description clearly identifies what the tool returns — a heading outline with level, title, and anchor — and names the page as the resource. It lacks an explicit action verb like 'returns' or 'lists', but the meaning is unambiguous and distinguishes it from read/search siblings.

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 guidance: use this tool to pick a section, then read path#anchor instead of reading the whole page. This directly addresses when to use it versus the read sibling and gives a concrete workflow.

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. 6 tool updatesv0.1.0
    • First observedinstall_docset
    • First observedlist_docsets
    • First observedread
    • First observedremove_docset
    • First observedsearch
    • First observedtoc

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: three manage docsets (list, install, remove) and three navigate content (search, read, toc). There is no overlap or ambiguity.

Naming Consistency3/5

The first three tools follow a consistent verb_noun snake_case pattern (remove_docset, list_docsets, install_docset), but the remaining three use bare verbs or a noun (search, read, toc). This mixed convention is readable but not fully consistent.

Tool Count5/5

With 6 tools, the server is well-scoped for its purpose of managing and reading DevDocs documentation. Each tool earns its place and there is no bloat.

Completeness5/5

The server covers the full lifecycle: list/install/remove docsets and search/read/navigate pages. The install tool also handles updates, leaving no obvious gaps for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Provides AI models with direct access to documentation for over 600 technologies from DevDocs.io, including popular languages, frameworks, and tools. It enables comprehensive searching, content retrieval, and offline access via an intelligent local caching system.
    12
    2
    -
  • A
    license
    A
    quality
    C
    maintenance
    Provides tools for AI agents to search, browse, and retrieve the full documentation for the mcp-framework. It enables agents to access documentation sections and page content directly within MCP-compatible environments like Claude Code and Cursor.
    3
    2 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to search, deep-read, and build knowledge bases from Markdown, PDF, DOCX, and PPTX documents via MCP tools for retrieval, document navigation, and ingestion.
    16 npm
    633
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to search, read, and traverse documentation bundles in Open Knowledge Format via MCP tools.
    233 npm
    72
    MIT