Aspicio

io.github.frontsail-ai由 GitHub 帳號 frontsail-ai 發布v0.13.2更新於 Oct 30, 2026

DXF and PDF/X-4 for AI agents: structured facts, PNG renders, an interactive in-chat viewer.

已驗證Streamable HTTP可網頁執行檔案與儲存媒體與設計

概覽

AI 產生的概覽

讓助理讀取 DXF 與向量 PDF 圖面:回傳結構化 JSON 資訊(單位、邊界、圖層、實體數量、文字)以及 PNG 算繪圖。

可以做什麼
  • 描述 DXF 圖面:單位、邊界框、圖層及實際繪製顏色、各類實體數量、文字內容、被略過的類型
  • 將 DXF 圖面算繪成可供模型檢視的 PNG 影像
  • 描述 PDF 圖面:單位、邊界、圖層、實體數量、所含文字以及被略過的內容
  • 將 PDF 圖面的向量內容(線條與文字)算繪成 PNG
  • 依檔案位元組而非檔名辨識格式,描述或算繪任何支援格式的圖面
  • 將描述與算繪限定在指定空間,例如 PDF 的某一頁或 DXF 的某個版面
適用情境
當對話涉及 CAD 或技術圖面,助理需要回答結構性問題(圖層、尺寸、零件數量、標題欄文字)或直接檢視圖面時適用,無須 OCR 或視覺辨識來回。
執行需求
可使用 Streamable HTTP 的遠端託管端點,或透過 npx 從 npm 套件啟動本機 stdio 程序(需要 Node.js)。未宣告需要帳號、API 金鑰或環境變數。託管端點接受網址與內嵌 DXF,但不支援本機檔案;stdio 伺服器可讀取本機檔案。
安裝前請注意
stdio 伺服器在本機程序內讀取檔案,不會把 DXF 上傳給廠商,但工具結果(摘要與影像)會由 MCP 用戶端轉交給其模型供應商。託管端點會抓取你提供的網址,並具備內網阻擋與大小限制。功能為唯讀;不支援編輯與 3D,PDF 算繪不繪製影像、底紋與透明度。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Aspicio,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.frontsail-ai%2Faspicio/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "aspicio": {
      "type": "http",
      "url": "https://aspicio-api.frontsail.app/mcp"
    }
  }
}

README

[Aspicio logo]

Aspicio

Drawing understanding for people, applications, and AI agents — DXF and vector PDF.

Aspicio (Latin: "I look at")

[CI] [License: MIT]
[npm: @aspicio/core] [npm: @aspicio/elements] [npm: @aspicio/react] [npm: @aspicio/vue] [npm: @aspicio/svelte] [npm: @aspicio/mcp]
[Aspicio MCP on mcprush]

▶ Live demo

Aspicio is an open-source (MIT), TypeScript-first drawing engine: one framework-free parse → tessellate pipeline that runs in the browser, in Node, and in serverless runtimes. It reads DXF and the vector content of PDF — the kind of PDF that carries artwork and dielines rather than a scan. 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 / PDF bytes ─parse─▶ DrawingDocument ─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/

[Aspicio viewing a sample floor-plan DXF — layer panel, colored geometry, text, and a dimension]

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:

html
<script type="module">  import "@aspicio/elements";  import "@aspicio/elements/formats/dxf";</script>
<aspicio-embed src-url="/drawing.dxf" style="height: 480px"></aspicio-embed>

Formats are opted into by import: the package brings the components, the formats/* entry brings the parser. That is what keeps a DXF app from shipping every other format's code — and every flavor below does the same.

React

The same embed with idiomatic props and a ref exposing the full viewer, via @aspicio/react:

tsx
import { AspicioEmbed } from "@aspicio/react";import "@aspicio/react/formats/dxf";
<AspicioEmbed src={file} style={{ height: 480 }} />;

Vue

Typed props and emits with unwrapped payloads, via @aspicio/vue:

vue
<script setup>import { AspicioEmbed } from "@aspicio/vue";import "@aspicio/vue/formats/dxf";</script>
<template>  <AspicioEmbed src-url="/drawing.dxf" style="height: 480px" /></template>

Svelte

The same components as raw Svelte 5 source with typed callback props, via @aspicio/svelte:

svelte
<script>  import { AspicioEmbed } from "@aspicio/svelte";  import "@aspicio/svelte/formats/dxf";</script>
<AspicioEmbed 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:

ts
import { DrawingViewer } from "@aspicio/core";import { dxfParser } from "@aspicio/core/dxf";
const viewer = new DrawingViewer(document.querySelector("#preview")!, {  parsers: [dxfParser],});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):

ts
import {  describeDrawing,  parseWith,  tessellate,  tessellateSpace,  tessellationToSvg,} from "@aspicio/core";import { dxfParser } from "@aspicio/core/dxf";
const doc = await parseWith([dxfParser], bytes); // ASCII or binary DXFconst summary = describeDrawing(doc); // units, bounds, layers, texts, spaces…const svg = tessellationToSvg(tessellate(doc)); // model space (a PDF's page 1)
// Multi-page PDFs and multi-sheet DXFs: describe covers all of them, and// either verb can be scoped to one.const page3 = describeDrawing(doc, { space: "Page 3" });const sheet = tessellationToSvg(tessellateSpace(doc, "Layout1"));

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.

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.
[The in-chat viewer loading a 1.1 MB floor-plan DXF, toggling dimension and text layers, and expanding to fullscreen]
SurfaceLocal filesURLsInline DXF
stdio MCP — npx -y @aspicio/mcp✅✅✅
Hosted MCP — aspicio-api.frontsail.app/mcp—✅✅
HTTP API — /describe, /renderPOST body✅✅

Connect:

  • Claude Code — one step installs the MCP server plus the bundled skills (aspicio-inspect-dxf, aspicio-embed): /plugin marketplace add frontsail-ai/aspicio then /plugin install aspicio@aspicio
  • Codex — the same repo doubles as a Codex marketplace: codex plugin marketplace add https://github.com/frontsail-ai/aspicio, codex plugin add aspicio@aspicio, then codex mcp add aspicio -- npx -y @aspicio/mcp
  • Any client that launches stdio MCP servers — register npx -y @aspicio/mcp
  • Any 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

PackageDescription
@aspicio/coreThe viewer library: parsing, tessellation, rendering, camera, input
@aspicio/elementsWeb components: <aspicio-embed>, <aspicio-preview>, <aspicio-layer-panel> — plain HTML, Svelte, any framework
@aspicio/reactReact bindings: <AspicioEmbed>, <AspicioPreview>, <AspicioLayerPanel>
@aspicio/vueVue 3 bindings: the same three components with typed props and emits
@aspicio/svelteSvelte 5 bindings: the same three components as raw .svelte source
@aspicio/mcpMCP server for AI agents: describe_dxf + render_dxf
@aspicio/apiDXF HTTP API server (private): /describe, /render, /mcp
@aspicio/widgetMCP Apps in-chat viewer widget (private), served by the api server
@aspicio/demoStandalone 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.

mermaid
flowchart TD    REACTAPP["React app"]    HTMLAPP["Plain HTML / vanilla JS app"]    VUEAPP["Vue app"]    SVELTEAPP["Svelte app"]
    REACT["<b>@aspicio/react</b><br/>&lt;AspicioEmbed&gt; · &lt;AspicioPreview&gt; · &lt;AspicioLayerPanel&gt;<br/><i>thin @lit/react veneer, API-stable</i>"]    VUE["<b>@aspicio/vue</b><br/>&lt;AspicioEmbed&gt; · &lt;AspicioPreview&gt; · &lt;AspicioLayerPanel&gt;<br/><i>thin Vue 3 veneer, typed emits</i>"]    SVELTE["<b>@aspicio/svelte</b><br/>&lt;AspicioEmbed&gt; · &lt;AspicioPreview&gt; · &lt;AspicioLayerPanel&gt;<br/><i>raw Svelte 5 source, compiled by your bundler</i>"]    ELEMENTS["<b>@aspicio/elements</b><br/>&lt;aspicio-embed&gt; · &lt;aspicio-preview&gt; · &lt;aspicio-layer-panel&gt;<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 → DrawingViewer"| 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 DrawingViewer 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 app

Development

Toolchain: Vite+ (vp) on top of bun.

bash
vp install       # install dependenciesvp run dev       # start the demo appvp 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.

來源:README.md,提交 247008c

工具

6

describe_dxf

Describe a DXF drawing

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. For a PDF use describe_pdf; if you do not know the format, use describe_doc. Covers the whole drawing by default, including every page of a multi-page PDF; pass `space` (a name from the reply's `spaces`) to scope it to one page or sheet.

輸入參數spacesource必填

render_dxf

Render a DXF to an image

Render a DXF drawing to a PNG image you can look at. Use this to answer visual questions (what does it look like, where is a feature, does it look right) — it returns an image, not text. For structural facts, prefer describe_dxf. For a PDF use render_pdf; if you do not know the format, use render_doc. Renders the first page/sheet by default; pass `space` (a name from a describe reply's `spaces`) to render another one.

輸入參數spacewidthsource必填

describe_pdf

Describe a PDF drawing

Return a structured JSON summary of a PDF drawing — units (points), bounding box, layers, per-type entity counts, the text it contains, and what was skipped (images, shadings, transparency). Use this for structural questions about a PDF without rendering it. For a DXF use describe_dxf; if you do not know the format, use describe_doc. Covers the whole drawing by default, including every page of a multi-page PDF; pass `space` (a name from the reply's `spaces`) to scope it to one page or sheet.

輸入參數spacesource必填

render_pdf

Render a PDF to an image

Render a PDF drawing's vector content to a PNG you can look at. Images, shadings, and transparency are not drawn — they are reported by describe_pdf — so this shows line work and text, not a page facsimile. For a DXF use render_dxf; if you do not know the format, use render_doc. Renders the first page/sheet by default; pass `space` (a name from a describe reply's `spaces`) to render another one.

輸入參數spacewidthsource必填

describe_doc

Describe a drawing of any supported format

Return a structured JSON summary of a drawing in any supported format (DXF or PDF), detected from its bytes rather than its name. Use this when you do not know which format you have; the reply names the format that was read. Covers the whole drawing by default, including every page of a multi-page PDF; pass `space` (a name from the reply's `spaces`) to scope it to one page or sheet.

輸入參數spacesource必填

render_doc

Render a drawing of any supported format

Render a drawing in any supported format (DXF or PDF) to a PNG you can look at, detected from its bytes rather than its name. Use this when you do not know which format you have. Renders the first page/sheet by default; pass `space` (a name from a describe reply's `spaces`) to render another one.

輸入參數spacewidthsource必填

版本歷史

2
  1. v0.13.2最新Oct 23, 2026
  2. v0.13.0Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分