# Google Apps Script MCP (npm · mcp-google-apps-script)

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

- Trust score: 78/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `mcp-google-apps-script`: 78/100 (this document), [markdown](https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script.md), [page](https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script)

## Channel facts

- Registry: `npm`
- Package: `mcp-google-apps-script`
- Version: `0.1.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 96 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 21 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## 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.

### Claude

```bash
claude mcp add a1-x-tech-mcp-google-apps-script -- npx -y mcp-google-apps-script
```

### Cursor

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add a1-x-tech-mcp-google-apps-script --command npx --arg -y --arg mcp-google-apps-script
```

### Hermes

```yaml
mcp_servers:
  a1-x-tech-mcp-google-apps-script:
    command: "npx"
    args: ["-y", "mcp-google-apps-script"]
```

### Netclaw

```json
{
  "McpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add a1-x-tech-mcp-google-apps-script -t stdio -c npx -a -y mcp-google-apps-script
```

### Other

```json
{
  "mcpServers": {
    "a1-x-tech-mcp-google-apps-script": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-google-apps-script"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-19 (score 78, +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.

### 2026-09-17 (score 77, +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.

### 2026-09-15 (score 76, +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.

### 2026-09-13 (score 75, +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.

### 2026-09-10 (score 74, +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.

### 2026-09-08 (score 73, +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.

### 2026-09-06 (score 72, +4)

- [functional improvement] Stability: unverified → 0.23

### 2026-08-31 (score 68, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (13)

### `create_project` (~209 tokens)

Create a script project

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.

Input parameters:

- `parent_id` (string): Drive file id of a Google Doc, Sheet, Slides or Form to bind the project to; omit for a standalone project.
- `title` (string, required): The project title shown in the Apps Script editor.

### `get_project` (~116 tokens)

Get project metadata

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.

Input parameters:

- `script_id` (string, required): The 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.

### `get_project_content` (~169 tokens)

Get project files

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.

Input parameters:

- `script_id` (string, required): The 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_number` (integer): Read the content of this immutable version instead of HEAD.

### `update_project_content` (~321 tokens)

Update project files

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.

Input parameters:

- `delete_files` (array): merge only: file names to remove (no extension). The "appsscript" manifest cannot be deleted.
- `files` (array, required): The files to write (merge: upserted by name; replace: the entire new file set).
- `mode` (string): merge (default): upsert the given files, keep the rest; replace: the given files become the whole project (manifest "appsscript" required).
- `script_id` (string, required): The 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.

### `get_project_metrics` (~181 tokens)

Get execution metrics

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.

Input parameters:

- `deployment_id` (string): Only count executions of this deployment.
- `granularity` (string, required): daily = last 7 days per day; weekly = per week.
- `script_id` (string, required): The 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.

### `create_version` (~170 tokens)

Create a version

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.

Input parameters:

- `description` (string): Human-readable changelog line for this version (shown in the editor's version list).
- `script_id` (string, required): The 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.

### `list_versions` (~142 tokens)

List versions

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.

Input parameters:

- `page_size` (integer): Versions per page (1..50; API default 50).
- `page_token` (string): nextPageToken from the previous page.
- `script_id` (string, required): The 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.

### `get_version` (~110 tokens)

Get a version

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.

Input parameters:

- `script_id` (string, required): The 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_number` (integer, required): The version number from create_version or list_versions.

### `manage_deployments` (~385 tokens)

Manage deployments

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.

Input parameters:

- `action` (string, required): What to do with the deployments.
- `deployment_id` (string): get/update/delete: the deployment to target.
- `description` (string): create/update: human-readable deployment description.
- `page_size` (integer): list: deployments per page (1..50; API default 50).
- `page_token` (string): list: nextPageToken from the previous page.
- `script_id` (string, required): The 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_number` (integer): create/update: the immutable version to deploy; omit on create to deploy HEAD.

### `run_function` (~355 tokens)

Run a script function

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.

Input parameters:

- `dev_mode` (boolean): Run the latest saved code instead of the deployed version (script owner only; default false).
- `function_name` (string, required): The name of the function to run, without parentheses.
- `parameters` (array): Positional arguments, JSON-serializable primitives/arrays/objects only.
- `script_id` (string, required): The 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.

### `list_processes` (~377 tokens)

List execution processes

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.

Input parameters:

- `deployment_id` (string): Only processes of this deployment.
- `end_time` (string): Only processes started before this RFC3339 UTC timestamp.
- `function_name` (string): Only processes that ran this function.
- `page_size` (integer): Processes per page (1..50; API default 50).
- `page_token` (string): nextPageToken from the previous page.
- `script_id` (string): Limit to this script's executions; omit for all of the caller's executions.
- `start_time` (string): Only processes started at or after this RFC3339 UTC timestamp.
- `statuses` (array): Only these process states, e.g. ["FAILED","TIMED_OUT"] for error hunting.
- `types` (array): Only these launch types (EXECUTION_API = run_function calls, TIME_DRIVEN = clock triggers).

### `setup_instructions` (~121 tokens)

Setup instructions

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.

### `raw_request` (~233 tokens)

Raw Google Apps Script API call

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.

Input parameters:

- `body` (object): JSON request body (POST/PUT only).
- `method` (string): HTTP method (the Apps Script API uses only these four). Defaults to GET.
- `path` (string, required): API path relative to https://script.googleapis.com, e.g. "v1/projects/<scriptId>/deployments".

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script#diagnostics

## Score history

- 2026-09-20: 78
- 2026-09-19: 78
- 2026-09-18: 77
- 2026-09-17: 77
- 2026-09-16: 76
- 2026-09-15: 76
- 2026-09-14: 75
- 2026-09-13: 75
- 2026-09-12: 74
- 2026-09-11: 74
- 2026-09-10: 74
- 2026-09-09: 73
- 2026-09-08: 73
- 2026-09-07: 72
- 2026-09-06: 72
- 2026-09-05: 68
- 2026-09-04: 68
- 2026-09-03: 68
- 2026-09-02: 68
- 2026-09-01: 68
- 2026-08-31: 68
- 2026-08-30: 53

## 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.

## Links

- npm package: https://www.npmjs.com/package/mcp-google-apps-script
- Socket report: https://socket.dev/npm/package/mcp-google-apps-script
- Repository: https://github.com/A1-x-Tech/mcp-google-apps-script
- Changelog RSS feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script.xml
- Changelog JSON feed: https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script.json
- HTML version of this page: https://verifymcp.io/servers/a1-x-tech-mcp-google-apps-script/mcp-google-apps-script
