Dash MCP Server
Provides tools for accessing and searching documentation in the Dash macOS documentation browser, including listing installed docsets, searching across docsets and code snippets, and enabling full-text search for specific docsets.
Interfaces with the Dash documentation browser which is a macOS application, making documentation available through macOS.
Click on "Install 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., "@Dash MCP Serversearch for Python list comprehension examples"
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.
mcp-server-dash
A Model Context Protocol (MCP) server that provides tools to interact with the Dash documentation browser API.
Dash 8 is required. You can download Dash 8 at https://blog.kapeli.com/dash-8.
mcp-name: io.github.Kapeli/dash-mcp-server
Overview
The Dash MCP server provides tools for accessing and searching documentation directly from Dash, the macOS documentation browser. MCP clients can:
List installed docsets
Search across docsets and code snippets
Load documentation pages from search results
Enable full-text search for specific docsets
Notice
This is a work in progress. Any suggestions are welcome!
Related MCP server: DocsetMCP
Tools
list_installed_docsets
Lists all installed documentation sets in Dash
search_documentation
Searches across docsets and snippets
load_documentation_page
Loads a documentation page from a
load_urlreturned bysearch_documentation
enable_docset_fts
Enables full-text search for a specific docset
Requirements
macOS (required for Dash app)
Dash installed
Python 3.12 or higher
uv
Configuration
Using uvx
brew install uvin claude_desktop_config.json
{
"mcpServers": {
"dash-api": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/Kapeli/dash-mcp-server.git",
"dash-mcp-server"
]
}
}
}in Claude Code
claude mcp add dash-api -- uvx --from "git+https://github.com/Kapeli/dash-mcp-server.git" "dash-mcp-server"Available Tools
4 toolsenable_docset_ftsB
Enable full-text search for a specific docset.
Args:
identifier: The docset identifier (from list_installed_docsets)
Returns:
True if FTS was successfully enabled, False otherwise
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool does (enable FTS) and the return value, but doesn't mention permission requirements, whether this is a one-time configuration or reversible, potential side effects, or performance implications. The description adds minimal behavioral context beyond the basic 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?
The description is appropriately sized with a clear purpose statement followed by structured Args and Returns sections. Every sentence serves a purpose, though the formatting with separate sections could be slightly more integrated for optimal front-loading.
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 the tool has an output schema (which handles return value documentation) and only one parameter with good semantic coverage in the description, the description is reasonably complete. It covers the purpose, parameter meaning, and references sibling tools, though additional behavioral context would be beneficial for a configuration/mutation tool.
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 description provides crucial semantic information about the single parameter: it specifies that 'identifier' refers to 'The docset identifier' and clarifies it should come 'from list_installed_docsets'. With 0% schema description coverage, this information significantly compensates for the schema's lack of documentation, though it doesn't provide format examples or validation rules.
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 the action ('enable full-text search') and resource ('for a specific docset'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools, but the specificity of enabling FTS for docsets distinguishes it from listing, loading, or searching documentation tools.
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 provides implied usage context by mentioning that the identifier should come 'from list_installed_docsets', suggesting a prerequisite workflow. However, it doesn't explicitly state when to use this tool versus alternatives or provide any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_installed_docsetsA
List all installed documentation sets in Dash. An empty list is returned if the user has no docsets installed. Results are automatically truncated if they would exceed 25,000 tokens.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message if there was an issue |
| docsets | No | List of installed docsets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and adds valuable behavioral context: it discloses that results are automatically truncated if exceeding 25,000 tokens and specifies the return condition for no installed docsets. This goes beyond basic functionality, though it could mention performance or error handling.
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 description is front-loaded with the core purpose in the first sentence, followed by two concise sentences adding critical behavioral details. Every sentence earns its place with no waste, making it efficient and well-structured.
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 the tool's simplicity (0 parameters, output schema exists), the description is largely complete. It covers purpose, edge cases (empty list), and a key limitation (token truncation). With an output schema, it need not explain return values, but could slightly enhance by mentioning format or ordering.
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 has 0 parameters with 100% schema description coverage, so the schema already fully documents inputs. The description appropriately does not add parameter details, maintaining focus on behavior. Baseline is 4 for zero parameters, as it avoids unnecessary repetition.
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 the specific action ('List all installed documentation sets in Dash') and resource ('documentation sets'), distinguishing it from siblings like search_documentation or load_documentation_page. It provides precise scope by specifying 'installed' and the context of Dash.
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 implies usage for retrieving installed docsets, but does not explicitly state when to use this tool versus alternatives like search_documentation. It mentions an empty list result condition, which gives some context, but lacks explicit guidance on scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_documentation_pageA
Load a documentation page from a load_url returned by search_documentation.
Args:
load_url: The load_url value from a search result (must point to the local Dash API at 127.0.0.1)
Returns:
The documentation page content as plain text with markdown-style links
| Name | Required | Description | Default |
|---|---|---|---|
| load_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message if there was an issue |
| content | Yes | The documentation page content |
| load_url | Yes | The URL that was loaded |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adequately describes the core operation (loading content) and output format ('plain text with markdown-style links'), but lacks details about error handling, performance characteristics, or authentication requirements. The description doesn't contradict any annotations (since none exist), but could provide more complete behavioral context for a tool that presumably makes network requests.
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 description is perfectly structured and concise, with three focused sentences that each earn their place: the purpose statement, parameter guidance, and return value description. It's front-loaded with the core functionality and wastes no words while covering all essential 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?
Given the tool's moderate complexity (network request to load documentation), no annotations, and the presence of an output schema (which handles return value documentation), the description is mostly complete. It covers purpose, usage context, parameter semantics, and output format. The main gap is lack of error handling or performance details, but with an output schema handling return values, this is acceptable.
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 description adds significant meaning beyond the input schema, which has 0% description coverage. It explains that the load_url parameter must come from 'search_documentation' results and must point to 'the local Dash API at 127.0.0.1', providing crucial context about parameter provenance and format that the schema alone doesn't capture. For a single parameter with no schema descriptions, this represents good compensation.
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 the tool's purpose with specific verbs ('Load a documentation page') and resources ('from a load_url returned by search_documentation'), distinguishing it from sibling tools like search_documentation (which finds pages) and list_installed_docsets (which lists available documentation sets). The description explicitly references the sibling tool search_documentation, establishing a clear workflow relationship.
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 provides explicit guidance on when to use this tool ('from a load_url returned by search_documentation') and includes important prerequisites about the URL format ('must point to the local Dash API at 127.0.0.1'). This creates clear context for usage and distinguishes it from alternative approaches that might involve different URL sources or direct file loading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentationA
Search for documentation across docset identifiers and snippets.
Args:
query: The search query string
docset_identifiers: Comma-separated list of docset identifiers to search in (from list_installed_docsets)
search_snippets: Whether to include snippets in search results
max_results: Maximum number of results to return (1-1000)
Results are automatically truncated if they would exceed 25,000 tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| docset_identifiers | Yes | ||
| search_snippets | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message if there was an issue |
| results | No | List of search results |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses key behavioral traits: results are 'automatically truncated if they would exceed 25,000 tokens,' and it explains parameter defaults and constraints (e.g., 'max_results: 1-1000'). However, it doesn't cover aspects like rate limits, authentication needs, or error handling.
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 description is appropriately sized and front-loaded: the first sentence states the purpose, followed by a structured list of parameters with clear explanations. Every sentence adds value without redundancy, making it efficient and easy to parse.
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 the tool's moderate complexity (4 parameters, no annotations, but with an output schema), the description is mostly complete. It covers purpose, parameters, and key behavior (truncation), but lacks details on output format or error cases, though the output schema may mitigate this. For a search tool, it's reasonably comprehensive.
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 0%, so the description must compensate fully. It adds significant meaning beyond the schema: it explains that 'docset_identifiers' are 'comma-separated' and sourced 'from list_installed_docsets', clarifies 'search_snippets' as 'whether to include snippets', and specifies 'max_results' range and default. This effectively documents all parameters.
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 the tool's purpose: 'Search for documentation across docset identifiers and snippets.' It specifies the verb ('search') and resource ('documentation'), but doesn't explicitly differentiate from sibling tools like 'load_documentation_page' or 'list_installed_docsets' beyond mentioning docset identifiers come from the latter.
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 implies usage through the mention of 'docset identifiers (from list_installed_docsets)' and the parameter descriptions, but lacks explicit guidance on when to use this tool versus alternatives like 'load_documentation_page' or 'enable_docset_fts'. No exclusions or clear context for tool selection are provided.
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. Dates show when Glama detected each change.
1 tool update
v1.0.1- Added
load_documentation_page
2 tool updates
v1.0.0- Changed
list_installed_docsets8 fields changed- removed
Output schema / $defs / DocsetInfoRemoved value: -{ - "description": "Information about a docset.", - "properties": { - "full_text_search": { - "description": "Full-text search status: 'not supported', 'disabled', 'indexing', or 'enabled'", - "title": "Full Text Search", - "type": "string" - }, - "identifier": { - "description": "Unique identifier", - "title": "Identifier", - "type": "string" - }, - "name": { - "description": "Display name of the docset", - "title": "Name", - "type": "string" - }, - "notice": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional notice about the docset status", - "title": "Notice" - }, - "platform": { - "description": "Platform/type of the docset", - "title": "Platform", - "type": "string" - } - }, - "required": [ - "name", - "identifier", - "platform", - "full_text_search" - ], - "title": "DocsetInfo", - "type": "object" -} - added
Output schema / $defs / DocsetResultAdded value: +{ + "description": "Information about a docset.", + "properties": { + "full_text_search": { + "description": "Full-text search status: 'not supported', 'disabled', 'indexing', or 'enabled'", + "title": "Full Text Search", + "type": "string" + }, + "identifier": { + "description": "Unique identifier", + "title": "Identifier", + "type": "string" + }, + "name": { + "description": "Display name of the docset", + "title": "Name", + "type": "string" + }, + "notice": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional notice about the docset status", + "title": "Notice" + }, + "platform": { + "description": "Platform/type of the docset", + "title": "Platform", + "type": "string" + } + }, + "required": [ + "name", + "identifier", + "platform", + "full_text_search" + ], + "title": "DocsetResult", + "type": "object" +} - added
Output schema / descriptionAdded value: +"Result from listing docsets." - added
Output schema / properties / docsetsAdded value: +{ + "description": "List of installed docsets", + "items": { + "$ref": "#/$defs/DocsetResult" + }, + "title": "Docsets", + "type": "array" +} - added
Output schema / properties / errorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Error message if there was an issue", + "title": "Error" +} - removed
Output schema / properties / resultRemoved value: -{ - "items": { - "$ref": "#/$defs/DocsetInfo" - }, - "title": "Result", - "type": "array" -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"list_installed_docsetsOutput"New value: +"DocsetResults"
- Changed
search_documentation14 fields changed- removed
Input schema / properties / docset_identifiers / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / docset_identifiers / defaultRemoved value: -null - added
Input schema / properties / docset_identifiers / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "query" -]New value: +[ + "query", + "docset_identifiers" +] - added
Output schema / $defs / SearchResult / properties / platform / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / SearchResult / properties / platform / defaultAdded value: +null - removed
Output schema / $defs / SearchResult / properties / platform / typeRemoved value: -"string" - changed
Output schema / $defs / SearchResult / requiredPrevious value: -[ - "name", - "type", - "platform", - "load_url" -]New value: +[ + "name", + "type", + "load_url" +] - added
Output schema / descriptionAdded value: +"Result from searching documentation." - added
Output schema / properties / errorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Error message if there was an issue", + "title": "Error" +} - removed
Output schema / properties / resultRemoved value: -{ - "items": { - "$ref": "#/$defs/SearchResult" - }, - "title": "Result", - "type": "array" -} - added
Output schema / properties / resultsAdded value: +{ + "description": "List of search results", + "items": { + "$ref": "#/$defs/SearchResult" + }, + "title": "Results", + "type": "array" +} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"search_documentationOutput"New value: +"SearchResults"
3 tool updates
- First observed
enable_docset_fts - First observed
list_installed_docsets - First observed
search_documentation
TDQS
Each tool has a clearly distinct purpose with no overlap. enable_docset_fts configures search capabilities, list_installed_docsets enumerates available resources, search_documentation finds content, and load_documentation_page retrieves specific pages. The boundaries between these operations are well-defined and unambiguous.
All tool names follow a consistent verb_noun pattern with clear, descriptive action-object pairs. The naming convention is uniform throughout: enable_docset_fts, list_installed_docsets, load_documentation_page, and search_documentation all maintain the same structure and style.
Four tools is reasonable for a documentation search server, covering core operations of listing, searching, and viewing documentation. While this is a minimal but functional set, it could potentially benefit from additional utilities like docset management or search refinement tools, but the current count is appropriate for the basic scope.
The toolset provides complete coverage for the core documentation search workflow: discovering available docsets, enabling search features, searching across documentation, and loading specific pages. The only minor gap is the absence of docset installation/removal tools, but the server appears focused on search operations rather than full docset management.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search and read Rust documentation for the standard library and any crate on crates.io
DevDocs.io keyless docs index + entry search + content (Angular, MDN, Rust, etc.).
Manage Appwrite projects, databases, auth, storage, functions, and messaging; search Appwrite docs
Get up-to-date, version-specific documentation and code examples from official sources directly in…
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides tools to search and retrieve Google Gemini API documentation with full-text search capabilities and automatic documentation updates stored in a local SQLite database.3101MIT
- AlicenseNot gradedqualityCmaintenanceProvides AI assistants with instant access to local Dash documentation docsets and cheatsheets, enabling offline documentation searches across 165+ programming languages, frameworks, and developer tools directly within conversations.9MIT
- AlicenseNot gradedqualityCmaintenanceEnables substring-search of documentation entries from DevDocs.io via a single tool.MIT
- FlicenseNot gradedqualityDmaintenanceProvides access to Rust crate documentation, search, and metadata from docs.rs and crates.io.15-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Kapeli/dash-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server