Skip to main content
Glama
README.md6.17 kB
# 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 on `PATH` - 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` - An MCP-capable editor/client (e.g., VS Code with MCP integration) --- ## Installation & Configuration 1. **Clone and install:** ```bash 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.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/amyfan7/se333-final-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server