aspicio-dxf-viewer
Aspicio is an open-source (MIT), TypeScript-first DXF engine: one
framework-free parse → tessellate pipeline that runs in the browser, in
Node, and in serverless runtimes. A person gets an interactive WebGL viewer
of a CAD drawing; an AI agent gets structured JSON facts and a rendered
PNG of the same file. Every surface — the browser viewer, the web
components and their React, Vue, and Svelte bindings, the headless
renderer, the HTTP API, and the MCP server — is a thin adapter over the same engine,
so a drawing is equally readable everywhere.
DXF bytes ──parse──▶ DxfDocument ──tessellate──▶ Tessellation ──┬─▶ WebGL renderer (viewer)
(normalized model) (batched geometry) ├─▶ SVG string (export / API / MCP)
└─▶ DrawingSummary (describe)How it's built: docs/architecture.md · behavior specs: docs/product-specs/
Embed it
One embed, every flavor — and every path below renders the same web components, so the result is pixel-identical no matter which you pick.
Web components — plain HTML, any framework
One tag gives you the layer panel plus an interactive preview; no bindings needed:
<script type="module">
import "@aspicio/elements";
</script>
<aspicio-embed src-url="/drawing.dxf" style="height: 480px"></aspicio-embed>React
The same embed with idiomatic props and a ref exposing the full
viewer, via @aspicio/react:
import { DxfEmbed } from "@aspicio/react";
<DxfEmbed src={file} style={{ height: 480 }} />;Vue
Typed props and emits with unwrapped payloads, via
@aspicio/vue:
<script setup>
import { DxfEmbed } from "@aspicio/vue";
</script>
<template>
<DxfEmbed src-url="/drawing.dxf" style="height: 480px" />
</template>Svelte
The same components as raw Svelte 5 source with typed callback props,
via @aspicio/svelte:
<script>
import { DxfEmbed } from "@aspicio/svelte";
</script>
<DxfEmbed srcUrl="/drawing.dxf" style="height: 480px" />Vanilla TypeScript
Skip the ready-made UI and drive the viewer directly from
@aspicio/core — bring your own chrome:
import { DxfViewer } from "@aspicio/core";
const viewer = new DxfViewer(document.querySelector("#preview")!);
await viewer.load(file); // File | Blob | ArrayBuffer | DXF text (ASCII or binary)Headless — Node and serverless
Parse, describe, and render with no browser at all (server-side previews, thumbnails, pipelines):
import { parseDxfBytes, tessellate, describeDrawing, tessellationToSvg } from "@aspicio/core";
const doc = parseDxfBytes(bytes); // ASCII or binary DXF
const drawing = tessellate(doc);
const summary = describeDrawing(doc, drawing); // units, bounds, layers, texts…
const svg = tessellationToSvg(drawing);What you get: WebGL rendering batched to one draw call per layer (large drawings stay interactive), broad entity coverage (lines, arcs, circles, ellipses, polylines with bulges, splines, TEXT/MTEXT, DIMENSION, SOLID/HATCH fills, nested INSERT blocks — anything unsupported is counted and reported, never fatal), a layer list with the colors that are actually drawn (per-entity overrides included, not just the layer table), measure with object snap, entity picking, paper-space layouts, SVG/PNG export, and first-class touch. Out of scope: editing and 3D.
Related MCP server: Greenloom CAD MCP Server
Hand it to an agent
The same engine speaks MCP and HTTP, so an agent can read a drawing instead of guessing at it:
describe_dxf— units, bounds, size, layers with effective colors, entity counts, and the drawing's text content. An agent reads a title block or a dimension value directly — no OCR, no vision round-trip.render_dxf— a PNG of the drawing the model can look at.view_dxf(hosted server) — an interactive in-chat viewer for the person in the conversation, via the open MCP Apps extension: pan, zoom, layer toggles, fullscreen, host light/dark theming. The widget is locked to the drawing the tool call delivered and makes no network requests; hosts without MCP Apps still get the structured facts.
Surface | Local files | URLs | Inline DXF |
stdio MCP — | ✅ | ✅ | ✅ |
Hosted MCP — | — | ✅ | ✅ |
HTTP API — | POST body | ✅ | ✅ |
Connect:
Claude Code — one step installs the MCP server plus the bundled skills (
aspicio-inspect-dxf,aspicio-embed):/plugin marketplace add frontsail-ai/aspiciothen/plugin install aspicio@aspicioCodex — the same repo doubles as a Codex marketplace:
codex plugin marketplace add https://github.com/frontsail-ai/aspicio,codex plugin add aspicio@aspicio, thencodex mcp add aspicio -- npx -y @aspicio/mcpAny client that launches stdio MCP servers — register
npx -y @aspicio/mcpAny client that supports remote MCP (Streamable HTTP) — point it at
https://aspicio-api.frontsail.app/mcp(no install; speaks MCP, not a browser page)Plain HTTP —
GET /describe?src=<dxf-url>,GET /render?src=<dxf-url>&format=png|svg; the API self-describes at/openapi.json
URL fetches are guarded (private-network blocking, size caps, redirect validation, timeouts). The stdio server reads local files in-process and never uploads the DXF to any Aspicio service — though, as with any tool result, your MCP client passes the returned summary or image to its model provider. Full details: privacy policy · terms.
Available today · direction
Everything above is shipped and live: viewer + demo, core, web components, React, Vue, and Svelte packages, headless describe/render, stdio and hosted MCP, the in-chat MCP Apps viewer, the HTTP API with OpenAPI, and plugin packaging for Claude Code and Codex.
Direction (intent, not commitments — see issues): MCP registry listings, structured entity queries and focused rendering, and an upload flow so remote surfaces can handle local files.
Packages
Package | Description |
The viewer library: parsing, tessellation, rendering, camera, input | |
Web components: | |
React bindings: | |
Vue 3 bindings: the same three components with typed props and emits | |
Svelte 5 bindings: the same three components as raw .svelte source | |
MCP server for AI agents: | |
DXF HTTP API server (private): | |
MCP Apps in-chat viewer widget (private), served by the api server | |
Standalone demo app (private) — also the reference integration |
How the viewer packages fit together: every framework path funnels into the same Lit web components — one implementation of the embed UI — which sit on the framework-free core. React, Vue, and Svelte get thin veneers with idiomatic props; plain HTML consumes the elements directly.
flowchart TD
REACTAPP["React app"]
HTMLAPP["Plain HTML / vanilla JS app"]
VUEAPP["Vue app"]
SVELTEAPP["Svelte app"]
REACT["<b>@aspicio/react</b><br/><DxfEmbed> · <DxfPreview> · <DxfLayerPanel><br/><i>thin @lit/react veneer, API-stable</i>"]
VUE["<b>@aspicio/vue</b><br/><DxfEmbed> · <DxfPreview> · <DxfLayerPanel><br/><i>thin Vue 3 veneer, typed emits</i>"]
SVELTE["<b>@aspicio/svelte</b><br/><DxfEmbed> · <DxfPreview> · <DxfLayerPanel><br/><i>raw Svelte 5 source, compiled by your bundler</i>"]
ELEMENTS["<b>@aspicio/elements</b><br/><aspicio-embed> · <aspicio-preview> · <aspicio-layer-panel><br/><i>Lit web components — the one embed-UI implementation</i>"]
CORE["<b>@aspicio/core</b><br/>parse → tessellate → render<br/><i>camera · input · picking · SVG/PNG export · headless describe</i>"]
REACTAPP -->|"idiomatic props, ref → DxfViewer"| REACT
REACT -->|"wraps"| ELEMENTS
HTMLAPP -->|"attributes + DOM events"| ELEMENTS
VUEAPP -->|"idiomatic props + emits"| VUE
VUE -->|"wraps"| ELEMENTS
SVELTEAPP -->|"typed callback props"| SVELTE
SVELTE -->|"wraps"| ELEMENTS
ELEMENTS -->|"drives"| CORE
HTMLAPP -.->|"or hand-rolled UI on the DxfViewer API"| CORE
classDef pkg fill:#191c22,stroke:#4c8dff,color:#e7e3da
classDef app fill:#1f232b,stroke:#3a3f4a,color:#9aa0ab
class REACT,VUE,SVELTE,ELEMENTS,CORE pkg
class REACTAPP,HTMLAPP,VUEAPP,SVELTEAPP appDevelopment
Toolchain: Vite+ (vp) on top of bun.
vp install # install dependencies
vp run dev # start the demo app
vp run ready # check + test + build everything (the repo gate)Testing, CI/deploy, releasing, and contribution guidance: CONTRIBUTING.md.
Aspicio is developed and maintained by FrontSail AI.
This server cannot be installed
Maintenance
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/frontsail-ai/aspicio'
If you have feedback or need assistance with the MCP directory API, please join our Discord server