curl -X POST "https://api.danubeai.com/v1/skills/validate" \
-H "danube-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"skill_name": "pdf-processing",
"skill_md_content": "---\nname: pdf-processing\ndescription: Extract text and tables from PDF files. Use when working with PDF documents.\n---\n\n# PDF Processing\n\n1. Parse the PDF file\n2. Extract text content\n3. Return structured data",
"scripts": [
{"name": "extract.py", "content": "import fitz\n\ndef extract(path):\n doc = fitz.open(path)\n return [p.get_text() for p in doc]"}
]
}'
{
"valid": true,
"errors": [],
"warnings": [],
"parsed_name": "pdf-processing",
"parsed_description": "Extract text and tables from PDF files. Use when working with PDF documents."
}
{
"valid": false,
"errors": [
{
"field": "name",
"message": "Name in frontmatter 'pdf_processing' does not match provided name 'pdf-processing'.",
"suggestion": "Change the name in frontmatter to 'pdf-processing' or update the skill name."
},
{
"field": "description",
"message": "Description is too short.",
"suggestion": "Provide a more detailed description that explains what the skill does AND when to use it."
}
],
"warnings": [
"Script 'extract.py' has no content."
],
"parsed_name": "pdf_processing",
"parsed_description": "Process PDFs"
}
Skills
Validate Skill
Check a SKILL.md and its files against the Agent Skills specification before creating or submitting
POST
/
v1
/
skills
/
validate
curl -X POST "https://api.danubeai.com/v1/skills/validate" \
-H "danube-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"skill_name": "pdf-processing",
"skill_md_content": "---\nname: pdf-processing\ndescription: Extract text and tables from PDF files. Use when working with PDF documents.\n---\n\n# PDF Processing\n\n1. Parse the PDF file\n2. Extract text content\n3. Return structured data",
"scripts": [
{"name": "extract.py", "content": "import fitz\n\ndef extract(path):\n doc = fitz.open(path)\n return [p.get_text() for p in doc]"}
]
}'
{
"valid": true,
"errors": [],
"warnings": [],
"parsed_name": "pdf-processing",
"parsed_description": "Extract text and tables from PDF files. Use when working with PDF documents."
}
{
"valid": false,
"errors": [
{
"field": "name",
"message": "Name in frontmatter 'pdf_processing' does not match provided name 'pdf-processing'.",
"suggestion": "Change the name in frontmatter to 'pdf-processing' or update the skill name."
},
{
"field": "description",
"message": "Description is too short.",
"suggestion": "Provide a more detailed description that explains what the skill does AND when to use it."
}
],
"warnings": [
"Script 'extract.py' has no content."
],
"parsed_name": "pdf_processing",
"parsed_description": "Process PDFs"
}
Overview
Runs the same validation that Create Skill and Submit Skill apply, without saving anything. Use it to get structured errors and suggestions while authoring. The response is always200; a failing skill comes back with valid: false and a list of errors.
When the skills-ref reference validator is installed on the server it runs first. Otherwise the built-in checks apply:
- SKILL.md must start with
---delimited YAML frontmatter. nameis required, must use lowercase letters, digits and single hyphens (no leading, trailing or consecutive hyphens), must be at most 64 characters, and must equalskill_name.descriptionis required, at least 20 and at most 1024 characters.compatibility, when present, at most 500 characters.- Every file in
scripts,reference_filesandassetsneeds aname, and the name must not contain/,\or...
danube-api-key header).
The Python and TypeScript SDKs do not wrap this endpoint yet, and there is no MCP tool for it. Call it directly.
Body Parameters
string
required
The expected skill name (max 64 characters). Must match
name in the frontmatter.string
required
The full SKILL.md content including YAML frontmatter (max 500,000 characters)
array
default:[]
array
default:[]
Reference files (max 20). Same file object as
scripts.array
default:[]
Asset files (max 20). Same file object as
scripts.Response
boolean
true when no errors were foundarray
array
Non-blocking notes, as strings
string
The
name read from the frontmatter, or null if it could not be parsedstring
The
description read from the frontmatter, or null if it could not be parsedExample
curl -X POST "https://api.danubeai.com/v1/skills/validate" \
-H "danube-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"skill_name": "pdf-processing",
"skill_md_content": "---\nname: pdf-processing\ndescription: Extract text and tables from PDF files. Use when working with PDF documents.\n---\n\n# PDF Processing\n\n1. Parse the PDF file\n2. Extract text content\n3. Return structured data",
"scripts": [
{"name": "extract.py", "content": "import fitz\n\ndef extract(path):\n doc = fitz.open(path)\n return [p.get_text() for p in doc]"}
]
}'
{
"valid": true,
"errors": [],
"warnings": [],
"parsed_name": "pdf-processing",
"parsed_description": "Extract text and tables from PDF files. Use when working with PDF documents."
}
{
"valid": false,
"errors": [
{
"field": "name",
"message": "Name in frontmatter 'pdf_processing' does not match provided name 'pdf-processing'.",
"suggestion": "Change the name in frontmatter to 'pdf-processing' or update the skill name."
},
{
"field": "description",
"message": "Description is too short.",
"suggestion": "Provide a more detailed description that explains what the skill does AND when to use it."
}
],
"warnings": [
"Script 'extract.py' has no content."
],
"parsed_name": "pdf_processing",
"parsed_description": "Process PDFs"
}
