Local-first MCP server for managing PlantUML and Mermaid diagrams, rendering them, and checking them against your codebase.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
claude mcp add diagrams -- npx -y diagrams-mcp-server{
"mcpServers": {
"diagrams": {
"command": "npx",
"args": ["-y", "diagrams-mcp-server"]
}
}
}MCP Servers overview
# diagrams-mcp-server
> **Technical Preview (V1 Preview, v0.2.0)** — local-first MCP server for
> PlantUML and Mermaid diagrams with architecture drift detection.
An MCP (Model Context Protocol) server that gives AI coding agents direct, structured access to your project's **PlantUML** and **Mermaid** architecture diagrams — list them, read them, create or update them, render them to images, and (uniquely) **check whether they still match your actual code**.
Works with **any MCP-compatible client** over stdio: Claude Desktop, Claude Code, Codex (Desktop & CLI), Antigravity (IDE, 2.0 & CLI), OpenCode (Desktop & CLI), Cursor, and VS Code. See [Client setup](#client-setup) below.
## Why this exists
I built this after running into the same problem while using AI to work on software design. The diagram was in one place, the code was in another, and I kept having to paste context into the conversation. After a few rounds, it became hard to tell whether the diagram still described the project. I wanted a small local MCP server that could keep the diagram in the project, let the agent read it, and check it against the code when needed.
`diagrams-mcp-server` closes that gap: it treats your diagrams folder as a first-class, agent-readable part of the project, right next to the code. Because it is built on plain stdio MCP with no client-specific code, it works across the clients listed below.
## Features
| Tool | What it does |
|---|---|
| `diagrams_list` | List all PlantUML/Mermaid diagrams in the project, with extracted titles and explicit `offset`/`limit` pagination |
| `diagrams_get` | Read the raw source of a diagram, in full or as an explicit `offset`/`max_chars` window |
| `diagrams_create` | Create a new diagram file (refuses to overwrite) |
| `diagrams_update` | Replace an existing diagram's content |
| `diagrams_delete` | Delete a diagram (explicit, marked `destructiveHint`) |
| `diagrams_render` | Render a diagram to SVG/PNG |
| `diagrams_check_consistency` | **Compare class/interface/component names in a diagram against your actual codebase** and flag anything that looks outdated |
`diagrams_check_consistency` is a fast, dependency-free heuristic (not a full semantic/AST analysis): it extracts entity names from `class`/`interface`/`enum`/`component` declarations in the diagram and searches your source files for a matching identifier. It won't catch everything a real static analyzer would, but it catches the most common and costly form of drift: a class that was renamed or deleted, or a component that was designed but never built — for free, with no per-language parser required. Structured output includes the extracted/matched/unmatched entity names, per-entity evidence with matched files, the analyzer tiers involved (reliable vs experimental/generic heuristic), and an explicit heuristic confidence warning. Codebase scans are capped at 5,000 source files; the result reports `truncated`, `scan_limit`, `files_scanned`, and `scan_warning` so a capped scan is never mistaken for a complete one — when `truncated` is true, unmatched results may be incomplete.
## Pagination and source windows
Pagination is explicit and opt-in — the server never pages or truncates on its own.
`diagrams_list` accepts optional `offset` (non-negative integer, default `0`) and `limit` (integer `1`–`500`). Omitting both returns every match. The response always includes `count` (items in this page), `total` (matches before paging), the effective `offset`/`limit`, and `has_more` (whether items after this page remain). An `offset` past the end returns an empty page with `has_more: false`, not an error. Example: first `diagrams_list({ "type_filter": "all", "limit": 10 })`, then `diagrams_list({ "type_filter": "all", "offset": 10, "limit": 10 })` while `has_more` is true.
`diagrams_get` accepts optional `offset` (zero-based character offset, default `0`) and `max_chars` (integer `1`–`100000`). Omitting both returns the full source. The response always includes `is_partial`, the effective `offset`, `total_chars`, `returned_chars`, and `has_more`; the text block always equals the returned `content`, so a window is never silently truncated. An `offset` past the end of the source returns an `isError` result instead of an empty string. Example: `diagrams_get({ "relative_path": "models/big.puml", "offset": 0, "max_chars": 2000 })`, then repeat with `offset: 2000`.
## Requirements
- Node.js 18+ for running the server (runtime `engines: >=18` — the compiled `dist/` output, `npm test`, and `npm start` work on Node 18)
- Node.js >=20.19 for the development toolchain (`npm ci`, `npm run lint`, `npm run format:check`, `npm run build`) — the ESLint 10 toolchain does not run on older Node versions
- (Optional, for `diagrams_render`) [`@mermaid-js/mermaid-cli`](https://github.com/mermaid-js/mermaid-cli) for Mermaid rendering: `npm install -g @mermaid-js/mermaid-cli`
- (Optional, for `diagrams_render`) A local `plantuml` CLI for offline PlantUML rendering. Without it, rendering fails with an actionable error unless remote rendering is explicitly enabled with `ALLOW_REMOTE_PLANTUML=true`, in which case it falls back to the public `plantuml.com` server over HTTPS. `DISABLE_REMOTE_PLANTUML=true` always disables the fallback, even when the allow flag is set.
## Installation
No git clone needed — install straight from the npm registry:
```bash
npx diagrams-mcp-server --help # run once, no install
npm install -g diagrams-mcp-server # or install globally
```
### From source (contributors)
```bash
git clone https://github.com/mohammad-emad-dev/diagrams-mcp-server.git
cd diagrams-mcp-server
npm install
npm run build
```
### Where the files live
- Global install (`npm install -g diagrams-mcp-server`): the package lands in
the global `node_modules` (run `npm root -g` to find yours — e.g.
`C:\Users\<you>\AppData\Roaming\npm\node_modules` on Windows,
`/usr/local/lib/node_modules` on macOS/Linux) with launch shims on your
PATH, so `diagrams-mcp-server` runs from anywhere.
- Project dependency (`npm install diagrams-mcp-server` inside a project):
the same payload under `<project>/node_modules/diagrams-mcp-server/`,
with the binary linked at `<project>/node_modules/.bin/diagrams-mcp-server`.
- `npx diagrams-mcp-server`: uses the global install if present, else the
local one, else downloads and caches it — no manual file handling needed.
All three run the same entry point (`dist/index.js`), so MCP clients can use
whichever path fits: the global shim, the project's `.bin` binary, or
`node <path>/dist/index.js` directly.
### Lint and formatting
```bash
npm run lint # ESLint over src/ (TypeScript recommended rules, zero warnings allowed)
npm run format:check # Prettier check over src/ (100-col, double quotes, semicolons, trailing commas)
```
Both run in CI (`.github/workflows/ci.yml`, Node 20.x/22.x matrix) before the build. They cover
source and test files under `src/` only — `dist/`, `node_modules/`,
`graphify-out/`, and packed tarballs are excluded via `eslint.config.mjs`
and `.prettierignore`. These two commands require the development toolchain
(Node >=20.19); the server runtime itself still supports Node >=18. `.gitattributes`
pins all text files to LF, so Windows and Linux checkouts produce identical
line endings and the format check gives the same result on every platform.
### Local tarball install (no registry access)
To install and run this Technical Preview (v0.2.0) without registry
access, pack and install from a local tarball instead:
```bash
npm pack # runs the prepack build and writes diagrams-mcp-server-0.2.0.tgz
cd /path/to/your/project
npm init -y # if the consumer project has no package.json yet
npm install /path/to/diagrams-mcp-server-0.2.0.tgz
npx diagrams-mcp-server --help # resolves the local install, exits 0
```
This installs only the published payload (`dist/` runtime files, `README.md`,
`LICENSE`) — no tests, fixtures, or local configs — and
changes nothing outside the consumer project (no global packages, no
registry publish). Point any stdio MCP client at the installed binary
(`node_modules/.bin/diagrams-mcp-server`) the same way as `dist/index.js`
in [Client setup](#client-setup).
## Client setup
`diagrams-mcp-server` speaks plain stdio MCP, so it works with any MCP-compatible client. Setup instructions for each below.
All examples assume you built the server at `/absolute/path/to/diagrams-mcp-server` and want it attached to a project at `/absolute/path/to/your/project`. Replace both paths with your own. If you installed from the registry, use the global install path or your project's `node_modules/.bin/diagrams-mcp-server` instead of a build directory (see [Where the files live](#where-the-files-live)).
### Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"diagrams": {
"command": "node",
"args": ["/absolute/path/to/diagrams-mcp-server/dist/index.js"],
"env": {
"PROJECT_ROOT": "/absolute/path/to/your/project"
}
}
}
}
```
### Claude Code
```bash
claude mcp add diagrams -- node /absolute/path/to/diagrams-mcp-server/dist/index.js
```
Set `PROJECT_ROOT` in your shell environment, or run Claude Code from within your project directory (it defaults to the current working directory).
### Codex (Desktop & CLI)
```bash
codex mcp add diagrams -- node /absolute/path/to/diagrams-mcp-server/dist/index.js
```
Or add directly to `~/.codex/config.toml`:
```toml
[mcp_servers.diagrams]
command = "node"
args = ["/absolute/path/to/diagrams-mcp-server/dist/index.js"]
env = { PROJECT_ROOT = "/absolute/path/to/your/project" }
```
### Antigravity (IDE, 2.0 & CLI)
Antigravity IDE, Antigravity 2.0, and Antigravity CLI share one config file: `~/.gemini/config/mcp_config.json` (or `.agents/mcp_config.json` for project scope). Add:
```json
{
"mcpServers": {
"diagrams": {
"command": "node",
"What people ask about diagrams-mcp-server
What is mohammad-emad-dev/diagrams-mcp-server?
+
mohammad-emad-dev/diagrams-mcp-server is mcp servers for the Claude AI ecosystem. Local-first MCP server for managing PlantUML and Mermaid diagrams, rendering them, and checking them against your codebase. It has 1 GitHub stars and its last recorded update is dated 2026-09-10.
How do I install diagrams-mcp-server?
+
You can install diagrams-mcp-server by cloning the repository (https://github.com/mohammad-emad-dev/diagrams-mcp-server) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is mohammad-emad-dev/diagrams-mcp-server safe to use?
+
Our security agent has analyzed mohammad-emad-dev/diagrams-mcp-server and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains mohammad-emad-dev/diagrams-mcp-server?
+
mohammad-emad-dev/diagrams-mcp-server is maintained by mohammad-emad-dev. The last recorded GitHub activity is dated 2026-09-10, with 0 open issues.
Are there alternatives to diagrams-mcp-server?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy diagrams-mcp-server to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/mohammad-emad-dev-diagrams-mcp-server)<a href="https://claudewave.com/repo/mohammad-emad-dev-diagrams-mcp-server"><img src="https://claudewave.com/api/badge/mohammad-emad-dev-diagrams-mcp-server" alt="Featured on ClaudeWave: mohammad-emad-dev/diagrams-mcp-server" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!