> ## Documentation Index
> Fetch the complete documentation index at: https://docs.boxd.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrations

> Connect Linear, Slack, and GitHub once. Every personal machine can use them, and the coding agents on board discover them automatically.

Integrations connect a third-party account to boxd **once**, at the account level. After that, every personal machine you own can use it, with nothing to set up per machine. The token lives server-side, and boxd injects it into your machines on demand.

Three integrations ship today:

<Columns cols={3}>
  <Card title="GitHub" icon="https://mintcdn.com/azin/psRZbQh2QwMUVL3U/images/icons/github.svg?fit=max&auto=format&n=psRZbQh2QwMUVL3U&q=85&s=add225d0929d6eb3f611c843f9c547ce" href="/guides/integrations/github" width="16" height="16" data-path="images/icons/github.svg">
    Clone and push private repos from any machine.
  </Card>

  <Card title="Linear" icon="https://mintcdn.com/azin/psRZbQh2QwMUVL3U/images/icons/linear.svg?fit=max&auto=format&n=psRZbQh2QwMUVL3U&q=85&s=304fb7fe5e79d492b3179a8c774034cc" href="/guides/integrations/linear" width="16" height="16" data-path="images/icons/linear.svg">
    Linear's GraphQL API and an optional MCP server for your agents.
  </Card>

  <Card title="Slack" icon="https://mintcdn.com/azin/psRZbQh2QwMUVL3U/images/icons/slack.svg?fit=max&auto=format&n=psRZbQh2QwMUVL3U&q=85&s=3331379f41970482c2977f237b9d8906" href="/guides/integrations/slack" width="16" height="16" data-path="images/icons/slack.svg">
    The Slack Web API as the bot or as you, plus an optional MCP server.
  </Card>
</Columns>

## Connect an integration

There are two ways to connect, and both end at the same place:

**From the console**: open [`boxd.sh/app`](https://boxd.sh/app), go to **Integrations**, and click **Connect** on the service you want. This is the simplest path.

**From the CLI**: `boxd manage integrations connect <id>` (for example `github`, `linear`, or `slack`) prints an authorize URL, then polls until you approve it:

```bash theme={"theme":"github-dark"}
boxd manage integrations connect linear
```

```
Open this URL in a browser to connect linear:

  https://linear.app/oauth/authorize?client_id=…

Waiting for authorization (up to 5 minutes)...
✓ linear connected — available on your personal and private VMs.
```

You open the URL in any browser and approve, and the CLI finishes on its own. The browser step is why **a human** has to do the connect. An agent can kick it off but can't click through the consent screen.

<Note>
  `boxd manage integrations connect` works for all three: `github`, `linear`, and `slack`. GitHub can *also* be connected with the **Connect GitHub repos** button in the console, and both routes land the same grant.
</Note>

## Personal and Organization integrations

There are personal integrations and organization integrations. Personal integrations are available to your private machines and organization integration to the shared machines inside the organization.

## How a machine uses an integration

Once connected, each integration shows up two ways inside your machine.

**As environment variables**, exported into every login shell (and into the coding agents' environment):

| Integration | Variables                                                             |
| ----------- | --------------------------------------------------------------------- |
| Linear      | `LINEAR_ACCESS_TOKEN`                                                 |
| Slack       | `SLACK_BOT_TOKEN`, `SLACK_USER_TOKEN`, `SLACK_TEAM_ID`                |
| GitHub      | (none needed, a git credential helper and `gh` are wired up directly) |

### Discover what's wired in

Inside any machine, run **`boxd manage integrations`** to see which accounts are connected and how to use each, plus what else you can still connect. It is the live source of truth:

```text theme={"theme":"github-dark"}
$ boxd manage integrations
Connected integrations (usable from this VM):

  GitHub
    git          pre-configured credential helper — clone & push private repos directly
    gh CLI       the `gh` command works out of the box (GH_TOKEN injected per call)

  Linear
    GraphQL API  POST https://api.linear.app/graphql with header `Authorization: Bearer $LINEAR_ACCESS_TOKEN`
    MCP server   the `linear-server` MCP is configured in Claude Code (https://mcp.linear.app/mcp)

Available to connect:
  Slack       boxd manage integrations connect slack
```

The **Available to connect** section lists every catalog integration that's available on the deployment but not yet connected, with the exact `connect` command, so an agent can discover and wire one up without guessing.

Add `--json` for a structured version. Connected integrations come back under `integrations`, each with `access` methods tagged by a machine-readable `kind` (`git`, `cli`, `graphql`, `api`, `mcp`), and the not-yet-connected ones come back under `connectable`. The coding agents pre-installed on every machine are told to run `boxd manage integrations` rather than guess, so new integrations show up for them automatically.

## MCP servers

Linear and Slack each also offer a [Model Context Protocol](https://modelcontextprotocol.io) server that a coding agent can call directly. It's **opt-in per agent**:

```bash theme={"theme":"github-dark"}
boxd manage integrations mcp linear                 # install into all agents (Claude Code, Codex, OpenCode)
boxd manage integrations mcp linear claude codex    # only these agents
boxd manage integrations mcp linear --disable       # remove from every agent
```

The agent ids are `claude` (Claude Code), `codex`, and `opencode`. With no agents listed, the MCP installs into all three, and `--disable` removes it everywhere. You can also toggle this from the console with **Enable MCP** on the integration's card. The MCP is only active while the integration is connected, and disconnecting clears the opt-in too.

## The `boxd manage integrations` command

The same command behaves the same everywhere you drive boxd:

| Subcommand           | [CLI](/cli/commands#integrations) | In-VM CLI | Console |
| -------------------- | :-------------------------------: | :-------: | :-----: |
| `list` (default)     |                 ✓                 |     ✓     |    ✓    |
| `connect <id>`       |                 ✓                 |     ✓     |    ✓    |
| `disconnect <id>`    |                 ✓                 |     ✓     |    ✓    |
| `mcp <id> [agents…]` |                 ✓                 |     ✓     |    ✓    |

`integ` is an alias for `integrations`, and `ls` an alias for `list`. All four subcommands work on every surface: the laptop CLI, inside a machine, and the console. Service names are case-insensitive (`Slack` = `slack`).

## Disconnect

```bash theme={"theme":"github-dark"}
boxd manage integrations disconnect linear
```

Disconnecting revokes the token at the provider, clears it from boxd, and removes any MCP opt-in. From the console, **Disconnect** on a card offers the same, with the choice to remove just the MCP server or disconnect the service entirely.
