MCP 服务端与外部集成
MCP 服务器与外部集成
相关源文件
以下文件为本维基页面的生成提供了上下文:
backend/alembic/versions/0816326d83aa_add_federated_connector_tables.pybackend/ee/onyx/onyxbot/slack/handlers/handle_standard_answers.pybackend/ee/onyx/utils/encryption.pybackend/onyx/context/search/federated/models.pybackend/onyx/context/search/federated/slack_search.pybackend/onyx/context/search/federated/slack_search_utils.pybackend/onyx/db/federated.pybackend/onyx/db/rotate_encryption_key.pybackend/onyx/db/slack_channel_config.pybackend/onyx/federated_connectors/federated_retrieval.pybackend/onyx/federated_connectors/interfaces.pybackend/onyx/federated_connectors/slack/federated_connector.pybackend/onyx/onyxbot/slack/blocks.pybackend/onyx/onyxbot/slack/formatting.pybackend/onyx/onyxbot/slack/handlers/handle_buttons.pybackend/onyx/onyxbot/slack/handlers/handle_message.pybackend/onyx/onyxbot/slack/handlers/handle_regular_answer.pybackend/onyx/onyxbot/slack/listener.pybackend/onyx/onyxbot/slack/models.pybackend/onyx/onyxbot/slack/utils.pybackend/onyx/prompts/federated_search.pybackend/onyx/server/features/mcp/api.pybackend/onyx/server/features/mcp/models.pybackend/onyx/server/federated/api.pybackend/onyx/server/federated/models.pybackend/onyx/server/manage/slack_bot.pybackend/onyx/utils/encryption.pybackend/scripts/reencrypt_secrets.pybackend/tests/external_dependency_unit/db/test_rotate_encryption_key.pybackend/tests/external_dependency_unit/slack_bot/test_slack_bot_federated_search.pybackend/tests/integration/tests/mcp/test_mcp_client_no_auth_flow.pybackend/tests/unit/ee/onyx/utils/test_encryption.pybackend/tests/unit/federated_connector/test_reject_masked_credentials.pybackend/tests/unit/onyx/context/search/federated/test_build_thread_text.pybackend/tests/unit/onyx/context/search/federated/test_url_override.pybackend/tests/unit/onyx/onyxbot/test_slack_channel_config.pybackend/tests/unit/onyx/onyxbot/test_slack_formatting.pybackend/tests/unit/onyx/server/features/mcp/test_oauth_credentials_resolver.py- [web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigCreationForm.tsx](web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigCreationForm.tsx)
- [web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigFormFields.tsx](web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigFormFields.tsx)
- [web/src/app/admin/bots/[bot-id]/lib.ts](web/src/app/admin/bots/[bot-id]/lib.ts)
web/src/components/ui/accordion.tsxweb/src/lib/tools/mcpService.tsweb/src/lib/tools/openApiService.ts
Onyx 提供了一套集成层,用于将知识库扩展到 Web 应用程序之外。这包括一个用于大语言模型(LLM)原生工具访问的 模型上下文协议(MCP)服务器、一个用于在工作区频道内进行对话式检索增强生成(RAG)的全面 Slack 集成(OnyxBot),以及用于从外部平台实时检索数据的 联合搜索 功能。
MCP 服务器
Onyx MCP 服务器实现了模型上下文协议,允许外部大语言模型(LLM)客户端(例如 Claude Desktop)将 Onyx 作为知识源使用。它充当了 Onyx 后端与任何支持 MCP 标准的大语言模型(LLM)客户端之间的桥梁。
可用工具与资源
MCP 服务器将多个核心功能作为工具暴露出来,这些工具会被动态构建并提供给大语言模型(LLM)。在 Onyx 中,该服务器支持标准的工具发现功能,以及基于 OAuth 的外部 MCP 服务器认证 backend/onyx/server/features/mcp/api.py:81-82。
关键能力包括:
- 搜索已索引文档:对 Onyx 中索引的所有文档执行语义搜索。
- 网络搜索:利用 Onyx 的网络搜索能力,查找内部索引之外的信息。
- 打开 URL:获取并解析特定 URL 的内容,为大语言模型(LLM)提供直接上下文。
配置与认证
MCP 服务器通过环境变量进行控制,并使用标准的 Onyx 认证机制。管理员用户可以通过 API 配置 MCP 服务器,支持不同的认证执行者(用户或管理员)和认证类型(API 密钥、OAuth)backend/onyx/server/features/mcp/api.py:34-37。
- 认证:通过个人访问令牌(PAT)或 API 密钥进行处理。该服务器支持 OAuth 流程,包括回调处理和令牌存储
backend/onyx/server/features/mcp/api.py:17-21。 - 权限:对 MCP 配置和工具管理的访问权限仅限于管理员或审核员
backend/onyx/server/features/mcp/api.py:30。
来源: backend/onyx/server/features/mcp/api.py backend/onyx/server/features/mcp/models.py
OnyxBot Slack 集成
OnyxBot 是一个专门的 Slack 集成,允许用户直接从 Slack 查询其知识库。它支持多种响应模式,包括公共频道回复、临时(私有)回复和直接消息。
系统架构与数据流
Slack 集成作为后台进程运行,使用 SocketModeClient 监听来自 Slack API 的事件,无需公开的 Webhook URL backend/onyx/onyxbot/slack/utils.py:19。
关键组件:
SlackbotHandler:主要编排器,负责管理特定租户的 Socket 连接和令牌生命周期backend/onyx/onyxbot/slack/listener.py:136-146。它处理租户锁的获取,以确保跨多个 Pod 的高可用性backend/onyx/onyxbot/slack/listener.py:144。TenantSocketModeClient:一个专用客户端,用于维护特定租户和机器人实例与 Slack 的连接backend/onyx/onyxbot/slack/listener.py:88。handle_message:处理传入 Slack 事件的主要入口点,应用过滤器并确定是否需要响应backend/onyx/onyxbot/slack/handlers/handle_message.py:112-117。
消息处理管线
当收到消息时,OnyxBot 会执行以下流程:
- 事件确认:立即确认请求,通常会回复一个表情符号反应或一条“正在处理”的消息
backend/onyx/onyxbot/slack/handlers/handle_message.py:30-47。 - 过滤器校验:检查消息是否满足
ChannelConfig中定义的条件,例如respond_tag_only或respond_member_group_listbackend/onyx/onyxbot/slack/handlers/handle_message.py:157-175。 - 上下文构建:使用
read_slack_thread收集线程历史,为大语言模型(LLM)提供对话上下文backend/onyx/onyxbot/slack/handlers/handle_buttons.py:137-143。 - 检索增强生成(RAG)执行:调用
handle_regular_answer,该函数运行核心搜索管线和大语言模型(LLM)循环,基于索引文档生成答案backend/onyx/onyxbot/slack/handlers/handle_regular_answer.py:137-148。 - 响应格式化:将大语言模型(LLM)响应转换为 Slack 块,包括引用和交互式反馈按钮(赞/踩)
backend/onyx/onyxbot/slack/blocks.py:106-123。
Slack 机器人配置逻辑
下图说明了 Slack 配置如何从数据库映射到执行逻辑。
Slack 实体关系图
来源: backend/onyx/onyxbot/slack/listener.py backend/onyx/onyxbot/slack/handlers/handle_message.py backend/onyx/onyxbot/slack/handlers/handle_regular_answer.py backend/onyx/server/manage/slack_bot.py web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigFormFields.tsx
联合搜索
联合搜索允许 Onyx 在聊天会话期间实时查询外部系统,而不仅仅依赖预先索引的数据。这对于像 Slack 消息这样的高频数据特别有用。
实现:Slack 联合搜索
Slack 的联合检索系统利用 Slack 搜索 API,在公共和私有频道(在允许的情况下)中查找相关消息。
关键特性:
- 动态查询扩展:使用大语言模型(LLM)将用户的自然语言查询扩展为多个优化的 Slack 搜索词
backend/onyx/context/search/federated/slack_search_utils.py:22。 - 日期范围提取:从查询中启发式地提取时间范围(例如“今天”、“上周”),以过滤 Slack 结果
backend/onyx/context/search/federated/slack_search_utils.py:142-196。 - 元数据缓存:将频道元数据缓存到 Redis 中最多 24 小时,以减少 API 开销
backend/onyx/context/search/federated/slack_search.py:57-78。 - 线程上下文:可以获取已发现消息的完整线程上下文,以提供更好的检索增强生成(RAG)上下文
backend/onyx/context/search/federated/slack_search.py:16-17。
联合搜索的数据流
下图展示了使用 slack_search 实现从用户查询到外部结果的流程。
联合搜索执行流程
来源: backend/onyx/context/search/federated/slack_search.py backend/onyx/context/search/federated/slack_search_utils.py backend/onyx/onyxbot/slack/utils.py
配置摘要
| 环境变量 | 描述 | 默认值 |
|---|---|---|
MCP_SERVER_ENABLED | 启用模型上下文协议服务器 | False |
MCP_SERVER_PORT | MCP 服务器的端口 | 5001 |
NOTIFY_SLACKBOT_NO_ANSWER | 当机器人无法找到答案时是否通知 backend/onyx/onyxbot/slack/listener.py:35 | True |
ONYX_BOT_FEEDBACK_REMINDER | 在 Slack 中发送反馈提醒前等待的分钟数 backend/onyx/onyxbot/slack/handlers/handle_message.py:69 | None |
MAX_TENANTS_PER_POD | 单个 Slack 机器人监听器 Pod 处理的最大租户数 backend/onyx/onyxbot/slack/config.py:49 | 50 |
来源:
backend/onyx/onyxbot/slack/listener.pybackend/onyx/onyxbot/slack/config.pybackend/onyx/onyxbot/slack/handlers/handle_message.py