Skip to main content
Glama
blhsing

Codex Ask User

by blhsing
README.md
# Codex Ask User

Codex Ask User is a local [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that gives Codex a native, structured way to clarify requirements before it commits to a plan or implementation.

It uses MCP elicitation so Codex CLI and Codex desktop can display native controls for:

- single-choice questions;
- multiple-choice questions;
- free-text and custom answers;
- recommended choices that are labeled and preselected;
- a **Discuss with Codex first** path that returns to chat before asking again;
- session-scoped automatic selection of recommended answers.

## Requirements

- Node.js 20 or newer
- Codex CLI or Codex desktop with MCP elicitation enabled

## Build and test

```sh
npm install
npm test
```

The build produces a self-contained MCP server at `plugins/ask-user/dist/server.js`.

## Install as a Codex MCP server

Build the project, then register the generated server using its absolute path:

```sh
codex mcp add ask-user -- node /absolute/path/to/codex-ask-user/plugins/ask-user/dist/server.js
```

Start a new Codex CLI session or desktop task after registration. The server exposes these tools:

- `ask_user` presents one to three single-choice, multiple-choice, or free-text questions.
- `set_question_preferences` enables, disables, or reports automatic use of recommended answers for the current MCP session.

The repository also contains an installable Codex plugin bundle in `plugins/ask-user`. Its `.mcp.json` uses `${PLUGIN_ROOT}`, so the bundle remains relocatable.

`ask_user` is the plugin's MCP tool, not Codex's built-in `request_user_input` tool. It is available in both Default and Plan collaboration modes. If an agent says it cannot ask because `request_user_input` is restricted to Plan mode, explicitly ask it to use the **Ask User plugin's `ask_user` MCP tool** instead. The server advertises this distinction in both its instructions and tool description.

## Codex approval policy

MCP elicitation must be allowed by the active Codex approval policy. To keep other prompt categories non-interactive while allowing questions, use:

```toml
approval_policy = { granular = { sandbox_approval = false, rules = false, mcp_elicitations = true, request_permissions = false, skill_approval = false } }
```

In Codex desktop, the task's permission selector can override `config.toml`. **Full access** uses an approval policy that rejects MCP elicitations without displaying the question. Select the custom configuration and start a new task after changing the policy.

If `ask_user` immediately returns `declined` without visible UI, check the task's active approval policy before treating the result as a user decision.

## Example

An agent can call `ask_user` with a recommended option and an open-ended alternative:

```json
{
  "questions": [
    {
      "id": "database",
      "header": "Database",
      "question": "Which database should back the first release?",
      "kind": "single",
      "options": [
        {
          "label": "PostgreSQL",
          "description": "A strong default for production workloads.",
          "recommended": true
        },
        {
          "label": "SQLite",
          "description": "Simpler deployment for a local-first application."
        }
      ],
      "allow_other": true,
      "allow_discussion": true
    }
  ]
}
```

Selecting **Always use recommended choices** automatically resolves later questions that have recommendations during the current MCP session. Questions without recommendations are still shown. Ask Codex to stop auto-selecting recommendations to restore the default behavior.

## Development

```sh
npm run check
npm run build
npm test
```

- `src/server.ts` contains the MCP server and tool implementation.
- `tests/server.test.js` tests elicitation flows through an in-memory MCP client.
- `scripts/build.mjs` bundles the server with esbuild.
- `plugins/ask-user` contains the Codex plugin manifest and MCP configuration.

## Author

[blhsing](https://github.com/blhsing)