# Google Tasks MCP (npm · mcp-google-tasks)

MCP server for the Google Tasks API: task lists, subtasks, due dates, complete and move tasks.

- Trust score: 79/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `mcp-google-tasks`: 79/100 (this document), [markdown](https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks.md), [page](https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks)

## Channel facts

- Registry: `npm`
- Package: `mcp-google-tasks`
- Version: `0.2.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 97 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 73/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3707 tokens (~176/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Google Tasks MCP server?

Google Tasks MCP runs locally as an npm package, launched with npx -y mcp-google-tasks. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add a1-x-tech-mcp-google-tasks -- npx -y mcp-google-tasks
```

### Cursor

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-tasks": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-tasks"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "a1-x-tech-mcp-google-tasks": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-tasks"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add a1-x-tech-mcp-google-tasks -- npx -y mcp-google-tasks
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "a1-x-tech-mcp-google-tasks": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-google-tasks"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add a1-x-tech-mcp-google-tasks --command npx --arg -y --arg mcp-google-tasks
```

### Hermes

```yaml
mcp_servers:
  a1-x-tech-mcp-google-tasks:
    command: "npx"
    args: ["-y", "mcp-google-tasks"]
```

### Netclaw

```json
{
  "McpServers": {
    "a1-x-tech-mcp-google-tasks": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-google-tasks"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add a1-x-tech-mcp-google-tasks -t stdio -c npx -a -y mcp-google-tasks
```

### Other

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-tasks": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-tasks"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 79, +1)

- [security regression] Tool safety: pass → unverified
- [security regression] Stability: 0.67 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Schema quality: 206 → 176
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.1.0 → 0.2.0

### 2026-09-18 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-07 (score 73, +4)

- [functional improvement] Stability: unverified → 0.27

### 2026-08-31 (score 69, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (21)

### `auth_status` (~81 tokens)

Google connection status

Shows whether this server is connected to Google: token presence and source (env variables or a stored in-chat login), expiry, the Google account email, granted vs missing OAuth scopes, where the credentials file lives and where the OAuth client comes from. Makes no network calls and never returns the token itself. Call it first when other tools report the server is not connected.

### `setup_instructions` (~109 tokens)

Setup instructions

Step-by-step checklist for connecting this server to Google: creating a Google Cloud project and a Desktop-app OAuth client, publishing the consent screen (mandatory — Testing-mode refresh tokens die after 7 days), downloading the client JSON and handing its PATH to set_client. Works without any credentials; the checklist shortens to 'enable the API + log in' when an OAuth client is already configured (one client serves the whole mcp-google-* line). Never asks the user to paste secrets into the chat.

### `set_client` (~111 tokens)

Save the OAuth client

Saves the OAuth client credentials from the JSON file downloaded from Google Cloud Console ('Download JSON' on a Desktop-app client). Pass the file PATH — the secret must never be pasted into the chat. The client is stored once in the shared ~/.config/mcp-google-auth/client.json (owner-only) and reused by every mcp-google-* server; tokens stay per-server. After this, call start_login.

Input parameters:

- `path` (string, required): Absolute path to the client_secret_*.json file downloaded from Google Cloud Console.

### `start_login` (~114 tokens)

Start the Google login

First step of connecting from the chat, without editing config files or restarting the client. Returns authorizeUrl — show it to the user as a clickable link and ask them to open it in the browser ON THIS MACHINE, pick the Google account and approve access. A one-shot listener on 127.0.0.1 catches Google's redirect; the code is exchanged locally and never passes through the chat. Does not open the browser itself. The attempt lives 10 minutes; when the browser shows the success page, call finish_login.

### `finish_login` (~116 tokens)

Finish the Google login

Second step: confirms the browser consent finished, saves the tokens to an owner-only file and verifies the login with a read-only identity call, returning the account email and the granted scopes. After success every tool works immediately — no client restart. If the user granted only part of the requested permissions, the login is still saved and missingScopes lists what will not work. Logging in under a different Google account replaces the previous login (its refresh token is revoked best-effort) and the response carries previousAccountEmail so the change never goes unnoticed.

### `logout` (~62 tokens)

Disconnect from Google

Revokes the stored token at Google (oauth2.googleapis.com/revoke) and deletes the local credentials file. Tokens supplied via env variables are NOT touched — remove them from the MCP client config manually; envTokenStillSet in the response says whether any are still in effect.

### `list_tasklists` (~152 tokens)

List task lists

Lists the user's task lists: id, title, updated (RFC3339). Every task lives in exactly one list, so this is the entry point — task tools need a tasklist_id from here (or the "@default" alias for the default list). Paginate with page_token from nextPageToken; page_size caps a page at 1000 and the API's default is already 1000, so one call usually returns everything. The API has no search or ordering — filter client-side.

Input parameters:

- `page_size` (integer): Max task lists per page (1..1000; the API's default is 1000).
- `page_token` (string): nextPageToken from the previous page.

### `get_tasklist` (~91 tokens)

Get a task list

Fetches one task list by id: id, title, updated, selfLink. Accepts "@default" for the user's default list — useful to resolve its real id. The list resource carries only metadata; the tasks themselves come from list_tasks.

Input parameters:

- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `create_tasklist` (~93 tokens)

Create a task list

Creates a new task list and returns it (id, title, updated). The API accepts only a title — there are no other list-level settings. The returned id is the tasklist_id every task tool needs. Google caps the number of lists per account; a quota failure surfaces as an HTTP error, not silence.

Input parameters:

- `title` (string, required): The list title shown in Google Tasks (max 1024 chars).

### `update_tasklist` (~95 tokens)

Rename a task list

Renames a task list (PATCH — the title is the only field the API lets you change). Tasks, their order and their completion state are untouched. Returns the updated list resource.

Input parameters:

- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.
- `title` (string, required): The new list title (max 1024 chars).

### `delete_tasklist` (~107 tokens)

Delete a task list

Deletes a task list AND every task in it, permanently — there is no undo and no trash. The user's default task list cannot be deleted (the API rejects it). To empty a list but keep it, use clear_completed_tasks or delete tasks one by one instead. Returns {deleted:true} with the tasklist_id echoed.

Input parameters:

- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `list_tasks` (~456 tokens)

List tasks

Lists tasks in one list: id, title, notes, status (needsAction|completed), due (date only — the API never stores a time of day), completed timestamp, parent (subtask's parent id), position (opaque sort key within siblings — sort by it client-side; change it only via move_task), updated, deleted/hidden flags, webViewLink. IMPORTANT: tasks completed in Google's own apps are also flagged hidden — pass show_completed=true AND show_hidden=true to reliably see all completed tasks. For incremental sync poll with updated_min plus show_deleted=true and show_hidden=true, so deletions and clears are not missed (the API has no push notifications). due_min/due_max bound the due date; completed_min/completed_max the completion time. Paginate with page_token; page_size caps at 100 (API default 20). Filtering by due/completed dates implies those fields exist — tasks without a due date never match due bounds.

Input parameters:

- `completed_max` (string): Upper bound on the completion date (RFC3339).
- `completed_min` (string): Lower bound on the completion date (RFC3339).
- `due_max` (string): Upper bound on the due date (RFC3339).
- `due_min` (string): Lower bound on the due date (RFC3339).
- `page_size` (integer): Max tasks per page (1..100; the API's default is 20).
- `page_token` (string): nextPageToken from the previous page.
- `show_assigned` (boolean): Include tasks assigned to the user from Google Docs / Chat spaces (API default false).
- `show_completed` (boolean): Include completed tasks (API default true; needs show_hidden=true to catch tasks completed in Google's UI).
- `show_deleted` (boolean): Include deleted tasks (API default false; for sync).
- `show_hidden` (boolean): Include hidden tasks (API default false).
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.
- `updated_min` (string): Only tasks modified after this RFC3339 UTC timestamp (updatedMin) — the sync filter.

### `get_task` (~120 tokens)

Get a task

Fetches one task by id: title, notes, status, due (date only), completed timestamp, parent, position, updated, deleted/hidden flags, links and webViewLink. Also the safe way to verify state after an ambiguous write failure — writes are never retried automatically.

Input parameters:

- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `create_task` (~306 tokens)

Create a task

Creates a task in a list and returns it (id, title, position, webViewLink, ...). due accepts YYYY-MM-DD or an RFC3339 timestamp, but Google Tasks stores only the DATE — any time of day is discarded and never returned. notes is plain text (max 8192 chars); title max 1024 chars. Hierarchy and order are set at creation via parent (the id of an existing task in the same list — the new task becomes its subtask; Google Tasks supports one level of nesting reliably) and previous (the sibling to insert after; omit both to land at the top of the list). New tasks start as needsAction — use complete_task to complete. Recurrence cannot be created or read through the API.

Input parameters:

- `due` (string): Due date: YYYY-MM-DD or RFC3339. Only the date is stored — the time part is discarded.
- `notes` (string): Free-text notes shown under the title (max 8192 chars).
- `parent` (string): Parent task id in the same list — makes the new task a subtask.
- `previous` (string): Sibling task id to insert after (same parent). Omit to insert at the first position.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.
- `title` (string, required): The task title (max 1024 chars).

### `update_task` (~257 tokens)

Update a task

Changes a task's title, notes and/or due date (PATCH — only the provided fields change, at least one is required). clear_due=true / clear_notes=true erase the field entirely (you cannot clear by sending an empty string a Google API would keep). This tool does NOT change completion status (use complete_task / reopen_task), and cannot re-parent or reorder (use move_task) — parent and position are read-only in the task resource. Returns the updated task.

Input parameters:

- `clear_due` (boolean): true removes the due date entirely (do not combine with due).
- `clear_notes` (boolean): true removes the notes entirely (do not combine with notes).
- `due` (string): New due date: YYYY-MM-DD or RFC3339 (only the date is stored).
- `notes` (string): New notes text (max 8192 chars; replaces the old notes).
- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.
- `title` (string): New task title (max 1024 chars).

### `move_task` (~255 tokens)

Move a task

Moves a task: under a parent (subtask), after a sibling (previous), and/or into another list (destination_tasklist). Omitting parent puts it at the top level; omitting previous puts it first among its siblings — so calling with neither moves the task to the very top of its list. This is the ONLY way to change hierarchy or order (parent/position are read-only fields; positions are opaque strings maintained by the API). Constraints: parent and previous must be in the task's (destination) list; assigned tasks and recurrent tasks cannot be moved between lists. Returns the task with its new position.

Input parameters:

- `destination_tasklist` (string): Move the task into this other task list.
- `parent` (string): New parent task id — the task becomes its subtask. Omit for the top level.
- `previous` (string): Sibling task id to place the task after (same parent). Omit for the first position.
- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `delete_task` (~152 tokens)

Delete a task

Deletes a task permanently — this is NOT the same as completing it. To mark work done (reversibly), use complete_task instead. A deleted task disappears from default listings immediately; for a while it remains visible to list_tasks with show_deleted=true (deleted:true) so sync clients can observe the deletion, then it is gone for good. Deleting a parent task also deletes its subtasks. Returns {deleted:true} with the ids echoed.

Input parameters:

- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `complete_task` (~172 tokens)

Complete a task

Marks a task completed (status=completed; the API stamps the completed timestamp). This is REVERSIBLE — reopen_task undoes it — and is the right call for "done", unlike delete_task which erases the task. The API call touches only the addressed task: completing a parent does NOT cascade to its subtasks — complete them individually if the whole tree is done. A completed task stays listed until cleared: list_tasks still returns it with show_completed=true (+ show_hidden=true after a clear). Returns the updated task with status and completed.

Input parameters:

- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `reopen_task` (~116 tokens)

Reopen a task

Reverts a completed task to needsAction and clears its completed timestamp — the undo for complete_task. Works on hidden tasks too (tasks cleared with clear_completed_tasks): reopening un-hides them. Cannot resurrect a deleted task — deletion is permanent. Returns the updated task.

Input parameters:

- `task_id` (string, required): The task id — from list_tasks, get_task or create_task output.
- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `clear_completed_tasks` (~146 tokens)

Clear completed tasks

Clears ALL completed tasks from one list in a single call: they are flagged hidden and vanish from default listings (the Google Tasks UI does this as "Delete all completed"). The tasks are not deleted — list_tasks with show_completed=true and show_hidden=true still returns them, and reopen_task can restore any of them individually — but there is no single call to un-clear a whole list, so treat it as destructive. Open (needsAction) tasks are untouched. Returns {cleared:true} with the tasklist_id echoed.

Input parameters:

- `tasklist_id` (string, required): The task list id — from list_tasklists or create_tasklist output. "@default" addresses the user's default list.

### `raw_request` (~208 tokens)

Raw Google Tasks API call

Escape hatch to call any Google Tasks API v1 path directly, for requests the typed tools don't cover — e.g. a full-resource PUT ("tasks/v1/lists/<listId>/tasks/<taskId>", method PUT, body with the complete task), or a query combination the typed filters don't expose. The path is relative to https://tasks.googleapis.com and may carry a query string (e.g. "tasks/v1/lists/<listId>/tasks?showDeleted=true"). The Bearer token is added automatically; the method defaults to GET. PATCH/PUT/POST/DELETE hit live data with no confirmation — prefer the typed tools when one fits.

Input parameters:

- `body` (object): JSON request body — sent for POST/PATCH/PUT/DELETE, ignored for GET.
- `method` (string): HTTP method. Defaults to GET.
- `path` (string, required): API path relative to https://tasks.googleapis.com, e.g. "tasks/v1/users/@me/lists".

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks#diagnostics

## Score history

- 2026-09-20: 79
- 2026-09-19: 78
- 2026-09-18: 78
- 2026-09-17: 77
- 2026-09-16: 77
- 2026-09-15: 76
- 2026-09-14: 76
- 2026-09-13: 76
- 2026-09-12: 75
- 2026-09-11: 75
- 2026-09-10: 74
- 2026-09-09: 74
- 2026-09-08: 73
- 2026-09-07: 73
- 2026-09-06: 69
- 2026-09-05: 69
- 2026-09-04: 69
- 2026-09-03: 69
- 2026-09-02: 69
- 2026-09-01: 69
- 2026-08-31: 69
- 2026-08-30: 54

## Common questions

### What is the Google Tasks MCP server?

Google Tasks MCP is listed in the public MCP registry as io.github.A1-x-Tech/mcp-google-tasks. MCP server for the Google Tasks API: task lists, subtasks, due dates, complete and move tasks. This page covers its npm package (mcp-google-tasks).

### Is the Google Tasks MCP server safe to use?

Google Tasks MCP scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Google Tasks MCP server expose?

Google Tasks MCP exposes 21 tools: auth_status, setup_instructions, set_client, start_login, finish_login, and 16 more. Their descriptions and schemas cost roughly 3,319 tokens of context every time the server is loaded.

### Is the Google Tasks MCP server still maintained?

Google Tasks MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Google Tasks MCP server under?

Google Tasks MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/mcp-google-tasks
- Socket report: https://socket.dev/npm/package/mcp-google-tasks
- Repository: https://github.com/A1-x-Tech/mcp-google-tasks
- Changelog RSS feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks.xml
- Changelog JSON feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks.json
- HTML version of this page: https://verifymcp.io/servers/a1-x-tech-mcp-google-tasks/mcp-google-tasks
