Our review
Uploads a Claude Code skill to the Anthropic Skills API for workspace-wide availability, including analysis, bundling, frontmatter transformation, validation, and upload tracking.
Strengths
- Automates the entire upload process
- Handles versioning and state tracking
- Validates skill before upload
- Provides clear output for integration
Limitations
- Requires ANTHROPIC_API_KEY and Python dependencies
- Only works with Anthropic Skills API, not general publishing
- Assumes skill already exists locally
Use when you need to make a Claude Code skill available to your entire workspace via the Anthropic Skills API.
Do not use if you want to share a skill outside of Anthropic ecosystem or if you prefer manual upload.
Security analysis
CautionThe skill performs network operations and uses API keys, but only for the stated legitimate purpose of uploading skills. No destructive or exfiltrating actions are instructed.
- •Uses ANTHROPIC_API_KEY for authentication and performs network operations to upload skill
- •Executes Python scripts from the plugin's library
Examples
Upload the github-helper skill to the APIPublish my-skill to the workspace APISync the code-review skill to the Anthropic Skills APIname: arcana-upload-api description: > Upload a Claude Code skill to the Anthropic Skills API for workspace-wide availability. Analyzes the skill, bundles dependencies, transforms frontmatter, validates, and uploads. Tracks uploads for future updates. Trigger phrases: "upload to API", "publish skill", "sync to API", "upload skill".
Arcana Upload API: Upload to Messages API
Upload a Claude Code skill to the Anthropic Skills API.
Path Convention
{PLUGIN_ROOT} = This plugin's root directory (where plugin.json lives)
Prerequisites
ANTHROPIC_API_KEYenvironment variable must be set- Python 3.8+ with
requestsandpyyamlpackages
What This Does
- Analyzes the skill to understand what it does
- Identifies all files the skill needs
- Transforms frontmatter (strips CC-only fields)
- Validates for API compatibility
- Creates a ZIP file
- Uploads to Anthropic Skills API
- Tracks the upload for future updates
Workflow
Step 1: Check Prerequisites
Verify API key is set:
if [ -z "$ANTHROPIC_API_KEY" ]; then
echo "ANTHROPIC_API_KEY not set"
fi
If not set, ask user to set it.
Step 2: Check State
Read {PLUGIN_ROOT}/lib/patterns/state-tracking.md for guidance.
Check if this skill has been uploaded before:
python3 "{PLUGIN_ROOT}/lib/tools/state.py" get {skill-name}
If found:
- Inform user: "Skill already uploaded (v2). Will create new version."
- Use stored skill_id for version creation
If not found:
- Inform user: "New skill. Will create."
Step 3: Analyze the Skill
Same as export-zip - read {PLUGIN_ROOT}/lib/patterns/skill-analysis.md.
- Read the SKILL.md
- Explore the skill directory
- Trace dependencies
- Build file manifest
Step 4: Transform Frontmatter
Same as export-zip - read {PLUGIN_ROOT}/lib/patterns/frontmatter-transform.md.
Strip CC-only fields, keep name/description/version.
Step 5: Validate
Same as export-zip - read {PLUGIN_ROOT}/lib/references/validation-rules.md.
Validate name and description.
Step 6: Create ZIP
Same as export-zip:
python3 "{PLUGIN_ROOT}/lib/tools/zip_skill.py" \
--name {skill-name} \
--output /tmp/{skill-name}.zip \
--base-path {temp-directory} \
{files...}
Step 7: Upload to API
Read {PLUGIN_ROOT}/lib/references/api-spec.md for API details.
For new skill:
python3 "{PLUGIN_ROOT}/lib/tools/api.py" upload /tmp/{skill-name}.zip \
--title "{Skill Title}"
For existing skill (new version):
python3 "{PLUGIN_ROOT}/lib/tools/api.py" version {skill_id} /tmp/{skill-name}.zip
Step 8: Update State
Record the upload:
python3 "{PLUGIN_ROOT}/lib/tools/state.py" set {skill-name} \
--skill-id {skill_id} \
--source-path {original-skill-path}
Step 9: Report Result
New skill:
Upload complete!
Skill: my-skill
ID: skill_01AbCdEfGhIjKlMnOpQrStUv
Version: 1
Status: Created
To use in Messages API:
{
"container": {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest"
}
]
}
}
Updated skill:
Upload complete!
Skill: my-skill
ID: skill_01AbCdEfGhIjKlMnOpQrStUv
Version: 3 (updated from v2)
Status: New version created
The latest version is now active for "version": "latest"
Example Session
User: Upload the github-helper skill to the API
Claude:
- Checking ANTHROPIC_API_KEY... ✓ Set
- Checking state... Not found (new skill)
- Reading skill at
/path/to/github-helper/SKILL.md... - This skill helps with GitHub operations.
- Found dependencies: 2 files
- Transforming frontmatter (stripping: allowed-tools, hooks)...
- Validation passed
- Creating ZIP...
- Uploading to API...
python3 lib/tools/api.py upload /tmp/github-helper.zip --title "GitHub Helper"
{
"id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"title": "GitHub Helper",
"version": 1
}
- Recording state...
Upload complete!
Error Handling
| Error | Resolution | |-------|------------| | API key not set | Ask user to set ANTHROPIC_API_KEY | | 401 Unauthorized | Check API key is valid | | 422 Validation error | Check name/description, report specific issue | | 429 Rate limited | Wait and retry | | Network error | Retry with backoff |
Cleanup
After successful upload, optionally delete the temporary ZIP:
rm /tmp/{skill-name}.zip
Related Patterns
{PLUGIN_ROOT}/lib/patterns/skill-analysis.md- How to analyze skills{PLUGIN_ROOT}/lib/patterns/state-tracking.md- How to track uploads{PLUGIN_ROOT}/lib/references/api-spec.md- API specification
Docker Compose Architect
DevOps
Designs optimized Docker Compose configurations.
Incident Postmortem Writer
DevOps
Writes structured and blameless incident postmortem reports.
Runbook Creator
DevOps
Creates clear operational runbooks for common DevOps procedures.