La búsqueda web genérica devuelve spam de blogs junto con la documentación oficial. Este tutorial construye un servidor MCP que restringe la búsqueda a dominios de documentación (docs.python.org, react.dev, desarrollador.mozilla.org), brindando a Claude Code y Cursor respuestas de documentación precisas y sin ruido.
Requisitos previos
- Node.js 18+ o Python 3.10+
- Una clave API de Scavio
- Conocimientos básicos del servidor MCP
Guia paso a paso
Paso 1: Diseñar la herramienta de búsqueda de documentos
Defina una herramienta que acepte un dominio de consulta y documentación, buscando solo ese dominio.
# Concept: Use Google's site: operator via Scavio to restrict results to docs domains
# Example queries:
# 'asyncio event loop site:docs.python.org'
# 'useEffect cleanup site:react.dev'
# 'Array.prototype.map site:developer.mozilla.org'
# Tool schema:
# name: docs_search
# params: { query: string, domain: string (optional, defaults to auto-detect) }
# returns: top 5 results from the specified docs domainPaso 2: Implementar con FastMCP (Python)
Cree el servidor MCP utilizando FastMCP para obtener un texto repetitivo mínimo.
from fastmcp import FastMCP
import requests, os
app = FastMCP('docs-search')
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
DOCS_DOMAINS = {
'python': 'docs.python.org',
'react': 'react.dev',
'mdn': 'developer.mozilla.org',
'node': 'nodejs.org/docs',
'typescript': 'www.typescriptlang.org/docs',
'rust': 'doc.rust-lang.org',
'go': 'pkg.go.dev',
}
@app.tool()
def docs_search(query: str, language: str = 'python') -> str:
"""Search official documentation for a programming language or framework."""
domain = DOCS_DOMAINS.get(language, language)
full_query = f'{query} site:{domain}'
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': full_query}, timeout=10)
results = resp.json().get('organic', [])[:5]
lines = []
for r in results:
lines.append(f"## {r.get('title', '')}")
lines.append(f"{r.get('snippet', '')}")
lines.append(f"URL: {r.get('link', '')}")
lines.append('')
return '\n'.join(lines) if lines else 'No documentation found.'
if __name__ == '__main__':
app.run()Paso 3: Agregar a la configuración de Claude Desktop
Configure Claude Desktop para utilizar su servidor MCP de búsqueda de documentos.
// Add to claude_desktop_config.json:
{
"mcpServers": {
"docs-search": {
"command": "python",
"args": ["/path/to/docs_search_server.py"]
}
}
}
// Or if using Scavio's hosted MCP directly (no custom server needed):
// Just use site: operator in your queries to Claude:
// 'Search for asyncio event loop on docs.python.org'Paso 4: Probar e iterar
Verifique que la búsqueda de documentos arroje resultados relevantes e itere en los dominios.
# Test queries:
# docs_search('asyncio gather', 'python') -> docs.python.org results
# docs_search('useEffect dependencies', 'react') -> react.dev results
# docs_search('fetch API', 'mdn') -> developer.mozilla.org results
# Add more domains as needed:
# DOCS_DOMAINS['django'] = 'docs.djangoproject.com'
# DOCS_DOMAINS['fastapi'] = 'fastapi.tiangolo.com'
# DOCS_DOMAINS['nextjs'] = 'nextjs.org/docs'Ejemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def docs_search(query, domain='docs.python.org'):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{query} site:{domain}'}).json()
return [{'title': x['title'], 'url': x.get('link',''), 'snippet': x.get('snippet','')}
for x in r.get('organic',[])[:5]]Ejemplo en JavaScript
async function docsSearch(query, domain = 'docs.python.org') {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: `${query} site:${domain}`})
});
return (await r.json()).organic?.slice(0,5).map(x => ({title: x.title, url: x.link, snippet: x.snippet}));
}Salida esperada
A custom MCP documentation search server that constrains results to official docs domains, giving Claude precise documentation access without web noise.