Orchestrator MCP
Use Codex from Claude Code, or Claude Code from Codex, through the subscriptions you already have.
If you pay for more than one AI subscription, Orchestrator MCP helps you use each model for what it does best. It runs the installed Codex or Claude Code CLI under your existing login, routes the work automatically, prevents an agent from consulting itself, and keeps a record of every consultation.
No provider API key is required, anywhere. Authentication stays inside the Codex and Claude Code command-line apps on your computer. Orchestrator only checks whether they are signed in — it never reads, stores, or returns a credential, and there is no code path in it that talks to a provider endpoint.
With Orchestrator MCP, your agent can:
- ask another vendor's agent for coding, research, writing, reasoning, or review help;
- continue a consultation across several turns;
- choose the best configured agent automatically;
- review consultation history in a local dashboard.
Quick start
1. Install with Homebrew
brew tap crAK1644/tap
brew install orchestrator-mcp-server
Apple Silicon uses a prebuilt package. Intel macOS and Linux build the dependencies from source, which can take about 15 minutes. On those systems, the uvx setup shown below is usually faster and does not install the server permanently.
2. Sign in to the agent CLIs
Sign in to each agent you want Orchestrator to use:
codex login
claude auth login
These commands use the normal Codex and Claude Code account login. Orchestrator only checks whether the CLI is signed in; it does not read or store the login credentials.
3. Create a configuration file
Create config.yaml:
consult:
database_path: ~/.orchestrator-mcp/consultations.sqlite3
timeout_s: 180
agents:
codex:
runtime: codex
command: codex
model: gpt-5.6-sol
priority: 10
web_search: true
scores: { coding: 95, research: 90, reasoning: 95, review: 90 }
claude:
runtime: claude
command: claude
model: claude-opus-4-6
priority: 10
web_search: true
scores: { coding: 90, research: 95, writing: 95, review: 95 }
The full annotated example is in config.example.yaml.
4. Add it to your MCP client
For Claude Code:
claude mcp add orchestrator \
--env ORCHESTRATOR_CONFIG=$PWD/config.yaml \
--env ORCHESTRATOR_HOST_RUNTIME=claude \
-- orchestrator-mcp-server
For Codex, add this to ~/.codex/config.toml:
[mcp_servers.orchestrator]
command = "orchestrator-mcp-server"
env = { ORCHESTRATOR_CONFIG = "/absolute/path/to/config.yaml", ORCHESTRATOR_HOST_RUNTIME = "codex" }
Restart your MCP client after changing its configuration.
Install with uvx instead
You can run the same server without installing it permanently:
claude mcp add orchestrator \
--env ORCHESTRATOR_CONFIG=$PWD/config.yaml \
--env ORCHESTRATOR_HOST_RUNTIME=claude \
-- uvx orchestrator-mcp-server
For Codex:
[mcp_servers.orchestrator]
command = "uvx"
args = ["orchestrator-mcp-server"]
env = { ORCHESTRATOR_CONFIG = "/absolute/path/to/config.yaml", ORCHESTRATOR_HOST_RUNTIME = "codex" }
The project is published to PyPI as orchestrator-mcp-server. The shorter PyPI name belongs to another project.
What it does
Orchestrator has two paths, and both of them reach a model through a CLI you have already logged into. There is no API key anywhere.
| Path | Talks to | Needs an API key | Tools |
|---|---|---|---|
| Consultation | The Codex or Claude Code CLI on your computer, under its own login | No | orchestrator_consult, orchestrator_list_consult_agents, orchestrator_get_consultation |
| Review | The same CLIs, several at once, with the calling agent writing the synthesis | No | orchestrator_review, orchestrator_review_run, orchestrator_finalize_review, and the rest of the review set |
The review path is an opt-in on top of the first: no review: block, no review tools.
Direct API routing through LiteLLM was removed in 0.4. A config that still carries capabilities:, model_list:, router_settings: or limits: is a boot error that names the block; pin orchestrator-mcp-server<0.4 if you need that path.
The consultation path
The orchestrator_consult tool starts the Codex or Claude Code command-line app already installed and signed in on your computer. Claude Code can ask Codex, and Codex can ask Claude Code, using the subscriptions already connected to those CLIs. A third runtime, antigravity, is available as an experiment; see below for what it does not guarantee.
The consulted agent can answer, but it cannot change files, run commands, use MCP tools, or start subagents. Orchestrator also removes agents that use the same runtime as the caller, which prevents consultation loops.
ORCHESTRATOR_HOST_RUNTIME tells Orchestrator which agent is making the request. It must be claude, codex, or antigravity. The server excludes that runtime from the available targets, so a host can never consult itself. The value comes from the environment only; a calling model cannot set it as a tool argument.
The antigravity runtime (experimental)
Google's Antigravity CLI (agy) can be configured as a consult target. It authenticates the same way as the other two: through its own login, cached in your operating system's keyring. Orchestrator never reads, copies, refreshes, or stores that credential, and there is no api_key or credential path to configure.
Three things about it differ from codex and claude, and you should know them before enabling it:
- The isolation guarantee is weaker.
agyinherits the MCP servers configured in your ownagysettings, and Orchestrator has no flag that can switch them off. What actually stops a consulted agent from using them is thatagydenies tool permissions by default in headless mode — a default that lives in a file you own, not in anything this server controls. Orchestrator refuses the consultation the moment the CLI reports a tool step, so a permitted tool use fails the call rather than passing silently. But that is a detection, not a prevention. If you have loosenedagy's headless permissions, do not enable this runtime. - The prompt travels in the argument list, not on standard input.
agyreads neither stdin nor a prompt file. Linux caps a single argument at 128 KiB, so a prompt larger than that is split and sent across several turns of one conversation before the question is asked. Nothing is ever run through a shell, and no prompt is written to a file the model reads. But an argument list is public on the machine it runs on: for as long as the process lives, anyone else logged into the same computer can read the whole prompt — including whatever you passed ascontext— out ofpsor/proc. On the other two runtimes the prompt goes to standard input, which is not readable that way. If you consult sensitive material on a shared machine, usecodexorclaudefor it. - There is no way to check whether it is signed in.
agyhas no login or status subcommand, soorchestrator_list_consult_agentsreports it as authenticated with a detail saying that is unverified. A login problem surfaces as a failed consultation, not as a preflight failure.
Pick a Gemini slug if your prompts can exceed 128 KiB. agy also offers Claude and open-weight models, and those work normally on anything that fits in one argument — but the split-and-reassemble transport above is, structurally, what a prompt injection looks like: a large padded block with instructions spread across several turns. Live runs of claude-sonnet-4-6 refused it on those grounds partway through, at a different fragment each time. The consultation fails rather than answering on a prompt with a hole in it, and the error quotes what the model said instead, but it does fail. gemini-3.6-flash-high and gemini-3.1-pro-high reassemble a 200 KB prompt correctly.
reasoning_effort is refused for this runtime because the effort level is part of the model name, and agy treats passing both as an error. Web mode is not offered.
orchestrator_consult
What you send:
| Field | Required | Meaning |
|---|---|---|
capability |
yes | One of coding, research, writing, reasoning, review. |
prompt |
yes | The task or question. Up to 100,000 characters. |
context |
no | Source material. Up to 1,000,000 characters. Treated as evidence to read, never as instructions to follow. |
source_mode |
no | auto, document, web, or model. Defaults to auto. |
consultation_id |
no | Omit on the first call. Send the returned ID back on later calls to continue the same session. |
target_agent |
no | An explicit agent ID, which overrides the scores. The tool advertises the configured IDs as a fixed list, so a calling model cannot name an agent you did not configure. |
conversation_label |
no | A free-text label saved with the consultation. Up to 200 characters. |
Source modes:
| Mode | What the consulted agent gets |
|---|---|
auto |
Picks document when context is set, and model otherwise. Resolved before the request is sent; a target never receives auto. |
document |
Your context, with every tool switched off. The agent is instructed to answer from that material or say it cannot. |
web |
The target CLI's own web search, and nothing else. Bounded by web_turn_limit, which defaults to 8 assistant turns. |
model |
Neither. The agent answers from what it already knows. |
What you get back. Every outcome uses the same envelope:
| Field | Meaning |
|---|---|
ok |
False exactly when error is set. A failed consultation never carries answer text, so check this before reading content. |
consultation_id |
The handle for continuing this conversation. Null only when the call failed before a consultation existed. |
content.answer |
The agent's answer. |
content.assumptions |
What it assumed to answer. |
content.uncertainties |
What it was not sure about. |
content.follow_up_questions |
What it would ask you next. |
content.sources |
Title, locator, and type (document, web, or model) for each source it used. |
route |
Which agent answered: ID, runtime, model, capability score, priority, and whether you chose it explicitly. |
usage |
Token counts, when the CLI reports them. |
latency_ms |
Elapsed time. |
error |
A code, a message, the agent involved, and sometimes a required_action command for you to run. |
All five content fields are required of the consulted agent. A list may be empty but never missing: "no uncertainties" is a claim the agent has to make, not something you infer from an absent key.
Consultation error codes: agent_not_installed, connection_required, configured_model_unavailable, agent_unavailable, session_not_found, session_busy, session_target_mismatch, protocol_validation_failed, web_search_unavailable, transport_error, timeout, invalid_request, no_agent_available.
Behaviour worth knowing:
- Routing is predictable: the highest capability score wins, then the lowest priority number, then the agent ID. A score of 0, or a capability left out of the map, means that agent is not eligible.
- If the chosen agent fails, that is the answer. Orchestrator does not quietly try the next one.
- A consultation is pinned to the agent, runtime, and model that started it. Naming a different
target_agentlater returnssession_target_mismatchrather than switching. - If the CLI answers as a different model than the one configured, the consultation fails with
configured_model_unavailableinstead of returning an answer from a model nobody chose. For Codex this is checked against the session log the CLI writes under~/.codex/sessions, becausecodex exec --jsonon 0.146 does not name the model anywhere in its output. If neither source names one, the configured name is reported unverified — absent metadata is not treated as evidence of substitution, so a quiet release of either CLI does not become an outage. - Two processes cannot advance the same consultation at once. The second gets
session_busy. - Nothing is ever run through a shell. Every CLI call is an argument list, and the prompt is written to the process's standard input — except on
antigravity, which does not read standard input and takes the prompt as an argument instead.
orchestrator_list_consult_agents
Returns the host runtime and one row per configured agent: agent_id, runtime, model, priority, enabled, scores, web_search, excluded_as_host, plus installed, authenticated, and a detail string from the last status check.
orchestrator_get_consultation
Takes a consultation_id and returns the stored consultation: target agent, runtime and model, capability, the source modes used, label, status, whether a native session is still bound, timestamps, every turn, and the routing decision that picked the agent.
Agent options
Each entry under consult.agents accepts:
| Option | Default | Meaning |
|---|---|---|
runtime |
required | codex, claude, or antigravity. |
command |
required | Executable name or absolute path. Resolved on PATH; an absolute path is safest for GUI-launched clients. |
model |
required | The model to ask for, and the one the answer is checked against. |
priority |
100 | Lower wins a tie. |
enabled |
true | Set false to keep an agent configured but out of routing. |
scores |
none | 0–100 per capability. Missing means 0, which means not eligible. |
web_search |
false | Allows source_mode: web for this agent. Asking for web against an agent without it returns web_search_unavailable rather than quietly answering without a search. |
reasoning_effort |
unset | low, medium, high, xhigh, or max. Codex only. Setting it on a claude agent refuses to start, because that runtime would ignore it silently; on an antigravity agent because the effort level belongs in the model name there. |
Consultation settings
| Setting | Default | Meaning |
|---|---|---|
database_path |
~/.orchestrator-mcp/consultations.sqlite3 |
Where consultations are stored. |
managed_agents_path |
~/.orchestrator-mcp/agents.yaml |
The file the dashboard writes. |
timeout_s |
180 | Time limit for one consultation turn. Raise it for slow, high-effort reviews. |
web_turn_limit |
8 | Assistant turns allowed in web mode before the child process is stopped. |
store_full_content |
true | Set false to store only metadata and routing information. |
dashboard |
off | See below. |
The review path
A consultation asks one agent. A review asks one or more of them the same question over the same approved material, groups the answers under a review_id, and hands your own AI everything it needs to write one conclusion. It is off unless you configure reviewers:
consult:
review:
reviewers: [codex-sol] # `standard`: exactly one
deep_reviewers: [codex-sol, gemini-x] # `deep`: one to five
Each id must be a configured agent that is enabled and scores above 0 for review. A review: block in both the config file and the dashboard's agents.yaml is a startup error rather than a precedence rule, because a precedence rule is how an edit saves successfully and does nothing.
The handshake
Reviews are two calls, not one:
orchestrator_reviewreturns a plan and sends nothing: which reviewers, how much material, whether web access was requested, how many requests it will cost, and the lines where something credential-shaped was found — positions only, never values. Show it to the user.orchestrator_review_runspends the one-timeconfirm_tokenfrom that plan and asks every reviewer in parallel.
It stops at awaiting_synthesis. External models replying is not a finished review; orchestrator_finalize_review records your AI's combined conclusion and is the only path to complete. Every Critical finding in a reviewer's findings block must be referenced there, including one only a single reviewer raised while the others disagree — that is checked, and the call is refused otherwise.
The findings block is the review, and the check can only be over the block. Prose around it is not parsed and not certified: a reviewer that argues a Critical in prose and then sends {"findings": []} will finalize cleanly, because nothing machine-readable said otherwise. REVIEWER_INSTRUCTIONS tells every reviewer this, so it is a contract rather than a gap — but a human reading a review still reads the prose.
By default, orchestrator_review_run uses secrets="mask" and sends the redacted
copy. secrets="send_as_is" is an explicit escape hatch for a credential-shaped
fixture or false positive: it requires the exact original goal and context in raw,
sends those originals to every reviewer, and still stores only the redacted copy.
Those originals can remain in each reviewer's own CLI history, which this project
cannot erase. A retry of such a review requires the same raw material again and
hash-checks it against the original plan.
Finalization is refused when a reviewer answered only in unparseable prose, when
findings were truncated, or when store_full_content: false discarded them. In
those states the server cannot prove that every Critical survived, so it does not
treat an empty stored finding set as evidence that there were none.
| Tool | What it does |
|---|---|
orchestrator_review |
Plans a review and shows what would be sent. Sends nothing. |
orchestrator_review_run |
Spends the token and asks every reviewer. |
orchestrator_retry_review |
Re-runs only failed reviewers. A send_as_is review requires its original raw material again. |
orchestrator_finalize_review |
Records the synthesis. The only path to complete. |
orchestrator_cancel_review |
Marks a review cancelled and keeps answers already given. It waits for work launched by this server process; another process's subprocesses cannot be signalled and deletion waits for their lease. |
orchestrator_apply_fixes |
Pulls up the findings you selected, with the steps around them. Changes nothing. |
orchestrator_record_fix_round |
Logs what a round of fixing did, after you did it. |
orchestrator_test_reviewers |
Checks the reviewers are installed and logged in. No project material leaves the machine. |
orchestrator_get_review / orchestrator_list_reviews |
Read one review, or recent ones newest first. |
orchestrator_delete_review |
Deletes a review, its rechecks, and every consultation under either. |
orchestrator_request_delete_all / orchestrator_delete_all_reviews |
Counts what deleting all history would remove, then deletes exactly that snapshot. |
Fixing what a review found
orchestrator_apply_fixes is bookkeeping around work your own AI does. It returns the findings you selected and the steps that go with them — make a safety point first, apply the changes, run the tests, keep or undo — and it changes nothing itself. This server never edits a file and never runs a command, and a reviewer never sees your repository at all.
Two things it does enforce. A finding id no reviewer raised is refused rather than recorded against nobody, and criticals_omitted names every Critical your selection leaves out — the same rule as the synthesis check, one stage later.
orchestrator_record_fix_round then logs what happened (applied, partial, reverted, skipped) beside the findings it names. It is your AI's account of the round; nothing here can verify it, which is why the dashboard labels the rounds as claims.
To re-review, plan a new review with parent_review_id set to the original and the diff as context. A recheck is an ordinary review: same preview, same secret scan, same approval. The parent's page links to it.
What a review does not do
- No web access unless you ask for it.
web: falseis the default for every review. - Reviewers cannot act. Same answer-only mode as
orchestrator_consult: no file changes, no commands, no requests for more material. - No automatic fixes. Findings are returned; editing is your AI's job, with your approval.
- Credential-shaped values are replaced before every insert, in the goal, the context, the manifest, and every reviewer's answer. Detection is best-effort pattern matching — see Not included for what it cannot cover.
send_as_ischanges what leaves the machine, not what is stored. It sends the hash-verified original goal and context to reviewers and their CLI histories while the database continues to receive only the redacted copy.
Dashboard and consultation history
The dashboard is off by default because it can display every stored consultation.
Enable it in config.yaml:
consult:
dashboard:
enabled: true
editable: false
Start it separately:
ORCHESTRATOR_CONFIG=config.yaml orchestrator-mcp-dashboard
Open http://127.0.0.1:8765. The dashboard only listens on your computer. It shows configured agents, recent consultations, prompts, answers, routing, usage, latency, and errors. host accepts only a loopback address, and a request whose Host header names anything else is refused.
The dashboard runs as its own process and reads the configuration once, at startup — the same as the MCP server. Neither one notices a change the other made. It never runs a login command; the connect commands on the page are text for you to copy.
Editing agents from the browser
Set editable: true and open /agents. This is a second flag on purpose: turning the dashboard on gets you a window, and editing is a different thing to agree to.
What the form can change: consult agents only — runtime, command, model, priority, enabled, the five capabilities, web search, and reasoning effort. Nothing else is editable from the browser. capabilities, model_list, router_settings, limits, timeout_s, web_turn_limit, store_full_content, and the dashboard's own host and port are config-file settings.
Capabilities are ticks on the form, not the 0–100 numbers the config file holds: the question is which work an agent should be offered, and among agents ticked for the same capability priority already decides the order. A newly ticked box saves 100. A score you wrote by hand to break a tie is preserved — the form carries it back out and saves it unchanged, so editing an unrelated field does not flatten it.
Agents you add here are written to ~/.orchestrator-mcp/agents.yaml, with 0600 permissions in a 0700 directory. The dashboard never writes config.yaml. Agents defined there are listed on the page but not editable, and the page says so.
The two files are merged at startup and neither one wins. An agent ID defined in both files stops the server from starting, and the error names the ID and both paths. There is no precedence rule, because a precedence rule is how you get an edit that saves and then does nothing. The form refuses a save that would create that state, and it checks config.yaml as it is on disk rather than as it was when the dashboard started — so an agent you add to that file by hand is refused here right away, and one you delete from it stops being refused. Only the IDs are re-read, so it works in one direction: an agent added to config.yaml while the page is open does not appear in the read-only table until the dashboard restarts, but it is still enough to block a save the next startup would reject.
If config.yaml is empty or half-written when the page reads it — the state an editor leaves for a moment while saving — the check falls back to the agents the dashboard started with. Reading that moment as "this file defines no agents" is exactly how a duplicate would slip through.
An agent that exists in both files keeps its row and its delete button, since deleting the copy here is the only fix available from the browser.
Changes take effect when the MCP server next starts. The page says so after every save, and it warns you when the running server is on an older configuration than the one on disk.
The agent table's status column is the newest recorded preflight, labelled last checked. The page runs nothing: it reads whatever the last check wrote, which may be days old. orchestrator_test_reviewers is the tool that actually asks.
Reviews in the dashboard
/reviews lists reviews newest first, and /reviews/<id> shows one: its status and outcome, every reviewer with the consultation it ran under, all stored findings sorted worst-first across reviewers, the synthesis in the problem / seriousness / who-agreed / proposed-action shape, and each stored reviewer answer folded into a <details>. Findings and answers are present only with store_full_content: true. Rechecks link back to the review they came from.
Recorded fix rounds appear at the bottom, labelled as claims: nothing in this server edits a file or runs a command, so a round is an account of work done elsewhere.
What you see is what was stored, which is the redacted copy — a credential-shaped value was replaced before the insert, and the page reports only that one was found and on which line.
There is no delete button. The dashboard opens the database read-only, so deleting is orchestrator_delete_review and orchestrator_delete_all_reviews, from your AI.
With editable: true, /reviewers sets who reviews: one agent for review, one to five for deep_review. It writes the same ~/.orchestrator-mcp/agents.yaml, both blocks together, so a reviewer save cannot drop your agents. A review: block in config.yaml makes the page read-only and says which file to edit — the same reason the agents have no precedence rule.
A database created before this version has no review tables, and the read-only connection cannot add them. The page says to restart the MCP server, which migrates at startup.
By default, consultation prompts and answers are saved in SQLite. Set store_full_content: false to save only metadata and routing information.
Configuration
ORCHESTRATOR_CONFIG points to the configuration file. If it is not set, the server looks for config.yaml in its working directory.
Important sections:
| Section | Purpose |
|---|---|
consult |
Configures logged-in CLI agents, history, and the dashboard. |
consult.agents |
The CLIs to route to: runtime, command, model, and per-capability scores. |
consult.review |
Who reviews. Absent means the review tools are not advertised at all. |
consult.dashboard |
The local history page. Off unless you turn it on. |
consult is the only top-level section. A config that still carries capabilities, model_list, router_settings, or limits was written for the direct routing path removed in 0.4, and the server refuses to start on it rather than quietly advertising fewer tools than the file asks for.
Invalid configuration is rejected when the server starts instead of failing during a request.
Guardrails and limits
Orchestrator MCP checks request and response structure. It does not know whether a model's factual claims are true.
It does enforce these rules:
- Unknown capabilities and oversized requests are rejected before any CLI is started.
- Truncated, filtered, malformed, and failed answers are returned as errors, not partial answers.
- Errors use stable codes such as
connection_required,timeout, andsession_busy. - The response always identifies which agent and model answered.
- Consulted agents run in answer-only mode and may not act on your computer.
- A consulted agent cannot route work back to the same agent runtime.
- Login credentials are not read or stored. Authentication stays in the vendor's CLI.
Important limits:
- Treat caller-provided JSON Schemas as trusted input. A complex regular expression can use a large amount of CPU.
- CLI error text is shortened and common secret formats are redacted, but unusual secrets may still appear. Do not forward errors to an untrusted place.
- The consultation database may contain full prompts and answers. Keep it private or disable full-content storage.
System requirements
- macOS or Linux. Windows is not tested; the Homebrew instructions are macOS only, and the server has only been run on POSIX systems.
- Python 3.11, 3.12, or 3.13
- Homebrew or
uv - An MCP client that supports stdio, such as Claude Code or Codex
- The Codex or Claude Code CLI installed and signed in
Testing
Run the offline test suite:
uv sync
uv run pytest -q
The tests use fake CLI agents. They do not need a network connection or spend money.
To test real Codex and Claude Code consultations:
ORCHESTRATOR_HOST_RUNTIME=claude uv run python smoke_consult_live.py
And a real review, end to end:
ORCHESTRATOR_HOST_RUNTIME=claude uv run python smoke_review_live.py
The smoke tests make real requests and may use paid capacity from your configured services. Do not run them in CI unless that is intentional.
Troubleshooting
| Problem | What to do |
|---|---|
config not found: config.yaml |
Set ORCHESTRATOR_CONFIG to an absolute path. MCP clients may start the server from a different directory. |
| Startup names a block removed in 0.4 | Delete capabilities, model_list, router_settings, and limits; they configured the direct routing path. |
no_agent_available |
Every configured agent scores 0 for the capability, is disabled, or shares the caller's runtime. |
timeout on a long review |
Raise consult.timeout_s; a reviewer thinking at xhigh over a real diff can need far more than the 180s default. |
consult is missing |
Add the consult section and check that the client loaded the correct config file. |
| Host runtime error at startup | Set ORCHESTRATOR_HOST_RUNTIME to claude, codex, or antigravity in the MCP client's environment. |
agent_not_installed |
Use an absolute path in the agent's command; GUI apps may have a smaller PATH than your shell. |
connection_required |
Run the login command shown in the error in your own terminal, then try again. |
| Every consultation starts over | Return the previous consultation_id with the next call. |
| A dashboard change does not appear | Restart the MCP server; it reads configuration at startup. |
Bug reports
Open an issue and include the returned response envelope. Remove paths, credentials, and other private information before attaching your configuration.
Contributing
Issues and pull requests are welcome.
- Fork the repository and create a branch.
- Make the change and add a test that fails without it.
- Run
uv run pytest -q. - Open a pull request.
Keep private configuration, login data, and consultation databases out of commits.
Releasing
- Update
versioninpyproject.toml. - Create a GitHub Release tagged
vX.Y.Z. - The release workflow runs the tests, checks the version, and publishes to PyPI using Trusted Publishing.
- Update the formula in the
homebrew-taprepository and rebuild its Apple Silicon bottle.
Not included
Deliberately out of scope for now:
- Consulted agents cannot act. No file changes, no commands, no MCP tools, no subagents. Answers only.
- No streaming. A consultation returns one complete envelope.
- No consultations from the dashboard. The page reads history and edits agent configuration; it has never started an agent process, and that is worth keeping until there is a reason to give it up.
- No runtime settings in the dashboard. Timeouts, storage, and the dashboard's own host and port are config-file settings. A page that can change the port it is served on is a footgun that deserves its own design.
- No accounts on the dashboard. Its protection is a loopback bind, a
Hostheader check, and a per-process token — enough for one person on one machine, not for a shared host. - Redaction covers this database only. Credential-shaped values are replaced before every insert, and detection is best-effort — a secret with no recognizable shape survives it. Material sent to a reviewer also lands in that reviewer's own CLI history (Codex writes
~/.codex/sessions/, and the others keep their own logs). Nothing here can reach those files. - No automatic restart. Both processes read the configuration once, at startup.
- No multi-user or shared state. One SQLite file, local to your computer.
- No direct API routing. Every model is reached through a CLI you have logged into yourself. There is no provider SDK, no API key, and no endpoint to configure; the LiteLLM path that offered that was removed in 0.4.
License and support
This project uses the MIT License.
Built with Pydantic and the Python MCP SDK.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orchestrator_mcp_server-0.4.0.tar.gz.
File metadata
- Download URL: orchestrator_mcp_server-0.4.0.tar.gz
- Upload date:
- Size: 292.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
932f8c6f2985f75641826b2b1f9816b1619d7eebdfcf82816295308217dabd1e
|
|
| MD5 |
6a50bdd9efa36bafc8d7bd43a3986bdc
|
|
| BLAKE2b-256 |
69e3191945b668f181242760d2872fee38a998d0fcb5107d3dc8fe0d86be1e81
|
File details
Details for the file orchestrator_mcp_server-0.4.0-py3-none-any.whl.
File metadata
- Download URL: orchestrator_mcp_server-0.4.0-py3-none-any.whl
- Upload date:
- Size: 145.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d316ec5dc11992a2cd78e326ccd8536c33900a448c5913bdabeaee3d903a6b0a
|
|
| MD5 |
ad1538c56a12ab03b241dddfdb6e82ac
|
|
| BLAKE2b-256 |
8cd957e4faa78449bd7780f541f750da0ff8b6488b3ff60187a25bbdc159ac23
|