MCP Java Testing Agent
Automates Java/Maven test generation, JaCoCo coverage analysis, and Checkstyle checking through MCP tools. Enables iterative improvement of test coverage and code style until quality goals are met.
README
MCP Java Testing Agent
This repository provides an MCP (Model Context Protocol) server that exposes tools to automate test generation, coverage analysis, and style checking for Java/Maven projects. It is designed to be driven by an MCP-aware client using the tester.prompt.md prompt.
Overview
The MCP server (in main.py) exposes tools that:
- Discover public methods in a Java codebase
- Generate skeleton JUnit tests
- Run Maven (
mvn clean test) - Analyze JaCoCo coverage reports
- Analyze Checkstyle reports
The higher-level loop (iterating until coverage/style goals are met) is described in tester.prompt.md and executed by the LLM client, not hard-coded in Python.
Requirements
- Python 3.x
- Java JDK installed and on
PATH - Maven (
mvn) installed and onPATH - Maven project configured to:
- Place sources under something like
A2/src/main/java - Generate JaCoCo XML at
A2/target/site/jacoco/jacoco.xml - Generate Checkstyle XML at
A2/target/checkstyle-result.xml
- Place sources under something like
- An MCP-capable editor/client (e.g., VS Code with MCP integration)
Installation & Configuration
-
Clone and install:
git clone <your-repo-url> cd <your-repo-folder> pip install fastmcp Verify: java -version mvn -v Ensure your Maven pom.xml is set up to: Run tests Produce JaCoCo and Checkstyle reports at the paths above
Running the MCP Server
From the project root:
python server.py
This starts the MCP server over SSE:
if name == "main": mcp.run(transport="sse")
Your MCP client should be configured to connect to this server. Using the tester Prompt
Assuming you’re in an editor like VS Code with MCP enabled:
Open the project folder (containing main.py and tester.prompt.md).
Open tester.prompt.md (or tester.md) in the editor.
Press Ctrl+Shift+P to open the Command Palette.
Select “Run Prompt” (or the equivalent command).
Choose the tester prompt.
The MCP client will then:
Call the tools defined in tester.prompt.md:
- mcp-final/generate-tests
- mcp-final/run_tests
- mcp-final/analyze-coverage
- mcp-final/get_all_public_methods
- mcp-final/analyze-checkstyle
- mcp-final/run-checkstyle
- mcp-final/git-add-all
- mcp-final/git-commit
- mcp-final/git_pull_request
- mcp-final/git_push
- mcp-final/git_status
Iterate to generate tests, run coverage/style checks, and produce a final summary.
Project Structure (Typical)
├── main.py # MCP server and tools ├── .github/prompts/ │ └── tester.prompt.md # Agent configuration/prompt ├── A2/ │ ├── pom.xml │ ├── src/main/java/... # Java sources │ └── target/ │ ├── site/jacoco/jacoco.xml │ └── checkstyle-result.xml
Adjust paths as needed; defaults are used in the tool implementations. MCP Tools generate_tests(source_file: str) -> str
Generate a skeleton JUnit test class for a given .java file.
Extracts the class name and public method names via regex.
Creates {ClassName}Test with stub methods:
@Test
void test_methodName() {
// TODO: implement test
}
Writes to: codebase/src/test/java/{ClassName}Test.java.
Returns: Path message on success, or an error string if the file/class/methods can’t be found. get_all_public_methods(dir: str = "A2/src/main/java") -> List[str]
Recursively scan dir for .java files and return all lines starting with public.
Uses os.walk to find .java files.
Reads each file line-by-line and keeps line.strip().startswith("public").
Returns: List of raw lines (method signatures, constructors, or public fields). analyze_coverage(xml_path: str = "A2/target/site/jacoco/jacoco.xml") -> dict
Parse a JaCoCo XML report and list methods with <100% instruction coverage.
Output structure:
{ "uncovered_methods": [ { "class": "com/example/MyClass", "method": "myMethod", "coverage": 0.75, "missed": 10, "covered": 30 }, ... ], "count": 3 }
Returns an "error" key if the XML file is missing. run_checkstyle() -> str
Run the Maven build and tests:
mvn clean test
Assumes your Maven config runs Checkstyle and JaCoCo as part of the build.
Returns: stdout from the Maven process (errors are visible in this text). analyze_checkstyle(xml_path: str = "A2/target/checkstyle-result.xml") -> dict
Parse a Checkstyle XML report and list all style violations.
Output structure:
{ "violations": [ { "file": "/path/to/Foo.java", "line": "42", "column": "13", "severity": "warning", "message": "Line is longer than 100 characters", "source": "com.puppycrawl.tools.checkstyle.checks.sizes.LineLengthCheck" }, ... ], "count": 5 }
Returns an "error" key if the XML file is missing. Agent Workflow Summary
A typical workflow implemented in tester.prompt.md:
Call get_all_public_methods to discover public methods.
Call generate_tests to create initial JUnit tests.
Call run_checkstyle to run mvn clean test and produce JaCoCo + Checkstyle reports.
Call analyze_coverage to find uncovered methods.
Call analyze_checkstyle to find style violations.
Update tests and code (by the agent using file edits), then repeat steps 3–5.
Stop when:
100% coverage and zero Checkstyle issues are reached, or
A maximum iteration count (e.g., 10) is reached.
Produce a final summary report (tests created, coverage, style status, recommendations).
Notes & Limitations
Regex-based parsing is simple and may not handle all Java edge cases (complex generics, annotations, inner classes).
Default paths (A2/src/main/java, codebase/src/test/java, etc.) can be customized; keep tool defaults in sync with your project layout.
run_checkstyle only runs mvn clean test; ensure your pom.xml actually binds JaCoCo and Checkstyle to this phase.
The iterative “improve coverage & style” loop is implemented by the MCP client/LLM using these tools, not within server.py itself.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
E2B
Using MCP to run code via e2b.