Skip to main content
Glama
README.md
# schema-viz MCP server

A local [MCP](https://modelcontextprotocol.io) server that renders a database
schema as an **interactive, dbdiagram.io-style ER diagram** in your browser:
draggable table cards, color-coded headers, PK/FK/unique badges, relationship
lines, pan, and zoom. No internet, no account — it runs entirely on this machine.

## How it works

- You give it **DBML** (the same syntax as dbdiagram.io) — either inline text or
  a path to a `.dbml` file. With no input it shows the bundled `schema.dbml`
  (the LLM-Tinder schema).
- It parses the DBML (small dependency-free parser in `lib/parseDbml.js`),
  renders a self-contained HTML page, serves it from a local HTTP server
  (`http://127.0.0.1:4477`), and opens your browser.
- Call it again with an updated schema and the open tab **auto-reloads**.

## Tools

| Tool | What it does |
| --- | --- |
| `display_schema` | Render & open a schema. Args: `dbml` (text), `filePath` (path to `.dbml`), `title`, `open` (bool). |
| `get_schema_viewer_status` | Report whether the viewer is running and its URL. |

## Register with Claude Code

A project-scoped `.mcp.json` is already created at the repo root pointing at
`schema-mcp/index.js`. Restart Claude Code (or approve the server when prompted)
and the `schema-viz` tools become available. Verify with `/mcp`.

To register it globally instead:

```bash
claude mcp add schema-viz -- node "$(pwd)/schema-mcp/index.js"
```

## Try it without MCP

```bash
cd schema-mcp
npm install
npm run demo        # parses schema.dbml, serves it, opens the browser
```

## Diagram controls

- **Drag a table header** to move it; relationship lines follow.
- **Drag the background** to pan; **scroll** to zoom (or use the toolbar `+ / −`).
- **Auto-arrange** re-packs the tables; **Reset** restores the default view.

## Config

- Port: set `SCHEMA_VIZ_PORT` (default `4477`).

## Slash commands (bonus)

`commands/` holds the versioned source for the companion Claude Code slash commands:

- `schema.md` → `/schema` — render the current project's `.dbml` as the interactive diagram.
- `xray.md` → `/xray` — explain any project (structure, stack, backend, live runtime) and feed
  the visualizer's Infrastructure / How-it-was-built tabs via `display_schema`'s `context` arg.

These must live in `~/.claude/commands/` to work — this folder is the backup / source of truth.
Install with: `cp commands/*.md ~/.claude/commands/`

## Tabbed dashboard (optional)

Pass a `context` object to `display_schema` to turn the diagram into a multi-tab dashboard:

- **Schema** — the ER diagram (always present).
- **Infrastructure** — cards of `{ title, rows: [[label, value]] }`: database, auth, hosting,
  env var *names* (never values), MCPs. Reproducible from a project's files.
- **How it was built** — `buildSteps: [{ phase, items: [{ what, why }] }]`, a step-by-step story.

With no `context`, only the Schema tab shows (backward compatible). The `/xray` command assembles
this context automatically from the project.

TDQS

A3.9/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have completely separate concerns: one checks server status, the other renders a schema. There is no overlap or ambiguity in their purposes.

Naming Consistency5/5

Both tool names follow a clear verb_noun snake_case pattern: get_schema_viewer_status and display_schema. The naming is consistent and predictable.

Tool Count3/5

Two tools is borderline thin for a server, though each serves a clear purpose. The scope is narrow, but a stop-viewer or close-browser tool would make the set feel more complete.

Completeness4/5

The core workflow of rendering a schema and checking viewer status is covered. The lack of a way to close or stop the viewer is a minor gap that agents can work around by simply refreshing or leaving the browser tab.

Maintenance

ActivityInactive
ResponsivenessNo issues