Overview
Ideal for generating social media graphics, documentation previews, visual content cards, and markdown-based image generation workflows.
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as MarkdowntoImageSkill. 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": "MarkdowntoImageSkill",
"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 MarkdowntoImageSkill 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 length 0–500000 |
widthOptionalPremium | integer | Image width in pixels default 1280 · range 100–3840 |
heightOptionalPremium | integer | Image height in pixels default 800 · range 100–2160 |
formatOptionalPremium | string | Output image formatpngjpegjpgwebpdefault png |
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": {
"imageName": "31e86a48-125a-464a-8ea5-8b342226944f.png",
"format": ".png",
"downloadURL": "https://storage.googleapis.com/apiverve/APIData/markdowntoimage/31e86a48-125a-464a-8ea5-8b342226944f.png?GoogleAccessId=635500398038-compute%40developer.gserviceaccount.com&Expires=1766010365&Signature=PXD9Zct7HearzSJvxZcNlnlnPdga8qH1Mln4I7tTDmrzSolUdwDxZx3Xdsy6LVu8B%2F1es7keTFKcnNnBm2Er9Kqbmg5j9BeTX3lQnJsIVh5gAlsEheT%2B%2FpWjWnjRWc%2FdtqurbUR%2BcSYMELqufs%2FPcrK62OAl0lmf6zARA2KtUP8qop%2FORbG81h%2BkFIoy3VaaRVXiceewF6HQzBz%2FFBhmc1oOAiEPiQZl7PQRu%2Fz4oX%2BtMbnWPUoUmIXVVfDmMw4XsyWlckQo%2BfZ34B79aOaBznpuJ0Z%2BlN1upsHPvBO33WRdQHECEUMJmGB7KgRZU%2Bjqco4LSEOO9kfkLlMxYyl3pQ%3D%3D",
"expires": 1766010365188,
"markdownLength": 282,
"htmlLength": 376,
"dimensions": {
"width": 1280,
"height": 800
}
}
}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 |
|---|---|---|---|
imageName | string | 31e86a48-125a-464a-8ea5-8b342226944f.png | Unique identifier for the generated image |
format | string | .png | Output image format |
downloadURL | string | https://storage.googleapis.com/apiverve/APIData/markdowntoimage/31e86a48-125a-464a-8ea5-8b342226944f.png?GoogleAccessId=635500398038-compute%40developer.gserviceaccount.com&Expires=1766010365&Signature=PXD9Zct7HearzSJvxZcNlnlnPdga8qH1Mln4I7tTDmrzSolUdwDxZx3Xdsy6LVu8B%2F1es7keTFKcnNnBm2Er9Kqbmg5j9BeTX3lQnJsIVh5gAlsEheT%2B%2FpWjWnjRWc%2FdtqurbUR%2BcSYMELqufs%2FPcrK62OAl0lmf6zARA2KtUP8qop%2FORbG81h%2BkFIoy3VaaRVXiceewF6HQzBz%2FFBhmc1oOAiEPiQZl7PQRu%2Fz4oX%2BtMbnWPUoUmIXVVfDmMw4XsyWlckQo%2BfZ34B79aOaBznpuJ0Z%2BlN1upsHPvBO33WRdQHECEUMJmGB7KgRZU%2Bjqco4LSEOO9kfkLlMxYyl3pQ%3D%3D | URL to download the generated image |
expires | number | 1766010365188 | Unix timestamp when download URL expires |
markdownLength | number | 282 | |
htmlLength | number | 376 | |
dimensions | object | {…} | |
dimensions.widthPremium | number | 1280 | Width of generated image in pixels |
dimensions.heightPremium | number | 800 | Height of generated image in pixels |
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 20 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Social Media
- Create visual content cards from markdown for social media sharing
- Documentation Previews
- Generate image previews of markdown documentation
- Content Cards
- Convert markdown content to shareable image cards
- Visual Newsletters
- Transform markdown newsletters into visual image formats
Other ways to use Markdown to Image Skill
Set up Markdown to Image 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: