Skip to main content
Glama
Marten Docs MCP Server

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

# 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

# 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

Related MCP server: Atlas

Example SKILL.md

Example SKILL.md is included

MCP config examples

OpenCode

{
  "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

{
  "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?)

  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.

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

Available Tools

8 tools
get_statusB
Read-onlyIdempotent

Get cache and index status.

Inputs: no named parameters. Returns: index, hasCache, cachePath, freshness, +2 more

list_headingsC
Read-onlyIdempotent

Inspect sections within a known page before reading a chunk.

Inputs: path (required). Returns: path, count, headings

list_pagesC
Read-onlyIdempotent

Discovery only when search does not identify a relevant page.

Inputs: limit, prefix. Returns: count, limit, pages, prefix

read_contextA
Read-onlyIdempotent

Expand nearby refs around one chunk when immediate neighbor refs are not enough.

Inputs: id (required), after, before. Returns: id, after, count, before, +1 more

read_sectionA
Read-onlyIdempotent

Read one chunk with pagination. Prefer neighbors.before/after for the next local read before running another global search.

Inputs: id (required), offset, maxChars, segmentIndex. Returns: id, path, error, kinds, +8 more

refresh_docsC

Refresh source docs and rebuild the index.

Inputs: force. Returns: force, status, metadata, refreshed, +1 more

search_docsA
Read-onlyIdempotent

Start here: global docs search. Once a relevant page is found, prefer local navigation over another global search.

Inputs: query (required), limit, offset. Returns: count, limit, query, offset, +1 more

search_within_pageA
Read-onlyIdempotent

Narrow within a known page after global search. Prefer this over another global search.

Inputs: path (required), query (required), limit, offset. Returns: path, count, limit, query, +2 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 8 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers