Skip to main content
Glama
rajool

google-workspace-mcp

by rajool

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GWM_HOMENoOverride config home directory. Defaults to $XDG_CONFIG_HOME/google-workspace-mcp or ~/.config/google-workspace-mcp
GWM_ACCOUNTSNoComma-separated list of account slugs or inline JSON map to expose. Omit to expose all accounts from registry.
GWM_TOKENS_DIRNoOverride directory for per-account token files.
GWM_CREDENTIALSNoOverride path to OAuth client credentials JSON file.
GWM_ACCOUNTS_FILENoOverride path to account registry JSON file.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
accounts_listA

List the configured Google accounts and whether each token still works.

`authorized` is proven by refreshing each token against Google (null
if Google could not be reached), not by the token file existing; a
dead account carries a `status` and a `detail` naming the fix.
gmail_sendA

Send an email immediately from the given account.

Replies: pass thread_id and nothing else. The server reads the thread and
quotes its history below your text exactly as Gmail's web Reply does, and
derives the In-Reply-To / References headers itself. So write `body` as
ONLY the new message — never paste earlier messages into it by hand, or
the recipient gets the history twice. (`in_reply_to_message_id` overrides
the derived header when you already hold the RFC822 Message-Id;
`quote_history=false` sends into the thread with no quote.)

Body format: write `body` as plain text — blank-line paragraphs,
"- " bullets, "1." / "1)" numbered lines (ASCII or Persian digits).
It goes out as multipart/alternative with a Gmail-composer-style HTML
part, so lists arrive as Gmail's real bullets/numbering and the draft
can be opened and sent from the Gmail web UI safely. Never hard-wrap
lines yourself. Set html=true only for a body that is already HTML.

`attachments` are paths on the machine running this server. Each is
attached under its own file name, with the MIME type guessed from that
name and `application/octet-stream` as the fallback.
gmail_draft_createA

Create a Gmail draft. Returns {id, message: {...}}.

Replies: pass thread_id and nothing else. The server reads the thread and
quotes its history below your text exactly as Gmail's web Reply does, and
derives the In-Reply-To / References headers itself. So write `body` as
ONLY the new message — never paste earlier messages into it by hand, or
the recipient gets the history twice. (`in_reply_to_message_id` overrides
the derived header when you already hold the RFC822 Message-Id;
`quote_history=false` sends into the thread with no quote.)

Body format: write `body` as plain text — blank-line paragraphs,
"- " bullets, "1." / "1)" numbered lines (ASCII or Persian digits).
It goes out as multipart/alternative with a Gmail-composer-style HTML
part, so lists arrive as Gmail's real bullets/numbering and the draft
can be opened and sent from the Gmail web UI safely. Never hard-wrap
lines yourself. Set html=true only for a body that is already HTML.

`attachments` are paths on the machine running this server. Each is
attached under its own file name, with the MIME type guessed from that
name and `application/octet-stream` as the fallback.
gmail_draft_updateA

Overwrite an existing draft's contents.

Pass thread_id when the draft is a reply — it keeps the draft attached to
that thread (an update without it detaches the draft) and re-quotes the
thread's history, so `body` stays just the new text.

Body format: write `body` as plain text — blank-line paragraphs,
"- " bullets, "1." / "1)" numbered lines (ASCII or Persian digits).
It goes out as multipart/alternative with a Gmail-composer-style HTML
part, so lists arrive as Gmail's real bullets/numbering and the draft
can be opened and sent from the Gmail web UI safely. Never hard-wrap
lines yourself. Set html=true only for a body that is already HTML.

`attachments` are paths on the machine running this server. Each is
attached under its own file name, with the MIME type guessed from that
name and `application/octet-stream` as the fallback.
gmail_draft_sendC

Send an existing draft.

gmail_draft_deleteC

Permanently delete a draft (the thing the default connector can't do).

gmail_drafts_listC

List drafts. query uses standard Gmail search syntax.

gmail_searchB

Search messages with Gmail's query syntax (e.g. 'from:foo subject:bar').

gmail_message_getC

Fetch one message. format=full includes the body.

gmail_message_trashB

Move a message to Trash (reversible for 30 days).

gmail_message_modifyC

Add/remove labels on a message (e.g. mark read by removing UNREAD).

gmail_labels_listC

List all labels for the account.

gmail_label_createA

Create a label. Nested labels use 'Parent/Child' names; create each parent level first. Idempotent: an existing label is returned as-is.

gmail_thread_getC

Fetch a whole thread (all messages).

gmail_attachment_downloadA

Download one attachment to a local path. Get attachment_id from the message payload parts (gmail_message_get with format=full).

calendar_listC

List all calendars the account can access.

calendar_events_listC

List events. time_min/time_max are RFC3339 (e.g. '2026-06-05T00:00:00-07:00').

calendar_event_getC

Fetch one event.

calendar_event_createB

Create an event. start/end are RFC3339 datetimes; date-only ('2026-06-10') makes an all-day event.

calendar_event_updateB

Patch an existing event — only the fields you pass are changed.

calendar_event_deleteC

Delete an event.

drive_searchB

List/search files. query uses Drive query language; see https://developers.google.com/drive/api/guides/search-files Examples: "name contains 'budget'" "mimeType='application/vnd.google-apps.folder'" "'' in parents"

drive_file_getC

Get a file's full metadata.

drive_file_downloadB

Download a file. For Google Docs/Sheets/Slides, pass export_mime_type (e.g. 'application/pdf', 'text/plain', 'text/csv').

drive_file_uploadB

Upload a local file to Drive. convert_to_google_doc=True converts .docx/.xlsx/.pptx to native Google Docs/Sheets/Slides.

drive_file_update_contentA

Replace an existing file's contents in place. The file keeps its ID, link and sharing, and the previous contents stay in Drive's revision history. Use this rather than drive_file_upload to revise something already in Drive: uploading again under the same name creates a second file, it does not version the first. convert_to_google_doc=True revises a native Doc/Sheet/Slides from a local .docx/.xlsx/.pptx. Google Docs/Sheets/Slides keep full version history; for binary files Drive drops old revisions after 30 days or 100 revisions unless keep_revision_forever=True (at most 200 pinned per file).

drive_file_moveC

Move a file to a new folder.

drive_file_renameD

Rename a file.

drive_file_trashC

Move a file to trash (reversible).

drive_folder_createC

Create a new folder.

drive_file_shareC

Share a file with someone by email.

drive_file_link_accessA

Toggle "anyone with the link" access on a file the account owns.

Built for zero-bandwidth server-side fetches: some APIs (e.g. a
transcription service's source_url parameter) can download a Drive file
themselves — but only while it is link-accessible. Flow: enable, hand the
returned direct_download_url to the fetching service, then IMMEDIATELY
call again with enabled=false to revoke. Never leave link access on.
tasklist_listA

List the account's task lists (each has an id + title).

tasklist_createC

Create a new task list.

tasklist_deleteB

Delete a task list and all its tasks. Irreversible.

task_listB

List tasks in a list. Find ids via tasklist_list; '@default' is the account's default list.

task_getC

Fetch a single task.

task_createA

Create a task. due is RFC3339 (e.g. '2026-06-15T00:00:00Z') — Google Tasks keeps only the DATE part. parent makes it a subtask of that task id; previous orders it after that task id.

task_updateA

Patch a task's fields. status='completed' completes it (or use task_complete).

task_completeB

Mark a task completed (shortcut for status='completed').

task_deleteC

Delete a task. Irreversible.

task_moveB

Reposition a task: under parent (as a subtask) and/or after previous in the same list.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

C2.9/5.0

Scored across 42 tools

Disambiguation4/5

Most tools are cleanly separated by service and resource (gmail_message_get vs gmail_thread_get vs gmail_attachment_download), and the descriptions are detailed enough to guide selection. The notable exceptions are tasklist_list vs task_list, which are easy to mix up, and task_complete being a redundant shortcut for task_update.

Naming Consistency4/5

Names consistently use snake_case with a service prefix and mostly follow the domain_resource_action pattern (gmail_message_get, calendar_event_create, drive_file_trash, task_update). Minor deviations such as gmail_search, drive_search, calendar_list, and the plural gmail_drafts_list / calendar_events_list break the pattern slightly, but the overall convention remains predictable.

Tool Count3/5

42 tools is heavy, but the server spans four product areas (Gmail, Calendar, Drive, Tasks) plus account management, so most tools correspond to a distinct operation and each service cluster is 6-14 tools. Still, the total exceeds the comfortable range, and a few tools like task_complete and drive_file_link_access add redundancy or niche surface area.

Completeness4/5

Core lifecycles are well covered: Gmail send/draft/search/labels/threads, Calendar event CRUD, Drive upload/download/update/move/trash/share, and Tasks list/task CRUD plus move and complete. Minor gaps remain, such as no label update/delete, no Drive permission revocation, and no tasklist rename/update, but most common workflows can be completed without workarounds.

Maintenance

ActivityMaintained
ResponsivenessNo issues