
Google Services MCP Server by Nabheet: Setup for Claude, Cursor and Other Apps
Lets Claude, Cursor and other assistants read and send email, manage your calendar and edit Drive, Docs and Sheets in your own Google account.
This is an independent server by Nabheet S. Sandhu, not made by Google. It runs on your computer and covers Gmail, Calendar, Meet, Drive, Contacts, Tasks, Sheets, Docs, Slides, YouTube and Forms. Before first use you create your own Google Cloud OAuth client, then sign in with each Google account in your browser. Once connected, the assistant can send email and delete files as you, and there is no read-only mode.
Good for
- People who want an assistant to triage Gmail and draft replies
- Anyone who wants calendar events and Meet links created from a chat
- Teams filling Docs, Sheets and Slides templates from an assistant
- People with several Google accounts who want one server for all of them
Works in
12 should work
Tap an app to see how to set it up and any known problems.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Client does not support this transport.
Client does not support this transport.
Install Google Services MCP
Claude Code
- 1
Copy this prompt.
Add the Google Services MCP server to Claude Code. Run this command: claude mcp add google-services -e GOOGLE_MCP_CLIENT_ID=<GOOGLE_MCP_CLIENT_ID> -e GOOGLE_MCP_CLIENT_SECRET=<GOOGLE_MCP_CLIENT_SECRET> -- npx -y google-services-mcp Ask me for GOOGLE_MCP_CLIENT_ID, GOOGLE_MCP_CLIENT_SECRET and only put the values in that config, nowhere else. Then check that it loaded and tell me if I need to sign in or restart.
- 2
Paste it into Claude Code. It shows the change and asks before running it.
Requires Node.js 24+, Google Cloud OAuth client (Desktop app).
Read-only mode: There is no read-only mode. The server can send email and delete files.
Needs Node.js 24 or newer. Before first use, create your own Google Cloud OAuth client (Desktop app, redirect http://localhost:8787) and enable the Google APIs, then replace the two placeholders with its client ID and secret. After the server is added, sign in with each Google account: ask the assistant to connect an account, or run the add command with a nickname in a terminal.
Built from the package data we hold. Not yet tested by us.
Tools
Lists recent emails, optionally filtered by a Gmail search
Returns your newest messages first, and you can pass the same search syntax you type in Gmail, such as from:, is:unread or a date range.
Try: “Show unread emails from the last two days”
Read ·
google_gmail_listOpens one email with its sender, subject, body and attachment flags
Fetches a single message by its id and returns the headers, the readable body and whether it has attachments.
Try: “Read the email from my landlord about the lease”
Read ·
google_gmail_getLists email conversations instead of single messages
Returns conversation threads, newest first, with the same optional Gmail search query as the message list.
Try: “List my open threads with the Acme team”
Read ·
google_gmail_threads_listReads a whole email conversation in order
Returns every message in one thread, each with its headers, body and attachment details.
Try: “Summarize the full thread about the Q3 budget”
Read ·
google_gmail_threads_getSends an email from your account
Composes and sends a message right away to the recipients you name, optionally with attachments read from local file paths.
Try: “Email sam@example.com that I will be 10 minutes late”
Write ·
google_gmail_sendReplies to an email inside its conversation
Sends a reply that stays in the original thread by keeping the threading headers, so it shows up under the same conversation for the recipient.
Try: “Reply to Priya's last email and say Thursday works”
Write ·
google_gmail_replyAdds or removes labels to mark, star or archive an email
Changes the labels on a message. That is how you mark it read or unread, star it, or archive it out of the inbox.
Try: “Archive all the newsletters I just read”
Write ·
google_gmail_modifyLists the files attached to an email
Returns the names, types and ids of a message's attachments without downloading the files.
Try: “What files are attached to the invoice email?”
Read ·
google_gmail_list_attachmentsDownloads an email attachment
Returns a text attachment as text and a binary one encoded, or saves it to a local folder when you give a save path. Saving is limited to your Downloads folder unless you change the save root.
Try: “Save the PDF from that invoice email to Downloads”
Files ·
google_gmail_get_attachmentCreates a draft email without sending it
Saves a new draft with recipients, subject, body and optional attachments so you can review it in Gmail before sending.
Try: “Draft a polite follow-up to the vendor but do not send it”
Write ·
google_gmail_drafts_createRewrites an existing draft
Replaces the recipients, subject, body or attachments of a draft that already exists.
Try: “Change the draft to the vendor so it mentions the new date”
Write ·
google_gmail_drafts_updateLists your saved drafts
Returns the drafts in your account so you can pick one to read, edit or send.
Try: “What drafts do I have waiting?”
Read ·
google_gmail_drafts_listOpens one draft
Fetches a single draft with its parsed headers and body.
Try: “Show me the draft to the vendor”
Read ·
google_gmail_drafts_getSends a draft you already saved
Sends an existing draft exactly as saved.
Try: “Send the draft to the vendor now”
Write ·
google_gmail_drafts_sendDeletes a draft
Removes a saved draft from your account.
Try: “Delete my old drafts about the offsite”
Delete ·
google_gmail_drafts_deleteLists your Gmail labels
Returns all labels in the account, system and custom.
Try: “Which labels do I have?”
Read ·
google_gmail_labels_listCreates a new Gmail label
Adds a custom label that you can apply to messages.
Try: “Create a label called Receipts 2026”
Write ·
google_gmail_labels_createDeletes a Gmail label
Removes a label from the account.
Try: “Delete the label Old Projects”
Delete ·
google_gmail_labels_deleteRenames a label or changes its visibility
Edits a label's name or whether it shows in the label and message lists. Only the fields you pass change.
Try: “Rename the label Receipts to Receipts 2026”
Write ·
google_gmail_labels_updateShows your out-of-office settings
Returns the current Gmail vacation responder: whether it is on, the subject, message and date range.
Try: “Is my out-of-office reply turned on?”
Read ·
google_gmail_vacation_getChanges your out-of-office auto-reply
Turns the vacation responder on or off and edits its message and dates. While it is on, Gmail replies to incoming mail for you.
Try: “Turn on my out-of-office reply until Monday”
Write ·
google_gmail_vacation_updateLists the addresses you can send from
Returns the send-as aliases set up on the account.
Try: “Which send-as addresses can I use?”
Read ·
google_gmail_sendas_listAdds a send-as address
Creates a send-as alias, subject to Google's domain and verification rules.
Try: “Add info@mydomain.com as a send-as alias”
Write ·
google_gmail_sendas_createLists your Gmail filters
Returns the rules that automatically label, archive or forward incoming mail.
Try: “Show my Gmail filters”
Read ·
google_gmail_filters_listCreates a rule that sorts incoming mail
Adds a filter with matching criteria and an action, such as skipping the inbox or applying a label.
Try: “Auto-archive anything from noreply@shop.com”
Write ·
google_gmail_filters_createDeletes a Gmail filter
Removes a filter by its id so the rule stops running.
Try: “Delete the filter that archives shop emails”
Delete ·
google_gmail_filters_deleteMoves an email to the trash
Moves a message to Trash, where it can be restored with the untrash tool.
Try: “Trash the promo email from yesterday”
Write ·
google_gmail_trashBrings an email back from the trash
Restores a message from Trash to your mailbox.
Try: “Restore the email I trashed by mistake”
Write ·
google_gmail_untrashPermanently deletes an email
Erases a message immediately and for good, skipping Trash. The tool describes it as irreversible.
Try: “Permanently delete that spam message”
Delete ·
google_gmail_deleteLists the calendars you can see
Returns the calendars your account can reach, including shared ones.
Try: “Which calendars do I have?”
Read ·
google_calendar_list_calendarsLists upcoming events
Returns events from a calendar, optionally limited to a time range or a text query.
Try: “What is on my calendar next week?”
Read ·
google_calendar_list_eventsAdds a timed or all-day event
Creates an event with a start and end, or a single date for an all-day event.
Try: “Add lunch with Dana on Friday at 12:30”
Write ·
google_calendar_create_eventAdds an event with a Google Meet link
Creates a calendar event that comes with a new Meet video link attached.
Try: “Schedule a Meet with the design team tomorrow at 10”
Write ·
google_calendar_create_meetOpens one calendar event
Fetches a single event by id with its details.
Try: “Show the details of my 3pm meeting”
Read ·
google_calendar_get_eventEdits an existing event
Changes only the fields you pass, such as the time, title or guests.
Try: “Move the planning meeting to 4pm”
Write ·
google_calendar_update_eventDeletes a calendar event
Removes an event by its id.
Try: “Cancel my dentist appointment on the calendar”
Delete ·
google_calendar_delete_eventAccepts, declines or tentatively accepts an invite
Sets your reply on an invitation. The address you answer for must already be on the invite.
Try: “Decline the Thursday all-hands invite”
Write ·
google_calendar_respondCreates an extra calendar
Adds a secondary calendar with a name, time zone and description.
Try: “Create a calendar called Side Project”
Write ·
google_calendar_createEdits a secondary calendar
Changes a calendar's name, colour, time zone or description. Only the fields you pass change.
Try: “Rename the Side Project calendar to Launch”
Write ·
google_calendar_updatePermanently deletes a secondary calendar
Removes a secondary calendar for good. The tool describes it as destructive.
Try: “Delete the calendar called Old Project”
Delete ·
google_calendar_deleteFinds when people or calendars are free
Returns busy intervals across calendars so you can pick a meeting time. A calendar it cannot read returns an error instead of looking free.
Try: “When are Sam and I both free on Wednesday?”
Read ·
google_calendar_free_busyLists files in your Drive
Returns files newest first, optionally filtered with a Drive search query.
Try: “List the PDFs I changed this week”
Read ·
google_drive_listShows details about one Drive file
Returns the metadata of a file by id, such as its name, type and owner.
Try: “Who owns the budget spreadsheet?”
Read ·
google_drive_getCreates a file in Drive
Creates a file from text you provide or from a local file path, or a blank Google-native file if you give no content.
Try: “Upload the report at ~/Downloads/report.pdf to Drive”
Write ·
google_drive_uploadRenames a file or replaces its content
Changes a Drive file's name, its content, or both. Content can come from text or a local file path.
Try: “Replace the contents of notes.txt in Drive with this text”
Write ·
google_drive_updatePermanently deletes a Drive file
Erases a file for good, skipping Trash. The tool says to prefer trashing instead.
Try: “Permanently delete the old backup file in Drive”
Delete ·
google_drive_deleteMoves a Drive file to the trash
Puts a file in Trash, from where it can be restored.
Try: “Trash the draft budget file”
Write ·
google_drive_trashRestores a file from the trash
Takes a trashed file out of Trash so it is back in Drive.
Try: “Restore the budget file I trashed”
Write ·
google_drive_restoreShares a file with people, a domain or anyone with the link
Grants access to a file by email, to a group, to a whole domain or to anyone with the link. It can also hand over ownership.
Try: “Share the pitch deck with alex@example.com as a viewer”
Write ·
google_drive_shareShows who can open a file
Returns every person or group with access to a file and their role.
Try: “Who has access to the contracts folder?”
Read ·
google_drive_list_permissionsRemoves someone's access to a file
Revokes one permission on a file by its permission id.
Try: “Stop sharing the pitch deck with Alex”
Delete ·
google_drive_delete_permissionDownloads a Drive file
Returns the file's contents, as text or encoded for binary files, or saves it to a local folder when you give a save path. It does not work on Google Docs, Sheets or Slides, which use export.
Try: “Download the logo.png file from Drive”
Files ·
google_drive_downloadExports a Google Doc, Sheet or Slides deck to another format
Converts a Google-native file to PDF, text, Word and other formats, and can save the result to a local folder.
Try: “Export the Q3 plan doc as a PDF to Downloads”
Files ·
google_drive_exportCreates a folder in Drive
Adds a new folder, optionally inside another folder.
Try: “Create a folder called Invoices 2026”
Write ·
google_drive_create_folderMakes a copy of a file
Duplicates a Drive file, optionally with a new name.
Try: “Copy the contract template and call it Acme contract”
Write ·
google_drive_copyMoves a file into a folder
Puts a file in another folder. If you give the old parent folder it is removed from there; otherwise the file ends up in both.
Try: “Move the invoice into the Invoices 2026 folder”
Write ·
google_drive_moveLists your contacts
Returns your saved contacts with their names, emails and phone numbers.
Try: “List my contacts”
Read ·
google_contacts_listFinds a contact by name, email or phone
Searches your contacts, including non-connected contacts.
Try: “Find the email address for Maria Lopez”
Read ·
google_contacts_searchAdds a new contact
Creates a contact with a name and optionally an email, phone, address, organization or photo.
Try: “Add Sam Lee, sam@example.com, to my contacts”
Write ·
google_contacts_createEdits a contact
Changes a contact's name, email, phone, address, organization or photo while keeping their other saved entries.
Try: “Update Sam's phone number to 555-0100”
Write ·
google_contacts_updateOpens one contact
Fetches a contact by its resource name with its name, emails, phones, addresses and organization.
Try: “Show all details for Sam Lee”
Read ·
google_contacts_getDeletes a contact
Removes a contact by its resource name.
Try: “Delete the duplicate contact for Sam Lee”
Delete ·
google_contacts_deleteLists your task lists
Returns the lists in Google Tasks.
Try: “Which task lists do I have?”
Read ·
google_tasks_list_listsLists the tasks in a list
Returns tasks from one list, or your default list if you do not name one.
Try: “What is on my to-do list?”
Read ·
google_tasks_listAdds a task
Creates a task, optionally with notes, a due date, or as a subtask of another task.
Try: “Add a task to send the invoice by Friday”
Write ·
google_tasks_createEdits a task
Changes a task's title, notes, due date or status. Only the fields you pass change.
Try: “Move the invoice task's due date to Monday”
Write ·
google_tasks_updateCreates a new task list
Adds a list to Google Tasks.
Try: “Create a task list called Moving”
Write ·
google_tasks_create_listRenames a task list
Changes the title of an existing task list.
Try: “Rename the Moving list to House move”
Write ·
google_tasks_update_listDeletes a task list and its tasks
Removes a task list, and every task in it goes with it.
Try: “Delete the Moving task list”
Delete ·
google_tasks_delete_listMarks a task as done
Sets a task's status to completed.
Try: “Mark the invoice task as done”
Write ·
google_tasks_completeDeletes a task
Removes one task from its list.
Try: “Delete the task about renewing the passport”
Delete ·
google_tasks_deleteShows a spreadsheet's tabs and, optionally, cell values
Returns spreadsheet metadata and can include the values of a range you name.
Try: “What tabs does the sales spreadsheet have?”
Read ·
google_sheets_getReads cell values from a range
Returns the values in a range as rows of text.
Try: “Read A1:D20 from the Budget sheet”
Read ·
google_sheets_readWrites values into a range of cells
Puts rows of values into the sheet starting at the top-left cell of the range, overwriting what is there.
Try: “Put these totals into B2:B6 of the Budget sheet”
Write ·
google_sheets_writeAdds rows below the existing data
Appends new rows after the last row that has data in a sheet.
Try: “Add a row for today's sales to the log sheet”
Write ·
google_sheets_appendCreates a new spreadsheet
Makes a new spreadsheet, optionally with tabs already named.
Try: “Create a spreadsheet called Expenses 2026 with tabs for each month”
Write ·
google_sheets_createSends advanced edit requests to a spreadsheet
Passes raw Sheets batch requests straight through, covering things like formatting, adding or deleting tabs and charts. Because the requests are raw, it can delete content too.
Try: “Bold the header row and freeze it on the Budget sheet”
Delete ·
google_sheets_batch_updateAdds a tab to a spreadsheet
Creates a new sheet tab inside an existing spreadsheet.
Try: “Add a tab called Archive to the Budget spreadsheet”
Write ·
google_sheets_add_sheetPermanently deletes a tab
Removes a whole sheet tab and its data from a spreadsheet.
Try: “Delete the Scratch tab from the Budget spreadsheet”
Delete ·
google_sheets_delete_sheetRenames a tab
Changes the name of a tab in a spreadsheet.
Try: “Rename the Sheet1 tab to Q1”
Write ·
google_sheets_rename_sheetInserts blank rows
Adds empty rows at a row position you choose, counted from zero.
Try: “Insert three blank rows above row 5”
Write ·
google_sheets_insert_rowsDeletes rows
Removes rows starting at a row position you choose, counted from zero, and shifts the rest up.
Try: “Delete rows 10 to 12 in the log sheet”
Delete ·
google_sheets_delete_rowsLists named ranges
Returns the named ranges defined on a spreadsheet.
Try: “List the named ranges on the Budget sheet”
Read ·
google_sheets_get_named_rangesCreates a named range
Names a rectangular block of cells so it can be referred to by name.
Try: “Name B2:B13 as MonthlyTotals”
Write ·
google_sheets_set_named_rangeReads a Google Doc with all its structure
Returns the full document as structured JSON, including formatting and positions.
Try: “Get the structure of the project plan doc”
Read ·
google_docs_getReads a Google Doc as plain text
Returns just the text of a document without formatting detail.
Try: “Read the project plan doc to me”
Read ·
google_docs_readCreates a new Google Doc
Makes a new document with the title you give.
Try: “Create a doc called Meeting notes 12 Nov”
Write ·
google_docs_createAdds text to a doc
Inserts text at a position in the document, or at the end.
Try: “Add a summary paragraph to the end of the project plan”
Write ·
google_docs_insert_textReplaces every match of a phrase in a doc
Swaps all occurrences of one string for another, which suits filling in templates.
Try: “Replace {{client}} with Acme in the contract doc”
Write ·
google_docs_replace_textSends advanced edit requests to a doc
Passes raw Docs batch requests straight through for styles, tables, headers and more. Because the requests are raw, it can delete content too.
Try: “Make all headings in the doc dark blue”
Delete ·
google_docs_batch_updateDeletes part of a doc
Removes a span of content between two positions in the document.
Try: “Delete the second paragraph of the project plan”
Delete ·
google_docs_delete_rangeAdds an empty table to a doc
Inserts a table of the size you ask for at a position in the document.
Try: “Insert a 4 by 3 table under the Budget heading”
Write ·
google_docs_insert_tableAdds a picture to a doc
Places an image from a public web address into the document.
Try: “Put the logo from this URL at the top of the doc”
Write ·
google_docs_insert_inline_imageReads a presentation with its structure
Returns the whole deck as structured JSON.
Try: “Get the outline of the Q3 review deck”
Read ·
google_slides_getCreates a new presentation
Makes a new Slides deck with the title you give.
Try: “Create a deck called Product launch”
Write ·
google_slides_createReplaces a phrase across a whole deck
Swaps every occurrence of one string for another on all slides, useful for templates.
Try: “Replace {{date}} with 14 Nov in the launch deck”
Write ·
google_slides_replace_textAdds a blank slide
Appends an empty slide to a presentation.
Try: “Add a blank slide to the launch deck”
Write ·
google_slides_add_slideDeletes a slide
Removes one slide from a presentation by its object id.
Try: “Delete slide 4 from the launch deck”
Delete ·
google_slides_delete_slideReads one slide
Returns the contents of a single slide by its object id.
Try: “What is on the third slide?”
Read ·
google_slides_get_pageSends advanced edit requests to a deck
Passes raw Slides batch requests straight through for text boxes, shapes, images and styling. Because the requests are raw, it can delete content too.
Try: “Change the title font on every slide to Arial”
Delete ·
google_slides_batch_updateCopies a slide
Duplicates a slide and returns the id of the new one.
Try: “Duplicate the pricing slide”
Write ·
google_slides_duplicate_slideReorders a slide
Moves a slide to another position in the deck.
Try: “Move the pricing slide to the end”
Write ·
google_slides_move_slideAdds a text box to a slide
Creates a text box at a size in points, optionally with starting text.
Try: “Add a text box saying Confidential to slide 1”
Write ·
google_slides_create_textboxAdds an image to a slide
Places an image from a web address on a slide at a size in points.
Try: “Put the logo from this URL on slide 1”
Write ·
google_slides_create_imageSearches YouTube for videos
Returns video titles, ids and channel names for a search term.
Try: “Find recent videos about Rust async”
Read ·
google_youtube_searchUploads a video to your YouTube channel
Uploads a video from a local file path, or from base64 content for small files. It defaults to private.
Try: “Upload ~/Videos/demo.mp4 as a private video”
Write ·
google_youtube_uploadShows details and stats for a video
Returns the description, statistics and content details of a video.
Try: “How many views does this video have?”
Read ·
google_youtube_get_videoEdits a video's details
Changes a video's title, description, tags or privacy setting, which can make it public.
Try: “Make my demo video unlisted”
Write ·
google_youtube_update_videoLists your uploaded videos
Returns the videos on your channel.
Try: “List my uploads”
Read ·
google_youtube_my_videosLists your playlists
Returns the playlists on your account.
Try: “What playlists do I have?”
Read ·
google_youtube_list_playlistsCreates a private playlist
Makes a new playlist that starts out private.
Try: “Create a playlist called Conference talks”
Write ·
google_youtube_create_playlistDeletes a playlist
Removes a playlist by its id.
Try: “Delete the playlist Conference talks”
Delete ·
google_youtube_delete_playlistAdds a video to a playlist
Puts a video into one of your playlists.
Try: “Add this video to Conference talks”
Write ·
google_youtube_add_to_playlistRemoves a video from a playlist
Takes one entry out of a playlist by its playlist item id.
Try: “Remove that talk from the Conference talks playlist”
Delete ·
google_youtube_remove_from_playlistLists channels you subscribe to
Returns the channels your account follows.
Try: “Which channels am I subscribed to?”
Read ·
google_youtube_subscriptionsLists comments on a video
Returns top-level comment threads for a video, newest first.
Try: “Show the latest comments on my demo video”
Read ·
google_youtube_list_commentsPosts a comment on a video
Adds a top-level comment from your account, publicly visible on the video.
Try: “Comment Thanks for watching on my latest video”
Write ·
google_youtube_insert_commentHolds, rejects or flags a comment
Sets the moderation status of a comment, such as holding it for review, rejecting it or flagging it as likely spam.
Try: “Hold that comment for review”
Write ·
google_youtube_set_comment_moderationMarks a comment as spam
Reports a comment on your video as spam.
Try: “Mark the third comment as spam”
Write ·
google_youtube_mark_comment_spamShows a form and its questions
Returns a form's structure and every question.
Try: “What questions are in the feedback form?”
Read ·
google_forms_getLists form responses
Returns the responses people have submitted to a form.
Try: “Show the responses to the feedback form”
Read ·
google_forms_responsesCreates a new form
Makes a new Google Form with the title you give.
Try: “Create a form called Event signup”
Write ·
google_forms_createAdds a question to a form
Appends a text or multiple-choice question at the end of the form.
Try: “Add a multiple-choice question about dietary needs”
Write ·
google_forms_add_questionEdits a form question
Changes a question's title, description, options or whether it is required.
Try: “Make the email question required”
Write ·
google_forms_update_questionDeletes a question
Removes one question from a form by its question id.
Try: “Delete the age question from the signup form”
Delete ·
google_forms_delete_questionReorders a question
Moves a question to a new position in the form.
Try: “Move the email question to the top”
Write ·
google_forms_move_questionRenames a form
Changes a form's title.
Try: “Rename the form to Event signup 2027”
Write ·
google_forms_renamePermanently deletes a form
Removes a whole form for good.
Try: “Delete the old Event signup form”
Delete ·
google_forms_deleteCopies form responses into a spreadsheet
Appends responses to a Sheets spreadsheet with a response-id column so repeated exports do not duplicate rows.
Try: “Export the signup form responses to the Event sheet”
Write ·
google_forms_export_responsesConnects a Google account through your browser
Starts the sign-in flow and opens your browser so you can approve access for a new account, which you give a nickname such as work.
Try: “Connect my work Google account”
Write ·
google_account_addLists your connected accounts
Shows each connected account with its email and which one is the default.
Try: “Which Google accounts are connected?”
Read ·
google_account_listDisconnects an account and deletes its saved sign-in
Removes the account from the server and deletes its stored tokens from your computer.
Try: “Disconnect my work Google account”
Delete ·
google_account_removeSets the account used by default
Chooses which connected account tools use when you do not name one.
Try: “Use my personal account by default”
Write ·
google_account_set_defaultShows setup and sign-in health
Reports the credential setup, where data is stored, the connected accounts and whether their tokens are healthy.
Try: “Check the status of the Google connection”
Read ·
google_account_status
Read from the source code
Permissions
high risk · 8 things to watch
High risk
The assistant can send email, share files and permanently delete mail, files, forms and calendars from every Google account you connect. Our advice: approve tool calls by hand, try a test account first, and ask for trash instead of delete.
What it can do
- Read your data
- Create and change things
- Delete things
- Read-only mode
Watch out for
It can send email and share files as you
Sending tools (gmail_send, gmail_reply, gmail_drafts_send) and drive_share, which can open a file to anyone with the link, act immediately under your name. Our advice: try a test account first and review drafts before the assistant sends. github.com
It can permanently delete mail, files and more
gmail_delete, drive_delete, forms_delete, calendar_delete, sheets_delete_sheet and similar tools cannot be undone. Trash tools exist for mail and Drive, so ask the assistant to use those (our advice). github.com
Raw edit tools can remove content too
sheets_batch_update, docs_batch_update and slides_batch_update pass raw requests straight to Google, and those can delete tabs, text and slides. Treat them as delete-capable. github.com
One sign-in grants access to all 11 services
The consent screen asks for Gmail, Drive, Calendar, Contacts, Tasks, Sheets, Docs, Slides, YouTube and Forms together. Revoke access any time on your Google Account permissions page. github.com
Emails and documents it reads are untrusted text
Our advice: a message or shared doc can contain instructions aimed at the assistant, and this server can then send, share or delete. Approve write and delete calls by hand instead of auto-approving them. github.com
Attach and upload tools read local files
Gmail attachments, Drive upload and update, and YouTube upload read any local path the assistant passes. Saving downloads is limited to your Downloads folder unless you set GOOGLE_MCP_SAVE_ROOT. github.com
Client secret sits in your client config
The README puts the OAuth client secret in the client's env block, in plain text. Keep that file private and rotate the secret in Google Cloud Console if it leaks. github.com
Installs can pull preview builds
The beta tag points to unmerged pull request builds, and every merge to main publishes a new stable patch. Pin an exact version in your config, as the README advises. github.com
Security advisories
No published security advisories as of Nov 1, 2026.
Technical details
| Turning on read-only | No read-only mode or per-service switch is documented. One sign-in requests the full set of scopes for all 11 services. |
|---|---|
| Talks to | Google APIs, for the accounts you connect |
| Sign-in and keys | You supply your own Google OAuth client ID and secret. Account tokens are saved under ~/.google-services-mcp/accounts with restricted file permissions. |
| Data retention | The privacy policy says nothing is sent anywhere except to Google through the APIs you authorize. |
| Scopes |
|
Questions
Is it official?
No. It is an independent project by Nabheet S. Sandhu (MIT license), and its privacy policy says it is not affiliated with or endorsed by Google.
Is it free?
Yes. The server is MIT licensed and free to use. You do need your own Google Cloud project with an OAuth client, which the README says takes about 10 minutes to set up.
What do I need to set up before it works?
Node.js 24 or newer and a Google Cloud project. In it, turn on the 10 Google APIs, set up the consent screen as External and add yourself as a test user. Then create an OAuth client of type Desktop app with the redirect http://localhost:8787.
Which Google services does it cover?
Gmail, Calendar, Meet, Drive, Contacts, Tasks, Sheets, Docs, Slides, YouTube and Forms. Every tool name starts with google_.
Can it use more than one Google account?
Yes. You add each account under a nickname such as personal or work, set a default, and the assistant can pass an account name to any tool.
Can it delete things or send email?
Yes. It can send email, share files, and permanently delete mail, Drive files, calendars, forms and contacts. There is no read-only mode.
Why does it say "Google hasn't verified this app"?
That is normal for your own OAuth client in personal use. The README says to click Advanced, then Continue.
Why did it stop working after about a week?
Your Google Cloud app is probably still in Testing mode, where tokens last about 7 days. Re-run the add command for the account, or publish the app.
Does it work in ChatGPT or Claude on the web?
No. It runs on your computer over stdio, so it works in apps that start local servers, such as Claude Desktop, Claude Code, Cursor and Codex.
Where are my tokens stored?
In ~/.google-services-mcp/accounts/ with restricted permissions, or in the folder set by GOOGLE_MCP_DIR. Removing an account deletes its stored tokens.
Information
updated Nov 2, 2026
- Publisher
- Community
- Package
google-services-mcp- Registry
- npm
- Transport
- stdio
- Auth
- OAuth
- Version
- 0.1.97
- License
- MIT
- Last commit
- Oct 31, 2026
- Open issues
- 0
Sources
Docs, issue trackers and discussions this page is built from. Issues, quotes and findings above link to their own source.
Show all 7Hide
- github.com · github.com
- github.com · github.com
- github.com · github.com
- github.com · github.com
- github.com · github.com
- github.com · github.com
- github.com · github.com