Skip to main content
Glama
docs-search-engine

docs-search-engine

by wanyingng

Documentation Search Engine

A custom Model Context Protocol (MCP) server that acts as a documentation search engine.

This project attempts to build a simple, personal clone of Context7, unlocking the capability to access up-to-date documentation from GitHub repositories and web pages directly within your AI assistant's context.

šŸ› ļø Tech Stack

  • Python: Core programming language.

  • FastMCP: Framework for building MCP servers easily.

  • minsearch: Lightweight, in-memory full-text search engine.

  • uv: Fast Python package and environment manager.

  • Jina Reader: For turning web pages into LLM-friendly markdown.

  • requests: For handling HTTP requests and downloading zip files.

  • pytest: For comprehensive testing.

Related MCP server: CHECK-MODULE MCP Server

šŸ“‚ Project Structure

docs-search-engine/
ā”œā”€ā”€ main.py             # Entry point: Defines MCP tools and server configuration
ā”œā”€ā”€ search.py           # Core logic: Zip download, extraction, indexing, and search
ā”œā”€ā”€ scrape_web.py       # Web scraping functionality (using Jina Reader)
ā”œā”€ā”€ test_search.py      # Tests for search functionality
ā”œā”€ā”€ test_scrape_web.py  # Tests for web scraping
└── pyproject.toml      # Project dependencies and configuration

šŸš€ Workflow

  1. Ingestion: The server downloads documentation source code (e.g., as a .zip from GitHub).

  2. Indexing: Markdown content (.md and .mdx) is extracted and indexed in-memory using minsearch.

  3. Caching: Indexes are cached by URL to ensure fast subsequent searches without re-downloading.

  4. Retrieval: Users query the system via MCP tools (search_docs, scrape_web), and relevant context is returned to the LLM.

āš™ļø MCP Configuration

Add the following configuration to your MCP client settings (e.g., mcp_config.json in Google Antigravity):

{
  "mcpServers": {
    "docs-search-engine": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "C:/Users/username/path/to/docs-search-engine",
        "main.py"
      ]
    }
  }
}

Note: Replace C:/Users/username/path/to/docs-search-engine with the actual absolute path to your project directory.

šŸ’” Example Usage

Once the MCP server is connected to your AI assistant (e.g., VSCode, Claude, Cursor, Antigravity), you can use natural language to interact with it.

1. Search Documentation

"Search for 'context' in the FastMCP docs."
"Find information about 'indexing' in the minsearch docs (https://github.com/alexeygrigorev/minsearch)."

2. Scrape Web Pages

"Scrape the content of https://example.com/blog/article and summarize it."

3. Count Word Occurrences

"Count how many times the word 'LLM' appears on https://example.com/ai-trends."

šŸ’» Setup & Execution

Prerequisites

  • Python 3.13+

  • uv installed (recommended)

Installation

  1. Clone the repository and navigate to the directory:

    cd docs-search-engine
  2. Install dependencies:

    uv sync

Running Locally

To run the server manually for debugging:

uv run main.py

Testing

Run the comprehensive test suite to ensure everything is working correctly:

# Run all tests
uv run pytest -v

# Run specific test files
uv run pytest test_search.py -v
uv run pytest test_scrape_web.py -v

# Run only integration tests
uv run pytest -m integration -v

Available Tools

3 tools
count_word_occurrencesA

Count occurrences of a specific word on a web page.

This tool scrapes a web page and counts how many times a specific word appears in the content.

Args: url: The URL of the web page to analyze. word: The word to search for and count. case_insensitive: If True, count is case-insensitive (default: True).

Returns: A dictionary with the count and additional info.

Inputs: url (required), word (required), case_insensitive. Returns: object

scrape_webA

Scrape the content of a web page using Jina Reader.

This tool fetches the content of any web page and returns it in markdown format using the Jina Reader service.

Args: url: The URL of the web page to scrape (must be http or https).

Returns: The content of the web page in markdown format.

Inputs: url (required). Returns: result

search_docsA

Search documentation from a GitHub repository zip file.

This tool downloads documentation from a GitHub repository (as a zip), indexes the markdown files, and returns the most relevant documents matching the query. The index is cached for subsequent searches.

Args: query: The search query string. zip_url: URL to the GitHub zip file (default: FastMCP docs). Format: https://github.com/{owner}/{repo}/archive/refs/heads/{branch}.zip num_results: Maximum number of results to return (default: 5).

Returns: A list of matching documents with filename and content preview.

Examples: # Search FastMCP docs (default) search_docs("demo")

# Search minsearch docs
search_docs("index", zip_url="https://github.com/alexeygrigorev/minsearch/archive/refs/heads/main.zip")

Inputs: query (required), zip_url, num_results. Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 3 tools

    Disambiguation4/5

    scrape_web and count_word_occurrences both involve scraping a URL, so there is slight overlap, but count_word_occurrences is clearly a specialized analysis and search_docs is distinct. An agent can generally select the right tool from the stated purpose.

    Naming Consistency5/5

    All three tool names use a consistent verb_noun snake_case pattern (scrape_web, count_word_occurrences, search_docs), making the set predictable and easy to navigate.

    Tool Count4/5

    Three tools is a small but reasonable surface for a focused toolkit; only one tool actually performs documentation search, which feels slightly lean for a server named docs-search-engine, but no tool is redundant.

    Completeness4/5

    The core function of searching a GitHub repository's docs is implemented, but cache management and indexing of arbitrary scraped pages are not supported. These gaps are minor and can be worked around by passing a new zip_url or relying on the automatic index.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers