About Joern
Joern is an MCP server published by sfncat in the Developer Tools category: a simple Joern MCP Server.
The repository has 52 stars and 13 forks, with the last commit 28 days ago. Recent commit activity is the strongest signal that reported issues will get attention.
Install
git clone https://github.com/sfncat/mcp-joernThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Joern
Powered by Claude · Grounded in docs
Security checks
Static checks derived from the repository 5 days ago. Heuristics on the source, not an audit.
- ✓README presentThe repository ships documentation.
- ✓License declaredUsable under a stated license.
- ✓Tests presentA test suite exists in the repository.
- ✓Dependencies pinnedA lockfile pins dependency versions.
- !No dynamic code executionSource scan found eval or shell execution. Review how tool inputs reach it before granting credentials.
- !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.
README
Joern MCP Server
A simple MCP Server for Joern.
Project Introduction
This project is an MCP Server based on Joern, providing a series of features to help developers with code review and security analysis.
Environment Requirements
- Python >= 3.10 (default 3.12) & uv
- Joern
Installation Steps
-
Clone the project locally:
git clone https://github.com/sfncat/mcp-joern.git cd mcp-joern -
Install Python dependencies:
uv venv .venv source .venv/bin/activate uv sync
Project Structure
├── server.py # MCP Server main program
├── test_mcp_client.py # Test program for joern server and mcp tool
├── test_sc_tools.py # Direct test program for sc tools
├── common_tools.py # Common utility functions
├── server_tools.py # Server utility functions
├── server_tools.sc # Scala implementation of server utility functions
├── server_tools_source.sc # Scala implementation of server utility functions,use sourceCode to get the source code of method
├── requirements.txt # Python dependency file
├── sample_cline_mcp_settings.json # Sample cline mcp configuration file
└── env_example.txt # Environment variables example file
Usage
-
Start the Joern server:
joern -J-Xmx40G -J-XX:CompressedClassSpaceSize=1g -J-XX:MaxMetaspaceSize=2g \ --server --server-host 127.0.0.1 --server-port 16162 \ --server-auth-username user --server-auth-password password --import server_tools.sc Or joern -J-Xmx40G -J-XX:CompressedClassSpaceSize=1g -J-XX:MaxMetaspaceSize=2g \ --server --server-host 127.0.0.1 --server-port 16162 \ --server-auth-username user --server-auth-password password --import server_tools_source.scWhy the extra JVM flags. Both defaults are too small and only fail after prolonged use, so the breakage looks like a dead server rather than a JVM sizing problem:
-XX:CompressedClassSpaceSize=1g— the Joern REPL compiles one class per query (rs$line$N). The default class space (128m) is exhausted after a few thousand queries, after which every query fails withNoClassDefFoundError: Could not initialize class rs$line$NNNN.-XX:MaxMetaspaceSize=2g— keeps metaspace headroom in step with the class space.-J-Xmx…— size the heap for your CPG. An undersized heap shows up as queries timing out (not as an OOM). We run-Xmx60Gfor a ~400 MB CPG. If you are using it under Windows, you may need to set the JVM system variables through the command line or in the system environment variables.
set _JAVA_OPTIONS=-Dfile.encoding=UTF-8set joern logging level to ERROR
set SL_LOGGING_LEVEL=ERROR //windows export SL_LOGGING_LEVEL=ERROR //linuxif you have the following warning
Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)you can disable it by setting the environment variable
set TERM=dumb export TERM=dumbto restore the default behavior
set TERM=xterm-256color export TERM=xterm-256color -
Copy env_example.txt to .env Modify the configuration information to match the joern server startup configuration
-
Run the test connection: Modify the information in
test_mcp_client.pyto confirm the joern server is working properlyuv run test_mcp_client.py Starting MCP server test... ================================================== Testing server connection... [04/16/25 20:38:54] INFO Processing request of type CallToolRequest server.py:534 Connection test result: Successfully connected to Joern MCP, joern server version is XXX -
Configure MCP server Configure the mcp server in cline, refer to
sample_cline_mcp_settings.json. -
Use MCP server Ask questions to the large language model, refer to
prompts_en.md
Development Notes
.envfile is used to store environment variables.gitignorefile defines files to be ignored by Git version controlpyproject.tomldefines the Python configuration for the project- MCP tool development
- Implement in
server_tools.sc, add definitions inserver_tools.py, and add tests intest_mcp_client.py
- Implement in
Contribution Guidelines
Welcome to submit Issues and Pull Requests to help improve the project.
Welcome to add more tools.
References
https://github.com/flankerhqd/jebmcp
https://docs.joern.io/interpreter/
Change Log
v1.2.0 (2026-09-10)
Server-side call-graph tools (performance)
- New Scala helpers in
server_tools.sc:get_methods_by_name(indexednameExactlookup, replacing full-CPG.filter(_.fullName.contains(...))scans which time out on large CPGs),get_callee_chain(server-side BFS returning the whole call chain - method full name plus code, JDK/framework callees skipped - in one HTTP round-trip) andget_callee_chain_names(names only, no code). - New MCP tools exposing them:
get_callee_chain_server,get_methods_by_name. - Effect: resolving one call chain drops from ~30 HTTP round-trips to 1.
HTTP client hardening (server.py)
joern_remotenow uses a kept-aliverequests.Sessionwith a connection pool.- Retries transient failures 3 times, but fails fast on 401/403 (auth errors are not transient).
- Returns an explicit
ERROR: ...string on failure instead ofNone, so callers can tell a failure apart from a legitimately empty result.
Fixes
- Credential key compatibility: the shipped
.envusesUSER_NAME/PASSWORDwhile host configs injectJOERN_AUTH_USERNAME/JOERN_AUTH_PASSWORD. Only the latter was read, so any launch without host-injected env (including the bundledtest_mcp_client.py) failed with a silent 401. Both names are now accepted. - FastMCP compatibility: the
log_levelconstructor argument was removed in fastmcp 2.x; it is now passed inside atry/exceptwith aFASTMCP_LOG_LEVELfallback.
Docs & housekeeping
- Start command now includes
-XX:CompressedClassSpaceSize=1g -XX:MaxMetaspaceSize=2g(see the note under "Start the Joern server" for why the defaults fail only after prolonged use). - Code comments are English only; Chinese is confined to
README_cn.mdandprompts_cn.md. .gitignore: ignore local CPG artifacts (*.cpg), backups (*.bak-*) and the local credential-injectingrun_verify.shwrapper.- Version bumped to 1.2.0.
v1.3.0 (2026-09-10)
tests/fixture/: a self-contained Android fixture (crafted sources +build_fixture.sh) that builds a ~12 KB APK against API 36 / SDK extension level 17 and the matching CPG. Every construct that has broken the tooling before is present exactly once: a custom base receiver whose business entry ishandleBroadCastReceive()(notonReceive), a 4-hop delegation chain across classes and an interface, a duplicated simple method name, an anonymous inner class, aSharedPreferenceswrite (hd_member) at the chain end, framework calls the chain tool must skip, and a permission-gated receiver.test_mcp_client.pyis now an assertion-based regression gate over that fixture: it checks the chain/lookup tools, the legacy queries and the error path, and exits non-zero on failure. The ad-hocverify_mcp.pywas merged into it.- The fixture APK carries the same version as this package (
pyproject.toml), sotests/fixture/fixture.apkandfixture.cpgare versioned together with the server. - Documentation and tool help no longer use the old NFC sample; they use the fixture.
- Version 1.2.0 -> 1.3.0.
Tests
cd tests/fixture && ./build_fixture.sh --cpg # fixture.apk + fixture.cpg
cd ../.. && uv run test_mcp_client.py # protocol-level regression gate
README fetched from the repository 5 days ago. The original is authoritative.
