多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

在 OmO 中新增 arXiv 内置远程 MCP:基于 PR 描述与源码模式的内置 MCP 扩展实战指南

在 OmO 中新增 arXiv 内置远程 MCP:基于 PR 描述与源码模式的内置 MCP 扩展实战指南 在 OmO 中新增 arXiv 内置远程 MCP基于 PR 描述与源码模式的内置 MCP 扩展实战指南【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent本篇文章以 oh-my-openagentOmO仓库中一份 PR 描述文档pr-description.md为核心骨架围绕为 OmO 添加arxiv作为第 4 个内置远程 MCP用于 arXiv 论文搜索这一真实变更提案展开。读完本文你将掌握 OmO 内置 MCP 的注册机制createBuiltinMcps、静态远程 MCP 的配置模式grep-app模式、McpNameSchema的枚举校验约束以及通过disabled_mcps配置或enabled标志禁用某个 MCP 的两种完整做法具备在 OmO 代码库中自行扩展内置 MCP 的完整实战能力。一、背景OmO 的内置 MCP 体系MCPModel Context Protocol是 OmO 连接外部工具与数据源的统一通道。在packages/omo-opencode包中所有内置 MCP 都由src/mcp/index.ts中的createBuiltinMcps()统一注册。截至当前仓库代码OmO 共内置 4 个 MCPMCP 名称类型端点认证要求websearchremoteExa / TavilyExa 可选 API KeyTavily 必须 API Keycontext7remotehttps://mcp.context7.com/mcp可选CONTEXT7_API_KEYgrep_appremotehttps://mcp.grep.app无静态导出lsplocal本地进程无需认证createBuiltinMcps()的实现位于 packages/omo-opencode/src/mcp/index.ts其核心逻辑是按名称逐一判断是否在disabledMcps列表中若未被禁用则把对应配置对象写入返回的mcps记录export function createBuiltinMcps(disabledMcps: string[] [], config?: BuiltinMcpSourceConfig, options: BuiltinMcpOptions {}) { const mcps: Recordstring, BuiltinMcpConfig {} if (!disabledMcps.includes(websearch)) { /* ... */ } if (!disabledMcps.includes(context7)) { mcps.context7 context7 } if (!disabledMcps.includes(grep_app)) { mcps.grep_app grep_app } if (!disabledMcps.includes(lsp)) { /* ... */ } return mcps }PR 描述的目标就是在这 4 个内置 MCP 的基础上新增第 4 个远程 MCP ——arxiv专用于 arXiv 论文搜索。二、PR 核心变更一览根据 PR 描述文档pr-description.md本次变更围绕以下 5 个文件展开文件变更内容src/mcp/arxiv.ts新增远程 MCP 配置指向 arXiv MCP 端点src/mcp/types.ts在McpNameSchema枚举中加入arxivsrc/mcp/index.tsimport 并在createBuiltinMcps()中注册 arxivsrc/mcp/index.test.ts更新数量断言3 → 4新增 arxiv 禁用测试src/mcp/AGENTS.md更新文档反映 4 个内置 MCP 的事实PR 的三个核心要点是遵循grep-app.ts模式静态导出、无需认证——因为 arXiv API 是公开的完全集成disabled_mcps配置用户可像禁用其他 MCP 一样禁用 arxiv通过McpNameSchema校验arxiv成为合法的 MCP 名称可被配置 schema 识别。下文将逐一拆解这三点在现有源码中的落点。三、跟随 grep-app 模式静态远程 MCP 的配置结构PR 明确要求arxivFollows thegrep-app.tspattern。所谓 grep-app 模式指的是 packages/omo-opencode/src/mcp/grep-app.ts 中这份极简的静态导出写法export const grep_app { type: remote as const, url: https://mcp.grep.app, enabled: true, oauth: false as const, }它对应createBuiltinMcps中定义的RemoteMcpConfig类型见 packages/omo-opencode/src/mcp/index.tstype RemoteMcpConfig { type: remote url: string enabled: boolean headers?: Recordstring, string oauth?: false }这份配置只有 4 个字段含义如下字段类型说明typeremote声明该 MCP 是远程 HTTP 端点而非本地进程urlstringMCP 服务器的 HTTP 端点地址enabledboolean默认是否启用oauthfalse不使用 OAuth 流程oauth?: false是可选的grep_app之所以能静态导出、零认证是因为它指向的公共 MCP 端点无需鉴权。arXiv 同理——其 API 是公开的论文搜索端点不需要 API Key因此 PR 中src/mcp/arxiv.ts的预期实现与grep-app.ts同构只是把url换成 arXiv 的 MCP 端点。对比之下带认证的远程 MCP 写法并不相同。例如 packages/omo-opencode/src/mcp/websearch.ts 会在 provider 为tavily时读取TAVILY_API_KEY环境变量缺失则直接跳过注册并打印日志packages/omo-opencode/src/mcp/context7.ts 则会读取可选的CONTEXT7_API_KEY并通过normalizeContext7ApiKey过滤占位值。arxiv属于无 Key 静态导出这一类是这三者中集成成本最低的形态。四、注册与校验createBuiltinMcps 与 McpNameSchema新增 MCP 并非只写一个配置文件那么简单还必须在两个位置打通4.1 注册入口createBuiltinMcps()PR 要求在 packages/omo-opencode/src/mcp/index.ts 中 import arxiv 并注册。参照现有grep_app的写法新增分支应当与disabledMcps.includes(arxiv)联动if (!disabledMcps.includes(arxiv)) { mcps.arxiv arxiv }这个disabledMcps.includes(...)判断是整套禁用机制的核心任何一个内置 MCP 的启用与否完全由传入的禁用名单决定。4.2 名称校验McpNameSchemaPR 同时要求修改 packages/omo-opencode/src/mcp/types.ts 中的枚举。当前仓库的枚举只有 4 个合法名称import { z } from zod export const McpNameSchema z.enum([websearch, context7, grep_app, lsp]) export type McpName z.infertypeof McpNameSchema export const AnyMcpNameSchema z.string().min(1) export type AnyMcpName z.infertypeof AnyMcpNameSchema变更后应变为export const McpNameSchema z.enum([websearch, context7, grep_app, lsp, arxiv])这里有两个关键的 schema 层次需要分清McpNameSchema是内置 MCP 的白名单枚举新增内置 MCP 必须同步扩充它否则名称校验无法通过AnyMcpNameSchema是z.string().min(1)用于接受任意非空字符串覆盖用户自定义 MCP如 playwright、sqlite、custom-mcp 等。正是二者的配合使得disabled_mcps既能精确匹配内置 MCP 名称又能兼容用户自定义名称。五、如何禁用disabled_mcps 与 enabled 标志PR 描述提供了两种禁用arxiv的方法均可在 OmO 配置文件中使用// Method 1: disabled_mcps { disabled_mcps: [arxiv] } // Method 2: enabled flag { mcp: { arxiv: { enabled: false } } }5.1 方法一disabled_mcps配置项disabled_mcps是顶层配置项定义于 packages/omo-opencode/src/config/schema/oh-my-opencode-config.tsdisabled_mcps: z.array(AnyMcpNameSchema).optional(),它是一个任意非空字符串数组z.string().min(1)的数组因此既支持内置名称如arxiv、grep_app也支持用户自定义名称。传入createBuiltinMcps(disabledMcps)后数组中的每个名字都会命中includes()判断从而跳过对应 MCP 的注册。配置 schema 的边界行为已被 packages/omo-opencode/src/config/schema.test.ts 覆盖验证例如合法用例disabled_mcps: [context7, grep_app]、[playwright, sqlite, custom-mcp]、[context7, playwright, custom-server]、空数组[]均通过校验非法用例[123, true, null]会被拒绝名称形态支持my-custom-mcp、my_custom_mcp、my.custom.mcp、my-custom-mcp-123等自定义命名风格。这组测试证明disabled_mcps是宽进设计校验只约束元素是非空字符串具体名称是否对应某个已注册 MCP 则由createBuiltinMcps在运行期决定。因此arxiv无需任何 schema 改动即可被disabled_mcps接受PR 中修改McpNameSchema的意义在于让arxiv成为合法的内置类型化名称McpName而不仅是任意字符串。5.2 方法二enabled标志enabled标志是RemoteMcpConfig/LocalMcpConfig类型自带的字段见 packages/omo-opencode/src/mcp/index.ts。用户可以在mcp配置节点下按名称覆盖某个 MCP 的默认行为{ mcp: { arxiv: { enabled: false } } }两种方法的适用场景不同disabled_mcps适合在配置顶层批量关闭多个内置 MCPenabled: false则更贴近针对单个 MCP 做精细化覆盖的语义。对arxiv而言两种方式都能达到同样的禁用效果。六、测试策略从数量断言到禁用回归PR 描述给出的验证命令是bun test src/mcp/测试变更集中在src/mcp/index.test.ts包含两类断言数量断言 3 → 4createBuiltinMcps()默认返回的 MCP 数量从 3 个变为 4 个。这是因为当前仓库中websearch在未配置 API Key 时会返回undefined参见 packages/omo-opencode/src/mcp/websearch.ts 的跳过逻辑而context7、grep_app、lsp稳定注册默认状态下实际是 3 个新增arxiv后变为 4 个。新增 arxiv 禁用测试验证在disabledMcps: [arxiv]或enabled: false时返回的mcps记录中不再包含arxiv键。仓库现有测试为这种断言风格提供了参照websearch.test.ts通过importFreshWebsearchModule()每次加载全新模块验证Tavily API Key 缺失时跳过 websearch MCP的日志行为context7.test.ts则直接断言context7配置对象的url与端点一致。新增 arxiv 测试可以复用同样的模块新鲜加载 对象结构断言模式确保注册与禁用两条路径都被锁定。七、扩展视角无认证远程 MCP 的定位与边界通过arxiv这个案例可以归纳 OmO 内置远程 MCP 的三种形态及其工程取舍形态代表API Key 要求配置复杂度纯静态导出grep_app模式参照、arxivPR 提案无最低4 字段对象可选 Keycontext7可选占位值会被过滤中需要normalizeContext7ApiKey必选 Keywebsearchtavily provider必须缺失则跳过较高provider 分派 环境变量读取选择静态导出、零认证的前提是目标服务的 API 公开且稳定如 arXiv、grep.app 的公共端点。若目标服务需要鉴权则应参考context7/websearch的写法在配置对象中加入headers.Authorization并在构建配置时处理好 API Key 缺失或占位值的情形。值得注意的是当前仓库源码中尚不存在src/mcp/arxiv.ts文件本文所述 arxiv 变更均以 PR 描述文档pr-description.md为依据其实现位置、端点地址与注册分支是提案内容而非既有代码。若要实际落地该 PR只需按第 3、4 节的模式补齐arxiv.ts静态配置、扩充McpNameSchema枚举、在createBuiltinMcps()中加入注册分支并同步更新测试与AGENTS.md文档即可——整个集成路径完全由现有源码模式支撑是一条可验证、可复现的扩展路线。【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表