Overview
Supports standard markdown formatting including headers, lists, links, and emphasis with automatic HTML rendering before PDF conversion.
Live Test Markdown to PDF Skill Skill →
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as MarkdowntoPDFSkill. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.
{
"name": "MarkdowntoPDFSkill",
"arguments": {
"markdown": "# Title\\n\\nThis is **bold** text."
}
}You do not name the tool yourself; the model picks it. Asking about # Title\n\nThis is **bold** text. in the terms this skill covers is enough for it to reach for MarkdowntoPDFSkill on its own — naming it explicitly also works, and is the way to force the call.
Connecting
One server URL covers every skill in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.
{
"mcpServers": {
"vervekit": {
"url": "https://api.vervekit.com/v1/mcp"
}
}
}https://api.vervekit.com/v1/mcpPer-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.
Arguments
These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.
| Argument | Type | Description |
|---|---|---|
markdownRequired | string | Markdown text to convert (max 100,000 characters) length 0–500000 |
What the model gets back
The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.
{
"status": "ok",
"error": null,
"data": {
"marginLeft": "0.4in",
"marginRight": "0.4in",
"marginTop": "0.4in",
"marginBottom": "0.4in",
"landscape": false,
"pdfName": "b3ce14f5-1c44-4d2d-8a10-77430b679dae.pdf",
"expires": 1766096769188,
"downloadURL": "https://storage.googleapis.com/apiverve-helpers.appspot.com/htmltopdf/b3ce14f5-1c44-4d2d-8a10-77430b679dae.pdf?GoogleAccessId=1089020767582-compute%40developer.gserviceaccount.com&Expires=1766096769&Signature=q%2Fe4YUCniLQIRCPSO82LhTJ%2BSfqZSPNq8nSblE0LW6%2B546R9kXIowaQD7k%2BOhFzQi9q3nb8QcUNtZijHpEkIIcy6OOayWInWMzMF8ooXQ7Gch4YJL6iAURSIFZpfEw3XqyYuWXP1dw372kmiYVfTBgaRed0apeRwjeF8bGciLm%2FOsYKcsRrYlJtuyFwqeNw4G2aQKgLkxUw%2FP6L5Av%2BZssRkRqIWvQ6eNmwpUJZ48hJZYY6%2BRFhTYwnN4dEPWYSd9TSiJf6C%2BEWReWQJlgBy7BUK0H%2B9pyn4872PV1N3eI9VHhg89g4dimbieOQUF%2BhG%2Bkhcd5z0inaMml7DBdbF4g%3D%3D",
"markdownLength": 278,
"htmlLength": 380
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
marginLeft | string | 0.4in | Left margin dimension of the generated PDF document |
marginRight | string | 0.4in | Right margin dimension of the generated PDF document |
marginTop | string | 0.4in | Top margin dimension of the generated PDF document |
marginBottom | string | 0.4in | Bottom margin dimension of the generated PDF document |
landscape | boolean | false | Indicates whether PDF orientation is landscape format |
pdfName | string | b3ce14f5-1c44-4d2d-8a10-77430b679dae.pdf | Unique filename identifier for the generated PDF |
expires | number | 1766096769188 | Unix timestamp when the PDF download URL expires |
downloadURL | string | https://storage.googleapis.com/apiverve-helpers.appspot.com/htmltopdf/b3ce14f5-1c44-4d2d-8a10-77430b679dae.pdf?GoogleAccessId=1089020767582-compute%40developer.gserviceaccount.com&Expires=1766096769&Signature=q%2Fe4YUCniLQIRCPSO82LhTJ%2BSfqZSPNq8nSblE0LW6%2B546R9kXIowaQD7k%2BOhFzQi9q3nb8QcUNtZijHpEkIIcy6OOayWInWMzMF8ooXQ7Gch4YJL6iAURSIFZpfEw3XqyYuWXP1dw372kmiYVfTBgaRed0apeRwjeF8bGciLm%2FOsYKcsRrYlJtuyFwqeNw4G2aQKgLkxUw%2FP6L5Av%2BZssRkRqIWvQ6eNmwpUJZ48hJZYY6%2BRFhTYwnN4dEPWYSd9TSiJf6C%2BEWReWQJlgBy7BUK0H%2B9pyn4872PV1N3eI9VHhg89g4dimbieOQUF%2BhG%2Bkhcd5z0inaMml7DBdbF4g%3D%3D | Direct URL to download the generated PDF document |
markdownLength | number | 278 | Character count of the input markdown text |
htmlLengthPremium | number | 380 | Character count of the generated HTML intermediate format |
Failure modes
Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.
| Status | What it means |
|---|---|
400 / 422 | The arguments did not validate. The message names the offending one. |
401 | The OAuth session is invalid or expired — reconnect the server. |
403 | Blocked by a key restriction or an IP allow-list. Never a bad identity. |
404 | This skill is not part of VerveKit. Check the catalog. |
429 | Out of credits, or a brief rate limit. The message tells them apart. |
A call costs 30 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Documentation Export
- Convert markdown documentation to PDF for offline distribution
- Report Generation
- Generate PDF reports from markdown-formatted content
- Resume Building
- Create PDF resumes from markdown source files
- Publishing Workflows
- Convert markdown articles to PDF for publishing and archiving
Other ways to use Markdown to PDF Skill
Set up Markdown to PDF Skill on VerveKit, or reach the same source a different way. Your VerveKit account and credits work on all of them — one key, one balance.
Related
More in Data Conversion: