amicus
Give your coding agent a second opinion from a different model.
amicus is one MCP server that fronts Codex, Kimi and Claude. The backend is a parameter, not a separate installation — so instead of running three servers and learning three tool surfaces, you ask for a consult, a review, or a delegated task and say which model should answer.
- Consult — a read-only second opinion on an approach, a bug, or a design.
- Review — a structured review of changes gathered from git, with findings tied to evidence.
- Delegate — a task implemented in a throwaway git worktree, returned as a diff you review. It is never applied to your working tree.
- Adversarial review — a fixed critic aimed at a plan, claim, or decision.
Long-running calls can be started in the background and polled, so a broad review does not block your session.
Install
Claude Code
/plugin marketplace add briandconnelly/amicus
/plugin install amicus@amicus
Codex
codex plugin marketplace add briandconnelly/amicus
codex plugin add amicus@amicus
Start a new session afterwards so the host loads the bundled skill and tools.
Any other MCP client
The plugins launch the server from a published release tag, pinned in
.mcp.json. Point your client at the same command:
{
"mcpServers": {
"amicus": {
"command": "uvx",
"args": ["--from", "git+https://github.com/briandconnelly/amicus.git@v0.9.0", "amicus-mcp"]
}
}
}
Environment variables go wherever your client sets them for a stdio server (most accept an
"env" object beside "command"; check your client's documentation). A first session from a
client that has no notion of a working directory looks like this:
- Set
AMICUS_BACKENDSto the backends you have installed and logged in to. - Call
amicus_backendswithdetail: "full". It is free, and it reports each enabled backend's installed and authenticated state plus the disclosures you should read before spending; a backend you did not enable is listed withstatus: null. - Call
amicus_consultwithbackend,questionand an absoluteworkspace_root. Every paid tool needsworkspace_rootfrom such a client; the three free discovery tools reject it. - If a result has
ok: false, branch onerror.codeand, when present, followerror.repair: itsnext_stepsays what to do, and when one call recovers, itstoolandargumentsname that call.
Requirements
- macOS or Linux: amicus refuses to start on a non-POSIX platform, because its background-job safety layer depends on POSIX process semantics.
- Python 3.11 or newer, and
uv. - The CLI for each backend you enable, installed and authenticated:
codex,kimi,claude. amicus drives those CLIs; it does not talk to the providers itself, and it stores no credentials.
Using it
Choose which backends are available with AMICUS_BACKENDS — a comma-separated list of codex,
kimi and claude (case-sensitive). Unset, all three are enabled; set, only the backends you
name are. An enabled backend whose CLI is missing or not logged in still appears in
amicus_backends, with status.installed and status.authenticated saying so.
Then just ask, in your own words:
- "Get a second opinion on this approach from another model."
- "Have another model review my current changes."
- "Delegate this task to another model and show me the proposed diff."
In Claude Code there are also slash commands:
| Command | What it does |
|---|---|
/amicus:consult |
Ask another model for a read-only second opinion |
/amicus:review |
Have another model review your git changes |
/amicus:delegate |
Delegate a coding task; get back a reviewable diff |
/amicus:delegate-async |
Delegate a long coding task in the background; get a job id to poll with /amicus:jobs |
/amicus:adversarial |
Run a fixed adversarial critic against a plan, claim, or decision |
/amicus:dry-run |
Preview what a review or delegate call would send — free, no model call |
/amicus:jobs |
Poll, fetch, list, or cancel a background job |
/amicus:status |
Check which backends are enabled, installed, and authenticated |
Start with /amicus:status — it tells you which backends are actually usable before you spend
anything.
The tools
Eighteen tools, in five groups. Discovery, previews and job management are free; the verbs and their background twins invoke the selected backend and spend its quota.
| Group | Tools |
|---|---|
| Discovery — free | amicus_backends, amicus_capabilities, amicus_models |
| Verbs — paid | amicus_consult, amicus_review_changes, amicus_delegate, amicus_adversarial_review |
| Previews — free | amicus_review_changes_dry_run (review), amicus_delegate_dry_run |
| Background twins — paid | the four verbs again, each with an _async suffix |
| Jobs — free | amicus_job_status, amicus_job_result, amicus_job_consume_result, amicus_job_list, amicus_job_cancel |
Not every backend does everything:
| Verb | Codex | Kimi | Claude |
|---|---|---|---|
consult, review_changes |
yes | yes | yes |
delegate |
yes | yes | no |
adversarial_review |
no | no | yes |
A no is amicus's routing policy, not a model limitation. Claude is review-only, and the
dedicated adversarial-review verb is scoped to Claude. To ask Codex or Kimi for an adversarial
review, use consult or review_changes and supply the stance yourself; the dedicated verb adds
a fixed critic stance and the target and evidence inputs.
Asking a tool for a backend outside its backend enum, in-tree or not, is rejected before any
spend as an invalid_arguments error whose details.allowed_values lists the backends that tool
accepts (the enum is that set). feature_unsupported is only a defensive check: it is returned
if the named backend's declared features lack the verb, which no backend a tool's enum accepts
does today.
Safety
- A delegated diff is never applied. It runs in a throwaway git worktree and comes back for you to read and apply yourself.
- Every verb call spends the selected backend's quota. The dry runs and the discovery and job tools do not.
- Enabling a backend that can write makes the tool surface carry that backend's approval
annotations — see
docs/MIGRATION.md. - Your prompts go to whichever provider you selected, through that provider's own CLI. Each
backend discloses how it carries your text — visible on
amicus_backends. - A paid call's whole answer stays on disk in the job record under
AMICUS_STATE_DIR, whateverdetaildelivered it and after only best-effort secret redaction, until it expires (AMICUS_JOB_TTL, default 24h; an expired record is removed on a later job call, not by a daemon),amicus_job_consume_resultremoves it or, once amicus has returned it, the per-workspace cap evicts it. The cap never evicts a result nobody has fetched that was recorded since delivery tracking (#244), whichever release recorded it. When only running jobs and such results remain, a new paid call is refused withjob_cap_reachedinstead (ADR 0038). It can quote what you sent. Your inputs themselves are never written there (ADR 0035). - Kimi keeps its own copy. The kimi CLI writes its own session files (observed under
~/.kimi-code/sessions), which can hold the whole prompt and any answer produced. amicus found no documented way to switch that off and does not delete them, and none of the retention controls above reach it; Codex and Claude run with their session persistence disabled.
Configuration
AMICUS_BACKENDS is the one most people set. Beyond it, each backend takes an optional model,
reasoning effort, and binary path (AMICUS_CODEX_MODEL, AMICUS_KIMI_REASONING_EFFORT,
AMICUS_CLAUDE_BIN, and so on), and there are limits for timeouts, job retention and payload
sizes. Every variable, what it does and its default is in docs/CONFIGURATION.md, rendered from the declarations in the code.
Logging goes to stderr, and AMICUS_LOG_FILE mirrors amicus's own records to a file. To reduce
the risk of prompt text leaking through dependency logs, fastmcp and mcp records are limited
to WARNING or higher on stderr, reduced to non-message diagnostics, and never written to that
file (ADR 0023).
Coming from codex-in-claude, moonbridge, or claude-in-codex
amicus replaces all three. docs/MIGRATION.md maps the old tool names onto
the new ones.
Status and known limits
0.9.0 is the current release. The discovery surface moves from amicus/0.1/schema-53 to
amicus/0.1/schema-55 and RESULT_FORMAT did not move, so a job result 0.8.1 stored can still be
read. No tool call 0.8.1 accepted is rejected, but an explicit AMICUS_BACKENDS that names no
backend now stops the server from starting instead of enabling all three. An unstructured review
carries its answer at either detail, so the default consume no longer deletes the only copy;
amicus_capabilities names where a defect in amicus is reported; and codex-cli 0.161 is a
supported version.
docs/MIGRATION.md explains how to upgrade, and
CHANGELOG.md lists every user-visible change.
One known limit: a third-party backend distribution can load through the amicus.backends
entry-point group, but cannot yet be enabled or called. AMICUS_BACKENDS and the backend
parameter accept only the three in-tree ids.
Development
uv sync
uv run prek install --prepare-hooks # one-time local hooks
The gate is defined once, in AGENTS.md (Rules, item 2); CI runs it on every supported Python
version.
| Question | Read |
|---|---|
| What is being built and why | docs/superpowers/specs/2026-09-04-amicus-design.md; for M8, docs/superpowers/specs/2026-09-15-amicus-M8-sdk-in-tree-design.md |
| How milestones are executed by agents | docs/superpowers/plans/2026-09-04-amicus-execution-model.md |
| Architecture decisions | docs/adr/ |
| How a release is cut | docs/RELEASING.md |
| Every environment variable, its meaning and default | docs/CONFIGURATION.md |
| The router skill an agent loads to call amicus | skills/collaborating-with-amicus/ |
| Host captures and CLI evidence | docs/host-captures/, docs/claude-help/, docs/kimi-help/ |
| How past milestones were built | git history — executed plans are removed once merged |
License
MIT. See LICENSE.
Metadata
Release files for amicus 0.9.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 |
|---|---|---|---|---|
| amicus-0.9.0.tar.gz | 2.0 MB | With provenance | Details for amicus-0.9.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| amicus-0.9.0-py3-none-any.whl | Python 3 | none | any | Details for amicus-0.9.0-py3-none-any.whl |
Total release size: 2.5 MB
Release files / amicus-0.9.0.tar.gz
| Download URL | amicus-0.9.0.tar.gz |
|---|---|
| Size | 2.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1b7ac2201f8d3bf2d38a7fac9092510842b51051f55271341a634e2fa25dff4f
|
|
BLAKE2b-256 checksum How to use checksums |
1e0ce2bdb389863c88157f2639f45d32ffaa0f678e95b960c33517dc407045b6
|
| 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 8, 2026.
Transparency logRelease files / amicus-0.9.0-py3-none-any.whl
| Download URL | amicus-0.9.0-py3-none-any.whl |
|---|---|
| Size | 435.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
86fe6cf674c6720768c45830c9b282c668c04cbd87704fc3a8663ef78d464f08
|
|
BLAKE2b-256 checksum How to use checksums |
f48cd000a02639f761d3414374c8c335988ca16a60c3fa886dc77d95217238b9
|
| 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 8, 2026.
Transparency logSecurity for amicus 0.9.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
Both files in this release have been uploaded with provenance metadata.
Attestation for amicus-0.9.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 8, 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.