Markdown Inspector
markdown.inspect
Overview
You select structural sections and receive deterministic headings, canonical IDs, links, images, code, tables, tasks, footnotes, math, frontmatter, callouts, statistics, and parser dependencies. The skill parses once, reports exact total and returned counts, and never fetches or renders remote content. Accepts file input via file_ref — no need to extract file content first.
Agents need bounded machine-readable structure without parsing HTML or combining several unrelated focused skills.
Reliability
STRICT at a fixed profile version. MARKDOWN_PROFILE_UNSUPPORTED means the profile name is unknown and requires choosing commonmark, gfm, or squillify-safe; MARKDOWN_INVALID_ENCODING means a file is not strict UTF-8 and requires re-encoding before retrying; MARKDOWN_COMPLEXITY_LIMIT means the fixed node, depth, or math-expression cap was exceeded and requires splitting or simplifying the document. Collection sections always report exact total and returned counts.
Context footprint
Input uses the shared Markdown file, node, and depth caps. Collection sections default to 1000 retained items and cap at 5000; together they also share a 1500000-byte pessimistic JSON budget. Metadata titles cap at 8192 UTF-8 bytes. A successful call costs 1 execution credit.
When to use it
When you need a deterministic whole-document inventory or statistics.
When one focused extraction or rendered output is sufficient.
Powered by commonmark-java and Squillify's shared Markdown semantics.
Scope
Non-goals
- Does not render or rewrite Markdown
- Does not test remote availability
- Does not semantically validate TeX
- Does not replace focused extraction skills
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
File limits
Constraints this skill applies to your input and generated files. The “Limited by” column shows the static source of each cap; none of these can be raised by upgrading your plan.
| Limit | Value | Limited by |
|---|---|---|
| Maximum size per input file | 2 MiB | Skill maximum |
How we handle your data
What this means
This skill may receive sensitive content and may return submitted, transformed, extracted, or reformatted content.
Squillify guarantees
- Runs inside Squillify using a self-contained open-source component
- This skill runs inside Squillify.
- Payloads are not sent to an external service by this skill.
- Self contained open source component
- Squillify does not permanently store submitted payloads.
- Telemetry records metadata only, not submitted content.
- Submitted payloads are not used for training.
- Submitted payloads are not reviewed by humans.
- This skill does not target sensitive data.
- Output may reveal sensitive derived information
Your responsibility
Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| markdown | string | No | Inline Markdown up to 1048576 characters. Omit only when file_ref is present. If both are present, file_ref wins and _meta._input_conflict_resolved reports it. |
| file_ref | string | No | Tenant-scoped strict-UTF-8 Markdown file up to 2097152 bytes. When omitted, the inline markdown field is used. |
| profile | string | No | commonmark, gfm, or squillify-safe; defaults to squillify-safe. |
| include | array | No | Unique closed selectors in any order: [metadata, headings, links, images, code, tables, tasks, footnotes, math, diagrams, frontmatter, callouts, statistics, dependencies]. The response always uses canonical section order. When omitted, defaults to metadata, headings, links, images, and statistics. |
| limits | object | No | Optional timeoutMs and maxItemsPerSection (1..5000). Defaults are timeoutMs=5000 and maxItemsPerSection=1000. Unknown properties are rejected. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| metadata | object | No | Optional bounded title, titleTruncated flag, profile and first-seen feature list; omit it when metadata was not requested. |
| headings | object | No | When requested: closed {total, returned, items} where each item is {level, text, id, range}. |
| links | object | No | When requested: closed {total, returned, items} where each item is {text, destination, title, range}. |
| images | object | No | When requested: closed {total, returned, items} where each item is {alt, destination, title, range}. |
| code | object | No | When requested: closed {total, returned, items} where each item is {kind, language, text, range}. |
| tables | object | No | When requested: closed {total, returned, items} where each item is {columns, rows, range}. |
| tasks | object | No | When requested: closed {total, returned, items} where each item is {checked, text, range}. |
| footnotes | object | No | When requested: closed {total, returned, items} where each item is {kind, label, text, range}. |
| math | object | No | When requested: closed {total, returned, items} where each item is {kind, tex, range}. |
| diagrams | object | No | When requested: closed {total, returned, items} where each item is {language, source, range}. |
| frontmatter | object | No | When requested: closed {total, returned, items} where each item is {key, values, range}. |
| callouts | object | No | When requested: closed {total, returned, items} where each item is {kind, title, text, range}. |
| statistics | object | No | When requested: closed whole-document counts for codePoints, utf8Bytes, lines, words, nodes and maxDepth covering the complete normalized document. |
| dependencies | object | No | When requested: closed {total, returned, items} where each item is {name, version} in parser-then-extension order. |
| _meta | object | Yes | Closed parser identity, normalized input facts and exact truncation sections for this inspection. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"markdown.inspect","input":{"markdown":"# Plan\n\n- [ ] Ship","include":["headings","tasks","statistics"]}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("markdown.inspect", {"markdown":"# Plan\n\n- [ ] Ship","include":["headings","tasks","statistics"]});Errors
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| MARKDOWN_PROFILE_UNSUPPORTED | 400 | No | The request payload failed this skill's input validation. |
| MARKDOWN_INVALID_ENCODING | 400 | No | The request payload failed this skill's input validation. |
| MARKDOWN_COMPLEXITY_LIMIT | 429 | No | A size, quota, rate, or time limit was exceeded. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Does not render or rewrite Markdown
- Does not test remote availability
- Does not semantically validate TeX
- Does not replace focused extraction skills
- Remote link checking
- HTML rendering
- Content repair
- Open-ended summarization
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "markdown.inspect",
"input": {
"markdown": "# Plan\n\n- [ ] Ship",
"include": [
"headings",
"tasks",
"statistics"
]
}
}Examples
Inspect a heading and task
{
"markdown": "# Plan\n\n- [ ] Ship",
"include": [
"headings",
"tasks",
"statistics"
]
}{
"_meta": {
"profileVersion": "1",
"inputChars": 18,
"parserVersion": "0.24.0",
"truncated": false,
"truncatedSections": [],
"nodeCount": 7,
"bomStripped": false,
"lineEndingsNormalized": false,
"profile": "squillify-safe",
"inputBytes": 18,
"parser": "commonmark"
},
"tasks": {
"items": [
{
"checked": false,
"text": "Ship",
"range": {
"start": {
"line": 3,
"offset": 8,
"column": 1
},
"end": {
"line": 3,
"offset": 18,
"column": 11
}
}
}
],
"returned": 1,
"total": 1
},
"headings": {
"items": [
{
"level": 1,
"text": "Plan",
"range": {
"start": {
"line": 1,
"offset": 0,
"column": 1
},
"end": {
"line": 1,
"offset": 6,
"column": 7
}
},
"id": "plan"
}
],
"returned": 1,
"total": 1
},
"statistics": {
"utf8Bytes": 18,
"codePoints": 18,
"nodes": 7,
"lines": 3,
"words": 2,
"maxDepth": 4
}
}Inspect only parser dependencies
{
"profile": "commonmark",
"include": [
"dependencies"
],
"markdown": "Text"
}{
"_meta": {
"profileVersion": "1",
"inputChars": 4,
"parserVersion": "0.24.0",
"truncated": false,
"truncatedSections": [],
"nodeCount": 2,
"bomStripped": false,
"lineEndingsNormalized": false,
"profile": "commonmark",
"inputBytes": 4,
"parser": "commonmark"
},
"dependencies": {
"items": [
{
"name": "commonmark",
"version": "0.24.0"
}
],
"returned": 1,
"total": 1
}
}Recommended use cases
- Build a document outline
- Inventory links and assets
- Measure document complexity
- Discover code, tables, tasks, or notes
Avoid for
- Remote link checking
- HTML rendering
- Content repair
- Open-ended summarization
Related skills
Composable with
Safety & privacy
- Runs without calling any external service.
- Your payloads are never stored permanently.
- Telemetry captures metadata only — never your payload contents.
- We never train models on your payloads.
- No human reviews your payloads.