在使用 AI 编程助手时,你可能会遇到这样的场景:想查一下 Sentry 上最新的错误日志,需要切换到浏览器打开 Sentry 控制台;想搜索某个开源库的最新文档,得手动打开搜索引擎;想看看 GitHub 上别人是怎么用某个 API 的,又要打开 Grep 搜索。这些上下文切换不仅打断思路,还降低了开发效率。
OpenCode 通过 MCP(Model Context Protocol,模型上下文协议) 彻底解决了这个问题。MCP 是 Anthropic 提出的一种开放协议,它定义了 AI 模型与外部工具之间的标准通信方式。OpenCode 完整支持 MCP,你可以将各种本地或远程的 MCP 服务器接入 OpenCode,让 AI 助手直接调用这些工具——就像调用它内置的 read、write、bash 一样自然。
本文将带你从零开始,掌握在 OpenCode 中配置和使用 MCP 服务器的全部知识,包括本地服务器、远程服务器、OAuth 认证、权限管理以及多个实战案例。
简单来说,MCP 服务器就是一个实现了 MCP 协议的服务端程序,它向 AI 模型暴露一组"工具"。LLM 在对话时可以直接"看到"这些工具的描述和参数,并根据需要调用它们。
举个例子,当你接入 Sentry 的 MCP 服务器后,你可以直接对 OpenCode 说:
看看我们项目最近 24 小时有哪些未解决的高优先级错误,用 sentry 工具
OpenCode 就会自动调用 Sentry MCP 服务器,获取错误列表,并用自然语言总结给你。整个过程都在终端内完成,无需离开编辑器。
在 OpenCode 中,所有 MCP 服务器的配置都写在 opencode.json(或 opencode.jsonc)文件的 mcp 字段中。每个 MCP 服务器有一个唯一的名字,你可以通过这个名字在提示词中引用它。
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"server-name": {
"type": "local",
"command": ["npx", "-y", "my-mcp-server"],
"enabled": true
}
}
}
enabled 字段默认为 true,设为 false 可以临时禁用某个服务器而不删除配置。
本地 MCP 服务器是在你本机运行的进程。你只需要指定启动命令,OpenCode 会在后台管理它的生命周期。
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-local-server": {
"type": "local",
"command": ["npx", "-y", "my-mcp-command"],
"enabled": true,
"environment": {
"API_KEY": "your-api-key-here"
}
}
}
}
command 是一个数组,第一个元素是可执行文件,后面的元素是参数。环境变量通过 environment 字段传入。
| 选项 | 类型 | 必填 | 说明 |
|------|------|------|------|
| type | String | 是 | 必须为 "local" |
| command | Array | 是 | 启动命令和参数 |
| cwd | String | 否 | 工作目录,相对路径基于工作区 |
| environment | Object | 否 | 环境变量键值对 |
| enabled | Boolean | 否 | 是否在启动时启用 |
| timeout | Number | 否 | 获取工具的超时时间(毫秒),默认 5000 |
MCP 官方提供了一个测试用的 server-everything 包,我们来实际接入它:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mcp_everything": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-everything"]
}
}
}
配置完成后,你可以在提示词中这样使用:
使用 mcp_everything 工具计算 3 加 4 的结果
AI 助手会自动识别这个工具并调用它。这种集成方式的妙处在于,LLM 能像理解内置工具一样理解你的自定义工具——它会根据工具的描述和参数签名,自主决定何时调用。
远程 MCP 服务器通过 HTTP 连接,适合接入第三方服务或团队共享的 MCP 服务。
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-remote-mcp": {
"type": "remote",
"url": "https://mcp.example.com/mcp",
"enabled": true,
"headers": {
"Authorization": "Bearer YOUR_API_TOKEN"
}
}
}
}
url 指定远程服务器的地址,headers 用于传递自定义 HTTP 请求头,通常用于承载认证令牌。
| 选项 | 类型 | 必填 | 说明 |
|------|------|------|------|
| type | String | 是 | 必须为 "remote" |
| url | String | 是 | 远程服务器 URL |
| headers | Object | 否 | 自定义请求头 |
| enabled | Boolean | 否 | 是否启用 |
| oauth | Object / false | 否 | OAuth 认证配置 |
| timeout | Number | 否 | 超时时间(毫秒),默认 5000 |
对于需要认证的远程 MCP 服务器,OpenCode 提供了完整的 OAuth 2.0 支持,包括自动发现、动态客户端注册和令牌管理。
大多数支持 OAuth 的 MCP 服务器不需要额外配置,OpenCode 会自动完成认证流程:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-oauth-server": {
"type": "remote",
"url": "https://mcp.example.com/mcp"
}
}
}
首次使用时,OpenCode 会检测服务器的 401 响应,自动启动 OAuth 流程,打开浏览器让你授权。授权完成后,令牌会安全地存储在 ~/.local/share/opencode/mcp-auth.json 中。
你也可以手动管理认证状态:
# 触发认证 opencode mcp auth my-oauth-server # 查看所有服务器的认证状态 opencode mcp list # 注销并删除凭据 opencode mcp logout my-oauth-server # 调试认证问题 opencode mcp debug my-oauth-server
如果你已经向 MCP 服务提供商申请了客户端凭据,可以直接在配置中指定:
{
"mcp": {
"my-oauth-server": {
"type": "remote",
"url": "https://mcp.example.com/mcp",
"oauth": {
"clientId": "{env:MY_MCP_CLIENT_ID}",
"clientSecret": "{env:MY_MCP_CLIENT_SECRET}",
"scope": "tools:read tools:execute"
}
}
}
}
这里 {env:VARIABLE_NAME} 是 OpenCode 的环境变量引用语法,实际运行时会被替换为对应的环境变量值。
如果服务器使用 API Key 而非 OAuth 认证,需要显式禁用 OAuth:
{
"mcp": {
"my-api-key-server": {
"type": "remote",
"url": "https://mcp.example.com/mcp",
"oauth": false,
"headers": {
"Authorization": "Bearer {env:MY_API_KEY}"
}
}
}
}
下面我以三个常用的 MCP 服务器为例,展示从配置到使用的完整流程。
Sentry 是主流的前端和后端错误监控服务。接入 Sentry MCP 服务器后,你可以直接在终端内查询和分析错误。
配置:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sentry": {
"type": "remote",
"url": "https://mcp.sentry.dev/mcp",
"oauth": {}
}
}
}
认证:
opencode mcp auth sentry
这会打开浏览器跳转到 Sentry 授权页面,授权完成后返回终端。
使用:
查看我们项目中最近未解决的高优先级问题,用 sentry 工具
AI 助手会调用 Sentry MCP 获取实时错误数据,然后将结果用可读的格式呈现给你。你可以进一步追问:
第三个错误是什么时候开始的?影响的用户有多少?
这种交互方式让你无需离开编辑环境就能完成错误排查,特别适合"边写代码边解决问题"的工作流。
Context7 是 Upstash 开发的一个 MCP 服务器,能实时搜索最新的技术文档。对于查阅 API、框架文档非常有用。
基础配置(免费额度):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp"
}
}
}
使用 API Key(更高频率限制):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "{env:CONTEXT7_API_KEY}"
}
}
}
}
使用前确保已设置环境变量:
export CONTEXT7_API_KEY="your-key-here"
使用示例:
帮我查一下 Cloudflare Workers 中如何缓存 JSON API 响应五分钟,用 context7 工具
Context7 会搜索最新文档并返回准确答案,效果远好于直接让 LLM 靠"记忆"回答——因为文档信息是实时的。
你还可以在项目的 AGENTS.md 中配置自动使用规则:
当需要搜索技术文档时,优先使用 context7 工具获取最新信息。
Grep by Vercel 可以搜索 GitHub 上的公开代码,帮你快速找到某个 API 或模式的真实使用案例。
配置:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"gh_grep": {
"type": "remote",
"url": "https://mcp.grep.app"
}
}
}
使用示例:
在 SST Astro 组件中设置自定义域名的正确方式是什么?使用 gh_grep 工具搜索 GitHub 上的示例
Grep 会在数百万个 GitHub 仓库中搜索相关代码片段,AI 助手则负责理解、总结这些片段,给你一个可以直接使用的答案。
你可以像管理内置工具一样管理 MCP 服务器。在 tools 字段中使用服务器名称来控制启停:
{
"mcp": {
"my-mcp-foo": {
"type": "local",
"command": ["bun", "x", "my-mcp-command-foo"]
},
"my-mcp-bar": {
"type": "local",
"command": ["bun", "x", "my-mcp-command-bar"]
}
},
"tools": {
"my-mcp-foo": false
}
}
这样 my-mcp-bar 仍然可用,但 my-mcp-foo 被全局禁用了。
如果你有很多 MCP 服务器,可以使用 glob 模式批量操作:
{
"tools": {
"my-mcp*": false
}
}
这行配置会禁用所有以 my-mcp 开头的服务器。注意,MCP 工具在注册时以服务器名称为前缀,所以 my-mcp_search 和 my-mcp_list 都属于 my-mcp 服务器。
支持的通配符:
* 匹配零个或多个任意字符? 匹配恰好一个任意字符如果你的项目比较复杂,可能希望不同 Agent 使用不同的 MCP 服务器。典型做法是:全局禁用,然后按 Agent 开启需要的部分。
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"sentry": {
"type": "remote",
"url": "https://mcp.sentry.dev/mcp",
"oauth": {}
},
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp"
}
},
"tools": {
"sentry*": false,
"context7*": false
},
"agent": {
"debug": {
"mode": "subagent",
"tools": {
"sentry*": true
}
},
"research": {
"mode": "subagent",
"tools": {
"context7*": true
}
}
}
}
这样的配置使得:
debug agent 可以访问 Sentry 工具,但不能用 Context7research agent 可以访问 Context7 工具,但不能用 SentryMCP 服务器在启动时会向 LLM 暴露所有可用工具的描述。工具越多,消耗的上下文越多。举个例子,GitHub 官方的 MCP 服务器会注册大量工具,短短几次调用就可能超出上下文限制。
建议:
enabled: false 或 tools 字段关闭| 场景 | 推荐类型 |
|------|----------|
| 访问本地文件系统或数据库 | 本地(local) |
| 调用第三方 SaaS API | 远程(remote) |
| 使用团队内部私有服务 | 远程(remote) |
| 需要 OAuth 授权的服务 | 远程 + OAuth |
当 MCP 服务器连接失败时,可以按以下步骤排查:
查看认证状态:
```bash
opencode mcp list
```
调试单个服务器:
```bash
opencode mcp debug <server-name>
```
确认服务器可用: 对于远程服务器,先用 curl 测试连通性。
检查超时: 如果网络较慢,适当增加 timeout 值(单位毫秒)。
如果你所在的组织通过 .well-known/opencode 端点提供了默认的 MCP 服务器配置,你可以在本地配置中覆盖它们。例如,组织提供了 Jira 服务器但默认关闭,你只需在本地配置中加上:
{
"mcp": {
"jira": {
"type": "remote",
"url": "https://jira.example.com/mcp",
"enabled": true
}
}
}
你的本地配置优先于组织默认值。
MCP 是连接 AI 编程助手与外部工具生态的关键桥梁。OpenCode 对 MCP 的支持使得你可以将 Sentry、Context7、GitHub Grep 等数十种工具无缝接入编程工作流,大幅减少上下文切换,提升开发效率。
回顾本文要点:
tools 字段和 Agent 分配实现精细化控制有了 MCP,你的 OpenCode 不再是孤立的编程助手,而是连接了整个开发生态的操作中心。尝试接入你常用的开发工具,你会发现"一切都在终端里搞定"的开发体验有多么丝滑。