Install
openclaw skills install trello-apiTrello API integration with managed OAuth. Manage boards, lists, cards, members, and labels. Use this skill when users want to interact with Trello for project management. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install trello-apiAccess the Trello API with managed OAuth authentication. Manage boards, lists, cards, checklists, labels, and members for project and task management.
CLI:
maton trello board list
maton api '/trello/1/members/me/boards'
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/trello/1/members/me/boards')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/trello/{native-api-path}
Maton proxies requests to api.trello.com and automatically injects your OAuth token.
NPM:
npm install -g @maton-ai/cli
Homebrew:
brew install maton-ai/cli/maton
CLI:
maton login # Opens browser for API key
maton login --interactive # Skip browser, paste API key directly
maton whoami # Show current auth state
Manual:
MATON_API_KEY:export MATON_API_KEY="YOUR_API_KEY"
Manage your Trello OAuth connections at https://api.maton.ai.
CLI:
maton connection list trello --status ACTIVE
maton api -X GET /connections -f app=trello -f status=ACTIVE
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=trello&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection create trello
maton api /connections -f app=trello
Python:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'trello'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
CLI:
maton connection view {connection_id}
maton api /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "trello",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
CLI:
maton connection delete {connection_id}
maton api -X DELETE /connections/{connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Trello connections, specify which one to use:
CLI:
maton trello board list --connection {connection_id}
maton api /trello/1/members/me/boards --connection {connection_id}
Python:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/trello/1/members/me/boards')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always specify the connection to ensure requests go to the intended account.
GET /trello/1/members/me
Example:
maton trello whoami
GET /trello/1/members/{id}
Example:
maton trello member view me
maton trello member view 5f1a2b3c4d5e6f7a8b9c0d1e
GET /trello/1/members/me/boards
Query parameters:
filter - Filter boards: all, open, closed, members, organization, starredfields - Comma-separated fields to includeExample:
maton trello board list --filter all
GET /trello/1/boards/{id}
Query parameters:
fields - Comma-separated fieldslists - Include lists: all, open, closed, nonecards - Include cards: all, open, closed, nonemembers - Include members: all, noneExample:
maton trello board view BOARD_ID --lists open --cards open
POST /trello/1/boards
Content-Type: application/json
{
"name": "Project Alpha",
"desc": "Main project board",
"defaultLists": false,
"prefs_permissionLevel": "private"
}
Example:
maton trello board create --name 'Project Alpha' --desc 'Main project board' --permission private
PUT /trello/1/boards/{id}
Content-Type: application/json
{
"name": "Project Alpha - Updated",
"desc": "Updated description"
}
Example:
maton trello board update BOARD_ID --name 'Project Alpha - Updated' --desc 'Updated description'
DELETE /trello/1/boards/{id}
Example:
maton trello board delete BOARD_ID
GET /trello/1/boards/{id}/lists
Query parameters:
filter - Filter: all, open, closed, noneExample:
maton trello list list --board BOARD_ID --filter open
GET /trello/1/boards/{id}/cards
Example:
maton trello card list --board BOARD_ID
GET /trello/1/boards/{id}/members
Example:
maton trello member list --board BOARD_ID
GET /trello/1/lists/{id}
Example:
maton trello list view LIST_ID
POST /trello/1/lists
Content-Type: application/json
{
"name": "To Do",
"idBoard": "BOARD_ID",
"pos": "top"
}
Example:
maton trello list create --board BOARD_ID --name 'To Do' --pos top
PUT /trello/1/lists/{id}
Content-Type: application/json
{
"name": "In Progress"
}
Example:
maton trello list update LIST_ID --name 'In Progress'
PUT /trello/1/lists/{id}/closed
Content-Type: application/json
{
"value": true
}
Example:
maton trello list update LIST_ID --closed
GET /trello/1/lists/{id}/cards
Example:
maton trello card list --list LIST_ID
POST /trello/1/lists/{id}/moveAllCards
Content-Type: application/json
{
"idBoard": "BOARD_ID",
"idList": "TARGET_LIST_ID"
}
Example:
maton trello card move --from-list LIST_ID --to-list TARGET_LIST_ID --to-board BOARD_ID
GET /trello/1/cards/{id}
Query parameters:
fields - Comma-separated fieldsmembers - Include members (true/false)checklists - Include checklists: all, noneattachments - Include attachments (true/false)Example:
maton trello card view CARD_ID --members --checklists all
POST /trello/1/cards
Content-Type: application/json
{
"name": "Implement feature X",
"desc": "Description of the task",
"idList": "LIST_ID",
"pos": "bottom",
"due": "2025-03-30T12:00:00.000Z",
"idMembers": ["MEMBER_ID"],
"idLabels": ["LABEL_ID"]
}
Example:
maton trello card create --list LIST_ID --name 'Implement feature X' --desc 'Description of the task' --due 2025-03-30T12:00:00.000Z --member-ids MEMBER_ID --label-ids LABEL_ID
PUT /trello/1/cards/{id}
Content-Type: application/json
{
"name": "Updated card name",
"desc": "Updated description",
"due": "2025-04-15T12:00:00.000Z"
}
Example:
maton trello card update CARD_ID --name 'Updated card name' --desc 'Updated description' --due 2025-04-15T12:00:00.000Z
PUT /trello/1/cards/{id}
Content-Type: application/json
{
"idList": "NEW_LIST_ID"
}
Example:
maton trello card update CARD_ID --list NEW_LIST_ID
Example:
maton trello card update CARD_ID --closed
DELETE /trello/1/cards/{id}
Example:
maton trello card delete CARD_ID
POST /trello/1/cards/{id}/actions/comments
Content-Type: application/json
{
"text": "This is a comment"
}
Example:
maton trello card comment CARD_ID --text 'This is a comment'
POST /trello/1/cards/{id}/idMembers
Content-Type: application/json
{
"value": "MEMBER_ID"
}
Example:
maton trello card assign CARD_ID --member MEMBER_ID
DELETE /trello/1/cards/{id}/idMembers/{idMember}
Example:
maton trello card unassign CARD_ID --member MEMBER_ID
POST /trello/1/cards/{id}/idLabels
Content-Type: application/json
{
"value": "LABEL_ID"
}
Example:
maton trello card label CARD_ID --label LABEL_ID
GET /trello/1/checklists/{id}
Example:
maton trello checklist view CHECKLIST_ID
POST /trello/1/checklists
Content-Type: application/json
{
"idCard": "CARD_ID",
"name": "Task Checklist"
}
Example:
maton trello checklist create --card CARD_ID --name 'Task Checklist'
POST /trello/1/checklists/{id}/checkItems
Content-Type: application/json
{
"name": "Subtask 1",
"pos": "bottom"
}
Example:
maton trello checkitem create --checklist CHECKLIST_ID --name 'Subtask 1' --pos bottom
PUT /trello/1/cards/{cardId}/checkItem/{checkItemId}
Content-Type: application/json
{
"state": "complete"
}
Example:
maton trello checkitem update CHECKITEM_ID --card CARD_ID --state complete
DELETE /trello/1/checklists/{id}
Example:
maton trello checklist delete CHECKLIST_ID
GET /trello/1/boards/{id}/labels
Example:
maton trello label list --board BOARD_ID
POST /trello/1/labels
Content-Type: application/json
{
"name": "High Priority",
"color": "red",
"idBoard": "BOARD_ID"
}
Colors: yellow, purple, blue, red, green, orange, black, sky, pink, lime, null (no color)
Example:
maton trello label create --board BOARD_ID --name 'High Priority' --color red
PUT /trello/1/labels/{id}
Content-Type: application/json
{
"name": "Critical",
"color": "red"
}
Example:
maton trello label update LABEL_ID --name Critical --color red
DELETE /trello/1/labels/{id}
Example:
maton trello label delete LABEL_ID
GET /trello/1/search?query=keyword&modelTypes=cards,boards
Query parameters:
query - Search query (required)modelTypes - Comma-separated: actions, boards, cards, members, organizationsboard_fields - Fields to return for boardscard_fields - Fields to return for cardscards_limit - Max cards to return (1-1000)Example:
maton trello search --query keyword --models cards,boards
# List boards as JSON
maton trello board list --json
# Filter with jq — e.g., only open boards by name
# Note: --jq requires --json
maton trello board list --json --jq '.[] | select(.closed == false) | .name'
# Extract specific fields from cards in a list
maton trello card list --list LIST_ID --json --jq '.[] | {id, name, due}'
const headers = {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
};
// Get boards
const boards = await fetch(
'https://api.maton.ai/trello/1/members/me/boards',
{ headers }
).then(r => r.json());
// Create card
await fetch(
'https://api.maton.ai/trello/1/cards',
{
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'New Task',
idList: 'LIST_ID',
desc: 'Task description'
})
}
);
import os
import requests
headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
# Get boards
boards = requests.get(
'https://api.maton.ai/trello/1/members/me/boards',
headers=headers
).json()
# Create card
response = requests.post(
'https://api.maton.ai/trello/1/cards',
headers=headers,
json={
'name': 'New Task',
'idList': 'LIST_ID',
'desc': 'Task description'
}
)
me to reference the authenticated userpos can be top, bottom, or a positive numberfields parameter to limit returned data and improve performancefilter=closedcurl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| 400 | Missing Trello connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 404 | Board, list, or card not found |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Trello API |
CLI:
maton whoami
maton connection list
Manual:
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
trello. For example:https://api.maton.ai/trello/1/members/me/boardshttps://api.maton.ai/1/members/me/boards