MCP (Protocolo de contexto de modelo) permite que los modelos de IA llamen a herramientas externas a través de una interfaz estandarizada. El servidor Scavio MCP en mcp.scavio.dev/mcp expone la búsqueda web, los análisis de TikTok y los datos de YouTube como herramientas MCP a las que cualquier cliente compatible puede recurrir. Este tutorial conecta el servidor Scavio MCP a LLM locales que se ejecutan en Ollama o llama.cpp, brindando a sus modelos locales las mismas capacidades de búsqueda que los agentes alojados en la nube. La configuración tarda menos de 5 minutos y cada llamada de herramienta cuesta $0,005.
Requisitos previos
- Ollama instalado y ejecutándose localmente
- Python 3.9+ instalado
- Una clave API de Scavio de scavio.dev
- Comprensión básica del protocolo de la herramienta MCP
Guia paso a paso
Paso 1: Cree el archivo de configuración de MCP
Escriba un archivo .mcp.json que apunte al servidor Scavio MCP. Este archivo indica a los clientes compatibles con MCP dónde encontrar las herramientas de búsqueda.
import json
mcp_config = {
'mcpServers': {
'scavio': {
'url': 'https://mcp.scavio.dev/mcp',
'headers': {
'Authorization': 'Bearer ${SCAVIO_API_KEY}'
}
}
}
}
with open('.mcp.json', 'w') as f:
json.dump(mcp_config, f, indent=2)
print('MCP config written to .mcp.json')
print('Available tools: web_search, tiktok_search, youtube_search')Paso 2: Pruebe la conexión MCP con una llamada directa
Antes de realizar la conexión a Ollama, pruebe que el servidor MCP responda correctamente realizando una solicitud HTTP directa a la herramienta de búsqueda.
import os, requests
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
# Direct test of the search endpoint
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': 'test search query', 'country_code': 'us', 'num_results': 3})
data = resp.json()
print(f'Status: {resp.status_code}')
print(f'Results: {len(data.get("organic_results", []))}')
for r in data.get('organic_results', [])[:3]:
print(f' {r["title"]}')Paso 3: Conecte las herramientas MCP a Ollama
Cree un contenedor de herramientas Ollama que traduzca las llamadas a la herramienta MCP en solicitudes de API de Scavio. Esto cierra la brecha entre el formato de herramienta de Ollama y MCP.
import ollama
def handle_mcp_tool(tool_name: str, args: dict) -> str:
"""Route MCP tool calls to the Scavio API."""
if tool_name == 'web_search':
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': args.get('query', ''), 'country_code': 'us', 'num_results': 5})
results = resp.json().get('organic_results', [])
return '\n'.join(f'{r["title"]}: {r.get("snippet", "")}' for r in results)
elif tool_name == 'tiktok_search':
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos',
headers={'Authorization': f'Bearer {SCAVIO_KEY}', 'Content-Type': 'application/json'},
json={'keyword': args.get('query', ''), 'count': 5, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
return '\n'.join(f'{v.get("desc", "")[:80]} ({v.get("stats", {}).get("playCount", 0)} plays)' for v in videos)
return 'Unknown tool'
tools = [
{'type': 'function', 'function': {'name': 'web_search', 'description': 'Search the web for current information',
'parameters': {'type': 'object', 'properties': {'query': {'type': 'string'}}, 'required': ['query']}}},
{'type': 'function', 'function': {'name': 'tiktok_search', 'description': 'Search TikTok videos',
'parameters': {'type': 'object', 'properties': {'query': {'type': 'string'}}, 'required': ['query']}}},
]
response = ollama.chat(model='llama3.1', messages=[{'role': 'user', 'content': 'What is trending on TikTok right now?'}], tools=tools)
if response.message.tool_calls:
for tc in response.message.tool_calls:
result = handle_mcp_tool(tc.function.name, tc.function.arguments)
print(f'Tool: {tc.function.name}')
print(result[:300])Ejemplo en Python
import os, requests, json
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
# Create MCP config
config = {'mcpServers': {'scavio': {
'url': 'https://mcp.scavio.dev/mcp',
'headers': {'Authorization': f'Bearer {SCAVIO_KEY}'}}}}
with open('.mcp.json', 'w') as f:
json.dump(config, f, indent=2)
# Test search via MCP
def mcp_search(query):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us', 'num_results': 5})
return resp.json().get('organic_results', [])
results = mcp_search('latest AI news')
print(f'MCP search returned {len(results)} results')
for r in results[:3]:
print(f' {r["title"]}')Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
const fs = require('fs');
// Create MCP config
const config = { mcpServers: { scavio: {
url: 'https://mcp.scavio.dev/mcp',
headers: { Authorization: `Bearer ${SCAVIO_KEY}` }
}}};
fs.writeFileSync('.mcp.json', JSON.stringify(config, null, 2));
// Test search
async function mcpSearch(query) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us', num_results: 5 })
});
const data = await resp.json();
return data.organic_results || [];
}
mcpSearch('latest AI news').then(r => {
console.log(`MCP search: ${r.length} results`);
r.slice(0, 3).forEach(x => console.log(` ${x.title}`));
});Salida esperada
MCP config written to .mcp.json
Available tools: web_search, tiktok_search, youtube_search
Status: 200
Results: 3
Latest AI News and Developments 2026
Top AI Frameworks Released This Year
AI Industry Update: May 2026
Tool: tiktok_search
Viral dance challenge takes over TikTok (2,345,678 plays)
New cooking hack everyone is trying (1,892,345 plays)