Google Workspace MCP Server
Allows managing Gmail inbox, drafting emails, sorting newsletters, setting up labels and filters, handling attachments, and tracking responses to threads
Integrates with Google Workspace, providing access to Gmail, Calendar, and Drive within a unified interface through authenticated API access
Enables calendar management including scheduling meetings, managing recurring events, finding available time slots, and handling timezone conflicts
Provides file management capabilities including organizing documents, controlling sharing permissions, searching file contents, and maintaining structured file organization
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Workspace MCP Serversearch my inbox for emails from John about the Q3 project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Workspace MCP Server
Give your AI agent real access to Google Workspace — Gmail, Calendar, Drive, Docs, Sheets, Tasks, Meet and Contacts — from one MCP server, across as many accounts as you have.
Search your mail, check your calendar, write a doc, file a task — in conversation, as yourself.
Install
First, you need Google OAuth credentials — the one prerequisite common to every path:
Create an OAuth 2.0 Client ID, application type Desktop app
Enable the APIs you want (Gmail, Calendar, Drive, Sheets, Docs, Tasks, Meet — and People API for contacts, which is what Google calls it in the console)
Keep the Client ID and Client Secret handy — you'll paste them in below
Then pick the path that matches how you work. All three run the same server.
Node 22.12 or newer. (Node 18 and 20 are both end-of-life.)
📦 → 🤖 Claude Desktop — one-click .mcpb install (recommended)
Download google-workspace-mcp.mcpb from the latest release, then drag it onto the Claude Desktop window, or double-click it.
Claude Desktop opens an install dialog with three fields:
Field | |
Google OAuth Client ID | required — from the step above |
Google OAuth Client Secret | required — from the step above |
Workspace Directory | optional — where attachments, downloads and exports land. Defaults to |
Paste, hit Save, done. No JSON to edit, no Node to install, no paths to get right — the bundle carries the server and every dependency.
One bundle covers every platform — macOS (Intel and Apple Silicon), Linux (x64 and ARM64), and Windows. There is nothing to choose: the server is pure JavaScript, so there is no platform-specific payload to pick between.
Cross-platform note:
.mcpbfiles install via Claude Desktop's bundled handler. If double-clicking doesn't trigger Claude on your system, drag the file onto the Claude Desktop window instead, or right-click → "Open with…" and pick Claude Desktop (then "always open with" if your OS offers). Behavior varies: macOS usually auto-associates, Windows may need a one-time association, Linux varies by desktop environment.
Claude Code — one command
claude mcp add google-workspace \
-e GOOGLE_CLIENT_ID=your-client-id \
-e GOOGLE_CLIENT_SECRET=your-client-secret \
-- npx -y @aaronsb/google-workspace-mcpThat's it — no file to edit. Verify with /mcp.
Other MCP clients
Add an entry to the client's MCP config file (for Claude Desktop by hand, that's claude_desktop_config.json; for Claude Code, .mcp.json):
{
"mcpServers": {
"google-workspace": {
"command": "npx",
"args": ["-y", "@aaronsb/google-workspace-mcp"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id",
"GOOGLE_CLIENT_SECRET": "your-client-secret"
}
}
}
}Or install it globally and point at the binary directly:
npm install -g @aaronsb/google-workspace-mcpRelated MCP server: google-mcp
How it fits together
flowchart LR
human["🧑 You<br>ask in plain language"]
agent["🤖 Your AI agent<br>Claude Desktop, Claude Code…"]
server["⚙️ This MCP server<br>picks the right account,<br>builds the real request"]
keys[("🔑 Your accounts<br>OAuth tokens, kept<br>on your own machine")]
google["☁️ Google<br>Gmail · Calendar · Drive · Docs<br>Sheets · Tasks · Meet · Contacts"]
human -->|"“what's on my calendar?”"| agent
agent -->|"tool call"| server
server <-->|"which account?"| keys
server -->|"real API call, as you"| google
google -->|"your data"| server
server -->|"shaped for an agent<br>+ what to do next"| agent
agent -->|"an answer"| human
classDef person fill:#475569,color:#ffffff,stroke:#94a3b8
classDef robot fill:#2d7d9a,color:#ffffff,stroke:#4a5568
classDef ours fill:#7c3aed,color:#ffffff,stroke:#8b5cf6
classDef secrets fill:#2d8e5e,color:#ffffff,stroke:#4a5568
classDef external fill:#f6821f,color:#1a1a1a,stroke:#d97706
class human person
class agent robot
class server ours
class keys secrets
class google externalYour credentials never leave your machine. The server holds an OAuth token per account, on your own disk, and calls Google as you — there is no middleman service, no account of ours, nothing to sign up for. Add as many accounts as you like (personal and work, side by side); the server routes each request to the right one.
What it can do
12 tools across 8 Google services, plus multi-account handling, per-account read-only access, bulk execution, content authoring, and a file sandbox.
Tool | What It Does |
| Gmail — search, read (plain or sanitized HTML), send, reply / reply-all, forward, triage, trash, labels, threads, attachments |
| Calendar — list, agenda, get, create, quickAdd (natural language), update, delete, calendars, freebusy |
| Drive — search, get, upload, download, copy, rename / move, delete, export, permissions, comments, view images |
| Sheets — read / write ranges (row-numbered output), append, clear, manage tabs, copy / duplicate / rename |
| Docs — get, create, append, insert text, find-and-replace |
| Tasks — list / create / update / complete tasks and task lists |
| Meet — create and configure meeting spaces, see who is in a call now, browse past conferences, participants, transcripts, recordings, smart notes |
| Contacts — look people up in your saved contacts, the addresses you have only corresponded with, and your organization's directory; create, update and delete contacts |
| Multi-account lifecycle — add accounts, manage credentials and scopes |
| Compose / edit multi-line content (line- or JSON-path-addressed), attach files, send to any target; JSON mode live-syncs to Docs / Sheets |
| File operations in the workspace sandbox (exchange point for attachments, downloads, exports) |
| Do many things in one call — chain different operations in sequence with |
Every response carries next-steps guidance, so the agent always knows what it can do next.
One ask, many steps
The useful part isn't any single operation — it's that your agent can string them together.
You ask for one thing. The agent works out that it needs four API calls, in order, each one feeding the next:
sequenceDiagram
autonumber
participant H as 🧑 You
participant A as 🤖 Your agent
participant S as ⚙️ MCP server
participant G as ☁️ Google
H->>A: "file the invoice from Acme<br>and remind me to pay it Friday"
A->>S: find the email
S->>G: search Gmail
G-->>S: the message
S-->>A: found it — and here's what you can do next
A->>S: save the attachment
S->>G: download it
A->>S: put it in Drive
S->>G: upload
A->>S: create a task, due Friday
S->>G: Google Tasks
A-->>H: Done. Invoice filed, task set for Friday.Two things make this work. Every response tells the agent what it can do next, so it isn't guessing at the next step. And bulk_operations lets it run a whole chain in one call, feeding each result into the next — so "find the invoice, file it, remind me" is a single round trip rather than four.
When the work is the same operation over many things, it can go further and use one Google request for all of them:
bulk_operations { mode: 'batch', tool: 'manage_email', operation: 'trash',
items: ['msg1', 'msg2', 'msg3', … ] }Two hundred messages trashed in one round trip instead of two hundred. This is narrow on purpose — it works only where Google publishes a method for it, which today is contacts (create, update, delete, get) and Gmail (trash, label changes). Ask for it anywhere else and the answer names the operations that can, and points you back at sequential mode, which works everywhere.
Ask for what's missing
This server exposes 95 operations, reaching 79 of the 257 methods Google publishes across those eight APIs. It is a curated subset on purpose: an agent has to choose among these, and every method it must weigh is one it can pick wrongly. A tool with 257 operations isn't more capable than one with 95 — it's harder to use correctly.
But that judgement was made without you.
→ Browse every method Google publishes
Every method is listed — what it does, whether we expose it, and a Request link that opens a pre-filled issue. The descriptions are Google's own, quoted verbatim, and the page is generated from the same specification the client is built from, so it can't drift from reality.
That page also lists three whole APIs this server doesn't touch yet — Chat, Slides and Forms — for the same reason: not targeted is a decision, not a fact of nature.
A good request names the task, not the method:
"I want the agent to file incoming invoices into a folder automatically."
That can be evaluated. It might turn out an existing operation already does it, or that the right answer is a different method than the one you found. "Expose users.settings.filters.create" is a conclusion, not a case — lead with the problem and let the method follow.
Why Apache 2.0, and not open core
Everything is here. There is no paid tier, no "enterprise" build, no feature held back to sell you later. What you install is what exists.
Open core works by keeping the good part back. The free thing is a lead magnet, and the moment your use gets serious you discover the operation you need lives behind a licence. That model would be especially rotten here: this is a piece of plumbing between you and your own data, using your own Google credentials, running on your own machine. Nothing about that arrangement should have a paywall in the middle of it, and nothing about it needs a vendor.
Apache 2.0 rather than MIT for two concrete reasons:
An explicit patent grant. Contributors licence their patent claims along with their code, so using this can't become a patent problem later. MIT is silent on patents, which means the question is merely unanswered rather than settled.
It's safe to adopt at work. Apache 2.0 is on essentially every corporate allow-list. Fork it, vendor it, ship it inside a commercial product — you don't owe anyone anything, and you don't need to ask.
The one obligation is attribution: keep the notices (NOTICE, LICENSE) with the code. That's it.
Through v3.0.0 this project was MIT-licensed, and that history is preserved rather than erased — MIT-era contributions keep their original notice in LICENSE-MIT, and their authors are credited in NOTICE. Apache 2.0 takes back nothing MIT permitted.
Usage
Add an account (opens a browser for OAuth):
manage_accounts { "operation": "authenticate" }Then use any tool with your account email:
manage_email { "operation": "triage", "email": "you@gmail.com" }
manage_calendar { "operation": "agenda", "email": "you@gmail.com" }
manage_drive { "operation": "search", "email": "you@gmail.com", "query": "quarterly report" }Give an account read-only access
Some accounts should never be written to. Ask for less at consent time and the token itself cannot send, edit or delete — this isn't a rule layered over a broad token:
manage_accounts { "operation": "scopes", "email": "you@gmail.com",
"services": "gmail,drive,contacts", "access": "read" }Google is asked for the read-only variant of each scope, so ticking every box on the consent screen still yields a read-only token. manage_accounts status reports what each account actually holds.
A write from a read-only account is refused before the request leaves, with the account, the operation, and the way back:
'create' needs write access to contacts. Account you@gmail.com was authorized
read-only for contacts. Re-authorize with manage_accounts {operation:'scopes',
email:'you@gmail.com', services:'contacts', access:'readwrite'}, or use an
account that already has it.Where a service has no read-only scope, you're told which ones and what they'll still be able to do before the browser opens.
Multi-step workflows
Chain operations with result references — the output of one step feeds the next:
{
"operations": [
{ "tool": "manage_email", "args": { "operation": "search", "email": "you@gmail.com", "query": "from:boss subject:review" }},
{ "tool": "manage_email", "args": { "operation": "read", "email": "you@gmail.com", "messageId": "$0.messageId" }}
]
}One operation, many things
Where Google publishes a method for it, the same operation across many resources costs one request:
{
"mode": "batch",
"tool": "manage_contacts",
"operation": "delete",
"email": "you@gmail.com",
"items": ["people/c1", "people/c2", "people/c3"]
}Anything shared by the whole batch goes at the top level; items carry only what differs — a bare id is enough when that's all it is.
Where your data lives
Follows the XDG Base Directory Specification:
Data | Location |
Account registry |
|
Credentials |
|
Workspace (file exchange) |
|
Credentials are per-account files holding standard OAuth tokens. No secrets are stored in the project directory.
Under the hood
You don't need any of this to use the server. But if you're curious, or you want to add an operation:
The server builds its Google API client from Google's own machine-readable API specifications. Nothing is transcribed by hand, so the surface can't drift from reality, and adding an operation is a YAML edit rather than a code change.
How it works — the build-time / runtime split, the descriptor, the factory
API coverage — what's exposed, what isn't, and how to ask for more
The full API surface — every method Google publishes, plus the three APIs we don't target yet
Architecture decisions — the ADRs, including why this server owns its Google client outright
License
Apache License 2.0 — see Why Apache 2.0 above.
Available Tools
13 toolsbulk_operationsA
Do many things in one call, two ways. mode:'queue' (default) runs different operations in sequence, chaining results with $N.field — works for every tool. mode:'batch' does ONE operation across many resources in a single Google request — far fewer round trips, but only where Google publishes a batch method.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | queue (default): N operations, N API calls, in order, with $N.field references between them. batch: ONE operation across many resources in a single API call — no $N references, because there is no 'between'. | |
| tool | No | batch only — the tool to call, e.g. 'manage_contacts'. | |
| No | batch only — the account to act as. | ||
| items | No | batch only — one entry per resource. A bare id string is enough when that is all that differs, e.g. ['people/c1', 'people/c2']; use objects when items carry more, e.g. [{name: 'Ada Lovelace', contactEmail: 'ada@example.com'}]. Anything shared by the WHOLE batch — labels to add, a field mask — goes at the top level of this call, not in here. | |
| detail | No | summary: one-line status per operation (default) | full: include complete output from each operation | |
| operation | No | batch only — the operation to apply to every item, e.g. 'delete'. Ask for one that cannot batch and the error names the ones that can. | |
| operations | No | Operations to execute sequentially |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explains that queue mode executes operations sequentially, supports $N.field chaining, and that batch mode reduces round trips but only where Google publishes a batch method. This is meaningful behavioral context, though it does not discuss side effects, error behavior beyond the schema's onError field, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and packs the essential mode distinction into a compact, readable form. Every clause earns its place, and the queue/batch contrast is immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 7-parameter tool with no output schema and no annotations, the description plus a 100%-covered input schema is nearly complete. It explains the two modes, sequencing, chaining, and the batch limitation. It does not warn about destructive side effects or enumerate which Google operations have batch support, but the schema's operation description points to the error message for that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces the mode distinction and the 'one call' semantics, but it does not add parameter-level information beyond what the input schema already provides for tool, email, items, detail, operation, and operations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: perform many operations in a single call, with two distinct modes. It differentiates the internal modes (queue vs batch) but does not explicitly distinguish itself from its sibling queue_operations, so it stops just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: queue is the default and works for every tool, while batch is appropriate when one operation applies across many resources and Google exposes a batch method. It clearly contrasts the two modes, though it does not explicitly state when to prefer individual sibling tools over this bulk tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_accountsA
Manage Google Workspace account lifecycle: list, authenticate, check status, refresh credentials, update scopes, or remove accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Required for remove, status, refresh, scopes | ||
| access | No | How much this account may do. 'readwrite' (default) is full access. 'read' asks Google for read-only permissions instead, so the account can look things up but cannot send, edit or delete. Some services have no read-only option — you will be told which before the browser opens, and nothing is authorized until you confirm. | |
| category | No | For authenticate (default: personal) | |
| services | No | For scopes — comma-separated service names (e.g. gmail,drive,calendar,sheets) | |
| operation | Yes | list: show all accounts | authenticate: add new account (opens browser) | remove: delete account and credentials | status: check token validity and scopes | refresh: renew credentials | scopes: re-auth with different services | capabilities: show available services, safety policies, and workspace status | |
| description | No | For authenticate — optional label | |
| confirmWriteAccess | No | Set true to go ahead when 'read' was asked for but some services can only be granted full access. Only needed after a first call has told you which ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for disclosing behavioral traits. It names operations like 'authenticate' and 'remove accounts' but does not mention that authentication opens a browser, removal deletes credentials, or that read-only access has caveats. Some of these details appear in the schema parameter descriptions, but the tool description itself is thin on side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource and immediately lists the supported operations. It is efficient and scannable, though the list is somewhat dense and could be broken out for easier parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema is rich and compensates for much of the missing operational detail, so the overall tool definition is usable. However, with no annotations and no output schema, the description leaves workflow-level behavior such as the browser-based auth flow, return values, and removal consequences implicit rather than explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema provides rich detail for every parameter, including the operation enum, access modes, and confirmWriteAccess flow. The description adds no parameter-level meaning itself, so it earns the baseline but no extra credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: Google Workspace account lifecycle, and enumerates distinct operations (list, authenticate, status, refresh, scopes, remove). This clearly distinguishes it from sibling resource tools like manage_calendar or manage_drive without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear contextual scope: account lifecycle management, and the operation list implies the concrete cases where this tool is appropriate. It does not explicitly name alternatives or state when not to use this tool, but the scope is unambiguous enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_calendarB
List events, view agenda, check availability, or manage calendar events.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time (ISO 8601) — or, when allDay is true, a DATE (YYYY-MM-DD) that is the INCLUSIVE last day; the exclusive end date the Calendar API requires is computed for you. Optional for all-day events: a missing end (or one equal to start) makes a one-day event. | |
| days | No | Number of days ahead to show (default: today only) | |
| meet | No | Add a Google Meet video conference link. On `update`, true adds a link and false REMOVES an existing one; omit it to leave the link as it is. | |
| text | No | Natural language event description | |
| week | No | Show this week's events | |
| Yes | Account email address | ||
| query | No | Free-text search terms to filter events | |
| start | No | Start time (ISO 8601) — or a DATE (YYYY-MM-DD) when allDay is true | |
| allDay | No | Whether the event is all-day. When true, start and end are DATES (YYYY-MM-DD — an ISO datetime's date part is used) and end, if given, is the INCLUSIVE last day; the exclusive end date the Calendar API requires is computed for you. Omit it (or pass false) for a timed event with start/end as dateTime — pass false with new datetimes to convert an all-day event back to a timed one. On `update`, converting TO all-day needs only one of start/end; the other is derived from the event on record. Converting FROM all-day needs both, because the missing one would need a time of day only you can choose. | |
| eventId | No | Event ID | |
| summary | No | Event title | |
| timeMax | No | End of range (ISO 8601) | |
| timeMin | No | Start of range (ISO 8601). On `list`, defaults to today. | |
| location | No | Event location | |
| tomorrow | No | Show tomorrow's events instead of today | |
| attendees | No | Comma-separated email addresses. On `update`, whatever you pass REPLACES the existing list — addresses you leave out are removed, and an empty string clears everyone. OMIT the parameter to leave the attendee list untouched while changing other fields. On `freebusy`, the addresses whose availability to check. | |
| operation | Yes | list: upcoming events — defaults to primary calendar, use calendarId to target a specific calendar (use 'calendars' operation to discover IDs) | agenda: today's schedule at a glance (all calendars). Returns calendarId per event for follow-up get calls. | get: full event details by ID. For shared calendar events, calendarId is required (use agenda or list to discover it). | create: create a new calendar event | quickAdd: create event from natural language (e.g. 'Lunch with Alice tomorrow at noon') | update: update an existing event (patch semantics — only changed fields needed) | delete: delete an event | calendars: list all calendars the user has access to | freebusy: check availability (free/busy) for a time range. Automatically includes own calendar; add attendees to check others. | |
| calendarId | No | Calendar ID. Use the `calendars` operation to list available IDs; required for events on shared calendars. Defaults to 'primary' on the event operations (`list`, `get`, `create`, `quickAdd`, `update`, `delete`). On `agenda`, a calendar name or ID to filter to — OMIT it to span all calendars, and do not pass 'primary', which is an API alias rather than an id agenda matches on. On `freebusy`, a comma-separated list of calendar IDs to check IN ADDITION to your own. | |
| maxResults | No | Max events (default: 10, max: 50) | |
| description | No | Event description or notes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description itself must disclose behavioral traits. It only lists broad capabilities and never mentions that create/update/delete mutate data, that update uses patch semantics, that attendees are replaced, or that deleting is irreversible. Some behavioral detail appears in the parameter descriptions, but the main description does not carry the burden for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence with no fluff and front-loads concrete capabilities. The trailing phrase 'or manage calendar events' is redundant and generic, preventing a 5, but the overall text is concise and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 20 parameters, 9 operations, and no output schema, yet the schema parameter descriptions cover almost all invocation concerns: per-operation behavior, default calendars, shared-calendar requirements, patch semantics, and availability ranges. The top-level description is thin, but the definition as a whole is sufficiently complete for an agent to select and call the tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 20 parameters in detail. The description text adds no parameter-level meaning, meeting the baseline for high coverage. The schema's own descriptions are unusually rich (e.g., allDay boundary handling, attendee replacement), but that is schema content, not description-added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (calendar events, agenda, availability) and gives concrete verbs: list, view, check, manage. It is not a mere tautology, though 'manage calendar events' is broad and duplicates the tool name rather than enumerating the create/update/delete operations explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool instead of alternatives such as manage_meet or manage_tasks, but the calendar resource and availability/agenda wording imply its scope. The operation parameter descriptions provide detailed internal routing (e.g., use 'calendars' to discover IDs, 'agenda' for shared calendars), so usage guidance is partially covered within the schema rather than the top-level description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_contactsA
Search, read, create, update and delete Google Contacts: your saved contacts, the addresses you have corresponded with but never saved, and your organization's directory.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Full name, e.g. `Ada Lovelace`. Split into given and family name on the way in; a single word becomes the given name. | |
| Yes | Account email address | ||
| notes | No | Free-text note stored on the contact | |
| phone | No | Phone number, in whatever form you have it — Google normalizes it. On `update` this REPLACES every number the contact has — pass an empty string to clear them. | |
| query | No | Text to match against names, email addresses, nicknames and phone numbers. Matching is by PREFIX: `ann` finds Anna, `nna` finds nobody. | |
| company | No | Organization name | |
| jobTitle | No | Job title within the organization | |
| contactId | No | Person id as `list` or `search` printed it (e.g. `people/c1234567890`). A bare id without the `people/` prefix is accepted. | |
| operation | Yes | list: list your saved contacts | search: search your saved contacts by name, email, nickname or phone | get: get one person in full — addresses, birthday, notes, relations | create: create a new contact | update: change an existing contact (only the fields you pass; pass an empty string to clear one) | delete: delete a contact | listOther: list 'other contacts' — addresses you have corresponded with but never saved | searchOther: search 'other contacts' by name or email | listDirectory: list people in your organization's directory (Workspace accounts only) | searchDirectory: search your organization's directory by name or email (Workspace accounts only) | |
| pageToken | No | Continue from where a previous page stopped — pass the token that response printed | |
| sortOrder | No | Order for `list` — by first name, by last name, or most recently changed first | |
| maxResults | No | Max people to return (default 25). Capped per operation: 30 for `search` and `searchOther`, 100 for everything else. | |
| contactEmail | No | The contact's email address. (`email` is the account making the call, not the person being saved.) On `update` this REPLACES every address the contact has — pass an empty string to clear them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It does convey the high-level mutability (create/update/delete) and the meaningful scope of 'addresses you have corresponded with but never saved' and 'organization's directory.' However, it does not disclose important behavioral traits such as update replacing existing phone/email values, directory operations being Workspace-only, or pagination behavior; some of this is delegated to schema property descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured sentence that front-loads the action verbs and uses a colon to enumerate the three data scopes. Every word earns its place, and there is no redundant or filler language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters, 10 operations, and no output schema, the description provides a solid orientation while the rich input schema carries the operational detail. The only notable gap is that return-value structure is not described anywhere, but it is not heavily needed given the schema's references to pagination tokens and printed ids.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even though the main description contributes no parameter-level meaning. The schema descriptions themselves are detailed and clarify subtle distinctions like `email` being the account email versus `contactEmail` being the contact's email, which is valuable. The description adds no extra parameter context beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb set — search, read, create, update, delete — tied to Google Contacts, and then distinguishes three data scopes: saved contacts, unsaved 'other contacts', and the organization directory. This makes the tool's purpose unmistakable and clearly separates it from sibling domain tools like manage_calendar or manage_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when the tool applies by naming the resource and the three contact scopes it covers. It does not explicitly state when not to use it or name alternatives, but the sibling tools cover different domains, so ambiguity is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_docsC
Read, write, insert, and find-replace text in Google Docs documents.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Text to write (plain text) — appended to the end by write, inserted at `index` by insertText | |
| Yes | Account email address | ||
| index | No | Character index to insert at (1 = start of the tab's body) | |
| tabId | No | Tab to act on — a tabId from a previous get's tabIndex. Scopes the read on get; targets the edit on write/insertText/replaceText, which act on the FIRST tab when it is omitted (replaceText spans every tab). Character indices are per-tab. | |
| title | No | Document title (default: 'Untitled document') | |
| findText | No | Text to find | |
| matchCase | No | Case-sensitive match (default: true) | |
| operation | Yes | get: get document content and metadata | create: create a new document | write: append text to the end of a document | insertText: insert text at a specific position in a document | replaceText: find and replace text in a document | |
| documentId | No | Document ID | |
| replaceWith | No | Replacement text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it only names the operations. Critical mutation traits are absent: write appends rather than overwrites, edits without tabId target the FIRST tab while replaceText spans every tab, character indices are per-tab, and an email is required for authentication. These nuances exist in the schema's parameter text, not in the tool description, so the agent gets no behavioral warning before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A 12-word single sentence with no wasted words, and the verb list is front-loaded so the agent immediately knows the operation families. However, the brevity veers toward under-specification; it reads as a tagline rather than a specification, which is acceptable for conciseness but shifts substance burdens to other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a five-operation, 10-parameter, mutation-heavy tool with no annotations and no output schema, yet it gets only a one-line summary. The schema compensates with detailed operation and parameter text, but the tool-level description still omits what get returns, create's default behaviors, per-tab indexing pitfalls, and auth expectations. Not complete enough for an agent to select and call it correctly without deep schema parsing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with strong per-parameter descriptions (tabId explains first-tab targeting, operation explains each enum value, text explains append vs insert semantics), so the baseline of 3 applies. The tool description itself adds zero parameter meaning, but the schema carries the load thoroughly, so no penalty beyond baseline is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific verbs (read, write, insert, find-replace) and a concrete resource (Google Docs documents), making the tool's domain unmistakable and distinct from siblings like manage_sheets or manage_tasks. It does not differentiate at the operation level, but the operation enum in the schema fills that role. The one-line headline is accurate, if minimal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Nowhere does the description say when to choose manage_docs over siblings such as manage_drive or manage_sheets, nor does it give selection criteria among the five internal operations. The schema's operation descriptions explain mechanics (append, insert, replace) but offer no when-to-use or when-not-to-use guidance. An agent must infer the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_driveB
Search, upload, download, share, comment on, or manage files in Google Drive.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | File name in Drive. On `upload`, defaults to the local file's name. On `copy`, the name for the copy — without it Drive names it 'Copy of <original>'. On `update`, the new name (a rename). On `createFolder`, the folder name. | |
| role | No | Permission level. On `share`, the level to grant — defaults to `reader`. On `setRole`, the new level, and it is REQUIRED there: with no default to fall back on, an omitted role would silently demote the collaborator, and setRole sends no notification. | |
| type | No | Permission type (default: 'user'). Use 'group' for Google Groups, 'domain' to share with an entire G Suite domain, 'anyone' for public links. | |
| Yes | Account email address | ||
| query | No | Drive search query (e.g. "name contains 'budget'" or "mimeType='application/pdf'") | |
| domain | No | Domain name (required when type is 'domain'). | |
| fileId | No | File ID | |
| content | No | Comment text. On `replyToComment`, the reply text. | |
| filePath | No | Local file path to upload | |
| folderId | No | Folder ID (pass the id returned by createFolder or search) | |
| maxDepth | No | How many folder levels to descend (default 10). The tree is labelled partial when this limit stops the walk. | |
| mimeType | No | Target format (e.g. application/pdf, text/csv, text/plain, application/vnd.openxmlformats-officedocument.wordprocessingml.document) | |
| resolved | No | true to resolve, false to reopen | |
| commentId | No | Comment ID | |
| operation | Yes | search: find files by query | get: get file metadata | upload: upload a local file to Drive | viewImage: view an image file inline without saving to workspace (png, jpg, gif, webp). Use for quick preview — use download to save. | download: download file content to local path | copy: create a copy of a file (set name to rename the copy; parentFolderId to place it in a folder) | update: rename a file (set name) and/or move it between folders (addParents / removeParents — to move, set both) | delete: permanently delete a file (cannot be undone) | trash: move a file or folder to trash (recoverable for 30 days — use instead of delete when you only need to remove it) | export: export a Google Workspace document (Docs, Sheets, Slides) to a file format | createFolder: create a new folder (optionally nested under a parent folder) | listFolder: list the files and subfolders directly inside a folder | tree: print a recursive folder tree and count the files (subfolders excluded from the count) | listPermissions: list sharing permissions on a file | share: share a file with a user, group, domain, or anyone | unshare: remove sharing permission from a file | setRole: change an existing collaborator's role (no notification email is sent) | listComments: list comments on a file | getComment: get a specific comment by ID | addComment: add a comment to a file (optionally anchored to quoted text) | resolveComment: resolve or reopen a comment | replyToComment: reply to an existing comment | |
| addParents | No | Comma-separated folder ID(s) to add as parents (move into a folder) | |
| maxResults | No | Max results (default: 10, max: 50) | |
| outputPath | No | Local path to save the file | |
| quotedText | No | Text to anchor the comment to (optional — if provided, comment is anchored to first occurrence) | |
| shareEmail | No | Email address of the collaborator. On `share`, required when type is 'user' or 'group'; omit for 'domain' (use the `domain` param) or 'anyone'. On `setRole`, the existing collaborator whose role to change. | |
| permissionId | No | Permission ID to remove (from listPermissions) | |
| removeParents | No | Comma-separated folder ID(s) to remove as parents (move out of a folder) | |
| includeDeleted | No | Include deleted comments (default: false) | |
| parentFolderId | No | Destination folder ID. On `upload`, places the file in this folder. On `copy`, defaults to the source file's folder. On `createFolder`, nests the new folder under this parent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description alone does not disclose side effects such as permanent deletes, 30-day trash recovery, missing setRole notifications, or partial tree results. Those traits are documented in the schema's operation enum, which mitigates the transparency gap, but the description field itself carries little behavioral weight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with a clear verb series and no significant waste. The final 'or manage files' is somewhat redundant and vague, but overall the length is appropriate given that the schema carries the detailed operational semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter tool with no output schema and no annotations, a high-level verb list is not fully complete on its own; the agent must rely on the schema's extensive operation enum to understand per-operation behavior and outputs. The schema is rich enough to make the definition usable, but the description leaves the tool's full behavioral surface to be discovered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 24 parameters, including operation-specific meanings, defaults, and required conditions. The description adds no parameter-level meaning, so the baseline of 3 applies even though it does not compensate for anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description lists specific actions (search, upload, download, share, comment) and names Google Drive as the resource, so an agent can tell this is a Drive file-management tool. It lacks explicit differentiation from siblings like manage_docs or manage_sheets, and the trailing 'or manage files' is generic, so it is a clear but not exceptional purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Google Drive scope and operation list imply when this tool is useful, but the description gives no explicit when-to-use or when-not-to-use guidance and never names alternatives. The useful operational tips (viewImage vs download, trash vs delete, setRole no-notification) live in the schema's operation enum rather than in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_emailA
Search, read, send, forward, or manage emails in a Google Workspace account. Supports Gmail search syntax.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC email(s), comma-separated. On `replyAll` these are ADDITIONAL — they do not replace the recipients already on the thread. | |
| to | No | Recipient email(s), comma-separated | |
| bcc | No | BCC email(s), comma-separated | |
| body | No | Email body text. On `forward`, an optional note prepended ABOVE the forwarded message. | |
| from | No | Sender email or RFC 2822 mailbox for a verified Gmail Send As alias | |
| html | No | Treat body as HTML content (default: plain text) | |
| draft | No | Save as draft instead of sending (default: false, forced true when attachments present) | |
| Yes | Account email address | ||
| query | No | Gmail search query (e.g. "from:alice subject:meeting has:attachment") | |
| subject | No | Email subject line | |
| filename | No | Attachment filename, exactly as it appears in the `read` response (e.g. 'invoice_template.md') | |
| threadId | No | Thread ID to retrieve | |
| messageId | No | Email message ID | |
| operation | Yes | search: find emails by query | read: get full email by ID. Pass bodyFormat: 'html' when the plain-text part is a stub (marketing email, invitations, booking confirmations) and the dates/codes you need only exist in the HTML — returned HTML is sanitized and wrapped in a Spotlighting block (ADR-305). | archive: save an email's headers and body to a markdown file in the workspace — a LOCAL archive, not Gmail's 'remove from inbox' (attachments are listed, not downloaded) | send: compose and send a new email (creates draft when attachments present, 35MB attachment limit via upload endpoint) | reply: reply to a message (thread-aware, creates draft when attachments present) | replyAll: reply-all to a message (thread-aware, includes all recipients, creates draft when attachments present) | forward: forward a message to new recipients (includes original attachments by default) | triage: unread inbox summary (sender, subject, date) | trash: move a message to trash | untrash: restore a message from trash | getAttachment: download an email attachment to workspace directory (use read first to see attachment list) | viewAttachment: view an image attachment inline without saving to workspace (png, jpg, gif, webp). Use for quick preview — use getAttachment to save. | modify: add or remove labels on a message (e.g. archive, mark read/unread) | labels: list all labels in the mailbox | threads: list email threads by query | getThread: get all messages in a thread | |
| bodyFormat | No | How to render the message body. 'plain' (default) returns text/plain or a crude HTML-strip fallback. 'html' returns the text/html part sanitized — useful when the plain-text part is empty/stub. | |
| maxResults | No | Max results (default: 10, max: 50) | |
| outputPath | No | Local path to save the markdown file (workspace-relative; defaults to a slug from the message date and subject) | |
| addLabelIds | No | Comma-separated label IDs to add (e.g. STARRED, IMPORTANT, Label_123) | |
| attachments | No | Workspace filenames to attach, comma-separated (files must exist in workspace via manage_workspace). Creates draft when present. | |
| removeLabelIds | No | Comma-separated label IDs to remove (e.g. UNREAD, INBOX to archive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses meaningful behavioral details: returned HTML is sanitized and wrapped in a Spotlighting block, archive saves locally without downloading attachments, attachments force draft mode, uploads are capped at 35MB, forward includes original attachments, and replyAll treats cc as additional recipients. This is unusually transparent for an email tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The tool description is a single front-loaded sentence naming the resource, major actions, and search syntax support. The operation enum descriptions are long, but each clause is operation-specific and earns its place across 16 distinct operations, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity — 20 parameters, 16 operations, no annotations, and no output schema — the description is substantially complete. It covers operation behaviors, attachment handling, draft behavior, and limits. It falls just short of fully complete because return shapes for operations like search, labels, and threads are not described, and no auth/account prerequisites are stated beyond the required email parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all 20 parameters. The tool-level description adds no parameter-level semantics. The operation enum clarifies behavior, but that detail is part of the schema rather than something the description contributes beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with explicit actions on a concrete resource: 'Search, read, send, forward, or manage emails in a Google Workspace account.' It also adds a distinguishing capability, Gmail search syntax support. Sibling tools are calendar/drive/tasks, so this is unambiguously the email tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation enum provides detailed routing guidance: read says to pass bodyFormat 'html' when the plain-text part is a stub; viewAttachment says use it for quick preview and use getAttachment to save; archive clarifies it is a local archive, not Gmail's remove-from-inbox. This gives the agent explicit context for choosing among operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_meetB
Browse past Google Meet conferences, participants, transcripts, recordings, and AI-generated smart notes. Requires Workspace Business Standard+ for transcripts/recordings.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Account email address | ||
| space | No | Meeting code (the abc-mnop-xyz part of a Meet link) or a full spaces/... resource name | |
| filter | No | EBNF filter. On `listConferences`, e.g. 'space.meeting_code = "abc-mnop-xyz"' or 'start_time>="2026-01-01T00:00:00Z"'. On `listParticipants`, e.g. 'latest_end_time IS NULL' for active participants. | |
| operation | Yes | listConferences: list recent meeting conferences (default: descending by start time) | getConference: get details of a specific conference | listParticipants: list who attended a conference | listTranscripts: list transcripts for a conference (requires Workspace Business Standard+) | getTranscript: get transcript metadata including Google Docs destination | listTranscriptEntries: get structured transcript text — who said what, with timestamps | listRecordings: list recordings for a conference (saved as MP4 in Drive) | getRecording: get recording metadata including Drive file ID and playback link | getFullTranscript: get the full who-said-what transcript for a conference (chains transcripts + entries + participant names automatically). Use pageToken to continue reading. | listSmartNotes: list Gemini-generated smart notes for a conference | getSmartNote: get smart note metadata including Google Docs destination | createSpace: create a standalone Google Meet link (not attached to a calendar event) | activeConferences: list conferences happening RIGHT NOW across your meetings | getSpace: look up a meeting space by its meeting code or resource name | updateSpace: change who can join a meeting space, or turn host controls on or off | endActiveConference: end the call happening in a space right now, disconnecting everyone in it | |
| pageToken | No | Page token from a previous getFullTranscript call to continue reading | |
| accessType | No | Who can join without knocking. OPEN: anyone with the link. TRUSTED (default): people in your organization, plus invited guests. RESTRICTED: invited guests only. | |
| maxResults | No | Max results per page, as default/ceiling. Differs by operation: `listConferences` 25/100, `listParticipants` 100/250, `listTranscriptEntries` 100/100. (Google's own default for transcript entries is 10; this tool raises it.) | |
| moderation | No | Turn on host controls — the host admits guests and manages who can present or chat. | |
| conferenceId | No | Conference record ID (from `listConferences`) | |
| recordingName | No | Recording resource name (from listRecordings) | |
| smartNoteName | No | Smart note resource name (from listSmartNotes) | |
| transcriptName | No | Transcript resource name (from `listTranscripts`, e.g. conferenceRecords/.../transcripts/...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it adds one useful behavioral fact (Workspace Business Standard+ required for transcripts/recordings) but otherwise frames the tool as read-only. It does not disclose that operations like updateSpace and endActiveConference mutate or terminate live meetings, which is material behavior for an agent to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Both sentences earn their place and front-load the domain plus the license caveat. It is compact and free of filler, though the brevity contributes to under-specifying active-management capabilities.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-operation tool with 12 parameters, no output schema, and no annotations, two sentences about browsing and licensing are insufficient. The definition omits entire categories of behavior, such as active conferences, creating/updating spaces, and ending calls, and gives no account of mutation effects or required permissions. The rich operation enum in the schema compensates only partially.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters with descriptions and detailed enum explanations, so the baseline is 3. The prose description adds only the licensing constraint tied to transcripts/recordings, not parameter-level semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The core read/browse function is explicit: 'Browse past Google Meet conferences, participants, transcripts, recordings, and AI-generated smart notes,' and 'Google Meet' clearly distinguishes this from sibling tools. However, the description understates the full operation set, which also includes createSpace, updateSpace, and endActiveConference, so the purpose is not fully represented.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for historical reads and a hard licensing prerequisite for transcripts/recordings, so an agent can infer when browsing Meet data is appropriate. It offers no guidance about when to prefer this over sibling tools or when to use the mutation operations, leaving that entirely to the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_scratchpadA
Compose, edit, and deliver text content. Use for any multi-line content: emails, documents, descriptions. Compose in the scratchpad, edit by line or JSON path, attach files, then send to any target. For short one-liners, use the service tool directly instead.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | For send: keep scratchpad after successful send (default: true) | |
| path | No | For json_* ops: JSON path (e.g., $.config.name, $.items[0].value) | |
| label | No | For create: optional human-readable label | |
| refId | No | For detach: attachment reference ID (att-1, att-2, etc.) | |
| value | No | For json_set, json_insert: value to set or insert (any JSON type) | |
| fileId | No | For attach (drive source): Drive file ID | |
| format | No | For create: content format (default: text). Controls validation and addressing mode. | |
| source | No | For attach: file source (workspace or drive). For import: resource type (doc, email, sheet, drive_file). | |
| target | No | For send: delivery target | |
| content | No | Text content. For create (pre-fill), insert_lines, append_lines, replace_lines. | |
| endLine | No | End of line range (inclusive). For replace_lines, remove_lines, copy_lines, view. | |
| filename | No | For attach (workspace source): filename in workspace | |
| afterLine | No | Insert after this line number (0 = prepend). For insert_lines, copy_lines, attach. | |
| operation | Yes | create: new buffer | view: show content | discard: free buffer | list: show all | insert_lines/append_lines/replace_lines/remove_lines: line editing | copy_lines: copy from another scratchpad | json_get/json_set/json_delete/json_insert: path-addressed JSON editing | attach/detach: file references | import: load from Google Workspace resource | send: deliver to target | |
| startLine | No | Start of line range (1-based). For replace_lines, remove_lines, copy_lines, view. | |
| scratchpadId | No | Scratchpad ID (sp-XXXX). Required for all operations except create and list. | |
| sourceParams | No | For import: source-specific parameters (e.g., { documentId, mode } for doc, { messageId } for email) | |
| targetParams | No | For send: target-specific parameters (e.g., { email, to, subject } for email, { filename } for workspace) | |
| fromScratchpadId | No | For copy_lines: source scratchpad ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It usefully states the workflow: compose, edit by line or JSON path, attach files, and send to any target. However, it does not disclose side effects, irreversibility of sends, lifecycle/destruction of scratchpads, auth requirements, or error behavior, so important behavioral context is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: purpose, workflow, and a functional exclusion. Every sentence earns its place, the main payload is front-loaded, and there is no fluff or repetition that wastes an agent's context window.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool with 17 operations and no output schema, the description supplies a clear mental model that the schema cannot provide, and the schema supplies the per-operation and per-parameter detail. The main gap is that the generic 'service tool' alternative is not mapped to a concrete sibling, and import/copy/list/discard aspects are only discoverable from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 19 parameters. The description adds a useful high-level grouping (line editing, JSON path, attachment, delivery) but does not add syntactic or semantic detail beyond what the parameter descriptions already provide; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as composing, editing, and delivering multi-line text content, and ties it to a distinct scratchpad workflow (edit by line/JSON path, attach, send). It does not explicitly differentiate among the named sibling tools beyond pointing to a generic 'service tool', so it misses the strongest sibling-differentiation credit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use signal ('any multi-line content: emails, documents, descriptions') and an explicit when-not-to-use signal ('short one-liners... use the service tool directly'). The alternative is named only generically, not tied to a specific sibling, which is a partial gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_sheetsB
Read, write, and manage Google Sheets spreadsheets.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Account email address | ||
| index | No | Position among tabs (0-based). Appended at the end if omitted. | |
| range | No | A1 notation range (e.g. 'Sheet1!A1:D10', or just 'Sheet1' for a whole tab). On `append`, the target tab — defaults to 'Sheet1'; use 'MyTab' or 'MyTab!A:Z' to append to a specific one. | |
| title | No | On `create`, the spreadsheet title (defaults to 'Untitled spreadsheet'); on `renameSpreadsheet`, its new title. On `addSheet`, the name of the new TAB; on `renameSheet`, that tab's new title; on `duplicateSheet`, the name for the copy (defaults to 'Copy of <source>'). | |
| values | No | Comma-separated values for a single row (e.g. 'Alice,100,true') | |
| sheetId | No | Sheet ID of the tab, from `manage_sheets get`. On `duplicateSheet` and `copySheetTo`, the SOURCE tab to copy. | |
| rowCount | No | Initial row count (default 1000) | |
| operation | Yes | get: get spreadsheet metadata and sheet names | create: create a new spreadsheet (optionally with a title) | read: read cell values from a range; rendered rows are prefixed with their sheet row number (e.g. 'R3: …') since blank rows are otherwise invisible | append: append rows to a spreadsheet (rows land after the last row of existing data in the target range) | getValues: get values from a specific range (raw API); rendered rows are prefixed with their sheet row number (e.g. 'R3: …') | updateValues: write values to a specific range | clearValues: clear cell values from a range (structure preserved) | addSheet: add a new tab (sheet) to the spreadsheet | renameSheet: rename a tab (sheet) within a spreadsheet | deleteSheet: delete a tab (sheet) from the spreadsheet — irreversible | duplicateSheet: duplicate a tab within the same spreadsheet | renameSpreadsheet: rename the spreadsheet (the document title, not a tab) | copySheetTo: copy a tab from this spreadsheet into another spreadsheet | |
| jsonValues | No | JSON 2D array of rows (e.g. '[["a","b"],["c","d"]]'). Use for bulk and multi-row writes. | |
| columnCount | No | Initial column count (default 26) | |
| spreadsheetId | No | Spreadsheet ID. On `copySheetTo`, the SOURCE spreadsheet. | |
| valueInputOption | No | How input is interpreted: USER_ENTERED (default, parses formulas/types) or RAW | |
| destinationSpreadsheetId | No | Destination spreadsheet ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, but 'read, write, and manage' only vaguely signals mutation. It does not mention side effects, irreversibility like deleteSheet, creation behavior, or output shape; those details appear later in the schema but are absent from the description itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler, and every word earns its place. It is appropriately terse given the schema's rich parameter and operation documentation, though it offers no structured guidance for the many operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema is rich and covers all parameters and operation semantics, so the generic description is not fatal. However, with no output schema and no usage direction beyond 'Google Sheets,' an agent must rely almost entirely on the schema to understand call patterns, operation selection, and expected results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter has a detailed description, so the baseline is 3. The tool description adds no parameter-level meaning beyond identifying the domain, but the schema fully compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description, 'Read, write, and manage Google Sheets spreadsheets,' names a specific resource and clear high-level verbs. It distinguishes the tool from sibling manage_* tools by explicitly targeting Google Sheets, though it does not enumerate the 13 operations or contrast directly with tools like manage_docs or manage_drive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use is implied by the resource phrase 'Google Sheets spreadsheets,' which gives basic context among the manage_* sibling suite. There is no explicit when-to-use/when-not-to-use guidance, and no alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_tasksC
Manage task lists and tasks in Google Tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Due date (RFC 3339, e.g. 2026-07-20T00:00:00.000Z — Google stores the date, not the time) | |
| Yes | Account email address | ||
| notes | No | Task notes / details | |
| title | No | On `createTaskList`, the task list name. On `create` and `update`, the task title. | |
| status | No | Task status | |
| taskId | No | Task ID | |
| operation | Yes | listTaskLists: list all task lists | getTaskList: get a task list by ID | createTaskList: create a new task list | deleteTaskList: delete a task list and all its tasks | list: list tasks in a task list | get: get a specific task | create: create a new task | update: update a task (patch semantics — only the fields you pass are changed) | complete: mark a task as completed | delete: delete a task | |
| maxResults | No | Max tasks to return (default: 20, max: 100) | |
| taskListId | No | Task list ID (use `listTaskLists` to find) | |
| showCompleted | No | Include completed tasks (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. 'Manage' implies mutation and side effects but does not state that deletions are destructive, updates use patch semantics, or that operations may permanently remove tasks. The schema's operation descriptions contain some of this, but the description itself does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler or redundant content. It is front-loaded with the domain and resource type, though it may be too terse to be fully useful on its own, the conciseness itself is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 10 parameters, 10 distinct operations, no annotations, and no output schema. A one-sentence overview is insufficient context for an agent to safely select and invoke operations, understand return values, or know prerequisites. The description leaves substantial gaps that the schema alone only partially fills.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter in detail, including enum meanings, defaults, and special notes like due-date storage. The description adds no parameter-level meaning beyond what the schema provides, which matches the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource domain — 'task lists and tasks in Google Tasks' — which distinguishes it from sibling tools like manage_calendar or manage_drive. The verb 'Manage' is generic, but the object is clear enough for an agent to identify the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives, when not to use it, or which operation to choose in a given situation. The operation enum does provide choices, but the description itself offers no selection criteria or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_workspaceB
Manage files and directories in the workspace sandbox. Supports nested paths (e.g. "reports/q1/summary.csv"). The workspace is the exchange point for file operations (attachments, downloads, exports).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory path (for list: scope to subdirectory, for mkdir: directory to create) | |
| source | No | Source path (for move) | |
| content | No | File content to write (for write) | |
| filename | No | File path, may include directories (for read, write, delete, compress, decompress). E.g. "reports/q1/summary.csv" | |
| operation | Yes | list: show files (recursive) | read: get file content | write: save content to file | delete: remove file or directory | move: move or rename a file/directory | mkdir: create a directory | compress: gzip a file | decompress: gunzip a file | |
| destination | No | Destination path (for move, compress, decompress). Defaults to filename.gz for compress, strips .gz for decompress. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral disclosure. It only mentions nested-path support and the file-exchange context. It does not disclose that operations like delete, move, or write are mutating or potentially destructive, nor any overwrite semantics, irreversibility, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: purpose, path capability, and integration context are each stated once and front-loaded. The example path 'reports/q1/summary.csv' is concrete and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The workspace-scope and nested-path context combine well with a high-coverage schema that spells out operations and defaults. However, with no annotations and no output schema, the description leaves destructive-operation caveats, expected return shapes, and path-boundary limits implicit, making it adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters and explains each operation enum value and destination default. The description adds the nested-path convention and workspace role, but this is contextual rather than necessary parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage files and directories in the workspace sandbox,' naming a concrete resource and scope that separates it from siblings like manage_drive or manage_docs. The nested-path example further clarifies the file-operation role. 'Manage' is somewhat broad, but the schema's operation enum removes ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says the workspace is 'the exchange point for file operations (attachments, downloads, exports),' which implies use when exchanging files with the workspace. However, it does not explicitly state when to prefer this over alternatives such as manage_drive, nor does it mention exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_operationsA
RENAMED to bulk_operations, which does the same thing. This name still works and will be removed in a future release. Do many things in one call, two ways. mode:'queue' (default) runs different operations in sequence, chaining results with $N.field — works for every tool. mode:'batch' does ONE operation across many resources in a single Google request — far fewer round trips, but only where Google publishes a batch method.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | queue (default): N operations, N API calls, in order, with $N.field references between them. batch: ONE operation across many resources in a single API call — no $N references, because there is no 'between'. | |
| tool | No | batch only — the tool to call, e.g. 'manage_contacts'. | |
| No | batch only — the account to act as. | ||
| items | No | batch only — one entry per resource. A bare id string is enough when that is all that differs, e.g. ['people/c1', 'people/c2']; use objects when items carry more, e.g. [{name: 'Ada Lovelace', contactEmail: 'ada@example.com'}]. Anything shared by the WHOLE batch — labels to add, a field mask — goes at the top level of this call, not in here. | |
| detail | No | summary: one-line status per operation (default) | full: include complete output from each operation | |
| operation | No | batch only — the operation to apply to every item, e.g. 'delete'. Ask for one that cannot batch and the error names the ones that can. | |
| operations | No | Operations to execute sequentially |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the two execution modes, the default mode, result chaining with $N.field, and the deprecation status. However, it does not mention potential side effects, permissions required, or what the operation result/return shape looks like, which are relevant for a tool that can execute arbitrary operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the most important information: the rename and deprecation. Each sentence earns its place by explaining mode selection, sequencing, chaining, and batch limitations without repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with seven parameters, two modes, and no output schema, the description covers the core decision points: mode choice, chaining mechanics, batch constraints, and deprecation. The parameter schema fills the remaining details. It is slightly incomplete only because it does not discuss output/return behavior or authorization/side-effect considerations, but overall it is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The text adds meaningful context beyond the schema by explaining that 'queue' works for every tool, that 'batch' is beneficial due to fewer round trips but only where batch methods exist, and that $N.field references chain results. This goes beyond the enum descriptions in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool does many things in one call and explains the two modes ('queue' and 'batch'). It also identifies this as a deprecated alias of 'bulk_operations', which gives the agent a concrete point of reference, though it does not distinguish itself from that sibling because it is the same tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use each mode: 'queue' for sequential operations with chaining, 'batch' for one operation across many resources with fewer round trips. It also warns that batch is only available where Google publishes a batch method, and it tells the agent the preferred alternative name is 'bulk_operations' since this name will be removed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools map cleanup to a distinct Google Workspace service, but queue_operations is a direct duplicate/alias of bulk_operations, and manage_workspace vs manage_drive could require careful reading. Descriptions are strong enough to resolve most ambiguity.
The dominant manage_<service> pattern is clear and consistent across Calendar, Drive, Email, Docs, Sheets, Tasks, etc. bulk_operations and queue_operations break that prefix pattern but are internally consistent; the deprecated queue_operations alias is a minor naming inconsistency.
13 tools is well within the ideal range for a multi-service Workspace server and the breadth is justified. The redundant queue_operations alias makes the count slightly less clean than it could be.
The set covers core CRUD/lifecycle workflows for Calendar, Drive, Email, Contacts, Docs, Sheets, and Tasks, plus Meet viewing and account management. Obvious gaps remain for other Workspace apps like Slides, Forms, or Chat, but common workflows are well supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Permissioned access to Gmail, Drive and Calendar via the user's own Google account
Manage Microsoft 365 email, calendar, contacts and inbox rules via the Graph API with OAuth 2.0.
Manage Gmail end-to-end: search, read, send, draft, label, and organize threads. Automate workflow…
Provides tools for searching Google Workspace documentation and much more.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to securely manage Google Workspace services (Gmail, Calendar, Drive, Sheets, Contacts) with persistent multi-account OAuth. Uses OS keychain for credential storage with health monitoring and granular business rules for enterprise security.
- AlicenseBqualityDmaintenanceMulti-account Google MCP server providing read access to Gmail and Calendar via stdio. Supports secure authentication for personal and work accounts with OAuth and keychain token storage.4MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language control over Google Workspace (Gmail, Drive, Calendar, Sheets, Slides, Tasks) through secure OAuth 2.1 authentication, with vault-level security and multi-user isolation.2257The Unlicense
- AlicenseNot gradedqualityDmaintenanceProvides unified access to Google Workspace APIs including Gmail, Drive, Sheets, Calendar, Docs, Forms, and Chat through a single interface, enabling email management, file operations, spreadsheet editing, event scheduling, and more via natural language.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/aaronsb/google-workspace-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server