MCP servers (original) (raw)
You can add external tools to OpenCode using the Model Context Protocol, or MCP.
OpenCode supports both:
- Local servers
- Remote servers
Once added, MCP tools are automatically available to the LLM alongside built-in tools.
Caveats
When you use an MCP server, it adds to the context. This can quickly add up if you have a lot of tools. So we recommend being careful with which MCP servers you use.
Certain MCP servers, like the GitHub MCP server tend to add a lot of tokens and can easily exceed the context limit.
Configure
You can define MCP servers in your OpenCode config under mcp. Add each MCP with a unique name. You can refer to that MCP by name when prompting the LLM.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"name-of-mcp-server": {
// ...
"enabled": true,
},
"name-of-other-mcp-server": {
// ...
},
},
}
You can also disable a server by setting enabled to false. This is useful if you want to temporarily disable a server without removing it from your config.
Local
Add local MCP servers using type to "local" within the MCP object.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-local-mcp-server": {
"type": "local",
// Or ["bun", "x", "my-mcp-command"]
"command": ["npx", "-y", "my-mcp-command"],
"enabled": true,
"environment": {
"MY_ENV_VAR": "my_env_var_value",
},
},
},
}
The command is how the local MCP server is started. You can also pass in a list of environment variables as well.
For example, here’s how I can add the test@modelcontextprotocol/server-everything MCP server.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mcp_everything": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-everything"],
},
},
}
And to use it I can add use the mcp_everything tool to my prompts.
use the mcp_everything tool to add the number 3 and 4
Options
Here are all the options for configuring a local MCP server.
| Option | Type | Required | Description |
|---|---|---|---|
| type | String | Y | Type of MCP server connection, must be "local". |
| command | Array | Y | Command and arguments to run the MCP server. |
| environment | Object | Environment variables to set when running the server. | |
| enabled | Boolean | Enable or disable the MCP server on startup. | |
| timeout | Number | Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds). |
Remote
Add remote MCP servers under by setting type to "remote".
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-remote-mcp": {
"type": "remote",
"url": "https://my-mcp-server.com",
"enabled": true,
"headers": {
"Authorization": "Bearer MY_API_KEY"
}
}
}
}
Here the url is the URL of the remote MCP server and with the headers option you can pass in a list of headers.
Options
| Option | Type | Required | Description |
|---|---|---|---|
| type | String | Y | Type of MCP server connection, must be "remote". |
| url | String | Y | URL of the remote MCP server. |
| enabled | Boolean | Enable or disable the MCP server on startup. | |
| headers | Object | Headers to send with the request. | |
| oauth | Object | OAuth authentication configuration. See OAuth section below. | |
| timeout | Number | Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds). |
OAuth
OpenCode automatically handles OAuth authentication for remote MCP servers. When a server requires authentication, OpenCode will:
- Detect the 401 response and initiate the OAuth flow
- Use Dynamic Client Registration (RFC 7591) if supported by the server
- Store tokens securely for future requests
Automatic OAuth
For most OAuth-enabled MCP servers, no special configuration is needed. Just configure the remote server:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-oauth-server": {
"type": "remote",
"url": "https://mcp.example.com/mcp"
}
}
}
If the server requires authentication, OpenCode will prompt you to authenticate when you first try to use it.
Pre-registered Client
If you have client credentials from the MCP server provider, you can configure them:
{
"$schema": "https://opencode.ai/config.json",
"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"
}
}
}
}
Disabling OAuth
If you want to disable automatic OAuth for a server (e.g., for servers that use API keys instead), set oauth to false:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-api-key-server": {
"type": "remote",
"url": "https://mcp.example.com/mcp",
"oauth": false,
"headers": {
"Authorization": "Bearer {env:MY_API_KEY}"
}
}
}
}
OAuth Options
| Option | Type | Required | Description |
|---|---|---|---|
| oauth | Object | false | OAuth config object, or false to disable OAuth auto-detection. | |
| clientId | String | OAuth client ID. If not provided, dynamic client registration will be attempted. | |
| clientSecret | String | OAuth client secret, if required by the authorization server. | |
| scope | String | OAuth scopes to request during authorization. |
Authenticating
You can manually trigger authentication or manage credentials:
# Authenticate with a specific MCP server
opencode mcp auth my-oauth-server
# List all MCP servers and their auth status
opencode mcp list
# Remove stored credentials
opencode mcp logout my-oauth-server
The mcp auth command will open your browser for authorization. After you authorize, OpenCode will store the tokens securely in ~/.local/share/opencode/mcp-auth.json.
Manage
Your MCPs are available as tools in OpenCode, alongside built-in tools. So you can manage them through the OpenCode config like any other tool.
Global
This means that you can enable or disable them globally.
{
"$schema": "https://opencode.ai/config.json",
"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
}
}
We can also use a glob pattern to disable all matching MCPs.
{
"$schema": "https://opencode.ai/config.json",
"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*": false
}
}
Here we are using the glob pattern my-mcp* to disable all MCPs.
Per agent
If you have a large number of MCP servers you may want to only enable them per agent and disable them globally. To do this:
- Disable it as a tool globally.
- In your agent config enable the MCP server as a tool.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"my-mcp": {
"type": "local",
"command": ["bun", "x", "my-mcp-command"],
"enabled": true
}
},
"tools": {
"my-mcp*": false
},
"agent": {
"my-agent": {
"tools": {
"my-mcp*": true
}
}
}
}
Glob patterns
The glob pattern uses simple regex globbing patterns.
*matches zero or more of any character?matches exactly one character- All other characters match literally
Examples
Below are examples of some common MCP servers. You can submit a PR if you want to document other servers.
Context7
Add the Context7 MCP server to search through docs.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp"
}
}
}
If you have signed up for a free account, you can use your API key and get higher rate-limits.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"context7": {
"type": "remote",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "{env:CONTEXT7_API_KEY}"
}
}
}
}
Here we are assuming that you have the CONTEXT7_API_KEY environment variable set.
Add use context7 to your prompts to use Context7 MCP server.
Configure a Cloudflare Worker script to cache JSON API responses for five minutes. use context7
Alternatively, you can add something like this to yourAGENTS.md.
When you need to search docs, use `context7` tools.
Grep by Vercel
Add the Grep by Vercel MCP server to search through code snippets on GitHub.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"gh_grep": {
"type": "remote",
"url": "https://mcp.grep.app"
}
}
}
Since we named our MCP server gh_grep, you can add use the gh_grep tool to your prompts to get the agent to use it.
What's the right way to set a custom domain in an SST Astro component? use the gh_grep tool
Alternatively, you can add something like this to yourAGENTS.md.
If you are unsure how to do something, use `gh_grep` to search code examples from github.