Server data from the Official MCP Registry
Route coding work across Claude Code, Codex, Cursor, and OpenCode with shared context.
About
Route coding work across Claude Code, Codex, Cursor, and OpenCode with shared context.
Security Report
Valid MCP server (2 strong, 1 medium validity signals). 1 known CVE in dependencies ⚠️ Package registry links to a different repository than scanned source. Imported from the Official MCP Registry. Trust signals: 3 highly-trusted packages. 1 finding(s) downgraded by scanner intelligence.
12 files analyzed · 2 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Required
This plugin requests these system permissions. Most are normal for its category.
How to Install
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-razzant-claudexor": {
"args": [
"-y",
"claudexor"
],
"command": "npx"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
Claudexor
Claudexor is a local-first control plane for the AI coding agents you already pay for. It runs Codex CLI, Claude Code, Cursor CLI, OpenCode, Antigravity CLI, Grok Build, and raw API adapters behind one typed interface: a chat of turns where read-only questions resume the vendor's own native session, write turns land as inspectable patches or complete file manifests, races pit harnesses against each other with cross-family review, and every claim — cost, quota, web evidence, auth route — is a typed fact you can audit, never a vibe.
Compared to driving a bare Codex or Claude Code session, Claudexor adds the
layer the vendors do not ship: best-of-N races with independent reviewers and
arbitration; honest budget/quota accounting (unknown cost is never $0);
deterministic gates and protected paths; and — since 2.1 — credential
profiles: named Antigravity/Claude/Codex/Cursor/Grok Build subscription
bindings side by side, each with Claudexor-scoped state and platform-declared credential
custody. Live subscription-quota tracking — and the opt-in policy that rotates
a spent account out of the way on typed vendor limits — covers the harnesses
with a vendor quota source (Antigravity, Claude, and Codex). Cursor's internal
dashboard supplies dated monetary resources, not an execution-quota verdict.
Everything runs on your machine, files are the source of truth, and there is no telemetry.
Current status: v5.0.2. See "Stability at 2.0" below for what is a stable contract and what remains experimental; retired verbs and mode ids hard-error with the new spelling instead of silently aliasing.
Claudexor also runs as the exact-pinned delegated execution layer inside Ouroboros, a persistent self-developing agent. Ouroboros owns its tasks, memory, review, and final integration. Claudexor runs the connected coding harnesses and returns durable execution evidence. See Ouroboros in action.
Embedding callers can also make a single model request through a managed Codex subscription, using the same account as Agents. The caller supplies its own system prompt and tools and executes those tools itself. This is a typed engine operation, not a public OpenAI-compatible server or a second agent loop. Model catalogs and context limits are account-specific; subscription access does not guarantee zero incremental charges or enable provider-paid credits. See model operations for the transport, retention and unsupported-parameter contract.
Thanks to Praxis Relay and CLIProxyAPI for prior work exploring subscription-backed model transports. They informed this design; neither runs as an embedded relay or owns credentials in this integration.
If you use Claudexor — or you are an agent whose human does — a star is the one-click way to say it works.


- Prerequisites
- Install
- Remote SSH
- Quickstart
- Modes
- Accounts And Quota
- Web, Budgets, And Gates
- Routing, Auth, And Secrets
- Daemon And Control API
- Artifact Layout
- Integrations
- Architecture
- Development
- Stability at 2.0
- For External Agents
- Privacy
- Uninstall / where your data lives
Prerequisites
- Node.js >= 24.15 (the daemon, CLI, and every surface run on Node)
- pnpm (via corepack:
corepack enable pnpm) - Git for Git-backed worktrees, candidate envelopes, and source-control delivery. Explicit directory execution supports direct work and selected-input copies without Git; Doctor reports Git availability, and the app's Workspace Git check explains whether a Git-backed shape is admitted.
- At least one logged-in vendor CLI —
codex,claude,cursor-agent(or Cursor’sagent),opencode,agy(Antigravity, for a Gemini subscription), orgrok(Grok Build, for a grok.com subscription) — OR a provider API key (adapters acceptOPENAI_API_KEY,ANTHROPIC_API_KEY, ... as fallbacks; the raw-API route needs only a key). Log in through Claudexor, not the bare vendor CLI — see Install And Login - macOS for the desktop app; the CLI/daemon also run on Linux
Install
CLI + daemon from npm (installs the claudexor and claudexord bins):
npm install -g claudexor
claudexor doctor
pr delivery requires the pinned publication scanner, which the npm packages do
not bundle. Prepare it once with claudexor scanner prepare, or offline from the
official archive with claudexor scanner prepare --from-archive <file>; a running
daemon picks it up at its next pr. See
Publication scanner.
You can also build from source — see Quickstart below.
On a Mac, the app is the easiest way in — it ships as a signed and notarized DMG, so it installs like any ordinary Mac app, with no Gatekeeper warnings:
- Download
Claudexor-<version>.dmgfrom Releases. - Drag
Claudexor.appintoApplications. - Open it. The app starts its bundled Claudexor engine, then onboarding checks the external Git and harness route needed by the work you select.

The app bundles its own daemon runtime and starts it on launch; installing the Claudexor CLI is only needed for terminal use. Git and vendor harnesses remain separate capabilities checked before a run starts. (The v1.0.0 DMG was unsigned — if you kept it, either upgrade or approve it via System Settings → Privacy & Security → Open Anyway.)
Host integrations may install one vendor CLI into Claudexor's managed local
toolchain with
claudexor harness install <harness> --target local --yes --json; a host may
bind that explicit unattended authorization to the user's Connect action.
Npm recipes install exact selected versions under ~/.claudexor/node;
Codex resolves latest once by default; --release-tested explicitly selects
the separately tested baseline instead of that lookup (a runnable managed copy
at or above it is kept; installing it still needs the npm registry), and an
unavailable registry refuses instead of falling back. Cursor remains unpinned, so its JSON
receipt records the downloaded installer's SHA-256 and byte length.
Every successful executed receipt also records the absolute installed launcher
and its verified version; a zero-exit installer without that postcondition is a
typed failure. On Windows, Codex and Claude use the npm package's declared
native or Node entrypoint. Doctor, login and runs share that selection, including
ordinary user npm prefixes on PATH. The receipt identifies the vendor entrypoint;
launch it through Claudexor so Node entrypoints retain their interpreter and
arguments. Custom batch programs are not treated as standard npm wrappers.
Omitting --target preserves the disclosed remote-host flow, its prefix and
its exit-code contract; the install lease and the post-install proof are part
of the unattended local contract and do not apply there.
Remote SSH
The macOS app can run a thread on a Linux or macOS SSH host while keeping the
UI local. In Settings → Connections, pick a concrete alias from
~/.ssh/config or create one in-app — the form appends a plain Host block
to ~/.ssh/config (after a timestamped backup), never a key or password.
Connect it, then choose a saved folder or Browse on <host>… from the
project picker. The thread is permanently bound to that
host and folder; changing either creates a new draft.
Claudexor uses the system /usr/bin/ssh, so existing keys, ssh-agent,
known_hosts, MFA and ProxyJump remain OpenSSH's responsibility. On first
connection the app verifies and installs a signed, no-sudo runtime under
~/.claudexor/remote/, then reaches its loopback-only control API through an
SSH local forward. Vendor CLIs and their credentials remain on the server and
with the vendors. Claudexor can install a harness CLI on the host for you
through a disclosed, exact-version flow — claudexor harness install, or
Settings → Harnesses for a connected host: Claude, Codex, GitHub Copilot and
OpenCode install one exact npm version that the host's runtime selects and
shows before confirmation (a current runtime resolves Codex's npm latest once;
the others use their release baseline), while the Cursor and Antigravity vendor
scripts are downloaded in full and run in the visible terminal where you watch
them; nothing is installed before the exact package/version/destination install
recipe is disclosed and confirmed. An embedding host may instead pass
--target local --yes, which installs into the managed toolchain root and
must prove the launcher it installed before reporting success.
(Installing them on the host yourself works too.) Then sign in from the app,
which runs each vendor's own login in an embedded SSH terminal (Codex uses
device auth). Remote threads include an embedded SSH terminal and an
explicit-port preview tunnel.
Updates
v3.8.0, v3.9.0 and v3.9.7 release exceptions. These owner-authorized releases omit the three custom Ed25519 documents rather than publishing unsigned substitutes. Existing app installs therefore cannot take the in-place engine update to those versions, and the app cannot perform a first-time remote bootstrap from those releases. A fresh signed/notarized DMG, npm packages, and reviewed exact-pin embedders remain usable; normal releases keep the signed-manifest path below fail-closed (the client verifiers themselves stay fail-closed for the waived versions too).
- macOS app — each release publishes a
claudexor-runtime-<version>.tar.gzclosure (the bundled daemon and CLI, setup-login runner, Browser MCP, and native process-identity helper; Node, UI, and icons stay outside it) plus a signedruntime-manifest.jsondescribing it. On foreground and from the bottom-left update chip / Check for Updates, the app reads that manifest and, if a newer runtime is offered, surfaces "Update available → vX.Y.Z". One click installs it in place, no new DMG: the app downloads the closure, verifies its SHA-256 against the signed manifest, unpacks it under~/.claudexor/runtime/versions/<version>/, probe-starts it, requires that the engine is confirmed idle (otherwise it refuses and you can try Install again), stops the daemon, swaps the active pointer atomically, relaunches, and confirms the exact new engine accepts normal work — rolling back to the last-known-good runtime when the new engine is wrong or never answers. An engine answering only in recovery mode is reported as such, never as updated or rolled back by the new app; already-installed older apps check identity only and can still report either outcome over a recovery-only engine. The manifest is signed by a dedicated offline key the app pins; an unsigned, unknown-key, tampered, or downgraded manifest is refused. Node stays app-owned, so a Node bump still ships a new signed DMG. There is no background update timer; the check runs only when you open the app or click Check for Updates. The manifest'sminAppVersionfloor means an app that is too old is told to update the app itself rather than offered an incompatible engine. - embedded hosts — the same signed manifest and the same Node-free closure
may be exact-pinned by a host that owns its Claudexor daemon lifecycle. The
archive contains only ordinary directories/files (internal package links are
materialized), so its format needs no POSIX symlink support. The host supplies
the exact full Node toolchain proven by its reviewed pin, launches
claudexord.bundle.cjs, invokes operational commands through the adjacentclaudexor.bundle.cjs, verifies--probeagainst the pinned{version,buildSha}, and uses--stop <observed-version> <observed-buildSha>before replacing a live closure. This is an extraction/daemon-bootstrap contract, not a claim that every harness or interactive login path has feature parity on Windows. The signed manifest is the upstream publication authority used to form that pin; a host may verify it live or rely on its reviewed exact URL/buildSha/SHA-256/size pin.minAppVersionremains the macOS app's compatibility field; embedders keep protocol, one tested Node toolchain, and separate daemon/CLI entrypoint bounds in their pin instead of creating a second Claudexor manifest or trust root. Start and stop must use the sameCLAUDEXOR_CONFIG_DIRand, when overridden,CLAUDEXOR_DAEMON_SOCK, or the lifecycle command may address another daemon. A Windows consumer still owns a native extract/--probe/handshake/--stopsmoke before claiming Windows support. npm-backed local installation additionally requires the toolchain's own npm entrypoint —<node-root>/lib/node_modules/npm/bin/npm-cli.jsbesidebin/nodeon POSIX,node_modules\npm\bin\npm-cli.jsbesidenode.exeon Windows; Claudexor never falls back to anpmfound on ambientPATH. Local Windows installation supports Codex and Claude through their declared native or Node npm entrypoints; other installer recipes retain their typed platform restrictions. - npm — CLI/daemon installs update the ordinary way:
npm install -g claudexor@latest.claudexor release checkreports whether a newer engine runtime is published, verifying the same signed manifest fail-closed (npm users update via npm).
Quickstart
pnpm install --frozen-lockfile
pnpm build
# Run the CLI from the repo (or add an alias/PATH entry for it):
node packages/cli/dist/cli.js doctor
alias claudexor="node $(pwd)/packages/cli/dist/cli.js"
claudexor ask "2+2?"
claudexor ask "google the latest release notes" --web auto
claudexor ask --deep-scan "map this repo's auth and run storage"
# Read bounded saved turns and answer previews from an existing daemon
claudexor thread history <thread-id> --limit 20 --json
claudexor thread prompt <thread-id> <turn-id> --offset 0 --max-bytes 32768 --json
claudexor agent "fix the failing auth refresh test" --harness codex
claudexor best-of "fix add() and keep the patch minimal" --harness codex,claude --n 2
claudexor inspect <run_id>
claudexor follow <run_id> # live event tail of a daemon run; answers questions in the TTY
claudexor apply <run_id> --dry-run
claudexor doctor
claudexor secrets list
claudexor daemon start
apply --dry-run checks the retained result without mutating the target: Git
patches use git apply --check; directory results verify the manifest, complete
content and selected target preimages. Unknown flags and invalid
--access/--web/--effort values fail loudly with exit code 2 — a typo never
silently runs with defaults.
When deterministic gates protect existing test/package surfaces and the task is
explicitly test-authoring work, use --allow-protected-path <glob[,glob...]> to
record typed per-run approval for those protected gate/test path changes. This
does not bypass built-in critical/security human gates.
Processing and ordinary folders
--processing standard|fast|economy requests service for the selected model; it
does not change the reasoning effort or routing goal. Native capabilities and
observed service remain visible, and Fast stays within existing money limits.
See the Processing rule.
--prompt-cache-ttl 5m|1h sets the native prompt-cache lifetime of Claude Code's
main conversation and helpers; omitting it keeps native defaults. See
Prompt-cache lifetime.
Inside an ordinary folder, select directory execution explicitly:
# Copy the complete selected folder, work there, then inspect/apply the result:
claudexor agent "Update the report and its figures" --workspace-kind directory --scope-path . --processing economy
# Work directly in the original folder, recording the selected file footprint:
claudexor agent "Update report.md" --workspace-kind directory --in-place --scope-path report.md
Repeat --scope-path for a narrower copied footprint; omission selects no
existing input files. Selected files are copied and published exactly,
including .env-style or key-shaped project files; leave out anything you do
not want the run to read. Directory
execution never initializes Git. Copied results
retain complete file bytes for later application; direct changes are already in
place and carry no promise of full rollback. Preview limits do not truncate
delivery files. See directory execution
and the feature ledger for current acceptance caveats.
Reviewers and approvals
Ordinary Agent runs skip internal model review by default, whether the executor is pinned or selected automatically. Completed changes remain normally applicable and show Not reviewed; required checks and result-integrity checks still apply. Ask and Plan reject these Agent-only controls; Council is Plan's critique path:
-
Review —
--reviewenables automatic panel selection. Best-of and--until-cleaninclude review. Explicit--attempts Nkeeps its review-based repair default;--no-review --attempts Nrepairs against configured checks and work completion without model reviewers. -
Reviewers — pick exactly who reviews a change. Pass
--reviewer-panela comma-separated list of unpinnedharness=model:effortentries (model and effort are optional); repeat a harness to review through several models. For a deterministic account per slot, use the round-trippable--reviewer-panel-json '<array>'form withcredentialProfileId. Example:--reviewer-panel-json '[{"harness":"claude","model":"claude-fable-5-1","credentialProfileId":"review-claude"}]'. An omitted profile uses the canonical account pool; a named profile is strict and never silently falls back. An explicit panel or reviewer model/effort override enables review without another flag. With--reviewand no panel, the engine chooses a cross-family panel and discloses families it skips. -
Approvals — mark paths that must clear a human before a change touching them can be applied. Set canonical repo-relative globs in the versioned
.claudexor/config.yaml(empty by default):version: 1 constraints: protected_paths: - migrations/** - "**/*.env"Creating, modifying, deleting, or renaming a matching path completes the run but pauses apply for a human decision.
--allow-protected-pathapplies only to engine-derived gate/test paths and cannot suppress these project rules. Before a mutating turn starts, a live project thread with configured project protected paths is promoted one-way to its persistent isolated worktree. The run and patch therefore complete without touching the project tree; only the existing typed thread Apply decision can deliver the accumulated change. Direct one-shot--in-placeagent runs refuse and name the isolation remedy.
Modes
Canonical mode ids (engine strategies are FLAGS, not modes):
ask- read-only answer/explanation route.--deep-scanwidens it into the bounded multi-scout research sweep with synthesis (per-scout findings, omissions, follow-up questions). Also the macOS composer's no-project fallback intent (Agent is the default on a project thread).plan- read-only planning; the plan lifecycle surfaces typed open questions and Implement freezes the plan as a content-hashed contract. Solo is the default;--council(optionally--n N) drafts plans across N harnesses in parallel, then the primary merges them into ONE unified plan whose open questions reach you as a single set (see below).agent- defaultclaudexor agentroute. Strategy flags:--n N(best-of-N race with isolated candidates, review, synthesis, arbitration),--attempts N(repair loop with a hard cap),--until-clean(repair loop until gates/review converge, budget/quota exhausts, cancellation happens, or the run stalls),--create(create-from-scratch intent),--delegate(the delegation belt — see below).
Delegation (agent --delegate)
--delegate (agent-only) injects a SCOPED Claudexor MCP belt into the harness
sandbox so the harness itself decides when to spawn bounded, isolated sub-runs
(the industry pattern: Claude Code's Task tool, Cursor subagents, Codex spawn).
The belt exposes only claudexor_ask / claudexor_plan / claudexor_run
(isolated sub-run) / claudexor_best_of / claudexor_run_status /
claudexor_run_result — there is NO apply/decision/thread/settings tool, so the
PARENT integrates results in its own workspace. Policy is enforced server-side
at the tool boundary: nesting depth is 1 (a sub-run cannot itself delegate),
sub-runs are capped per parent (default 8), and each sub-run draws from the
same live daemon-owned paid-budget authority as its parent. Reservations and
settlements are enforced across the whole family; each child reports its own
spend while the parent reports the aggregate. Only harnesses whose adapter declares
capability_profile.mcp_injection (claude, codex, cursor) can host the belt. The flag is
permission, not a requirement to create a child. Readiness and the final
requested/effective/used outcome are engine-projected: a known pre-start
incompatibility may continue as an ordinary Agent run only with a durable
warning and typed remediation, while failure after belt injection is terminal
on adapters with a startup receipt (claude, codex) — cursor hosting is
pre-spawn injection with typed pre-spawn refusals, its live E2E and
startup-status mapping gated as recorded in docs/FEATURES.md. Claudexor children
carry a typed parent link; native vendor subagents never count as belt use. This
replaces the former orchestrate mode (retired in v3): "suggest"-style planning
is ordinary claudexor plan.
Council planning (plan --council)
--council (plan-only) runs the Council plan strategy: N harnesses each draft a
plan in parallel (round 1, harness-native read-only planner transport, each in
its own lane on a thread turn; Cursor uses native Ask so its final WorkReport
remains available), the drafts land as file-backed run artifacts
(council/draft-<harness>.md), and then an admitted member runs one merge iteration that
points at the draft and attempt evidence files by absolute path (never embedding their full text) and
synthesizes ONE unified plan. The tagged ## Open Questions parser runs on the
MERGE output only, so you always answer a single question set — the downstream
readiness/freeze/Implement flow is byte-for-byte identical to a solo plan.
--n N sets the member count (default: distinct available harnesses, up to 3,
primary first); --n on a plan is legal ONLY with --council. Degradation is
honest: a failed member is disclosed (event + council/membership.yaml) and the
merge proceeds with the usable inputs (one input still merges). A useful draft
with a contradictory completed plus required_inputs report is retained as
explicitly unverified input, while its original attempt remains failed (where
the report footer is only requested, as on Cursor, the attempt does not fail and
the draft is accepted with an unverified work state). The
merger prefers an accepted draft's lane, then an eligible unverified lane; no
eligible input is a typed failure. The final plan must still pass its own checks. Run
detail carries a council projection (membership + per-member status + who
merged). Council is the plan critique path — the standalone "plan review" entity
was retired in v3.
Unknown modes fail loudly. The retired mode ids (audit, best_of_n,
max_attempts, until_clean, explore, create, readonly_audit, daily,
until_convergence, readonly_swarm) are NOT aliases, and the retired
audit/map/explore verbs hard-error pointing at claudexor ask --deep-scan. The retired orchestrate verb hard-errors pointing at claudexor agent --delegate. claudexor create remains a CLI convenience VERB mapping
onto agent --create; old WIRE mode ids hard-error at every API/DTO boundary.
Chat is the normal loop: claudexor with no arguments opens a REPL over a
thread. Read-only ask/plan turns RESUME the routed harness's own native CLI
session (codex exec resume, claude --resume) — plan first, then keep
asking, in ONE conversation. Each such turn runs in a DURABLE per-lane scoped
home (a lane is a thread + harness + credential profile), so the native
session it records survives the run and the next lane turn actually reaches
it; a one-shot ask/plan with no thread keeps a disposable throwaway home.
Write (agent) turns run
IN-PLACE: a single-candidate turn mutates the thread's live execution tree
directly (the project for an in_place thread, the thread's persistent git
worktree for an isolated thread, or the caller-owned workspace an external
orchestrator bound to a delegated thread) and resumes the native vendor
session, so the next turn sees the work. A race (--n N > 1) runs its candidates in
isolated throwaway envelopes and AUTO-ADOPTS the winner's patch into the live
tree.
When a turn runs on a lane that has NOT seen the whole conversation — a lane
switch (a different harness or account) or a gap (A→B→A) — the engine hydrates
it with a bounded continuation packet: the delta turns since that lane's
checkpoint, verbatim (past a byte budget the oldest turns are condensed — into a
cached LLM summary when one is available, else mechanical one-liners), plus the
active plan pointer and a workspace anchor. The packet is written as a file
(context/THREAD.md in the run's artifact tree) and the prompt only points at
its absolute path — the packet body never rides the prompt. Every hydrated
turn DISCLOSES it (INV-137): a typed session.continuity event carries the
stats, the turn record stamps a continuity field (native_resume | packet
| fresh), and the CLI prints one line (e.g. continued with thread context · 3 turns). Returning to a previously used lane resumes its native session and
injects ONLY the missed delta — never the whole conversation again.
The condensed prefix's summary is produced lazily at packet-build time: when a collapse is forced and no fresh cached summary covers it, the engine runs ONE bounded read-only pass (ask-mode, the lane's own harness + credential route, a single turn, a hard timeout — no job queue) and caches the result keyed by (thread, collapse-boundary turn) under the thread's lane dir. Later packets reuse the cache until a new head turn advances the boundary; a timeout or an unavailable harness falls back to the mechanical one-liners, so the packet always carries the delta.
Inside the REPL, /harness <id> and /profile <id|default> set the thread's
sticky lane preference (its primary harness / credential profile) through the
same PATCH /v2/threads/:id route the app composer uses — a bare /harness or
/profile default clears it back to engine routing. Outside the REPL,
--thread <id> targets an existing thread so a one-shot ask/plan/agent
lands as its next turn (--resume picks the most recently updated thread); such
turns enqueue through POST /v2/threads/:id/turns, the one path that owns scope,
lineage, and the continuation packet.
Examples:
claudexor # REPL: a thread of turns (read-only turns resume natively)
claudexor ask "2+2?"
claudexor ask "google the latest release notes" --web auto
claudexor ask --deep-scan "map this repo's auth and run storage"
# Read bounded saved turns and answer previews from an existing daemon
claudexor thread history <thread-id> --limit 20 --json
claudexor thread prompt <thread-id> <turn-id> --offset 0 --max-bytes 32768 --json
claudexor agent "fix the failing auth refresh test" --harness codex
claudexor best-of "fix add() in src/math.js and keep the patch minimal" --harness codex,claude --n 2
claudexor agent "repair the parser test" --attempts 3
claudexor agent "fix the bug and keep repairing until clean" --until-clean
claudexor plan "design a config-to-gates implementation"
claudexor ask --deep-scan "map artifact writers and secret risk"
claudexor agent --delegate "ship the v2 parser refactor across this repo"
Accounts And Quota
Every account is a named registry row — one unified kind (INV-135), no
separate "default" or "CLI login" account type. Register named Antigravity,
Claude, Codex, Cursor, or Grok Build subscription bindings side by side, each with its own
Claudexor-owned scoped state and subject to the effective platform cardinality
policy. Windows Antigravity permits one enabled OS-user binding. An existing
legacy default-store login auto-registers at the first start of this engine as
the ordinary claude-default / codex-default row (its credential bytes never
move), and claudexor auth login <harness> is simply sugar for signing into that bootstrap row. Removing
a row does not mutate vendor credentials outside the binding; on platforms
where a credential is owned by the OS user, it may be left unchanged. Cursor
accounts live only in isolated file-store rows. Rows may alternatively use
namespaced secret-store keys (anthropic:work, openai:acc2). Rows are
durable non-secret entries in the global config's credential_profiles;
credential material stays in Claudexor-owned scoped state, a managed secret
store, or a vendor/OS-user store declared by platform policy, never in the
registry row.
claudexor profiles # every account per harness + the informational next-up verdict
claudexor accounts --json # read-only snapshot doorway for agents, with freshness/quota state
claudexor auth login claude # bootstrap sugar: sign into the claude-default row
claudexor profiles add claude work # register another account
claudexor profiles login claude work # direct vendor login in this terminal, scoped to the row's dir
claudexor profiles add cursor work # a separate Cursor account row
claudexor profiles login cursor work # daemon-managed login in this terminal; setup cancel/reconcile can recover it
claudexor profiles disable claude work # Enabled toggle: a disabled account is never routable
claudexor profiles enable claude work
claudexor profiles remove claude work # remove the binding + any Claudexor-owned state/managed secret
claudexor secrets set claude_oauth:work --from-env TOKEN_VAR
claudexor agent "fix the parser" --profile work # explicit per-run pin always wins
Accounts are symmetric: every row has the same Enabled toggle (the
only routing control — there is NO user-settable "active" account) and the
same Remove (removal deletes the binding and any Claudexor-owned state or
managed secret, provably: a partial cleanup is a typed retryable error, never a
silent half-delete; a vendor credential for the OS user may be left unchanged).
An UNPINNED run routes through the quota-aware pool of enabled,
signed-in accounts: the freshest-headroom account wins, unknown-quota accounts
rank after known headroom but before exhausted ones, and ties break
deterministically. An unpinned chat thread is sticky: it stays on the
account it started with while that account is ready, and switches to a pool
sibling only with a disclosed lane switch. An explicit pin (per-run
--profile, or the composer's per-thread account chip) is STRICT — exactly
that account or a typed refusal (subscription_window_exhausted with the
reset time when its quota window is spent, or when it reached a saved
headroom_threshold below 100%; quotaRefusal.basis tells the two apart),
never a silent rotation.
claudexor profiles shows the informational next-up verdict — who an
unpinned run of the configured default model would route to next — computed
server-side by the same routing owner (accountPools; also
GET /v2/account-pools), plus each account's recent refusals, temporary capability marks and last
service per requested model. Among accounts with unknown quota, the one that last
served the requested model is tried first, also after a daemon restart. When the pool is empty
or exhausted, the typed API-key fallback may serve the run as an explicit,
disclosed route — never a synthetic account row; key management stays in
Auth. The macOS Accounts surface renders these rows directly from ONE server
projection — no client re-derives Enabled or next-up. When the harness exposes
it, each row's secondary line shows the account's non-secret email · plan,
projected daemon-side under that binding's effective credential route; agy
currently exposes no machine-readable account identity.
Vendor-session resume never crosses accounts. Subscription quota is tracked
per account through each harness's declared vendor source: vendor usage
endpoints where available and Antigravity's own /quota command (proactive
window/per-model percentages in the app's quota footer, one chip per account).
Source-specific credential access stays inside the adapter/vendor route;
Windows agy uses the current OS user's Credential Manager identity while the
binding HOME scopes vendor state. Each harness may declare a typed
profile_policy (limit_action: fail|ask|rotate): reactive rotation moves
pool-selected accounts ONLY on typed vendor-limit signals — never on ordinary
network errors and never off an explicit pin — with full provenance on the
run record. Downgrading to an older engine is supported through the engine's
own rollback (claudexor profiles rollback-migration) run BEFORE the
downgrade. See
docs/ARCHITECTURE.md §5 for the complete contract.
Web, Budgets, And Gates
External web context is a typed run policy (--web off|auto|cached|live),
separate from shell/network sandboxing. off asks each route to switch off its
own web tools and refuses a route that cannot; it is not a network switch, since
the vendor API connection stays open, and receipts name each route's switch while
saying that network traffic is not measured. auto, cached, and
live are optional preferences, so unused, denied, unavailable, or failed web
never blocks an otherwise useful result and remains visible as evidence or a
warning. A harness such as Cursor that cannot guarantee off is refused before
it starts, with a prompt to enable web or choose an enforceable harness. Run
terminal state remains separate from output readiness (outputReadyState).
Paid budgets are explicit (--max-usd N; zero is a real zero-cash cap) and
unknown cost is never reported as $0 — a finite run can end
cost_unverifiable or budget_overshoot. Deterministic gates use exact
argv (--test '["pnpm","test"]'), and externally-granted test commands are
invalidated when the config, argv, executable, script bytes, project, or
access profile changes. The full semantics live in
docs/ARCHITECTURE.md.
Routing, Auth, And Secrets
Routing is Pool + Primary + Routing Goal: selected harnesses are the
eligible pool, --primary-harness <id> biases single-route modes, and
--routing-goal auto|quality|economy picks the pacing. In chat this is sticky
per thread. An explicit one-harness pool infers that harness as primary unless
--primary-harness is supplied; an explicit primary must belong to the pool.
The thread remembers its primary, pool, and (since 2.1) its
credential profile; the engine owns routing, surfaces only send the choice.
Model review is opt-in for ordinary Agent. An explicit panel (--reviewer-panel "claude=claude-fable-5-1:max,codex=gpt-6-astra:ultra" or the structured
--reviewer-panel-json form) enables it. Requested review needs at least two
distinct observed provider families to count as clean and verified. Deliberately
unreviewed work remains applicable subject to its independent checks.
Native harness auth is preferred where readiness-proven; API keys are fallback
secret refs in the v2-owned 0600 file store. auto is native-first, an
explicit route never falls back, and every effective route is a typed
disclosure — doctor reports credential availability and live verification
as separate facts, and a zero vendor exit is only provisional until a fresh
targeted probe plus an isolated capability smoke prove the exact selected
transport. Native login stays vendor-owned (official CLI, structured argv,
scrubbed env; Claudexor never sees or copies vendor tokens). The deep
semantics live in docs/ARCHITECTURE.md §5.
Grok Build is available through --harness grok or mixed pools such as
--harness codex,grok, using a grok.com subscription without an API key.
See the Grok adapter contract for access policies
and the limits of its credential-source check.
Codex login defaults to device-auth, driven in-app: the macOS AuthSheet shows
the one-time code and opens a private sign-in window (no Terminal); the CLI
prints the same code inline. Complete it in a window signed into no other
OpenAI account — an in-browser account switch can revoke sibling OpenAI
sessions server-side.
claudexor auth login codex --browser-redirect opts back into the older
localhost-callback flow. See
Install And Login.
Documentation truncated — see the full README on GitHub.
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Rea
Freeby Morluto · Developer Tools
Reverse engineer anything from your terminal or agent with one CLI and MCP server.
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Fetch
Freeby Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
