{"name":"io.github.chrischall/gogcli-mcp","slug":"chrischall-gogcli-mcp","title":null,"description":"Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets","url":"https://mcp.market/server/chrischall-gogcli-mcp","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":32,"stars":1,"forks":0,"downloads_week":586,"last_push_at":"2026-09-18T15:45:39.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/chrischall/gogcli-mcp","website":null,"version":"4.0.1","remotes":[],"packages":[{"registryType":"npm","identifier":"gogcli-mcp","version":"4.0.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Email address of the Google account to use (matches gogcli auth)","format":"string","name":"GOG_ACCOUNT"},{"description":"Override path to the gogcli binary (auto-discovered otherwise)","format":"string","name":"GOG_PATH"}]}],"tools":[{"name":"gog_api_call","description":"Call any Discovery-described Google API method directly \\u2014 an escape hatch for endpoints gog has no dedicated tool for. Find the exact api/version/method/params with gog_api_describe first. Read methods (GET/LIST) run as-is. Mutating methods (POST/PUT/PATCH/DELETE) are refused unless you set allowWrite=true \\u2014 keep it false to preview, or set dryRun=true to print the intended request witho","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_api_describe","description":"Describe a Google Discovery API, or a single method within it \\u2014 its parameters, request/response schema, and required OAuth scopes. Use this to discover the exact api/version/method and params before calling gog_api_call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_api_list","description":"List the Google Discovery APIs available for gog_api_call / gog_api_describe (name + version + title).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_appscript_content","description":"Read a project's source \\u2014 every .gs file and its appsscript.json manifest \\u2014 INLINE in the response. This is the tool to reach for when the question is \"what does this script do\"; it needs no filesystem, so it works the same on a hosted deployment as it does locally, unlike gog_appscript_pull.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_appscript_create","description":"Create a new, empty Apps Script project. Pass parentId to bind it to a Drive file (a Sheet, Doc or Form), which is what makes the script a container-bound script with access to that document; omit it for a standalone project. gog cannot upload code, so the project starts empty either way.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_appscript_deployments","description":"List a project's deployments \\u2014 the published web apps, add-ons and API executables, each pinned to a version. A deployment ID from here is what gog_appscript_run_function needs when a script is not running in dev mode.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_appscript_get","description":"Get an Apps Script project's metadata: title, creator, create/update times, and the parent Drive file when the project is bound to a Sheet, Doc or Form. Use gog_appscript_content to read the actual code.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_appscript_pull","description":"Write a project's files into a local directory, for editing a script as ordinary files. THE DIRECTORY IS RESOLVED WHERE GOG RUNS, which is the caller's own machine only on a local (stdio) deployment: on a hosted deployment (e.g. mcp-host) the files land on that server where the caller cannot reach them. Use gog_appscript_content there instead \\u2014 it returns the same source in the response. Exis","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_appscript_run_function","description":"Execute a function in a deployed Apps Script project. TREAT THIS AS ARBITRARY CODE EXECUTION: the script runs with this Google account's authority and can send mail, edit Drive files or call external services, and the wrapper cannot tell a read from a write \\u2014 read the code with gog_appscript_content first if you did not write it. Requires the project to be deployed as an API executable and to","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_appscript_versions","description":"List a project's saved versions \\u2014 the immutable snapshots deployments point at, with their numbers and descriptions. Useful for answering \"what is actually deployed\" next to gog_appscript_deployments.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_add","description":"Authorize a Google account via browser-based OAuth. Opens a browser window where the user must sign in and grant access. Blocks for up to 5 minutes waiting for the user to complete authorization. If the browser does not open automatically, a fallback URL is included in the response. Use gog_auth_list to check which accounts are already configured.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_add_complete","description":"Complete REMOTE/headless Google authorization (step 2 of 2). Takes the full redirected localhost URL the user copied after finishing gog_auth_add_url, exchanges it for a refresh token, and stores it. Use the SAME `services` value you passed to gog_auth_add_url. Must run within 10 minutes of step 1 and against the same gogcli host.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_add_url","description":"Begin REMOTE/headless Google authorization (step 1 of 2). Returns a sign-in URL to open in any browser \\u2014 no local server or terminal on the gogcli host is needed, so this works on a hosted deployment where the interactive gog_auth_add cannot. Hand the URL to the user; after they sign in, the browser is redirected to a localhost URL that fails to load \\u2014 that is expected. They copy that fu","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_health","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_list","description":"List the Google accounts stored in gogcli, with their scopes. This reads local configuration only \\u2014 it does not contact Google and does NOT tell you whether an account still works: a signed-out account whose refresh token expired or was revoked is listed here exactly like a healthy one, scopes and all. Use gog_auth_health to check whether an account can actually authenticate.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_services","description":"List all Google services supported by gogcli and the OAuth scopes each requires.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_auth_status","description":"Show gogcli auth CONFIGURATION: keyring backend, credential files, and auth setup. Despite the name this is not a health check \\u2014 it reads local setup and does not contact Google, so it says nothing about whether an account can still authenticate. Use gog_auth_health for that.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_calendar_create","description":"Create a calendar event. Set withZoom=true to attach a Zoom meeting (requires Zoom S2S OAuth setup via gog_zoom_auth_setup; the join URL + meeting ID + passcode are appended to the event description \\u2014 Google rejects native conference card writes from non-Workspace-Marketplace OAuth clients).","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_calendar_delete","description":"Delete a calendar event.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_calendar_events","description":"List calendar events. Describe the window ONE way and one way only (gog >= 0.36.0 rejects the rest as ambiguous rather than silently discarding a flag): today on its own; or from + to; or from + days; or days on its own (a window of that many days starting today). today cannot be combined with from, to or days, and days cannot be combined with to. gog returns only 10 events by default, so a wide d","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_calendar_get","description":"Get a specific calendar event by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_calendar_respond","description":"Respond to a calendar event invitation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_calendar_update","description":"Update an existing calendar event. Zoom: withZoom adds a Zoom meeting, regenerateZoom replaces the existing one, removeZoom strips it. removeMeet clears the event's Google Meet conference data (e.g. before attaching another provider). Conference flags are independent \\u2014 use one per call.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_dm_send","description":"Send a direct message to one person by email address, creating the DM space if this is the first message. Delivered immediately and cannot be unsent through this tool. For a room rather than a person, use gog_chat_messages_send.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_dm_space","description":"Resolve the DM space for an email address \\u2014 the bridge from a person to the \"spaces/...\" name the message tools want. Creates the space if none exists yet, which is silent: it does not message the person.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_messages_list","description":"Read messages in a space. The JSON carries each message's @-mentions and a summary of its emoji reactions (gog >= 0.38.0) alongside the text, so \"who was tagged\" and \"did anyone react\" are answerable without extra calls. unread=true returns only what arrived after the account last read the space \\u2014 the cheap way to answer \"what did I miss\". Newest-first needs an explicit order=\"createTime desc","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_messages_search","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_messages_send","description":"Post a message to a Chat space. THIS IS IMMEDIATELY VISIBLE TO EVERYONE IN THE SPACE and cannot be unsent through this tool, so treat it like sending mail, not like saving a draft. Pass `thread` to reply inside an existing conversation (from gog_chat_threads_list or a message's thread field); omit it to start a new one. Text supports Chat's markdown-ish formatting (*bold*, _italic_, `code`).","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_reactions_create","description":"React to a message with an emoji. Visible to the space immediately. Pass the emoji itself (\"\\u{1F44D}\"), not a :shortcode:.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_reactions_delete","description":"Remove one emoji reaction. Takes the REACTION's own resource name (\"spaces/.../messages/.../reactions/...\"), not the message's and not the emoji \\u2014 get it from gog_chat_reactions_list. An account can only remove its own reaction.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_reactions_list","description":"List the emoji reactions on one message, with who reacted. gog_chat_messages_list already returns a reaction SUMMARY per message; come here when you need the individual reactors, or the reaction resource names that gog_chat_reactions_delete takes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_spaces_create","description":"Create a named Chat space, optionally seeding its membership. Members are added immediately and are notified \\u2014 this is visible to other people the moment it runs, so confirm the member list before calling it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_chat_spaces_find","description":"Find spaces whose display name matches. Substring and case-insensitive by default, which is what you want when the user names a room approximately (\"the launch room\"); pass exact=true to require the whole title. DMs have no display name \\u2014 use gog_chat_dm_space to reach a person.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_spaces_list","description":"List the Google Chat spaces the account belongs to \\u2014 named rooms and DMs alike \\u2014 with their resource names. Start here when you do not yet have a space name; gog_chat_spaces_find is faster when you know the room's title.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_chat_threads_list","description":"List the threads in a space, so a reply can be targeted at an existing conversation rather than starting a new one. Pass a thread name from here as `thread` to gog_chat_messages_send.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_announcements_create","description":"Create an announcement in a Google Classroom course.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_classroom_announcements_get","description":"Get a single announcement by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_announcements_list","description":"List announcements in a Google Classroom course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_courses_get","description":"Get a single Google Classroom course by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_courses_list","description":"List Google Classroom courses.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_coursework_get","description":"Get a single coursework item by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_coursework_list","description":"List coursework (assignments, questions, materials) for a course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_invitations_accept","description":"Accept a Google Classroom invitation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_invitations_get","description":"Get a single invitation by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_invitations_list","description":"List Google Classroom invitations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_profile_get","description":"Get a Google Classroom user profile. Omit userId to fetch the authenticated user.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_roster","description":"List the full roster (students and/or teachers) of a Google Classroom course. Omit both flags to return both groups.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_students_get","description":"Get a specific student enrolled in a course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_students_list","description":"List students enrolled in a Google Classroom course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_get","description":"Get a single submission by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_grade","description":"Grade a student submission. Set draft and/or assigned grade values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_list","description":"List student submissions for a coursework item.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_reclaim","description":"Reclaim a turned-in submission (student action to edit a submission).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_return","description":"Return a graded submission to the student.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_submissions_turn_in","description":"Turn in a student submission (student action).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_teachers_get","description":"Get a specific teacher in a course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_teachers_list","description":"List teachers in a Google Classroom course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_topics_get","description":"Get a single topic by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_classroom_topics_list","description":"List topics in a Google Classroom course.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_contacts_create","description":"Create a new Google Contact.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_contacts_get","description":"Get a contact by resource name.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_contacts_list","description":"List all Google Contacts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_contacts_search","description":"Search personal Google Contacts by name, email, or phone. For searching the Workspace directory (internal users not in your personal contacts), use gog_people_search from gogcli-mcp-contacts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_docs_cat","description":"Read a Google Doc as plain text.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_docs_create","description":"Create a new Google Doc. Returns JSON with the new docId and URL.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_docs_find_replace","description":"Find and replace text in a Google Doc.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_docs_info","description":"Get Google Doc metadata: title, ID, and other properties.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_docs_structure","description":"Show a Google Doc's structure with numbered paragraphs. Useful for understanding the document layout before making index-based edits.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_docs_write","description":"Write text content to a Google Doc, replacing existing body content by default. Set append=true to add after existing content.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_drive_delete","description":"Move a Google Drive file to trash, or permanently delete it with permanent=true (irreversible).","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_drive_extract_text","description":"Extract readable TEXT from a Drive file \\u2014 PDF, image, docx, or a native Google Doc \\u2014 and return it to you directly (closing the webViewLink dead end). Accepts a Drive file id, including the id from gog_gmail_attachment's deliveredVia:\"drive\" response. For non-Docs it copies the file to a temporary Google Doc so Drive OCRs it (works for scanned PDFs too), exports plain text, then deletes ","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_get","description":"Get metadata for a Google Drive file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_ls","description":"List files in a Google Drive folder (default: root).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_mkdir","description":"Create a new folder in Google Drive.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_drive_move","description":"Move a file to a different folder in Google Drive.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_read_bytes","description":"Fetch a Drive file's raw bytes and return them base64-encoded as an embedded resource \\u2014 the generic fallback for callers that want the file itself (to parse locally) rather than extracted text. For readable text from a PDF, prefer gog_drive_extract_text.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_rename","description":"Rename a file or folder in Google Drive.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_search","description":"Search Google Drive files by full-text query.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_drive_share","description":"Share a Google Drive file or folder.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_gmail_get","description":"Get a Gmail message by ID. For a long message, sanitizeContent is the cheapest way to keep it in context: it drops the raw MIME payload and the HTML part, which are usually the bulk of the response.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_gmail_reply","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_gmail_reply_all","description":"SENDS MAIL \\u2014 asks the MCP host to show a confirmation prompt with the resolved recipients, subject, and body size. Mail is sent only after the user accepts that prompt. To STAGE a reply-all instead of sending it, use gog_gmail_drafts_reply_all (gogcli-mcp-gmail only), which never needs confirmation. Reply to all participants of a Gmail message (the sender plus every To/Cc recipient). Same inh","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_gmail_search","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_gmail_send","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_sheets_append","description":"Append rows to a Google Sheet after the last row with data in the given range. Values may be strings, numbers, booleans, or null. Strings starting with \"=\" are interpreted as formulas.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_sheets_clear","description":"Clear all values in a Google Sheets range (formatting is preserved).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_sheets_create","description":"Create a new Google Spreadsheet. Returns JSON with the new spreadsheetId and URL.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_sheets_find_replace","description":"Find and replace text across an entire Google Spreadsheet.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_sheets_get","description":"Read values from a Google Sheets range. Returns a JSON object with a \"values\" array of rows.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_sheets_metadata","description":"Get spreadsheet metadata: title, named ranges, and per-tab properties including grid dimensions (gridProperties.rowCount / columnCount). Use this to learn a sheet's current size before writing \\u2014 a write outside the grid fails.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_sheets_update","description":"Write values to a Google Sheets range, overwriting existing content. Values may be strings, numbers, booleans, or null. Strings starting with \"=\" are interpreted as formulas (e.g. \"=SUM(A1:A10)\").","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_slides_copy","description":"Copy a Google Slides presentation to a new presentation with the given title.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_slides_create","description":"Create a new Google Slides presentation, optionally in a folder or copying from a template.","write_action":true,"price_micros":0,"input_schema":null},{"name":"gog_slides_export","description":"Export a Google Slides presentation to a local file (pdf or pptx).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_slides_info","description":"Get metadata for a Google Slides presentation (title, ID, slide count, etc.).","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_slides_list_slides","description":"List slides in a Google Slides presentation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_slides_read_slide","description":"Read the content of a slide (text, shapes, speaker notes). Set detail=true to also include normalized element geometry, styled text runs, paragraphs, table-cell content, and image source URLs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_tasks_get","description":"Get a specific task by ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_tasks_list","description":"List tasks in a Google Task list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"gog_tasks_lists","description":"List all Google Task lists.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-09-19T19:20:41.105Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:20:41.104Z","components":{"code":{"score":20,"max":25,"notes":["38 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/index.js: …urceCode, sch); const validate2 = new Function(`${names_1.default.self}`, `${names_1.de…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"gogcli-mcp","version":"4.0.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-18T15:49:00.957Z","repositoryUrl":"git+https://github.com/chrischall/gogcli-mcp.git","weeklyDownloads":586}],"repo":{"found":true,"owner":"chrischall","repo":"gogcli-mcp","archived":false,"pushedAt":"2026-09-18T15:45:39Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/10564245?v=4","ownerCreatedAt":"2015-01-16T16:58:09Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":586,"license":"MIT","lastPushAt":"2026-09-18T15:45:39.000Z","score":32}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"A","reason":"score 85: eval / new Function used","createdAt":"2026-09-19T00:27:34.116Z"}],"reviews":[]}