Skip to main content
Glama
rajendarmuddasani

graph-mcp-java-gen

graph-mcp-java-gen

CI Python Evidence License MCP Neo4j

Graph-gestützter MCP-Server, der natürliche Sprach-Requests in validierte, kompilierbare Java-Testmethoden umwandelt – keine halluzinierten Imports, keine unbegründeten Symbole, keine stillen Fehler.

Eine natürliche oder strukturierte Anfrage gelangt in einen offiziellen Model Context Protocol (MCP) stdio-Server. Ein versionierter Graph-Katalog (Neo4j oder JSON-Fixture) liefert die einzigen Symbole, die der Generator zitieren darf. Ein mehrschichtiger Validator prüft Syntax, Framework-Vertrag, Grundlage und verbotene API-Regeln, bevor Quellcode zurückgegeben wird. Zwei optionale LLM-Agenten – ein Intent-Normalisierer und ein Post-Generierungs-Reviewer – erweitern die Pipeline auf freie Eingaben, ohne die deterministische Sicherheitshülle zu beeinträchtigen.


Architektur

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1e3a5f", "primaryTextColor": "#ffffff", "primaryBorderColor": "#0d2137", "lineColor": "#4a9eca", "secondaryColor": "#2d6a4f", "tertiaryColor": "#7b2d8b"}}}%%
flowchart TD
    classDef input    fill:#7b2d8b,stroke:#4a1a54,color:#fff,font-size:13px
    classDef mcp      fill:#e07b00,stroke:#9a5700,color:#fff,font-size:13px
    classDef agent    fill:#1a6b8a,stroke:#0d3f52,color:#fff,font-size:13px
    classDef core     fill:#2d6a4f,stroke:#1b4332,color:#fff,font-size:13px
    classDef graph    fill:#1e3a5f,stroke:#0d1f3c,color:#fff,font-size:13px
    classDef validate fill:#4a6741,stroke:#2d4026,color:#fff,font-size:13px
    classDef ok       fill:#155724,stroke:#0a3015,color:#fff,font-size:13px
    classDef reject   fill:#721c24,stroke:#3d0a0e,color:#fff,font-size:13px

    NL["🌎 Free-form NL\n(generate_java_test_nlp)"]:::input
    SF["📄 Structured fields\n(generate_java_test)"]:::input
    TX["💬 Intent text\n(generate_java_test_from_intent)"]:::input

    MCP["🔌 FastMCP stdio Server\n7 tools · zero raw Cypher"]:::mcp

    A1["🤖 LLMIntentParser\nAgent 1 · gpt-4o-mini\nfield extraction"]:::agent
    INT["✅ GenerationIntent\nclass · package · module\nconfig · version"]:::core
    GDB["📊 Graph Catalog\nNeo4j 5.26 / JSON fixture\n8 symbols · 12 methods"]:::graph
    GEN["⚙️ Template Generator\ndeterministic render"]:::core
    VAL["🛡️ JavaValidator\nTree-sitter AST\ncontract · grounding\nsource-safety"]:::validate
    A2["🤖 ReviewAgent\nAgent 2 · gpt-4o-mini\n6-item checklist"]:::agent

    OK["✅ Accepted Java\nsource + citations\n+ review verdict"]:::ok
    REJ["❌ Typed Rejection\nerror code + message\nno source returned"]:::reject

    NL --> MCP
    SF --> MCP
    TX --> MCP
    MCP -->|"NLP path"| A1
    MCP -->|"direct path"| INT
    A1 -->|"extracted fields"| INT
    INT -->|"invalid"| REJ
    INT -->|"valid"| GDB
    GDB -->|"cited symbols"| GEN
    GEN --> VAL
    VAL -->|"any gate fails"| REJ
    VAL -->|"all gates pass"| A2
    A2 -->|"issues found"| REJ
    A2 -->|"approved"| OK

Multi-Agent-Pipeline

%%{init: {"theme": "base", "themeVariables": {"actorBkg": "#1e3a5f", "actorTextColor": "#ffffff", "actorBorderColor": "#4a9eca", "activationBkgColor": "#2d6a4f", "activationBorderColor": "#155724", "noteBkgColor": "#fff8e1", "noteTextColor": "#333", "signalColor": "#4a9eca", "signalTextColor": "#1e3a5f"}}}%%
sequenceDiagram
    autonumber
    actor User
    participant MCP as FastMCP Server
    participant A1  as LLMIntentParser<br/>(Agent 1)
    participant GDB as Graph Catalog<br/>(Neo4j / Fixture)
    participant GEN as Generator +<br/>JavaValidator
    participant A2  as ReviewAgent<br/>(Agent 2)

    User->>MCP: generate_java_test_nlp(free-form NL)
    MCP->>A1: extract intent fields
    Note over A1: gpt-4o-mini · temp=0<br/>strict JSON schema
    A1-->>MCP: {class, package, module, config, version}
    MCP->>GDB: get versioned symbols
    GDB-->>MCP: 7 cited GraphSymbol objects
    MCP->>GEN: render Java + validate
    Note over GEN: Tree-sitter AST<br/>contract · grounding · safety
    GEN-->>MCP: validated Java source
    MCP->>A2: review(source, class, package)
    Note over A2: gpt-4o-mini · temp=0<br/>6-item checklist
    A2-->>MCP: {approved, checklist, issues}
    MCP-->>User: {status, source, citations, review}

Evidenz-Dashboard

Alle Messungen verwenden unabhängig generierte, CC0-lizenzierte synthetische Fixtures. Die Ergebnisse stammen aus der akzeptierten strict_graph_v2-Richtlinie auf dem zurückgehaltenen Bestätigungssplit.

Oberfläche

Ergebnis

Artefakt

Benchmark-Umfang

96 CC0-Intents – 32 dev / 32 val / 32 Bestätigung

task_evaluation.json

Erfolg der Bestätigungsaufgaben

32 / 32 begrenzte Aufgaben

evaluation_trace.json

Validierung des generierten Quellcodes

24 / 24 unterstützte Intents – Syntax + Vertrag + Grundlage + Sicherheit

task_evaluation.json

Sichere adversariale Ablehnung

8 / 8 – null falsche Akzeptanzen

task_evaluation.json

Zitierpräzision

100% – nur graph-zitierte Symbole importiert

task_evaluation.json

Abruf der erforderlichen Symbole

100% – jedes erforderliche Symbol vorhanden

task_evaluation.json

Live-Neo4j-Integration

Neo4j 5.26.29 – 8 Symbole, 12 Methoden materialisiert

neo4j_integration.json

Offizieller MCP-Benchmark

120 / 120 erwartete Ergebnisse – null Protokollfehler

mcp_benchmark.json

MCP-Warm-Latenz (p50 / p95 / p99)

29.13 / 48.61 / 54.23 ms bei Parallelität 1

mcp_benchmark.json

Java-Kompilierung

8 / 8 Klassendateien über Eclipse ECJ 3.21

java_compile.json

Externe Modellaufrufe (deterministischer Pfad)

0 Aufrufe · $0.00

mcp_benchmark.json

Latenzwerte sind lokale Windows-Messungen in einem einzelnen Prozess, keine Produktions-SLOs.


Policy-Auswahl

Vier Generierungsrichtlinien wurden evaluiert. Das Auswahlziel wurde vor dem Öffnen des Bestätigungssplits festgelegt: Maximierung des Validierungserfolgs bei Kandidaten, die alle Sicherheitsgates bestehen. Die Bestätigung wurde genau einmal für den ausgewählten Kandidaten geöffnet.

%%{init: {"theme": "base", "themeVariables": {"quadrant1Fill": "#155724", "quadrant2Fill": "#856404", "quadrant3Fill": "#721c24", "quadrant4Fill": "#856404"}}}%%
xychart-beta
    title "Validation: task success vs safe-rejection recall (%)"
    x-axis ["no_graph_v0", "lenient_repair_v1", "strict_graph_v2 ✓", "wide_context_v3"]
    y-axis "Task success (%)" 0 --> 105
    bar  [21.9, 75.0, 100.0, 96.9]
    line [87.5,  0.0, 100.0, 87.5]

Kandidat

Aufgabenerfolg

Gen gültig

Sichere Ablehnung

Zitierpräzision

Entscheidung

no_graph_v0

21.9%

0%

87.5%

0%

Abgelehnt – keine Grundlage

lenient_repair_v1

75.0%

100%

0%

100%

Abgelehnt – 8 falsche Akzeptanzen

strict_graph_v2

100%

100%

100%

100%

Ausgewählt

wide_context_v3

96.9%

100%

87.5%

87.5%

Abgelehnt – irrelevanter Kontext + 1 falsche Akzeptanz


MCP-Tools

Werkzeug

Typ

Verhalten

get_fixture_metadata

Lesen

Gibt Fixture-Identität, Herkunft, Lizenz, Backend, Symbolanzahl zurück

search_graph

Lesen

Parametrisierte Namens-/Methodensuche; max. 20 Ergebnisse

generate_java_test

Generieren

Typisierte Felder → Graph-Lookup → Java → alle Validierungsgates

generate_java_test_from_intent

Generieren

Begrenzte 3-Form-Grammatik → gleiche strikte Richtlinie

validate_java_source

Validieren

Prüft bis zu 20 000 Zeichen; schreibt oder führt Quellcode nie aus

generate_java_test_nlp

Multi-Agent

LLM-Intent-Parser → Generator → LLM-Reviewer; erfordert OPENAI_API_KEY

Der Neo4j-Adapter verwendet feste parametrisierte Cypher-Abfragen, lehnt Anmeldeinformationen in URIs ab und verweigert Fixture-Identitätskollisionen.


Schnellstart

python -m venv .venv
# Windows
.\.venv\Scripts\Activate.ps1
# Linux / macOS
source .venv/bin/activate

pip install -r requirements-dev.txt
pip install --no-deps -e .

# Run the offline smoke test (no database needed)
python scripts/container_smoke.py python -m graph_mcp.server

MCP-Client-Konfiguration (VS Code / Claude Desktop)

{
  "mcpServers": {
    "graph-java-gen": {
      "command": "/absolute/path/to/.venv/bin/python",
      "args": ["-m", "graph_mcp.server"],
      "cwd": "/absolute/path/to/repo"
    }
  }
}

Aktivieren des Multi-Agent-NLP-Tools

# Add to your environment or .env file
OPENAI_API_KEY=sk-...
GRAPH_BACKEND=neo4j   # optional; defaults to local JSON fixture

Evidenz reproduzieren

# Build the CC0 benchmark fixture
python scripts/build_evaluation_fixture.py

# Run all four candidate policies and select strict_graph_v2
python scripts/evaluate_workflow.py

# Validate the claims ledger and evidence privacy rules
python scripts/validate_evidence.py

# Full test suite
pytest --cov=src --cov-report=term-missing --cov-fail-under=75

# Lint and security
ruff check src tests scripts
bandit -r src scripts -q -ll
pip-audit -r requirements.txt --progress-spinner off

Live-Neo4j-Pfad

# Start a local Neo4j Community instance (Docker)
docker compose up -d neo4j
python scripts/wait_for_neo4j.py

# Seed the synthetic graph fixture and verify retrieval
python scripts/seed_graph.py
python scripts/verify_neo4j.py   # writes evidence/neo4j_integration.json

# Full MCP benchmark over stdio with live graph
python scripts/benchmark_mcp.py  # writes evidence/mcp_benchmark.json

Java-Kompilierung

# Requires JDK 21 on PATH
python scripts/compile_generated.py --require-compiler
# Writes evidence/java_compile.json

Sicherheitsdesign

  • Kein rohes Cypher auf der MCP-Oberfläche – alle Graph-Abfragen sind parametrisiert.

  • Strenge Feld-Allowlists – Klassennamen, Paketnamen, Modulnamen, Versionen und Konfigurationspfade werden vor jeder Graph-Abfrage gegen kompilierte Regex-Muster geprüft.

  • Quellcode-Sicherheitsscanner – generierter Java-Code wird abgelehnt, wenn er Runtime.getRuntime, ProcessBuilder, System.exit, java.io, java.nio.file oder java.net referenziert.

  • Schutz vor Pfad-Traversal – absolute Pfade und ..-Segmente werden in Konfigurationspfadfeldern abgelehnt.

  • Grundlagen-Durchsetzung – jeder Import im generierten Quellcode muss einem Symbol entsprechen, das für genau diese Version aus dem Graph abgerufen wurde.

  • LLM-Ausgabe erneut validiert – vom LLM-Intent-Parser extrahierte Felder durchlaufen dieselbe GenerationIntent.from_mapping()-Validierung wie direkte API-Aufrufe.

  • Neo4j-Anmeldeinformationen – nur aus Umgebungsvariablen geladen; niemals protokolliert oder in Evidenz-Artefakten zurückgegeben.

  • XML-Preflight – defusedxml verhindert Entity-Expansion-Angriffe beim Scannen der Projektstruktur.

  • Container – gepinntes Chainguard-Linux-Image, nicht-root UID/GID 65532; CI führt einen MCP-über-Container-stdio-Smoke-Test durch.

Siehe SECURITY.md für die vollständige Bedrohungsgrenze.


Repository-Karte

src/graph_mcp/
  workflow.py            intent parsing · graph lookup · Java generation · validation
  graph_store.py         Neo4j catalog adapter (parameterised Cypher)
  llm_intent_parser.py   Agent 1 — LLM free-form NL → GenerationIntent
  review_agent.py        Agent 2 — LLM post-generation checklist reviewer
  server.py              FastMCP stdio server (7 tools)
  evaluation.py          candidate scoring and selection harness

fixtures/
  synthetic_graph.json   CC0 versioned framework symbol catalog (SHA-256 bound)
  evaluation_cases.json  96 CC0 natural-language intents (32/32/32 split)
  java_framework/        7 independently generated Java stub classes

evidence/
  claims.json            machine-readable claims ledger (14 public claims)
  evaluation_protocol.json  pre-declared selection rules and safety gates
  task_evaluation.json   per-candidate, per-split, per-case results
  evaluation_trace.json  confirmation case-level trace
  neo4j_integration.json live Neo4j integration result
  mcp_benchmark.json     MCP protocol benchmark (120 calls)
  java_compile.json      ECJ compilation result

scripts/
  build_evaluation_fixture.py   generate benchmark from seed
  evaluate_workflow.py          run and score all four candidates
  validate_evidence.py          verify claims ledger and privacy rules
  benchmark_mcp.py              official MCP stdio latency benchmark
  verify_neo4j.py               live graph integration check
  compile_generated.py          ECJ compile gate
  seed_graph.py                 materialise fixture into Neo4j

tests/
  test_generation_loop.py       generation + validation unit tests
  test_graph_store.py           Neo4j adapter unit tests
  test_mcp_protocol.py          official MCP protocol conformance
  test_evaluation.py            evaluation harness tests
  test_evidence.py              claims ledger integrity tests
  test_neo4j_live.py            opt-in live graph tests (NEO4J_* env required)

docs/
  ARCHITECTURE.md        component design and data flow
  POLICY_CARD.md         candidate selection details
  DATA_CARD.md           fixture provenance and license
  MCP_INTEGRATION.md     client configuration guide
  DEPLOYMENT.md          Docker and container notes

templates/               MCP prompt templates for VS Code Copilot
examples/                sample project preflight scanner

Grenzen

Die folgenden Punkte werden von diesem Repository nicht beansprucht:

  • Qualität der freien Intent-Parsing unabhängig von der Modellversion – die LLM-Pipeline ist optional und ihre Ergebnisse werden nicht in den eingefrorenen Evaluierungsartefakten erfasst.

  • Kompatibilität mit proprietären oder vertraulichen Java-Test-Frameworks.

  • Produktions-Latenz-SLO – alle Messungen sind lokale sequenzielle Benchmarks in einem einzelnen Prozess.

  • Paralleler, verteilter oder hochverfügbarer Betrieb.

  • Automatische Ausführung von generiertem Java gegen Hardware oder ein Testinstrument.

  • Produktivitäts-, Kosten-, Ertrags- oder Testzeitersparnis – dieses Repository enthält nur Generierungs- und Validierungsevidenz.

Die vollständige maschinenlesbare Grenze befindet sich in evidence/claims.json.


Lizenz

Repository-Code: MIT. Graph-Fixture, Intent-Fälle und Java-Stubs: CC0-1.0 (in Fixture-Metadaten gekennzeichnet).

Related MCP Connectors