A containerized Model Context Protocol (MCP) server providing static code analysis using Joern's Code Property Graph (CPG) technology
Project description
🦡 codebadger
A containerized Model Context Protocol (MCP) server providing static code analysis using Joern's Code Property Graph (CPG) technology with support for Java, C/C++, JavaScript, Python, Go, Kotlin, C#, Ghidra, Jimple, PHP, Ruby, and Swift.
Prerequisites
Before you begin, make sure you have:
- Docker and Docker Compose installed
- Python 3.10+ (Python 3.13 recommended)
- pip (Python package manager)
To verify your setup:
docker --version
docker-compose --version
python --version
Quick Start
1. Install Python Dependencies
# Create a virtual environment (optional but recommended)
python -m venv venv
# Install dependencies
pip install -r requirements.txt
2. Start the Docker Services (Joern)
docker compose up -d
This starts:
- Joern Server: Static code analysis engine (runs CPG generation and queries)
Verify services are running:
docker compose ps
3. Start the MCP Server
# Start the server
python main.py &
The MCP server will be available at http://localhost:4242.
4. Stop All Services
# Stop MCP server (Ctrl+C in terminal)
# Stop Docker services
docker-compose down
# Optional: Clean up everything
bash cleanup.sh
Cleanup Script
Use the provided cleanup script to reset your environment:
bash cleanup.sh
This will:
- Stop and remove Docker containers
- Kill orphaned Joern/MCP processes
- Clear Python cache (
__pycache__,.pytest_cache) - Optionally clear the playground directory (CPGs and cached codebases)
Integrations
GitHub Copilot Integration
Edit the MCP configuration file for VS Code (GitHub Copilot):
Path:
~/.config/Code/User/mcp.json
Example configuration:
{
"inputs": [],
"servers": {
"codebadger": {
"url": "http://localhost:4242/mcp",
"type": "http"
}
}
}
Claude Code Integration
To integrate codebadger into Claude Desktop, edit:
Path:
Claude → Settings → Developer → Edit Config → claude_desktop_config.json
Add the following:
{
"mcpServers": {
"codebadger": {
"url": "http://localhost:4242/mcp",
"type": "http"
}
}
}
Available Tools
Core Tools (hash-based)
generate_cpg: Generate a CPG for a codebase (from local path or GitHub URL)get_cpg_status: Get status and existence of a CPG bycodebase_hashrun_cpgql_query: Execute CPGQL queries (synchronous)
Code Browsing Tools
-
get_codebase_summary: Get codebase overview -
list_files: List source files -
list_methods: Discover methods/functions -
get_method_source: Retrieve method source code -
list_calls: Find function call relationships -
get_call_graph: Build call graphs -
list_parameters: Get parameter information -
find_literals: Search for hardcoded values -
get_code_snippet: Retrieve code snippets -
find_taint_sources: Locate external input points -
find_taint_sinks: Locate dangerous sinks -
find_taint_flows: Find dataflow paths -
find_argument_flows: Find expression reuse -
check_method_reachability: Check call graph connections -
list_taint_paths: List detailed taint paths -
get_program_slice: Build program slices
Contributing & Tests
Thanks for contributing! Here's a quick guide to get started with running tests and contributing code.
Prerequisites
- Python 3.10+ (3.13 is used in CI)
- Docker and Docker Compose (for integration tests)
Local Development Setup
- Create a virtual environment and install dependencies
python -m venv venv
pip install -r requirements.txt
- Start Docker services (for integration tests)
docker-compose up -d
- Run unit tests
pytest tests/ -q
- Run integration tests (requires Docker Compose running)
# Start MCP server in background
python main.py &
# Run integration tests
pytest tests/integration -q
# Stop MCP server
pkill -f "python main.py"
- Run all tests
pytest tests/ -q
- Cleanup after testing
bash cleanup.sh
docker-compose down
Code Contributions
Please follow these guidelines when contributing:
- Follow repository conventions
- Write tests for behavioral changes
- Ensure all tests pass before submitting PR
- Include a clear changelog in your PR description
- Update documentation if needed
Configuration
The MCP server can be configured via environment variables or config.yaml.
Environment Variables
Key settings (optional - defaults shown):
# Server
MCP_HOST=0.0.0.0
MCP_PORT=4242
# Joern
JOERN_BINARY_PATH=joern
JOERN_JAVA_OPTS="-Xmx4G -Xms2G -XX:+UseG1GC -Dfile.encoding=UTF-8"
# CPG Generation
CPG_GENERATION_TIMEOUT=600
MAX_REPO_SIZE_MB=500
# Query
QUERY_TIMEOUT=30
QUERY_CACHE_ENABLED=true
QUERY_CACHE_TTL=300
Config File
Create a config.yaml from config.example.yaml:
cp config.example.yaml config.yaml
Then customize as needed.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iflow_mcp_codebadger-0.3.2.tar.gz.
File metadata
- Download URL: iflow_mcp_codebadger-0.3.2.tar.gz
- Upload date:
- Size: 82.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d8c3f0308269fa56c51e60ce1078723a9b816d014f3ffddbdb734a1ae9d0ba4
|
|
| MD5 |
c0206b7597cf61be878b4033bd21c0a7
|
|
| BLAKE2b-256 |
de45119680cbd12774b7bc64ad0a012b0db01a7a12054992dccc14ed5b711b35
|
File details
Details for the file iflow_mcp_codebadger-0.3.2-py3-none-any.whl.
File metadata
- Download URL: iflow_mcp_codebadger-0.3.2-py3-none-any.whl
- Upload date:
- Size: 76.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51a9f849317cb96cc51409f3c807b14a02c9e1e4edb523c8fcc663511561b75d
|
|
| MD5 |
4310d1cc8793e8660533dd15e16dcf37
|
|
| BLAKE2b-256 |
f60851920000846a82cd604e240936183875e0efa8372657babd69aa304d169a
|