Skip to main content
Glama
README.md
<p align="center">
  <img src="assets/logo.svg" alt="erdlens" width="96" height="96" />
</p>

<h1 align="center">erdlens</h1>

<p align="center"><b>Your schema becomes an ER diagram, straight into your docs. And it tells you when the diagram goes stale.</b></p>

<p align="center">
  ๐Ÿ‡บ๐Ÿ‡ธ English ยท <a href="README.id.md">๐Ÿ‡ฎ๐Ÿ‡ฉ Bahasa Indonesia</a> ยท <a href="README.zh-CN.md">๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡</a>
</p>

<p align="center">
  <img alt="license" src="https://img.shields.io/badge/license-MIT-6C8EEF" />
  <img alt="runtime deps" src="https://img.shields.io/badge/runtime%20deps-0-6C8EEF" />
  <img alt="tests" src="https://img.shields.io/badge/tests-57%20passing-6C8EEF" />
  <img alt="mcp" src="https://img.shields.io/badge/MCP-server-6C8EEF" />
  <img alt="typescript" src="https://img.shields.io/badge/TypeScript-MVVM-6C8EEF" />
</p>

<p align="center">
  <img src="assets/showcase.gif" alt="erdlens turning a schema into an ER diagram, a workflow into a flowchart, and catching drift after a migration" width="720" />
</p>

---

You ask Claude Code to document your database. It writes the doc, you generate an ER diagram in some
other tool, then you copy-paste the diagram back in. Two tools, double work, and the moment someone
runs a migration the diagram in the doc is quietly wrong.

**erdlens** is an MCP server that closes that loop. Claude Code reads your schema, turns it into a
Mermaid ER diagram, and writes it **into** the document in one pass. No second tool, no copy-paste.
And it can check later whether that diagram still matches the schema.

## Why it's different

The existing diagram MCP servers render Mermaid you already wrote. erdlens starts a step earlier: it
**reads the schema for you**, and a step later: it **watches for drift**.

|  | render your Mermaid | read the schema | write into the doc | drift-check |
|--|:--:|:--:|:--:|:--:|
| mermaid-preview MCPs | โœ… | โŒ | partial | โŒ |
| mermerd (CLI, not MCP) | โŒ | โœ… (DB only) | โŒ | โŒ |
| **erdlens** | โœ… | โœ… (5 sources) | โœ… | โœ… |

Schema sources: **SQL DDL, Prisma, Drizzle, TypeORM, SQLAlchemy** โ€” file or text, auto-detected.

## Install (Claude Code)

```bash
claude mcp add erdlens -- npx -y github:ryanda9910/erdlens
```

Or point at a local clone:

```bash
git clone https://github.com/ryanda9910/erdlens
claude mcp add erdlens -- node /abs/path/to/erdlens/bin/erdlens.js
```

Then just ask Claude Code: *"document the database and put an ER diagram in docs/schema.md"*. It calls
`render_erd` and the diagram lands in the file.

## Tools

| tool | what it does |
|--|--|
| `schema_to_erd` | schema (path or text) โ†’ Mermaid `erDiagram` + a ```mermaid fenced block to paste anywhere |
| `render_erd` | writes the ERD to disk: `.mmd` source, an embeddable `.md`, and a self-contained `.html` preview โ€” so it goes straight into a doc, no copy-paste |
| `drift_check` | compares an ERD already in a `.mmd`/`.md` against the current schema, and reports every table, column, and relation added or removed since. Run it in CI so a stale diagram fails the build |
| `workflow_to_diagram` | a workflow spec (a tiny text DSL or JSON steps) โ†’ Mermaid `flowchart` + fenced block. Document a process, pipeline, or state machine next to the ERD |
| `render_workflow` | same as `render_erd`, for workflows โ€” writes the flowchart to disk, embeddable |

## The drift check

This is the part that keeps docs honest. After a migration:

```
$ erdlens drift docs/schema.md db/schema.sql
Diagram is stale. It drifted from the current schema:
  + tables added since: audit_logs
  ~ posts: +published +slug
  + relations added: posts->users
Regenerate with render_erd to fix.
```

Exit code is non-zero when stale, so it drops into a CI step or a pre-commit hook.

## Workflows too

Not just data. Give it a workflow and it draws the flowchart โ€” same "into your docs" path.

```
# publish.flow
start -> draft
draft -> review
review -> publish : approved
review -> draft : changes
publish -> done
```

```bash
erdlens flow publish.flow
```
```
flowchart TD
  start(["start"])
  ...
  review -->|approved| publish
  review -->|changes| draft
```

Ask Claude Code *"put the publish workflow in docs/flow.md"* and it calls `render_workflow`.

## Also a CLI

Without an MCP client:

```bash
erdlens erd db/schema.sql            # print the Mermaid ERD
erdlens erd prisma/schema.prisma     # auto-detects Prisma
erdlens flow pipeline.flow           # print a Mermaid flowchart
erdlens drift docs/erd.mmd db/schema.sql   # exit 1 if drifted
erdlens tune                         # run the self-check loop (below)
```

## Self-improving loop

`erdlens tune` is a maker โ†’ checker โ†’ reflect loop: it runs every parser on a fixture plus a drift
scenario (maker), an independent grader flags anything that passed before and fails now (checker),
and it persists per-source pass state to `~/.erdlens/memory.json` (reflect). It's how the parsers stay
honest as new schema dialects get added โ€” a regression surfaces instead of slipping through.

## Tests

```bash
npm test    # builds, then 57 assertions: 24 schema engine + 14 workflow + 19 MCP stdio
```

There's also an end-to-end script that drives the whole thing through a real Claude Code run
(`bash test/e2e.sh`, needs the `claude` CLI logged in).

## How it's built

TypeScript, laid out MVVM:

- **Model** (`src/model/`) โ€” pure logic: schema parsers, workflow parser, drift diff, types.
- **ViewModel** (`src/viewmodel/`) โ€” orchestration: the tool operations and the self-improving loop.
- **View** (`src/view/`) โ€” surfaces: the JSON-RPC MCP server, the CLI, and Mermaid/HTML rendering.

Zero **runtime** dependencies. The MCP server is a from-scratch JSON-RPC stdio implementation; the HTML
preview loads Mermaid from a CDN only when you open it in a browser.

## License

MIT

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: drift_check verifies consistency, schema_to_erd generates ERD source, render_erd writes ERD to disk, workflow_to_diagram generates workflow source, and render_workflow writes workflow to disk. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with lowercase and underscores: drift_check, render_erd, render_workflow, schema_to_erd, workflow_to_diagram. No mixing of conventions.

Tool Count5/5

Five tools is an ideal size for this specialized serverโ€”enough to cover core functionality without bloat. Each tool serves a necessary role in the diagram generation and verification workflow.

Completeness5/5

The tool set covers full lifecycle for both ERDs and workflows: generation (source and disk) and consistency checking. No obvious missing operations for the stated purpose.

Maintenance

ActivityStale
ResponsivenessNo issues