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 (6 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
add_chart ~209

A chart over a data range: the first column is the domain (x axis, pie labels), the other columns (or series_columns) the series.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
anchor_cellstringyesWhere the chart's top-left corner sits, e.g. "Sheet1!H2".
data_rangestringyesA1 range, e.g. "Sheet1!A1:D20", "B:B" or "2:2". No sheet name means the first sheet.
headersboolean–Whether the data's first row names the series.
series_columnsarray–Column letters to plot, e.g. ["C","E"]. Empty means every column after the first.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.
titlestring––
typestringyes–

No output schema declared.

No examples provided.

add_comment ~158

A new comment thread on a Drive file, as the account. `quoted` shows the text it is about beside it. Google Docs shows a comment made through the API on the file, not anchored to text (Google's limit); `anchor` is for file types whose viewer reads one. Everyone with access to the file sees it.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
anchorstring–Drive's anchor JSON, for non-Google files.
contentstringyes–
file_idstringyesThe file's id, or its URL.
quotedstring–The passage the comment is about.

No output schema declared.

No examples provided.

agenda ~361

Events across EVERY account at once, in time order, for a window: today and the next days by default. Also returns `conflicts` (busy events that overlap, including across accounts, e.g. a work meeting over a dentist appointment), `probableDuplicates` (one appointment booked into both accounts as two events) and `pendingInvites` (invitations not yet answered). Recurring events are expanded into their instances; an event seen through both accounts is listed once, with `alsoOn`. Declined events are left out unless asked for. Each event carries the account, calendarId and eventId that get_event, update_event, delete_event and respond_to_invite need. include_tasks adds `tasksDue`: the Google Tasks not yet done that fall due on the window's days (a task has a due date, never a time).

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).
calendars––"selected" (what the Calendar app shows, the default), "primary" (each account's own calendar only), "all", or a list of calendar ids or names.
daysinteger–Window length when `to` is empty; at most 366.
fromstring–YYYY-MM-DD or a time. Empty means today (UTC).
include_declinedboolean––
include_tasksboolean–Also the open tasks due on these days, from the same accounts' Google Tasks.
limitinteger––
querystring–Free-text search over title, description, location and guests.
tostring–Exclusive end. Empty means `days` after from.

No output schema declared.

No examples provided.

append_rows ~184

Rows after the last one holding data, keyed by the header, formatted like the row above. One atomic batch.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
header_rowinteger–The row that names the columns (1-based).
rowsarrayyesObjects keyed by the header row's names. Numbers and booleans are stored as such, "=..." as a formula, "YYYY-MM-DD" (or with THH:MM) as a date, any other string as text; null clears a cell. A key the…
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.

append_to_document ~177

Markdown added after the document's last paragraph, in one batch.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
document_idstringyesThe document's id, or its URL.
expected_revisionstring–The revisionId read_document returned. When given, the edit is refused if the document has changed since.
markdownstringyesMarkdown: # headings, paragraphs, - and 1. lists (nested by indent), **bold**, *italic*, ~~strike~~, `code`, ``` fences, [links](url), | tables |.
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.

append_values ~246

Rows after the table Sheets finds at an A1 range (values.append), as new rows (INSERT_ROWS) or over empty ones (OVERWRITE). Returns where they went. Not retried after a lost answer, since a retry would add them twice. append_rows is the variant keyed by a header row.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
include_valuesboolean––
insert_datastring––
major_dimensionstring––
rangestringyesWhere the table is, e.g. "Sheet1!A1" or "Sheet1!A:E".
spreadsheet_idstringyesThe spreadsheet's id, or its URL.
value_inputstring–USER_ENTERED parses as if typed ("=SUM(A:A)" a formula, "2026-10-08" a date, "12.5" a number); RAW stores strings as text.
valuesarrayyesRows of cells (columns with major_dimension COLUMNS). null leaves a cell as it is; "" empties it.

No output schema declared.

No examples provided.

batch_update_document ~641

Any Google Docs API batchUpdate: text, styles, bullets, tables (insert, merge, row and column, cell style), images by URL, headers, footers, footnotes, page and section setup, named ranges, tabs, replace all text, and the rest; local images through `images`. One atomic batch, checked against the API's schema before anything is sent (a wrong field is refused with the nearest right name). Requests apply in order, each to the document as the ones before left it: work from the end of the document backwards so earlier indices stay valid. A batch that names an index needs expected_revision (refused if the document changed) or target_revision (Docs carries the positions over later edits), from get_document or find_in_document. In a tab other than the first, put tabId in each location and range. Returns the new revisionId and the replies that carry ids or counts, by request position.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
document_idstringyesThe document's id, or its URL.
expected_revisionstring–The revisionId these requests were computed from; the batch is refused if the document is no longer at it.
imagesobject–Local PNG, JPEG or GIF images by name; use "image:<name>" as the image URL in a request (insertInlineImage.uri, createImage.url, replaceImage, replaceAllShapesWithImage.imageUrl). Each is uploaded to…
requestsarrayyesdocs batchUpdate requests, applied in order, all or none: each an object with ONE request kind, e.g. {"insertText": {"location": {"index": 1}, "text": "Hello\n"}}. Kinds: createFooter, deleteFooter,…
target_revisionstring–Instead: apply as of this revisionId, with Docs moving the positions over edits made since.

No output schema declared.

No examples provided.

batch_update_presentation ~587

Any Google Slides API batchUpdate: slides (create, duplicate, reorder, delete, background), shapes, text boxes, images (by URL, or local files through `images`), videos, lines, tables (rows, columns, merges, cell and border styles), Sheets charts, text and its styles, bullets, replace all text or shapes with images, transforms, z-order, alt text and the rest. One atomic batch, checked against the API's schema before anything is sent. Ids you choose for new objects (5 to 50 characters, starting with a letter or _) can be referred to by later requests in the same batch. expected_revision (from get_presentation) refuses the batch if the deck changed. Returns the new revisionId and the replies that carry ids, by request position.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
expected_revisionstring–The revisionId these requests were computed from; the batch is refused if the deck is no longer at it.
imagesobject–Local PNG, JPEG or GIF images by name; use "image:<name>" as the image URL in a request (insertInlineImage.uri, createImage.url, replaceImage, replaceAllShapesWithImage.imageUrl). Each is uploaded to…
presentation_idstringyesThe presentation's id, or its URL.
requestsarrayyesslides batchUpdate requests, applied in order, all or none: each an object with ONE request kind, e.g. {"createSlide": {"objectId": "slide_intro", "slideLayoutReference": {"predefinedLayout": "TITLE_…

No output schema declared.

No examples provided.

batch_update_spreadsheet ~639

Any Google Sheets API batchUpdate: sheets (add, duplicate, delete, properties), rows and columns (insert, delete, move, resize, group, hide), cells (values with formats, repeat a format, borders, merges, copy/cut/paste, sort, find and replace, data validation, autofill), conditional formatting, filters and filter views, protected, named and banded ranges, charts, slicers, tables, pivots (as cell data) and developer metadata. One atomic batch, checked against the API's schema before anything is sent. Where a request takes a GridRange, GridCoordinate or DimensionRange, A1 naming the sheet works too ("Sheet1!A1:C10", "Sheet1!B3", "Sheet1!3:5" for rows, "Sheet1!B:D" for columns); a sheet added in the same batch is named by the sheetId set in its addSheet. Colours are {red, green, blue} from 0 to 1. Returns the replies that carry ids or counts, by request position.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
requestsarrayyessheets batchUpdate requests, applied in order, all or none: each an object with ONE request kind, e.g. {"repeatCell": {"range": "Sheet1!A1:D1", "cell": {"userEnteredFormat": {"textFormat": {"bold": t…
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

begin_consent ~165

Start granting one product access to one account: gmail (its own gmail.modify grant), calendar, editors (Docs, Sheets, Slides), drive (Drive's one grant), tasks (Google Tasks), contacts (contacts, saved addresses and a Workspace directory, read only) or meet (Meet records and transcripts, read only). Returns the URL to open in a browser, where the user approves as the account named. The redirect then fails to load; pass the URL it tried to complete_consent within 15 minutes. No token ever leaves the server.

NameTypeReqDescription
accountstringyesThe account label, as list_accounts names it.
grantstring–Gmail only: the grant to consent. modify is the only one this server holds.
productstringyes–

No output schema declared.

No examples provided.

clear_values ~194

Empty the values of several A1 ranges (or the cells data_filters choose), keeping their formatting, validation and notes. Returns the ranges cleared.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
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…
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.

No output schema declared.

No examples provided.

complete_consent ~94

Finish a consent from the URL the approval redirected to (http://localhost:...?state=...&code=...). The grant is checked (the right account, every scope ticked, a refresh token) and saved where the product reads it, and the product uses it from the next call. Returns what was granted, never a token.

NameTypeReqDescription
redirect_urlstringyesThe whole URL from the browser's address bar.

No output schema declared.

No examples provided.

complete_task ~114

Mark a task done, or open again with completed: false. A task already in that state is left as it is.

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
completedboolean––
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.

No output schema declared.

No examples provided.

copy_file ~94

Copy one file to a folder, retaining native Google formats and formulas. Does not copy folders, comments or version history. Refuses existing names; inspect the destination after an uncertain response before retrying. Original is unchanged.

NameTypeReqDescription
destination_idstringyes–
expected_modifiedstring–Refuse if source modifiedTime differs from this observed value.
file_idstringyes–
namestring––

No output schema declared.

No examples provided.

copy_sheet_to ~144

One sheet, with its formats, charts and validation, copied into another spreadsheet (or the same one when destination is empty). It arrives last, titled "Copy of <title>"; returns its sheetId and title.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
destination_spreadsheet_idstring–The spreadsheet to copy into, by id or URL. Empty means the same one.
sheetstring–The sheet's title or sheetId. Empty means the first sheet.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.

No output schema declared.

No examples provided.

create_deck_from_outline ~187

Copy a template deck through Drive, then add one slide per outline entry from the named layout, filling its title/subtitle/body placeholders and speaker notes, and delete the template's own slides unless kept. The outline is checked against the template before anything is copied.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
folder_idstring–Drive folder id to create it in. Takes precedence over folder_path.
folder_pathstring–Folder path under My Drive, e.g. "Clients/Acme". Both empty means the root.
keep_template_slidesboolean––
outlinearrayyes–
template_idstringyesThe template deck's id, or its URL.
titlestringyesThe new deck's name.

No output schema declared.

No examples provided.

create_document ~165

A new Google Doc from markdown, in a Drive folder or My Drive's root. Returns its id and link.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
folder_idstring–Drive folder id to create it in. Takes precedence over folder_path.
folder_pathstring–Folder path under My Drive, e.g. "Clients/Acme". Both empty means the root.
markdownstring–Markdown: # headings, paragraphs, - and 1. lists (nested by indent), **bold**, *italic*, ~~strike~~, `code`, ``` fences, [links](url), | tables |.
titlestringyes–

No output schema declared.

No examples provided.

create_draft ~393

Save a NEW message as a draft. The default path for anything addressed to someone: nothing leaves the mailbox, and the result carries the draft's webUrl for the user to review and send. For an answer to an existing message use reply (it drafts by default and threads properly), not this.

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.

create_event ~678

Add an event to one account's calendar. Needs title and start; a timed event with no end lasts an hour. Times without an offset are in UTC. Guests are NOT emailed unless send_updates says so. meet: true gives it a new Google Meet link. event_type makes focus time or an out of office block instead of an appointment (title optional for those).

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
attendeesarray–Guest email addresses. On an update this REPLACES the guest list; the result lists who that added and removed.
auto_declinestring–Focus time and out of office only: which invitations Calendar declines while it lasts. "none" (the default), "new" (only those that arrive meanwhile) or "all" (every conflicting one, accepted ones to…
busyboolean–Whether it blocks time ("show as busy"). Default true.
calendar_idstring–Calendar id, from list_calendars or from an agenda event's calendarId. "primary" is the account's own.
chat_statusstring–Focus time only: the status Google Chat shows meanwhile.
decline_messagestring–Focus time and out of office only: the note a decline carries.
descriptionstring––
duration_minutesinteger–Length when end is omitted. Default: an hour for a new event; on an update, the length it already had.
endstring–Same forms as start, and the same kind. All-day ends are EXCLUSIVE: a one-day event on the 29th ends on the 30th. Omit to use duration_minutes.
event_typestring–"default" (an appointment), "focusTime" or "outOfOffice". The last two go on the primary calendar, need a start and an end with times (never all day), take no guests or Meet link, and always block th…
locationstring––
meetboolean–true: Google makes a new Meet call for the event, and the result carries its link (meetingUrl). On an update, adds one to an event that has none.
recurrencearray–Repeat rule as RFC 5545 lines: ["RRULE:FREQ=YEARLY"] for a birthday, ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR"] for a gym slot. On an update of a series this REPLACES the rule; [] stops it repeating.
reminders_minutesarray–Popup reminders, in minutes before the start, replacing the calendar's defaults. [] means none.
send_updatesstring–Who is emailed about this change: "none" (the default), "all" guests, or "externalOnly" (guests outside the domain).
startstring–YYYY-MM-DD for an all-day event, YYYY-MM-DDTHH:MM for a time in the server's zone (UTC), or RFC 3339 with an offset.
titlestring–The event's title.

No output schema declared.

No examples provided.

create_filter ~348

Create a Gmail filter for mail that arrives from now on. Actions are labels, by name or id: add a label to file it; remove INBOX to skip the inbox, UNREAD to mark it read; add STARRED or IMPORTANT. Adding TRASH or SPAM needs discard: true, since such mail is never seen. No forwarding. It does not touch mail already there: the result's filter.query is the search to give modify_labels_matching for that. Gmail has no filter update; to change one, create the new one and delete the old. Needs the gmail.settings.basic scope on the account's grant, and says so if it is missing.

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 (names or ids). Create a missing one first with create_label.
discardboolean–Allow add to hold TRASH or SPAM: arriving mail then goes there unseen.
fromstring–Sender: an address, a domain (e.g. news.example.com), or Gmail's from: syntax.
has_attachmentboolean––
negated_querystring–"Doesn't have": none of these words.
querystring–Any Gmail search ("Has the words"), e.g. 'list:github.com OR from:notifications@github.com'.
removearray–Labels to remove: INBOX skips the inbox, UNREAD marks read.
subjectstring–Words in the subject.
tostring–Recipient, as in Gmail's to:.

No output schema declared.

No examples provided.

create_folder ~58

Create a folder and every missing folder above it, in one call. Returns which levels it had to create, so a typo shows up as a folder you did not expect to be new.

NameTypeReqDescription
pathstringyesFull path under My Drive.

No output schema declared.

No examples provided.

create_label ~148

Create a user label. Nest it under another with a slash in the name, e.g. 'Clients/Acme'.

NameTypeReqDescription
accountstringyesWhich mailbox this writes to or sends from: a label from list_accounts. Required; there is no default for writes.
background_colorstring–Hex from Gmail's fixed palette, e.g. #16a766. Needs text_color too.
label_list_visibilitystring–In the label list on the left.
message_list_visibilitystring–On messages in the message list.
namestringyes–
text_colorstring–Hex from Gmail's fixed palette, e.g. #ffffff.

No output schema declared.

No examples provided.

create_presentation ~141

A new, blank Google Slides deck in a Drive folder or My Drive's root, to build with batch_update_presentation. Returns its id, link, revisionId and the object id of the title slide Slides gives every new deck.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
folder_idstring–Drive folder id to create it in. Takes precedence over folder_path.
folder_pathstring–Folder path under My Drive, e.g. "Clients/Acme". Both empty means the root.
titlestringyes–

No output schema declared.

No examples provided.

create_spreadsheet ~141

A new Google Sheet, optionally with named sheets and bold, frozen header rows, in a Drive folder or My Drive's root.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
folder_idstring–Drive folder id to create it in. Takes precedence over folder_path.
folder_pathstring–Folder path under My Drive, e.g. "Clients/Acme". Both empty means the root.
sheetsarray–Sheets to create, in order. Empty keeps the one default sheet.
titlestringyes–

No output schema declared.

No examples provided.

create_task ~198

Add a task to one account's list. Needs a title; notes and a due date are optional. parent makes it a subtask of another task in the same list; previous places it after that sibling (first otherwise).

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
duestring–The day it is due: YYYY-MM-DD. Google Tasks keeps a date only, never a time of day.
notesstring––
parentstring–A taskId in the same list: the new task becomes its subtask.
previousstring–A sibling's taskId: the new task goes right after it.
task_liststring–The list's taskListId from list_task_lists or list_tasks; "@default" (the default) is the account's default list.
titlestringyes–

No output schema declared.

No examples provided.

create_task_list ~56

A new Google Tasks list in one account; returns its taskListId.

NameTypeReqDescription
accountstringyesWhich account this writes to: a label from list_accounts. Required; writes have no default.
titlestringyes–

No output schema declared.

No examples provided.

delete_comment ~106

Delete a comment thread with its replies, or one reply with reply_id. Drive lets an account delete only what it wrote (owners excepted).

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

No output schema declared.

No examples provided.

delete_draft ~69

Delete a draft permanently (drafts do not go to Trash). The draft's message is gone with it.

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.

delete_event ~218

Delete an event (an instance id from agenda deletes that one occurrence; a series id, every occurrence, is refused unless scope is "series"). On an event someone else organised this removes it from this calendar only; to say no, use respond_to_invite with declined.

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.
scopestring–"one" (the default): the event or the one occurrence the eventId names. "series": required when the eventId is a whole recurring series, which this then changes in every occurrence.
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.

delete_filter ~64

Delete a Gmail filter by id (list_filters). Mail it already filed keeps its labels.

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

No output schema declared.

No examples provided.

delete_label ~80

Delete a user label, given by id or name. It is removed from every message that carries it; the messages themselves are untouched. System labels are refused.

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

No output schema declared.

No examples provided.

describe_file ~64

Everything Drive reports about a single file or folder, by id or path.

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

No output schema declared.

No examples provided.

download_file ~288

Save a file from Drive into /tmp/.local/state/mcps/google/drive/downloads, which you can read, and prove it: the bytes are checked against Drive's own checksum before anything is written, so a damaged download is never saved. For a file no local copy has yet, or one known only by its id. A Google Doc, Sheet, Slides deck or Drawing has no bytes and is exported instead (a Doc as pdf, a Sheet as xlsx, Slides as pptx, a Drawing as png, unless format says otherwise). An earlier download of the same name in that folder is replaced. Returns the file with the saved path, size, sha256, md5 and verifiedBy (exportedAs for a Google file).

NameTypeReqDescription
file_idstring–The file's id. Takes precedence over path.
filenamestring–The saved name; defaults to Drive's, with the export's extension.
formatstring–For a Google file only: what to save it as. Empty is its default.
pathstring–The file's path under My Drive, e.g. "Reports/summary.pdf".
save_dirstring–A folder inside /tmp/.local/state/mcps/google/drive/downloads to save into; empty is /tmp/.local/state/mcps/google/drive/downloads itself.

No output schema declared.

No examples provided.

download_revision ~176

One revision of a file into the downloads folder: a file with bytes as it was, checked against the revision's MD5; a Google file exported (a Doc as PDF unless `format` says otherwise). Returns the path, size and sha256. To roll back, upload it as a new version.

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.
filenamestring–Defaults to the file's name with the revision id.
formatstring–For a Google file: what to save it as.
revision_idstringyesThe revision's id, from list_revisions.
save_dirstring–A folder inside the downloads folder.

No output schema declared.

No examples provided.

drive_changes ~96

Every file created, edited, moved, trashed or removed since the cursor, and a new cursor to use next time. Only the delta comes back, so this costs the same whether the Drive holds 20 files or 20,000. Call it again while exhausted is false to drain the backlog.

NameTypeReqDescription
cursorstringyesA cursor from start_drive_cursor or from a previous drive_changes call.
limitinteger––

No output schema declared.

No examples provided.

edit_comment ~123

New text for a comment, or for one of its replies with reply_id. Drive lets an account edit only what it wrote.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
comment_idstringyesThe comment's id, from list_comments.
contentstringyes–
file_idstringyesThe file's id, or its URL.
reply_idstring–A reply's id, to edit the reply rather than the comment.

No output schema declared.

No examples provided.

edit_document_section ~344

Replace everything under one heading (its subsections included) with markdown, keeping the heading. Read the section with read_document first and pass its revisionId: the edit is one batch, pinned to that revision. Headings in the new body must be deeper than the section's own. Refused when the section holds images, footnotes or other things read_document does not show (drop_hidden: true deletes them), and for an empty body (clear: true empties the section). Returns the document's title and the section's size before and after, in characters of markdown.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
clearboolean–With an empty markdown: delete everything under the heading.
document_idstringyesThe document's id, or its URL.
drop_hiddenboolean–Delete the images, footnotes and the like the section holds along with its text.
expected_revisionstringyesThe revisionId read_document returned for the text this replaces. The edit is refused if the document has changed since.
markdownstringyesMarkdown: # headings, paragraphs, - and 1. lists (nested by indent), **bold**, *italic*, ~~strike~~, `code`, ``` fences, [links](url), | tables |.
sectionstringyesThe section's id, path or unique heading title, from read_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.

editors_api_reference ~177

What a Google Docs, Sheets or Slides batchUpdate request takes, from the API's own schema (the revision batch_update_document, batch_update_spreadsheet and batch_update_presentation check against): each field's type, allowed values and meaning, with the types it refers to expanded `depth` levels down (`more` lists the rest by name). Name a request kind (updateTextStyle, repeatCell, createShape) or any type (TextStyle, CellFormat, PageElementProperties); with no name, every request kind and its one-line summary. Kinds marked Developer Preview need the Cloud project in Google's preview program.

NameTypeReqDescription
apistringyes–
depthinteger–How many levels of referred types to expand.
namestring–A request kind or a type name. Empty lists the request kinds.

No output schema declared.

No examples provided.

fill_placeholders ~134

Replace every {{tag}} with its value (exact case) across the deck, or only the slides named. Reports how many of each were found.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
presentation_idstringyesThe presentation's id, or its URL.
slide_idsarray–Slide object ids (read_deck) to limit it to. Empty means every slide.
valuesobjectyesTag to text, e.g. {"client": "Acme"} fills {{client}}.

No output schema declared.

No examples provided.

find_files ~169

Search the whole Drive without listing it. Combine any of name_contains, full_text, mime_type, parent_id and modified_after; they are ANDed. This is the tool to reach for instead of walking folders, or a local copy of the Drive, which costs a full tree scan for the same answer.

NameTypeReqDescription
full_textstring–Search inside document contents, Google's own index.
include_trashedboolean––
limitinteger––
mime_typestring–e.g. "application/vnd.google-apps.folder" or "application/pdf".
modified_afterstring–RFC 3339; a bare date means midnight UTC.
name_containsstring––
parent_idstring–Restrict to one folder's direct children.

No output schema declared.

No examples provided.

find_in_document ~240

Every place a text appears in one tab of a Google Doc (body, headers, footers and footnotes unless segments is body), as ranges [startIndex, endIndex) to use in batch_update_document (with tabId and, outside the body, segmentId), each with its paragraph's range and named style. Returns the revisionId the ranges are right for. With regex, text is a JavaScript regular expression (run under a time limit); a match never crosses a paragraph.

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.
match_caseboolean––
max_resultsinteger––
regexboolean–text is a regular expression, e.g. "\{\{[a-z_]+\}\}" for placeholders.
segmentsstring––
tabstring–A tab's id (t.0) or its title. Empty means the first tab.
textstringyes–
whole_wordboolean––

No output schema declared.

No examples provided.

find_people ~213

Find a person's email address by name, across every account at once: each account's contacts, the addresses Gmail saved from mail it sent or received ('other'), and a Workspace domain's directory. The query matches the start of a name, an address, a phone number or an organisation. One entry per person, merged by address, with every account and source it was found in; a source an account cannot read is listed under `unavailable` with the reason. Use it before addressing a draft or an invitation to someone named.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).
limitinteger–Per account and source, before merging.
querystringyesA name or its start ("Ana Pop"), or the start of an address or a phone number.
sourcesarray–Where to look: "contacts", "other" (saved from mail) and "directory" (Workspace). Default all three.

No output schema declared.

No examples provided.

find_time ~557

Candidate slots of `duration_minutes` across EVERY account (and optional `attendees`), inside working hours (default Mon-Fri 09:00-18:00 UTC), after a minimum notice, clear of existing events plus buffers, on a step grid, ranked earliest first or with mornings/afternoons first. Returns `slots` (overlapping candidates, e.g. 09:00 and 09:30 for an hour) and `ranges` (the free stretches they come from). Tentative events block time unless `tentative_is_free`. If some busy time could not be read, `complete` is false and `unknown` says what.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).
attendeesarray–Other people's addresses whose free/busy an account may see (colleagues in the same organisation, anyone who shared their calendar). Needs the calendar.events.freebusy scope; without it they are list…
buffer_after_minutesinteger–Free time kept after each existing event.
buffer_before_minutesinteger–Free time kept before each existing event.
calendars––"selected" (what the Calendar app shows, the default), "primary" (each account's own calendar only), "all", or a list of calendar ids or names.
daysinteger–Window length when `to` is empty; at most 62.
duration_minutesintegeryesMeeting length.
fromstring–YYYY-MM-DD or a time. Empty means today (UTC).
hours_endstring–Working hours end, HH:MM local, exclusive; 24:00 is midnight. After hours_start.
hours_startstring–Working hours start, HH:MM local.
max_resultsinteger––
min_notice_minutesinteger–No slot starts sooner than this from now.
preferstring–Rank: earliest first, or that half of the day (before/after 12:00 local) first.
step_minutesinteger–Slots start on this grid from hours_start: 30 gives :00 and :30.
tentative_is_freeboolean–Offer slots over tentative events and "maybe" answers.
time_zonestring–IANA zone for the working hours, the window and the answer. Empty means the server's zone (UTC).
tostring–Exclusive end. Empty means `days` after from.
working_daysarray–Days a slot may fall on, in the working-hours zone.

No output schema declared.

No examples provided.

format_range ~224

Number format, bold/italic, colours, alignment, wrapping, borders and frozen rows/columns for a range. Only what is given changes.

NameTypeReqDescription
accountstringyesWhich account this writes as: a label from list_accounts (its editors section). Required; writes have no default.
backgroundstring–"#RRGGBB".
boldboolean––
bordersobject––
foregroundstring–"#RRGGBB".
freeze_columnsinteger––
freeze_rowsinteger–Rows frozen at the top of the range's sheet.
horizontal_alignmentstring––
italicboolean––
number_formatobject––
rangestringyesA1 range, e.g. "Sheet1!A1:D20", "B:B" or "2:2". No sheet name means the first sheet.
spreadsheet_idstringyesThe spreadsheet's id, or its URL.
vertical_alignmentstring––
wrapstring––

No output schema declared.

No examples provided.

forward ~491

Forward a message WITH its attachments, under Gmail's 'Forwarded message' block, with an optional note above it (body_text / body_html). Creates a DRAFT unless send is true. Extra attachments can be added.

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.
include_attachmentsboolean–Carry the original's attachments. Default true. The images its body shows travel either way.
message_idstringyesThe message to forward (from get_thread).
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.

free_busy ~286

When the user is busy across EVERY account in a window, per calendar, plus one merged, de-duplicated `busy` timeline that also covers any `attendees`. Busy means: not cancelled, not "show as available", not declined; tentative events and "maybe" answers count as busy and are flagged `tentative`; an all-day event left as busy blocks its whole day. Anything that could not be read is listed under `unknown` and `complete` is false.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts, or "*" for every account at once (the default).
attendeesarray–Other people's addresses whose free/busy an account may see (colleagues in the same organisation, anyone who shared their calendar). Needs the calendar.events.freebusy scope; without it they are list…
calendars––"selected" (what the Calendar app shows, the default), "primary" (each account's own calendar only), "all", or a list of calendar ids or names.
daysinteger–Window length when `to` is empty; at most 62.
fromstring–YYYY-MM-DD or a time. Empty means today (UTC).
tostring–Exclusive end. Empty means `days` after from.

No output schema declared.

No examples provided.

get_attachment ~213

Download one attachment to disk by message_id + attachment_id (both come from get_thread). This is the capability Google's own Gmail MCP server does not have: it reports an attachment's name and id and gives you no way to fetch the bytes. Returns the path, size and sha256; a download whose size differs from the one Gmail reports for the part is refused and nothing is saved. A different file already saved under the name is kept, and this one is saved as "name (2).ext".

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
attachment_idstringyes–
filenamestring–Defaults to <attachment_id>.bin. Path separators are stripped.
message_idstringyes–
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.

get_document ~455

A Google Doc's structure with the indices batch_update_document needs: every tab, and for one tab its body as elements (paragraphs with named style, heading id, bullet, styled runs and objects such as images or footnote marks; tables with each cell's range and content; section breaks; tables of contents), each with range [startIndex, endIndex). A paragraph's `text` holds one U+FFFC per non-text index, so offset k of text is index range[0]+k; its newline is range[1]-1. Styles are shown short ("11pt", "#1a73e8"); in requests write {magnitude: 11, unit: "PT"} and {color: {rgbColor: {red, green, blue}}} (0 to 1). `parts` adds headers, footers, footnotes, lists, named ranges, objects (image sizes and sources) and styles (page setup, named styles); `notShown` says what exists beyond them. A long body is cut at an element (`nextIndex`: read on with start_index). format raw returns the API's JSON, narrowed by `fields`. Returns revisionId for expected_revision. For prose, read_document's markdown is cheaper.

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.
end_indexinteger–Only body elements that start before this index.
fieldsstring–format raw only: a field mask over the Document, e.g. "revisionId,tabs(tabProperties)".
formatstring––
max_charsinteger––
partsarray–What to include for the tab.
start_indexinteger–Only body elements that end after this index.
suggestionsstring–How suggested edits show: inline with their ids, as if accepted, or as if rejected. Default: Docs' choice for the account's access.
tabstring–A tab's id (t.0) or its title. Empty means the first tab.

No output schema declared.

No examples provided.

get_draft ~71

One draft: its message (headers, Bcc included, bodies and attachments) and its webUrl.

NameTypeReqDescription
accountstring–Which registered mailbox: a label from list_accounts; empty means the default account.
detailstring–As on get_message.
draft_idstringyes–

No output schema declared.

No examples provided.

get_event ~95

One event in full: description, guest list with each answer, reminders, meeting link, recurrence.

NameTypeReqDescription
accountstring–Which account: a label from list_accounts; empty means the default account.
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.

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.