@aspicio/mcp
Advanced tools
+34
-6
@@ -9,3 +9,3 @@ #!/usr/bin/env node | ||
| //#region package.json | ||
| var version = "0.9.0"; | ||
| var version = "0.10.0"; | ||
| //#endregion | ||
@@ -93,2 +93,26 @@ //#region src/tools.ts | ||
| const SOURCE_DESC = "An http(s) URL to a .dxf, a local file path, or inline DXF text."; | ||
| const DRAWING_SUMMARY_SHAPE = { | ||
| units: z.string().describe("Drawing-unit label (e.g. \"mm\"), \"\" when unitless"), | ||
| bounds: z.object({ | ||
| minX: z.number(), | ||
| minY: z.number(), | ||
| maxX: z.number(), | ||
| maxY: z.number() | ||
| }).nullable().describe("World-space extents, null for an empty drawing"), | ||
| size: z.object({ | ||
| width: z.number(), | ||
| height: z.number() | ||
| }).nullable().describe("Bounding-box size in drawing units, null when empty"), | ||
| entityCount: z.number().int(), | ||
| segmentCount: z.number().int(), | ||
| layers: z.array(z.object({ | ||
| name: z.string(), | ||
| entityCount: z.number().int(), | ||
| visible: z.boolean(), | ||
| color: z.string().describe("The color actually drawn (dominant), as #rrggbb") | ||
| })), | ||
| entityTypes: z.record(z.string(), z.number()).describe("Top-level entities per DXF type"), | ||
| unsupported: z.record(z.string(), z.number()).describe("Per-type counts of skipped entities"), | ||
| texts: z.array(z.string()).describe("Unique TEXT/MTEXT strings, blocks included") | ||
| }; | ||
| /** Build the Aspicio MCP server with the `describe_dxf` and `render_dxf` tools. */ | ||
@@ -114,9 +138,13 @@ function createServer() { | ||
| description: "Return a structured JSON summary of a DXF drawing — units, bounding box, layers (with the color actually drawn), per-type entity counts, and any skipped/unsupported types. Use this to answer structural questions (what layers exist, how many parts, what size, is it to scale) without rendering an image.", | ||
| inputSchema: { source: z.string().describe(SOURCE_DESC) } | ||
| inputSchema: { source: z.string().describe(SOURCE_DESC) }, | ||
| outputSchema: DRAWING_SUMMARY_SHAPE | ||
| }, async ({ source }) => { | ||
| const summary = describeDxf(await loadDxf(source)); | ||
| return { content: [{ | ||
| type: "text", | ||
| text: JSON.stringify(summary, null, 2) | ||
| }] }; | ||
| return { | ||
| content: [{ | ||
| type: "text", | ||
| text: JSON.stringify(summary, null, 2) | ||
| }], | ||
| structuredContent: summary | ||
| }; | ||
| }); | ||
@@ -123,0 +151,0 @@ server.registerTool("render_dxf", { |
+2
-2
| { | ||
| "name": "@aspicio/mcp", | ||
| "version": "0.9.0", | ||
| "version": "0.10.0", | ||
| "license": "MIT", | ||
@@ -20,3 +20,3 @@ "author": "Dmitri Kochelorov <dmitri@frontsail.ai>", | ||
| "dependencies": { | ||
| "@aspicio/core": "^0.9.0", | ||
| "@aspicio/core": "^0.10.0", | ||
| "@modelcontextprotocol/sdk": "^1.29.0", | ||
@@ -23,0 +23,0 @@ "@resvg/resvg-js": "^2.6.2", |
+3
-1
@@ -6,3 +6,5 @@ # @aspicio/mcp | ||
| [Aspicio](https://github.com/frontsail-ai/aspicio#readme) viewer's headless | ||
| pipeline. Local stdio server, no hosted dependency. | ||
| pipeline. Local stdio server, no hosted dependency. A hosted endpoint and | ||
| docs live at [aspicio.frontsail.app/mcp](https://aspicio.frontsail.app/mcp/); | ||
| the interactive viewer at [aspicio.frontsail.app](https://aspicio.frontsail.app/). | ||
@@ -9,0 +11,0 @@ ## Tools |
9836
14.23%175
19.05%52
4%+ Added
- Removed
Updated