codevanta 0.2.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codevanta-0.2.0 → codevanta-0.2.1}/CHANGELOG.md +11 -0
- {codevanta-0.2.0/src/codevanta.egg-info → codevanta-0.2.1}/PKG-INFO +1 -1
- {codevanta-0.2.0 → codevanta-0.2.1}/pyproject.toml +1 -1
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/server.py +201 -0
- {codevanta-0.2.0 → codevanta-0.2.1/src/codevanta.egg-info}/PKG-INFO +1 -1
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_mcp_tools.py +14 -1
- {codevanta-0.2.0 → codevanta-0.2.1}/LICENSE +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/MANIFEST.in +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/README.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/api.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/architecture.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/assets/callgraph.png +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/assets/cli.png +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/assets/gui.png +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/attribution.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/install.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2b.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2c.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2d.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2e.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2f.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2g.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2h.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2i.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2j.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase2k.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase3.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/phase6.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/release-checklist.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/repository-settings.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/docs/samples.md +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/requirements.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/agent_commit.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/bench.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/bench_gate.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/check_decompiler_backends.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/fuzz_parsers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/install.ps1 +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/install.sh +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/make_samples.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/scripts/report_bundle.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/setup.cfg +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/adb.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/apple_ips.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/asar.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/binary_diff.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/binmeta.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/callgraph.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/cdp_client.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/cfg.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/compare.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/containers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/crash_core.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/dataflow.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/debug_session.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/debugger.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/debuginfo.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/decompile.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/decompilers/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/decompilers/angr_backend.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/decompilers/base.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/decompilers/ghidra_backend.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/dynamic.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/emulate.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/evidence_bundle.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/fdt.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/function_hash.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/graph_export.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/html_view.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/jump_tables.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/nav.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/nav_providers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/sigrok_cli_wrap.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/sigrok_sr.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/solver.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/sqlite_view.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/symbolic.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/trace.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/type_propagation.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/type_recovery.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/uart_decode.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/vtables.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/analysis/xrefs.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/api/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/containers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/crash.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/main.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/meta.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/mobile.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/nav.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/signal.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/cli/web.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/disassembler.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/entropy.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/functions.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/loader.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/report.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/strings.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/core/unknowns.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/evidence/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/evidence/confidence.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/evidence/models.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/evidence/provenance.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/gui/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/gui/layout.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/gui/server.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/ir/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/ir/adapters/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/ir/base.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/ir/instruction.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_bin.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_crash.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_meta.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_mobile.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_nav.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_signal.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_solver.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/ext_web.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/mcp_server/tools.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/plugins/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/setup/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/setup/apply.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/setup/clients.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/setup/plan.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/setup/verify.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/storage/__init__.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta/storage/session.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta.egg-info/SOURCES.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta.egg-info/dependency_links.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta.egg-info/entry_points.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta.egg-info/requires.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/src/codevanta.egg-info/top_level.txt +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/conftest.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_adb.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_agent_commit.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_bench.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_bench_gate.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_binary_diff.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_callgraph.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cfg.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cfg_recursive.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_gui.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2b.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2d.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2e.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2f.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2g.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2h.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2i.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2j.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase2k.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase3.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_phase7.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_cli_trace.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_compare.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_containers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_crash.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_dataflow.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_debug_session.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_debugger.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_debuginfo.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_decompile.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_decompile_backends.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_decompiler_parity.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_disassembler.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_dynamic.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_emulate.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_entropy.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_evidence.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_evidence_bundle.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_fdt.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_function_hash.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_functions.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_fuzz_parsers.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_graph_export.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_gui.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_html_view.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_jump_tables.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_loader.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_meta.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_nav.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_plugins.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_report_bundle.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_report_callgraph.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_report_phase2.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_samples.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_session.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_setup_plan.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_signal.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_solver.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_strings.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_symbolic.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_symbolic_parity.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_tooling_config.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_trace.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_trace_samples.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_type_propagation.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_type_recovery.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_unknowns.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_vtables.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_web.py +0 -0
- {codevanta-0.2.0 → codevanta-0.2.1}/tests/test_xrefs.py +0 -0
|
@@ -4,6 +4,17 @@ All notable changes to CODEVANTA are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.2.1] - 2026-11-13
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- The 12 ext MCP tools introduced in 0.2.0 (crash, metadata auto-detect's
|
|
12
|
+
siblings: binmeta, sqlite, adb, web_inspect, asar, symbolic_solve,
|
|
13
|
+
signal_sr, uart_decode, dtb, nav, nav_providers) had import lines but were
|
|
14
|
+
never wired into `build_server`, so only 26 of the intended 38 tools were
|
|
15
|
+
actually registered. All 12 now have `@server.tool` wrappers and the full
|
|
16
|
+
38-name list is asserted in the test suite. `list_tools()` now returns 38.
|
|
17
|
+
|
|
7
18
|
## [0.2.0] - 2026-11-13
|
|
8
19
|
|
|
9
20
|
### Added
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codevanta"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.1"
|
|
8
8
|
description = "CODEVANTA — Advanced Code Intelligence: AI-Powered Reverse Engineering & Binary Analysis Platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -15,9 +15,21 @@ from mcp.server.mcpserver.exceptions import ToolError
|
|
|
15
15
|
from mcp.server.transport_security import TransportSecuritySettings
|
|
16
16
|
from pydantic import Field
|
|
17
17
|
|
|
18
|
+
from codevanta.analysis.cdp_client import DEFAULT_ENDPOINT as WEB_DEFAULT_ENDPOINT
|
|
19
|
+
from codevanta.analysis.cdp_client import DEFAULT_OBSERVE_MS as WEB_DEFAULT_OBSERVE_MS
|
|
20
|
+
from codevanta.analysis.solver import DEFAULT_TIMEOUT_MS as SOLVER_DEFAULT_TIMEOUT_MS
|
|
21
|
+
from codevanta.analysis.uart_decode import DEFAULT_BAUD as UART_DEFAULT_BAUD
|
|
22
|
+
from codevanta.analysis.uart_decode import DEFAULT_DATA_BITS as UART_DEFAULT_DATA_BITS
|
|
23
|
+
from codevanta.analysis.uart_decode import DEFAULT_PARITY as _UART_DEFAULT_PARITY
|
|
24
|
+
from codevanta.analysis.uart_decode import DEFAULT_STOP_BITS as UART_DEFAULT_STOP_BITS
|
|
18
25
|
from codevanta.core.report import AnalysisError
|
|
19
26
|
|
|
20
27
|
from . import tools
|
|
28
|
+
from .ext_solver import TOOL_DESCRIPTION as SYMBOLIC_SOLVE_DESCRIPTION
|
|
29
|
+
|
|
30
|
+
#: Upstream ``DEFAULT_PARITY`` is inferred plain ``str``; the MCP schema
|
|
31
|
+
#: publishes the literal union the UART decoder actually accepts.
|
|
32
|
+
UART_DEFAULT_PARITY = cast(Literal["none", "even", "odd"], _UART_DEFAULT_PARITY)
|
|
21
33
|
|
|
22
34
|
SERVER_NAME = "CODEVANTA"
|
|
23
35
|
SERVER_VERSION = "0.1.0"
|
|
@@ -651,6 +663,195 @@ def build_server() -> MCPServer:
|
|
|
651
663
|
def codevanta_metadata(path: str) -> dict:
|
|
652
664
|
return tools.codevanta_metadata(path)
|
|
653
665
|
|
|
666
|
+
@server.tool(
|
|
667
|
+
description=(
|
|
668
|
+
"Summarise a crash dump file, auto-detecting the format: a Linux "
|
|
669
|
+
"ELF core dump or an Apple .ips crash report (the leading magic "
|
|
670
|
+
"bytes decide). Offline and read-only: the file is parsed, never "
|
|
671
|
+
"executed, and the payload carries the format, the parsed summary "
|
|
672
|
+
"fields and an evidence record stating how much of the finding "
|
|
673
|
+
"was parse-verified."
|
|
674
|
+
)
|
|
675
|
+
)
|
|
676
|
+
def codevanta_crash(path: str) -> dict:
|
|
677
|
+
return tools.codevanta_crash(path)
|
|
678
|
+
|
|
679
|
+
@server.tool(
|
|
680
|
+
description=(
|
|
681
|
+
"Auto-detect container formats in one file: WASM, EVM (a labelled "
|
|
682
|
+
"heuristic verdict, evm_like), GGUF, safetensors, pcap/pcapng and "
|
|
683
|
+
"firmware magics. Offline and read-only; the summary carries an "
|
|
684
|
+
"evidence record with source/method/confidence."
|
|
685
|
+
)
|
|
686
|
+
)
|
|
687
|
+
def codevanta_binmeta(path: str) -> dict:
|
|
688
|
+
return tools.codevanta_binmeta(path)
|
|
689
|
+
|
|
690
|
+
@server.tool(
|
|
691
|
+
description=(
|
|
692
|
+
"Introspect a SQLite database strictly read-only through the "
|
|
693
|
+
"mode=ro&immutable=1 URI: a bounded table list with row counts, "
|
|
694
|
+
"and with `table` that table's columns plus up to 10 sample rows "
|
|
695
|
+
"(JSON-safe values). The tool cannot write, create journals or "
|
|
696
|
+
"replay a WAL; a present -wal file is reported as ignored. "
|
|
697
|
+
"Offline."
|
|
698
|
+
)
|
|
699
|
+
)
|
|
700
|
+
def codevanta_sqlite(path: str, table: str | None = None) -> dict:
|
|
701
|
+
return tools.codevanta_sqlite(path, table)
|
|
702
|
+
|
|
703
|
+
@server.tool(
|
|
704
|
+
description=(
|
|
705
|
+
"Read-only Android device queries over adb: action='devices' "
|
|
706
|
+
"lists attached devices/emulators; action='props'/'packages'/"
|
|
707
|
+
"'processes' inspect the device named by `device`. Requires adb "
|
|
708
|
+
"on PATH - its absence surfaces as a typed error naming the "
|
|
709
|
+
"platform-tools install step, never a traceback. Mutating actions "
|
|
710
|
+
"(install, screencap, bugreport) are deliberately not exposed."
|
|
711
|
+
)
|
|
712
|
+
)
|
|
713
|
+
def codevanta_adb(
|
|
714
|
+
action: Literal["devices", "props", "packages", "processes"],
|
|
715
|
+
device: str | None = None,
|
|
716
|
+
) -> dict:
|
|
717
|
+
return tools.codevanta_adb(action, device)
|
|
718
|
+
|
|
719
|
+
@server.tool(
|
|
720
|
+
description=(
|
|
721
|
+
"Passively inspect one live Electron/Chromium page over CDP: list "
|
|
722
|
+
"the debugger endpoint's targets, pick target_id (or the first "
|
|
723
|
+
"page target) and return title, url, bounded resources and "
|
|
724
|
+
"console traffic overheard during observe_ms. Skip-gated on "
|
|
725
|
+
"endpoint reachability: an unreachable endpoint comes back as "
|
|
726
|
+
"{\"available\": false, \"reason\": ...} with evidence, not an "
|
|
727
|
+
"error. Read-only: only domain enables and navigation/resource "
|
|
728
|
+
"queries are sent, never Runtime.evaluate."
|
|
729
|
+
)
|
|
730
|
+
)
|
|
731
|
+
def codevanta_web_inspect(
|
|
732
|
+
endpoint: str = WEB_DEFAULT_ENDPOINT,
|
|
733
|
+
target_id: str | None = None,
|
|
734
|
+
observe_ms: int = WEB_DEFAULT_OBSERVE_MS,
|
|
735
|
+
) -> dict:
|
|
736
|
+
return tools.codevanta_web_inspect(
|
|
737
|
+
endpoint,
|
|
738
|
+
target_id=target_id,
|
|
739
|
+
observe_ms=observe_ms,
|
|
740
|
+
)
|
|
741
|
+
|
|
742
|
+
@server.tool(
|
|
743
|
+
description=(
|
|
744
|
+
"List an Electron ASAR archive offline (bounded 512 file entries "
|
|
745
|
+
"with honest totals), or with `extract` naming one in-archive "
|
|
746
|
+
"entry read that entry (bounded 8 MiB) and report its size and "
|
|
747
|
+
"SHA-256. Pure byte parsing; nothing is executed."
|
|
748
|
+
)
|
|
749
|
+
)
|
|
750
|
+
def codevanta_asar(path: str, extract: str | None = None) -> dict:
|
|
751
|
+
return tools.codevanta_asar(path, extract)
|
|
752
|
+
|
|
753
|
+
@server.tool(description=SYMBOLIC_SOLVE_DESCRIPTION)
|
|
754
|
+
def codevanta_symbolic_solve(
|
|
755
|
+
path: str,
|
|
756
|
+
address: int | None = None,
|
|
757
|
+
max_paths: int = tools.DEFAULT_SYMBOLIC_MAX_PATHS,
|
|
758
|
+
max_steps: int = tools.DEFAULT_SYMBOLIC_MAX_STEPS,
|
|
759
|
+
solver_mode: Literal["auto", "naive"] = "auto",
|
|
760
|
+
timeout_ms: int = SOLVER_DEFAULT_TIMEOUT_MS,
|
|
761
|
+
) -> dict:
|
|
762
|
+
return tools.codevanta_symbolic_solve(
|
|
763
|
+
path,
|
|
764
|
+
address,
|
|
765
|
+
max_paths=max_paths,
|
|
766
|
+
max_steps=max_steps,
|
|
767
|
+
solver_mode=solver_mode,
|
|
768
|
+
timeout_ms=timeout_ms,
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
@server.tool(
|
|
772
|
+
description=(
|
|
773
|
+
"Summarize one sigrok .sr session archive offline: version, "
|
|
774
|
+
"sample rate, device, channels, logic-file names and byte sizes, "
|
|
775
|
+
"and the annotation count when the archive carries one. "
|
|
776
|
+
"ZIP-bomb guarded; the logic data is stat'ed but never inflated."
|
|
777
|
+
)
|
|
778
|
+
)
|
|
779
|
+
def codevanta_signal_sr(path: str) -> dict:
|
|
780
|
+
return tools.codevanta_signal_sr(path)
|
|
781
|
+
|
|
782
|
+
@server.tool(
|
|
783
|
+
description=(
|
|
784
|
+
"Decode a raw logic-0/1 capture file as UART with the pure-Python "
|
|
785
|
+
"decoder-lite (medium confidence by design). One byte per sample: "
|
|
786
|
+
"0 is logic low, anything else high; samplerate_hz must give at "
|
|
787
|
+
"least 2 samples per baud bit. Offline; garbage captures decode "
|
|
788
|
+
"to few or zero bytes with warnings."
|
|
789
|
+
)
|
|
790
|
+
)
|
|
791
|
+
def codevanta_uart_decode(
|
|
792
|
+
path: str,
|
|
793
|
+
samplerate_hz: int,
|
|
794
|
+
baud: int = UART_DEFAULT_BAUD,
|
|
795
|
+
databits: int = UART_DEFAULT_DATA_BITS,
|
|
796
|
+
parity: Literal["none", "even", "odd"] = UART_DEFAULT_PARITY,
|
|
797
|
+
stopbits: int = UART_DEFAULT_STOP_BITS,
|
|
798
|
+
) -> dict:
|
|
799
|
+
return tools.codevanta_uart_decode(
|
|
800
|
+
path,
|
|
801
|
+
samplerate_hz,
|
|
802
|
+
baud=baud,
|
|
803
|
+
databits=databits,
|
|
804
|
+
parity=parity,
|
|
805
|
+
stopbits=stopbits,
|
|
806
|
+
)
|
|
807
|
+
|
|
808
|
+
@server.tool(
|
|
809
|
+
description=(
|
|
810
|
+
"Parse one flattened devicetree blob (DTB) offline: a shallow, "
|
|
811
|
+
"bounded walk returning the tree structure and, with `node`, the "
|
|
812
|
+
"properties of that top-level node (the root's own properties "
|
|
813
|
+
"when omitted). Unknown node names are typed errors."
|
|
814
|
+
)
|
|
815
|
+
)
|
|
816
|
+
def codevanta_dtb(path: str, node: str | None = None) -> dict:
|
|
817
|
+
return tools.codevanta_dtb(path, node)
|
|
818
|
+
|
|
819
|
+
@server.tool(
|
|
820
|
+
description=(
|
|
821
|
+
"Read or write one session's navigation state: action='mark' "
|
|
822
|
+
"pins a bookmark, 'comment' attaches a note, 'goto' moves the "
|
|
823
|
+
"cursor and records the visit, 'cursor' reads it back and "
|
|
824
|
+
"'bookmarks'/'comments'/'history' list the bounded state. Every "
|
|
825
|
+
"action needs `session` and the session database path `db`; "
|
|
826
|
+
"mark/comment/goto also need `address` (int or 0x-prefixed hex "
|
|
827
|
+
"string). A missing session is a typed error with the "
|
|
828
|
+
"'codevanta session save' hint. Offline."
|
|
829
|
+
)
|
|
830
|
+
)
|
|
831
|
+
def codevanta_nav(
|
|
832
|
+
action: Literal[
|
|
833
|
+
"mark", "comment", "goto", "cursor", "bookmarks", "comments", "history"
|
|
834
|
+
],
|
|
835
|
+
session: str | None = None,
|
|
836
|
+
address: int | str | None = None,
|
|
837
|
+
name: str | None = None,
|
|
838
|
+
text: str | None = None,
|
|
839
|
+
db: str | None = None,
|
|
840
|
+
) -> dict:
|
|
841
|
+
return tools.codevanta_nav(action, session, address, name, text, db)
|
|
842
|
+
|
|
843
|
+
@server.tool(
|
|
844
|
+
description=(
|
|
845
|
+
"Report which external GUI navigation providers (Hopper, Cutter, "
|
|
846
|
+
"Ghidra) could attach on this machine: one capability report each "
|
|
847
|
+
"with name/available/reason, plus the nav.providers evidence "
|
|
848
|
+
"record. The probes never launch anything and never raise; "
|
|
849
|
+
"CODEVANTA's own navigation works regardless. Offline."
|
|
850
|
+
)
|
|
851
|
+
)
|
|
852
|
+
def codevanta_nav_providers() -> dict:
|
|
853
|
+
return tools.codevanta_nav_providers()
|
|
854
|
+
|
|
654
855
|
return server
|
|
655
856
|
|
|
656
857
|
|
|
@@ -63,19 +63,25 @@ def test_analyze_has_provenance(elf64_text_path: Path) -> None:
|
|
|
63
63
|
assert report["disassembly"]["instruction_count"] == 3
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def
|
|
66
|
+
def test_server_lists_thirty_eight_tools() -> None:
|
|
67
67
|
listed = asyncio.run(build_server().list_tools())
|
|
68
68
|
names = sorted(tool.name for tool in listed)
|
|
69
|
+
assert len(names) == 38
|
|
69
70
|
assert names == [
|
|
71
|
+
"codevanta_adb",
|
|
70
72
|
"codevanta_analyze",
|
|
73
|
+
"codevanta_asar",
|
|
74
|
+
"codevanta_binmeta",
|
|
71
75
|
"codevanta_callgraph",
|
|
72
76
|
"codevanta_cfg",
|
|
73
77
|
"codevanta_compare",
|
|
78
|
+
"codevanta_crash",
|
|
74
79
|
"codevanta_dataflow",
|
|
75
80
|
"codevanta_debug",
|
|
76
81
|
"codevanta_decompile",
|
|
77
82
|
"codevanta_diff",
|
|
78
83
|
"codevanta_disasm",
|
|
84
|
+
"codevanta_dtb",
|
|
79
85
|
"codevanta_dwarf",
|
|
80
86
|
"codevanta_entropy",
|
|
81
87
|
"codevanta_function_hash",
|
|
@@ -83,15 +89,22 @@ def test_server_lists_twenty_six_tools() -> None:
|
|
|
83
89
|
"codevanta_info",
|
|
84
90
|
"codevanta_jump_table",
|
|
85
91
|
"codevanta_metadata",
|
|
92
|
+
"codevanta_nav",
|
|
93
|
+
"codevanta_nav_providers",
|
|
86
94
|
"codevanta_session_list",
|
|
87
95
|
"codevanta_session_save",
|
|
96
|
+
"codevanta_signal_sr",
|
|
88
97
|
"codevanta_similarity",
|
|
98
|
+
"codevanta_sqlite",
|
|
89
99
|
"codevanta_strings",
|
|
90
100
|
"codevanta_struct",
|
|
91
101
|
"codevanta_symbolic",
|
|
102
|
+
"codevanta_symbolic_solve",
|
|
92
103
|
"codevanta_trace",
|
|
104
|
+
"codevanta_uart_decode",
|
|
93
105
|
"codevanta_unknowns",
|
|
94
106
|
"codevanta_vtable",
|
|
107
|
+
"codevanta_web_inspect",
|
|
95
108
|
"codevanta_xrefs",
|
|
96
109
|
]
|
|
97
110
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|