MCP
MCP(模型上下文协议)是一个将 AI 智能体连接到外部服务的开放标准。无需为你智能体需要的每个 Linear、Notion 或 GitHub 操作编写工具,只需连接到 MCP 服务器,你的智能体就能远程访问其工具。
本指南涵盖如何使用 useMcpConnection() 连接到服务器、管理认证和配置连接。
连接到 MCP 服务器
通过在你的智能体内调用 useMcpConnection() 来连接到 MCP 服务器:
'use agent';
import { useMcpConnection, useModel } from '@flue/runtime';
export function ProjectAssistant() {
useModel('anthropic/claude-sonnet-4-6');
useMcpConnection({
name: 'linear',
url: 'https://mcp.linear.app/mcp',
auth: process.env.LINEAR_API_KEY,
});
return '为团队管理 Linear 问题和项目。';
}当智能体运行时,Flue 连接到服务器,发现其工具,并将它们添加到智能体的工具集中。工具命名为 mcp__<server>__<tool>(此处为 mcp__linear__create_issue)以避免与你自己的工具冲突,模型像调用其他任何工具一样调用它们。
连接的行为方式:
- 当智能体开始处理消息时 Flue 进行连接,并在实例存活期间复用连接。你无需自己打开或关闭连接。
- 如果服务器无法访问,运行会以错误失败,下一条消息会重试。在定义上设置
optional: true可以在没有该服务器工具的情况下运行;模型会被告知它们不可用。 - 声明可以是有条件的,就像工具挂载一样:智能体可以基于其状态获得或失去一个服务器,模型会被告知这个变化。
参见 useMcpConnection 参考 了解行为的更多详情。
向 MCP 服务器认证
许多托管的 MCP 服务器期望一个 Bearer 令牌,遵循 MCP 授权模型(标准 OAuth 2.1)。使用 auth 属性来提供它。
提供授权最简单的方式是通过字符串值。对于静态授权使用这种方式,比如服务范围的 API 令牌:
'use agent';
import { useMcpConnection, useModel } from '@flue/runtime';
export function ProjectAssistant() {
useModel('anthropic/claude-sonnet-4-6');
useMcpConnection({
name: 'linear',
url: 'https://mcp.linear.app/mcp',
auth: process.env.LINEAR_API_KEY,
});
return '为团队管理 Linear 问题和项目。';
}一些 MCP 服务器期望动态的每用户或每会话授权令牌。当你需要动态授权时,可以向 auth 传递一个函数而非字符串。该函数在每次请求时解析,因此令牌可以轮换和撤销,让你拥有完全控制:
export function Assistant() {
const { userId } = useInitialData<{ userId: string }>();
useMcpConnection({
name: 'linear',
url: 'https://mcp.linear.app/mcp',
auth: () => tokenStore.get(userId, 'linear'),
});
return '帮助此用户管理他们的 Linear 问题。';
}
Flue 永远不会存储或管理你的令牌。你有责任自行处理 OAuth 流程、令牌存储和刷新令牌逻辑。
要在用户在对话中途授权后附加服务器,请基于持久标志有条件地声明连接:
const [linearReady, setLinearReady] = usePersistentState('linear-ready', false);
if (linearReady) {
useMcpConnection({
name: 'linear',
url: LINEAR_MCP_URL,
auth: () => tokenStore.get(userId, 'linear'),
});
}
useAgentStart(async () => {
if (!linearReady && (await tokenStore.has(userId, 'linear'))) setLinearReady(true);
});
当你的 OAuth 流程完成并且标志翻转时,智能体从下一条消息开始拥有服务器的工具。如果多个智能体需要共享一个用户的授权,请将集成放在你的应用中:一个应用拥有的集成服务本身可以是一个 MCP 服务器,智能体连接到它。
指定工具
服务器通常暴露数十个工具,每个挂载的工具都会占用模型上下文。tools 允许列表只挂载你列出的工具:
useMcpConnection({
name: 'linear',
url: 'https://mcp.linear.app/mcp',
auth: process.env.LINEAR_API_KEY,
tools: ['create_issue', 'search_issues', 'get_issue'],
});
如果允许列表命名了一个服务器未暴露的工具,连接会以错误失败。
复用 MCP 服务器定义
defineMcpConnection(...) 验证一个 MCP 连接对象,这样你可以定义一次然后从任何智能体中复用它:
import { defineMcpConnection } from '@flue/runtime';
export const linear = defineMcpConnection({
name: 'linear',
url: 'https://mcp.linear.app/mcp',
auth: process.env.LINEAR_API_KEY,
});import { linear } from '../connections/linear.ts';
useMcpConnection(linear);
useMcpConnection({ ...linear, tools: ['search_issues'] }); // 每次挂载覆盖字段
安全性
你连接的 MCP 服务器可以影响你的智能体:它的工具描述进入提示,它的工具结果进入对话。将你不控制的服务器视为任何其他第三方依赖,并考虑使用 tools 允许列表来限制你的暴露面。
高级:直接建立 MCP 服务器连接
createMcpConnection(definition) 是 hook 底层的更低级函数。它连接、发现服务器的工具,并将它们作为 ToolDefinition 值返回,这样受信任的应用代码可以在用 useTool 挂载之前过滤或包装它们:
const linear = await createMcpConnection({ name: 'linear', url: LINEAR_MCP_URL, auth: TOKEN });
export function ProjectAssistant() {
useModel('anthropic/claude-sonnet-4-6');
for (const tool of linear.tools) useTool(tool);
return '为团队管理 Linear 问题和项目。';
}
每个适配的定义保留服务器的 MCP annotations,这样受信任的应用代码可以在挂载或包装之前检查 tool.annotations?.readOnlyHint、destructiveHint、idempotentHint 和 openWorldHint——例如,要求对破坏性调用进行人工审批(参见审批门)。这些是服务器提供的提示,而非安全边界;仅在你信任服务器时才将它们用于审批决策。
如果你曾经直接使用 Node.js JavaScript API,这在 Node.js 脚本中也会很有用——参见独立脚本。
后续步骤
- 工具 ——工具在 Flue 中如何工作,包括守卫和条件挂载。
useMcpConnection参考 ——hook 的渲染契约和语义。McpConnectionDefinition和createMcpConnection——定义字段和适配契约。