Cree un servidor MCP de extracción web envolviendo los puntos finales de búsqueda y extracción de Scavio como herramientas MCP a las que cualquier cliente de IA compatible pueda llamar. Esto brinda a los agentes la capacidad de encontrar páginas relevantes y extraer contenido estructurado de ellas en un único flujo de trabajo. La herramienta de búsqueda descubre URL a través de consultas de Google, Reddit o YouTube, y la herramienta de extracción extrae texto limpio y metadatos de cualquier URL. Este tutorial crea ambas herramientas como un único servidor MCP utilizando el SDK de MCP.
Requisitos previos
- Node.js 18+ instalado
- Una clave API de Scavio de scavio.dev
- Comprensión básica del protocolo MCP
- administrador de paquetes npm o bun
Guia paso a paso
Paso 1: Armado del servidor MCP
Configure un proyecto de servidor MCP mínimo utilizando el SDK de MCP que registra dos herramientas: búsqueda y extracción.
// package.json:
// { "dependencies": { "@modelcontextprotocol/sdk": "latest" } }
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const API_KEY = process.env.SCAVIO_API_KEY;
const server = new McpServer({ name: 'web-extraction', version: '1.0.0' });Paso 2: Añadir la herramienta de búsqueda
Registre una herramienta de búsqueda que consulte a Scavio y devuelva resultados estructurados que el agente puede utilizar para decidir qué páginas extraer.
server.tool('search', 'Search Google, Reddit, YouTube, Amazon, or Walmart',
{ query: z.string(), platform: z.string().default('google') },
async ({ query, platform }) => {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform, query }),
});
const data = await resp.json();
return { content: [{ type: 'text', text: JSON.stringify(data.organic_results?.slice(0, 5) || [], null, 2) }] };
}
);Paso 3: Agregar la herramienta de extracción
Registre una herramienta de extracción que tome una URL y devuelva el contenido de texto limpio de la página a través del punto final de extracción de Scavio.
server.tool('extract', 'Extract clean text content from a URL',
{ url: z.string().url() },
async ({ url }) => {
const resp = await fetch('https://api.scavio.dev/api/v1/extract', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ url }),
});
const data = await resp.json();
return { content: [{ type: 'text', text: data.text || data.content || JSON.stringify(data) }] };
}
);Paso 4: Inicie el servidor y configure Claude
Conecte el servidor mediante transporte stdio y agréguelo a su configuración Claude Desktop o Claude Code MCP.
// Start the server:
const transport = new StdioServerTransport();
await server.connect(transport);
// In .mcp.json:
// {
// "mcpServers": {
// "web-extraction": {
// "command": "node",
// "args": ["server.js"],
// "env": { "SCAVIO_API_KEY": "your_key" }
// }
// }
// }
//
// Now Claude can: search for pages, then extract content from the best results.Ejemplo en Python
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def search(query, platform='google'):
return requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': platform, 'query': query}).json().get('organic_results', [])
def extract(url):
return requests.post('https://api.scavio.dev/api/v1/extract', headers=H,
json={'url': url}).json()
results = search('best crm 2026')
if results:
content = extract(results[0]['link'])
print(content.get('text', '')[:500])Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function search(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query})
});
return (await r.json()).organic_results || [];
}
async function extract(url) {
const r = await fetch('https://api.scavio.dev/api/v1/extract', {
method: 'POST', headers: H, body: JSON.stringify({url})
});
return r.json();
}
const results = await search('best crm 2026');
if (results[0]) console.log((await extract(results[0].link)).text?.slice(0, 500));Salida esperada
An MCP server exposing search and extract tools that AI agents can call to discover URLs and extract their content in a single workflow.