원클릭으로
Check availability, create scheduling links, or list upcoming events in Calendly
npx skills add https://github.com/ferosai/feros --skill calendly이 명령을 Claude Code에 복사하여 붙여넣어 스킬을 설치하세요
Check availability, create scheduling links, or list upcoming events in Calendly
npx skills add https://github.com/ferosai/feros --skill calendly이 명령을 Claude Code에 복사하여 붙여넣어 스킬을 설치하세요
Read or update contacts, opportunities, notes, and conversations in GoHighLevel
Save or retrieve records from Airtable bases
Send emails, SMS, or manage contacts via Brevo (formerly Sendinblue)
Manage bookings, availability, and event types in Cal.com
Create or update tasks and lists in ClickUp
Call any custom HTTPS endpoint
| name | calendly |
| display_name | Calendly |
| description | Check availability, create scheduling links, or list upcoming events in Calendly |
| auth_type | oauth2 |
| category | scheduling |
When the user wants their voice agent to interact with Calendly scheduling. Common triggers:
Check connection via check_connection("calendly").
If not connected: Use secret("calendly") in tool scripts. The system
will automatically emit the correct action card based on the platform
configuration. Do NOT emit action cards manually.
Get current user (required for most endpoints):
api_call("calendly", "GET", "/users/me") → returns user URI needed for other callsDiscover event types:
api_call("calendly", "GET", "/event_types?user={user_uri}") → list scheduling links/event types{
"name": "calendly.get_scheduling_link",
"description": "Get the Calendly booking URL for a specific event type to share with the caller",
"params": [
{"name": "event_type_name", "description": "Name of the event type (e.g. '30 Minute Meeting')", "type": "string", "required": true}
],
"script": "let key = secret('calendly');\nlet userResp = http_get_h('https://api.calendly.com/users/me', {'Authorization': 'Bearer ' + key});\nif (userResp.status < 200 || userResp.status >= 300) { throw new Error(`Calendly ${userResp.status}: ${userResp.body}`); }\nlet userUri = JSON.parse(userResp.body).resource.uri;\nlet etResp = http_get_h('https://api.calendly.com/event_types?user=' + encodeURIComponent(userUri), {'Authorization': 'Bearer ' + key});\nif (etResp.status < 200 || etResp.status >= 300) { throw new Error(`Calendly ${etResp.status}: ${etResp.body}`); }\nlet types = JSON.parse(etResp.body).collection;\nlet match = types.find(t => t.name.toLowerCase().includes(event_type_name.toLowerCase()));\nif (!match) { return 'No matching event type found.'; }\nreturn match.scheduling_url;",
"side_effect": false
}
{
"name": "calendly.list_events",
"description": "List upcoming scheduled Calendly events",
"params": [
{"name": "count", "description": "Number of events to return (max 20)", "type": "string", "required": false}
],
"script": "let key = secret('calendly');\nlet userResp = http_get_h('https://api.calendly.com/users/me', {'Authorization': 'Bearer ' + key});\nif (userResp.status < 200 || userResp.status >= 300) { throw new Error(`Calendly ${userResp.status}: ${userResp.body}`); }\nlet userUri = JSON.parse(userResp.body).resource.uri;\nlet n = count || '5';\nlet resp = http_get_h('https://api.calendly.com/scheduled_events?user=' + encodeURIComponent(userUri) + '&count=' + n + '&status=active', {'Authorization': 'Bearer ' + key});\nif (resp.status >= 200 && resp.status < 300) { return resp.body; }\nthrow new Error(`Calendly ${resp.status}: ${resp.body}`);",
"side_effect": false
}
secret("calendly") for credentials/users/me firstthrow using resp.status/resp.body