MCP 集成是 capability 机制的典型应用:官方 MCP Client 小工具提供 mcp.client,其他小工具消费它。
什么时候选 MCP
- 工具集很大(10+)且多数不常同时使用,希望 Finch 按需加载。
- 目标服务已有官方 MCP SDK,不想重写一遍。
两层设计
静态层(finch.json)只放元数据,绝不放密钥:
{
"requires": { "capabilities": ["mcp.client"] },
"contributes": {
"mcpServers": [
{ "name": "my-server", "description": "My MCP server." }
]
}
}
运行时层在 activate() 里提供真正的传输配置:
async function registerWhenReady(ctx: finch.MiniToolContext, apiKey: string) {
// MCP Client 可能晚于本工具激活,短轮询等待
for (let i = 0; i < 20; i++) {
if (ctx.capabilities.has('mcp.client')) break;
await new Promise((r) => setTimeout(r, 250));
}
if (!ctx.capabilities.has('mcp.client')) return;
const mcp = ctx.capabilities.get('mcp.client');
await mcp.registerServer({
name: 'my-server',
command: 'npx',
args: ['-y', 'my-mcp-server'],
env: { API_KEY: apiKey },
ownerExtensionId: ctx.minitool.id,
});
}
运行时注册是内存态的,每次激活都要重新执行。
密钥怎么来
标准做法:提供一个 setup_* 工具或设置菜单项,用表单收集密钥 → 存 ctx.secrets → 调用 registerServer()。详见《账号、配置与 OAuth 登录》。