Google Tasks

Lightweight, dependency-free in-process fake of the Google Tasks API v1 for testing googleapis clients with zero external calls.

Default port: 4626

Implemented Operations

Task lists:

Tasks:

Parlel control endpoints:

The server also accepts /v1/... as an alias for /tasks/v1/... for simple googleapis rootUrl overrides.

Quick Start

import { google } from "googleapis";
import { GoogleTasksServer } from "./services/google-tasks/src/server.js";

const server = new GoogleTasksServer(4626);
await server.start();

const tasks = google.tasks({
  version: "v1",
  rootUrl: "http://127.0.0.1:4626/",
});

const list = await tasks.tasklists.insert({
  requestBody: { title: "Agent test list" },
});

await tasks.tasks.insert({
  tasklist: list.data.id,
  requestBody: { title: "Verify integration" },
});

const allTasks = await tasks.tasks.list({ tasklist: list.data.id });
console.log(allTasks.data.items);

await server.stop();

Support Matrix

FeatureStatusNotes
Task list CRUDSupportedIn-memory tasks#taskList resources.
Task CRUDSupportedIn-memory tasks#task resources.
Task hierarchySupportedparent and previous are honored for insert and move.
PaginationSupportedmaxResults and numeric pageToken.
Task filtersSupportedCompletion, due date, updated, deleted, hidden, and completed visibility filters.
Completed clearSupportedCompleted tasks are marked hidden: true and omitted unless showHidden=true.
OAuth and IAMIntentionally unsupportedRequests are accepted without auth for local tests.
PersistenceIntentionally unsupportedState is ephemeral and resettable.
Push notificationsIntentionally unsupportedGoogle Tasks v1 does not expose watch methods through googleapis.
Sync tokensIntentionally unsupportedGoogle Tasks v1 googleapis surface does not require them for common CRUD tests.

Error Shape

Errors use Google-style JSON bodies:

{
  "error": {
    "code": 404,
    "message": "Task not found",
    "errors": [
      {
        "message": "Task not found",
        "domain": "global",
        "reason": "notFound"
      }
    ],
    "status": "NOT_FOUND"
  }
}

Returned statuses and reasons:

<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

GOOGLE_TASKS_EMULATOR_HOST=http://parlel-bridge:4626
GOOGLE_CLOUD_PROJECT=parlel
GCLOUD_PROJECT=parlel
<!-- parlel:testenv:end -->