OpenClaw becomes truly powerful when it stops just talking and starts doing. Up until now, we’ve given it a brain (LLMs), a voice (TTS), and eyes (Vision). Today, we give it hands. We are going to build a custom Skill.
A “Skill” in OpenClaw is essentially a tool definition that maps a user’s natural language request to an executable command or script. In this tutorial, we’ll build a bridge to Memos, an open-source, self-hosted note-taking service (think of it as a private Twitter or lightweight Notion).
By the end of this post, you’ll be able to say “Remind me to buy milk” or “Save this code snippet to my notes”, and OpenClaw will persist it to your private server.
Why Memos?
Memos is lightweight, supports Markdown, and has a clean REST API. It’s the perfect candidate for a “Long-Term Memory” store for your AI agent.
Step 1: The Architecture of a Skill
An OpenClaw skill typically consists of two parts:
- ** The Tool Definition:** Describes to the LLM what the tool does and how to use it.
- The Execution Logic: A script (Python, Bash, Node) that actually performs the work.
Step 2: The Python Script
First, let’s create a simple Python script that sends data to your Memos instance. We’ll place this in our workspace skills directory.
Create skills/memos/memo_add.py:
import requests
import sys
import json
# Configuration (Load from env or args in production)
MEMOS_URL = "https://memos.example.com"
OPENAPI_TOKEN = "your_token_here"
def create_memo(content):
url = f"{MEMOS_URL}/api/v1/memos"
headers = {
"Authorization": f"Bearer {OPENAPI_TOKEN}",
"Content-Type": "application/json"
}
data = {"content": content}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
print(f"Success: {response.json()['name']}")
else:
print(f"Error: {response.text}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python memo_add.py <content>")
sys.exit(1)
content = sys.argv[1]
create_memo(content)
Step 3: Teaching OpenClaw the Skill
Now we need to tell OpenClaw that this script exists. We do this by defining a Tool. Depending on your OpenClaw configuration version, this might go in a tools.json or directly in your system prompt via a TOOLS.md file.
Here is the tool definition we want the LLM to see:
{
"name": "save_memo",
"description": "Save a text note or reminder to the user's Memos service.",
"parameters": {
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "The text content to save."
}
},
"required": ["content"]
}
}
And we map this tool to our command:
python3 /home/james/.openclaw/workspace/skills/memos/memo_add.py "{{content}}"
Step 4: Testing the Integration
Restart your OpenClaw agent to reload the tool definitions. Now, try it out:
User: “Remember that the server IP is 192.168.1.50”
OpenClaw: Thinking… I should use the save_memo tool. Executes: python3 memo_add.py “Server IP is 192.168.1.50”
OpenClaw: “I’ve saved that to your memos.”
Going Further
This is just the beginning. You could expand this skill to:
- Search notes: Add a
search_memostool to let the AI recall information. - Summarize days: Have the AI read all notes from yesterday and generate a morning summary.
- Journaling: Dictate your thoughts to OpenClaw and have it organize them into tagged entries.
By building custom skills, you transform your AI from a passive chatbot into an active participant in your digital life.
Next up, we’ll look at how to use OpenClaw to automate office work by generating documents and presentations.