curl --request POST \
--url https://api.example.com/api/v1/skills \
--header 'Content-Type: application/json' \
--data '
{
"data": {},
"wait": true,
"timeout": 123
}
'{
"status": "ok",
"result": {
"status": "success",
"uri": "viking://agent/skills/search-web/",
"name": "search-web",
"auxiliary_files": 0
},
"time": 0.15
}
Add a skill to the knowledge base. Skills define capabilities that agents can invoke. OpenViking automatically detects and converts MCP tool definitions to skill format.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/volcengine/OpenViking/llms.txt
Use this file to discover all available pages before exploring further.
wait=true or call /api/v1/system/wait to ensure processing completes.X-API-Key header.
wait=true{
"name": "search-web",
"description": "Search the web for current information",
"content": "# search-web\n\nSearch the web for current information.\n\n## Parameters\n- **query** (string, required): Search query\n- **limit** (integer, optional): Max results, default 10",
"allowed_tools": ["HttpClient", "JsonParser"],
"tags": ["web", "search"]
}
{
"name": "calculator",
"description": "Perform mathematical calculations",
"inputSchema": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Mathematical expression to evaluate"
}
},
"required": ["expression"]
}
}
inputSchema and automatically converts it to skill format with generated markdown documentation.---
name: code-runner
description: Execute code in various languages
allowed-tools:
- FileSystem
- ProcessRunner
tags:
- code
- execution
---
# code-runner
Execute code in various languages safely.
## Parameters
- **language** (string, required): Programming language
- **code** (string, required): Code to execute
- **timeout** (integer, optional): Timeout in seconds
{
"data": "./skills/search-web/SKILL.md"
}
{
"data": "./skills/code-runner/"
}
ok or error)curl -X POST http://localhost:1933/api/v1/skills \
-H "Content-Type: application/json" \
-H "X-API-Key: your-key" \
-d '{
"data": {
"name": "search-web",
"description": "Search the web for current information",
"content": "# search-web\n\nSearch the web for current information.\n\n## Parameters\n- **query** (string, required): Search query\n- **limit** (integer, optional): Max results, default 10"
}
}'
{
"status": "ok",
"result": {
"status": "success",
"uri": "viking://agent/skills/search-web/",
"name": "search-web",
"auxiliary_files": 0
},
"time": 0.15
}
inputSchema, OpenViking automatically converts it to skill format:
Input (MCP):
{
"name": "search_web",
"description": "Search the web",
"inputSchema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"},
"limit": {"type": "integer", "description": "Max results"}
},
"required": ["query"]
}
}
---
name: search-web
description: Search the web
---
# search-web
Search the web
## Parameters
- **query** (string) (required): Search query
- **limit** (integer) (optional): Max results
## Usage
This tool wraps the MCP tool `search-web`. Call this when the user needs functionality matching the description above.
Use Clear Descriptions
# Good - specific and actionable
skill = {
"name": "search-web",
"description": "Search the web for current information using Google",
...
}
# Less helpful - too vague
skill = {
"name": "search",
"description": "Search",
...
}
Use Kebab-Case for Names
search-web ✅searchWeb ❌search_web ❌Include Comprehensive Content
curl --request POST \
--url https://api.example.com/api/v1/skills \
--header 'Content-Type: application/json' \
--data '
{
"data": {},
"wait": true,
"timeout": 123
}
'{
"status": "ok",
"result": {
"status": "success",
"uri": "viking://agent/skills/search-web/",
"name": "search-web",
"auxiliary_files": 0
},
"time": 0.15
}