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 密钥或环境变量。托管端点接受 URL 和内联 DXF,但不支持本地文件;stdio 服务器可读取本地文件。
安装前请注意
stdio 服务器在本地进程内读取文件,不会把 DXF 上传给厂商,但工具结果(摘要与图像)会由 MCP 客户端转交给其模型提供商。托管端点会抓取你提供的 URL,并带有内网阻断与大小限制。功能为只读;不支持编辑与 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 分