google-tasks-apiGoogle Tasks API integration with managed OAuth. Manage task lists and tasks with full CRUD operations. Use this skill when users want to read, create, update, or delete tasks and task lists in Google Tasks. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Install via ClawdBot CLI:
clawdbot install byungkyu/google-tasks-apiAccess the Google Tasks API with managed OAuth authentication. Manage task lists and tasks with full CRUD operations.
# List all task lists
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/google-tasks/tasks/v1/users/@me/lists')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/google-tasks/{native-api-path}
Replace {native-api-path} with the actual Google Tasks API endpoint path. The gateway proxies requests to tasks.googleapis.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Google Tasks OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=google-tasks&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
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-tasks'}).encode()
req = urllib.request.Request('https://ctrl.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
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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": "0e13cacd-cec8-4b6b-9368-c62cc9b06dd9",
"status": "ACTIVE",
"creation_time": "2026-02-07T02:35:51.002199Z",
"last_updated_time": "2026-02-07T05:32:30.369186Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-tasks",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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 Google Tasks connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/google-tasks/tasks/v1/users/@me/lists')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '0e13cacd-cec8-4b6b-9368-c62cc9b06dd9')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /google-tasks/tasks/v1/users/@me/lists
Query Parameters:
maxResults - Maximum number of task lists to return (default: 20, max: 100)pageToken - Token for paginationResponse:
{
"kind": "tasks#taskLists",
"etag": "\"OW7pv01-vgQ\"",
"items": [
{
"kind": "tasks#taskList",
"id": "MDEzMTQ2ODk4NDc2ODkyOTIyMTE6MDow",
"etag": "\"Yz7ljQZ5Xuw\"",
"title": "My Tasks",
"updated": "2023-09-18T06:12:59.468Z",
"selfLink": "https://www.googleapis.com/tasks/v1/users/@me/lists/MDEzMTQ2ODk4NDc2ODkyOTIyMTE6MDow"
}
]
}
GET /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
POST /google-tasks/tasks/v1/users/@me/lists
Content-Type: application/json
{
"title": "New Task List"
}
Response:
{
"kind": "tasks#taskList",
"id": "OFYyU09veWMyWl84SjNQXw",
"etag": "\"XTqLSxP4QZQ\"",
"title": "New Task List",
"updated": "2026-02-07T05:45:22.685Z",
"selfLink": "https://www.googleapis.com/tasks/v1/users/@me/lists/OFYyU09veWMyWl84SjNQXw"
}
PATCH /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Content-Type: application/json
{
"title": "Updated Title"
}
PUT /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
Content-Type: application/json
{
"title": "Replaced Title"
}
DELETE /google-tasks/tasks/v1/users/@me/lists/{tasklistId}
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks
Query Parameters:
maxResults - Maximum number of tasks to return (default: 20, max: 100)pageToken - Token for paginationshowCompleted - Include completed tasks (default: true)showDeleted - Include deleted tasks (default: false)showHidden - Include hidden tasks (default: false)dueMin - Lower bound for due date (RFC 3339 timestamp)dueMax - Upper bound for due date (RFC 3339 timestamp)completedMin - Lower bound for completion date (RFC 3339 timestamp)completedMax - Upper bound for completion date (RFC 3339 timestamp)updatedMin - Lower bound for last update time (RFC 3339 timestamp)Response:
{
"kind": "tasks#tasks",
"etag": "\"Jhh35adkRkU\"",
"nextPageToken": "CgwI27nR6AUQsKHh7QIa...",
"items": [
{
"kind": "tasks#task",
"id": "blJQR1hfaXhSU0tMY3gwdg",
"etag": "\"Uqc8Y3T9VOA\"",
"title": "Example Task",
"updated": "2020-11-09T21:17:08.911Z",
"selfLink": "https://www.googleapis.com/tasks/v1/lists/.../tasks/blJQR1hfaXhSU0tMY3gwdg",
"position": "00000000000000000000",
"status": "needsAction",
"due": "2020-12-08T00:00:00.000Z",
"notes": "Task notes here",
"links": [],
"webViewLink": "https://tasks.google.com/task/nRPGX_ixRSKLcx0v?sa=6"
}
]
}
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks
Content-Type: application/json
{
"title": "New Task",
"notes": "Task description",
"due": "2026-03-01T00:00:00.000Z"
}
Query Parameters (optional):
parent - Parent task ID (for subtasks)previous - Previous sibling task ID (for positioning)Response:
{
"kind": "tasks#task",
"id": "bkludnJmdjZIZWVFejBnYg",
"etag": "\"EKX4SVb-Ljk\"",
"title": "New Task",
"updated": "2026-02-07T05:45:05.371Z",
"selfLink": "https://www.googleapis.com/tasks/v1/lists/.../tasks/bkludnJmdjZIZWVFejBnYg",
"position": "00000000000000000000",
"notes": "Task description",
"status": "needsAction",
"due": "2026-03-01T00:00:00.000Z",
"links": [],
"webViewLink": "https://tasks.google.com/task/nInvrfv6HeeEz0gb?sa=6"
}
PATCH /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Updated Task Title",
"status": "completed"
}
Response:
{
"kind": "tasks#task",
"id": "bkludnJmdjZIZWVFejBnYg",
"etag": "\"OeWHIDNj-os\"",
"title": "Updated Task Title",
"updated": "2026-02-07T05:45:15.334Z",
"selfLink": "https://www.googleapis.com/tasks/v1/lists/.../tasks/bkludnJmdjZIZWVFejBnYg",
"position": "00000000000000000000",
"notes": "Task description",
"status": "completed",
"completed": "2026-02-07T05:45:15.307Z",
"links": [],
"webViewLink": "https://tasks.google.com/task/nInvrfv6HeeEz0gb?sa=6"
}
PUT /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Content-Type: application/json
{
"title": "Replaced Task",
"notes": "New notes",
"status": "needsAction"
}
DELETE /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}
Reposition a task within a task list or change its parent.
POST /google-tasks/tasks/v1/lists/{tasklistId}/tasks/{taskId}/move
Query Parameters (optional):
parent - New parent task ID (for making it a subtask)previous - Previous sibling task ID (for positioning after this task)Response:
{
"kind": "tasks#task",
"id": "VkI5bTEzazdvNzlYNWVycw",
"etag": "\"Uplv6eL0sDo\"",
"title": "Task B",
"updated": "2026-02-07T05:45:36.801Z",
"selfLink": "https://www.googleapis.com/tasks/v1/lists/.../tasks/VkI5bTEzazdvNzlYNWVycw",
"position": "00000000000000000001",
"status": "needsAction",
"links": [],
"webViewLink": "https://tasks.google.com/task/VB9m13k7o79X5ers?sa=6"
}
Delete all completed tasks from a task list.
POST /google-tasks/tasks/v1/lists/{tasklistId}/clear
Returns HTTP 204 No Content on success.
| Field | Type | Description |
|-------|------|-------------|
| kind | string | Always "tasks#task" (output only) |
| id | string | Task identifier |
| etag | string | ETag of the resource |
| title | string | Task title (max 1024 characters) |
| updated | string | Last modification time (RFC 3339, output only) |
| selfLink | string | URL to this task (output only) |
| parent | string | Parent task ID (output only) |
| position | string | Position among siblings (output only) |
| notes | string | Task notes (max 8192 characters) |
| status | string | "needsAction" or "completed" |
| due | string | Due date (RFC 3339 timestamp) |
| completed | string | Completion date (RFC 3339, output only) |
| deleted | boolean | Whether task is deleted |
| hidden | boolean | Whether task is hidden |
| links | array | Collection of links (output only) |
| webViewLink | string | Link to task in Google Tasks UI (output only) |
| Field | Type | Description |
|-------|------|-------------|
| kind | string | Always "tasks#taskList" (output only) |
| id | string | Task list identifier |
| etag | string | ETag of the resource |
| title | string | Task list title (max 1024 characters) |
| updated | string | Last modification time (RFC 3339, output only) |
| selfLink | string | URL to this task list (output only) |
Use maxResults and pageToken for pagination:
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks?maxResults=50
Response includes nextPageToken when more results exist:
{
"kind": "tasks#tasks",
"etag": "...",
"nextPageToken": "CgwI27nR6AUQsKHh7QIa...",
"items": [...]
}
Use the nextPageToken value in subsequent requests:
GET /google-tasks/tasks/v1/lists/{tasklistId}/tasks?maxResults=50&pageToken=CgwI27nR6AUQsKHh7QIa...
// List all task lists
const response = await fetch(
'https://gateway.maton.ai/google-tasks/tasks/v1/users/@me/lists',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
// Create a new task
const createResponse = await fetch(
`https://gateway.maton.ai/google-tasks/tasks/v1/lists/${tasklistId}/tasks`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: 'New Task',
notes: 'Task description',
due: '2026-03-01T00:00:00.000Z'
})
}
);
import os
import requests
# List all task lists
response = requests.get(
'https://gateway.maton.ai/google-tasks/tasks/v1/users/@me/lists',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
# Create a new task
create_response = requests.post(
f'https://gateway.maton.ai/google-tasks/tasks/v1/lists/{tasklist_id}/tasks',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
json={
'title': 'New Task',
'notes': 'Task description',
'due': '2026-03-01T00:00:00.000Z'
}
)
curl -g when URLs contain brackets 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 Google Tasks connection |
| 401 | Invalid or missing Maton API key |
| 404 | Task or task list not found |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Google Tasks API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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
google-tasks. For example:https://gateway.maton.ai/google-tasks/tasks/v1/users/@me/listshttps://gateway.maton.ai/tasks/v1/users/@me/listsGenerated Mar 1, 2026
Individuals can automate daily task tracking and reminders by integrating Google Tasks with personal productivity tools. This enables seamless synchronization of to-do lists across devices, helping users stay organized and prioritize work efficiently.
Small teams can use this skill to manage shared task lists for projects, assigning and updating tasks via automated workflows. It facilitates real-time collaboration and progress tracking without manual updates, improving team efficiency.
Support teams can integrate Google Tasks to create and track customer issue tickets as tasks, automating status updates and follow-ups. This streamlines response handling and ensures timely resolution of inquiries.
Content creators can automate task creation for editorial calendars, scheduling writing, editing, and publishing steps. This helps manage deadlines and coordinate with collaborators, reducing manual oversight.
Event organizers can use the skill to generate task lists for planning stages, such as vendor coordination and logistics. Automated updates keep teams aligned and ensure all preparations are on track.
Companies can embed this skill into their SaaS platforms to offer Google Tasks synchronization as a premium feature. This adds value for users seeking unified task management, driving subscription upgrades and retention.
Agencies can provide setup and customization services for businesses integrating Google Tasks into their workflows. This includes automation design and training, generating revenue through project-based contracts.
Developers can build a free app that uses this skill for basic task management, with advanced features like analytics and team collaboration behind a paywall. This model attracts users and monetizes through in-app purchases.
💬 Integration Tip
Start by setting up the Maton API key and a single OAuth connection, then test with simple GET requests to list tasks before implementing CRUD operations.
Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
Connect to 100+ APIs (Google Workspace, Microsoft 365, GitHub, Notion, Slack, Airtable, HubSpot, etc.) with managed OAuth. Use this skill when users want to...
Build, debug, and deploy websites using HTML, CSS, JavaScript, and modern frameworks following production best practices.
YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Scaffold, test, document, and debug REST and GraphQL APIs. Use when the user needs to create API endpoints, write integration tests, generate OpenAPI specs, test with curl, mock APIs, or troubleshoot HTTP issues.
Search for jobs across LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs, Bayt, Naukri, and BDJobs using the JobSpy MCP server.