大多数人工智能代理对每种查询类型使用哪个工具进行硬编码。 MCP 通过让代理在运行时发现工具并根据上下文选择最佳工具来改变这一点。本教程构建一个连接到 Scavio 的 MCP 服务器的路由代理,发现 11 个搜索工具,并为每个查询动态选择最佳平台。不需要 if-else 路由逻辑:法学硕士根据工具描述做出路由决策。
前置条件
- 已安装 Node.js 18+
- @modelcontextprotocol/sdk包
- 来自 scavio.dev 的 Scavio API 密钥
- LLM 的 Anthropic 或 OpenAI API 密钥
操作指南
步骤 1: 安装MCP SDK
将 MCP 客户端 SDK 添加到您的项目。
npm install @modelcontextprotocol/sdk步骤 2: 连接到 MCP 服务器并发现工具
创建一个连接到 Scavio 的 MCP 服务器并列出所有可用工具的客户端。
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
const transport = new StreamableHTTPClientTransport(
new URL('https://mcp.scavio.dev/mcp'),
{ requestInit: { headers: { 'x-api-key': process.env.SCAVIO_API_KEY } } }
);
const client = new Client({ name: 'routing-agent', version: '1.0.0' });
await client.connect(transport);
const { tools } = await client.listTools();
console.log(`Discovered ${tools.length} tools:`);
tools.forEach(t => console.log(` - ${t.name}: ${t.description}`));步骤 3: 将 MCP 工具转换为 LLM 工具定义
将发现的 MCP 工具映射为 LLM 期望的工具调用格式。
function mcpToLlmTools(mcpTools) {
return mcpTools.map(t => ({
type: 'function',
function: {
name: t.name,
description: t.description,
parameters: t.inputSchema
}
}));
}
const llmTools = mcpToLlmTools(tools);步骤 4: 构建路由循环
使用工具列表将用户查询发送给法学硕士。 LLM选择工具;您的代码通过 MCP 执行它。
async function routingAgent(userQuery) {
const messages = [{ role: 'user', content: userQuery }];
const response = await llm.chat({
messages,
tools: llmTools,
tool_choice: 'auto'
});
if (response.tool_calls) {
for (const call of response.tool_calls) {
const result = await client.callTool({
name: call.function.name,
arguments: JSON.parse(call.function.arguments)
});
messages.push({ role: 'tool', content: JSON.stringify(result), tool_call_id: call.id });
}
const final = await llm.chat({ messages, tools: llmTools });
return final.content;
}
return response.content;
}Python 示例
# Python MCP client with routing:
import requests, os, json
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
# Simplified routing without full MCP SDK:
PLATFORM_MAP = {
'product': 'amazon', 'price': 'amazon', 'buy': 'walmart',
'video': 'youtube', 'tutorial': 'youtube', 'how to': 'youtube',
'reddit': 'reddit', 'community': 'reddit', 'opinion': 'reddit',
}
def route_search(query: str) -> str:
q_lower = query.lower()
platform = 'google'
for keyword, p in PLATFORM_MAP.items():
if keyword in q_lower:
platform = p
break
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': platform, 'query': query}, timeout=10)
return json.dumps({'platform': platform, 'results': resp.json().get('organic', [])[:3]}, indent=2)JavaScript 示例
// Full MCP routing example in the steps above.
// Simplified version without MCP SDK:
const PLATFORM_MAP = { product: 'amazon', video: 'youtube', reddit: 'reddit', opinion: 'reddit' };
async function routeSearch(query) {
let platform = 'google';
for (const [kw, p] of Object.entries(PLATFORM_MAP)) {
if (query.toLowerCase().includes(kw)) { platform = p; break; }
}
const resp = 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, query})
});
return {platform, results: (await resp.json()).organic?.slice(0, 3)};
}预期输出
An MCP routing agent that discovers search tools dynamically and lets the LLM select the optimal platform per query context.