Files
acdl/mcp/atelier
Jon Chery 8bcf7296d5 feat(P5): Atelier MCP server + vendored Atelier + plugin-registry (REQ-223, REQ-224, REQ-225)
REQ-223: mcp/atelier/server.py plugin-registry MCP server (stdio, D-135).
NovaAtelierServer wraps MCPServer (SDK v2, D-137) if installed; degrades
to _ToolRegistry fallback if SDK absent (testable in CI without SDK).
plugins/principles.py (lookup_principle, list_domains, matrix_lookup) +
plugins/validation.py (validate_against_principles — agentic validation
beyond Wiz/Checkmarx/Mend). 4 tools, 2 plugins.

REQ-224: mcp/atelier/vendor/ pinned Atelier v0.3.6 (D-136) — core/
first-principles, domains/security/first-principles, review/agent-checklist,
matrix/principles-matrix. vendor/VERSION.md + scripts/update_atelier_vendor.sh
for intentional upgrades. mcp/atelier/README.md (tools, architecture,
running, vendoring, extensibility, transport).

REQ-225: tests/test_atelier_mcp.py — 16 tests, all pass. Covers: plugin
discovery (both loaded), 4 tools registered, lookup_security_P4 (+P1,
unknown domain/principle), list_domains (19, security-relevant, ui-ux-not),
matrix_lookup (security 10 P-rules, unknown), validation (good-passes,
bad-secret-fails, bad-swallowed-error-fails, bad-obfuscated-names-fails,
result-structure).

---ci---
project: acdl
phase: 5
milestone: v1.18
status: execute
requirements:
  covered: [REQ-223, REQ-224, REQ-225]
  partial: []
---/ci---
2026-08-06 15:13:40 +00:00
..

Nova Atelier MCP Server

v1.18, REQ-223, REQ-224. An MCP (Model Context Protocol) server that exposes Atelier engineering principles to the citizen developer's AI agent. Plugin-registry architecture (D-140); stdio transport (D-135); vendored Atelier (D-136) for audit reproducibility.

What This Is

The server exposes 4 tools that let a citizen developer's AI coding agent look up production-grade engineering principles and validate code against them — agentic validation that goes beyond deterministic scanners (Wiz, Checkmarx, Mend) by catching correctness, clarity, simplicity, and observability gaps.

Tools

Tool Description
atelier.lookup_principle(domain, principle_id) Look up a principle by domain + P-rule ID (e.g., security, P4). Returns the principle text + the core C-rule it derives from.
atelier.list_domains() List the 19 Atelier domains with P-rule counts + Nova-relevance.
atelier.matrix_lookup(domain) Look up the domain→core principle mapping for a given domain.
atelier.validate_against_principles(snippet, domains?) Validate a code/diff snippet against the Atelier agent-checklist. Returns pass/fail per check item with the principle citation.

Architecture — Plugin Registry (D-140)

mcp/atelier/
├── server.py              # entrypoint: loads plugins, starts server
├── plugins/
│   ├── __init__.py
│   ├── principles.py       # lookup_principle, list_domains, matrix_lookup
│   └── validation.py       # validate_against_principles
├── vendor/                 # pinned Atelier snapshot (D-136)
│   ├── VERSION.md           # pinned tag + upgrade instructions
│   ├── core/first-principles.md
│   ├── domains/security/first-principles.md
│   ├── review/agent-checklist.md
│   └── matrix/principles-matrix.md
└── README.md               # this file

Each plugin module exposes register(mcp) -> None and calls @mcp.tool() for its tools. server.py scans plugins/ and calls register on each. Future capabilities drop in as a new plugin file — no server.py edits.

Running

With the MCP Python SDK installed

pip install "mcp[cli]"
python3 -m mcp.atelier.server

The server runs over stdio. An MCP client (e.g., the citizen developer's AI coding agent) spawns it as a subprocess and calls tools via JSON-RPC.

Without the SDK (fallback / test mode)

The server degrades to a plain-Python tool registry. Tools are callable directly — this is how tests run without the SDK installed:

from mcp.atelier.server import NovaAtelierServer
s = NovaAtelierServer()
s.load_plugins()
result = s.call_tool("atelier_lookup_principle", {"domain": "security", "principle_id": "P4"})

Vendoring (D-136)

Atelier is vendored under vendor/ at a pinned tag (v0.3.6, see vendor/VERSION.md). An agentic validation result is only reproducible if the principles that produced it are pinned. Live-fetch breaks replayability (Atelier main drifts). To upgrade:

bash scripts/update_atelier_vendor.sh <new-tag>

Extensibility

To add a new tool (e.g., a cost-estimation tool, a policy-as-code evaluator): create plugins/<name>.py, expose register(mcp), and call @mcp.tool() on your function. The server picks it up automatically. No server.py edit. This is the extensibility insurance for future capabilities.

Transport

  • Now: stdio (local agent consumption — the citizen developer's AI agent spawns the server as a subprocess).
  • Future: Streamable HTTP (the MCP SDK supports it on the same MCPServer object; adding it is a transport-only change in server.py, not a rewrite).