Unlimited Codex, Inside ChatGPT Codexify, an open-source Rust project, enables ChatGPT Web Pro users to run Codex-style local tooling by bridging ChatGPT to local machine tools such as file read/write, shell commands, git operations, and search via an MCP server, with support for OpenAI's Secure MCP Tunnel for secure remote access. The tool, implemented with tokio, axum, and the rmcp SDK, aggregates other MCP servers and follows Codex agent contracts for tools like apply_patch, exec_command, and view_image. Codex-style local tooling for ChatGPT, implemented in Rust. πŸ“– New here? Start with theβ€” an end-user guide covering Wiki installation , every CLI argument , every config option , and how it all works end-to-end . This README is the complete technical reference; the wiki is the friendlier path in. A local MCP bridge server that lets ChatGPT Web Pro call tools on your machine: read/write files, run shell commands, git operations, and search. Codexify is implemented in Rust with tokio + axum and the official rmcp https://crates.io/crates/rmcp SDK over Streamable HTTP. It can expose the local MCP endpoint through OpenAI's native Secure MCP Tunnel https://developers.openai.com/api/docs/guides/secure-mcp-tunnels , without opening an inbound port or publishing a general-purpose URL. In native-tunnel mode, Codexify listens only on 127.0.0.1 , protects the MCP endpoint with a random per-process bearer token, starts OpenAI's official runtime-only tunnel client, and supervises it for the lifetime of the server. The tunnel client makes outbound HTTPS requests to OpenAI and forwards tunnel traffic to the authenticated loopback MCP endpoint. Externally managed tunnels are also supported. The tool set follows Codex https://github.com/openai/codex agent contracts for apply patch , exec command / write stdin , view image , update plan , clock curr time / clock sleep , project instructions, and skills. Codexify also bridges ChatGPT-native attachments and generated files into the active local project, returns project files as downloadable MCP resources, proxies resource links returned by bridged MCP servers, bounds model-visible tool output, persists task notes and plans, and records project-scoped diff checkpoints. Codexify can also aggregate other MCP servers . It connects to local stdio servers or remote Streamable HTTP endpoints, keeps automatically imported Codex/plugin tool catalogues private by default, and gives the ChatGPT-side agent a fixed ranked discovery/schema/call surface. Direct exposure and single-dispatcher gateway modes are configurable per upstream. flowchart LR ChatGPT "ChatGPT Web Pro" OpenAITunnel "OpenAI Secure MCP Tunnel" TunnelClient "Official OpenAI\ntunnel-client-runtime" Server "Codexify\nMCP Bridge\n127.0.0.1:3000" Tools "Tool Registry" FS "read file\nwrite file\nlist directory\ntree" Ingress "import host file" Egress "export host file" Search "glob\ngrep" Git "git status\nshow diff\ngit push\ngit commit\ngit log" Edit "apply patch" Exec "exec command\nwrite stdin" Agent "view image\nupdate plan\nclock curr time\nclock sleep" Env "get agent brief\nget environment\nget project doc" Mem "remember\nrecall" Skills "skills list\nskills read" ListProjects "list projects" SetRoot "set project root" Bridge "MCP aggregator\n bridge.rs " WorkDir "Project root\nper-conversation in\nmulti-project mode" HostFiles "ChatGPT attachments\nand generated files" ArtifactCache "Bounded immutable\nfile snapshots" State "~/.codexify\nmemory per project " Bindings "~/.codexify\nconversation-projects" Worktree "Managed Git worktree\nper-conversation checkout,\nswept on startup" ExecSessions "Conversation exec sessions\n in memory, idle-reaped " DiffRefs "Git refs/codexify/diff\nproject-open + last-diff" DiffUI "MCP App diff card\nui://codexify/diff/v3/mcp-app.html" SkillDirs ".agents/skills\n.codex/skills\n.claude/skills" CodexCfg "$CODEX HOME\nconfig.toml" CodexCli "optional Codex CLI\nmcp list/get --json" Upstream "Upstream MCP servers\nstdio / Streamable HTTP" ChatGPT <-- |"connector calls"| OpenAITunnel TunnelClient <-- |"outbound HTTPS"| OpenAITunnel TunnelClient <-- |"loopback HTTP\n/mcp"| Server Server -- "Streamable HTTP\n MCP Protocol " -- Tools Tools -- FS Tools -- Ingress Tools -- Egress Tools -- Search Tools -- Git Tools -- Edit Tools -- Exec Tools -- Agent Tools -- Env Tools -- Mem Tools -- Skills Tools -.- |"multi-project mode"| ListProjects Tools -.- |"multi-project mode"| SetRoot Tools -- Bridge FS -- WorkDir HostFiles -- Ingress Ingress -- WorkDir WorkDir -- Egress Egress -- ArtifactCache Server <-- |"resource link / resources/read"| ArtifactCache Search -- WorkDir Shell -- WorkDir Edit -- WorkDir Exec -- WorkDir Agent -- WorkDir Env -- WorkDir Mem -- State Skills -- SkillDirs ListProjects -.- |"selector"| SetRoot SetRoot -- Bindings SetRoot -.- |"worktree mode"| Worktree Worktree -.- |"active checkout"| WorkDir Exec -- ExecSessions Git -- DiffRefs Git -.- DiffUI SetRoot -.- |"selects"| WorkDir CodexCfg -.- |"project candidates"| ListProjects CodexCfg -.- |"auto-import"| Bridge CodexCli -.- |"plugin/effective MCPs"| Bridge Bridge -- Upstream Dotted edges are conditional: list projects and set project root appear only in multi-project mode multi-project-mode . The first discovers selectable candidates from Codex's project trust table plus optional local metadata; the second binds this conversation's project root, optionally provisioning a detached managed Git worktree worktrees.mode that becomes the active checkout so concurrent chats never share a working tree. Independently, the aggregator auto-imports automatic-discovery-from-codex compatible stdio and Streamable HTTP MCP servers directly from Codex's config.toml , then uses the Codex CLI when available to add plugin-provided servers before applying any codexify.config.json overlays. Linux and macOS: curl -qfsSL https://codexify.dev/install.sh | sh Windows PowerShell: powershell -ExecutionPolicy ByPass -c "irm https://codexify.dev/install.ps1 | iex" The installer downloads the latest release archive, verifies it against the published SHA-256 checksums, and replaces the executable under ~/.codexify/bin . On Unix it adds that directory to every recognized existing shell profile and creates the active shell's profile when needed. On Windows it updates the persistent user PATH . The macOS installer removes the executable's com.apple.quarantine attribute after installation. It also installs and starts the per-user Codexify background service. Set CODEXIFY SKIP SERVICE=1 in the installer process to install only the executable and PATH entry. Run the guided setup from an installed binary: codexify quickstart Or run it directly from a source checkout: cargo run --release -- quickstart The wizard asks which project directory ChatGPT may access and whether that directory is one project or a multi-project access root. It then walks through creating an OpenAI Secure MCP Tunnel, entering the tunnel ID and runtime API key, and creating the matching ChatGPT developer-mode connector. Advanced policies, including optional per-conversation authorization, are configured manually rather than presented during first-run onboarding. The relevant OpenAI and ChatGPT links are printed together with the exact connection values to use. The runtime key is entered without terminal echo and stored in a dedicated per-tunnel file under ~/.codexify/openai-tunnel/credentials/ . On Unix, the wizard restricts the credential directory and file to the current user. The wizard writes ~/.codexify/codexify.config.json by default; that file receives the absolute workDir , a file: reference to the runtime key, and the selected project mode; unrelated JSON settings are preserved. When the background service is installed, quickstart updates its definition and restarts it with this config. Otherwise, the wizard offers to start Codexify in the current terminal. When an existing config already contains conversationAuthToken , quickstart preserves it, restricts the config file to the current user on Unix, and prints the one-line instruction required to authorize a chat. It does not offer to enable or rotate this advanced feature. Keep a token-bearing config out of version control and do not share it. Set CODEXIFY CONFIG=/path/to/codexify.config.json or use codexify quickstart --config /path/to/codexify.config.json to update a different config file. --work-dir /path/to/project changes the directory initially shown by the wizard. - Create or obtain a tunnel ID in OpenAI Platform tunnel settings https://platform.openai.com/settings/organization/tunnels . - Create a restricted runtime API key https://platform.openai.com/settings/organization/api-keys whose principal has Tunnels Read + Use for that tunnel. Keep tunnel-management/admin credentials separate. - Add the tunnel to ~/.codexify/codexify.config.json : { "workDir": "/absolute/path/to/your/project", "openaiTunnel": { "tunnelId": "tunnel 0123456789abcdef0123456789abcdef", "apiKeyRef": "env:CONTROL PLANE API KEY" } } - Put the runtime key in the referenced environment variable and start Codexify: export CONTROL PLANE API KEY='...' cargo run --release -- --work-dir /path/to/your/project On first use, Codexify downloads the pinned runtime-only build of OpenAI's official tunnel-client https://github.com/openai/tunnel-client , verifies the archive against the per-platform SHA-256 embedded in this Codexify build, and installs it under ~/.codexify/openai-tunnel/ . Codexify reports ready only after the runtime's /readyz check succeeds and its metrics show a successful control-plane poll. The runtime-only binary exposes loopback /healthz , /readyz , and /metrics endpoints; it intentionally does not include the full client's admin UI.To use a preinstalled official client, set openaiTunnel.clientPath or pass --openai-tunnel-client /path/to/tunnel-client-runtime . Codexify checks the binary's version surface and required flags before starting it. cargo run --release -- --work-dir /path/to/your/project Without openaiTunnel , the server listens on 0.0.0.0:3000 , serves MCP at /mcp , and serves /health . This mode is intended for local clients or an explicitly configured reverse proxy/tunnel. Do not publish it without authentication and network-level access controls. To reuse one server across several independent projects, point it at their common parent and enable multi-project mode: cargo run --release -- --work-dir /path/to/projects --multi-project Here --work-dir is an access root , not the active project. In ChatGPT, call set project root directly when the exact relative/absolute path, an HTTPS/SSH Git repository URL ending in .git , or a supported GitHub repository, branch, pull-request, or commit URL is known. Repository URLs reuse an unambiguous matching checkout already below the access root, or run git clone in the configured project clone directory before binding. GitHub branch, PR, and commit URLs select their exact targets without switching an unrelated source checkout. Otherwise list projects can search the read-only project catalogue by name, alias, description, or relative selector first. Codexify keys the resulting binding from ChatGPT's meta "openai/session" conversation identifier and persists it outside the repository, so later turns in the same chat recover the project after an MCP reconnect or codexify restart. A new chat gets a new binding and an existing chat cannot switch projects. Clients that do not provide openai/session fall back to a one-time MCP transport-session binding and must select again after reconnecting. Set a high-entropy authentication token manually in the config. The token itself, not a digest of another secret, must look like a SHA-256 value: exactly 64 lowercase hexadecimal characters. For example: python python -c 'import secrets; print secrets.token hex 32 ' { "conversationAuthToken": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" } When this key is present, Codexify rejects every ordinary tool call until the current chat presents that exact token once. A successful check authorizes only the stable ChatGPT conversation that made the call. The project-aware initialization brief is withheld until authorization succeeds; the gate response then directs the client to load it with get agent brief . The MCP wire surface deliberately calls this authorization tool setup and its token parameter ref . ChatGPT can otherwise falsely classify a token-looking connector call as an unsafe secret leak and refuse to make the call. Keeping the actual token in a SHA-256-shaped format and using the innocuous setup ref names avoids that false positive. ref is the authentication token, remains secret, and is submitted verbatim; no digest transformation is applied. This extra gate is necessary because ChatGPT's connector OAuth state controls whether the account can use the connector at all; it does not independently authorize each conversation or ChatGPT Project. conversationAuthToken adds that missing conversation-level boundary after the connector has already been made available to the account. For ChatGPT, the authorization grant is keyed by the hash of meta "openai/session" and persisted under ~/.codexify/conversation-authorizations/ , so it survives MCP transport replacement and Codexify restarts. The marker contains neither the token nor the raw conversation identifier. Its namespace is derived from the canonical work directory and current token, so rotating conversationAuthToken invalidates earlier grants. MCP clients without stable conversation metadata fall back to authorization for the current transport only. Use this one-line instruction, replacing REF with the exact configured token: To use this connector in a chat, call its setup tool once with ref REF . Paste it into an individual chat, or add it to the ChatGPT Project's Project instructions https://help.openai.com/en/articles/10169521-projects-in-chatgpt so chats created in that project can authorize themselves automatically. The token is an application-level gate for model conversations, not a replacement for tunnel, HTTP, workspace, or operating-system access controls. It is plaintext in the config by design; anyone who can read that file can authorize another chat. To build a standalone binary: cargo build --release ./target/release/codexify --work-dir /path/to/your/project Each release ships a compiled binary per platform β€” windows-x64 , linux-x64 , linux-arm64 , darwin-x64 and darwin-arm64 . Download the archive for your OS/arch, unpack it, and run codexify --work-dir … . These are native builds, so there is no AVX2/baseline caveat: the binary runs on any CPU of its architecture. | Command | Description | |---|---| quickstart | Interactively configure the project scope, native OpenAI tunnel credentials, JSON config, and ChatGPT developer-mode connector; restart the installed service or optionally start a foreground server | service install | Install, enable, and start the native per-user service using the selected absolute config path | service enable | Enable and start an installed service | service disable | Stop and disable the installed service | service remove | Stop and remove the installed service definition | service logs -f | Print the latest service log lines; -f follows new output | quickstart writes ~/.codexify/codexify.config.json by default. It accepts --config