@systemdox/mcp-server
Advanced tools
+21
-21
@@ -369,3 +369,3 @@ #!/usr/bin/env node | ||
| inputSchema: { | ||
| spec_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"), | ||
| draft_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"), | ||
| status: z2.enum(["draft", "ready", "archived"]).optional().describe("Filter by status"), | ||
@@ -375,6 +375,6 @@ search: z2.string().optional().describe("Keyword search across spec names") | ||
| }, | ||
| async ({ spec_id, status, search }) => { | ||
| if (spec_id) { | ||
| async ({ draft_id, status, search }) => { | ||
| if (draft_id) { | ||
| const spec = await apiClient.get( | ||
| `/v1/specs/${spec_id}` | ||
| `/v1/specs/${draft_id}` | ||
| ); | ||
@@ -428,3 +428,3 @@ const sections = [`# ${spec.name} | ||
| const text = filtered.map( | ||
| (s) => `- **${s.name}** (${s.specId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "") | ||
| (s) => `- **${s.name}** (${s.draftId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "") | ||
| ).join("\n"); | ||
@@ -1070,3 +1070,3 @@ return { | ||
| return `### ${s.name} | ||
| \`spec_id: ${s.specId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| \`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| } | ||
@@ -1103,5 +1103,5 @@ function formatDocHeadline(d) { | ||
| } | ||
| async function fetchSpecBody(api, specId) { | ||
| async function fetchSpecBody(api, draftId) { | ||
| const spec = await api.get( | ||
| `/v1/specs/${encodeURIComponent(specId)}` | ||
| `/v1/specs/${encodeURIComponent(draftId)}` | ||
| ); | ||
@@ -1222,12 +1222,12 @@ const parts = []; | ||
| ...specs.filter((s) => s.status !== "archived").map((s) => { | ||
| refs.set(key("spec", s.specId), { | ||
| refs.set(key("spec", s.draftId), { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
| listLine: `- **${s.name}** \u2014 \`spec_id: ${s.specId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(spec_id="${s.specId}")` | ||
| listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(draft_id="${s.draftId}")` | ||
| }); | ||
| return { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
@@ -1546,3 +1546,3 @@ content: formatSpecHeadline(s), | ||
| inputSchema: { | ||
| spec_id: z8.string().describe("ID of the spec to update"), | ||
| draft_id: z8.string().describe("ID of the spec to update"), | ||
| section: z8.enum(["proposal", "tasks", "requirements"]).describe("Which section to update"), | ||
@@ -1560,4 +1560,4 @@ content: z8.string().describe( | ||
| }, | ||
| async ({ spec_id, section, content, requirement_name }) => { | ||
| const spec = await apiClient.get(`/v1/specs/${spec_id}`); | ||
| async ({ draft_id, section, content, requirement_name }) => { | ||
| const spec = await apiClient.get(`/v1/specs/${draft_id}`); | ||
| if (spec.status !== "draft") { | ||
@@ -1587,4 +1587,4 @@ return { | ||
| } | ||
| await apiClient.put(`/v1/specs/${spec_id}`, body); | ||
| apiClient.invalidateCache(`/v1/specs/${spec_id}`); | ||
| await apiClient.put(`/v1/specs/${draft_id}`, body); | ||
| apiClient.invalidateCache(`/v1/specs/${draft_id}`); | ||
| apiClient.invalidateCache("/v1/specs"); | ||
@@ -1648,3 +1648,3 @@ return { | ||
| ${consequences}` + relatedSection; | ||
| await apiClient.put(`/v1/specs/${created.specId}`, { | ||
| await apiClient.put(`/v1/specs/${created.draftId}`, { | ||
| proposalContent: adrContent | ||
@@ -1657,3 +1657,3 @@ }); | ||
| type: "text", | ||
| text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.specId}) | ||
| text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.draftId}) | ||
@@ -1858,3 +1858,3 @@ Status: draft \u2014 review in SystemDox before publishing.` | ||
| // src/server.ts | ||
| var SERVER_VERSION = true ? "0.1.29" : "0.0.0-dev"; | ||
| var SERVER_VERSION = true ? "0.1.30" : "0.0.0-dev"; | ||
| function createServer(apiClient) { | ||
@@ -1861,0 +1861,0 @@ const server = new McpServer({ |
+21
-21
@@ -351,3 +351,3 @@ #!/usr/bin/env node | ||
| inputSchema: { | ||
| spec_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"), | ||
| draft_id: z2.string().optional().describe("Specific spec ID to retrieve with full content"), | ||
| status: z2.enum(["draft", "ready", "archived"]).optional().describe("Filter by status"), | ||
@@ -357,6 +357,6 @@ search: z2.string().optional().describe("Keyword search across spec names") | ||
| }, | ||
| async ({ spec_id, status, search }) => { | ||
| if (spec_id) { | ||
| async ({ draft_id, status, search }) => { | ||
| if (draft_id) { | ||
| const spec = await apiClient2.get( | ||
| `/v1/specs/${spec_id}` | ||
| `/v1/specs/${draft_id}` | ||
| ); | ||
@@ -410,3 +410,3 @@ const sections = [`# ${spec.name} | ||
| const text = filtered.map( | ||
| (s) => `- **${s.name}** (${s.specId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "") | ||
| (s) => `- **${s.name}** (${s.draftId}) \u2014 ${s.status}, ${s.requirementCount} requirements` + (s.repoFullName ? `, repo: ${s.repoFullName}` : "") | ||
| ).join("\n"); | ||
@@ -1052,3 +1052,3 @@ return { | ||
| return `### ${s.name} | ||
| \`spec_id: ${s.specId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| \`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| } | ||
@@ -1085,5 +1085,5 @@ function formatDocHeadline(d) { | ||
| } | ||
| async function fetchSpecBody(api, specId) { | ||
| async function fetchSpecBody(api, draftId) { | ||
| const spec = await api.get( | ||
| `/v1/specs/${encodeURIComponent(specId)}` | ||
| `/v1/specs/${encodeURIComponent(draftId)}` | ||
| ); | ||
@@ -1204,12 +1204,12 @@ const parts = []; | ||
| ...specs.filter((s) => s.status !== "archived").map((s) => { | ||
| refs.set(key("spec", s.specId), { | ||
| refs.set(key("spec", s.draftId), { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
| listLine: `- **${s.name}** \u2014 \`spec_id: ${s.specId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(spec_id="${s.specId}")` | ||
| listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(draft_id="${s.draftId}")` | ||
| }); | ||
| return { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
@@ -1528,3 +1528,3 @@ content: formatSpecHeadline(s), | ||
| inputSchema: { | ||
| spec_id: z8.string().describe("ID of the spec to update"), | ||
| draft_id: z8.string().describe("ID of the spec to update"), | ||
| section: z8.enum(["proposal", "tasks", "requirements"]).describe("Which section to update"), | ||
@@ -1542,4 +1542,4 @@ content: z8.string().describe( | ||
| }, | ||
| async ({ spec_id, section, content, requirement_name }) => { | ||
| const spec = await apiClient2.get(`/v1/specs/${spec_id}`); | ||
| async ({ draft_id, section, content, requirement_name }) => { | ||
| const spec = await apiClient2.get(`/v1/specs/${draft_id}`); | ||
| if (spec.status !== "draft") { | ||
@@ -1569,4 +1569,4 @@ return { | ||
| } | ||
| await apiClient2.put(`/v1/specs/${spec_id}`, body); | ||
| apiClient2.invalidateCache(`/v1/specs/${spec_id}`); | ||
| await apiClient2.put(`/v1/specs/${draft_id}`, body); | ||
| apiClient2.invalidateCache(`/v1/specs/${draft_id}`); | ||
| apiClient2.invalidateCache("/v1/specs"); | ||
@@ -1630,3 +1630,3 @@ return { | ||
| ${consequences}` + relatedSection; | ||
| await apiClient2.put(`/v1/specs/${created.specId}`, { | ||
| await apiClient2.put(`/v1/specs/${created.draftId}`, { | ||
| proposalContent: adrContent | ||
@@ -1639,3 +1639,3 @@ }); | ||
| type: "text", | ||
| text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.specId}) | ||
| text: `Architecture decision recorded: **${adrTitle}** (spec id: ${created.draftId}) | ||
@@ -1840,3 +1840,3 @@ Status: draft \u2014 review in SystemDox before publishing.` | ||
| // src/server.ts | ||
| var SERVER_VERSION = true ? "0.1.29" : "0.0.0-dev"; | ||
| var SERVER_VERSION = true ? "0.1.30" : "0.0.0-dev"; | ||
| function createServer(apiClient2) { | ||
@@ -1843,0 +1843,0 @@ const server2 = new McpServer({ |
@@ -20,3 +20,3 @@ export { estimateTokens } from "./scoring.js"; | ||
| export interface SpecSummary { | ||
| specId: string; | ||
| draftId: string; | ||
| name: string; | ||
@@ -23,0 +23,0 @@ status: string; |
@@ -282,3 +282,3 @@ #!/usr/bin/env node | ||
| return `### ${s.name} | ||
| \`spec_id: ${s.specId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| \`draft_id: ${s.draftId}\` \xB7 ${s.status} \xB7 ${s.requirementCount} requirements`; | ||
| } | ||
@@ -315,5 +315,5 @@ function formatDocHeadline(d) { | ||
| } | ||
| async function fetchSpecBody(api, specId) { | ||
| async function fetchSpecBody(api, draftId) { | ||
| const spec = await api.get( | ||
| `/v1/specs/${encodeURIComponent(specId)}` | ||
| `/v1/specs/${encodeURIComponent(draftId)}` | ||
| ); | ||
@@ -434,12 +434,12 @@ const parts = []; | ||
| ...specs.filter((s) => s.status !== "archived").map((s) => { | ||
| refs.set(key("spec", s.specId), { | ||
| refs.set(key("spec", s.draftId), { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
| listLine: `- **${s.name}** \u2014 \`spec_id: ${s.specId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(spec_id="${s.specId}")` | ||
| listLine: `- **${s.name}** \u2014 \`draft_id: ${s.draftId}\` (${s.status}, ${s.requirementCount} requirements)`, | ||
| fetchHint: `get_specs(draft_id="${s.draftId}")` | ||
| }); | ||
| return { | ||
| type: "spec", | ||
| id: s.specId, | ||
| id: s.draftId, | ||
| title: s.name, | ||
@@ -446,0 +446,0 @@ content: formatSpecHeadline(s), |
+1
-1
| { | ||
| "name": "@systemdox/mcp-server", | ||
| "version": "0.1.29", | ||
| "version": "0.1.30", | ||
| "mcpName": "io.github.puglieseweb/systemdox", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+1
-1
@@ -133,3 +133,3 @@ # @systemdox/mcp-server | ||
| docs (`/v1/specs/{id}`, `/v1/docs/{id}/content`) — concurrently, clipped to a | ||
| fair share of what's left. Every item carries the `spec_id` / `doc_id` needed to | ||
| fair share of what's left. Every item carries the `draft_id` / `doc_id` needed to | ||
| fetch it in full, so nothing is a dead end: items whose body did not fit, or | ||
@@ -136,0 +136,0 @@ whose fetch failed, still appear as a title + ID. Tech stack and project rules |
Sorry, the diff of this file is too big to display
247100
0.03%