config.toml. The MCP route takes your own API key, so it is the one to use on a paid tier — but it needs a second step that is easy to miss.
Install
Add the server
Add the following to~/.codex/config.toml:
X-API-Key header, not an environment variable — Codex reads nothing from KEENABLE_API_KEY for a remote server. Create one in the console; see Authentication. Omit the http_headers line and the server still answers, on the shared public tier at lower rate limits.
Turn off the built-in search
Codex enables web search by default for local chats, incached mode — results come from an index OpenAI maintains rather than a live fetch. Setting web_search to disabled removes that tool entirely, and with nothing to fall back on Codex uses search_web_pages for every lookup.
It is a top-level key, so it has to sit above the [mcp_servers.keenable] line. A bare key written after a table header belongs to that table, which would make it mcp_servers.keenable.web_search — not a setting Codex looks at, and it fails quietly. The finished file:
The mode key takes four values:
cached (the default), indexed, live, and disabled. A full-access sandbox — --yolo or danger-full-access — silently upgrades cached to live, so a permissive session searches the live web whether or not you asked for it.Don’t confuse the mode with the [tools.web_search] table, which carries settings like allowed_domains and context_size and does not switch the tool off. Older releases used [tools] web_search = true and then [features] web_search_request = true; both are deprecated in favour of the top-level key.codex --profile research. Here the key belongs inside the table, which is the one place nesting it is correct:
Tell the agent which tool to use
Codex readsAGENTS.md for project instructions — ~/.codex/AGENTS.md applies everywhere. Naming the tools there is worth doing even with the built-in search disabled, because Codex loads MCP tool schemas on demand: it sees a tool’s name and description upfront and fetches the rest only when it decides the tool is relevant, so that decision is made on the description alone.
Verify
Run/mcp in the TUI to confirm the server connected and both tools are listed, then ask something that needs the live web. Codex should call search_web_pages without being told to.
Still going around Keenable on a recent Codex? Check
codex --version. Releases before v0.121.0 registered on-demand tool names in a format their own lookup table did not match, which produced exactly this symptom for every MCP server, not just this one.No config file
Keenable is also published in OpenAI’s Plugins Directory, the catalog Codex shares with ChatGPT — OAuth sign-in, nothing to paste. See ChatGPT and Codex. The built-in search competes there too, so theweb_search change above is worth making either way.
→ Full MCP server reference