graph-mcp-java-gen
graph-mcp-java-gen
MCP-сервер на основе графа, который преобразует запросы на естественном языке в проверенные, компилируемые Java-методы тестов — без выдуманных импортов, без необоснованных символов, без тихих сбоев.
Запрос на естественном языке или структурированный запрос поступает в официальный сервер Model Context Protocol (MCP) stdio. Версионированный графовый каталог (Neo4j или JSON-фикстура) предоставляет единственные символы, которые генератор может цитировать. Многоуровневый валидатор проверяет синтаксис, контракт фреймворка, обоснованность и правила запрещённых API перед возвратом любого исходного кода. Два опциональных LLM-агента — нормализатор намерений и рецензент после генерации — расширяют конвейер для работы с произвольным вводом, не нарушая детерминированную оболочку безопасности.
Архитектура
%%{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Мультиагентный конвейер
%%{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}Панель доказательств
Все измерения используют независимо сгенерированные синтетические фикстуры под лицензией CC0.
Результаты получены по принятой политике strict_graph_v2 на отложенном подтверждающем разбиении.
Поверхность | Результат | Артефакт |
Масштаб бенчмарка | 96 CC0-намерений — 32 dev / 32 val / 32 confirmation | |
Успех подтверждающих задач | 32 / 32 ограниченных задач | |
Валидация сгенерированного исходного кода | 24 / 24 поддерживаемых намерений — синтаксис + контракт + обоснованность + безопасность | |
Безопасное отклонение состязательных запросов | 8 / 8 — ноль ложных принятий | |
Точность цитирования | 100% — импортируются только символы, указанные в графе | |
Полнота обязательных символов | 100% — каждый обязательный символ присутствует | |
Живая интеграция с Neo4j | Neo4j 5.26.29 — материализовано 8 символов, 12 методов | |
Официальный бенчмарк MCP | 120 / 120 ожидаемых результатов — ноль ошибок протокола | |
Тёплая задержка MCP (p50 / p95 / p99) | 29.13 / 48.61 / 54.23 мс при параллелизме 1 | |
Компиляция Java | 8 / 8 файлов классов через Eclipse ECJ 3.21 | |
Внешние вызовы моделей (детерминированный путь) | 0 вызовов · $0.00 |
Показатели задержки — это локальные однопроцессные измерения на Windows, а не производственные SLO.
Выбор политики
Были оценены четыре политики генерации. Цель выбора была объявлена до открытия подтверждающего разбиения: максимизировать успех валидации задач среди кандидатов, прошедших все проверки безопасности. Подтверждение было открыто ровно один раз для выбранного кандидата.
%%{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]Кандидат | Успех задач | Ген. валид. | Безопасн. отклон. | Точн. цитир. | Решение |
| 21.9% | 0% | 87.5% | 0% | Отклонено — нет обоснованности |
| 75.0% | 100% | 0% | 100% | Отклонено — 8 ложных принятий |
| 100% | 100% | 100% | 100% | Выбрано |
| 96.9% | 100% | 87.5% | 87.5% | Отклонено — нерелевантный контекст + 1 ложное принятие |
Инструменты MCP
Инструмент | Тип | Поведение |
| Чтение | Возвращает идентичность фикстуры, происхождение, лицензию, бэкенд, количество символов |
| Чтение | Параметризованный поиск по имени/методу; максимум 20 результатов |
| Генерация | Типизированные поля → поиск по графу → Java → все проверочные ворота |
| Генерация | Ограниченная грамматика из 3 форм → та же строгая политика |
| Проверка | Проверяет до 20 000 символов; никогда не записывает и не выполняет исходный код |
| Мультиагентный | LLM-парсер намерений → генератор → LLM-рецензент; требует |
Адаптер Neo4j использует фиксированные параметризованные Cypher-запросы, отклоняет учётные данные в URI и отказывает при коллизиях идентичности фикстур.
Быстрый старт
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-клиента (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"
}
}
}Включение мультиагентного NLP-инструмента
# Add to your environment or .env file
OPENAI_API_KEY=sk-...
GRAPH_BACKEND=neo4j # optional; defaults to local JSON fixtureВоспроизведение доказательств
# 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Живой путь Neo4j
# 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
# Requires JDK 21 on PATH
python scripts/compile_generated.py --require-compiler
# Writes evidence/java_compile.jsonДизайн безопасности
Никакого сырого Cypher на поверхности MCP — все графовые запросы параметризованы.
Строгие списки разрешённых полей — имена классов, имена пакетов, имена модулей, версии и пути конфигурации проверяются по скомпилированным регулярным выражениям перед любым поиском по графу.
Сканер безопасности исходного кода — сгенерированный Java отклоняется, если он ссылается на
Runtime.getRuntime,ProcessBuilder,System.exit,java.io,java.nio.fileилиjava.net.Предотвращение обхода путей — абсолютные пути и сегменты
..отклоняются в полях путей конфигурации.Принудительная обоснованность — каждый импорт в сгенерированном исходном коде должен соответствовать символу, полученному из графа для этой конкретной версии.
Повторная валидация вывода LLM — поля, извлечённые LLM-парсером намерений, проходят ту же проверку
GenerationIntent.from_mapping(), что и прямые вызовы API.Учётные данные Neo4j — загружаются только из переменных окружения; никогда не логируются и не возвращаются в артефактах доказательств.
XML-предварительная проверка —
defusedxmlпредотвращает атаки расширения сущностей при сканировании структуры проекта.Контейнер — закреплённый образ Chainguard Linux, не-root UID/GID 65532; CI выполняет MCP-смоук-тест через stdio в контейнере.
Полную границу угроз см. в SECURITY.md.
Карта репозитория
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Границы
Следующее не заявляется этим репозиторием:
Качество разбора произвольных намерений, независимое от версии модели — LLM-конвейер опционален, и его результаты не фиксируются в замороженных артефактах оценки.
Совместимость с любым проприетарным или конфиденциальным Java-тестовым фреймворком.
Производственные SLO задержки — все измерения являются локальными однопроцессными последовательными бенчмарками.
Параллельная, распределённая или высокодоступная работа.
Автоматическое выполнение сгенерированного Java против оборудования или тестового инструмента.
Любая экономия производительности, затрат, выхода или времени тестирования — этот репозиторий содержит только доказательства генерации и валидации.
Полная машиночитаемая граница находится в evidence/claims.json.
Лицензия
Код репозитория: MIT. Графовая фикстура, кейсы намерений и Java-заглушки: CC0-1.0 (указано в метаданных фикстуры).
This server cannot be deployed
Maintenance
Related MCP Connectors
Deterministic validation for AI-generated artifacts: JSON Schema, OpenAPI response, SQL syntax.
Writes adversarial test suites for AI-built code. Your agent's test engineer.
Proves AI-generated Python does what you asked: lint, types, security, sandbox run, exact fixes.
Change-aware CI validation and affected-test guidance for coding agents.