claude-profile
Use Claude Code with a separate profile for each customer, on Windows, macOS and Linux. Each profile has its own:
- sign-in or API key
- AI platform
- MCP servers
- skills and plugins
- session history and memory
Customers can run side by side in separate terminals. Switching never touches a session that's already running, and one customer's Jira or Confluence server never shows up in another customer's session.
claude-profile doesn't change anything machine-wide. Your normal claude and ~/.claude keep working exactly as before, and appear as the default profile.
It's pure Python 3.10+ with no dependencies beyond the standard library.
Install
From PyPI:
pipx install claude-profile # or: uv tool install claude-profile or: pip install claude-profile
claude-profile install # optional: adds the "Claude Profiles" Start menu picker on Windows
Without Python: download a standalone binary from Releases and run it once with install, which puts it in ~/.local/bin:
claude-profile-windows-amd64.execlaude-profile-macos-arm64claude-profile-linux-amd64
Each release has SHA256SUMS and build provenance you can check with gh attestation verify <file> --repo CloudOpsWorld/claude-profile.
From source:
python claude_profile/cli.py install
This copies the single file to ~/.claude-profile/app and puts a launcher in ~/.local/bin.
To remove claude-profile, run claude-profile uninstall (or pipx uninstall claude-profile). Your profiles are kept.
Upgrading from 1.x: versions 1.x used the command claudectl and kept data in ~/.claudectl. From 2.0 everything is named claude-profile. If you made profiles with 1.x, close their sessions and rename ~/.claudectl to ~/.claude-profile. Then run claude-profile install once so every profile's status line points at the new command.
Daily use
claude-profile add acme # guided: name, AI platform, key or sign-in, bind this folder
cd ~/work/acme-repo
claude-profile # starts Claude Code as ACME, because the folder is bound
claude-profile tab globex # new terminal tab locked to Globex
claude-profile acme --resume # any claude arguments pass through
claude-profile mcp add jira -- npx -y <jira-mcp> # goes into this folder's profile only
claude-profile list # profiles, bound folders, active profile, Desktop profile
- Bound folders pick the profile automatically. If you start a different profile inside a bound folder, claude-profile asks before continuing.
- Everywhere else,
claude-profileuses the active profile. Set it withclaude-profile use <name>. - Every session shows its customer in Claude Code's status line and in the tab title.
- On Windows, tabs open in Windows Terminal with the customer's color. macOS uses Terminal.app. Linux uses the first terminal it finds: GNOME Terminal, Konsole, kitty, WezTerm, Alacritty or Xfce Terminal.
Import your existing setup
claude-profile import --scan # just show what's in your current Claude setup
claude-profile import # guided: sort project folders into customer profiles
What the scan finds:
- every project folder Claude has history for (worktrees are folded into their repo)
- MCP servers, both user-wide and per-project
- skills, agents, commands and output styles
- your
CLAUDE.md, plugins and preferences - Claude Desktop's MCP servers
- leftovers from older switcher scripts: extra
~/.claude-*config folders, system-wideANTHROPIC_*variables, and lines in your PowerShell or shell profile
It skips temporary folders, folders that no longer exist, your home folder and drive roots.
The guided import suggests customers from your folder layout. D:\work\acme\api and D:\work\acme\web become one acme profile, tied to D:\work\acme. You can:
- press Enter to accept each suggestion
- type a name to rename it or merge it into another profile
- press
kto keep those folders in your default setup
Then you pick:
- the AI platform for each new profile
- which profiles get which MCP servers
- whether new profiles get your skills,
CLAUDE.md, preferences and plugins (plugins are reinstalled cleanly in each profile)
It only copies. Each project's history, memory, prompt history, trust settings and per-project MCP servers go into its profile. Your current setup isn't changed, so it's safe while Claude is running.
Your own sign-in, account details and caches are never copied into a customer profile. The one exception: a ~/.claude-* folder left by an older switcher is adopted whole, including its sign-in, because that sign-in belongs to the customer.
You can also work from a file, which is handy for many folders or for repeating the import:
claude-profile import --plan plan.json # write the suggestions to a file you can edit
claude-profile import --apply plan.json --dry-run # show what would happen
claude-profile import --apply plan.json # copy
claude-profile import --apply plan.json --move # copy, then take it out of the default setup
Running --apply again is safe: it never overwrites anything and doesn't duplicate history.
--move removes the imported customer folders, history and MCP servers from your default setup:
- It refuses while any Claude Code session is running, including Desktop's Code tab.
- It backs up your config first.
- It puts everything it removes in
~/.claude-profile/import-backups/. - Desktop's Code tab uses your default setup, so moved history no longer shows up there.
--from DIR imports from another Claude config folder instead of ~/.claude.
AI platforms
| Platform | How it connects |
|---|---|
| Claude subscription: Pro, Max, Team, Enterprise | Browser sign-in on first start. You can lock it to the customer's org UUID. |
| Anthropic API key | Pay per use. |
| DeepSeek | Native Claude-compatible endpoint. |
| OpenRouter | GPT, Gemini and others. Use this for OpenAI customers, with BYOK for their own OpenAI key. |
| Any Claude-compatible URL | For example a LiteLLM proxy in front of a direct OpenAI key, Moonshot, Z.ai or a company gateway. |
| AWS Bedrock, Google Vertex | Claude through the customer's own cloud account. |
To add a platform, create ~/.claude-profile/providers.json: a JSON list of entries in the same shape as BUILTIN_PROVIDERS at the top of claude_profile/cli.py. An entry with an existing id replaces the built-in one. To change a profile's models, run claude-profile edit <name>.
Where API keys are stored:
- Windows: encrypted with DPAPI, so only your Windows user can read them.
- macOS: in your login Keychain.
- Linux: in your keyring through
secret-tool. Without a keyring, in a file only you can read.
Claude Desktop
Desktop holds one sign-in at a time, so it switches with a restart:
- Quit Desktop.
- Run
claude-profile desktop acme. - Start Desktop.
This swaps the local MCP servers in Desktop's config. Each customer's servers are saved automatically when you switch away.
Cloud connectors added on claude.ai belong to the signed-in account and follow it. If the customer uses a different Claude account, sign out and back in.
Not isolated: Desktop's own Code tab uses Desktop's built-in Claude Code and login. Do isolated customer work in a terminal with claude-profile.
Where things live
Everything is in ~/.claude-profile, on every OS. On Windows this is deliberately not AppData: Microsoft Store Python redirects new files there into a private folder that Claude Code can't see.
Each profile lives in ~/.claude-profile/profiles/<name>/:
profile.json: platform, models, how the key is storedconfig/: Claude Code's own folder for this customer (login, MCP, skills, plugins, history, memory)desktop-mcp.json: this customer's Claude Desktop MCP servers
Set CLAUDE_PROFILE_HOME to put the data folder somewhere else.
Metadata
Release files for claude-profile 2.0.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 | Provenance | Actions |
|---|---|---|---|---|
| claude_profile-2.0.0.tar.gz | 39.9 kB | With provenance | Details for claude_profile-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| claude_profile-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for claude_profile-2.0.0-py3-none-any.whl |
Total release size: 70.5 kB
Release files / claude_profile-2.0.0.tar.gz
| Download URL | claude_profile-2.0.0.tar.gz |
|---|---|
| Size | 39.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
141866bbf89fe302fdda42637770edb5237be59de3fd80228f3394338f93e654
|
|
BLAKE2b-256 checksum How to use checksums |
a6c7ecf1ba2b179ee931e18dbeda487a8e825eb31704094d667ff592c6aed90e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 26, 2026.
Transparency logRelease files / claude_profile-2.0.0-py3-none-any.whl
| Download URL | claude_profile-2.0.0-py3-none-any.whl |
|---|---|
| Size | 30.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5ae1d60a4a3ea4b182c811ed2bc13b8a7a1234e4c7d7deafa4e0fce190f3dd1e
|
|
BLAKE2b-256 checksum How to use checksums |
86b763cb6ff3edc2512dee596938bea42252b248268fab0e304a903cdf612ed0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 26, 2026.
Transparency logSecurity for claude-profile 2.0.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for claude_profile-2.0.0.tar.gz
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 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.