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 Apps Script MCP

NPM · MCP-GOOGLE-APPS-SCRIPT · SCANNED SEP 20

MCP server for the Google Apps Script API: projects, code, versions, deployments and executions.

+3 this week 78 Trust /100
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 Security98
  • 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
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability67
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 3279 tokens (~252/item across 13 items; 13 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 Management70
  • Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Google Apps Script MCP server?

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

npm · mcp-google-apps-script

# add to Claude Code
claude mcp add a1-x-tech-mcp-google-apps-script -- npx -y mcp-google-apps-script
// .cursor/mcp.json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add a1-x-tech-mcp-google-apps-script -- npx -y mcp-google-apps-script
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "a1-x-tech-mcp-google-apps-script": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-google-apps-script"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add a1-x-tech-mcp-google-apps-script --command npx --arg -y --arg mcp-google-apps-script
# ~/.hermes/config.yaml
mcp_servers:
  a1-x-tech-mcp-google-apps-script:
    command: "npx"
    args: ["-y", "mcp-google-apps-script"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
# add to Vellum
assistant mcp add a1-x-tech-mcp-google-apps-script -t stdio -c npx -a -y mcp-google-apps-script
// mcp.json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
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.

  • 19 Sept 26 +1

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

  • 17 Sept 26 +1

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

  • 15 Sept 26 +1

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

  • 13 Sept 26 +1

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

  • 10 Sept 26 +1

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

  • 8 Sept 26 +1

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

  • 6 Sept 26 +4
    • Stability: unverified → 0.23 functional
  • 31 Aug 26 +15
    • Malware scan: unverified → pass security
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 20 Sept 2026 · Analysed npm/mcp-google-apps-script@0.1.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 13 exposed · ~2,889 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
create_project ~209

Creates an Apps Script project and returns it (scriptId, title, createTime). Without parent_id the project is standalone (its scriptId doubles as its Drive file id); with parent_id — the Drive id of a Google Doc, Sheet, Slides or Form — the project is created bound to that container and can use its container-specific APIs (e.g. SpreadsheetApp.getActive()). A new project holds only a default manifest and an empty Code file: add real code with update_project_content next. IMPORTANT: the API cannot list or delete projects — keep the returned scriptId, it is the only handle. Requires the script.projects scope, the Apps Script API toggle at script.google.com/home/usersettings, and — for bound projects — access to the parent file.

NameTypeReqDescription
parent_idstringDrive file id of a Google Doc, Sheet, Slides or Form to bind the project to; omit for a standalone project.
titlestringyesThe project title shown in the Apps Script editor.

No output schema declared.

No examples provided.

create_version ~170

Snapshots the project's current HEAD content as a new immutable version and returns it (versionNumber, description, createTime). Versions cannot be edited or deleted, and version numbers only grow — every call creates a NEW version, so do not re-send after an ambiguous failure without checking list_versions first. Creating a version does not change what runs anywhere: point a deployment at the new versionNumber via manage_deployments (action=create or update) to ship it.

NameTypeReqDescription
descriptionstringHuman-readable changelog line for this version (shown in the editor's version list).
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

get_project ~116

Returns the project's metadata: title, scriptId, parentId (present only for bound projects), creator, lastModifyUser, createTime and updateTime. No code is included — use get_project_content for the files. Useful to verify a scriptId exists and check whether the project is standalone or bound.

NameTypeReqDescription
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

get_project_content ~169

Returns the project's full file set: files[] with name (no extension), type (SERVER_JS = .gs code, HTML, JSON = the "appsscript" manifest), source, and per-file update info. By default HEAD (the latest saved code) is returned; version_number returns the content of that immutable version instead. Call this before update_project_content: replace mode needs the full new set including the manifest, and merge mode addresses files by these exact names.

NameTypeReqDescription
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.
version_numberintegerRead the content of this immutable version instead of HEAD.

No output schema declared.

No examples provided.

get_project_metrics ~181

Returns execution metrics for the project: activeUsers, totalExecutions and failedExecutions as time series ({ value, startTime, endTime }; value is absent when zero). granularity daily covers the last 7 days, weekly aggregates by week. deployment_id narrows the numbers to one deployment. A rising failedExecutions count is the cue to call list_processes with statuses=[FAILED] for the concrete failures. Requires the script.metrics scope.

NameTypeReqDescription
deployment_idstringOnly count executions of this deployment.
granularitystringyesdaily = last 7 days per day; weekly = per week.
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

get_version ~110

Fetches one immutable version by its number: versionNumber, description and createTime. For the code of that version call get_project_content with version_number instead — this endpoint returns metadata only.

NameTypeReqDescription
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.
version_numberintegeryesThe version number from create_version or list_versions.

No output schema declared.

No examples provided.

list_processes ~377

Lists execution processes (the execution history): each entry carries projectName, functionName, processType (WEBAPP, EXECUTION_API, TIME_DRIVEN, TRIGGER, SIMPLE_TRIGGER, ADD_ON, EDITOR, MENU, BATCH_TASK), processStatus (COMPLETED, FAILED, TIMED_OUT, RUNNING, PAUSED, CANCELED, DELAYED, UNKNOWN), userAccessLevel, startTime and duration. With script_id only that script's executions are listed; without it, ALL executions started by the authorizing user across their scripts. To hunt errors, filter statuses=["FAILED","TIMED_OUT"] — but note the API returns no error messages or logs here, only the fact and time of failure: get the message by re-running via run_function, or from the Apps Script dashboard / Cloud Logging. start_time/end_time (RFC3339 UTC) bound the process start; paginate with page_token. Requires the script.processes scope.

NameTypeReqDescription
deployment_idstringOnly processes of this deployment.
end_timestringOnly processes started before this RFC3339 UTC timestamp.
function_namestringOnly processes that ran this function.
page_sizeintegerProcesses per page (1..50; API default 50).
page_tokenstringnextPageToken from the previous page.
script_idstringLimit to this script's executions; omit for all of the caller's executions.
start_timestringOnly processes started at or after this RFC3339 UTC timestamp.
statusesarrayOnly these process states, e.g. ["FAILED","TIMED_OUT"] for error hunting.
typesarrayOnly these launch types (EXECUTION_API = run_function calls, TIME_DRIVEN = clock triggers).

No output schema declared.

No examples provided.

list_versions ~142

Lists the project's immutable versions (versionNumber, description, createTime), newest first. Paginate with page_token from nextPageToken. Use it to pick a versionNumber for manage_deployments or to read old code via get_project_content with version_number.

NameTypeReqDescription
page_sizeintegerVersions per page (1..50; API default 50).
page_tokenstringnextPageToken from the previous page.
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

manage_deployments ~385

Manages the project's deployments — the published entry points (web app, API executable, add-on) that make code callable from outside the editor. action=create deploys version_number (omit it to deploy HEAD — updates live with every save; fine for testing, risky for production) with an optional description. action=list shows all deployments including the automatic @HEAD one (paginate with page_token from nextPageToken); get needs deployment_id and returns entryPoints[] — the web app URL (webApp.url) and the API-executable config run_function depends on. action=update repoints an existing deployment at another version_number and/or changes its description (this is how you ship or roll back without changing the URL; the current config is read first and merged, so omitted fields are preserved); delete removes it permanently and breaks its URL/integrations (the @HEAD deployment cannot be deleted). WHAT a deployment exposes (web app vs API executable, who can access) comes from the appsscript manifest at the deployed version — set it via update_project_content before creating the version. Requires the script.deployments scope.

NameTypeReqDescription
actionstringyesWhat to do with the deployments.
deployment_idstringget/update/delete: the deployment to target.
descriptionstringcreate/update: human-readable deployment description.
page_sizeintegerlist: deployments per page (1..50; API default 50).
page_tokenstringlist: nextPageToken from the previous page.
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.
version_numberintegercreate/update: the immutable version to deploy; omit on create to deploy HEAD.

No output schema declared.

No examples provided.

raw_request ~233

Escape hatch to call any Google Apps Script API v1 path directly, for requests the typed tools don't cover — e.g. GET "v1/projects/<scriptId>/content?versionNumber=3", or a PUT to "v1/projects/<scriptId>/content" with a hand-built files body. The path may carry a query string; repeated filter params can be encoded there (e.g. "v1/processes?userProcessFilter.statuses=FAILED&userProcessFilter.statuses=TIMED_OUT"). The Bearer token is added automatically and paths resolving to a foreign origin are rejected; the method defaults to GET. Remember: PUT v1/projects/<id>/content replaces the ENTIRE file set — prefer update_project_content, whose merge mode protects the other files.

NameTypeReqDescription
bodyobjectJSON request body (POST/PUT only).
methodstringHTTP method (the Apps Script API uses only these four). Defaults to GET.
pathstringyesAPI path relative to https://script.googleapis.com, e.g. "v1/projects/<scriptId>/deployments".

No output schema declared.

No examples provided.

run_function ~355

Runs a named function in the script and returns { done, result } — or, when the script itself throws, { done, script_error: { type, message, stack } } with the Apps Script stack trace (this is a script bug, not a transport error; do not blindly retry, the function may have side effects). HARD PREREQUISITES the API enforces: (1) the script must have an API-executable deployment (Deploy > New deployment > API executable, or a manifest with executionApi); (2) this server's OAuth client must belong to the SAME Google Cloud project as the script (script editor > Project Settings > change the GCP project number); (3) the OAuth token must carry every scope the script itself uses (listed in the editor under Project Settings > Show "appsscript.json") — otherwise the call fails with 403 PERMISSION_DENIED or 404. parameters are positional and must be JSON-serializable (no Apps Script objects like Document or Range). dev_mode=true runs the latest saved code instead of the deployed version — owner only. Executions time out after 6 minutes on the Apps Script side.

NameTypeReqDescription
dev_modebooleanRun the latest saved code instead of the deployed version (script owner only; default false).
function_namestringyesThe name of the function to run, without parentheses.
parametersarrayPositional arguments, JSON-serializable primitives/arrays/objects only.
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

setup_instructions ~121

Returns the setup checklist for this server as structured JSON: how to enable the Apps Script API (the per-account toggle at script.google.com/home/usersettings AND the Cloud-project API), which OAuth scope each tool needs (so the operator can mint a minimal-scope refresh token), the extra prerequisites of run_function (API-executable deployment, same-Cloud-project OAuth client, the script's own scopes), and the API's known limits. Works without credentials — call it first when any tool fails with 403 PERMISSION_DENIED or when setting the server up.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

update_project_content ~321

Writes code files to the project's HEAD (deployed versions are untouched until you create a version + deployment). Two modes. mode="merge" (default, safer): the current content is read first, the given files are added or overwritten BY NAME, delete_files removes named files, everything else is preserved — not atomic, a concurrent edit between read and write is lost. mode="replace": the given files become the ENTIRE project; any file not in the list is deleted, and the list must include the "appsscript" manifest (type json) or the call is rejected before hitting the API. File names carry no extension ("Code", not "Code.gs"); the manifest cannot be deleted. Returns the resulting file set. This write is never retried after a 5xx or timeout — check with get_project_content before re-sending.

NameTypeReqDescription
delete_filesarraymerge only: file names to remove (no extension). The "appsscript" manifest cannot be deleted.
filesarrayyesThe files to write (merge: upserted by name; replace: the entire new file set).
modestringmerge (default): upsert the given files, keep the rest; replace: the given files become the whole project (manifest "appsscript" required).
script_idstringyesThe script project id — from the Apps Script editor URL (script.google.com/home/projects/<scriptId>/edit) or from create_project output. For standalone projects it doubles as the Drive file id.

No output schema declared.

No examples provided.

Common questions

What is the Google Apps Script MCP server?

Google Apps Script MCP is listed in the public MCP registry as io.github.A1-x-Tech/mcp-google-apps-script. MCP server for the Google Apps Script API: projects, code, versions, deployments and executions. This page covers its npm package (mcp-google-apps-script).

Is the Google Apps Script MCP server safe to use?

Google Apps Script MCP scores 78 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. 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 Apps Script MCP server expose?

Google Apps Script MCP exposes 13 tools: create_project, get_project, get_project_content, update_project_content, get_project_metrics, and 8 more. Their descriptions and schemas cost roughly 2,889 tokens of context every time the server is loaded.

Is the Google Apps Script MCP server still maintained?

Google Apps Script MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 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 Apps Script MCP server under?

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