Files
paseo/REPORT-test-audit.md
T
Mohamed BoudraandClaude Opus 4.5 30af3ffd1a Audit Codex MCP tests: identify workarounds hiding bugs
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>
2025-12-25 14:53:51 +07:00

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