workspace/skills/document-generation/SKILL.md
Generate Word (.docx), Excel (.xlsx) and PowerPoint (.pptx) documents and fill existing PDF forms, from real NetClaw data, with per-element provenance and no fabrication. Use when someone needs a deliverable rather than an answer — a change record to attach to a CR, an audit workbook for a compliance reviewer, a summary deck for a director, or a required PDF form filled from real device and ticket data.
npx skillsauth add automateyournetwork/netclaw document-generationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
document-mcp (NetClaw-authored, spec 082 / roadmap R18)$DOCUMENT_MCP_CMDA document must never fabricate to fill a blank.
Tool output is ephemeral — read once, in context, by the person who asked. A document is not. It gets emailed, attached to a ticket, filed for audit, and read months later by someone who was not there, and it carries the authority of its formatting.
A professional-looking change record with a plausible invented number is a far more effective way to launder
a guess into an official record than any amount of terminal output, because nobody re-derives a figure
that is already in a table in a .docx.
So: never infer, estimate, interpolate, or carry forward a stale value to complete a document. If you do
not have a figure, send {"unavailable": "<why>"}. The server renders that as visible text. It will not
render a blank, and it will not let you send one.
Every value in a figure, table, keyvalue or form field is one of exactly three shapes:
{"v": "fgt-01", "src": "fgt_system_status", "device": "fgt-01", "as_of": "2026-08-03T13:58:00Z"}
{"unavailable": "device did not answer within timeout"}
{"failed": "FortiGate plane unreachable: connection refused"}
| You send | The document shows |
|---|---|
| {"v": x, "src": ...} | x, with a visible source |
| {"v": ""} | (empty) — the source was consulted and returned nothing |
| {"unavailable": r} | NOT AVAILABLE — r |
| {"failed": r} | RETRIEVAL FAILED — r |
| {"v": x} with no src | refused |
| a bare x | refused |
unavailable and failed are different facts and render differently: a dead query is not an empty result.
Neither ever renders as N/A, 0, -, or an empty cell.
| Tool | Does |
|---|---|
| docx_write | Word document from ordered blocks: heading, paragraph, figure, table, keyvalue, image, pagebreak |
| xlsx_write | Workbook from sheets of tagged rows, plus failed_rows |
| pptx_write | Deck from slides: bullets, figure, image |
| pdf_inspect_form | List a PDF's real named fields — call this before filling |
| pdf_fill_form | Fill named fields into a new file; reports unfilled and unmatched |
| list_documents | Find something you generated earlier |
.docx footer on every page, the .xlsx banner, and the
.pptx title and Sources slides.ok, partial
or failed.If any figure lacks a source, the whole call is refused. There is no partial path.
No footnotes in Word. python-docx has no footnote API, so attribution is inline — a Source column in
tables, a small parenthetical after prose figures. That is more visible than a footnote, not less. Word
comments and document properties are set additively but never count as provenance: they are collapsed by
default, stripped on paste, and absent in print.
No Office templates. .docx, .xlsx and .pptx are built from scratch and a supplied template is
refused, not ignored — otherwise you would get an unbranded document believing it was branded. A
corporate template's empty field is the strongest fabrication pressure in the feature. PDF forms are the
exception because their fields are explicitly named: there is nothing to guess.
A filled PDF carries no Sources section. It is the customer's form and adding a page would alter it. For that one format provenance lives in the tool response and the GAIT record. Say so when you hand the file over.
Prose carries no attribution. A paragraph asserting a bare number gets a caveat naming the block index —
use figure, table or keyvalue instead, all of which force a source. Dates, ticket numbers, IPs,
versions and "Section 2" are not flagged.
status column is refused. An
interface can be administratively up with no carrier, and collapsing them tells a reader traffic is
passing when nothing is.= is written as literal text —
openpyxl would otherwise turn it into a live formula in an auditor's spreadsheet.ok means complete. A document with any gap comes back as written_with_gaps, and you cannot
override that.| Want to… | Use |
|---|---|
| Draw a diagram | drawio-diagram, markmap-viz, uml-diagram, threejs-network-viz. This embeds their output and never redraws it — pass the file they produced plus src naming them |
| Read a document into the knowledge base | rag-mcp (feature 062). It reads these formats; this writes them. Same libraries, opposite direction |
| Create or update a change record | servicenow-change-workflow owns the CR lifecycle. This renders a document from one and never writes a ticket |
| Send the document somewhere | slack-report-delivery, webex-report-delivery. Writing a file is in scope here; sending it is not |
| Compose a NetClaw-shaped report | network-report-documents — the four standard compositions |
unavailable or failed with a real reason.src. It will be refused, and it should be.pdf_inspect_form before pdf_fill_form so you map data to fields that actually exist.written_with_gaps, tell the operator the document is
incomplete and which parts. Handing over a gapped document as if it were finished undoes the whole point.tools
Zoom meeting intelligence — correlates a live or referenced Zoom meeting discussion against NetClaw's historical meeting record (via the official Zoom Meetings MCP) and today's actual network state. Use when someone in a Zoom meeting references a past discussion or incident ('didn't we have this issue before?'), or asks to search prior meetings for a topic. Does not itself recognize live in-meeting questions — that happens automatically inside zoom-rtms-mcp's own extractor (spec 118) before this skill is ever invoked.
tools
Manage Lantronix out-of-band (OOB) infrastructure via Percepxion central management platform: device inventory, serial port inspection via SLC CLI, firmware compliance, config management, security auditing, and closed-loop incident remediation. Use during outages, maintenance windows, compliance cycles, and AI-assisted automation workflows.
tools
Federate your NetClaw with other NetClaw operators over the BGP mesh — exchange capability inventories and ask your claw what a peer can do. (US1; remote invocation and chat land in later phases.)
tools
Track token consumption, enforce session budgets, and display cost for every NetClaw interaction.