Le Model Context Protocol (MCP) permet à des assistants IA comme Claude d'invoquer des outils externes via une interface standardisée. Bien que Scavio fournisse un serveur MCP officiel, vous souhaiterez peut-être ajouter la recherche web comme l'un des nombreux outils de votre propre serveur MCP personnalisé. Ce tutoriel montre comment construire un outil de serveur MCP qui enveloppe l'API Scavio, l'enregistrer dans la liste des outils de votre serveur et gérer les requêtes de recherche entrantes depuis n'importe quel client MCP.
Prérequis
- Node.js 18 ou supérieur
- npm install @modelcontextprotocol/sdk
- Une clé API Scavio
- Connaissances de base en TypeScript
Parcours
Étape 1: Initialiser le serveur MCP
Créez un nouveau serveur MCP en utilisant le SDK officiel. Ce serveur exposera vos outils personnalisés à tout client MCP.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "my-tools",
version: "1.0.0",
});Étape 2: Enregistrer l'outil de recherche web
Définissez un outil web_search qui accepte une requête et un paramètre de plateforme optionnel. Le gestionnaire appelle l'API Scavio et renvoie des résultats formatés.
const SCAVIO_KEY = process.env.SCAVIO_API_KEY!;
server.tool(
"web_search",
"Search the web for current information. Returns top results with titles, snippets, and URLs.",
{
query: z.string().describe("The search query"),
platform: z.enum(["google", "youtube", "amazon", "walmart", "reddit"]).default("google").describe("Search platform"),
},
async ({ query, platform }) => {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": SCAVIO_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform, query, country_code: "us" }),
});
const data = await res.json();
const results = data.organic_results || data.products || data.videos || [];
const text = results.slice(0, 5).map((r: any, i: number) =>
`[${i + 1}] ${r.title || r.name}\n${r.snippet || r.description || ""}\n${r.link || r.url || ""}`
).join("\n\n");
return { content: [{ type: "text", text }] };
}
);Étape 3: Démarrer le serveur
Connectez le serveur au transport stdio afin que les clients MCP puissent communiquer avec lui.
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main();Étape 4: Configurer dans Claude Desktop
Indiquez à Claude Desktop le binaire de votre serveur MCP personnalisé pour qu'il puisse utiliser l'outil web_search.
{
"mcpServers": {
"my-tools": {
"command": "npx",
"args": ["tsx", "server.ts"],
"env": {
"SCAVIO_API_KEY": "your_scavio_api_key"
}
}
}
}Exemple Python
# Python MCP server with Scavio web search tool
import os
import json
import sys
import requests
SCAVIO_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
def handle_search(query: str, platform: str = "google") -> str:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_KEY},
json={"platform": platform, "query": query, "country_code": "us"}
)
r.raise_for_status()
data = r.json()
results = data.get("organic_results", data.get("products", []))[:5]
return "\n\n".join(
f"[{i+1}] {r.get('title', '')}\n{r.get('snippet', '')}\n{r.get('link', '')}"
for i, r in enumerate(results)
)
# This is a simplified example. Use the mcp Python SDK for production.
if __name__ == "__main__":
result = handle_search("latest AI news 2026")
print(result)Exemple JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "my-tools", version: "1.0.0" });
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
server.tool(
"web_search",
"Search the web for current information",
{ query: z.string(), platform: z.enum(["google", "youtube", "amazon", "walmart", "reddit"]).default("google") },
async ({ query, platform }) => {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": SCAVIO_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform, query, country_code: "us" }),
});
const data = await res.json();
const results = (data.organic_results || data.products || []).slice(0, 5);
const text = results.map((r, i) => `[${i+1}] ${r.title}\n${r.snippet || ""}\n${r.link || ""}`).join("\n\n");
return { content: [{ type: "text", text }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);Sortie attendue
MCP server started on stdio
Tool: web_search
Input: {"query": "latest AI news", "platform": "google"}
[1] OpenAI Launches New Agent Platform
OpenAI announced a comprehensive agent building platform...
https://example.com/openai-agents
[2] Anthropic Claude 4 Release Details
Anthropic released Claude 4 with expanded context...
https://example.com/claude-4