Marten Docs MCP Server
# Marten Docs MCP Server
Local MCP server for focused Marten documentation retrieval.
It caches `https://martendb.io/llms-full.txt`, builds a local index, and exposes a narrow retrieval surface so agents search first, then progressively narrow to specific sections.
## Quick install
### macOS / Linux
```bash
# Install latest release
curl -fsSL https://raw.githubusercontent.com/stijnVanHorenbeek/marten_mcp/master/scripts/quickinstall.sh | sh
# Print a Copilot-compatible config snippet
curl -fsSL https://raw.githubusercontent.com/stijnVanHorenbeek/marten_mcp/master/scripts/quickinstall.sh | sh -s -- --client copilot
```
### Windows PowerShell
```powershell
# Install latest release
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/stijnVanHorenbeek/marten_mcp/master/scripts/quickinstall.ps1)))
# Print a Copilot-compatible config snippet
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/stijnVanHorenbeek/marten_mcp/master/scripts/quickinstall.ps1))) -Client copilot
```
## Example SKILL.md
Example [SKILL.md](examples/skills/martendb/SKILL.md) is included
## MCP config examples
### OpenCode
```json
{
"mcp": {
"marten-docs": {
"type": "local",
"command": ["marten-docs-mcp"],
"environment": {
"MARTEN_MCP_CACHE_DIR": "~/.cache/marten-docs-mcp",
"MARTEN_MCP_STORAGE_MODE": "auto",
"MARTEN_MCP_SQLITE_PATH": "~/.cache/marten-docs-mcp/cache.db"
}
}
}
}
```
### GitHub Copilot Chat
```json
{
"mcpServers": {
"marten-docs": {
"type": "local",
"command": "marten-docs-mcp",
"args": [],
"env": {
"MARTEN_MCP_CACHE_DIR": "~/.cache/marten-docs-mcp",
"MARTEN_MCP_STORAGE_MODE": "auto",
"MARTEN_MCP_SQLITE_PATH": "~/.cache/marten-docs-mcp/cache.db"
},
"tools": ["*"]
}
}
}
```
## MCP tools
- `search_docs(query, limit?, offset?)`
- `search_within_page(path, query, limit?, offset?)`
- `list_headings(path)`
- `read_section(id, segmentIndex?, offset?, maxChars?)` (returns one local segment plus compact `neighbors.before/after` refs)
- `read_context(id, before?, after?)` (nearby refs only)
- `list_pages(prefix?, limit?)` (discovery only when search is insufficient)
- `get_status()`
- `refresh_docs(force?)`
## Recommended retrieval flow
1. `search_docs(...)`
2. Narrow with `list_headings(...)` and/or `search_within_page(...)`
3. Read one chunk with `read_section(...)`
4. Use `read_context(...)` only for nearby references
Broad page dumps are intentionally unsupported.
```text
1. search_docs(query="aggregate projections", limit=3)
2. search_within_page(path="/events/projections/aggregate-projections.md", query="lifecycle", limit=3)
3. read_section(id="<id>", offset=0, maxChars=1200)
4. read_context(id="<id>", before=1, after=1)
5. repeat read_section(..., offset=<nextOffset>) while hasMore=true
```
## Companion docs
- [Contributing](CONTRIBUTING.md)
- [Configuration](docs/configuration.md)
- [Install and lifecycle scripts](docs/lifecycle.md)
- [Evals and telemetry mining](docs/evals.md)
- [Troubleshooting](docs/troubleshooting.md)
TDQS
Scored across 8 tools
Each tool has a distinct purpose that is clearly described. Tools like search_docs, search_within_page, and read_section guide the agent through a clear search-to-read workflow without ambiguity.
All tool names follow a consistent verb_noun pattern: list_headings, search_docs, search_within_page, read_section, read_context, list_pages, get_status, refresh_docs. The naming is predictable and uniform.
With 8 tools, the count is well-scoped for a documentation server. Each tool supports a specific step in the exploration process, from search to reading to cache management.
The tool surface covers the full workflow: global search, local search, reading with pagination, context expansion, page listing, and cache status/refresh. A minor gap is the lack of a tool to directly fetch a page by ID or URL, but the workflow is otherwise complete.