ClaudeR
Runs code from an AI assistant inside your live R or Python session in RStudio or Positron
Routes coding tasks to Claude Code, Codex, Cursor, OpenCode, Antigravity or Grok Build and tracks quota
By Anton Razzhigaev (individual) JavaScript Local · stdio Developer toolsAI and ML
53 popularity score ★ 522 ↓ 723/wk
Opens the app, which asks before it adds the server.
npm install -g claudexor
claudexor doctorclaude mcp add claudexor -- claudexor mcp serve{
"mcpServers": {
"claudexor": {
"command": "claudexor",
"args": [
"mcp",
"serve"
]
}
}
}{
"mcpServers": {
"claudexor": {
"command": "claudexor",
"args": [
"mcp",
"serve"
]
}
}
}{
"servers": {
"claudexor": {
"type": "stdio",
"command": "claudexor",
"args": [
"mcp",
"serve"
]
}
}
}[mcp_servers.claudexor]
command = "claudexor"
args = ["mcp", "serve"]gemini mcp add --scope user claudexor claudexor -- mcp serve| Set together: raw api | |
|---|---|
OPENAI_API_KEY secret |
Optional: Key for the raw API route when no signed-in agent CLI is used; a stored openai secret is tried when it is unset. |
CLAUDEXOR_RAWAPI_KEY secret |
Optional: Takes the place of OPENAI_API_KEY for the raw API route when set. |
CLAUDEXOR_RAWAPI_BASE_URL |
Optional: Endpoint the raw API route calls. |
CLAUDEXOR_RAWAPI_MODEL |
Optional: Model the raw API route uses when none is chosen. |
CLAUDEXOR_CONFIG_DIR |
Optional: Points Claudexor at another state folder. |
CLAUDEXOR_DISABLE_STORED_SECRETS |
Optional: Set to 1 to stop keys being looked up in the stored secrets file. |
Claudexor sits in front of the coding agents a developer already has signed in on their own machine. It can drive Codex CLI, Claude Code, Cursor CLI, OpenCode, Antigravity and xAI's Grok Build on a grok.com subscription. A raw model API with a key is the fallback route. Its MCP server starts with `claudexor mcp serve` over stdio, so another assistant can hand work to that layer rather than to one agent.
It registers 41 tools. The main ones queue a read-only question, a plan, an agent run that edits code, a new project, or a best-of race where two or more attempts compete and a model from another vendor judges them. Each queues the job with a local daemon and returns a handle. The rest read status and results, wait on many runs at once, answer questions a run asks, send a live message to a running attempt, change its time limit, or start a follow-up. Each prompt tool also takes per-run controls, such as a web policy or a hard time limit. Threads keep a conversation with a project across turns, and upload tools bring a local file in as an attachment.
Account tools show which named subscription profiles are ready, their quota and balances, and can spend a quota reset a vendor offers. Two recovery tools inspect the daemon's journal and can set a damaged part aside.
A few things live only in the code. When a call leaves repoPath out, the project is the folder the server was started in. The raw API route defaults to the OpenAI endpoint and gpt-4o-mini. And Claudexor does not install Grok itself: it finds the grok program through CLAUDEXOR_GROK_BIN before falling back to the PATH and then ~/.grok/bin.
Since 5.0, credential-shaped prompt text and project files such as .env are passed through untouched. The changelog moves the only content check to `pr` publication, where a pinned Betterleaks scan reports findings by rule and place without echoing the matched text.
| Runtime | Node.js 24.15+ |
|---|---|
| Runs on | macOS, Linux |
| Coding agent subscription (Claude, Codex, Cursor, Grok...) | Paid planRuns spend your own plan quota; OpenCode and Antigravity also work, and a provider API key covers the raw API route |
| Also |
|
Install with `npm install -g claudexor`, then check the setup with `claudexor doctor`. Sign each agent in through Claudexor rather than the bare vendor CLI. Claudexor can install some agent CLIs itself with `claudexor harness install <harness> --target local --yes --json`, pinned to an exact version under ~/.claudexor/node; Grok is the exception and has to be installed separately. On Windows only the Codex and Claude installs work. Before the first `pr` delivery, fetch the pinned publication scanner with `claudexor scanner prepare`, or with `claudexor scanner prepare --from-archive <file>` when offline. A running daemon picks it up at its next `pr`.
Run tools do not return the answer: they queue work and return a handle, and the result must be read with claudexor_run_status and claudexor_run_result. MCP Tasks are not offered. Quota tracking and account rotation cover Claude, Codex and Antigravity; Cursor has no usage source yet. If the installed host plugin files and the CLI versions differ, `mcp serve` refuses to start until `claudexor plugin repair all` is run. The ACP surface and host plugin layout are marked experimental. claudexor_thread_read fails with daemon_unavailable when no daemon is running. The portable Copilot plugin does not support Windows.
A fit for a developer who already pays for two or more coding agents and wants one assistant to share tasks among them, race them and keep an eye on quota, all on their own Mac or Linux box. It brings a daemon, a state folder under ~/.claudexor and Node 24, and its run tools answer through handles. Someone with a single agent and no use for races or quota tracking gains little from it.
23 only read, 15 change things, 3 can delete or overwrite. A ? marks an optional parameter.
claudexor_askprompt: stringrepoPath?: stringharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringprocessingPreference?: stringidempotencyKey?: stringattachments?: arrayexecution?: objectdeepScan?: booleantaskGroupId?: stringweb?: stringaccess?: stringcredentialProfileId?: stringpaidBudget?: objectmaxSeconds?: integertimeLimitMode?: stringn?: integerclaudexor_planprompt: stringrepoPath?: stringharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringprocessingPreference?: stringidempotencyKey?: stringattachments?: arrayexecution?: objecttaskGroupId?: stringweb?: stringaccess?: stringcredentialProfileId?: stringpaidBudget?: objectmaxSeconds?: integertimeLimitMode?: stringn?: integercouncil?: booleanclaudexor_run changesprompt: stringrepoPath?: stringharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringidempotencyKey?: stringattachments?: arrayexecution?: objectn?: integerprotectedPathApprovals?: arraytaskGroupId?: stringweb?: stringaccess?: stringcredentialProfileId?: stringpaidBudget?: objectmaxSeconds?: integertimeLimitMode?: stringtests?: arrayreview?: booleanclaudexor_best_of changesprompt: stringrepoPath?: stringharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringidempotencyKey?: stringattachments?: arrayexecution?: objectn?: integertaskGroupId?: stringweb?: stringaccess?: stringcredentialProfileId?: stringpaidBudget?: objectmaxSeconds?: integertimeLimitMode?: stringtests?: arrayclaudexor_create changesprompt: stringrepoPath?: stringharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringidempotencyKey?: stringattachments?: arrayexecution?: objecttaskGroupId?: stringweb?: stringaccess?: stringcredentialProfileId?: stringpaidBudget?: objectmaxSeconds?: integertimeLimitMode?: stringn?: integertests?: arrayreview?: booleanclaudexor_thread_create changesrepoPath: stringtitle?: stringdefaultMode?: enumworkspace?: enumworkspaceRoot?: stringcredentialProfileId?: stringprimaryHarness?: stringeligibleHarnesses?: arrayaccess?: enumidempotencyKey?: stringclaudexor_thread_turn changesthreadId: stringprompt: stringattachments?: arrayrunMode?: enumharness?: stringprimaryHarness?: stringmodel?: stringeffort?: stringcredentialProfileId?: stringaccess?: enumweb?: enummaxSeconds?: integertimeLimitMode?: enumexecution?: objectidempotencyKey?: stringclaudexor_thread_readthreadId: stringclaudexor_thread_historythreadId: stringclaudexor_thread_promptthreadId: stringclaudexor_store_identityclaudexor_upload_import changesclaudexor_upload_create changesclaudexor_upload_import_local changesclaudexor_upload_statusclaudexor_upload_finalize changesclaudexor_upload_cancel changesclaudexor_statusclaudexor_capabilitiesclaudexor_accountsfresh?: booleanclaudexor_account_resourcesrefresh?: booleantarget?: objectmodel?: stringclaudexor_account_reset deletestarget?: objectoffer_id?: stringgrant_id?: stringidempotency_key?: stringoperation_id?: stringclaudexor_runsclaudexor_inspectrunId: stringclaudexor_run_statusrunId: stringclaudexor_run_resultrunId: stringclaudexor_run_cancel deletesrunId: stringclaudexor_run_interactionsrunId: stringclaudexor_answer_interaction changesrunId: stringinteractionId: stringanswers: arrayclaudexor_apply_checkrunId: stringclaudexor_run_waitclaudexor_run_event_readclaudexor_runs_waittargets: arraywaitMs?: integerclaudexor_task_group_runstaskGroupId: stringlimit?: integercursor?: stringexpectedStoreId?: stringclaudexor_run_time_limit changesrunId: stringaction: enumseconds?: integermode?: enumexpectedRevision?: integerclaudexor_run_message changesrunId: stringtext: stringidempotencyKey: stringclaudexor_run_continue changesrunId: stringprompt?: stringidempotencyKey?: stringcontinueCarrier?: enumclaudexor_next_message changesclaudexor_next_message_readclaudexor_journal_recoveryaction: enumpartition: stringclaudexor_quarantine_journal deletespartition: stringexpectedFingerprint: stringconfirmation: enum