This is a very large PR with some non-backwards-compatible changes. Historically, `codex mcp` (or `codex mcp serve`) started a JSON-RPC-ish server that had two overlapping responsibilities: - Running an MCP server, providing some basic tool calls. - Running the app server used to power experiences such as the VS Code extension. This PR aims to separate these into distinct concepts: - `codex mcp-server` for the MCP server - `codex app-server` for the "application server" Note `codex mcp` still exists because it already has its own subcommands for MCP management (`list`, `add`, etc.) The MCP logic continues to live in `codex-rs/mcp-server` whereas the refactored app server logic is in the new `codex-rs/app-server` folder. Note that most of the existing integration tests in `codex-rs/mcp-server/tests/suite` were actually for the app server, so all the tests have been moved with the exception of `codex-rs/mcp-server/tests/suite/mod.rs`. Because this is already a large diff, I tried not to change more than I had to, so `codex-rs/app-server/tests/common/mcp_process.rs` still uses the name `McpProcess` for now, but I will do some mechanical renamings to things like `AppServer` in subsequent PRs. While `mcp-server` and `app-server` share some overlapping functionality (like reading streams of JSONL and dispatching based on message types) and some differences (completely different message types), I ended up doing a bit of copypasta between the two crates, as both have somewhat similar `message_processor.rs` and `outgoing_message.rs` files for now, though I expect them to diverge more in the near future. One material change is that of the initialize handshake for `codex app-server`, as we no longer use the MCP types for that handshake. Instead, we update `codex-rs/protocol/src/mcp_protocol.rs` to add an `Initialize` variant to `ClientRequest`, which takes the `ClientInfo` object we need to update the `USER_AGENT_SUFFIX` in `codex-rs/app-server/src/message_processor.rs`. One other material change is in `codex-rs/app-server/src/codex_message_processor.rs` where I eliminated a use of the `send_event_as_notification()` method I am generally trying to deprecate (because it blindly maps an `EventMsg` into a `JSONNotification`) in favor of `send_server_notification()`, which takes a `ServerNotification`, as that is intended to be a custom enum of all notification types supported by the app server. So to make this update, I had to introduce a new variant of `ServerNotification`, `SessionConfigured`, which is a non-backwards compatible change with the old `codex mcp`, and clients will have to be updated after the next release that contains this PR. Note that `codex-rs/app-server/tests/suite/list_resume.rs` also had to be update to reflect this change. I introduced `codex-rs/utils/json-to-toml/src/lib.rs` as a small utility crate to avoid some of the copying between `mcp-server` and `app-server`.
105 lines
5.0 KiB
Markdown
105 lines
5.0 KiB
Markdown
# Codex CLI (Rust Implementation)
|
||
|
||
We provide Codex CLI as a standalone, native executable to ensure a zero-dependency install.
|
||
|
||
## Installing Codex
|
||
|
||
Today, the easiest way to install Codex is via `npm`:
|
||
|
||
```shell
|
||
npm i -g @openai/codex
|
||
codex
|
||
```
|
||
|
||
You can also install via Homebrew (`brew install codex`) or download a platform-specific release directly from our [GitHub Releases](https://github.com/openai/codex/releases).
|
||
|
||
## What's new in the Rust CLI
|
||
|
||
The Rust implementation is now the maintained Codex CLI and serves as the default experience. It includes a number of features that the legacy TypeScript CLI never supported.
|
||
|
||
### Config
|
||
|
||
Codex supports a rich set of configuration options. Note that the Rust CLI uses `config.toml` instead of `config.json`. See [`docs/config.md`](../docs/config.md) for details.
|
||
|
||
### Model Context Protocol Support
|
||
|
||
Codex CLI functions as an MCP client that can connect to MCP servers on startup. See the [`mcp_servers`](../docs/config.md#mcp_servers) section in the configuration documentation for details.
|
||
|
||
It is still experimental, but you can also launch Codex as an MCP _server_ by running `codex mcp-server`. Use the [`@modelcontextprotocol/inspector`](https://github.com/modelcontextprotocol/inspector) to try it out:
|
||
|
||
```shell
|
||
npx @modelcontextprotocol/inspector codex mcp-server
|
||
```
|
||
|
||
Use `codex mcp` to add/list/get/remove MCP server launchers defined in `config.toml`, and `codex mcp-server` to run the MCP server directly.
|
||
|
||
### Notifications
|
||
|
||
You can enable notifications by configuring a script that is run whenever the agent finishes a turn. The [notify documentation](../docs/config.md#notify) includes a detailed example that explains how to get desktop notifications via [terminal-notifier](https://github.com/julienXX/terminal-notifier) on macOS.
|
||
|
||
### `codex exec` to run Codex programmatically/non-interactively
|
||
|
||
To run Codex non-interactively, run `codex exec PROMPT` (you can also pass the prompt via `stdin`) and Codex will work on your task until it decides that it is done and exits. Output is printed to the terminal directly. You can set the `RUST_LOG` environment variable to see more about what's going on.
|
||
|
||
### Use `@` for file search
|
||
|
||
Typing `@` triggers a fuzzy-filename search over the workspace root. Use up/down to select among the results and Tab or Enter to replace the `@` with the selected path. You can use Esc to cancel the search.
|
||
|
||
### Esc–Esc to edit a previous message
|
||
|
||
When the chat composer is empty, press Esc to prime “backtrack” mode. Press Esc again to open a transcript preview highlighting the last user message; press Esc repeatedly to step to older user messages. Press Enter to confirm and Codex will fork the conversation from that point, trim the visible transcript accordingly, and pre‑fill the composer with the selected user message so you can edit and resubmit it.
|
||
|
||
In the transcript preview, the footer shows an `Esc edit prev` hint while editing is active.
|
||
|
||
### `--cd`/`-C` flag
|
||
|
||
Sometimes it is not convenient to `cd` to the directory you want Codex to use as the "working root" before running Codex. Fortunately, `codex` supports a `--cd` option so you can specify whatever folder you want. You can confirm that Codex is honoring `--cd` by double-checking the **workdir** it reports in the TUI at the start of a new session.
|
||
|
||
### Shell completions
|
||
|
||
Generate shell completion scripts via:
|
||
|
||
```shell
|
||
codex completion bash
|
||
codex completion zsh
|
||
codex completion fish
|
||
```
|
||
|
||
### Experimenting with the Codex Sandbox
|
||
|
||
To test to see what happens when a command is run under the sandbox provided by Codex, we provide the following subcommands in Codex CLI:
|
||
|
||
```
|
||
# macOS
|
||
codex debug seatbelt [--full-auto] [COMMAND]...
|
||
|
||
# Linux
|
||
codex debug landlock [--full-auto] [COMMAND]...
|
||
```
|
||
|
||
### Selecting a sandbox policy via `--sandbox`
|
||
|
||
The Rust CLI exposes a dedicated `--sandbox` (`-s`) flag that lets you pick the sandbox policy **without** having to reach for the generic `-c/--config` option:
|
||
|
||
```shell
|
||
# Run Codex with the default, read-only sandbox
|
||
codex --sandbox read-only
|
||
|
||
# Allow the agent to write within the current workspace while still blocking network access
|
||
codex --sandbox workspace-write
|
||
|
||
# Danger! Disable sandboxing entirely (only do this if you are already running in a container or other isolated env)
|
||
codex --sandbox danger-full-access
|
||
```
|
||
|
||
The same setting can be persisted in `~/.codex/config.toml` via the top-level `sandbox_mode = "MODE"` key, e.g. `sandbox_mode = "workspace-write"`.
|
||
|
||
## Code Organization
|
||
|
||
This folder is the root of a Cargo workspace. It contains quite a bit of experimental code, but here are the key crates:
|
||
|
||
- [`core/`](./core) contains the business logic for Codex. Ultimately, we hope this to be a library crate that is generally useful for building other Rust/native applications that use Codex.
|
||
- [`exec/`](./exec) "headless" CLI for use in automation.
|
||
- [`tui/`](./tui) CLI that launches a fullscreen TUI built with [Ratatui](https://ratatui.rs/).
|
||
- [`cli/`](./cli) CLI multitool that provides the aforementioned CLIs via subcommands.
|