Joern MCP Server
sfncat/mcp-joern · 51 stars · Scala · MIT
MCP server A simple Joern MCP Server.
Install
The repo has no one-line install. Follow its README.
Files
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
Facts
- Kind
- MCP server
- Repo
- sfncat/mcp-joern
- Group
- Uncategorized
- Stars
- 51
- License
- MIT
- Language
- Scala
- Last push
- 2026-09-25
- Forks
- 13
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k