Google Tasks MCP

io.github.A1-x-TechPublished by GitHub account A1-x-Techv1.1.2Updated Nov 7, 2026

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

Overview

AI-generated overview

Local MCP server that lets an assistant read and manage your Google Tasks lists, tasks, subtasks and due dates through the Google Tasks API.

What you can do
  • List, create, rename and delete task lists, and resolve the default list
  • List, create, update, move and delete tasks, including subtasks and date-only due dates
  • Complete or reopen tasks, and sweep all completed tasks out of a list's view
  • Check connection status, run an in-chat OAuth login, log out, and send raw API requests
When to use it
Useful when you want an assistant to plan and track work in Google Tasks in plain language: reviewing what is due, breaking a project into subtasks, marking items done, or reorganizing lists. It only covers Google Tasks, not Calendar, Keep or Reminders.
Requirements
Runs locally via npx with Node.js 20+ and a Google account. Connect either through the in-chat OAuth flow (a Google Cloud project with the Tasks API enabled and a Desktop-app OAuth client JSON) or by setting GOOGLE_TASKS_CLIENT_ID, GOOGLE_TASKS_CLIENT_SECRET and GOOGLE_TASKS_REFRESH_TOKEN (or GOOGLE_TASKS_ACCESS_TOKEN). Network access to Google is required.
Before you install
Writes hit live data: delete_task and delete_tasklist are permanent, delete_tasklist removes every task in the list, and clear_completed_tasks hides all completed tasks at once; raw_request can call any API method. Treat GOOGLE_TASKS_CLIENT_SECRET and GOOGLE_TASKS_REFRESH_TOKEN as passwords and keep the client JSON path out of chat. Anonymous telemetry is sent unless ASKADS_TELEMETRY=0 is set. Testing-mode OAuth refresh tokens expire after 7 days.

Installation

In SourceWeft

  1. Open Google Tasks MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[A1] Google Tasks MCP

English | Русский

[npm] [Glama] [CI] [License: MIT]

A1 Google Tasks MCP lets an AI app manage Google Tasks in plain language. Plan a project as a task list, break work into subtasks with due dates and notes, mark things done and keep everything in order.

It uses the Google Tasks API with your Google account. It separates reversible completion from permanent deletion and makes the limits of the Tasks API explicit instead of implying that every to-do feature is possible.

  • 21 tools. List, create and update task lists and tasks, move tasks, manage completion, sweep finished work and reach the raw API when a dedicated tool is missing.
  • Connects from the conversation. Say "connect Google Tasks": the server walks you through the OAuth client, catches Google's redirect on 127.0.0.1 with PKCE and keeps the tokens itself — no config files, no restart.
  • Completion is reversible, deletion is not. complete_task has an undo (reopen_task); the delete tools are separate and marked destructive.
  • Due dates are honest. The API stores only the calendar date — the server never pretends to schedule a time of day; times belong in the notes.
  • Minimal Google scope. A single tasks scope, without Drive, Calendar or Gmail access.

Start with a read-only question:

Show me my task lists and everything due before Friday in my default list.

Connect the server · Explore use cases · Open technical documentation


See it work in a minute

You: What's still open in the "Website launch" list, and what's due this week?

Assistant: Shows the open tasks with their due dates, notes and subtasks. Nothing changes.

You: Add a task "Send the launch announcement" due Friday as a subtask of "Marketing".

Assistant: Shows the target list, the parent task and the proposed task, then asks for confirmation before creating it.

You: Confirm.

Assistant: Creates the subtask with a Friday due date. It does not complete or delete anything unless you ask separately.

Contents

Quick start

You need Node.js 20+ and a Google account. Credentials are not required at install time — the server connects from the conversation.

  1. Add the server to your AI app.
  2. Say "connect Google Tasks": the assistant walks you through creating the OAuth client and approving access without editing config files.
  3. Ask the read-only question above.
Codex

In the app: open Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y mcp-google-tasks@latest and environment variables GOOGLE_TASKS_CLIENT_ID, GOOGLE_TASKS_CLIENT_SECRET, GOOGLE_TASKS_REFRESH_TOKEN, then select Save and Restart.

From the command line:

bash
codex mcp add google-tasks \  -- npx -y mcp-google-tasks@latest
bash
codex mcp list

Codex MCP documentation

Claude Code
bash
claude mcp add \  --transport stdio --scope user google-tasks \  -- npx -y mcp-google-tasks@latest
bash
claude mcp list

Claude Code MCP documentation

Claude Desktop

The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.

This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:

json
{  "mcpServers": {    "google-tasks": {      "command": "npx",      "args": ["-y", "mcp-google-tasks@latest"]    }  }}

In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

Claude Desktop MCP documentation

Cursor

Add this to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:

json
{  "mcpServers": {    "google-tasks": {      "type": "stdio",      "command": "npx",      "args": ["-y", "mcp-google-tasks@latest"]    }  }}

Cursor MCP documentation

VS Code

Run MCP: Open User Configuration and add:

json
{  "servers": {    "google-tasks": {      "type": "stdio",      "command": "npx",      "args": ["-y", "mcp-google-tasks@latest"]    }  }}

Check it with MCP: List Servers.

VS Code MCP documentation

What you can ask it to do

See your lists and plan the day

  • Show my task lists and the open tasks in each one.
  • What's due this week in the default list? Include subtasks.
  • What changed since yesterday? Include completed and hidden tasks.

Create and organize work

  • Create a "Website launch" list with tasks for design, content and QA.
  • Add a task due Friday with notes, nested under the "Marketing" task.
  • Move a task to the top of the list, under another task, or into a different list.

Track completion

  • Mark the review task done — and reopen it if the work comes back.
  • Sweep every completed task out of the list view in one go.
  • Show the hidden tasks that were swept earlier.

How a task changes

  1. Tasks live in task lists. Every account has a built-in default list, addressed by the special id @default; create_tasklist adds more.
  2. A task carries a title, notes and a date-only due date — the API discards the time portion, so a time of day belongs in the notes.
  3. Ordering and nesting change only through move_task; the API's position field is read-only.
  4. Completing a task is reversible: reopen_task brings it back. Deleting a task or a list is permanent, and deleting a list removes every task in it.

Recurring tasks cannot be created through the API. Tasks assigned from Google Docs or Chat can be read but not created or moved to another list, and deleting one also removes it in the originating document. There is no server-side search or sorting — the server lists tasks and the AI client filters them.

What can change

OperationWhat happensConfirmation boundary
Read task lists and tasksReads lists, tasks and their filtersNo change
Create a task list or a taskAdds a list or an open taskChanges Google Tasks
Update a task or rename a listChanges a title, notes or due dateChanges a task
Move a taskChanges order, nesting or the containing listChanges a task
Complete or reopen a taskToggles completion statusReversible change
Clear completed tasksSweeps every completed task in a list out of viewDestructive
Delete a task or a task listRemoves the task, or the list with everything in itDestructive
Raw API requestCan call API methods without a dedicated toolPotentially destructive

The AI client controls confirmation prompts. The server marks reads, writes and destructive tools so the client can distinguish an inspection from a live change.

Getting access

Google Tasks requires OAuth 2.0; an API key is not enough. There are two ways in, and the first one needs no configuration files.

Connect from the chat (recommended)

Say "connect Google Tasks" and the assistant runs the flow with you:

  1. setup_instructions prints the checklist: create or select a Google Cloud project, enable Google Tasks API, configure the consent screen and create a Desktop app OAuth client.
  2. Download that client's JSON ("Download JSON") and give the assistant its path — set_client stores it owner-only. The secret never goes through the conversation.
  3. start_login returns a Google consent link. Open it on this machine and approve; the code comes back to a one-shot listener on 127.0.0.1 (PKCE), never through the chat.
  4. finish_login exchanges the code and saves the tokens to ~/.config/mcp-google-tasks/credentials.json (mode 0600) and verifies them with a real Google Tasks API call — so an API that is still switched off is caught right there.

The tokens are re-read on every call, so the connection works immediately — no restart of the AI app. auth_status shows what is connected, logout revokes and deletes it.

Environment variables (CI, unattended installs)

  1. Create or select a Google Cloud project and enable Google Tasks API.

  2. Configure the OAuth consent screen and create a Desktop app OAuth client.

  3. Authorize the Google account that owns the tasks. The OAuth 2.0 Playground can obtain the refresh token when Use your own OAuth credentials is enabled.

  4. Request the scope:

    text
    https://www.googleapis.com/auth/tasks

Testing-mode OAuth refresh tokens can expire after seven days. Publish the OAuth app, or use an Internal app in a Workspace domain, when you need long-lived access. Treat the client secret and refresh token as passwords.

Configuration

Every variable is optional — with none of them the server connects from the chat.

VariableRequiredDescription
GOOGLE_TASKS_CLIENT_IDNo*OAuth client ID.
GOOGLE_TASKS_CLIENT_SECRETNo*OAuth client secret.
GOOGLE_TASKS_REFRESH_TOKENNo*OAuth refresh token.
GOOGLE_TASKS_ACCESS_TOKENNo*Short-lived alternative to the OAuth trio.
GOOGLE_TASKS_OAUTH_PORTNoFixed loopback port for the in-chat login; useful over SSH port forwarding.
GOOGLE_TASKS_API_BASENoGoogle Tasks API base URL override.
GOOGLE_TASKS_TIMEOUT_MSNoPer-request timeout; default 60000 ms.
GOOGLE_TASKS_MAX_RETRIESNoTemporary-error retries; default 3.

* Provide either the OAuth trio or an access token.

Without credentials the server still starts and completes the MCP handshake; the first tool call then fails with a message naming the variables to set and asking for a restart.

Data, limits and background work

  • Requests go to Google Tasks. The local server refreshes Google OAuth tokens and calls the Tasks API. Its anonymous telemetry contains an installation ID, package version, AI client and platform versions, and tool names — never OAuth tokens, task content, tool arguments or prompts. For each tool call it also sends the outcome and, on failure, an excerpt of the error text with e-mails, addresses, tokens, numbers of 4+ digits and quoted text replaced by #; a value from your request can appear in it if the error text contains it. Set ASKADS_TELEMETRY=0 to opt out.
  • Google applies a daily quota. The Tasks API has a courtesy limit of 50,000 queries per day per project. On 429, the server uses backoff; reads also retry after network and 5xx errors, while writes are not replayed after an uncertain failure — check the outcome with get_task instead.
  • There is no background polling. The server runs only when called. list_tasks supports incremental sync through the updated_min filter, so an AI app with scheduled tasks can check for changes periodically without re-reading everything.

Technical documentation

Support

Found a bug or need a scenario? Create an issue or write in Telegram.


[Две Моны дают пять]

You made it to the end!

Source: README.md at commit 3075f88

Tools

21

auth_status

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.

Takes no parameters.

setup_instructions

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.

Takes no parameters.

set_client

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.

Parameterspathrequired

start_login

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.

Takes no parameters.

finish_login

Finish the Google login

Second step: waits up to 20 s for the browser consent to finish, 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.

Takes no parameters.

logout

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.

Takes no parameters.

list_tasklists

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.

Parameterspage_sizepage_token

get_tasklist

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.

Parameterstasklist_idrequired

create_tasklist

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.

Parameterstitlerequired

update_tasklist

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.

Parameterstitlerequiredtasklist_idrequired

delete_tasklist

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.

Parameterstasklist_idrequired

list_tasks

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.

Parametersdue_maxdue_minpage_sizepage_tokenshow_hiddentasklist_idrequiredupdated_minshow_deletedcompleted_maxcompleted_minshow_assignedshow_completed

get_task

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.

Parameterstask_idrequiredtasklist_idrequired

create_task

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.

Parametersduenotestitlerequiredparentprevioustasklist_idrequired

update_task

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.

Parametersduenotestitletask_idrequiredclear_dueclear_notestasklist_idrequired

move_task

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.

Parametersparenttask_idrequiredprevioustasklist_idrequireddestination_tasklist

delete_task

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.

Parameterstask_idrequiredtasklist_idrequired

complete_task

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.

Parameterstask_idrequiredtasklist_idrequired

reopen_task

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.

Parameterstask_idrequiredtasklist_idrequired

clear_completed_tasks

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.

Parameterstasklist_idrequired

raw_request

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.

Parametersbodypathrequiredmethod

Version history

6
  1. v1.1.2LatestNov 5, 2026
  2. v1.1.1Oct 31, 2026
  3. v1.1.0Oct 31, 2026
  4. v1.0.0Sep 23, 2026
  5. v0.2.0Sep 21, 2026
  6. v0.1.0Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts