Atlas / MCP servers / mohalmah / Google Apps Script

Google Apps ScriptCAUTION

mcp/mohalmah/google-apps-script
Verdict
CAUTION
Grade
B
Trust score
82 /100
Exposed tools
16 9r · 6w · 1d
Transport
sse · stdio
License
—
Stars
55
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://mseep.ai/app/mohalmah-google-appscript-mcp-server)

[](https://smithery.ai/server/@mohalmah/google-appscript-mcp-server)

Author: mohalmah License: MIT License Repository: google-apps-script-mcp-server

Welcome to the Google Apps Script MCP (Model Context Protocol) Server! 🚀

This MCP server provides comprehensive integration with the Google Apps Script API, allowing you to manage script projects, deployments, versions, and executions through any MCP-compatible client like Claude Desktop, VS Code with Cline, or Postman.

📋 Table of Contents

  • Overview
  • Features
  • Prerequisites
  • Quick Start Guide
  • Detailed Setup Instructions
  • Available Tools
  • Script Authorization
  • MCP Client Configuration
  • Troubleshooting
  • Advanced Usage

🌟 Overview

This MCP server enables seamless interaction with Google Apps Script through:

  • ✅ OAuth 2.0 Authentication - Secure token management with automatic refresh
  • ✅ 16 Comprehensive Tools - Complete Google Apps Script API coverage
  • ✅ MCP Protocol Compliance - Works with Claude Desktop, VS Code, and other MCP clients
  • ✅ Secure Token Storage - OS-specific secure storage for refresh tokens
  • ✅ Auto Token Refresh - Handles token expiration automatically
  • ✅ Detailed Logging - Comprehensive error handling and debugging

🎥 Demo Video

![Google Apps Script MCP Server Demo](https://github.com/mohalmah/google-appscript-mcp-server/blob/main/demo/google%20app%20script%

Read from source at commit ff4d9aeff4adOBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add postman-mcp-generator-mcp --env GOOGLE_APP_SCRIPT_API_API_KEY=${GOOGLE_APP_SCRIPT_API_API_KEY} --env GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=${GOOGLE_APP_SCRIPT_API_CLIENT_SECRET} --env GOOGLE_APP_SCRIPT_API_REFRESH_TOKEN=${GOOGLE_APP_SCRIPT_API_REFRESH_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "postman-mcp-generator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "GOOGLE_APP_SCRIPT_API_API_KEY": "${GOOGLE_APP_SCRIPT_API_API_KEY}",
        "GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "${GOOGLE_APP_SCRIPT_API_CLIENT_SECRET}",
        "GOOGLE_APP_SCRIPT_API_REFRESH_TOKEN": "${GOOGLE_APP_SCRIPT_API_REFRESH_TOKEN}"
      }
    }
  }
}
03

Exposed tools (16)

9 read · 6 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
get_script_metricsreadGet metrics data for Google Apps Script projects.
list_script_processesreadList information about a script\
script_processes_listreadList processes for a Google Apps Script project.
script_projects_createwriteCreate a new Google Apps Script project.
script_projects_deployments_createwriteCreates a deployment of an Apps Script project.
script_projects_deployments_deletedestructiveDelete a deployment of an Apps Script project.
script_projects_deployments_getreadGet a deployment of an Apps Script project.
script_projects_deployments_listreadLists the deployments of an Apps Script project.
script_projects_deployments_updatewriteUpdates a deployment of an Apps Script project.
script_projects_getreadGet metadata of a Google Apps Script project. OAuth authentication is handled automatically.
script_projects_get_contentreadGet the content of a Google Apps Script project.
script_projects_versions_createwriteCreates a new version of a Google Apps Script project.
script_projects_versions_getreadGet a version of a Google Apps Script project.
script_projects_versions_listreadList the versions of a Google Apps Script project.
script_runwriteRun a Google Apps Script.
update_script_contentwriteUpdates the content of a specified Google Apps Script project.
04

Trust audit

CAUTIONgrade B · trust 82/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
lib/tokenManager.js:41
console.log(`📁 Created token directory: ${this.tokenDir}`);
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
lib/tokenManager.js:108
console.log(`⏰ Access token expires in ${expiresIn} minutes`);
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
script_projects_deployments_delete
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
test/debug-content-fetch.js:15
console.log('✅ Got access token:', token.substring(0, 20) + '...');
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
test/oauth-setup-broken.js:123
console.log(`📁 Token location: ${tokenInfo.location}`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
test/oauth-setup-fixed.js:125
console.log(`📁 Token location: ${tokenInfo.location}`);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
helpers/convert-to-oauth.js:36
if (content.includes("import { getAuthHeaders } from '../../../lib/oauth-helper.js';")) {
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
helpers/convert-to-oauth.js:43
content = `import { getAuthHeaders } from '../../../lib/oauth-helper.js';\n\n${content}`;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/update-error-handling.js:16
const loggerImport = `import { logger } from '../../../lib/logger.js';`;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tools/google-app-script-api/apps-script-api/script-processes-list-script-processes.js:1
import { logger } from '../../../lib/logger.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tools/google-app-script-api/apps-script-api/script-processes-list.js:1
import { getAuthHeaders } from '../../../lib/oauth-helper.js';
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, commander, dotenv, express, googleapis, open
Why it matters. 6 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
OAUTH_SETUP.md:212
curl -X POST https://oauth2.googleapis.com/token \
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOInventory / provenance · inv.oversize · CWE-1104
demo/google app script mcp demo.gif
demo/google app script mcp demo.gif
Why it matters. 16271638 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
OAUTH_SETUP.md:148
2. **Refresh token**: The refresh token allows long-term access - treat it like a password
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
OAUTH_SETUP.md:250
3. **Access token expiry**: Access tokens typically expire after 1 hour
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-08 · audit v0.4.1 · source sha ff4d9aeff4adfull audit observations/trust-audit/mcp-server/mohalmah__google-apps-script.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08ff4d9aeff4adCAUTIONB82first audit
06

Questions

What tools does Google Apps Script expose?

16 in total: 9 read-only, 6 that write, and 1 that can delete or overwrite (script_projects_deployments_delete). Every one is listed on this page with its risk.

Is Google Apps Script safe to connect to an agent?

With care. The audit graded it B (82/100) and found 17 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Google Apps Script need?

It reads GOOGLE_APP_SCRIPT_API_API_KEY, GOOGLE_APP_SCRIPT_API_CLIENT_SECRET and GOOGLE_APP_SCRIPT_API_REFRESH_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Google Apps Script run?

It speaks sse and stdio, so it runs as a local process your client starts. It is published on npm as postman-mcp-generator-mcp at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (ff4d9aeff4ad), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement