Skip to main content
Glama

Describe a PDF drawing

describe_pdf
Read-only

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. When the user wants to see or explore the drawing themselves, prefer view_dxf (interactive viewer) — if your platform gates it behind user approval, offer it and ask rather than substituting a static render.

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": "describe_pdf"
  }
}

Input Schema

NameRequiredDescriptionDefault
spaceNoWhich space to work on: "Model" (a PDF's page 1, a DXF's model space) or a page/layout name as listed in a describe reply's "spaces". Describe omits it for the whole drawing; render defaults to the first space.
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.)

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. Changed4 schema fields changed
    • addedInput schema / properties / space
      Added value: +{
      +  "description": "Which space to work on: \"Model\" (a PDF's page 1, a DXF's model space) or a page/layout name as listed in a describe reply's \"spaces\". Describe omits it for the whole drawing; render defaults to the first space.",
      +  "type": "string"
      +}
    • 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. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/non-destructive, and the description goes beyond them by stating no rendering occurs, that images, shadings, and transparency are skipped, and that the whole drawing (all pages) is covered by default. Those are the precise behavioral facts an agent needs to interpret incomplete results.

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 the return contract and scope default, which is the right ordering. Five sentences with a slightly digressive closing note about platform approval and the viewer, though that note does carry real decision value.

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?

With an output schema present, the description only needs to set scope and routing, and it does both, including multi-page default behavior and the `spaces`-driven narrowing. Nothing needed to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema already explains both parameters well, so the baseline is 3; the description adds the operational detail that `space` values come from the reply's `spaces` and that omitting it yields the whole drawing rather than a default page. It stops short of adding anything about `source` beyond what the schema says.

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?

Names a specific verb and resource ('Return a structured JSON summary of a PDF drawing') and enumerates exactly what the summary contains: units, bounding box, layers, entity counts, text, and skipped content. It explicitly separates itself from describe_dxf, describe_doc, and view_dxf, so an agent can pick the right tool 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?

It gives explicit routing rules: describe_dxf for DXF, describe_doc when the format is unknown, and view_dxf when the user wants to explore interactively. The final sentence even handles the approval-gating edge case and tells the agent to offer the viewer rather than silently substituting a static render.

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.