# D2 MCP Server (oci · ghcr.io/recursivefunctions/d2mcp:0.5.0)

Create, edit, validate, render, and export D2 diagrams with confined workspace access.

- Trust score: 52/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-24

## Components

- oci · `ghcr.io/recursivefunctions/d2mcp:0.5.0`: 52/100 (this document), [markdown](https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0.md), [page](https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/recursivefunctions/d2mcp:0.5.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-24.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 27 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3317 tokens (~118/item across 28 items; 16 tools + 12 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 90/100
  - Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 40/100
  - Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the D2 MCP Server server?

D2 MCP Server runs locally as a container image, launched with docker run --rm -i ghcr.io/recursivefunctions/d2mcp:0.5.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add recursivefunctions-d2mcp -- docker run --rm -i ghcr.io/recursivefunctions/d2mcp:0.5.0
```

### Cursor

```json
{
  "mcpServers": {
    "recursivefunctions-d2mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/recursivefunctions/d2mcp:0.5.0"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "recursivefunctions-d2mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/recursivefunctions/d2mcp:0.5.0"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add recursivefunctions-d2mcp -- docker run --rm -i ghcr.io/recursivefunctions/d2mcp:0.5.0
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "recursivefunctions-d2mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "ghcr.io/recursivefunctions/d2mcp:0.5.0"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  recursivefunctions-d2mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "ghcr.io/recursivefunctions/d2mcp:0.5.0"]
```

### Netclaw

```json
{
  "McpServers": {
    "recursivefunctions-d2mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/recursivefunctions/d2mcp:0.5.0"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "recursivefunctions-d2mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "ghcr.io/recursivefunctions/d2mcp:0.5.0"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 52, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 51, +1)

No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 50, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-14 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-12 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 50. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-10 (score 46, +6)

- [functional improvement] Stability: unverified → 0.43

### 2026-09-28 (score 40, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (16)

### `d2_capabilities` (~58 tokens)

List the embedded D2 v0.9.0 capability catalog, grouped by category. Use the returned IDs with d2_help or the returned URIs as MCP resources.

Input parameters:

- `category` (string): Optional exact category ID to list.

### `d2_create` (~239 tokens)

Create a new diagram that can be edited with Oracle API tools. This is the unified way to create diagrams:

1\. Empty diagram (no content): For building incrementally with Oracle API
2\. From D2 text (with content): For rendering complete D2 diagrams

Both types are fully editable using d2_oracle_* tools.

Examples:
\- d2_create(id="arch") → Empty diagram for incremental building
\- d2_create(id="arch", content="a -> b") → Diagram from D2 text

Use cases:
\- Building diagrams from data sources (use empty)
\- Rendering complete D2 text (use with content)
\- Converting existing D2 to editable form (use with content)
\- Interactive diagram creation (use empty)

Input parameters:

- `content` (string): Optional D2 text content. If provided, creates a diagram from this content (which can then be edited with Oracle API). If not provided, creates an empty diagram for incremental building. Both are ful…
- `id` (string, required): Unique identifier for the diagram
- `workspace_root` (string): Configured workspace root used for imports and local assets

### `d2_export` (~483 tokens)

Export an existing diagram with D2 v0.9's bundled Go renderers. Supports SVG, PNG, PDF, PPTX, GIF, and ASCII plus Dagre, ELK, and TALA.

Input parameters:

- `animationIntervalMs` (number): Board interval and style-animation sampling duration
- `asciiCharset` (string): ASCII character set
- `boardPath` (string): Dot-separated board path, for example layers.detail
- `center` (boolean): Center diagram content
- `dagreEdgeSep` (number): Dagre edge separation
- `dagreNodeSep` (number): Dagre node separation
- `darkThemeId` (number): Dark theme ID
- `darkThemeOverrides` (object): Dark theme token overrides
- `diagramId` (string, required): ID of the diagram to export
- `elkAlgorithm` (string): ELK algorithm name
- `elkEdgeNodeSpacing` (number): ELK edge-to-node spacing
- `elkNodeSpacing` (number): ELK node spacing
- `elkPadding` (string): ELK padding expression
- `elkSelfLoopSpacing` (number): ELK self-loop spacing
- `fontFamily` (string): Bundled regular font family
- `format` (string): Export format
- `includeDescendants` (boolean): Compose descendant boards where the format supports it
- `layout` (string): Bundled layout engine
- `maxBoards` (number): Per-operation board limit
- `maxFrames` (number): Per-operation GIF frame limit
- `maxHeight` (number): Maximum raster height
- `maxOutputBytes` (number): Maximum encoded output bytes
- `maxPixels` (number): Maximum pixels per raster frame
- `maxWidth` (number): Maximum raster width
- `monoFontFamily` (string): Bundled mono font family
- `padding` (number): Diagram padding
- `scale` (number): Output scale
- `sketch` (boolean): Enable sketch rendering
- `talaMaxConcurrency` (number): Maximum concurrent TALA seed attempts
- `talaSeeds` (array): Deterministic signed 64-bit TALA seeds
- `themeId` (number): Light theme ID
- `themeOverrides` (object): Light theme token overrides (N1-N7, B1-B6, AA2/4/5, AB4/5)

### `d2_format` (~32 tokens)

Format valid D2 source without storing or rendering it.

Input parameters:

- `content` (string, required): D2 source to format

### `d2_get_source` (~37 tokens)

Return the complete canonical D2 source for a stored diagram, including Oracle edits.

Input parameters:

- `diagram_id` (string, required): Stored diagram ID

### `d2_help` (~93 tokens)

Look up an exact D2 v0.9.0 catalog topic by ID or search the embedded reference. Exact IDs return the full reference document; other queries return ranked topic summaries.

Input parameters:

- `limit` (number): Maximum search results when query is not an exact topic ID.
- `query` (string, required): Exact topic ID or search terms, such as 'layout-engines', 'sequence diagram', or 'TALA'.

### `d2_oracle_create` (~183 tokens)

Add new shapes or connections to an existing D2 diagram incrementally. Use this when you need to build diagrams piece-by-piece or add elements to a diagram after initial creation. Perfect for: iteratively building complex diagrams, adding elements based on parsed data, or modifying existing diagrams without regenerating everything. Creates basic elements only - use d2_oracle_set afterward to add special shapes (sql_table, class), styles, or properties. Example: Create 'User' shape, then set 'User.shape: person' with d2_oracle_set.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to modify
- `key` (string, required): Key for the new element. Examples: 'User' for shape, 'User -> API' for connection, 'System.Database' for nested shape. Use dots for nesting, arrows (->) for connections

### `d2_oracle_delete` (~159 tokens)

Remove shapes or connections from a D2 diagram. Use this when you need to: clean up unwanted elements, refactor diagram structure, or remove outdated components. Important: deleting a container shape will also delete ALL its child elements. Connections to/from deleted shapes are automatically removed. Use this carefully - consider using d2_oracle_move to relocate elements instead if you want to preserve them. Perfect for iterative diagram refinement and cleanup operations.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to modify
- `key` (string, required): Key of the element to delete. Examples: 'server' for a shape, 'server -> database' for a connection, 'System.Database' for nested element. WARNING: Deleting containers removes all children

### `d2_oracle_get_info` (~202 tokens)

Inspect and analyze diagram elements to understand structure and properties. Use this when you need to: verify element exists before modifying, check current properties/attributes, explore container contents, debug connection issues, or understand diagram hierarchy. Info types: 'object' returns shape details (labels, styles, attributes), 'edge' returns connection properties (labels, arrows, styles), 'children' lists all elements inside a container. Essential for safe modifications - always check before changing. Returns JSON with complete element information.

Input parameters:

- `diagram_id` (string, required): ID of the diagram
- `info_type` (string): Type of information to retrieve: 'object' for shape/container details, 'edge' for connection properties, 'children' to list elements inside a container
- `key` (string, required): Key of the element to inspect. Examples: 'server' for shape info, 'server -> database' for connection info, 'System' to see what's inside a container

### `d2_oracle_move` (~224 tokens)

Reorganize diagram structure by moving shapes between containers. Use this when you need to: group related components together, refactor diagram hierarchy, move elements into or out of systems/packages, or restructure without losing connections. Containers are shapes that hold other shapes (like 'System', 'Network', or any shape with children). Moving preserves all connections - they're automatically rerouted. Set include_descendants=false to move only the parent shape, leaving children in original location. Essential for maintaining clean, logical diagram organization.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to modify
- `include_descendants` (string): Whether to move child elements along with the parent (true/false). Default true preserves hierarchy
- `key` (string, required): Key of the element to move (e.g., 'server', 'Database.users_table')
- `new_parent` (string, required): Target container key where element will be moved. Use empty string '' to move to root level. Examples: 'System' to move into System container, 'Network.DMZ' for nested container

### `d2_oracle_rename` (~183 tokens)

Change the identifier of shapes or connections while preserving all relationships. Use this when you need to: improve clarity with better names, fix typos or naming inconsistencies, refactor diagram elements, or align with updated terminology. The rename is intelligent - ALL connections referencing the old name are automatically updated to use the new name. This includes connections where the element is source, target, or part of a longer path. Child elements keep their relative names. Safe operation that maintains diagram integrity.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to modify
- `key` (string, required): Current key of the element to rename (e.g., 'server', 'DB', 'System.OldName')
- `new_name` (string, required): New identifier for the element (e.g., 'web_server', 'Database', 'NewName'). Connections are automatically updated

### `d2_oracle_serialize` (~138 tokens)

Export the current state of an Oracle-edited diagram as D2 text. Use this when you need to: see the complete D2 syntax after incremental changes, save diagram source for version control, share diagram definition with others, debug complex diagrams, or transition from Oracle API to direct D2 text editing. Returns the exact D2 code that would produce the current diagram, including all shapes, connections, special elements (sql_table, class), styles, and content. This is THE way to get the textual representation after using Oracle API tools.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to get D2 text for

### `d2_oracle_set` (~384 tokens)

Modify properties of existing diagram elements. Use this when you need to: transform basic shapes into special types (sql_table, class, sequence_diagram), add visual styling (colors, fonts, borders), set labels and tooltips, or add content like markdown or code blocks. Common attributes: shape (rectangle, cylinder, person, cloud), style.fill (colors), style.stroke, label, tooltip, icon. For special shapes: 'User.shape: sql_table' then 'User.id: int |pk|' for columns, 'Animal.shape: class' then 'Animal.+name: string' for fields. For SQL table constraints: 'User.id.constraint' with value 'primary_key', 'foreign_key', or 'unique'. Note: For multiple constraints, use d2_create with array syntax like 'id: int {constraint: [primary_key; unique]}'. Essential for making diagrams visually rich and semantically meaningful.

Input parameters:

- `diagram_id` (string, required): ID of the diagram to modify
- `key` (string, required): Key path to the attribute. Examples: 'User.shape' for shape type, 'User.style.fill' for color, 'User.id' for sql_table columns, 'User.id.constraint' for SQL constraints, 'Animal.+name' for class fiel…
- `tag` (string): Optional tag for the attribute (e.g., 'label' or 'style')
- `value` (string, required): The value to set. Shape types: rectangle, cylinder, person, cloud, sql_table, class, code, sequence_diagram. Colors: red, blue, #FF5733. For sql_table columns: 'int |pk|', 'varchar(255)'. For SQL con…

### `d2_save` (~487 tokens)

Save an existing diagram within a configured workspace root using a bundled D2 renderer.

Input parameters:

- `animationIntervalMs` (number): Board interval and style-animation sampling duration
- `asciiCharset` (string): ASCII character set
- `boardPath` (string): Dot-separated board path, for example layers.detail
- `center` (boolean): Center diagram content
- `dagreEdgeSep` (number): Dagre edge separation
- `dagreNodeSep` (number): Dagre node separation
- `darkThemeId` (number): Dark theme ID
- `darkThemeOverrides` (object): Dark theme token overrides
- `diagramId` (string, required): ID of the diagram to save
- `elkAlgorithm` (string): ELK algorithm name
- `elkEdgeNodeSpacing` (number): ELK edge-to-node spacing
- `elkNodeSpacing` (number): ELK node spacing
- `elkPadding` (string): ELK padding expression
- `elkSelfLoopSpacing` (number): ELK self-loop spacing
- `fontFamily` (string): Bundled regular font family
- `format` (string): Export format
- `includeDescendants` (boolean): Compose descendant boards where the format supports it
- `layout` (string): Bundled layout engine
- `maxBoards` (number): Per-operation board limit
- `maxFrames` (number): Per-operation GIF frame limit
- `maxHeight` (number): Maximum raster height
- `maxOutputBytes` (number): Maximum encoded output bytes
- `maxPixels` (number): Maximum pixels per raster frame
- `maxWidth` (number): Maximum raster width
- `monoFontFamily` (string): Bundled mono font family
- `padding` (number): Diagram padding
- `path` (string): Output path relative to the selected workspace root
- `scale` (number): Output scale
- `sketch` (boolean): Enable sketch rendering
- `talaMaxConcurrency` (number): Maximum concurrent TALA seed attempts
- `talaSeeds` (array): Deterministic signed 64-bit TALA seeds
- `themeId` (number): Light theme ID
- `themeOverrides` (object): Light theme token overrides (N1-N7, B1-B6, AA2/4/5, AB4/5)
- `workspace_root` (string): Configured workspace root for the output

### `d2_update_source` (~56 tokens)

Validate complete D2 source and atomically replace a stored diagram. Invalid source returns diagnostics and leaves the diagram unchanged.

Input parameters:

- `content` (string, required): Complete replacement D2 source
- `diagram_id` (string, required): Stored diagram ID

### `d2_validate` (~112 tokens)

Validate D2 source and report structured syntax or semantic diagnostics. Provide exactly one of content or diagram_id. Invalid D2 returns valid=false instead of a tool error. For simple, unambiguous errors, the result may include repaired_content that has been revalidated without changing the stored diagram.

Input parameters:

- `content` (string): Raw D2 source to validate. Mutually exclusive with diagram_id.
- `diagram_id` (string): ID of a stored diagram whose current source should be validated. Mutually exclusive with content.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0#diagnostics

## Score history

- 2026-10-24: 52
- 2026-10-23: 52
- 2026-10-22: 51
- 2026-10-21: 51
- 2026-10-20: 50
- 2026-10-19: 50
- 2026-10-18: 49
- 2026-10-17: 49
- 2026-10-16: 48
- 2026-10-15: 48
- 2026-10-14: 48
- 2026-10-13: 47
- 2026-10-12: 47
- 2026-10-10: 46
- 2026-10-04: 40
- 2026-10-03: 40
- 2026-10-02: 40
- 2026-10-01: 40
- 2026-09-30: 40
- 2026-09-29: 40
- 2026-09-28: 40
- 2026-09-27: 40

## Common questions

### What is the D2 MCP Server server?

D2 MCP Server is listed in the public MCP registry as io.github.RecursiveFunctions/d2mcp. Create, edit, validate, render, and export D2 diagrams with confined workspace access. This page covers its container image (ghcr.io/recursivefunctions/d2mcp:0.5.0).

### Is the D2 MCP Server server safe to use?

D2 MCP Server scores 52 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the D2 MCP Server server expose?

D2 MCP Server exposes 16 tools: d2_capabilities, d2_create, d2_export, d2_format, d2_get_source, and 11 more. Their descriptions and schemas cost roughly 3,070 tokens of context every time the server is loaded.

### Is the D2 MCP Server server still maintained?

D2 MCP Server is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the D2 MCP Server server under?

D2 MCP Server declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- GitHub Container Registry: https://ghcr.io/recursivefunctions/d2mcp
- Repository: https://github.com/recursivefunctions/d2mcp
- Changelog RSS feed: https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0.xml
- Changelog JSON feed: https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0.json
- HTML version of this page: https://verifymcp.io/servers/recursivefunctions-d2mcp/ghcr-io-recursivefunctions-d2mcp-0-5-0
