Full access to Twenty CRM (People, Companies, Opportunities, Tasks, Notes) using curl and the Twenty REST API directly - no MCP server or additional dependencies required.
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
_auth.shcheck-auth.shcompanies/create.shcompanies/delete.shcompanies/get.shcompanies/list.shcompanies/update.shconfig.json.examplemetadata/object.shmetadata/objects.shnotes/create.shnotes/delete.shnotes/get.shnotes/link.shnotes/list.shnotes/update.shopportunities/create.shopportunities/delete.shopportunities/get.shopportunities/list.shAccess Twenty CRM to manage people, companies, opportunities, tasks, and notes. Supports self-hosted instances with user-provided domain and API key.
Before making API calls, verify the user is authenticated:
bash $SKILL_PATH/check-auth.sh
Returns USER_AUTHENTICATED or USER_NOT_AUTHENTICATED.
All scripts are located at $SKILL_PATH/. Replace $SKILL_PATH with the actual skill directory path.
# List all object types with their fields
bash $SKILL_PATH/metadata/objects.sh [limit]
# Get specific object schema by ID
bash $SKILL_PATH/metadata/object.sh <object_id>
# List all workspace members (team users)
bash $SKILL_PATH/workspace-members/list.sh [limit]
# List workspace members with basic info (id, name, email)
bash $SKILL_PATH/workspace-members/me.sh
Use workspace member IDs for ownerV2Id and assigneeId fields.
# List people (with optional filter, order, limit, depth)
bash $SKILL_PATH/people/list.sh [filter] [order_by] [limit] [depth]
# depth: 0 = basic fields (default), 1 = include relations
# Get person by ID
bash $SKILL_PATH/people/get.sh <person_id>
# Create person
bash $SKILL_PATH/people/create.sh '<json_data>'
# Update person
bash $SKILL_PATH/people/update.sh <person_id> '<json_data>'
# Delete person
bash $SKILL_PATH/people/delete.sh <person_id>
Example - Create person:
bash $SKILL_PATH/people/create.sh '{"name":{"firstName":"John","lastName":"Doe"},"emails":{"primaryEmail":"john@example.com"}}'
# List companies
bash $SKILL_PATH/companies/list.sh [filter] [order_by] [limit] [depth]
# Get company by ID
bash $SKILL_PATH/companies/get.sh <company_id>
# Create company
bash $SKILL_PATH/companies/create.sh '<json_data>'
# Update company
bash $SKILL_PATH/companies/update.sh <company_id> '<json_data>'
# Delete company
bash $SKILL_PATH/companies/delete.sh <company_id>
# List opportunities
bash $SKILL_PATH/opportunities/list.sh [filter] [order_by] [limit] [depth]
# Get opportunity by ID
bash $SKILL_PATH/opportunities/get.sh <opportunity_id>
# Create opportunity
bash $SKILL_PATH/opportunities/create.sh '<json_data>'
# Update opportunity
bash $SKILL_PATH/opportunities/update.sh <opportunity_id> '<json_data>'
# Delete opportunity
bash $SKILL_PATH/opportunities/delete.sh <opportunity_id>
Stages (may vary by instance - use metadata API to discover):
Example - Find opportunities in NEW_LEAD stage:
bash $SKILL_PATH/opportunities/list.sh 'stage[eq]:NEW_LEAD'
Example - Find unowned opportunities:
bash $SKILL_PATH/opportunities/list.sh 'ownerV2Id[is]:NULL'
# List tasks
bash $SKILL_PATH/tasks/list.sh [filter] [order_by] [limit] [depth]
# Get task by ID
bash $SKILL_PATH/tasks/get.sh <task_id>
# Create task
bash $SKILL_PATH/tasks/create.sh '<json_data>'
# Update task
bash $SKILL_PATH/tasks/update.sh <task_id> '<json_data>'
# Delete task
bash $SKILL_PATH/tasks/delete.sh <task_id>
# Link task to opportunity/person/company
bash $SKILL_PATH/tasks/link.sh <task_id> <target_type> <target_id>
Statuses: TODO, IN_PROGRESS, DONE
Example - Create a follow-up task:
bash $SKILL_PATH/tasks/create.sh '{"title":"Follow up call","status":"TODO","dueAt":"2024-12-20T10:00:00Z"}'
Example - Link task to an opportunity:
bash $SKILL_PATH/tasks/link.sh <task-id> opportunity <opportunity-id>
# List notes
bash $SKILL_PATH/notes/list.sh [filter] [order_by] [limit] [depth]
# Get note by ID
bash $SKILL_PATH/notes/get.sh <note_id>
# Create note
bash $SKILL_PATH/notes/create.sh '<json_data>'
# Update note
bash $SKILL_PATH/notes/update.sh <note_id> '<json_data>'
# Delete note
bash $SKILL_PATH/notes/delete.sh <note_id>
# Link note to opportunity/person/company
bash $SKILL_PATH/notes/link.sh <note_id> <target_type> <target_id>
Example - Create a note and link to opportunity:
# Create note
bash $SKILL_PATH/notes/create.sh '{"title":"Meeting notes","bodyV2":{"markdown":"# Key discussion points\n- Budget approved\n- Timeline: Q1 2025"}}'
# Link to opportunity
bash $SKILL_PATH/notes/link.sh <note-id> opportunity <opportunity-id>
All list scripts accept a filter parameter using Twenty's filter syntax:
field[comparator]:value
Comparators:
eq - equalsneq - not equalsin - in array, e.g., stage[in]:[NEW_LEAD,QUALIFICATION]gt, gte, lt, lte - greater/less thanlike, ilike - pattern matching (ilike is case-insensitive)is - NULL check, e.g., ownerV2Id[is]:NULLAdvanced operators:
and(...) - AND conjunctionor(...) - OR conjunctionnot(...) - negationExamples:
# Find people by email domain
bash $SKILL_PATH/people/list.sh 'emails.primaryEmail[ilike]:%@example.com'
# Find opportunities in multiple stages
bash $SKILL_PATH/opportunities/list.sh 'stage[in]:[NEW_LEAD,QUALIFICATION]'
# Find tasks due this week
bash $SKILL_PATH/tasks/list.sh 'dueAt[lte]:2024-12-15' 'dueAt[AscNullsLast]'
# Complex filter with OR
bash $SKILL_PATH/opportunities/list.sh 'or(stage[eq]:NEW_LEAD,ownerV2Id[is]:NULL)'
# Find tasks by status
bash $SKILL_PATH/tasks/list.sh 'status[eq]:TODO'
The order_by parameter controls result sorting:
field[Direction]
Directions: AscNullsFirst, AscNullsLast, DescNullsFirst, DescNullsLast
Example:
bash $SKILL_PATH/opportunities/list.sh '' 'createdAt[DescNullsLast]' 20
Get your API key from your Twenty instance:
/settings/api-webhooks)Create the config file:
mkdir -p ~/.config/twenty-crm
cat > ~/.config/twenty-crm/config.json << 'EOF'
{
"base_url": "https://your-twenty-instance.com",
"api_key": "your-api-key-here"
}
EOF
chmod 600 ~/.config/twenty-crm/config.json
Verify authentication:
bash $SKILL_PATH/check-auth.sh
# 1. List opportunities in NEW_LEAD stage (use depth=1 to include contact info)
bash $SKILL_PATH/opportunities/list.sh 'stage[eq]:NEW_LEAD' '' 50 1
# 2. For a specific opportunity, get the pointOfContact person
bash $SKILL_PATH/people/get.sh <pointOfContactId>
# 1. Create or find the person
bash $SKILL_PATH/people/create.sh '{"name":{"firstName":"Jane","lastName":"Smith"},"emails":{"primaryEmail":"jane@company.com"}}'
# 2. Create opportunity with pointOfContactId
bash $SKILL_PATH/opportunities/create.sh '{"name":"New Deal","stage":"QUALIFICATION","pointOfContactId":"<person-id-from-step-1>"}'
# 1. Create the note
bash $SKILL_PATH/notes/create.sh '{"title":"Call summary","bodyV2":{"markdown":"Discussed pricing options."}}'
# 2. Link note to opportunity
bash $SKILL_PATH/notes/link.sh <note-id> opportunity <opportunity-id>
# 1. Create task with due date
bash $SKILL_PATH/tasks/create.sh '{"title":"Schedule follow-up meeting","status":"TODO","dueAt":"2024-12-20T09:00:00Z"}'
# 2. Link to opportunity
bash $SKILL_PATH/tasks/link.sh <task-id> opportunity <opportunity-id>
Field names may vary between Twenty instances. Use the metadata API to discover the actual schema:
# List all objects to find their IDs
bash $SKILL_PATH/metadata/objects.sh
# Get detailed schema for opportunities (including custom fields)
bash $SKILL_PATH/metadata/object.sh <opportunity-object-id>
Look for fields with type: "RELATION" to find owner/assignee fields, and type: "SELECT" for stage-like fields with options.
Authentication fails:
~/.config/twenty-crm/config.jsonEmpty results:
stage[eq]:NEW_LEAD not stage[eq]:"NEW_LEAD"Permission denied: