Skip to main content

What are agent skills?

Agent skills are documentation files that describe how to interact with your deployed workflows. Each skill is a directory containing a SKILL.md file that follows the Claude Agent Skills format. When you deploy a use case with skills, agents can download them via codika get skills and immediately understand how to trigger your workflows — input schemas, output schemas, example payloads, and all.
Automate this. The Builder System agents can create complete use cases with properly configured agent skills — no manual SKILL.md writing needed.

Why skills matter

Without skills, an agent has no way to know what endpoints your use case exposes or how to use them. Skills bridge the gap between deployed workflows and agent consumption.
You build workflows → Codika deploys as HTTP endpoints → Skills explain how to use them → Agents discover and call them
Credential decoupling: You connect integrations to the platform once. When an agent triggers a workflow, Codika injects the right credentials at runtime. The agent only holds a Codika API key — it calls actions, not raw APIs. You control the agent’s tool stack by choosing which workflows get skills.

How agents use skills

Skills are documentation — they explain what’s available. The actual execution always goes through the Codika platform:
Agent reads SKILL.md → understands input/output
Agent calls: codika trigger <workflowId> --payload-file input.json
  → Codika CLI sends request with API key
    → triggerWebhookPublic cloud function validates key
      → Platform resolves integration credentials (OAuth, API keys)
        → n8n workflow executes with real credentials injected
          → Result returned to agent

What agents need

RequirementWhyHow
codika CLI installedTo trigger workflows and fetch skillsnpm install -g codika
Codika API keyAuthentication for all platform callscodika login or CODIKA_API_KEY env var. Use --profile <name> on any command to target a specific profile without switching the global active one. Discover profiles and their org IDs via codika use --json.
Process instance IDIdentifies which deployed use case to interact withFrom project.json or provided explicitly

What the agent never touches

All integration credentials (OAuth tokens, API keys, database passwords) are managed by the platform and injected into workflows at runtime via the placeholder system. The Codika API key only grants permission to trigger workflows and read skills — it cannot access the underlying integration credentials. This is the core of Codika’s credential decoupling: agents get actions, not keys.

Which workflows get skills?

Workflow typeGets a skill?Why
HTTP-triggeredYesUser/agent-facing endpoint with input/output
Scheduled (with manual trigger URL)YesAuto-runs but can be manually triggered for testing
Sub-workflowNoInternal helper, called by other workflows
Data ingestionNoInternal, triggered by document uploads
Service event (webhook receiver)Usually noTriggered by external services, not by agents

Folder structure

Skills live in a skills/ folder alongside workflows/:
my-use-case/
├── config.ts
├── workflows/
│   ├── main-workflow.json
│   ├── scheduled-report.json
│   └── text-processor.json          # sub-workflow — no skill
└── skills/
    ├── main-workflow/                # one directory per skill
    │   └── SKILL.md
    └── scheduled-report/
        └── SKILL.md
Each skill is a directory containing a SKILL.md file. This matches Claude’s expected format — downloaded skills can be placed directly in .claude/skills/ for Claude Code auto-discovery or uploaded to the Claude API.

SKILL.md format

Frontmatter (required)

---
name: my-use-case-process-text
description: Submits text for AI processing via the main-workflow HTTP endpoint. Returns processed text with a timestamp.
workflowTemplateId: main-workflow
---
FieldRequiredConstraints
nameYesMax 64 chars, lowercase letters/numbers/hyphens only, no “anthropic” or “claude”
descriptionYesMax 1024 chars, non-empty, third person (“Submits text for…” not “Use this to…”)
workflowTemplateIdYesMust match a workflowTemplateId from the workflows array in config.ts

Body

The body should be concise (under 500 lines) and include:
  1. Title — H1 with the workflow name
  2. One-line overview — What the endpoint does, which integrations it uses
  3. How to trigger — Exact codika trigger command with example payload
  4. Input — Table of input parameters
  5. Output — Example JSON response
  6. Notes — Cost, limitations, edge cases

HTTP workflow skill example

---
name: wat-direct-messaging
description: Sends a WhatsApp message to a list of phone numbers via Twilio. Accepts up to 500 recipients and returns delivery statistics.
workflowTemplateId: http-direct-messaging
---

# Direct Messaging

Sends a WhatsApp message to up to 500 phone numbers via Twilio.

## How to trigger

\`\`\`bash
codika trigger http-direct-messaging --payload-file - <<'EOF'
{
  "phone_numbers": ["32477123456", "33612345678"],
  "message_content": "Hello from WAT community!"
}
EOF
\`\`\`

## Input

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| phone_numbers | array of strings | yes | Phone numbers (8-15 digits, no + prefix). Max 500. |
| message_content | text | yes | Message body. Max 4096 characters. |

## Output

\`\`\`json
{
  "success": true,
  "total_sent": 2,
  "total_failed": 0,
  "sent_at": "2025-03-15T10:30:00.000Z"
}
\`\`\`

## Notes

- Cost: 1 credit per execution
- Uses: Twilio (WhatsApp), Supabase (audit logging)

Scheduled workflow skill example

---
name: wat-event-weekly-digest
description: Sends a personalized weekly digest of upcoming events to community members every Monday at 9 AM. Can be manually triggered for testing.
workflowTemplateId: scheduled-event-weekly-digest
---

# Event Weekly Digest

Runs automatically every Monday at 9:00 AM (Europe/Brussels).

## Manual trigger (for testing)

\`\`\`bash
codika trigger scheduled-event-weekly-digest
\`\`\`

No payload required.

## Notes

- Cost: 1 credit per execution
- Uses: Supabase (event data), Twilio (WhatsApp delivery)

Deployment lifecycle

1. Create skills alongside workflows

codika init ./my-use-case --name "My Use Case"
# Creates skills/main-workflow/SKILL.md and skills/scheduled-report/SKILL.md

2. Validate

codika verify use-case ./my-use-case
The verifier checks:
  • Every subdirectory in skills/ contains a SKILL.md file
  • Frontmatter has valid name, description, and workflowTemplateId
  • name follows Claude naming rules (lowercase, hyphens, max 64 chars)
  • workflowTemplateId matches an existing workflow

3. Deploy

codika deploy use-case ./my-use-case
Skills are automatically collected from skills/*/SKILL.md and sent with the deployment. No changes to config.ts needed.

4. Download skills (agents)

# From inside a use case folder
codika get skills

# With explicit process instance ID
codika get skills <processInstanceId>

# Save directly to Claude Code skills directory
codika get skills --output .claude/skills

# JSON output for programmatic use
codika get skills --json
Downloaded skills are written as proper Claude-compatible directories:
./skills/
├── my-use-case-process-text/
│   └── SKILL.md
└── my-use-case-scheduled-report/
    └── SKILL.md

Installing skills for agents

Claude Code (one command)

Download skills directly into Claude Code’s auto-discovery directory:
codika get skills --output .claude/skills
That’s it. Claude Code reads .claude/skills/ at startup. Each skill’s name and description are loaded into the system prompt (~100 tokens each). When a user request matches a skill’s description, Claude reads the full SKILL.md body and follows the instructions. Where .claude/skills/ lives:
  • Project-level (recommended): .claude/skills/ in your project root — skills are available in that project
  • Personal: ~/.claude/skills/ — skills are available in all your projects
What happens after installation:
User: "Send a WhatsApp message to these phone numbers"
  → Claude sees skill description: "Sends a WhatsApp message to a list of phone numbers via Twilio"
  → Claude reads skills/wat-direct-messaging/SKILL.md
  → Claude generates: codika trigger http-direct-messaging --payload-file ...
  → Workflow executes via Codika platform (credentials injected at runtime)
  → Result returned to user

Claude API

Upload skills programmatically for use in API-based agents:
from anthropic.lib import files_from_dir

# First download locally
# codika get skills --output ./skills

# Then upload to the Claude API
skill = client.beta.skills.create(
    display_title="Direct Messaging",
    files=files_from_dir("./skills/wat-direct-messaging"),
    betas=["skills-2025-10-02"],
)

# Use in a message
response = client.beta.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [{"type": "custom", "skill_id": skill.id, "version": "latest"}]
    },
    messages=[{"role": "user", "content": "Send a welcome message to +32477123456"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)

Claude Agent SDK

Place skills in .claude/skills/ and include "Skill" in your allowed_tools:
import { Agent } from '@anthropic-ai/agent-sdk';

const agent = new Agent({
  model: 'claude-sonnet-4-6',
  allowed_tools: ['Skill', 'Bash'],
});
The SDK auto-discovers skills from .claude/skills/ when it runs.

Triggering from a skill

After reading a skill, the agent generates the appropriate CLI command:
codika trigger <workflowTemplateId> --payload-file input.json --poll
All calls go through the Codika platform — credentials are resolved at runtime.

Best practices

  • One skill per triggerable workflow — don’t combine multiple endpoints into one skill
  • Be concise — under 500 lines. Claude is smart; only explain what it can’t infer
  • Show exact payloads — include real codika trigger commands with copy-pasteable JSON
  • Third-person descriptions — “Sends a message…” not “Use this to send…”
  • Prefix names with use case slugwat-direct-messaging, propale-generate-proposal
  • Mention integrations and cost — helps agents understand dependencies and expense
  • For scheduled workflows — always explain the automatic schedule AND the manual trigger