Bureau uses a YAML-based configuration system with a three-tier hierarchy that allows team-wide defaults while supporting personal overrides.
Important
open-bureau must be re-run after editing any config values in any of the configuration sources used by Bureau.
Contents:
- Configuration sources and precedence
- Settings
- Environment variable overrides
- Examples
- Security note for subagents spawned via PAL MCP's
clink - Related commands
Configuration is loaded and merged in this order (later sources override earlier):
| Priority | File | Purpose | Tracked by git? |
|---|---|---|---|
| 1 (lowest) | charter.yml |
Fixed system defaults | Yes |
| 2 | directives.yml |
Streamlined collection of team-/user-oriented settings that are often tweaked | Yes |
| 3 | local.yml |
Personal overrides | No |
| 4 (highest) | Environment variables | Runtime overrides (should be used rarely; for more persistent personal overrides, use local.yml) |
N/A |
- Don't edit unless you're changing upstream service endpoints or package conventions.
- These are values that rarely (if ever) need changing.
-
Read to see examples of how to set config values (to then override in your
local.yml). -
Edit to change team-wide defaults like retention periods, enabled agents, ports, or paths.
- Changes here affect everyone using that particular Bureau installation.
Create and write to this file for personal overrides that shouldn't be shared, e.g.:
- custom workspace paths
- custom retention periods for memories (configured per-MCP)
- disabling Bureau configuration for agent CLIs you don't use
File: directives.yml
List of CLI agents that Bureau should configure during setup.
agents:
- claude # Claude Code
- gemini # Gemini CLI
- codex # OpenAI Codex CLI
- opencode # OpenCodeRemove an agent from the list to skip configuring it. Note that the CLI's config directory must also exist (e.g., ~/.claude/ for Claude Code).
File: directives.yml
MCP tool permissions.
mcp:
auto_approve: no # yes/true or no/falseWhen set to yes or true, agents won't prompt for permission before using MCP tools and other common functionality (e.g. trivial bash commands). This is convenient for trusted setups but bypasses the safety confirmation dialogs.
Accepted values:
yesortrue- Enable auto-approvalnoorfalse- Require manual approval (default)
File: directives.yml
Configures the PAL MCP server's clink tool, which spawns subagents across different coding CLIs (Claude, Codex, Gemini). These settings control which models are used and which role prompts are available.
Baseline set of role prompts made available to ALL coding CLIs.
pal:
base-roles: all # options: "all", "none", or list of role namesValues (these also apply to extra-roles below):
all- All discovered roles fromagents/role-prompts/none- No roles (except the default role)[list]- Explicit list of role names corresponding to filestems inagents/role-prompts/(e.g.,[architect, debugger])
Each CLI has its own configuration block with model and role settings.
The options (with their default values) are shown below:
Claude:
pal:
claude:
model: sonnet # Any valid Claude model
extra-roles: none # Extra roles beyond base-roles to include for ClaudeCodex:
pal:
codex:
model: gpt-5.2-codex # Any valid Codex model
effort: medium # Options: minimal, low, medium, high, xhigh
extra-roles: none # Extra roles beyond base-roles to include for CodexGemini:
pal:
gemini:
extra-roles: none # Extra roles beyond base-roles to include for GeminiFile: directives.yml
Retention periods for each memory backend. Memories older than these thresholds are automatically moved to trash during cleanup.
retention_period_for:
claude_mem: 30d # Claude-mem SQLite database
serena: 90d # Serena project memories
qdrant: 180d # Qdrant vector database
memory_mcp: 365d # Memory MCP knowledge graphStorage backends and cleanup methods:
| Backend | Default retention period | Cleanup method |
|---|---|---|
claude_mem |
30d | SQLite DELETE + VACUUM |
serena |
90d | Move .md files to trash |
qdrant |
180d | REST API scroll + delete |
memory_mcp |
365d | JSONL file rewrite |
Duration format: <number><unit> where unit is:
h- hours (e.g.,24h)d- days (e.g.,30d)w- weeks (e.g.,2w)m- months (e.g.,3m)y- years (e.g.,1y)always- disable cleanup for this storage
File: directives.yml
Controls automatic cleanup behavior.
cleanup:
min_interval: 24h # Minimum time between cleanup runsCleanup runs automatically on ./bin/open-bureau if enough time has passed since the last run.
File: directives.yml
Controls the soft-delete trash system.
trash:
grace_period: 30d # Time before trash is permanently deletedDeleted items go to .archives/trash/ and remain recoverable until the grace period expires.
File: directives.yml
Timeouts for startup operations (in seconds).
startup_timeout_for:
mcp_servers: 200 # MCP server startup timeout
docker_daemon: 120 # Docker daemon startup timeoutIncrease these values on slower machines.
File: directives.yml
Ports for locally-run servers and containers.
port_for:
qdrant_db: 8780 # Qdrant database
qdrant_mcp: 8782 # Qdrant MCP server
sourcegraph_mcp: 8783 # Sourcegraph MCP server
semgrep_mcp: 8784 # Semgrep MCP server
serena_mcp: 8785 # Serena MCP serverChange these if you have port conflicts.
File: directives.yml (user-tunable) and charter.yml (package defaults)
File and directory paths used by Bureau and its tools.
| Setting | Default | Description |
|---|---|---|
workspace |
~/code |
Base workspace directory; other paths derive from this |
serena_memories_root |
(= workspace) |
Root directory for scanning Serena memory files (used for Bureau-run cleanup only) |
fs_mcp_whitelist |
(= workspace) |
Directory boundary for Filesystem MCP access |
mcp_clones |
.mcp-servers/ |
Clone location for MCP server source code |
storage_for.claude_mem |
~/.claude-mem/claude-mem.db |
Claude-mem SQLite database path |
storage_for.memory_mcp |
~/.memory-mcp/memory.jsonl |
Memory MCP knowledge graph storage |
storage_for.qdrant |
~/.qdrant/storage |
Qdrant Docker volume mount point |
Note
When workspace is set, the following paths are automatically derived from it (unless explicitly overridden):
serena_memories_root→ same asworkspacefs_mcp_whitelist→ same asworkspace
This means you only need to configure workspace in local.yml to change all workspace-related paths at once.
path_to:
# User-tunable paths
workspace: ~/code # Base workspace directory
serena_memories_root: ~/code # Root for scanning Serena memory files (used by Bureau-run cleanup only)
fs_mcp_whitelist: ~/code # Filesystem MCP security boundary
mcp_clones: .mcp-servers/ # MCP server clone location (in repo root)
# Storage paths for memory backends
storage_for:
claude_mem: ~/.claude-mem/claude-mem.db # Claude-mem SQLite database
memory_mcp: ~/.memory-mcp/memory.jsonl # Memory MCP JSONL storage
qdrant: ~/.qdrant/storage # Qdrant Docker volume mountFile: charter.yml
Cloud-hosted MCP service endpoints.
endpoint_for:
sourcegraph: https://sourcegraph.com
context7: https://mcp.context7.com/mcp
tavily: https://mcp.tavily.com/mcp/?tavilyApiKey=${TAVILY_API_KEY}These rarely need changing unless you're using self-hosted instances.
File: charter.yml
Qdrant vector database settings.
qdrant:
collection: coding-memory # Collection name
embedding_provider: fastembed # Embedding model providerSome configuration values can be overridden via environment variables:
| Environment Variable | Overrides | Description |
|---|---|---|
BUREAU_WORKSPACE |
path_to.serena_memories_root |
Root for scanning Serena memory files |
MEMORY_MCP_STORAGE_PATH |
path_to.storage_for.memory_mcp |
Memory MCP storage path |
CLAUDE_MEM_STORAGE_PATH |
path_to.storage_for.claude_mem |
Claude-mem database path |
QDRANT_STORAGE_PATH |
path_to.storage_for.qdrant |
Qdrant storage directory |
QDRANT_COLLECTION_NAME |
qdrant.collection |
Qdrant collection name |
QDRANT_EMBEDDING_PROVIDER |
qdrant.embedding_provider |
Embedding provider |
Create local.yml:
agents:
- claude
- gemini
# codex and opencode omitted = not configured# local.yml
mcp:
auto_approve: yes# local.yml
retention_period_for:
claude_mem: 90d
qdrant: 365d
memory_mcp: always # Always keep# local.yml
path_to:
workspace: ~/Projects # All other paths derive from this automaticallyOr if you need to override individual paths:
# local.yml
path_to:
workspace: ~/Projects
mcp_clones: ~/CustomMCPLocation # Override the default (.mcp-servers/ in repo root)For example, if port 8780 (the default Qdrant DB listening port) is already in use on your device, you could do:
# local.yml
port_for:
qdrant_db: 9780When you delegate tasks via clink, the spawned CLI (Claude, Codex, or Gemini) runs with flags that bypass interactive approvals:
| CLI | Flag | Effect |
|---|---|---|
| Claude | --permission-mode acceptEdits |
Auto-accepts file edits |
| Codex | --dangerously-bypass-approvals-and-sandbox |
Bypasses all safety checks |
| Gemini | --yolo |
Permissive mode (auto-approve) |
This is intentional:
- Subagents are spawned programmatically (whether autonomously or via explicit prompting) by a parent agent that already has your trust.
- Requiring interactive approval for each subagent action would break the automation flow: the whole point of delegation is autonomous execution.
Stash/commit changes before delegating complex tasks. If you need stronger isolation, direct agents to run clink-spawned agents in worktrees with fresh branches, merging the subsequent changes only if they're approved by you.
Also, don't delegate commands you wouldn't run yourself; the parent agent's judgment is only as strong as yours.
| Command | Description |
|---|---|
./bin/open-bureau |
Start Bureau (runs cleanup if needed) |
./bin/bureau-prune |
Manually run cleanup |
./bin/bureau-empty-trash |
Permanently delete trash contents |
./bin/bureau-wipe <storage> |
Wipe a storage backend |
./bin/check-prereqs |
Verify prerequisites are installed |