Skip to main content
Glama

Open a drawing in the interactive viewer

view_dxf
Read-only

Open an interactive viewer the user can pan, zoom, and toggle layers in (renders in-chat on MCP Apps-capable hosts). Reads DXF and vector PDF; for a PDF it shows line work and text rather than a page facsimile, so images, shadings, and transparency are absent by design. Use this when the user wants to see or explore the drawing themselves; for your own analysis use a describe_* tool (facts) or a render_* tool (image). The viewer shows only the drawing from this call. Delivery is handled by the widget itself: small drawings are embedded in the result and larger URL-sourced drawings are fetched by the widget through its own tool call — never re-fetch or inline the file for the viewer's sake, and don't blind-retry if the user reports an empty viewer (the viewer posts its actual status back to the conversation context).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "source": "<source>"
    },
    "name": "view_dxf"
  }
}

Input Schema

NameRequiredDescriptionDefault
sourceYesA publicly reachable http(s) URL, or inline DXF text. A PDF is binary, so it must be a URL — inline PDF bytes are refused. (This is a hosted server — local file paths are not available; use the npx @aspicio/mcp local server for files on disk.)
allow_file_openNoShow open-file controls in the viewer (default false: viewer is locked to this drawing)

Output Schema

NameRequiredDescriptionDefault
sizeYesBounding-box size in drawing units, null when empty
spaceYesWhich space this summary is scoped to, or null when it covers the whole drawing (bounds/size then describe spaces[0], the space render returns)
textsYesUnique TEXT/MTEXT strings, blocks included
unitsYesDrawing-unit label (e.g. "mm"), "" when unitless
boundsYesWorld-space extents, null for an empty drawing
formatYesWhich format was read ("dxf", "pdf")
layersYes
spacesYesEvery space in the drawing (a PDF's pages, a DXF's model space and layouts), model space first. These do not sum to entityCount: a DXF sheet's viewports re-show model geometry, so an entity can be drawn in two spaces while existing once
entityCountYes
entityTypesYesTop-level entities per DXF type
unsupportedYesPer-kind counts of what was skipped
segmentCountYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • removedOutput schema / properties / space / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / space / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed3 schema fields changed
    • addedOutput schema / properties / space
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Which space this summary is scoped to, or null when it covers the whole drawing (bounds/size then describe spaces[0], the space render returns)"
      +}
    • addedOutput schema / properties / spaces
      Added value: +{
      +  "description": "Every space in the drawing (a PDF's pages, a DXF's model space and layouts), model space first. These do not sum to entityCount: a DXF sheet's viewports re-show model geometry, so an entity can be drawn in two spaces while existing once",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "bounds": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "maxX": {
      +                "type": "number"
      +              },
      +              "maxY": {
      +                "type": "number"
      +              },
      +              "minX": {
      +                "type": "number"
      +              },
      +              "minY": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "minX",
      +              "minY",
      +              "maxX",
      +              "maxY"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "entityCount": {
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Pass as `space` to scope a describe or render to it",
      +        "type": "string"
      +      },
      +      "segmentCount": {
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "size": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "height": {
      +                "type": "number"
      +              },
      +              "width": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "width",
      +              "height"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "entityCount",
      +      "segmentCount",
      +      "bounds",
      +      "size"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "format",
      -  "units",
      -  "bounds",
      -  "size",
      -  "entityCount",
      -  "segmentCount",
      -  "layers",
      -  "entityTypes",
      -  "unsupported",
      -  "texts"
      -]New value: +[
      +  "format",
      +  "units",
      +  "bounds",
      +  "size",
      +  "space",
      +  "entityCount",
      +  "segmentCount",
      +  "spaces",
      +  "layers",
      +  "entityTypes",
      +  "unsupported",
      +  "texts"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / source / description
      Previous value: -"A publicly reachable http(s) URL to a .dxf file, or the DXF content inline as text. (This is a hosted server — local file paths are not available; use the npx @aspicio/mcp local server for files on disk.)"New value: +"A publicly reachable http(s) URL, or inline DXF text. A PDF is binary, so it must be a URL — inline PDF bytes are refused. (This is a hosted server — local file paths are not available; use the npx @aspicio/mcp local server for files on disk.)"
  4. Changed3 schema fields changed
    • addedOutput schema / properties / format
      Added value: +{
      +  "description": "Which format was read (\"dxf\", \"pdf\")",
      +  "type": "string"
      +}
    • changedOutput schema / properties / unsupported / description
      Previous value: -"Per-type counts of skipped entities"New value: +"Per-kind counts of what was skipped"
    • changedOutput schema / required
      Previous value: -[
      -  "units",
      -  "bounds",
      -  "size",
      -  "entityCount",
      -  "segmentCount",
      -  "layers",
      -  "entityTypes",
      -  "unsupported",
      -  "texts"
      -]New value: +[
      +  "format",
      +  "units",
      +  "bounds",
      +  "size",
      +  "entityCount",
      +  "segmentCount",
      +  "layers",
      +  "entityTypes",
      +  "unsupported",
      +  "texts"
      +]
  5. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "bounds": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "maxX": {
      +              "type": "number"
      +            },
      +            "maxY": {
      +              "type": "number"
      +            },
      +            "minX": {
      +              "type": "number"
      +            },
      +            "minY": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "minX",
      +            "minY",
      +            "maxX",
      +            "maxY"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "World-space extents, null for an empty drawing"
      +    },
      +    "entityCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "entityTypes": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Top-level entities per DXF type",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "layers": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "color": {
      +            "description": "The color actually drawn (dominant), as #rrggbb",
      +            "type": "string"
      +          },
      +          "entityCount": {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "visible": {
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "entityCount",
      +          "visible",
      +          "color"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "segmentCount": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "size": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "height": {
      +              "type": "number"
      +            },
      +            "width": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "width",
      +            "height"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Bounding-box size in drawing units, null when empty"
      +    },
      +    "texts": {
      +      "description": "Unique TEXT/MTEXT strings, blocks included",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "units": {
      +      "description": "Drawing-unit label (e.g. \"mm\"), \"\" when unitless",
      +      "type": "string"
      +    },
      +    "unsupported": {
      +      "additionalProperties": {
      +        "type": "number"
      +      },
      +      "description": "Per-type counts of skipped entities",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "units",
      +    "bounds",
      +    "size",
      +    "entityCount",
      +    "segmentCount",
      +    "layers",
      +    "entityTypes",
      +    "unsupported",
      +    "texts"
      +  ],
      +  "type": "object"
      +}
  6. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld/non-destructive; the description adds substantial behavior beyond that: PDF input renders line work and text rather than a page facsimile (images, shadings, transparency absent by design), the viewer shows only the current call's drawing, delivery is widget-handled, and it warns against re-fetching or blind-retrying on an empty viewer. This is exactly the kind of operational context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the disambiguation rule, and every clause carries information (PDF fidelity limits, delivery model, retry warning). The final delivery sentence is long and compound but its density is warranted; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given two parameters, an output schema, and benign annotations, the description covers everything an agent needs: input constraints, host capability requirement, rendering fidelity caveats, and failure semantics. Nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are documented in-schema (source URL/inline rules, allow_file_open default), so the schema already carries parameter meaning. The description reinforces the URL-vs-inline constraint for PDFs but adds no new per-parameter semantics, which lands at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Open an interactive viewer') plus the resource and what the user can do inside it (pan, zoom, toggle layers). It also names the sibling families it is not — describe_* and render_* — so an agent can separate it from all seven siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rule: 'Use this when the user wants to see or explore the drawing themselves; for your own analysis use a describe_* tool (facts) or a render_* tool (image).' That is a when-to-use plus two named alternatives with their distinguishing conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.