Atlas / MCP servers / tommkruix / archprint

archprintSAFE

mcp/tommkruix/archprint

Infers architecture rules from your TypeScript repo's real import graph, gates each on statistical evidence, and emits them into the tools you already use (ESLint, dependency-cruiser, ts-arch). Turns the boundaries your code already follows into enforcement, so architecture drift gets caught, not ju

Verdict
SAFE
Grade
B
Trust score
88 /100
Exposed tools
8 4r · 4w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
7
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://www.npmjs.com/package/archprint) [](https://github.com/Tommkruix/archprint/actions/workflows/ci.yml) [](https://www.npmjs.com/package/archprint) [](./LICENSE) [](https://tommkruix.github.io/archprint/) [](https://glama.ai/mcp/servers/Tommkruix/archprint) [](https://mcpservers.org/servers/tommkruix/archprint)

Mine the architecture rules your repo already enforces, with the evidence attached.

[Try it in your browser](https://stackblitz.com/github/Tommkruix/archprint-demo), nothing to install · Quick start · Use in CI · Use with AI agents · Docs

What it does, in plain words

Every codebase has unwritten rules. "Pages never talk to the database directly." "Shared code never reaches back into the app." Nobody wrote them down, but the code follows them, until one day someone (or an AI assistant) breaks one without noticing.

Archprint reads a TypeScript project, finds the rules its code already follows, and shows you the proof for each one: how many files follow it, which files break it, and how sure it is. The rules you trust become automatic checks in the tools your team already runs, so a break is caught the next time lint runs (in your editor, a pre-commit hook or CI), not weeks later in review.

Think of it as a building inspector who surveys the house first and writes down how it was actually built, instead of handing you a rulebook from somewhere else.

  • **For developers and
Read from source at commit fa23706d3802OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add archprint -- npx -y [email protected] mcp
03

Exposed tools (8)

4 read · 4 write · 0 destructive.

ToolRiskDescription
areadd
breadd
no-db-client-in-request-entrywriteA request handler must not import the database client directly.
no-db-in-request-entryreadtest rule
no-direct-db-in-request-entrywriteRequest handlers must not import a database client directly; go through a service or data-access layer.
no-ui-layer-in-server-entrywriteA request handler must not import UI components.
no-xreadno x
no-x-in-routewriteA request handler must not import x.
04

Trust audit

SAFEgrade B · trust 88/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
none-observed
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

LOWInventory / provenance · inv.hidden_file · CWE-1104
.lintstagedrc.json
.lintstagedrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
deploy/.gcloudignore
.gcloudignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
tests/fixtures/app-isolation-auto/.dependency-cruiser.json
.dependency-cruiser.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/cli-auto/components/C2.tsx
C2.tsx
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/console-isolation-auto/src/c2.ts
c2.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/deep-relative-auto/src/c2.ts
c2.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/dependency-internals-auto/src/c2.ts
c2.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/phantom-deps-auto/src/c2.ts
c2.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/report.ts:359
`          Evidence: ${deepRel.relativeImporterCount - deepRel.offenderCount}/${deepRel.relativeImporterCount} files with relative imports avoid ../../../`,
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/generator/deep-relative-emitters.ts:37
message: 'Deep relative import: use a workspace alias instead of ../../../',
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/cli/adopted-rules.test.ts:10
} from '../../src/cli/adopted-rules.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/cli/adoption-readme.test.ts:5
import { injectAdoptionSection, stripAdoptionSection } from '../../src/cli/adoption-readme.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/cli/allow.test.ts:6
import { AllowError, runAllow } from '../../src/cli/allow.js';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp/remote/http.test.ts:36
resolve({ url: `http://127.0.0.1:${port}/mcp`, base: `http://127.0.0.1:${port}` });
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, commander, @changesets/cli, @commitlint/cli, @commitlint/config-conventional, @eslint/js, @types/node, @vitest/coverage-v8
Why it matters. 21 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
tests/fixtures/phantom-deps-auto/package.json
react
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
tests/fixtures/phantom-deps/package.json
react
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
tests/fixtures/workspace-package/packages/pkg-a/package.json
@scope/pkg-b
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
docs/public/demo/claude-code.gif
docs/public/demo/claude-code.gif
Why it matters. 2460008 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
docs/public/demo/cursor.gif
docs/public/demo/cursor.gif
Why it matters. 1983285 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
README.md:240
| Env access                         | Read `process.env` only in the config/env layer                                                                            | Review   |
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.read_system · CWE-94, CWE-1427
README.md:107
Read these numbers with care: about 50k of the tokens read in both columns are Claude Code's own system prompt,
INFOPrompt injection · prompt.read_system · CWE-94, CWE-1427
docs/getting-started.md:47
archprint does not check. About 50k of the tokens read in both columns are Claude Code's own system prompt. This

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha fa23706d3802full audit observations/trust-audit/mcp-server/tommkruix__archprint.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10fa23706d3802SAFEB88first audit
06

Questions

What is the archprint MCP server?

Infers architecture rules from your TypeScript repo's real import graph, gates each on statistical evidence, and emits them into the tools you already use (ESLint, dependency-cruiser, ts-arch). Turns the boundaries your code already follows into enforcement, so architecture drift gets caught, not ju

What tools does archprint expose?

8 in total: 4 read-only, 4 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is archprint safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (88/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does archprint need?

It reads NEXT_PUBLIC_SUPABASE_ANON_KEY, SECRET, SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY and TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does archprint run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @y/p at 0.12.4.

How current is this page?

The grade is for one exact copy of the source (fa23706d3802), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement