Overview
Perfect for markdown documentation analysis, link validation, SEO audits, and extracting references from markdown content.
Live Test Markdown Link Extractor Skill Skill →
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as MarkdownLinkExtractorSkill. 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": "MarkdownLinkExtractorSkill",
"arguments": {
"markdown": "# Title\\n\\n[Link](https://example.com)"
}
}You do not name the tool yourself; the model picks it. Asking about # Title\n\n[Link](https://example.com) in the terms this skill covers is enough for it to reach for MarkdownLinkExtractorSkill 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 parse (max 100,000 characters) |
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": {
"totalLinks": 6,
"links": [
{
"text": "this link",
"url": "https://example.com",
"type": "inline"
},
{
"text": "another one",
"url": "https://test.com",
"type": "inline"
},
{
"text": "Image",
"url": "https://example.com/image.png",
"type": "inline"
},
{
"text": "Reference link",
"url": "https://reference.com",
"type": "reference",
"reference": "ref1"
},
{
"text": "https://autolink.com",
"url": "https://autolink.com",
"type": "autolink"
},
{
"text": "https://bare-url.com",
"url": "https://bare-url.com",
"type": "bare"
}
],
"categories": {
"internal": {
"count": 0,
"links": []
},
"external": {
"count": 6,
"links": [
{
"text": "this link",
"url": "https://example.com",
"type": "inline"
},
{
"text": "another one",
"url": "https://test.com",
"type": "inline"
},
{
"text": "Image",
"url": "https://example.com/image.png",
"type": "inline"
},
{
"text": "Reference link",
"url": "https://reference.com",
"type": "reference",
"reference": "ref1"
},
{
"text": "https://autolink.com",
"url": "https://autolink.com",
"type": "autolink"
},
{
"text": "https://bare-url.com",
"url": "https://bare-url.com",
"type": "bare"
}
]
},
"email": {
"count": 0,
"links": []
},
"other": {
"count": 0,
"links": []
}
},
"markdownLength": 253
}
}
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 |
|---|---|---|---|
totalLinks | number | 6 | Total number of unique links found in the markdown after removing duplicate URLs |
links | array[6] | Every unique link extracted from the markdown, in the order it first appears | |
links.0.text | string | this link | The visible label for the link: the link text, the image alt text, or the URL itself for autolinks and bare URLs |
links.0.url | string | https://example.com | The destination the link points to |
links.0.type | string | inline | How the link is written in the markdown: inline ([text](url)), reference ([text][ref]), autolink (<url>), bare (a plain URL with no markdown syntax), or image () |
categories | object | {…} | Links grouped by destination: internal, external, email, and other |
categories.internal | object | {…} | Links whose URL is a page anchor (#) or a relative path (starting with / or ./) |
categories.internal.countPremium | number | 0 | Number of internal links found |
categories.internal.links | array | [] | The internal links themselves |
categories.external | object | {…} | Links whose URL starts with http:// or https:// |
categories.external.countPremium | number | 6 | Number of external links found |
categories.external.links | array[6] | The external links themselves | |
categories.external.links.0.text | string | this link | |
categories.external.links.0.url | string | https://example.com | |
categories.external.links.0.type | string | inline | |
categories.email | object | {…} | Links whose URL is a mailto: address |
categories.email.count | number | 0 | Number of email links found |
categories.email.links | array | [] | The email links themselves |
categories.other | object | {…} | Links that don't match the internal, external, or email patterns |
categories.other.count | number | 0 | Number of other links found |
categories.other.links | array | [] | The other links themselves |
markdownLength | number | 253 | Length of the input markdown string, in characters |
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 2 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Documentation Analysis
- Extract and validate all links from markdown documentation
- SEO Auditing
- Identify internal and external links in markdown content for SEO optimization
- Content Migration
- Extract URLs when migrating markdown content between platforms
- Link Validation
- Generate comprehensive lists of links for automated link checking
Other ways to use Markdown Link Extractor Skill
Set up Markdown Link Extractor 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 Text Processing: