ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

oh-my-opencode-slim 内置 MCP 与 websearch 接入指南:context7、gh_grep 的配置、权限与全局禁用

oh-my-opencode-slim 内置 MCP 与 websearch 接入指南:context7、gh_grep 的配置、权限与全局禁用 人工智能AI AgentAgent 编排AI 技能【免费下载链接】oh-my-opencode-slimLean, fine tuned Opencode multi agent suite · Mix any models · Auto delegate tasks项目地址https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim点击查看免费下载导读oh-my-opencode-slim 作为一套精简的多 Agent 编排插件为 Agent 内置了 Model Context ProtocolMCP服务器与搜索能力让各个专职子 Agent 可以直接获取外部库的实时文档与 GitHub 代码检索结果。本文以仓库中的 docs/mcps.md 为主线结合源码实现src/config/agent-mcps.ts、src/mcp/index.ts 等与测试用例完整讲解三个实操主题如何启用 OpenCode 内置的websearch工具、如何按 Agent 配置mcps访问白名单/黑名单、以及如何通过disabled_mcps在全局层面彻底关闭外部 MCP 调用。读完你可以直接在自己的 preset 配置中落地一套哪些 Agent 能用哪些 MCP的权限策略。一、整体架构三类外部知识通道oh-my-opencode-slim 内置的 MCP 能力服务于一个核心目标让编排中的子 Agent 在编写代码、检索资料时不必依赖模型自身的陈旧知识而是实时接入两个外部通道通道用途端点context7官方库文档检索保持最新https://mcp.context7.com/mcpgh_grep基于 grep.app 的 GitHub 代码搜索https://mcp.grep.app除此之外插件不再自带独立的 websearch MCP而是直接复用 OpenCode 内置的websearch工具详情见下一节。从源码看内置 MCP 的注册表定义在 src/mcp/index.tsconst allBuiltinMcps: RecordMcpName, McpConfig { context7, gh_grep, };McpName类型在 src/config/schema.ts 中被严格限定为z.enum([context7, gh_grep])也就是说当前版本内置且可被配置引用的 MCP 名称只有这两个任何拼写错误都会在校验阶段被发现。两个 MCP 的远程配置分别在 src/mcp/context7.ts 与 src/mcp/grep-app.ts 中定义均为type: remote、oauth: false的远程 HTTP MCP无需本地进程。二、内置 websearch推荐的首选搜索方案插件不再随包发布 websearch MCP。OpenCode 已经内置了websearch工具可以直接替代既不需要申请 API Key也不需要额外启动一个 MCP 服务器。2.1 启用方式环境变量在 shell 配置文件或启动命令中设置如下环境变量后启动opencodeenv OPENCODE_ENABLE_EXAtrue OPENCODE_ENABLE_PARALLELtrue opencode该内置工具由Exa提供搜索能力可选启用 Parallel 并行搜索不需要 API Key仅在使用opencodeprovider 时可用或者显式设置了上述 flagsoh-my-opencode-slim 的安装器在安装环节接受环境配置时会自动在 background-subagents 导出的同时写入OPENCODE_ENABLE_EXA1Parallel 并行搜索仍保持 opt-in需要手动设置OPENCODE_ENABLE_PARALLEL。2.2 按 Agent 控制 websearch 权限工具默认对所有 Agent 开放all tools are allowed by default。如果需要收紧可以借助 OpenCode 的permission配置在某个 Agent 上显式声明{ presets: { my-preset: { explorer: { permission: { websearch: allow } } } } }permission是 Agent 配置中的合法字段之一在 src/config/schema.ts 的PermissionObjectSchema中websearch与webfetch、bash、task等并列取值被校验为ask | allow | deny三种动作之一。因此你也可以用deny直接禁止某个 Agent 使用 websearch。三、各 Agent 的默认 MCP 权限不同专职 Agent 的默认 MCP 集合在 src/config/agent-mcps.ts 中硬编码Agent默认 MCPsorchestrator*,!context7librariancontext7,gh_grepdesigner无oracle无explorer无fixer无councillor无对应的源码常量如下export const DEFAULT_AGENT_MCPS: RecordAgentName, string[] { orchestrator: [*, !context7], designer: [], oracle: [], librarian: [context7, gh_grep], explorer: [], fixer: [], observer: [], council: [], councillor: [], };这里的设计意图很清晰orchestrator编排者负责全局调度给它开全部 MCP*但排除context7——它不需要亲自去查库文档那是 librarian 的职责librarian图书馆管理员专门负责资料检索因此同时拥有context7官方文档与gh_grepGitHub 代码搜索两个 MCP是检索能力最完整的 Agent其余执行类 Agentdesigner、oracle、explorer、fixer、councillor默认不携带任何 MCP避免子任务在执行中产生多余的外部网络调用。从 src/config/constants.ts 可以看到Agent 名称还支持别名explore映射到explorerfrontend-ui-ux-engineer映射到designer。getAgentMcpListsrc/config/agent-mcps.ts在查找 Agent 配置时会先用AGENT_ALIASES做别名回退因此你在配置里用别名写mcps同样生效。四、按 Agent 配置 MCP 访问mcps 数组4.1 语法表通过 preset 配置中每个 Agent 的mcps数组字段配置文件为~/.config/opencode/oh-my-opencode-slim.json或.jsonc可以精确控制该 Agent 能使用哪些 MCP语法含义[*]全部 MCP[*, !context7]除context7外的全部 MCP[context7, gh_grep]仅列出的 MCP[]不启用任何 MCP[!*]拒绝全部 MCP4.2 三条规则*展开为当前所有可用的 MCP!item排除某个具体 MCP冲突处理拒绝优先。例如[a, !a]这样的自相矛盾列表最终结果是不允许adeny wins。4.3 完整配置示例{ presets: { my-preset: { orchestrator: { mcps: [*, !context7] }, librarian: { mcps: [context7, gh_grep] }, oracle: { mcps: [*, !gh_grep] }, fixer: { mcps: [] } } } }在这个示例中orchestrator 保留默认行为全量减 context7librarian 只做官方文档与代码搜索oracle 使用除 gh_grep 外的所有 MCPfixer 彻底不触碰任何 MCP。4.4 底层解析逻辑parseListmcps数组并不是直接透传给 SDK 的而是经过 src/config/agent-mcps.ts 的parseList函数解析export function parseList(items: string[], allAvailable: string[]): string[] { if (!items || items.length 0) { return []; } const allow items.filter((i) !i.startsWith(!)); const deny items.filter((i) i.startsWith(!)).map((i) i.slice(1)); if (deny.includes(*)) { return []; } if (allow.includes(*)) { return allAvailable.filter((item) !deny.includes(item)); } return allow.filter( (item) !deny.includes(item) allAvailable.includes(item), ); }这段实现印证了文档中的全部规则并且有几点值得注意[!*]deny 中包含*会直接返回空数组即拒绝全部 MCP与文档表格一致[*, !x]等价于所有可用 MCP 中剔除 x结果还会过滤掉不在allAvailable里的未知名称没有*时最终结果同时要求在 allow 列表、不在 deny 列表、且确实存在于可用 MCP 集合中冲突时 deny 自然获胜空数组返回空数组与[!*]语义相同但表达不同。对应的单元测试覆盖在 src/config/agent-mcps.test.ts包括通配符展开、[*, !mcp2]排除、[!*]返回空、[mcp1, mcp3, !mcp3]冲突时 deny 获胜等场景可以直接作为理解语法的可执行文档。另外注意getAgentMcpListsrc/config/agent-mcps.ts的读取顺序如果 preset/agent 覆盖里显式定义了mcps就以用户配置为准否则回退到上面的DEFAULT_AGENT_MCPS默认值。也就是说你只配置了某个 Agent 的mcps其余 Agent 仍沿用默认集合无需全部重写。五、全局禁用 MCPdisabled_mcps如果你希望无论哪个 preset、哪个 Agent都彻底禁用某些 MCP就在配置文件的根级添加disabled_mcps数组{ disabled_mcps: [gh_grep] }5.1 适用场景文档明确给出的两个典型场景完全切断外部网络调用例如气隙环境 air-gapped成本控制不希望 Agent 在任务中频繁发起外部检索请求。5.2 底层实现全局禁用发生在 MCP 注册阶段。入口函数是 src/mcp/index.ts 的createBuiltinMcpsexport function createBuiltinMcps( disabledMcps: readonly string[] [], ): Recordstring, McpConfig { // Never trust the declared type of user-config-derived values at // runtime; fall back to nothing disabled instead of throwing. const safeDisabledMcps Array.isArray(disabledMcps) ? disabledMcps : []; return Object.fromEntries( Object.entries(allBuiltinMcps).filter( ([name]) !safeDisabledMcps.includes(name), ), ); }两点实现细节值得说明对配置值做了运行时防御如果disabled_mcps不是数组例如误写成字符串会安全降级为不禁用任何 MCP而不是让整个插件初始化崩溃。这一点在 src/mcp/index.test.ts 有专门的回归测试未知名称会被忽略disabled_mcps里写入不存在的 MCP 名不会报错也不会影响其余 MCP 的注册见 src/mcp/index.test.ts。此外配置加载层还有一层兜底在 src/config/loader.ts 中disabled_mcps与disabled_agents、disabled_tools、disabled_skills同属DISABLED_CONFIG_KEYSnormalizeDisabledArrayKeyssrc/config/loader.ts会把误写成字符串的值自动规范化为单元素数组保证用户的禁用意图不会因为一个类型错误而丢失。在 src/config/schema.ts 中disabled_mcps的语义被明确定义为要完全禁用的 MCP 服务器名称。被禁用的服务器不会启动任何 Agent 都无法使用它们。六、配置文件位置与校验配置文件~/.config/opencode/oh-my-opencode-slim.json也支持.jsonc加载时会先剥离 JSON 注释仓库自带的 JSON Schema 校验文件为 oh-my-opencode-slim.schema.json可作为编辑器补全与校验参考配置的完整字段说明可进一步阅读 docs/configuration.md。七、常见问题速查Q1[*, !context7]和默认行为一样还需要写吗默认情况下 orchestrator 就是这个配置。但显式写出可以避免未来插件修改默认值时影响你的 preset属于显式优于隐式的防御性写法。Q2mcps: []与mcps: [!*]有区别吗从parseList的结果看两者都解析为空集合前者空列表、后者 deny 含*语义上等效[]更直观[!*]强调显式拒绝一切。Q3配置里写了disabled_mcpspreset 里又给某 Agent 写了该 MCP会怎样全局禁用优先。disabled_mcps在 MCP 注册阶段就把它从createBuiltinMcps的产物中过滤掉了Agent 层面的mcps白名单即使列出了它也没有可用的服务器可连。Q4websearch 需要 API Key 吗不需要。OpenCode 内置的websearch由 Exa 提供能力无需 API Key 与额外 MCP 服务器只要以opencodeprovider 运行或显式设置OPENCODE_ENABLE_EXAtrue可叠加OPENCODE_ENABLE_PARALLELtrue开启并行搜索即可使用。Q5Agent 名称别名会影响 MCP 配置吗会。explore与frontend-ui-ux-engineer分别是explorer、designer的别名见 src/config/constants.tsgetAgentMcpList会做别名回退查找所以用别名写mcps同样生效。小结oh-my-opencode-slim 的 MCP 体系可以概括为三个层次内置远程 MCPcontext7、gh_grep提供外部知识检索能力 → 每个 Agent 的mcps数组决定谁能用哪些 → 全局disabled_mcps决定哪些根本不会注册。配合 OpenCode 内置的零配置websearch工具你可以在不引入任何第三方 MCP 服务器、不申请任何 API Key 的前提下为多 Agent 编排搭建一套按角色分配外部检索权限、按环境全局断网的完整方案。相关实现细节可继续在仓库中追溯 src/config/agent-mcps.ts、src/mcp/index.ts 及其对应测试文件。赞分享人工智能AI AgentAgent 编排AI 技能【免费下载链接】oh-my-opencode-slimLean, fine tuned Opencode multi agent suite · Mix any models · Auto delegate tasks项目地址https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim点击查看免费下载相关推荐阴阳师自动化脚本基于AI视觉识别的百鬼夜行全栈解决方案阴阳师自动化脚本基于AI视觉识别的百鬼夜行全栈解决方案 问题诊断与价值主张 在阴阳师手游的长期运营中百鬼夜行活动作为核心碎片获取渠道传统手动操作面临三大效人工智能AI AgentAgent 编排AI 技能告别臃肿右键菜单用ContextMenuManager一步到位完成Windows右键菜单终极清理告别臃肿右键菜单用ContextMenuManager一步到位完成Windows右键菜单终极清理 上个月帮朋友装了几款日常软件一周后他的右键菜单就长成了小人工智能AI AgentAgent 编排AI 技能SDR 零基础上手指南四步装好软件收到第一声 FM 广播SDR 零基础上手指南四步装好软件收到第一声 FM 广播 想象一下瀑布图上的斜线突然亮起来你点了一下音箱里钻出一句播报——无线电第一次变得看得见。桌面应用通信上一篇XXL-JOB日志清理异常问题分析与解决方案下一篇虎符台/Legion Seal全面战争MOD管理终极指南一键解决MOD冲突与排序难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表