Skip to main content
Glama
README.md
# doc-lib-mcp MCP server

A Model Context Protocol (MCP) server for document ingestion, chunking, semantic search, and note management.

## Components

### Resources

- Implements a simple note storage system with:
  - Custom `note://` URI scheme for accessing individual notes
  - Each note resource has a name, description, and `text/plain` mimetype

### Prompts

- Provides a prompt:
  - **summarize-notes**: Creates summaries of all stored notes
    - Optional "style" argument to control detail level (brief/detailed)
    - Generates prompt combining all current notes with style preference

### Tools

The server implements a wide range of tools:

- **add-note**: Add a new note to the in-memory note store
  - Arguments: `name` (string), `content` (string)
- **ingest-string**: Ingest and chunk a markdown or plain text string provided via message
  - Arguments: `content` (string, required), `source` (string, optional), `tags` (list of strings, optional)
- **ingest-markdown**: Ingest and chunk a markdown (.md) file
  - Arguments: `path` (string)
- **ingest-python**: Ingest and chunk a Python (.py) file
  - Arguments: `path` (string)
- **ingest-openapi**: Ingest and chunk an OpenAPI JSON file
  - Arguments: `path` (string)
- **ingest-html**: Ingest and chunk an HTML file
  - Arguments: `path` (string)
- **ingest-html-url**: Ingest and chunk HTML content from a URL (optionally using Playwright for dynamic content)
  - Arguments: `url` (string), `dynamic` (boolean, optional)
- **smart_ingestion**: Extracts all technically relevant content from a file using Gemini, then chunks it using robust markdown logic.
  - Arguments:
    - `path` (string, required): File path to ingest.
    - `prompt` (string, optional): Custom prompt to use for Gemini.
    - `tags` (list of strings, optional): Optional list of tags for classification.
  - Uses Gemini 2.0 Flash 001 to extract only code, configuration, markdown structure, and technical definitions (no summaries or commentary).
  - Passes the extracted content to a mistune 3.x-based chunker that preserves both code blocks and markdown/narrative content as separate chunks.
  - Each chunk is embedded and stored for semantic search and retrieval.
- **search-chunks**: Semantic search over ingested content
  - Arguments:
    - `query` (string): The semantic search query.
    - `top_k` (integer, optional, default 3): Number of top results to return.
    - `type` (string, optional): Filter results by chunk type (e.g., `code`, `html`, `markdown`).
    - `tag` (string, optional): Filter results by tag in chunk metadata.
  - Returns the most relevant chunks for a given query, optionally filtered by type and/or tag.
- **delete-source**: Delete all chunks from a given source
  - Arguments: `source` (string)
- **delete-chunk-by-id**: Delete one or more chunks by id
  - Arguments: `id` (integer, optional), `ids` (list of integers, optional)
  - You can delete a single chunk by specifying `id`, or delete multiple chunks at once by specifying `ids`.
- **update-chunk-type**: Update the type attribute for a chunk by id
  - Arguments: `id` (integer, required), `type` (string, required)
- **ingest-batch**: Ingest and chunk multiple documentation files (markdown, OpenAPI JSON, Python) in batch
  - Arguments: `paths` (list of strings)
- **list-sources**: List all unique sources (file paths) that have been ingested and stored in memory, with optional filtering by tag or semantic search.
  - Arguments:
    - `tag` (string, optional): Filter sources by tag in chunk metadata.
    - `query` (string, optional): Semantic search query to find relevant sources.
    - `top_k` (integer, optional, default 10): Number of top sources to return when using query.
- **get-context**: Retrieve relevant content chunks (content only) for use as AI context, with filtering by tag, type, and semantic similarity.
  - Arguments:
    - `query` (string, optional): The semantic search query.
    - `tag` (string, optional): Filter results by a specific tag in chunk metadata.
    - `type` (string, optional): Filter results by chunk type (e.g., 'code', 'markdown').
    - `top_k` (integer, optional, default 5): The number of top relevant chunks to retrieve.
- **update-chunk-metadata**: Update the metadata field for a chunk by id
  - Arguments: `id` (integer), `metadata` (object)
- **tag-chunks-by-source**: Adds specified tags to the metadata of all chunks associated with a given source (URL or file path). Merges with existing tags.
  - Arguments: `source` (string), `tags` (list of strings)
- **list-notes**: List all currently stored notes and their content.

#### Chunking and Code Extraction

- Markdown, Python, OpenAPI, and HTML files are split into logical chunks for efficient retrieval and search.
- The markdown chunker uses mistune 3.x's AST API and regex to robustly split content by code blocks and narrative, preserving all original formatting.
- Both code blocks and markdown/narrative content are preserved as separate chunks.
- The HTML chunker uses the `readability-lxml` library to extract main content first, then extracts block code snippets from `<pre>` tags as dedicated "code" chunks. Inline `<code>` content remains part of the narrative chunks.

#### Semantic Search

- The `search-chunks` tool performs vector-based semantic search over all ingested content, returning the most relevant chunks for a given query.
- Supports optional `type` and `tag` arguments to filter results by chunk type (e.g., `code`, `html`, `markdown`) and/or by tag in chunk metadata, before semantic ranking.
- This enables highly targeted retrieval, such as "all code chunks tagged with 'langfuse' relevant to 'cost and usage'".

#### Metadata Management

- Chunks include a `metadata` field for categorization and tagging.
- The `update-chunk-metadata` tool allows updating metadata for any chunk by its id.
- The `tag-chunks-by-source` tool allows adding tags to all chunks from a specific source in one operation. Tagging merges new tags with existing ones, preserving previous tags.

## Configuration

The server requires the following environment variables (can be set in a .env file):

### Ollama Configuration
- OLLAMA_HOST: Hostname for Ollama API (default: localhost)
- OLLAMA_PORT: Port for Ollama API (default: 11434)
- RAG_AGENT: Ollama model to use for RAG responses (default: llama3)
- OLLAMA_MODEL: Ollama model to use for embeddings (default: nomic-embed-text-v2-moe)

### Database Configuration
- HOST: PostgreSQL database host (default: localhost)
- DB_PORT: PostgreSQL database port (default: 5432)
- DB_NAME: PostgreSQL database name (default: doclibdb)
- DB_USER: PostgreSQL database user (default: doclibdb_user)
- DB_PASSWORD: PostgreSQL database password (default: doclibdb_password)

### Reranker Configuration
- RERANKER_MODEL_PATH: Path to the reranker model (default: /srv/samba/fileshare2/AI/models/bge-reranker-v2-m3)
- RERANKER_USE_FP16: Whether to use FP16 for reranker (default: True)

## Quickstart

### Install

#### Claude Desktop

On MacOS: `~/Library/Application\ Support/Claude/claude_desktop_config.json`
On Windows: `%APPDATA%/Claude/claude_desktop_config.json`

<details>
  <summary>Development/Unpublished Servers Configuration</summary>
  ```
  "mcpServers": {
    "doc-lib-mcp": {
      "command": "uv",
      "args": [
        "--directory",
        "/home/administrator/python-share/doc-lib-mcp",
        "run",
        "doc-lib-mcp"
      ]
    }
  }
  ```
</details>

<details>
  <summary>Published Servers Configuration</summary>
  ```
  "mcpServers": {
    "doc-lib-mcp": {
      "command": "uvx",
      "args": [
        "doc-lib-mcp"
      ]
    }
  }
  ```
</details>

## Development

### Building and Publishing

To prepare the package for distribution:

1. Sync dependencies and update lockfile:
```bash
uv sync
```

2. Build package distributions:
```bash
uv build
```

This will create source and wheel distributions in the `dist/` directory.

3. Publish to PyPI:
```bash
uv publish
```

Note: You'll need to set PyPI credentials via environment variables or command flags:
- Token: `--token` or `UV_PUBLISH_TOKEN`
- Or username/password: `--username`/`UV_PUBLISH_USERNAME` and `--password`/`UV_PUBLISH_PASSWORD`

### Debugging

Since MCP servers run over stdio, debugging can be challenging. For the best debugging
experience, we strongly recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector).

You can launch the MCP Inspector via [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) with this command:

```bash
npx @modelcontextprotocol/inspector uv --directory /home/administrator/python-share/doc-lib-mcp run doc-lib-mcp
```

Upon launching, the Inspector will display a URL that you can access in your browser to begin debugging.