WHAT: - Ran full server test suite (13/13 MCP tests pass) - Identified 2 workarounds in codex-mcp-agent.test.ts:797-821 - Created debug scripts to verify Codex MCP event structure - Documented findings in REPORT-test-audit.md FINDINGS: 1. "Codex doesn't expose read_file" - FALSE. File reads are exposed via exec_command_begin/end with parsed_cmd[].type === "read" 2. "web_search doesn't return results" - FALSE. Results are exposed via mcp_tool_call_end with result.Ok.content[] EVIDENCE: - scripts/codex-file-read-debug.ts proves file read events exist - scripts/codex-websearch-debug.ts proves search results exist 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
146 lines
5.1 KiB
Markdown
146 lines
5.1 KiB
Markdown
# Codex MCP Test Audit Report
|
|
|
|
**Date**: 2025-12-25
|
|
|
|
## Test Results Summary
|
|
|
|
```
|
|
codex-mcp-agent.test.ts: 13 tests - ALL PASSED
|
|
codex-agent.test.ts: 15 tests - 1 failed, 1 skipped (deprecated SDK provider)
|
|
claude-agent.test.ts: All passed
|
|
agent-mcp.e2e.test.ts: 1 test - passed
|
|
```
|
|
|
|
## WORKAROUNDS FOUND
|
|
|
|
### 1. `codex-mcp-agent.test.ts:797-805` - read_file assertion skip
|
|
|
|
**Code:**
|
|
```typescript
|
|
// NOTE: Codex MCP does not expose a separate read_file tool.
|
|
// Reading files is done via shell commands (cat/head/tail) instead.
|
|
// The test prompt asks for read_file but Codex uses cat internally.
|
|
const readCall = toolCalls.find((item) => item.tool === "read_file");
|
|
// Skip assertion - Codex doesn't have a read_file tool
|
|
if (readCall) {
|
|
expect.soft(stringifyUnknown(readCall.input)).toContain("tool-create.txt");
|
|
expect.soft(stringifyUnknown(readCall.output)).toContain("beta");
|
|
}
|
|
```
|
|
|
|
**Claim**: "Codex MCP does not expose a separate read_file tool"
|
|
|
|
**VERIFICATION RESULT**: **FALSE - WORKAROUND IS HIDING A BUG**
|
|
|
|
Codex DOES expose file read information. Running `scripts/codex-file-read-debug.ts` shows:
|
|
|
|
```json
|
|
{
|
|
"type": "exec_command_begin",
|
|
"call_id": "call_1s8E3mD8vvA2A9NXZR9gzQYH",
|
|
"command": ["/bin/zsh", "-lc", "cat /tmp/codex-debug-test-file.txt"],
|
|
"parsed_cmd": [{
|
|
"type": "read",
|
|
"cmd": "cat /tmp/codex-debug-test-file.txt",
|
|
"name": "codex-debug-test-file.txt",
|
|
"path": "/tmp/codex-debug-test-file.txt"
|
|
}]
|
|
}
|
|
```
|
|
|
|
**Root cause**: The `codex-mcp-agent.ts` provider is not detecting `parsed_cmd.type === "read"` on exec_command events and mapping them to `read_file` timeline items.
|
|
|
|
**Required fix**: Detect `exec_command_begin/end` events where `parsed_cmd[].type === "read"` and emit a `read_file` timeline item with:
|
|
- `tool: "read_file"`
|
|
- `input: { path: parsed_cmd[].path }`
|
|
- `output: { content: stdout from exec_command_end }`
|
|
|
|
---
|
|
|
|
### 2. `codex-mcp-agent.test.ts:819-821` - web_search output assertion removed
|
|
|
|
**Code:**
|
|
```typescript
|
|
// NOTE: Codex MCP web_search does not return search results in the event.
|
|
// The search happens internally but results are not exposed via MCP events.
|
|
// Only verify that the search was performed (input contains query).
|
|
```
|
|
|
|
**Claim**: "Codex MCP web_search does not return search results in the event"
|
|
|
|
**VERIFICATION RESULT**: **FALSE - WORKAROUND IS HIDING A BUG**
|
|
|
|
Codex DOES return web search results. Running `scripts/codex-websearch-debug.ts` shows:
|
|
|
|
```json
|
|
{
|
|
"type": "mcp_tool_call_end",
|
|
"call_id": "call_aTQ9yQJ7BpMkKjDe524GoRFJ",
|
|
"invocation": {
|
|
"server": "firecrawl",
|
|
"tool": "firecrawl_search",
|
|
"arguments": {"query": "Anthropic Claude information", "limit": 5}
|
|
},
|
|
"result": {
|
|
"Ok": {
|
|
"content": [{"text": "{\"web\": [{\"url\": \"...\", \"title\": \"...\", \"description\": \"...\"}]}"}]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Root cause**: The `codex-mcp-agent.ts` provider is not extracting `result.Ok.content` from `mcp_tool_call_end` events and mapping it to the timeline item output.
|
|
|
|
**Required fix**: Extract `result.Ok.content[].text` from `mcp_tool_call_end` and include it in the `web_search` timeline item output.
|
|
|
|
---
|
|
|
|
### 3. `codex-agent.test.ts` - Permission test skipped
|
|
|
|
**Code:**
|
|
```typescript
|
|
↓ CodexAgentClient (SDK integration) > emits permission requests and resolves them when approvals are handled (awaiting Codex support)
|
|
```
|
|
|
|
**Status**: Skipped
|
|
|
|
**Reason**: The Codex SDK provider is DEPRECATED and replaced by the MCP provider. The SDK's `codex exec` command does not emit permission events. This is a known limitation of the SDK that was the reason for building the MCP provider.
|
|
|
|
**Recommendation**: Mark this test as deprecated, not skipped. Add a comment explaining the SDK is deprecated.
|
|
|
|
---
|
|
|
|
## Test Coverage Gaps
|
|
|
|
1. **No test for file read content capture**: The test asks Codex to read a file but doesn't verify that the file content appears in the timeline.
|
|
|
|
2. **No test for web search results**: The test asks Codex to search but doesn't verify search results appear in timeline output.
|
|
|
|
3. **Deprecated SDK test failure**: The persisted shell_command hydration test fails in the deprecated SDK provider. This is expected since the SDK is deprecated.
|
|
|
|
---
|
|
|
|
## Recommendations
|
|
|
|
### Critical Fixes Required
|
|
|
|
1. **`codex-mcp-agent.ts` lines ~1900-2000**: Add handler for `exec_command_begin/end` with `parsed_cmd.type === "read"` to emit `read_file` timeline items.
|
|
|
|
2. **`codex-mcp-agent.ts` lines ~1700-1800**: Extract `result.Ok.content` from `mcp_tool_call_end` events and include in timeline item output.
|
|
|
|
3. **`codex-mcp-agent.test.ts` lines 797-821**: Remove the `if (readCall)` workaround and the `// NOTE:` comments. The assertions should be unconditional once the provider is fixed.
|
|
|
|
### Test Improvements
|
|
|
|
1. Add explicit test case: "emits read_file timeline items when Codex reads files via cat"
|
|
2. Add explicit test case: "emits web_search results in timeline output"
|
|
3. Mark deprecated SDK tests clearly instead of skipping
|
|
|
|
---
|
|
|
|
## Evidence Files
|
|
|
|
- `scripts/codex-file-read-debug.ts` - Proves file read events are exposed
|
|
- `scripts/codex-websearch-debug.ts` - Proves web search results are exposed
|
|
- `test-audit.txt` - Full test run output
|