OpenClaw Skills System: Extending Your AI Assistant with Custom Capabilities

Out of the box, OpenClaw gives Claude access to a powerful set of tools: browser automation, shell execution, file operations, web search, and messaging. But what happens when you need something that isn't built in β a custom integration, a specialized workflow, or a third-party API?
That's where the skills system comes in.
OpenClaw skills are modular extensions that add new capabilities to your AI assistant. Each skill is a self-contained directory containing the tools, documentation, and configuration needed for a specific integration. Install a skill and your assistant gains the ability to interact with a new system β whether that's controlling smart home devices, querying a custom database, or interfacing with a specialized API.
This guide explains how the skills system works and how to create your own.
Understanding the Skills Architecture
OpenClaw's skill system follows a modular architecture where each skill is a self-contained directory
Every skill in OpenClaw lives in the skills/ directory of your workspace. The structure is standardized:
skills/
βββ google-calendar/
β βββ SKILL.md # Documentation for Claude
β βββ list-events.js # Tool implementation
β βββ create-event.js # Tool implementation
β βββ package.json # Dependencies
βββ spotify/
β βββ SKILL.md
β βββ play.sh
β βββ current-track.sh
βββ custom-api/
βββ SKILL.md
βββ query.py
The SKILL.md file is the key element. It's a plain markdown file that OpenClaw loads into the system context at session start, teaching Claude how to use the skill's tools. When you ask your assistant to do something that matches a skill's capabilities, it knows exactly how to call the right tools with the right parameters.
This architecture keeps skills:
- Isolated β Skills don't interfere with each other or the core system
- Discoverable β Claude reads SKILL.md and knows what's available
- Self-documenting β The tool documentation lives next to the implementation
- Language-agnostic β Skills can be JavaScript, Python, Bash, or any executable
Step 1: Explore Existing Skills
Before building custom skills, explore what's already available in the OpenClaw ecosystem
To see what skills are currently installed in your workspace:
ls ~/openclaw-workspace/skills/
And to read a skill's documentation, Claude can access it directly:
"Read the SKILL.md for the google-calendar skill and tell me what it can do."
Common pre-built skills in the OpenClaw ecosystem include:
- google-calendar β List events, create meetings, check availability
- gmail β Read, send, search email (with proper OAuth setup)
- spotify β Control playback, get current track, manage playlists
- github β Create issues, read PRs, manage repositories
- notion β Read pages, create notes, query databases
- elevenlabs β Text-to-speech with voice selection
Each skill comes with its own setup instructions in SKILL.md. Some require API keys or OAuth flows β the SKILL.md explains exactly what's needed.
Step 2: Install a New Skill
Installing a skill means adding its directory with proper SKILL.md documentation
Installing a skill is as simple as adding its directory to your skills/ folder. Here's how to install a community skill from GitHub:
cd ~/openclaw-workspace/skills/
git clone https://github.com/openclaw-community/skill-weather weather
Or create the directory manually:
mkdir -p ~/openclaw-workspace/skills/my-api
After adding a skill, restart your OpenClaw session (or use /reload) and Claude will automatically pick up the new SKILL.md and learn the new tools.
Best practice: After installing a skill, test it immediately with a simple request:
"Using the weather skill, what's the current weather in London?"
If Claude attempts the right tool call (even if it needs configuration), the skill is recognized. If Claude has no idea what you're talking about, check that SKILL.md exists and is readable.
Step 3: Build a Custom Skill
Custom skills connect OpenClaw to any API or system through a standardized tool interface
Creating a custom skill has three parts: the implementation, the SKILL.md documentation, and optional dependencies.
Example: A custom skill for querying a Postgres database
First, create the skill directory:
mkdir -p ~/openclaw-workspace/skills/my-database
cd ~/openclaw-workspace/skills/my-database
Create the tool script (query.py):
#!/usr/bin/env python3
import sys
import json
import psycopg2
import os
conn = psycopg2.connect(os.environ["DATABASE_URL"])
query = sys.argv[1]
try:
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
rows = [dict(zip(columns, row)) for row in results]
print(json.dumps(rows, indent=2, default=str))
except Exception as e:
print(json.dumps({"error": str(e)}))
finally:
conn.close()
Make it executable:
chmod +x query.py
pip install psycopg2-binary
Now create the SKILL.md that tells Claude how to use it:
# my-database Skill
## Overview
Query the production PostgreSQL database using read-only SQL.
## Tools
### query.py
Execute a SQL SELECT query against the database.
**Usage:**
```bash
python ~/openclaw-workspace/skills/my-database/query.py "SELECT * FROM users LIMIT 10"
Returns: JSON array of rows
Examples:
- Get recent orders:
SELECT id, customer, total FROM orders ORDER BY created_at DESC LIMIT 20 - Count users by status:
SELECT status, COUNT(*) FROM users GROUP BY status
Setup
Set environment variable: DATABASE_URL=postgresql://user:pass@host:5432/dbname
Limitations
- Read-only queries only (no INSERT, UPDATE, DELETE)
- Maximum 1000 rows returned per query
That's it. Your database skill is ready. Next session, Claude will read this SKILL.md and know exactly how to query your database by calling `query.py`.
## Step 4: Advanced Skill Features

*Advanced skills include state management, authentication handling, and multi-tool workflows*
More sophisticated skills include:
**State management** β Skills can write state files to maintain context between tool calls. A shopping skill might track a cart in `skills/shopping/state/cart.json`.
**Authentication** β Skills that require OAuth (Google, Notion, Spotify) include auth setup scripts. The SKILL.md documents the one-time auth flow.
**Multi-tool skills** β Complex integrations expose multiple tools. A GitHub skill might have separate scripts for `create-issue.js`, `list-prs.js`, `merge-pr.js` β each documented separately in SKILL.md.
**Streaming output** β For tools that produce continuous output (logs, real-time data), skills can stream results to a file that Claude monitors.
For managing tool behavior across sessions, see the [OpenClaw CLI commands reference](/openclaw-cli-commands-reference) and [OpenClaw heartbeat system guide](/openclaw-heartbeat-system-guide).
## Real-World Skill Examples
Skills solve problems that built-in tools can't. Here are patterns from the community:
- **Home automation skill** β Wraps Home Assistant's REST API to control lights, thermostat, locks from Claude
- **Analytics skill** β Queries Google Analytics or Posthog and formats results as readable reports
- **Customer database skill** β Lets Claude look up customer records, order history, support tickets
- **CI/CD skill** β Triggers GitHub Actions workflows, reads build logs, reports deployment status
- **Trading skill** β Queries portfolio data, calculates P&L, checks market prices
The pattern is always the same: a script that calls an API or system, a SKILL.md that explains how Claude should call that script.
## Frequently Asked Questions

*Common questions about creating and managing OpenClaw skills*
**What languages can skills be written in?**
Any language that produces executable output β Python, JavaScript, Bash, Go, Ruby. Whatever runs on your system.
**How does Claude know which skills are available?**
OpenClaw loads all `SKILL.md` files from the skills directory into the system context at session start. Claude reads them and learns the available tools.
**Can skills call other skills?**
Yes. A skill script can call other skill scripts directly. Be careful about circular dependencies and excessive nesting.
**How do I handle API keys securely?**
Store API keys in environment variables (e.g., in `~/.bashrc` or a `.env` file loaded at startup). Never hardcode credentials in skill scripts or SKILL.md files.
**Can I share skills with other OpenClaw users?**
Yes. The OpenClaw community shares skills as GitHub repositories. Follow the standard structure (directory + SKILL.md + executable scripts) and others can install it with a git clone.
## Conclusion

*The skills system transforms OpenClaw from a general-purpose AI into a personalized assistant tuned to your exact environment*
The skills system is what turns OpenClaw from a general-purpose AI assistant into a personalized one. By teaching Claude the tools specific to your environment β your databases, your APIs, your automation systems β you create an assistant that can actually act in your world, not just talk about it.
Start with a simple skill: wrap one API endpoint, write a minimal SKILL.md, and test it. Once you see how quickly it integrates, you'll find yourself building skills for everything.
For further reading, see the [OpenClaw file tools tutorial](/openclaw-file-tools-tutorial) for understanding built-in tool capabilities, and the [multi-agent AI systems guide](/multi-agent-ai-systems-guide) for orchestrating complex workflows across skills. The [MCP protocol tutorial](/mcp-model-context-protocol-tutorial) also covers a standardized approach to tool integration that complements the skills system.
More Articles
The Ultimate OpenClaw AWS Setup Guide

The definitive guide to setting up OpenClaw on AWS. Includes spot instance configuration, cost optimization, and step-by-step instructions.
Building AI Workflows with Tool Chaining in OpenClaw
Master the art of chaining tools and function calls to build powerful multi-step AI automation workflowsβfrom data extraction to content generation and deployment.
Cost Optimization Guide for Self-Hosted AI Assistants: Run Claude on a Budget
Practical strategies to reduce API costs for self-hosted AI assistantsβsmart model routing, caching, batching, and OpenClaw-specific optimizations to run Claude affordably.