Automated installers and an environment configuration framework for Claude Code on Windows, macOS, and Linux.
Define your complete Claude Code environment in a single YAML file -- custom agents, MCP servers, slash commands, hooks, skills, settings, and more -- and install everything with one command.
Features
- Custom agents -- specialized subagents for code review, research, debugging, and any workflow you design
- MCP servers -- HTTP, SSE, and stdio transports with scope-based registration; unchanged servers are skipped on reruns, preserving their OAuth authentication
- Slash commands -- custom commands for frequently used workflows
- Rules -- user-scope rule files for coding standards, security policies, and project conventions
- Skills -- multi-file skill packages for complex agent capabilities
- System prompts -- replace or append to the default Claude Code prompt in the commands an isolated profile installs
- Hooks -- five hook types: command (shell scripts, shell or exec form), HTTP (webhooks), prompt (LLM evaluation), agent (subagent with tools), and MCP tool (a tool on a configured MCP server), plus shared helper modules delivered beside the hook scripts
- User and global settings --
user-settingsis rawsettings.jsoncontent (camelCase keys) andglobal-configis raw~/.claude.jsoncontent, covering model selection, permissions, effort levels, thinking mode, environment variables, and every other Claude Code setting - Status line -- custom status bar scripts for real-time session information
- Configuration inheritance -- extend and override parent configurations with selective per-key merge
- Component selection -- author-defined component groups the end user picks at setup time, interactively (checkbox picker) or via
--select/--with/--without; unclaimed items stay mandatory - Isolated profiles --
command-namesinstalls a configuration as a separate profile under~/.claude/{cmd}/with its own commands, settings,.claude.json, MCP registrations, and environment loaders; a session of the profile reads nothing from the base profile's~/.claudewherever you start it, in your home folder included, because the profile'sconfig.jsonexcludes the baseCLAUDE.mdand rules in every letter case the folder can be spelled in and, on Windows, under the 8.3 short name of your home folder (the spelling of%TEMP%), and the launcher keeps the basesettings.jsonout of a session started in the home folder (that session also loads noCLAUDE.md,CLAUDE.local.mdor.mcp.jsonof the home folder itself; below the home they load as before) and, on Windows, starts the session in the long spelling of the folder you started in -- wherever that folder is, below your home or outside it, with each 8.3 component replaced by the name on disk and the drive letter returned uppercase (c:\workstarts inC:\work) -- so a path spelled by 8.3 short names (the spelling of%TEMP%) does not let the base profile's skills, agents and commands in, and one folder always reaches Claude Code as one spelling; an isolated install leaves the base profile'ssettings.jsonand.claude.jsonalone, apart from theinstallMethodrecord the Claude Code installer keeps in~/.claude.json, and names every write outside the profile before you confirm: the binary and itsinstallMethodrecord, a version pin and its IDE extension, the update controls, the command wrappers, project-scope MCP servers,files-to-downloaddestinations outside the profile, and the dependency commands - One configuration, many profiles --
--command-names NAME[,ALIAS...]installs any configuration under the names you give, placing its agents, commands, rules, skills, hooks, and launchers in the isolated profile~/.claude/NAME, so one YAML file serves as many profiles as you need;NAME,noneinstalls it under one command, afiles-to-downloaddestination, a dependency command, or anapiKeyHelperthat names the base~/.claudeis re-rooted into the profile and marked[re-rooted]in the summary, and a name another profile or program already holds is refused before anything is written - Re-runs that remember -- an update is the install command run again:
--profile NAMEre-runs an installed profile from its manifest with no configuration argument (basefor the base profile,allfor every installed profile, each in its own run), the configuration plus the primary name does the same, and both keep the aliases and the component choice the install typed while re-reading everything the configuration declares; a leftover environment variable or a different configuration for an existing profile is held back until you consent, and--switch-configaccepts the switch and removes what the previous configuration left behind - Scheduled updates --
auto-update: {time: "HH:MM"}gives every profile installed from the configuration one daily job in the OS scheduler (Task Scheduler, launchd, a systemd user timer or cron) that re-runs its setup throughuvx cc-toolbox@latest, so the profile follows its configuration and every toolbox release on its own; the jobs never overlap, each run leaves a log, the next manual run reports the last scheduled one, and a private configuration is reached through the storedgh/glablogin or a token in the environment the scheduler hands the job - Linked profiles --
--link-dirsand--link-from(or thelink-dirsandlink-fromkeys) take entries of an isolated profile's directory --skills,agents,commands,rules,hooks,output-styles,prompts,projects-- through a directory link from another profile: linkprojectsto share sessions and auto-memory with the base profile or any other, or linkallto run a second command on the content of a profile installed from the same configuration, which then follows every re-run of its source, refreshes the source first when it is given a configuration its source has not installed yet, takes the files the configuration downloads into a linked directory from the link instead of writing them again, and leaves the Claude Code install, the IDE extension, Node.js and the dependency commands its source runs to the source's run, naming each before you confirm; a profile that links only some content entries leaves the installs to the source and runs every command, because a tool such as the skills CLI writes into the profile that runs it;--run-all-commandsmakes such a profile do all of that itself - Dependency management -- platform-specific package installation (apt, brew, choco, and more), Node.js LTS on request, and a warning when an older npm left in the npm global prefix runs instead of the npm bundled with Node.js
- File downloads -- arbitrary files downloaded to specified destinations during setup
- Private repository support -- GitHub and GitLab authentication through
GITHUB_TOKEN,GITLAB_TOKENorREPO_TOKEN, or the stored login of theghorglabCLI - Cross-platform -- consistent behavior across Windows, macOS, and Linux
- One-command setup -- everything from a single YAML configuration file
- PyPI distribution -- the same setup and installer, runnable as
uvx cc-toolboxon any machine with uv
Quick Start
Example Configuration
name: "My Development Environment"
command-names:
- "my-env"
# Base URL for downloading agents, commands, hooks, and other files
base-url: "https://raw.githubusercontent.com/my-org/my-configs/main"
agents:
- "agents/code-reviewer.md"
slash-commands:
- "commands/review.md"
rules:
- "rules/coding-standards.md"
mcp-servers:
- name: "context-server"
transport: "http"
url: "http://localhost:8000/mcp"
# ${VAR} in a header is stored as-is and expanded by Claude Code at runtime,
# so the token stays in your environment, never in the config file.
header: "Authorization: Bearer ${CONTEXT_SERVER_TOKEN}"
# user-settings holds raw settings.json content with camelCase keys
user-settings:
model: "sonnet"
effortLevel: "high"
command-defaults:
system-prompt: "prompts/system-prompt.md"
mode: "append"
# Re-run this setup every day at 03:30 local time through the OS scheduler
auto-update:
time: "03:30"
hooks:
files:
- "hooks/linter.py"
# Shared modules the hook scripts import from their own directory
helpers:
- "hooks/hook_config_loader.py"
events:
- event: "PostToolUse"
matcher: "Edit|MultiEdit|Write"
type: "command"
command: "linter.py"
This creates a global my-env command that launches Claude Code with your custom agents, MCP servers, and hooks. See the Environment Configuration Guide for all configuration keys.
Install Your Environment
Host your YAML configuration in a repository, then run a single command to set everything up:
Linux:
export CLAUDE_CODE_TOOLBOX_ENV_CONFIG='https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' && curl -fsSL https://raw.githubusercontent.com/alex-feel/claude-code-toolbox/main/scripts/linux/setup-environment.sh | bash
macOS:
export CLAUDE_CODE_TOOLBOX_ENV_CONFIG='https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' && curl -fsSL https://raw.githubusercontent.com/alex-feel/claude-code-toolbox/main/scripts/macos/setup-environment.sh | bash
Windows:
powershell -NoProfile -ExecutionPolicy Bypass -Command "`$env:CLAUDE_CODE_TOOLBOX_ENV_CONFIG='https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml'; iex (irm 'https://raw.githubusercontent.com/alex-feel/claude-code-toolbox/main/scripts/windows/setup-environment.ps1')"
Any platform, via PyPI (requires uv):
uvx cc-toolbox setup 'https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml'
# Private repositories: pass tokens inline with --env, or export them as regular environment variables
uvx cc-toolbox setup 'https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' --env GITHUB_TOKEN=ghp_your-token --env GITLAB_TOKEN=glpat-your-token
# The same configuration as a second isolated profile with its own command
uvx cc-toolbox setup 'https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' --command-names my-env-2
# Update that profile later: its manifest remembers the configuration, the aliases and the components
uvx cc-toolbox setup --profile my-env-2
# Update every installed profile, the base first
uvx cc-toolbox setup --profile all
# A profile that shares the sessions and auto-memory of the base profile
uvx cc-toolbox setup 'https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' --command-names my-env-3 --link-dirs projects
# A second command on the content of my-env-2, refreshed whenever my-env-2 is; the binary, the shared tools and the
# other work my-env-2's run does for the machine are left to that run
uvx cc-toolbox setup 'https://raw.githubusercontent.com/your-org/your-repo/main/config.yaml' --command-names my-env-4 --link-dirs all --link-from my-env-2
# The same profile, this time installing the binary and running every dependency command itself
uvx cc-toolbox setup --profile my-env-4 --run-all-commands
For a persistent cc-toolbox command, install it once with uv tool install cc-toolbox (or pipx install cc-toolbox).
You can also use a local file (./my-config.yaml) or a configuration from a private repository. See the Environment Configuration Guide for all options including authentication.
Ready-Made Configurations
Browse the claude-code-artifacts-public repository for ready-made environment configurations. Find a configuration you like, copy its raw URL, and use it as the CLAUDE_CODE_TOOLBOX_ENV_CONFIG value in the commands above.
See Ready-Made Configurations for installation examples.
Installing Claude Code
If you just need the Claude Code CLI without a custom environment configuration, the toolbox includes standalone installers that use the official Anthropic native installer with automatic npm fallback. With uv present, uvx cc-toolbox install runs the same installer from PyPI.
See the Installing Claude Code guide for platform-specific commands and options.
Documentation
- Environment Configuration Guide -- complete reference for YAML configuration files with all keys, authentication, inheritance, and more
- Installing Claude Code -- standalone Claude Code installation, methods, and troubleshooting
Security
Environment configurations can execute commands on your system, download files, and configure MCP servers. Only use configurations from sources you trust.
Local files are under your control. Remote URLs should be verified before use. The setup script displays a confirmation prompt and flags sensitive paths before proceeding.
See the Security Considerations section for details.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
License
MIT License -- see LICENSE for details.
Disclaimer
This is a community project and is not officially affiliated with Anthropic. Claude Code is a product of Anthropic, PBC.
Getting Help
- Bug reports: Report a bug
- Feature requests: Suggest a feature
- Documentation issues: Report a docs issue
- Questions: Ask a question
Metadata
Release files for cc-toolbox 8.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cc_toolbox-8.1.0.tar.gz | 346.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cc_toolbox-8.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 642.9 kB
Release files / cc_toolbox-8.1.0.tar.gz
| Download URL | cc_toolbox-8.1.0.tar.gz |
|---|---|
| Size | 346.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
536346af4937ced3a77b2c1b9187545a01e6d7bc8fd0c2c48436e24618009df3
|
|
BLAKE2b-256 checksum How to use checksums |
b7c1c50f09ba26f83448769fb141a411dab81c10da2f25534ba4feaab8886aca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency logRelease files / cc_toolbox-8.1.0-py3-none-any.whl
| Download URL | cc_toolbox-8.1.0-py3-none-any.whl |
|---|---|
| Size | 296.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
75f61282404fa8252b3e5bc4ed4ea02e03427b6e2987b8e0d9cb0fcdbc51c93e
|
|
BLAKE2b-256 checksum How to use checksums |
ad752d87637dad07d8a555bc4aeeb1a0440a9764c3bcf745a2df55f4b6a90ed2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency log