Agentic refactoring and full MCP support by gustavo-grieco · Pull Request #1502 · crytic/echidna

5 min read Original article ↗

@gustavo-grieco

This was referenced

Dec 18, 2025

@gustavo-grieco

datradito added a commit to datradito/echidna-mcp that referenced this pull request

Mar 18, 2026
The clean PR branch is based on upstream/dev-agents (PR crytic#1502) which uses
the '--server' flag name. Documentation was written for the development
branch which used '--mcp-port', causing inconsistency.

Changes:
- AGENT_TESTING_GUIDE.md: Update all command examples
- test-mcp-client.py: Fix error message
- examples/README.md: Update all 3 command examples
- examples/simple_agent.py: Fix error message
- examples/langgraph_agent.py: Fix error message
- tests/mcp/conftest.py: Fix pytest fixture command
- .gitignore: Add Python cache patterns

This ensures documentation matches the actual upstream implementation.

datradito added a commit to datradito/echidna-mcp that referenced this pull request

Mar 18, 2026
- Update examples/README.md to list correct 7 tools
- Fix mcp_client_wrapper.py to use upstream tool names:
  * inject_fuzz_transactions (not inject_transaction)
  * clear_fuzz_priorities (not clear_priorities)
  * status, target, show_coverage, reload_corpus, dump_lcov
- Mark old test files as skipped (use old tool names):
  * test_corpus.py - get_corpus_size, inspect_corpus, find_transaction
  * test_injection.py - inject_transaction (old signature)
  * test_prioritization.py - prioritize_function
  * test_read_logs.py - read_logs (commented out in upstream)
- Update docstring: 7 active tools (not 9)

These tests are preserved for reference but skipped until updated to match
upstream API from PR crytic#1502.

datradito added a commit to datradito/echidna-mcp that referenced this pull request

Mar 18, 2026
The clean PR branch is based on upstream/dev-agents (PR crytic#1502) which uses
the '--server' flag name. Documentation was written for the development
branch which used '--mcp-port', causing inconsistency.

Changes:
- AGENT_TESTING_GUIDE.md: Update all command examples
- test-mcp-client.py: Fix error message
- examples/README.md: Update all 3 command examples
- examples/simple_agent.py: Fix error message
- examples/langgraph_agent.py: Fix error message
- tests/mcp/conftest.py: Fix pytest fixture command
- .gitignore: Add Python cache patterns

This ensures documentation matches the actual upstream implementation.

datradito added a commit to datradito/echidna-mcp that referenced this pull request

Mar 18, 2026
- Update examples/README.md to list correct 7 tools
- Fix mcp_client_wrapper.py to use upstream tool names:
  * inject_fuzz_transactions (not inject_transaction)
  * clear_fuzz_priorities (not clear_priorities)
  * status, target, show_coverage, reload_corpus, dump_lcov
- Mark old test files as skipped (use old tool names):
  * test_corpus.py - get_corpus_size, inspect_corpus, find_transaction
  * test_injection.py - inject_transaction (old signature)
  * test_prioritization.py - prioritize_function
  * test_read_logs.py - read_logs (commented out in upstream)
- Update docstring: 7 active tools (not 9)

These tests are preserved for reference but skipped until updated to match
upstream API from PR crytic#1502.

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

@gustavo-grieco

Vendors the out-of-process MCP test harness, example LangGraph/Claude agent,
test contracts, and CI workflow authored by Dani Tradito (@datradito) in
#1509, as the base for a robust external MCP testing strategy
on this branch (protocol-conformance + Claude/Codex client simulation are
layered on top in follow-up commits).

Source: #1509

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Layers an out-of-process protocol-conformance and client-compatibility suite on
top of the integration scaffolding vendored from #1509:

- conftest.py: one session-scoped Echidna+MCP server shared by all modules
  (honors ECHIDNA_MCP_URL to target an already-running server)
- _mcp_client.py: dependency-light wire-level JSON-RPC/HTTP helpers
- test_mcp_conformance.py: asserts the transport guarantees strict clients need
  (notification -> 202 empty body, GET SSE -> 405, handshake, error codes)
- test_mcp_codex.py: replays Codex's strict rmcp handshake
- test_mcp_claude.py: drives the server with the official `mcp` SDK (Claude)
- test_mcp.py: refactored to share the conftest fixture (originally @datradito)
- mcp-tests.yml: CI runs the full suite (tools + conformance + Claude + Codex)

Verified end-to-end: 12/12 pass against the current (fixed) server; against the
pre-fix haskell-mcp-server (9fd60af) the conformance + Codex tests fail on the
`200 {}` notification (the bug that broke Codex) while the lenient Claude SDK
passes -- which is exactly why the strict conformance/Codex layer is needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

github-advanced-security[bot]

Addresses the CodeQL 'workflow does not contain permissions' alert on
#1502: the job only checks out the repo and runs tests, so
restrict GITHUB_TOKEN to contents: read.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The MCP job was building echidna from source (cold 'nix build .#echidna', no
cache), taking 30-60 min and never reaching the test steps. Mirror the repo's
other Nix jobs: install via DeterminateSystems and pull prebuilt closures from
the trailofbits Cachix, so the build takes minutes. Add a concurrency group so
a new push cancels the previous in-flight run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The job had the echidna binary and Python but not crytic-compile/solc, so
echidna exited immediately ('crytic-compile not installed') and every MCP test
errored in the fixture. Install crytic-compile + solc-select and select solc
0.8.25 for the test contract.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The nix build pinned the pre-fix haskell-mcp-server (9fd60af), so the
nix-built echidna (CI, docker, releases) shipped the codex-incompatible MCP
transport even though stack.yaml was updated. Point the flake at the fixed
commit too. sha256 placeholder is corrected in the follow-up once CI reports it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>