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.
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
- Fetch documentation content via Dash load URLs (with pagination)
- Enable full-text search for specific docsets
This is a work in progress. Any suggestions are welcome!
- list_installed_docsets
- Lists all installed documentation sets in Dash
- search_documentation
- Searches across docsets and snippets
- fetch_documentation
- Fetches raw documentation content using the
load_urlfrom search results (supports chunking for large pages)
- Fetches raw documentation content using the
- enable_docset_fts
- Enables full-text search for a specific docset
dash://server-info— server runtime/config info (JSON)
- macOS (required for Dash app)
- Dash installed
- Python 3.11.4 or higher
- uv
Environment variables for the server process:
DASH_MCP_TRANSPORT:stdio(default),sse, orstreamable-httpDASH_MCP_HOST: bind address (default127.0.0.1)DASH_MCP_PORT: bind port (default8000)DASH_MCP_LOG_LEVEL:DEBUG,INFO,WARNING,ERROR,CRITICALDASH_MCP_HTTP_COMPAT:true/false(defaulttrue) - relaxes Accept checks and prefers JSON/stateless HTTPDASH_MCP_JSON_RESPONSE:true/false(defaulttruewhenDASH_MCP_HTTP_COMPATis on)DASH_MCP_STATELESS_HTTP:true/false(defaulttruewhenDASH_MCP_HTTP_COMPATis on)DASH_MCP_DNS_REBINDING:true/false(defaultfalse)DASH_MCP_ALLOWED_HOSTS: comma-separated Host header allowlistDASH_MCP_ALLOWED_ORIGINS: comma-separated Origin allowlistDASH_MCP_SHUTDOWN_TIMEOUT: graceful shutdown timeout in seconds (default3)DASH_MCP_KEEP_ALIVE_TIMEOUT: keep-alive timeout in seconds (optional)DASH_MCP_HTTP_LOG:true/false(defaultfalse) - log incoming HTTP JSON-RPC bodiesDASH_MCP_HTTP_LOG_MAX: max log length for HTTP bodies (default2000)DASH_MCP_SSE_CLIENT_TTL: seconds to prefer SSE for clients that openedGET /mcp(default60)DASH_MCP_PREFER_SSE:true/false(defaultfalse) - prefer SSE when client accepts both JSON and SSEDASH_MCP_SSE_CLIENT_NAMES: comma-separated client names (from initialize) that should prefer SSE responsesDASH_MCP_DASH_BASE_URL: override host/port used in returned Dashload_urlvalues (e.g.http://host:port)DASH_MCP_DOC_CHUNK_BYTES: default max bytes returned byfetch_documentation(default120000)DASH_MCP_DOC_CHUNK_MAX_BYTES: hard cap forfetch_documentationmax bytes (default1000000)DASH_MCP_ALLOWED_DASH_HOSTS: comma-separated allowlist forload_urlhosts (*to allow any; default:127.0.0.1,localhost,::1)
If you set DASH_MCP_ALLOWED_HOSTS or DASH_MCP_ALLOWED_ORIGINS, DNS rebinding
protection is enabled automatically unless DASH_MCP_DNS_REBINDING=false.
Use * in either allowlist to disable the check and allow any host/origin.
When DASH_MCP_HTTP_COMPAT is enabled, the server accepts POST requests that only
declare Accept: application/json, suppresses session IDs by default, and prefers
JSON responses over SSE to improve client compatibility. It also accepts legacy
method names like listResources/listTools and maps them to the MCP spec names.
For no-params methods, empty list or empty string params are normalized to {}.
If a client opens GET /mcp, the server can prefer SSE responses for that client
for a short time window when DASH_MCP_PREFER_SSE=true.
You can also force SSE for specific clients by setting DASH_MCP_SSE_CLIENT_NAMES
to their clientInfo.name values (e.g. mcp-router).
dash://server-info includes a build section with code_sha256 and git_commit
to help identify exactly which server build is running.
brew install uv{
"mcpServers": {
"dash-api": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/Kapeli/dash-mcp-server.git",
"dash-mcp-server"
]
}
}
}claude mcp add dash-api -- uvx --from "git+https://github.com/Kapeli/dash-mcp-server.git" "dash-mcp-server"