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

# Allowed Tools per Platform

> Configure which tools Cyrus can use, separately for Linear, Slack, and GitHub

Cyrus exposes a different set of tools to itself depending on which platform
kicked off a session. The **Allowed Tools** page in the Cyrus webapp
(`/settings/tools`) is split into three tabs — **Slack**, **Linear**, and
**GitHub** — so you can grant Cyrus the right toolbelt for each surface.

## Why per-platform tools?

A Linear issue assignment generally means Cyrus is going to do real
engineering work — open PRs, run shell, edit files. A Slack `@cyrus` mention,
on the other hand, is usually a question or a quick lookup; you probably
don't want every mention to be able to run arbitrary `Bash`. Splitting the
allowed list by platform lets you tighten the high-frequency, transient
surfaces (Slack) while leaving the engineering surfaces (Linear / GitHub)
wide open.

## The three tabs

### Slack

These tools apply when Cyrus is `@mentioned` in Slack. Slack chat sessions
are transient — they don't check out a repository or open PRs — so the
default list is the read-only set plus a handful of helpers needed to reply
in-thread and queue follow-ups:

`Read`, `Glob`, `Grep`, `Bash(git -C * pull)`, `WebFetch`, `WebSearch`,
`SendMessage`, `ScheduleWakeup`, `Task`, the full `Task*` lifecycle
(`TaskCreate` / `TaskUpdate` / `TaskGet` / `TaskList` / `TaskOutput` /
`TaskStop`), `EnterPlanMode` / `ExitPlanMode`, `Monitor`, `Skill`,
`ToolSearch`, and the workspace MCP prefixes `mcp__linear`,
`mcp__cyrus-tools`, `mcp__cyrus-docs`, `mcp__slack`.

You can add or remove anything on this tab — it does not have to be a
subset of the Linear list.

### Linear

These tools apply to agent sessions triggered from Linear — issue
assignment, mid-session prompts, agent session @ mentions, etc. Linear
sessions are full engineering sessions, so the default is the full Claude
Agent SDK toolset plus the workspace MCP prefixes (including `mcp__slack`,
so Cyrus can post status updates to a Slack thread while working on an
issue).

### GitHub

These tools apply to GitHub- and GitLab-triggered sessions (PR / MR
comments, automated fix-on-failure flows, and other webhooks that spawn
an agent session). The default mirrors the Linear list **except**
`mcp__slack` is omitted — GitHub sessions don't post into Slack, that's
Slack's surface.

Each of the three lists is maintained independently in `cyrus-core` —
adding a tool to one list does not silently add it to the others.

## Per-repository overrides

Per-repository overrides live underneath the **Linear** and **GitHub** tabs
(Slack is repo-agnostic, so it doesn't have them). The single per-repo
allow-list applies to **both** Linear and GitHub sessions on that
repository — when you set an override under the Linear tab, the same
override shows up under the GitHub tab with a "shared with GitHub" badge,
and vice versa.

Per-repo overrides are independent of the team-level Linear / GitHub
defaults — they're not bounded by them. A repo can both add tools the team
default omits and remove tools the team default grants.

When a repo has its own override, the runtime also pairs it with the
repo's MCP server set (`repository.mcpConfigPath`): the agent's permission
rules and the loaded MCP servers always travel as a unit. Repositories
without an override inherit the team-level `linearAllowedTools` /
`githubAllowedTools` and the team-level MCP config lists.

## MCP servers

Custom integration MCP servers ([added under `/integrations`](/integrations/mcps))
are gated through these same per-platform allow-lists. When you connect a
custom MCP and select which of its tools should be available, the Cyrus webapp
writes the chosen entries (`mcp__<slug>__<tool>`) into whichever
platform tabs you've authorized the integration for. Toggling a tool on or
off from `/settings/tools` is what enables or disables it for that surface
— it is the single source of truth.

The "Manage allowed tools" item in each MCP's dropdown on `/integrations`
links straight to `/settings/tools` so you can adjust the gating from one
place.

## Per-tool narrowing

Every entry on these tabs follows Claude Code's permission-rule syntax,
which lets you narrow a tool to specific arguments instead of granting it
blanket access:

* `Bash(npm run build)` — only allow `npm run build`, not arbitrary shell
* `Read(/src/**)` — restrict reads to a glob
* `WebFetch(domain:docs.linear.app)` — restrict web fetches to a domain

Click the small expand affordance on any row in the grid to set narrowing
rules for that tool. The Bash section shows "N approved command(s)" when
any rules are present.

## Defaults

* **Slack default** — the curated read-only set described above, plus the
  workspace MCP prefixes Cyrus needs to reply in-thread.
* **Linear default** — full Claude Agent SDK toolset (Read, Edit, Write,
  Bash, Task, web tools, plan / worktree management, AskUserQuestion,
  push notifications, the full Task and Cron lifecycle, monitoring tools,
  team-create / team-delete, plus `mcp__linear`, `mcp__cyrus-tools`,
  `mcp__cyrus-docs`, and `mcp__slack`).
* **GitHub default** — same shape as Linear, minus `mcp__slack`.

Hit **Reset to Defaults** on any tab to revert that platform to its baseline
without touching the other two.
