Documentation MCP Server
Documentation MCP Server (RAG-enabled)
An MCP server that provides AI assistants with semantic search access to any documentation. Uses RAG (Retrieval-Augmented Generation) with vector embeddings to find relevant content based on meaning, not just keywords.
Features
Semantic Search - Find relevant content by meaning, not just keyword matching
Recursive Chunking - Documents split by headers (H1 → H2 → H3) for precise retrieval
Low Token Usage - Returns ~500-1000 tokens per query instead of 15k+ full documents
Vector Embeddings - Uses OpenRouter (text-embedding-3-small) via Apify proxy
PostgreSQL + pgvector - Supabase for scalable vector storage
Architecture
Scrape → Parse HTML → Recursive Chunk → Generate Embeddings → Store in Supabase
↓
User Query → Embed Query → Vector Similarity Search → Return Relevant ChunksAvailable Tools
Tool | Description | Token Usage |
| List all docs with metadata (id, title, summary, sections) | ~200 |
| Semantic search across all docs | ~500-1000 |
| Get document summary and section structure | ~200 |
| Get content of a specific section | ~500-1000 |
| Paginated access to all chunks in a doc | ~500-1000 |
| Semantic search within a specific document | ~500-1000 |
Setup
1. Create Supabase Project
Go to supabase.com and create a project
Go to SQL Editor and run the schema below
Copy your Project URL and anon key from Settings → API
2. Supabase SQL Schema
Run this in your Supabase SQL Editor:
-- Enable pgvector extension
create extension if not exists vector;
-- Document metadata table
create table doc_metadata (
id text primary key,
title text not null,
url text not null,
summary text,
sections text[],
total_chunks integer,
type text,
created_at timestamp default now()
);
-- Chunks table with vector embeddings
create table doc_chunks (
id uuid primary key default gen_random_uuid(),
doc_id text references doc_metadata(id) on delete cascade,
doc_title text,
doc_url text,
section_path text[],
heading text,
content text not null,
token_count integer,
chunk_index integer,
embedding vector(1536),
created_at timestamp default now()
);
-- Function for similarity search
create or replace function search_chunks(
query_embedding vector(1536),
match_count int default 5,
filter_doc_id text default null
)
returns table (
id uuid,
doc_id text,
doc_title text,
section_path text[],
heading text,
content text,
similarity float
)
language plpgsql
as $$
begin
return query
select
dc.id,
dc.doc_id,
dc.doc_title,
dc.section_path,
dc.heading,
dc.content,
1 - (dc.embedding <=> query_embedding) as similarity
from doc_chunks dc
where (filter_doc_id is null or dc.doc_id = filter_doc_id)
order by dc.embedding <=> query_embedding
limit match_count;
end;
$$;
-- Optional: Add index for large datasets (1000+ chunks)
-- create index doc_chunks_embedding_idx
-- on doc_chunks using ivfflat (embedding vector_cosine_ops)
-- with (lists = 100);3. Configure Environment Variables
Set these in your Apify Actor or use Apify secrets:
# Add secrets (recommended)
apify secrets add supabaseKey "your-supabase-anon-key"In .actor/actor.json:
{
"environmentVariables": {
"SUPABASE_URL": "https://your-project.supabase.co",
"SUPABASE_KEY": "@supabaseKey"
}
}4. Configure Documentation Sources
Input | Description | Default |
Start URLs | Documentation pages to scrape | Apify SDK docs |
Max Pages | Maximum pages to scrape (1-1000) | 100 |
Force Refresh | Re-scrape even if data exists | false |
Example input:
{
"startUrls": [
{ "url": "https://docs.example.com/getting-started" },
{ "url": "https://docs.example.com/api-reference" }
],
"maxPages": 200,
"forceRefresh": false
}5. Deploy and Connect
# Push to Apify
apify push
# Add to Claude Code (get URL from Actor output)
claude mcp add api-docs https://<YOUR_ACTOR_URL>/mcp \
--transport http \
--header "Authorization: Bearer <YOUR_APIFY_TOKEN>"Usage Examples
Once connected, your AI assistant can:
"Search the docs for authentication best practices"
→ Returns relevant chunks from multiple documents
"Show me the overview of the API reference doc"
→ Returns summary and section list
"Get the 'Getting Started' section from doc-1"
→ Returns specific section content
"What documentation is available?"
→ Returns list of all docs with summariesAPI Endpoints
Endpoint | Method | Description |
| GET | Server status and setup instructions |
| POST | MCP protocol endpoint |
| POST | Re-scrape and update all documentation |
| GET | Get document and chunk statistics |
How Chunking Works
Documents are split recursively by headers:
Document (15k tokens)
├── H1: Introduction (chunk 1, ~600 tokens)
├── H2: Getting Started
│ ├── H3: Installation (chunk 2, ~400 tokens)
│ └── H3: Configuration (chunk 3, ~500 tokens)
├── H2: API Reference
│ ├── H3: Methods (chunk 4, ~700 tokens)
│ └── H3: Examples (chunk 5, ~600 tokens)
└── ...Target chunk size: 500-800 tokens
Max chunk size: 1000 tokens
Min chunk size: 100 tokens (smaller sections merged with parent)
Pricing
This Actor uses pay-per-event pricing through Apify. Costs include:
Scraping: Initial crawl of documentation
Embeddings: Generated via OpenRouter (charged to Apify account)
Tool calls: Each MCP tool invocation
Development
# Install dependencies
npm install
# Run locally
npm run start:dev
# Build
npm run build
# Push to Apify
apify pushLicense
ISC
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wuyuwenj/api-doc-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server