@miragon/design-iq-mcp 5.4.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # @miragon/design-iq-mcp
2
2
 
3
- designIQ's read-only MCP server: it exposes the models of a designIQ content repo — processes
4
- (BPMN), decisions (DMN), Wardley Maps, Team Topologies, Event Storming boards, Context Maps,
5
- Value Chains, Markdown and Mermaid diagrams — to any MCP client (Claude Code, Claude Desktop, IDEs, ...). A
3
+ designIQ's read-only MCP server: it exposes the models of a designIQ content repo to any MCP
4
+ client (Claude Code, Claude Desktop, IDEs, ...): processes (BPMN), decisions (DMN), Wardley
5
+ Maps, Team Topologies, Event Storming boards, Context Maps, Value Chains and Markdown
6
+ documents, their diagrams as `mermaid` fences. A
6
7
  content repo is a root `designiq.yml` naming its models folder (`models:`, legacy alias
7
8
  `processes:`; the legacy file name `bpmiq.yml` is still read); a model IS a file with a
8
9
  registered notation extension there (a process its `.bpmn`). Views are **derived from the
package/dist/http.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as createMcpServer, r as todosConfigFromEnv, t as DEFAULT_ROOT } from "./tools-Dtk-I0bV.js";
2
+ import { n as createMcpServer, r as todosConfigFromEnv, t as DEFAULT_ROOT } from "./tools-BdyXTS1w.js";
3
3
  import { createServer } from "node:http";
4
4
  import { timingSafeEqual } from "node:crypto";
5
5
  import { NodeStreamableHTTPServerTransport } from "@modelcontextprotocol/node";
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { n as createMcpServer, r as todosConfigFromEnv, t as DEFAULT_ROOT } from "./tools-Dtk-I0bV.js";
2
+ import { n as createMcpServer, r as todosConfigFromEnv, t as DEFAULT_ROOT } from "./tools-BdyXTS1w.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
@@ -178,18 +178,6 @@ const NOTATIONS = [
178
178
  mediaKind: "markdown",
179
179
  docShape: "text",
180
180
  monacoLanguage: "markdown"
181
- },
182
- {
183
- id: "mermaid",
184
- label: "Mermaid",
185
- noun: {
186
- singular: "diagram",
187
- plural: "diagrams"
188
- },
189
- extensions: [".mmd", ".mermaid"],
190
- mediaKind: "dsl",
191
- docShape: "text",
192
- monacoLanguage: "plaintext"
193
181
  }
194
182
  ];
195
183
  function byId(id) {
@@ -552,20 +540,23 @@ function extractWardley(raw) {
552
540
  }
553
541
  function extractTeamTopology(raw) {
554
542
  const data = JSON.parse(raw);
543
+ const list = (v) => Array.isArray(v) ? v : [];
544
+ const teams = list(data.nodes).map((n) => ({
545
+ id: n.id,
546
+ type: n.type ?? "team",
547
+ name: n.label ?? n.name,
548
+ extra: n.description ? { description: n.description } : void 0
549
+ }));
550
+ const interactions = list(data.interactions).filter((i) => i !== null && typeof i === "object" && "position" in i && "size" in i).map((i) => ({
551
+ id: i.id,
552
+ type: "interaction",
553
+ name: i.label,
554
+ extra: { mode: i.mode }
555
+ }));
555
556
  return {
556
557
  notation: "team-topology",
557
- nodes: (data.nodes ?? []).map((n) => ({
558
- id: n.id,
559
- type: n.type ?? "team",
560
- name: n.label ?? n.name,
561
- extra: n.description ? { description: n.description } : void 0
562
- })),
563
- edges: (data.edges ?? []).map((e, i) => ({
564
- id: e.id ?? `edge-${i}`,
565
- from: e.source ?? e.from,
566
- to: e.target ?? e.to,
567
- kind: e.interaction ?? e.type ?? "interaction"
568
- }))
558
+ nodes: [...teams, ...interactions],
559
+ edges: []
569
560
  };
570
561
  }
571
562
  const STORM_ID_PREFIX = {
@@ -816,7 +807,7 @@ function extractValueChain(raw) {
816
807
  nodes: (data.elements ?? []).map((el) => ({
817
808
  id: el.id,
818
809
  type: el.elementType ?? "element",
819
- name: el.label ?? el.name
810
+ name: el.name
820
811
  })),
821
812
  edges: (data.connections ?? []).map((c, i) => ({
822
813
  id: c.id ?? `conn-${i}`,
@@ -1122,6 +1113,15 @@ const READ = {
1122
1113
  readOnlyHint: true,
1123
1114
  openWorldHint: false
1124
1115
  };
1116
+ /**
1117
+ * Where a diagram goes: ONE text in both servers' instructions (the Live
1118
+ * Host's and the read-only server's), so the two never steer an assistant two
1119
+ * ways. A Mermaid diagram is a fence in a Markdown document; a process, a
1120
+ * decision or a model of any other notation is a model of its own (the
1121
+ * instructions list the notations just before this). It names no tool, so it
1122
+ * holds in every mode the instructions' drift tests run.
1123
+ */
1124
+ const DIAGRAMS_IN_DOCUMENTS = "A Mermaid diagram (a diagram as code) goes into a Markdown document as a ```mermaid fence, next to the prose that explains it, never into a file of its own. A process, a decision, a Wardley Map or a model in any other notation above is a model of its own: link it from the document when the repository holds it (a relative link such as [Order to cash](order-to-cash.bpmn)), create it as a model when it does not, and never redraw it in Mermaid.";
1125
1125
  //#endregion
1126
1126
  //#region ../notations/derive.ts
1127
1127
  /**
@@ -1359,9 +1359,10 @@ const DERIVERS = {
1359
1359
  };
1360
1360
  },
1361
1361
  "team-topology": (graph) => {
1362
+ const interactions = graph.nodes.filter((n) => n.type === "interaction").length;
1362
1363
  const stats = {
1363
- teams: graph.nodes.length,
1364
- interactions: graph.edges.length
1364
+ teams: graph.nodes.length - interactions,
1365
+ interactions
1365
1366
  };
1366
1367
  return {
1367
1368
  notation: "team-topology",
@@ -1603,6 +1604,7 @@ function readOnlyInstructions(on) {
1603
1604
  return [
1604
1605
  "designIQ is a Git-native workspace where teams model their business and their architecture together, live; this server reads one checkout of such a repository and never writes.",
1605
1606
  `The repository keeps its models as files under the folder its designiq.yml names, one model per file with the file stem as its id, in these notations: ${NOTATION_FILES}.`,
1607
+ DIAGRAMS_IN_DOCUMENTS,
1606
1608
  "Start with `list_models` to see which models it holds.",
1607
1609
  "These tools are notation-neutral: `get_view` (the derived structure), `get_model` (the raw graph of nodes and edges), `enumerate_paths` and `find_cycles` (flow analysis where the notation has flow semantics) and `which_models_use` (which models reference a given one).",
1608
1610
  "BPMN has deeper tooling: `list_processes`, `get_process` (the derived process view: roles, steps, flow, sub-process calls), `who_owns` (ownership from lanes) and `which_processes_use`" + (on.todos ? "; `list_todos` lists the open todos anchored to processes." : "."),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miragon/design-iq-mcp",
3
- "version": "5.4.0",
3
+ "version": "5.6.0",
4
4
  "description": "Read-only MCP server exposing a designIQ content repo's models — BPMN processes, DMN decisions, Wardley Maps, Team Topologies, Event Storming boards, Context Maps and more — to any MCP client. Discovered from designiq.yml, views derived from the models.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -49,10 +49,10 @@
49
49
  "devDependencies": {
50
50
  "@modelcontextprotocol/client": "2.3.1",
51
51
  "tsdown": "0.23.1",
52
- "@designiq/github-app": "0.1.0",
53
52
  "@designiq/contracts": "0.1.0",
54
53
  "@designiq/http-kit": "0.1.0",
55
54
  "@designiq/mcp-kit": "0.1.0",
55
+ "@designiq/github-app": "0.1.0",
56
56
  "@designiq/notations": "0.1.0"
57
57
  },
58
58
  "scripts": {