S3 Documentation MCP Server
About
A lightweight Model Context Protocol (MCP) server that brings RAG (Retrieval-Augmented Generation) capabilities to your LLM over Markdown documentation stored on S3.
Details
- Author
- yoanbernabeu
- Categories
- Developer Tools, Knowledge Base, Other, AI
Jump to
Setup
Install S3 Documentation MCP Server in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/yoanbernabeu/S3-Documentation-MCP-Server
Follow the installation instructions in the repository README, then restart your MCP client.
A lightweight Model Context Protocol (MCP) server that brings RAG (Retrieval-Augmented Generation) capabilities to your LLM over Markdown documentation stored on S3.
A lightweightModel Context Protocol (MCP)server that brings RAG (Retrieval-Augmented Generation) capabilities to your LLM over Markdown documentation stored on S3.
- 🪶Lightweight Stack: No heavy dependencies or cloud services
- 🏠Flexible Embeddings: Choose betweenOllama(local, free) orOpenAI(cloud, high-accuracy)
- 💾File-based Storage: Vector indices stored as simple files (HNSWLib)
- 🔌S3-Compatible: Works with any S3-compatible storage (AWS, MinIO, Scaleway, Cloudflare R2...)
[!IMPORTANT]
🚧 This project is a work in progress. APIs and behavior may change at any time, and backward compatibility is not ensured. Not suitable for production.
- Embedding Provider(choose one):
- Ollama(recommended for local/offline use) with thenomic-embed-textmodel
- OpenAI API Key(for cloud-based embeddings)
- 📚 Product Documentation: Let Claude/Cursor/etc answer from your docs
- 🏢 Internal Wiki: AI-powered company knowledge search
- 📖 API Docs: Help developers find API information
- 🎓 Educational Content: Build AI tutors with course materials
# 1. Prerequisites # Install Ollama from https://ollama.ai ollama pull nomic-embed-text # 2. Configure cp env.example .env # Add your S3 credentials # 3. Run docker run -d \ --name s3-doc-mcp \ -p 3000:3000 \ --env-file .env \ -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \ -v $(pwd)/data:/app/data \ yoanbernabeu/s3-doc-mcp:latest
# 1. Prerequisites # Install Ollama from https://ollama.ai ollama pull nomic-embed-text # 2. Install & Run npm install cp env.example .env # Configure your S3 credentials npm run build && npm start # 3. For local development npm run dev
Your MCP server is now running onhttp://localhost:3000
Once your server is running, you need to configure your MCP client to connect to it.
Edit your~/.cursor/mcp.jsonfile and add:
{ "mcpServers": { "doc": { "type": "streamable-http", "url": "http://127.0.0.1:3000/mcp", "note": "S3 Documentation RAG Server" } } }
Edit your Claude Desktop configuration file:
- macOS:~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:%APPDATA%/Claude/claude_desktop_config.json
{ "mcpServers": { "doc": { "type": "streamable-http", "url": "http://127.0.0.1:3000/mcp", "note": "S3 Documentation RAG Server" } } }
Restart your MCP client, and you should now see:
- 3 MCP Tools:search_documentation,refresh_index,get_full_document
- MCP Resources: Full list of indexed documentation files with direct access
💡Tip: If using Docker, make sure the port mapping matches your configuration (default is3000:3000)
- 🔌Universal S3: AWS S3, MinIO, Scaleway, DigitalOcean Spaces, Cloudflare R2, Wasabi...
- 🧠Flexible Embeddings:
- Splits documents into chunks (1000 characters by default)
- Generates embeddings using your chosen provider:
- Tools:search_documentation,refresh_index,get_full_documentfor semantic search and actions
- Resources:resources/list,resources/readfor file discovery and direct access
HNSWLib(Hierarchical Navigable Small World) is a lightweight, in-memory vector search library that's perfect for this use case:
- ⚡Fast: Approximate nearest neighbor search in milliseconds
- 💾Simple: Stores indices as local files (no database needed)
- 🪶Efficient: Low memory footprint, ideal for personal/small-team documentation
- 🎯Accurate: High recall with cosine similarity for semantic search
It's the sweet spot between simplicity and performance for RAG applications.
Copyenv.exampleto.envand configure your environment variables:
# S3 Configuration S3_BUCKET_NAME=your-bucket-name # Your S3 bucket name S3_ACCESS_KEY_ID=your-access-key # S3 access key S3_SECRET_ACCESS_KEY=your-secret-key # S3 secret key S3_REGION=us-east-1 # S3 region S3_ENDPOINT= # Optional: for non-AWS S3 (MinIO, Scaleway, etc.) # Embeddings Provider (choose one) EMBEDDING_PROVIDER=ollama # ollama (default) or openai # Option 1: Ollama (Local) OLLAMA_BASE_URL=http://localhost:11434 # Ollama API endpoint OLLAMA_EMBEDDING_MODEL=nomic-embed-text # Ollama embedding model # Option 2: OpenAI (Cloud) - Only if EMBEDDING_PROVIDER=openai OPENAI_API_KEY= # Your OpenAI API key OPENAI_EMBEDDING_MODEL=text-embedding-3-small # or text-embedding-3-large
The server supports two embedding providers:
- ✅Free: No API costs, unlimited usage
- ✅Private: All data stays on your machine
- ✅Offline: Works without internet connection
- ✅Fast: Direct local API calls
- ⚠️ Requires Ollama installation and model download
- ⚠️ Uses local CPU/GPU resources
# Install Ollama from https://ollama.ai ollama pull nomic-embed-text # Configure EMBEDDING_PROVIDER=ollama OLLAMA_BASE_URL=http://localhost:11434 OLLAMA_EMBEDDING_MODEL=nomic-embed-text
- ✅High Accuracy: State-of-the-art embeddings
- ✅Multilingual: Excellent support for 20+ languages
- ✅No Local Resources: Runs entirely in the cloud
- ✅Lower Latency: Fast API responses
- ⚠️ Requires API key and credits
- ⚠️ Data sent to OpenAI servers
- ⚠️ Cost per token (very affordable: ~$0.00002/1K tokens fortext-embedding-3-small)
# Get an API key from https://platform.openai.com/api-keys # Configure EMBEDDING_PROVIDER=openai OPENAI_API_KEY=sk-...your-key... OPENAI_EMBEDDING_MODEL=text-embedding-3-small # or text-embedding-3-large
💡Tip: Start withtext-embedding-3-smallfor most use cases. Only switch totext-embedding-3-largeif you need the absolute best accuracy or work extensively with non-English content.
If you setEMBEDDING_PROVIDER=openaibut don't provide a validOPENAI_API_KEY, the server will automatically fall back to Ollama (if configured). This ensures the server can always start, even with incomplete configuration.
The server supports three synchronization modes viaSYNC_MODE:
-
startup(default): Syncs at server startup
- ✅Auto-detection: If the vector store is empty, automatically performs a full sync
- ✅ Otherwise, performs an incremental sync (only changed files)
- ✅ No manualrefresh_indexneeded after restart!
periodic: Syncs at regular intervals (SYNC_INTERVAL_MINUTES)
- You must callrefresh_indextool manually
💡Note: The server automatically detects when the vector store is empty (e.g., after deleting./data/folder or first run) and triggers a full synchronization. You no longer need to manually runrefresh_indexafter every restart!
By default, the server runs inopen access modefor easy local development. For shared or remote deployments, you can enable API key authentication:
# Enable authentication ENABLE_AUTH=true # Set your API key MCP_API_KEY=your-secret-key-here
- ✅ All endpoints (except/health) require a valid API key
- ✅ API key can be provided via:
- Authorization header(recommended):Authorization: Bearer your-secret-key
- Query parameter:?api_key=your-secret-key
# With Authorization header (recommended) curl -H "Authorization: Bearer your-secret-key" http://localhost:3000/mcp # With query parameter curl "http://localhost:3000/mcp?api_key=your-secret-key"
{ "mcpServers": { "doc": { "type": "streamable-http", "url": "http://127.0.0.1:3000/mcp", "headers": { "Authorization": "Bearer your-secret-key" }, "note": "S3 Documentation RAG Server with authentication" } } }
- Keep authenticationdisabledfor local development
- Enableit for shared networks or remote deployments
- Use strong, randomly generated keys (e.g.,openssl rand -hex 32)
- The/healthendpoint is always accessible without authentication for monitoring
{ "query": "How to configure S3?", "max_results": 4 }
Returns relevant document chunks with similarity scores and sources.
{ "force": false // default: incremental sync (recommended) }
Synchronizes the documentation index with S3, detecting new, modified, or deleted files.
- force(boolean, optional, default:false)
- false:Incremental sync- Only processes changes (fast, efficient) ✅
- true:Full reindex- Reprocesses ALL files (slow, expensive) ⚠️
⚠️ Important:Theforceparameter shouldONLYbe set totruewhen explicitly needed (e.g., "force reindex", "rebuild everything from scratch"). Full reindex is expensive:
- Re-downloads all files from S3
- Regenerates all embeddings
- Rebuilds the entire vector store
For normal operations, always use incremental sync (default behavior).
{ "s3_key": "docs/authentification_magique_symfony.md" }
Retrieves the complete content of a Markdown file from S3 along with metadata:
- Full S3 key: The document's S3 identifier
- Complete Markdown content: Entire document (not chunked)
- Metadata: Size in bytes, last modification date, ETag, chunk count (if indexed)
- View the complete document after finding it viasearch_documentation
- Export documentation for external use
- Understand the full context around a search result
- Display complete documents in third-party integrations
- If a document appears in search results butget_full_documentreturns "not found", it means the file was deleted from S3 after being indexed
- Solution: Runrefresh_indexto synchronize the index with the current S3 state
- The tool will provide a helpful error message indicating when a sync is needed
In addition to the 3 tools, the server implementsMCP Resourcesfor file discovery and direct access:
- resources/list: Lists all indexed Markdown files with metadata (name, URI, size, chunks, last modified)
- resources/read: Reads the full content of a specific file by its URI (e.g.,s3doc://docs/authentication.md)
Use case:When users ask "What files do you have?" or "Show me file X", the LLM can browse and access files directly without semantic search.
Contributions are welcome! Please read ourContributing Guidefor details on how to submit pull requests, report issues, and contribute to the project.
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
Integrates LLM applications with documentation sources using the Model Context Protocol.
Manage user feedback, roadmap, changelog and user surveys all from your favorite LLM
Share your team's Coding Best Practices with Cursor, VS Code, Claude code, Windsurf, JetBrains IDEs and other coding tools supporting remote MCP connection.
Lance is an agent that runs on its own cloud Mac and handles everything on the App Store Connect side of shipping an iOS app. It connects to coding agents like Claude Code and Codex through MCP and takes over the parts they can't do: creating apps on App Store Connect, setting up notifications / widgets, filling out listing metadata, uploading builds to TestFlight, submitting for review, and responding to App Review feedback. Because it has its own Mac, it can also build, run, and test users' apps and capture screenshots.
An intelligent server for code analysis, collection, and documentation generation using the OpenAI API.
AI-powered semantic search over React documentation for Claude, Cursor, and other MCP clients.
AI-native static site generator with built-in MCP server. Build sites, create content, apply themes, search docs, and deploy via Claude Code or any MCP client.
A universal MCP server that connects to any Storybook site and extracts documentation in real-time using Playwright. Use it with any AI or client that supports MCP (Model Context Protocol)—Cursor, Claude Desktop, Windsurf, or other MCP hosts.
Exposes WebPinch tasks, projects, site audits, and stats as MCP tools/resources/prompts for Claude Code, Cursor, and other MCP clients.
Access WordPress documentation and development tools.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





