模型上下文协议 (MCP) 允许像 Claude 这样的人工智能助手通过标准化接口调用外部工具。虽然 Scavio 提供官方 MCP 服务器,但您可能希望将 Web 搜索添加为您自己的自定义 MCP 服务器中的众多工具之一。本教程介绍如何构建包装 Scavio API 的 MCP 服务器工具、将其注册到服务器的工具列表中以及处理来自任何 MCP 客户端的传入搜索请求。
前置条件
- Node.js 18 或更高版本
- npm 安装@modelcontextprotocol/sdk
- Scavio API 密钥
- 基本 TypeScript 知识
操作指南
步骤 1: 初始化MCP服务器
使用官方SDK创建一个新的MCP服务器。该服务器将向任何 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",
});步骤 2: 注册网络搜索工具
定义一个接受查询和可选平台参数的 web_search 工具。该处理程序调用 Scavio API 并返回格式化结果。
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 }] };
}
);步骤 3: 启动服务器
将服务器连接到 stdio 传输,以便 MCP 客户端可以与其通信。
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main();步骤 4: 在 Claude Desktop 中配置
将 Claude Desktop 指向您的自定义 MCP 服务器二进制文件,以便它可以使用 web_search 工具。
{
"mcpServers": {
"my-tools": {
"command": "npx",
"args": ["tsx", "server.ts"],
"env": {
"SCAVIO_API_KEY": "your_scavio_api_key"
}
}
}
}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)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);预期输出
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