mcp-server-fetch-rag
by attamari
README.md
# MCP Server Fetch RAG
A Model Context Protocol (MCP) server that fetches web content and returns relevant chunks using RAG (Retrieval-Augmented Generation).
GitHub: https://github.com/attamari/mcp-server-fetch-rag
## Features
- **Semantic Chunking**: Groups sentences into coherent chunks based on embedding similarity
- **Query-based Scoring**: Late Interaction with Power Mean aggregation for precise relevance scoring
- **LexRank Scoring**: Graph-based centrality scoring when no query is provided
- **LexRank Backfill**: Supplements query results with high-centrality chunks when needed
- **Percentile Filtering**: Dynamic threshold based on score distribution
- **Multilingual Support**: Uses `paraphrase-multilingual-MiniLM-L12-v2` (50+ languages)
- **PDF Support**: Extracts text from PDF documents
- **GPU Acceleration**: Auto-detects CUDA, DirectML, ROCm, OpenVINO providers
- **Context Efficient**: Filters out irrelevant content to reduce token usage
## Usage
### MCP Client Configuration
Add to your MCP client configuration (e.g. `claude_desktop_config.json`):
```json
{
"mcpServers": {
"fetch-rag": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/attamari/mcp-server-fetch-rag",
"mcp-server-fetch-rag"
]
}
}
}
```
With CLI options:
```json
{
"mcpServers": {
"fetch-rag": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/attamari/mcp-server-fetch-rag",
"mcp-server-fetch-rag",
"--ignore-robots-txt",
"--user-agent", "your-custom-user-agent"
]
}
}
}
```
### CLI Options
| Option | Description |
|---|---|
| `--user-agent` | Custom User-Agent string (overrides default MCP UA) |
| `--ignore-robots-txt` | Ignore robots.txt restrictions |
| `--proxy-url` | Proxy URL for HTTP requests |
### Tool: fetch_rag
Fetches a URL and returns relevant content chunks.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `url` | string | Yes | - | URL to fetch |
| `query` | string | No | null | Search query for relevance filtering |
| `max_chunks` | int | No | 10 | Maximum number of chunks to return |
## How It Works
1. **Fetch**: Downloads content from URL (HTML via trafilatura, PDF via pypdfium2)
2. **Split**: Segments text into sentences using wtpsplit (sat-3l-sm, 85+ languages)
3. **Embed**: Generates L2-normalized embeddings (paraphrase-multilingual-MiniLM-L12-v2 via FastEmbed/ONNX)
4. **Chunk**: Groups adjacent sentences by embedding similarity into semantic chunks
5. **Score**:
- With query: Late Interaction — sentence-level query similarity aggregated via Power Mean
- Without query: LexRank — sentence-level graph centrality aggregated via Power Mean
6. **Filter**: Applies percentile-based dynamic threshold (P30)
7. **Backfill**: When query scoring yields insufficient chunks, supplements with high-centrality LexRank chunks (P30 filtered)
8. **Return**: Top chunks sorted in original document order
## License
MIT License — See [LICENSE](LICENSE) for details.
TDQS
A3.6/5.0
Scored across 1 tool
Disambiguation5/5
With only one tool, there is no possibility of confusion between tools. The single tool 'fetch_rag' is distinct by default.
Naming Consistency5/5
The single tool name follows a clear verb_noun pattern ('fetch_rag'). Consistency is trivially achieved with only one name.
Tool Count3/5
The server contains only one tool, which falls into the borderline category for scope. While a single-purpose fetch/retrieve tool might be acceptable, it feels thin for a typical MCP server.
Completeness3/5
The tool covers a single operation: fetching a URL and optionally querying for specific information. There are potential gaps such as batch fetching or handling stateful RAG workflows, but for a basic use case it may suffice.
Maintenance
ActivityInactive
ResponsivenessNo issues