Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Google Workspace

NPM · @FOREVERWORKS/MCP-GOOGLE

Search and work in Gmail, Calendar, Drive, Docs, Sheets and Slides across several Google accounts.

+4 this week 81 Trust /100

Last scanned (8 hours ago)

Scores higher than 68% of npm servers

Category Productivity and Notes

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security99
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 7 of 37 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to foreverworks/mcps). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 2 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability57
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 23539 tokens (~204/item across 115 items; 115 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
  • Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage93
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 80% of tool parameters carry a description.Partial
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_comment" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 116 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1

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

  • 3 Nov 26 +27
    • Malware scan: unverified → pass ▲ security
    • Known CVEs: unverified → pass ▲ security
    • Dependency health: unverified → 0.90 ▲ functional
  • 2 Nov 26 −26
    • Malware scan: pass → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Dependency health: 0.90 → unverified ▼ functional
    • Package version: 0.1.1 → 0.2.0 functional
  • 1 Nov 26 +16
    • Malware scan: unverified → pass ▲ security
  • 31 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.1.0 → 0.1.1 functional
  • 30 Oct 26 +1

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

  • 28 Oct 26 +1

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

  • 26 Oct 26 76

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/@foreverworks/mcp-google@0.2.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo foreverworks/mcps
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/foreverworks/mcps/.github/workflows/release.yml@refs/tags/release-2026-11-02
Rekor log index 3637777511
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:2cd3193a14cea63327ab20ce0c0d30c37f37e0906b2d6baa4d5f775ca9ff8bb728470aa0cfbf763e374f3473f2de81aaab0a8f57d3e61a3cba0417ffc

Background: How many MCP packages publish verified provenance →

Dependencies 37 packages
Packages resolved 37
Stale 7
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 115 exposed · ~23,242 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
get_message ~164

Fetch a single message by id. See get_thread for the detail levels and the account rule.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
detailstring–How much comes back. 'metadata' = headers and snippet only, the cheapest fetch; it carries NO attachment list, because Gmail's metadata format does not return the MIME tree at all. 'text' (default) a…
message_idstringyes–

No output schema declared.

No examples provided.

get_messages ~255

Fetch several messages of one mailbox in one call, up to 25 ids, in the order given (a repeated id once). Use it after list_history or a search when you need the bodies of messages from different threads. A message that cannot be read comes back as {id, partial: true, reason} in its place and the others still arrive. See get_thread for the detail levels and the account rule; 'metadata' keeps a long list cheap.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
detailstring–How much comes back. 'metadata' = headers and snippet only, the cheapest fetch; it carries NO attachment list, because Gmail's metadata format does not return the MIME tree at all. 'text' (default) a…
message_idsarrayyesMessage ids from one mailbox, as search_threads, get_thread or list_history report them.

No output schema declared.

No examples provided.

get_presentation ~280

A Google Slides deck's structure with the object ids batch_update_presentation needs: per slide its layout, every element (shapes with type, placeholder and full text, images, tables cell by cell, lines, videos, Sheets charts, groups) with size and transform, and the speaker notes' shape id; plus layouts, masters and the page size. A shape's text is exact, so offset k is index k for insertText and text ranges. Sizes show as "3000000 EMU"; requests take {magnitude, unit}. A long deck is cut at a slide (`nextSlide`: read on with from_slide). format raw returns the API's JSON, narrowed by `fields`. Returns revisionId.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
fieldsstring–format raw only: a field mask over the Presentation, e.g. "slides(objectId,pageElements(objectId,image))".
formatstring––
from_slideinteger–The first slide to show, by position (0-based).
max_charsinteger––
presentation_idstringyesThe presentation's id, or its URL.
slide_idsarray–Only these slides, by object id. Empty means every slide.

No output schema declared.

No examples provided.

get_spreadsheet ~284

A spreadsheet's structure with the ids batch_update_spreadsheet needs: per sheet its sheetId, size, frozen rows and columns, merges, conditional format rules (with their index), basic filter, filter views, protected and banded ranges, charts, slicers, tables and row/column groups, plus named ranges; ranges as A1. No cell data (get_values, read_rows). format raw returns the API's JSON for `ranges`, with grid data if asked, narrowed by `fields`: the way to read cell formats, notes, validation and pivots.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
data_filtersarray–format raw, instead of ranges: DataFilters choosing the grid data (developer metadata lookups included).
fieldsstring–format raw: a field mask over the Spreadsheet, e.g. "sheets(properties,data(rowData(values(userEnteredFormat,note))))".
formatstring––
include_grid_databoolean–format raw: include each cell's data and formats for `ranges`.
max_charsinteger––
rangesarray–format raw: A1 ranges to limit the grid data to.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

get_thread ~178

Fetch one thread with all its messages, their attachment metadata and their bodies. Thread ids are per-mailbox: pass the account that search_threads reported alongside the id.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
detailstring–How much comes back. 'metadata' = headers and snippet only, the cheapest fetch; it carries NO attachment list, because Gmail's metadata format does not return the MIME tree at all. 'text' (default) a…
thread_idstringyes–

No output schema declared.

No examples provided.

get_thumbnails ~95

A PNG thumbnail URL per slide, rendered by Google. The URLs expire after about half an hour.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
presentation_idstringyesThe presentation's id, or its URL.
sizestring–SMALL is 200px wide, MEDIUM 800px, LARGE 1600px.

No output schema declared.

No examples provided.

get_transcript ~145

A Meet transcript as text, one line per thing said: "[0:12:05] Ana Popescu: ...", the time counted from when the transcript began. Long ones come in parts of about max_chars; pass nextPageToken back to read on. The transcript is the name list_meetings gives (conferenceRecords/.../transcripts/...).

NameTypeReqDescription
accountstring–Which account: a label from list_accounts; empty means the first one with a grant.
max_charsinteger––
page_tokenstring–nextPageToken from the previous part.
transcriptstringyesThe transcript's name, from list_meetings.

No output schema declared.

No examples provided.

get_values ~281

Values of several A1 ranges in one read, as Sheets renders them (FORMATTED_VALUE), as numbers (UNFORMATTED_VALUE: a double, so read_rows is the tool for money) or as formulas (FORMULA), chosen by A1 ranges or by data_filters. A large answer is cut at a row (`totalRows` says how many there were).

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
data_filtersarray–Instead of A1 ranges: Sheets DataFilters, each one of {"a1Range": "Sheet1!A1:B2"}, {"gridRange": {...}} or {"developerMetadataLookup": {"metadataKey": "...", ...}}: cells found by the developer metad…
date_time_renderstring–For dates when value_render is not FORMATTED_VALUE.
major_dimensionstring––
max_charsinteger––
rangesarray–A1 ranges, each naming its sheet: "Sheet1!A1:D20", "Sheet1!B:B", "'Q3 plan'!2:2", or a sheet name alone.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.
value_renderstring––

No output schema declared.

No examples provided.

harvest_attachments ~340

Every attachment matching a Gmail query, downloaded to a folder in ONE call, with a manifest. Use it for a month of invoices ('has:attachment after:2026/08/01 before:2026/09/01') instead of walking threads and calling get_attachment per file. Do NOT use Gmail's own 'download all attachments' zip as an alternative: it is keyed by thread id and silently omits parts keyed by message id. Returns counts (threadsMatched, attachmentsFound, savedCount) so the harvest can be reconciled against Gmail's own has:attachment count, each saved file with its size and sha256, plus a per-file failure list. Files are named <message id>-<filename>; two of one name both survive. A client that asks for progress hears each attachment saved, out of how many; cancelling stops the harvest, which then ends as cancelled.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
extensionsarray–Filter by extension, e.g. ['.pdf','.xml']. Empty means every attachment.
max_attachmentsinteger–Hard cap on files written. `truncated: true` in the result means you hit it.
max_threadsinteger–Threads scanned. Page with the query.
querystring–Gmail query syntax. Narrow it with a date window.
save_dirstring–A folder INSIDE the account's attachments folder (e.g. "2026-09/invoices"); empty for the folder itself. Copy files from the result's path to where they belong.

No output schema declared.

No examples provided.

health ~318

Check that every grant is alive, per product and per account. Under `gmail`, per grant: the mailbox each credential resolves to, the scope Google actually GRANTED (not the one credentials.json declares), whether it can write, and the OAuth client the live token belongs to; an account may hold its own gmail.modify grant and a gmail.readonly one, and `activeGrant` is the one the tools use. Under `calendar`: that the grant refreshes, which account it resolves to (the consent screen offers every account signed in), and whether it carries the scopes the tools need. Under `drive`: which account the grant acts as and the storage used. Under `editors` (Docs, Sheets, Slides), per account: the address, the granted scopes, and whether each of the three APIs is enabled in the grant's Cloud project. Under `tasks`, `contacts` and `meet`, per account with a grant: the address, the granted scopes, and whether the API answers (`disabled` when its Cloud project has not enabled it); contacts also says which sources it reads. Under `config`: where the state directory, the OAuth client, the mailboxes and each account's address come from (a variable, or what setup or a consent saved; a variable that is set wins). Checks EVERY account by default. Run this before concluding the server is broken, and before retrying a write that refused.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account (the default).

No output schema declared.

No examples provided.

link_sheet_cells ~120

Add or replace hyperlinks on existing plain text cells in one atomic batch. Keeps their values, validation and all other formatting. Row and column are 1-based. Every cell must still contain expected_text; formulas, rich text and chips are refused before any write.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
linksarrayyes–
sheetstringyes–
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

list_accounts ~225

The Google accounts this server reaches, per product. Start here: every other tool takes one of these labels. Under `gmail`: the mailboxes, which one a tool uses when no account is given, and which grant each runs on: `modify` (its own; the write tools work) or `readonly` (a read-only grant; the write tools refuse). Under `calendar`: the accounts whose calendars it reaches, the address each grant must resolve to, and the time zone. Under `drive`: which grant Drive runs on (its own once begin_consent made one, else an rclone remote's when one is configured). Under `editors`: the accounts Docs, Sheets and Slides can act as (one may run on the Drive grant; any other needs a grant made with begin_consent). Under `tasks`, `contacts` and `meet`: the accounts with a grant for Google Tasks, for contacts and the directory, and for Meet's records. Says nothing about whether a grant is alive; that is health, which costs a round trip to Google.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_calendars ~72

Every calendar each account can see (its own, shared ones, subscriptions, holidays), with its id, the account's access to it, and whether agenda reads it by default.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).

No output schema declared.

No examples provided.

list_comments ~148

The comment threads on a Doc, Sheet, deck or any Drive file, each with its author, time, text, the text it quotes, whether it is resolved, and its replies (with any resolve or reopen action). Counts the open and resolved threads.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
file_idstringyesThe file's id, or its URL.
include_deletedboolean––
include_resolvedboolean––
max_resultsinteger––
modified_afterstring–RFC 3339; only threads changed since (a new reply counts).

No output schema declared.

No examples provided.

list_drafts ~85

The account's drafts, newest first, with recipients, subject, snippet and each draft's webUrl.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
max_resultsinteger––
page_tokenstring––
querystring–Gmail query syntax to filter drafts. Empty means all.

No output schema declared.

No examples provided.

list_filters ~71

The mailbox's Gmail filters: criteria, the labels each adds and removes (by name), and `query`, the search its criteria amount to, for applying it to mail already there with modify_labels_matching.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.

No output schema declared.

No examples provided.

list_folder ~108

The direct children of one folder. Give file_id or path; empty path means the root of My Drive. Google Docs come back with isNative true and bytes null, because a Doc has no stored bytes.

NameTypeReqDescription
file_idstring–Drive file id. Takes precedence over path.
include_trashedboolean––
limitinteger––
pathstring–Path under My Drive, e.g. "Reports/2026". Empty means the root.

No output schema declared.

No examples provided.

list_history ~131

Messages added since a historyId: incremental sync instead of re-searching the same window. Take the anchor from health's historyId, store it, pass it back next run. Anchors are per-mailbox, so keep one per account. Gmail expires old anchors: a 404 here means the anchor is too old and a full search_threads is needed to re-baseline.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
max_resultsinteger––
page_tokenstring––
start_history_idstringyes–

No output schema declared.

No examples provided.

list_labels ~43

List Gmail labels (system and user-defined) for one account.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.

No output schema declared.

No examples provided.

list_layouts ~78

A deck's (or template's) layouts, by name, and the placeholders each has (TITLE, SUBTITLE, BODY, ...).

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
presentation_idstringyesThe presentation's id, or its URL.

No output schema declared.

No examples provided.

list_meetings ~256

The Google Meet meetings one account took part in, each with its transcripts, smart notes (Gemini's notes) and recordings, as Meet records them: for a calendar event (event_id from agenda: its Meet call, and for one occurrence the sitting that started within an hour of it), for a Meet link or code (meeting), or else for the last days (at most 30: Meet keeps records 30 days). A transcript or notes is a Google Doc: its document id opens with read_document; get_transcript reads a transcript as lines with who said what. Reading an event needs the account's calendar grant too.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts; empty means the first one with a grant.
calendar_idstring–The event's calendarId, with event_id.
daysinteger–Without event_id or meeting: how many days back.
event_idstring–An event's eventId from agenda, in this account's calendar.
limitinteger–The newest meetings, at most.
meetingstring–A Meet link (https://meet.google.com/abc-defg-hij) or its code.

No output schema declared.

No examples provided.

list_permissions ~100

Every permission on a Drive file: each person, group, domain or link with its role, expiry and id, whether it comes from a shared drive, and the link sharing in one line. Read it before share_file, update_permission or remove_permission.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
file_idstringyesThe file's id, or its URL.

No output schema declared.

No examples provided.

list_revisions ~104

A Drive file's revisions, oldest first: id, time, who made it, size and checksum for files with bytes, whether it is kept forever or published, and for a Doc, Sheet or deck the formats an old revision can be saved as with download_revision.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
file_idstringyesThe file's id, or its URL.

No output schema declared.

No examples provided.

list_sheets ~71

A spreadsheet's title, locale, time zone and sheets (id, name, size, frozen rows).

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

list_task_lists ~65

Every Google Tasks list of each account (every account by default), with the taskListId the other task tools take; the default list is marked.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).

No output schema declared.

No examples provided.

list_tasks ~204

Tasks across every account by default, from every list unless task_list names one, in each list's own order. Open tasks only unless include_completed. due_from and due_to keep the tasks due between those dates (inclusive), which leaves out tasks with no due date. Each task carries account, taskListId and taskId for the write tools, parent when it is a subtask, and its link in Google Tasks. agenda with include_tasks shows the tasks due beside the events.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).
due_fromstring–YYYY-MM-DD, inclusive.
due_tostring–YYYY-MM-DD, inclusive.
include_completedboolean––
limitinteger–Per account.
task_liststring–A taskListId, "@default" for the default list, or empty (the default) for every list.

No output schema declared.

No examples provided.

mark_spam ~106

Report threads or messages as spam: into SPAM and out of the inbox, as Gmail's own button does.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
idsarrayyesThread or message ids, per `target`, from this account.
targetstring–Act on whole threads (default, what Gmail's own buttons do) or on single messages.

No output schema declared.

No examples provided.

modify_labels ~175

Add and remove labels on threads or messages. In Gmail these ARE the everyday actions: archive = remove INBOX; mark read = remove UNREAD (unread = add it); star = add STARRED; important = IMPORTANT. Labels may be given by id or by name, case-insensitively. For threads, ids that failed are listed under `failed` beside the ones changed.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
addarray––
idsarrayyesThread or message ids, per `target`, from this account.
removearray––
targetstring–Act on whole threads (default, what Gmail's own buttons do) or on single messages.

No output schema declared.

No examples provided.

modify_labels_matching ~275

Add and remove labels on EVERY thread a Gmail search matches, as Gmail's "select all conversations that match this search" does: file a sender under a label and archive it (add the label, remove INBOX), mark old mail read (remove UNREAD). A dry run by default: it returns how many threads match and a sample, and changes nothing. With dry_run false it refuses when the search matches more than `limit`, and otherwise changes every match, listing any thread that failed. To be able to find and reverse a large change later, also add a marker label created for it (e.g. 'cleanup/2026-10').

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
addarray–Labels to add, by name or id.
dry_runboolean–True (default): count and sample only. False: apply.
limitinteger–The most threads one call may change.
querystringyesGmail query syntax, e.g. 'in:inbox from:news.example.com' or 'in:inbox older_than:90d'.
removearray–Labels to remove: INBOX archives, UNREAD marks read.

No output schema declared.

No examples provided.

move_file ~160

Move one or many files into a folder, optionally renaming a single one. Sources are paths, or "id:<fileId>" to name one directly. Works the same for a Google Doc as for a PDF, which is the reason to use this instead of moving files in a synced local copy: moving a Doc's placeholder there deletes the Doc and uploads a small shortcut file in its place. Call with dry_run first; the plan names every collision.

NameTypeReqDescription
destination_idstring––
destination_pathstring––
dry_runboolean–Compute the plan and write nothing.
rename_tostring–Only legal with a single source.
sourcesarrayyesPaths, or "id:<fileId>".

No output schema declared.

No examples provided.

move_task ~186

Move a task: under parent (a subtask; top level when omitted), after previous (first among its siblings when omitted), and into another list of the same account with to_list. A repeating task cannot change lists.

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
parentstring–The taskId it goes under; omit for the top level.
previousstring–The sibling taskId it goes after; omit for the first position.
task_idstringyesThe taskId from list_tasks.
task_liststring–The list's taskListId from list_task_lists or list_tasks; "@default" (the default) is the account's default list.
to_liststring–Another taskListId of the same account to move it into.

No output schema declared.

No examples provided.

path_of ~42

The reverse of resolve_path: where a file sits, as a path, by walking its parents to the root.

NameTypeReqDescription
file_idstringyesDrive file id.

No output schema declared.

No examples provided.

read_deck ~71

Every slide's layout, title, other text (tables as rows) and speaker notes, in order.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
presentation_idstringyesThe presentation's id, or its URL.

No output schema declared.

No examples provided.

read_doc ~90

Export a Google Doc, Sheet or Slide deck as text and return it. Sheets come back as CSV. A Doc has no bytes to download, and this fetches its words in one request. Binary files are refused on purpose; download_file saves their bytes.

NameTypeReqDescription
file_idstring––
formatstring––
max_charsinteger––
pathstring––

No output schema declared.

No examples provided.

read_document ~211

A Google Doc as markdown (headings, lists, tables, bold/italic/links), with an index of its sections: each heading's stable id and path ("Plan > Risks"). Pass `section` (an id, a path or a unique title) to read one section. Returns revisionId for a later edit's expected_revision. Reads the first tab unless `tab` names another; images, footnotes and the like are left out, and `notShown` counts them.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
document_idstringyesThe document's id, or its URL.
max_charsinteger––
sectionstring–A section id, path or unique heading title. Empty reads the whole document.
tabstring–A tab other than the first: its id (t.abc) or title, from get_document. Empty means the first tab.

No output schema declared.

No examples provided.

read_rows ~166

Rows as objects keyed by the header row. Values are typed: numbers stay numbers, dates are ISO strings (sheet-local time), and a currency cell is {value, amount, formatted} with `amount` its exact decimal string. Each row has `_row`, its row number. Empty rows are skipped.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
header_rowinteger–The row that names the columns (1-based).
limitinteger––
offsetinteger––
sheetstring–The sheet (tab) name, from list_sheets. Empty means the first sheet.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

read_sheet_cells ~148

Sparse cells with entered formulas, shown values, hyperlinks, rich-text links, smart chips and notes. Row and column numbers are 1-based. offset counts physical rows; follow nextOffset until null. Use this before changing a link or formula, rather than inferring it from read_rows display text.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
limitinteger––
offsetinteger––
sheetstring–The sheet (tab) name, from list_sheets. Empty means the first sheet.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

remove_permission ~120

Remove one permission from a file: that person, group, domain or link loses access. Inherited shared-drive access cannot be removed here. It changes who can open the file: do it only on the user's explicit go for this file and these people.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
file_idstringyesThe file's id, or its URL.
permission_idstringyesThe permission's id, from list_permissions.

No output schema declared.

No examples provided.

rename_file ~65

Change a file's name in place. Names cannot contain a slash; Drive has no path, only parents.

NameTypeReqDescription
file_idstring–Drive file id. Takes precedence over path.
new_namestringyes–
pathstring–Path under My Drive.

No output schema declared.

No examples provided.

reply ~594

Answer a message, threaded properly for every party: the original's threadId, In-Reply-To and References, a 'Re:' subject, and the recipients Gmail's own Reply picks (Reply-To when the original has one, else From; a reply to a message you SENT goes to its recipients). Goes out from the alias the original reached. Creates a DRAFT unless send is true. `to` replaces the computed recipients; `cc` and `bcc` add to them.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
attachmentsarray–Files to attach. Never type or paste a file's base64 yourself: a retyped file can arrive changed. Give the path of a file in your workspace folders (the roots this client shares; without them /workdi…
bccarray–Bcc recipients (kept on a draft, stripped from what recipients see). Each entry is an address, "Name <address>", or a comma-separated list of those.
body_htmlstring–HTML body. Given alone, a plain-text alternative is generated from it; give both to control each.
body_textstring–Plain-text body: write paragraphs as single lines, never hard-wrapped. Given alone, an HTML alternative with the same lines is generated, so Gmail renders it as ordinary prose.
ccarray–Cc recipients. Each entry is an address, "Name <address>", or a comma-separated list of those.
fromstring–Send as this address. It must be one of the account's verified send-as aliases; defaults to the account's default.
message_idstringyesThe message being answered (from get_thread).
quoteboolean–Quote the original below the reply as Gmail's own Reply does, with the images the quote shows. In Gmail's conversation view the quote folds behind "•••"; with conversation view off Gmail shows every…
reply_allboolean–Also address the original's To and Cc, minus this account's own addresses.
sendboolean–false (default) saves a DRAFT and returns its webUrl. true SENDS immediately. SENDING IS OUTWARD-FACING AND CANNOT BE UNDONE: only send when the user has explicitly approved THIS message (its recipie…
subjectstring––
toarray–Recipients. Each entry is an address, "Name <address>", or a comma-separated list of those.

No output schema declared.

No examples provided.

reply_to_comment ~116

A reply on a comment thread, and/or its resolve or reopen (`action`), as the account; what the comment box's Reply and Resolve buttons do.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
actionstring––
comment_idstringyesThe comment's id, from list_comments.
contentstring––
file_idstringyesThe file's id, or its URL.

No output schema declared.

No examples provided.

resolve_path ~113

Walk a path and return the id it names. A path is a QUERY on Drive, not an address: two objects may hold the same name in one folder, and this reports that as an error listing both ids rather than picking one. Use it before any tool that writes. A Drive name may itself contain a slash (Google Meet writes folders like "Weekly sync - 2030/01/15"); those are reachable only by id, which find_files returns.

NameTypeReqDescription
pathstringyesPath under My Drive.

No output schema declared.

No examples provided.

respond_to_invite ~160

Answer an invitation: accepted, declined or tentative. Changes only your own answer. The organiser sees it on the event either way; send_updates=all also emails them.

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
calendar_idstring–Calendar id, from list_calendars or from an agenda event's calendarId. "primary" is the account's own.
event_idstringyesThe eventId from agenda.
responsestringyes–
send_updatesstring–Who is emailed about this change: "none" (the default), "all" guests, or "externalOnly" (guests outside the domain).

No output schema declared.

No examples provided.

search_developer_metadata ~204

Developer metadata: key/value tags a program attaches to the spreadsheet, a sheet, or rows and columns (createDeveloperMetadata in batch_update_spreadsheet), which then name those cells in data_filters. One tag by metadata_id, or every tag data_filters match (e.g. [{"developerMetadataLookup": {"metadataKey": "invoice-table"}}]), each with where it is attached as A1.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts (its editors section). Empty means the default account.
data_filtersarray–Instead of A1 ranges: Sheets DataFilters, each one of {"a1Range": "Sheet1!A1:B2"}, {"gridRange": {...}} or {"developerMetadataLookup": {"metadataKey": "...", ...}}: cells found by the developer metad…
metadata_idinteger––
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

search_threads ~181

Search threads with Gmail query syntax, e.g. 'from:billing.example.com after:2026/01/01 has:attachment', 'subject:invoice newer_than:30d', 'label:INBOX is:unread'. Searches EVERY registered mailbox by default and tags each result with the account it came from, so a question that does not know which mailbox holds the answer needs one call. Returns summaries; use get_thread for bodies.

NameTypeReqDescription
accountstring–Which registered mailbox. A label from list_accounts, or "*" for every mailbox at once (the default here).
max_resultsinteger–Per account, not in total.
page_tokenstring–From a previous call's per-account nextPageToken. Page ONE account at a time.
querystring–Gmail query syntax. Empty means the whole mailbox.

No output schema declared.

No examples provided.

send_draft ~111

Send an existing draft as it stands. SENDING IS OUTWARD-FACING AND CANNOT BE UNDONE: only send when the user has explicitly approved THIS message (its recipients and its text) in the current conversation. Otherwise create a draft and give the user its webUrl. Returns the sent message's webUrl.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
draft_idstringyes–

No output schema declared.

No examples provided.

send_message ~411

Send a NEW message immediately. SENDING IS OUTWARD-FACING AND CANNOT BE UNDONE: only send when the user has explicitly approved THIS message (its recipients and its text) in the current conversation. Otherwise create a draft and give the user its webUrl. Prefer create_draft. To answer an existing message use reply, which threads it. Returns the sent message's webUrl.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
attachmentsarray–Files to attach. Never type or paste a file's base64 yourself: a retyped file can arrive changed. Give the path of a file in your workspace folders (the roots this client shares; without them /workdi…
bccarray–Bcc recipients (kept on a draft, stripped from what recipients see). Each entry is an address, "Name <address>", or a comma-separated list of those.
body_htmlstring–HTML body. Given alone, a plain-text alternative is generated from it; give both to control each.
body_textstring–Plain-text body: write paragraphs as single lines, never hard-wrapped. Given alone, an HTML alternative with the same lines is generated, so Gmail renders it as ordinary prose.
ccarray–Cc recipients. Each entry is an address, "Name <address>", or a comma-separated list of those.
fromstring–Send as this address. It must be one of the account's verified send-as aliases; defaults to the account's default.
subjectstring––
toarray–Recipients. Each entry is an address, "Name <address>", or a comma-separated list of those.

No output schema declared.

No examples provided.

sender_breakdown ~181

Who the threads matching a query come from: per sending domain, busiest first, the thread and unread counts, the newest and oldest date, and its busiest addresses. The starting point for sorting a mailbox into labels and filters. A thread's sender is the author of its latest message you did not send. One mailbox per call. A few hundred threads take seconds; past that Gmail's quota allows about 25 threads a second, so a 3000-thread inbox takes about two minutes.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
limitinteger–Threads scanned at most; `more` says whether the query matched more.
querystring–Gmail query syntax; default the inbox.
topinteger–Domains listed; the rest are summed in otherDomains.

No output schema declared.

No examples provided.

share_file ~269

Give a person or group (email_address), a domain, or anyone with the link access to a Drive file, as reader, commenter, writer (organizer roles on shared drives), with an optional expiry. Drive's email goes out only with notify: true, with `message` in it. Making someone the owner needs transfer_ownership: true. It changes who can open the file: do it only on the user's explicit go for this file and these people.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
discoverableboolean–For domain and anyone: whether it shows up in search, rather than by link only.
domainstring–For domain, e.g. example.com.
email_addressstring–For user and group.
expiration_timestring–RFC 3339: when the access ends.
file_idstringyesThe file's id, or its URL.
messagestring–The email's text, with notify.
notifyboolean–Send Drive's email to the person or group.
rolestringyes–
transfer_ownershipboolean––
typestringyes–

No output schema declared.

No examples provided.

start_drive_cursor ~47

A token meaning "from now on". Keep it, and hand it to drive_changes later. This is the cheap half of keeping anything in step with Drive: one call, no listing.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

Install

How do I install the Google Workspace MCP server?

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

npm · @foreverworks/mcp-google

# add to Claude Code
claude mcp add com-foreverworks-google -- npx -y @foreverworks/mcp-google
Common questions

What is the Google Workspace MCP server?

Google Workspace is an MCP server listed in the public MCP registry as com.foreverworks/google. Search and work in Gmail, Calendar, Drive, Docs, Sheets and Slides across several Google accounts. This page covers its npm package (@foreverworks/mcp-google).

Is the Google Workspace MCP server safe to use?

Google Workspace scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Google Workspace MCP server expose?

Google Workspace exposes 115 tools: add_chart, add_comment, agenda, append_rows, append_to_document, and 110 more. Their descriptions and schemas cost roughly 23,242 tokens of context every time the server is loaded.

Is the Google Workspace MCP server still maintained?

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

What licence is the Google Workspace MCP server under?

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