Skip to content

Commit b947e2b

Browse files
Add Calendly and my-contacts skill templates
Calendly skill teaches the agent to fetch scheduled events and invitee details via the Calendly REST API using a Personal Access Token. my-contacts skill provides contact lookup from a local JSON file, enabling name-based WhatsApp messaging and phone/email lookups. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6701ff3 commit b947e2b

3 files changed

Lines changed: 175 additions & 0 deletions

File tree

skills/calendly/SKILL.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
---
2+
name: calendly
3+
description: Calendly API for listing scheduled events and invitee details.
4+
homepage: https://developer.calendly.com
5+
metadata:
6+
{
7+
"openclaw":
8+
{
9+
"emoji": "📅",
10+
"requires": { "env": ["CALENDLY_API_KEY"] },
11+
"primaryEnv": "CALENDLY_API_KEY",
12+
},
13+
}
14+
---
15+
16+
# calendly
17+
18+
Use the Calendly API to list scheduled events, get event details, and fetch invitee information.
19+
Authentication uses a Personal Access Token (PAT) via the `CALENDLY_API_KEY` environment variable.
20+
21+
Base URL: `https://api.calendly.com`
22+
23+
## Setup
24+
25+
1. Go to Calendly > Settings > Integrations > API & Webhooks.
26+
2. Click "Get a token now" and copy the PAT.
27+
3. The token is injected as `$CALENDLY_API_KEY`.
28+
29+
## Step 1 — Get your user URI (needed for all other calls)
30+
31+
```bash
32+
curl -s --request GET \
33+
--url https://api.calendly.com/users/me \
34+
--header "Authorization: Bearer $CALENDLY_API_KEY" \
35+
--header 'Content-Type: application/json'
36+
```
37+
38+
Response contains `resource.uri` (e.g. `https://api.calendly.com/users/AAAA...`) — use this as the `user` parameter for listing events.
39+
40+
## Step 2 — List scheduled events
41+
42+
```bash
43+
curl -s --request GET \
44+
--url 'https://api.calendly.com/scheduled_events?user=USER_URI&min_start_time=2026-02-13T00:00:00.000000Z&max_start_time=2026-02-14T00:00:00.000000Z&status=active&sort=start_time:asc&count=20' \
45+
--header "Authorization: Bearer $CALENDLY_API_KEY" \
46+
--header 'Content-Type: application/json'
47+
```
48+
49+
Replace `USER_URI` with the full URI from Step 1. Adjust `min_start_time` and `max_start_time` for the desired date range (ISO 8601 UTC).
50+
51+
Response fields per event in `collection[]`:
52+
53+
- `uri` — event URI (contains UUID)
54+
- `name` — event type name (e.g. "30 Minute Meeting")
55+
- `start_time` / `end_time` — ISO 8601 UTC
56+
- `status``active` or `canceled`
57+
- `location.type` and `location.location` — meeting location
58+
- `invitees_counter.total` — number of invitees
59+
- `event_guests[].email` — guest emails
60+
61+
## Step 3 — Get invitees for a specific event
62+
63+
Extract the event UUID from the event URI (last path segment), then:
64+
65+
```bash
66+
curl -s --request GET \
67+
--url 'https://api.calendly.com/scheduled_events/EVENT_UUID/invitees?status=active&count=20' \
68+
--header "Authorization: Bearer $CALENDLY_API_KEY" \
69+
--header 'Content-Type: application/json'
70+
```
71+
72+
Response fields per invitee in `collection[]`:
73+
74+
- `name` — invitee full name
75+
- `first_name` / `last_name`
76+
- `email` — invitee email
77+
- `status``active` or `canceled`
78+
- `timezone` — invitee timezone
79+
- `questions_and_answers[]` — custom question responses
80+
- `text_reminder_number` — phone number (if provided)
81+
- `cancel_url` / `reschedule_url` — links for the invitee
82+
83+
## Step 4 — List event types (scheduling links)
84+
85+
```bash
86+
curl -s --request GET \
87+
--url 'https://api.calendly.com/event_types?user=USER_URI&active=true&count=20' \
88+
--header "Authorization: Bearer $CALENDLY_API_KEY" \
89+
--header 'Content-Type: application/json'
90+
```
91+
92+
Response fields per event type in `collection[]`:
93+
94+
- `uri` — event type URI
95+
- `name` — display name (e.g. "30 Minute Meeting")
96+
- `slug` — URL slug
97+
- `scheduling_url` — full booking link
98+
- `duration` — duration in minutes
99+
- `active` — whether this event type is active
100+
101+
## Common workflows
102+
103+
**Fetch today's meetings:**
104+
105+
1. `GET /users/me` → extract `resource.uri`
106+
2. `GET /scheduled_events?user=<uri>&min_start_time=<today_start>&max_start_time=<today_end>&status=active`
107+
108+
**Get details about who booked a meeting:**
109+
110+
1. List events (above)
111+
2. For each event, `GET /scheduled_events/<uuid>/invitees`
112+
113+
**Share a booking link:**
114+
115+
1. `GET /event_types?user=<uri>&active=true`
116+
2. Use `scheduling_url` from the desired event type
117+
118+
## Notes
119+
120+
- All times are in UTC (ISO 8601 with microseconds: `2026-02-13T00:00:00.000000Z`).
121+
- The free plan supports reading events and invitees. Creating events via API requires a paid plan.
122+
- Pagination: if `pagination.next_page` is not null, fetch that URL for more results.
123+
- Rate limit: 100 requests per minute per token.
124+
- Always use `--header "Authorization: Bearer $CALENDLY_API_KEY"` for auth.

skills/my-contacts/SKILL.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
name: my-contacts
3+
description: Look up contact information (phone, email, notes) from a local JSON file.
4+
metadata: { "openclaw": { "emoji": "📇", "always": true } }
5+
---
6+
7+
# my-contacts
8+
9+
Look up contact details from the local contacts file.
10+
11+
## Usage
12+
13+
Read the contacts file to find a person's phone number, email, or other details:
14+
15+
```bash
16+
cat ~/.openclaw/skills/my-contacts/contacts.json
17+
```
18+
19+
The file contains a JSON object with a `contacts` array. Each contact has:
20+
21+
- `name` — full name
22+
- `phone` — phone number (with country code, e.g. +1...)
23+
- `email` — email address
24+
- `notes` — any extra context (relationship, company, etc.)
25+
26+
## When to use
27+
28+
- User asks "what's [name]'s phone number / email?"
29+
- User says "send a message to [name]" — look up their number first
30+
- User says "call [name]" or "text [name]"
31+
- User wants to send a WhatsApp message to a contact by name
32+
33+
## Example
34+
35+
If the user says "send a WhatsApp message to John", read the contacts file, find John's entry, and use his phone number.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"contacts": [
3+
{
4+
"name": "Jane Doe",
5+
"phone": "+15551234567",
6+
"email": "jane@example.com",
7+
"notes": "Friend, works at Acme Corp"
8+
},
9+
{
10+
"name": "John Smith",
11+
"phone": "+15559876543",
12+
"email": "john@example.com",
13+
"notes": "College roommate"
14+
}
15+
]
16+
}

0 commit comments

Comments
 (0)