/precheck, /discipline, plus 16 topical context packs), and authenticated users can author and publish their own.
There are two layers:
| Layer | Source | Auth | Purpose |
|---|---|---|---|
| Built-in | GET /api/skills | none | Cognitive guardrails and topical context packs maintained by SimpleFunctions. |
| User skills | /api/skill* (CRUD) and /api/public/skill* (catalog) | required for write | Custom skills the user authored. Forkable. Optionally publishable. |
Built-in skills
The CLI ships built-in skills directly. Insidesf agent, type /<trigger> to run one. List them via the public API:
User skills — full schema
A user skill row contains:| Field | Type | Notes |
|---|---|---|
id | uuid | Primary key. |
userId | uuid | Owner. |
name | string | Display name. |
trigger | string | Slash command (e.g. /my-screener). Must be unique per user. |
description | string | One-line description. |
prompt | string | The instructions the agent runs. |
category | string | custom (default), trading, research, monitoring. |
tags | string[] | Discovery tags. |
toolsUsed | string[] | SimpleFunctions tools this skill calls (informational). |
estimatedTime | string | null | E.g. “1-2 minutes”. |
auto | string | null | Auto-trigger condition (e.g. before_trade). |
isPublic | boolean | Default false. |
publicSlug | string | null | Set when published. 3–60 chars, lowercase, numbers, hyphens. |
publishedAt | timestamp | null | Time of first publish. |
forkedFromId | uuid | null | Parent skill if this row is a fork. |
forkCount | number | Times this skill has been forked (only meaningful when public). |
runCount | number | Times this skill has been retrieved via run_skill. |
version | string | User-managed semver. Defaults to 1.0.0. |
createdAt, updatedAt | timestamp | Server-set. |
Authentication
Every endpoint below exceptGET /api/public/skills* and GET /api/skills requires Authorization: Bearer sf_live_xxx. Mutating endpoints additionally enforce ownership: only the row’s userId can update, delete, fork (their own), or publish it.
CRUD endpoints
Create a skill
name, trigger, description, prompt. Returns 201 with the new row.
| Status | Body | Cause |
|---|---|---|
400 | { error: "name, trigger, description, and prompt are required" } | Missing required field. |
401 | { error: "unauthorized" } | Bearer key missing or invalid. |
500 | { error: "Internal server error" } | DB write failed. |
List your skills
Get one skill
404 if not found or not owned by the caller.
Update a skill
name, trigger, description, prompt, category, tags, toolsUsed, estimatedTime, auto, version.
404 when the row doesn’t exist or isn’t owned by the caller. Server stamps updatedAt.
Delete a skill
{ deleted: true, id }. Hard delete. 404 if not found.
Fork a public skill
name (with ” (fork)” suffix), trigger, description, prompt, category, tags, toolsUsed, estimatedTime, and sets forkedFromId to the original. forkCount on the original is atomically incremented.
201 with the new row. 404 if the source skill isn’t public or doesn’t exist.
Publish / unpublish
isPublic = true and pins a public slug:
^[a-z0-9-]{3,60}$. Unique across all published skills.
| Status | Body | Cause |
|---|---|---|
400 | { error: "slug is required" } | Body missing slug. |
400 | { error: "Slug: 3-60 chars, lowercase, numbers, hyphens only" } | Slug regex failed. |
404 | { error: "Skill not found" } | Not owned by caller. |
409 | { error: "Slug already taken" } | Another skill owns the slug. |
{ published: true, slug, skill }. The skill is then live at simplefunctions.dev/skills/{slug} and discoverable via GET /api/public/skills.
Unpublish flips isPublic = false and returns { unpublished: true }. The slug is kept so future publishes can reuse it.
Public catalog
/api/public/skills returns up to 100 published skills, optionally filtered:
| Query | Type | Purpose |
|---|---|---|
category | string | Filter by category. |
q | string | Substring match on name and description. |
sort | popular | new | popular ranks by forkCount + runCount; new (default) ranks by createdAt. |
/api/public/skill/{slug} returns the full row including prompt text. Both endpoints are no-auth, Cache-Control: public, s-maxage=300.
Discovering skills from MCP
These tools are also available over MCP — see MCP tools reference:create_skill,list_skills,run_skill,publish_skill,fork_skill— authenticated.browse_public_skills— public.
run_skill returns the skill’s prompt and metadata; execution happens in the calling agent (Claude Code, Cursor, sf agent, etc.) — the SimpleFunctions server does not run the prompt itself.
See also
MCP tools reference
create_skill, fork_skill, publish_skill, full schemas.Build agents
How skills compose with the SimpleFunctions agent loop.
Agentic CLI
Built-in skills are bundled here;
sf agent recognizes their slash commands.Browse public skills
Live catalog on the website.