> For the complete documentation index, see [llms.txt](https://docs.balkan.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.balkan.id/balkanid-mcp/installation-and-setup/opencode.md).

# OpenCode

Connect [OpenCode](https://opencode.ai/docs/mcp-servers/) to BalkanID MCP.

**OAuth is preferred.** API keys remain available for Read-only or static-token setups.

### One-click (OAuth — recommended)

1. Open <https://mcp.balkanid.app>, sign in, and confirm the correct **tenant**.
2. Under **OAuth Connectors**, select **OpenCode**.
3. Click **Copy MCP config**. The snippet defines `balkanid` with `"type": "remote"` and the BalkanID MCP URL (no `headers` — OAuth runs automatically).
4. Merge the snippet into your OpenCode config (`opencode.json`) and restart OpenCode.
5. On first use of a BalkanID tool, OpenCode detects the required auth and opens your browser — sign in to BalkanID, select your **tenant**, and grant consent.

{% hint style="info" %}
OAuth currently requires **both Read and Write** scopes. See Authentication and Permissions.
{% endhint %}

### Manual configuration (OAuth fallback)

Add a remote server entry to your [OpenCode config](https://opencode.ai/docs/mcp-servers/):

```json
{
  "mcp": {
    "balkanid": {
      "type": "remote",
      "url": "https://mcp.balkanid.app/server/mcp",
      "enabled": true
    }
  }
}
```

OpenCode detects that BalkanID requires authentication and starts the OAuth flow automatically the first time a BalkanID tool is called.

### One-click (API key)

1. Create an API key in the [MCP UI](https://mcp.balkanid.app) under **Bearer Auth Keys**.
2. Open **Connect** for that key, choose **OpenCode**, and copy the config (includes the Bearer header).
3. Merge into your OpenCode config and restart OpenCode.

### Manual configuration (API key fallback)

```json
{
  "mcp": {
    "balkanid": {
      "type": "remote",
      "url": "https://mcp.balkanid.app/server/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE"
      }
    }
  }
}
```

Replace `YOUR_TOKEN_HERE` with the token from the MCP UI. Use a Read-only key when you only need discovery tools.

### Verify

Ask OpenCode: “Call whoami on BalkanID MCP.” You should see your email and tenant ID.

### Disable or remove

Set `"enabled": false` on the `balkanid` entry in your OpenCode config to turn it off without losing its configuration. To sign out but keep the server configured, run `opencode mcp logout balkanid` — this clears the stored OAuth credentials without removing the entry. To remove the server entirely, delete its block from the config.

### Official documentation

OpenCode documentation for MCP servers:

* [MCP servers](https://opencode.ai/docs/mcp-servers/) — OpenCode Docs


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.balkan.id/balkanid-mcp/installation-and-setup/opencode.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
