Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Deterministic IR/IR-LINT validation, policy packs, drift vs exports (archrad). Apache-2.0.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"deterministic": {
"command": "npx",
"args": [
"-y",
"@archrad/deterministic"
]
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add deterministic -- npx -y @archrad/deterministic프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"deterministic": {
"command": "npx",
"args": [
"-y",
"@archrad/deterministic"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"deterministic": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@archrad/deterministic"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 6일 점검
레지스트리 이름이 GitHub 계정 archradhq 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.4.1)은 6개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, FOGA node
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
A Finch OG Agent cell as an MCP server: read the world, dry-run and take ERC-8414 tenders by policy.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Your architecture drifts before you write a single line of code. archrad validate catches it — deterministically, in CI, before the PR merges.
Define your system as a graph. ArchRAD compiles it, lints it against architecture rules, and tells you exactly what's wrong — with rule codes, not opinions.
New in 0.7.x —
archrad demoruns a full example with zero setup, andarchrad scan
drafts an IR from any repo with every node cited to
file:line. Lint findings only
decrease in this release; nothing that passed on 0.6.x can start failing.
See the changelog.
npm install -g @archrad/deterministic
archrad demo
No IR file, no flags, no config — runs from any directory. Lints a bundled example and shows you the findings:
orders-api (http) ──▶ orders-db (postgres)
⚠️ IR-LINT-DIRECT-DB-ACCESS-002: API node "orders-api" connects directly to datastore node "orders-db" Fix: Introduce a service or domain layer between HTTP handlers and persistence. ⚠️ IR-LINT-MISSING-AUTH-010: HTTP entry node "orders-api" has no auth node or auth config … ⚠️ IR-LINT-NO-HEALTHCHECK-003: No HTTP node exposes a typical health/readiness path …
archrad scan . --out draft.ir.json # draft an IR — every node cited to file:line
archrad validate --ir draft.ir.json # lint it
scan reads your Docker Compose, Kubernetes manifests, Terraform, OpenAPI, package manifests, and source code, then grades every node by confidence so you can see what was parsed versus guessed. The output is a normal IR file — review it, edit it, commit it.
Already have an OpenAPI spec or a Backstage catalog? Skip the scan:
archrad ingest openapi --spec ./openapi.yaml --out ./graph.json
archrad ingest backstage --catalog . --out ./graph.json
Once a graph is committed, archrad validate is your CI gate — exit 1 blocks the merge.
ArchRAD is a blueprint compiler and governance layer. You define your architecture as an IR — nodes, edges, allowed connections — and ArchRAD validates it against a deterministic rule engine. The same IR, the same rules, the same inputs always produce the same findings.
| Command | What it checks | Codes |
|---|---|---|
archrad validate | Graph structure + architecture lint | IR-STRUCT-* IR-LINT-* |
archrad lint | Architecture lint only (fast inner-loop; skips structural) | IR-LINT-* |
archrad explain | Canonical rule guidance without running a pass | — |
archrad policies-sha256 --dir | Generate a archrad-policy-pack.sha256 manifest for signed PolicyPacks | — |
archrad validate-drift | IR vs generated code on disk | DRIFT-* |
archrad scan | Draft IR from a repo — topology, OpenAPI, manifests, code; every node cited + graded by confidence | — |
archrad reconstruct | Draft IR from source code alone (one of scan's four signal sources, usable standalone) | — |
archrad ingest openapi | Derive IR from OpenAPI (local path or https URL for --spec; -H for URL auth headers) | — |
archrad ingest backstage | Backstage catalog-info.yaml → IR (Component, Resource, API, System; Location file targets) | — |
archrad fragment merge | Merge 2+ IR files — union by node.id (conflicts → stderr); --prefix-fragments for disjoint union | — |
archrad export | Compile IR → FastAPI or Express + Docker | — |
Ingest + merge workflows: `docs/INGEST.md`. All commands / flags: `docs/CLI_REFERENCE.md`. Codegen (`export`): `docs/EXPORT.md`.
archrad scan)archrad scan points at a repository and emits a draft IR — never a final answer, always something to review and edit. It runs six extractors, graded by how much they have to guess:
| Source | Signal | Confidence |
|---|---|---|
| Topology | docker-compose.yml, Kubernetes manifests | high — a declaration, parsed for real |
| Interface | OpenAPI / Swagger | medium — documents a real surface, but only what's documented |
| Infrastructure-as-code | Terraform (*.tf) | medium — a real declaration, but read via regex, not a true HCL parse |
| Manifest | package.json, requirements.txt, go.mod, pom.xml | low — a driver dependency implies an edge, not proof it's used |
| Code | pattern scan of source (Node.js/TS, Python, C#) | low — regex over text, no semantic understanding |
Every node and edge carries config.provenance[] — inferred_from: "file:line", a confidence, and which extractor found it — so nothing has to be taken on faith. When two extractors describe the same thing, scan merges them (keeping the highest-confidence body, unioning all provenance) instead of duplicating or erroring.
archrad scan . --dry-run # print the draft, write nothing
archrad scan ./server --out draft.ir.json # write it archrad scan . --extractors compose,manifest # only run specific extractors archrad scan . --scope all # include tests, examples, docs, and demos
CLI scans default to --scope production so fixtures, documentation examples, Storybook stories, and test-only manifests do not become production findings. Use --scope all when those artifacts are the subject of the review. Library callers retain the backwards-compatible scope: 'all' default.
The output is a normal IR file — pipe it straight into archrad validate once you've reviewed it. Full flags: `docs/CLI_REFERENCE.md`.
archrad reconstruct + --codebase)"The IR looks clean — but is that what was actually shipped?"
The validation pipeline above checks your authored IR (the design contract). The --codebase flag bridges the gap to the real codebase by reconstructing an IR from source code and comparing them.
A developer can author a compliant IR (passes all IR-STRUCT-* and IR-LINT-* rules) while the actual code bypasses the documented architecture. The most dangerous pattern: an IR that shows a clean service layer but code that directly queries the database.
# Catch discrepancies between the authored design and the shipped code
archrad validate --ir authored-ir.json --codebase ./src --report findings.html
When --codebase is provided, the pipeline runs three stages:
Implementation drift uses a separate exit threshold: `--fail-on`, `--fail-on-warning`, and `--max-warnings` apply only to IR-STRUCT-*, IR-LINT-*, and merged PolicyPack findings. IR-DRIFT-IMPL-* are gated solely by `--impl-drift-fail-on` (default: drift severities `error` fail the command).
| Code | Severity | What it catches |
|---|---|---|
IR-DRIFT-IMPL-000 | warning | Authored IR could not be parsed for drift comparison (fix structural issues first) |
IR-DRIFT-IMPL-001 | warning | IR declares HTTP-like entry nodes but reconstruction detected zero artifacts in --codebase |
IR-DRIFT-IMPL-002 | warning | HTTP / health routes in code but authored IR has no HTTP-like nodes |
IR-DRIFT-IMPL-003 | error | Direct DB connection in code, no DB edge in authored IR |
IR-DRIFT-IMPL-004 | error | HTTP route in code not present in authored IR |
IR-DRIFT-IMPL-005 | warning | Service-to-service call in code, no edge in authored IR |
IR-DRIFT-IMPL-006 | info | Auth middleware in code, no auth node in authored IR |
IR-DRIFT-IMPL-003 is the critical one. An error there means the authored IR hides a direct DB dependency.
# Just reconstruct — write the IR without comparing
archrad reconstruct --from ./src --output reconstructed-ir.json
archrad reconstruct --from ./src --language python --output py-ir.json
archrad reconstruct --from ./src --dry-run
archrad reconstruct --from ./src --verbose
| Language | Detected patterns |
|---|---|
| Node.js / TypeScript | Express, Fastify, NestJS routes + controllers; BullMQ workers, Agenda jobs, cron schedules; pg, Prisma, TypeORM, Sequelize, Mongoose, Redis, BullMQ, Firebase; Passport, express-jwt, NestJS guards, Auth0, Okta, Keycloak, Cognito; axios, got, node-fetch, gRPC; outbound HTTP URLs extracted per destination |
| Python | Flask, FastAPI, Django URLs, DRF @action; SQLAlchemy, psycopg2, asyncpg, PyMongo, motor, redis-py; login_required, jwt_required, FastAPI OAuth2; requests, httpx, aiohttp, gRPC |
| C# | Minimal API MapGet/MapPost; ASP.NET Core [HttpGet]/[ApiController]; EF Core DbContext, Npgsql, Dapper; [Authorize], AddAuthentication, JWT bearer; HttpClient, gRPC, RestSharp |
The reconstructor detects service boundaries and creates one node per service rather than collapsing everything into a single gateway:
| Layout | Detection signal | Result |
|---|---|---|
Files in routes/ or controllers/ directory | router.get/post/… in dedicated file | One service node per file |
| NestJS controllers | @Controller decorator / *.controller.ts naming | One service node per controller file |
Entry file with app.listen() | Mounts other routers | gateway node |
| BullMQ / Agenda / cron files | new Worker(…), agenda.define(…) | worker node |
| Monolithic file (all routes in one file) | Single file, no routes/ dir | Single gateway node — no forced split |
Edges between nodes reflect what the reconstruction found:
DB and cache nodes use the most user-recognizable name available:
process.env.REDIS_URL → node named "redis", process.env.SESSION_REDIS_URL → "session-redis"const userDb = new Pool(…) → node named "userDb" (for unique variable names)Node IDs and names never include env_var or other detection-method metadata.
Outbound HTTP/gRPC calls create distinct external nodes per destination:
axios.post('https://api.stripe.com/…') → node "stripe"fetch('https://auth0.com/oauth/token') → node "auth0"new PaymentServiceClient('payments-svc:50051') → node "payment" (gRPC)"external-service" nodeReconstruction is best-effort signal, not certainty:
eval, reflection, metaprogramming, and generated code are not detected.앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요