Google Apps Script MCP Server
This server provides an MCP-compliant interface for managing Google Apps Script projects, deployments, versions, and executions via 16 tools, with secure OAuth 2.0 authentication and automatic token refresh.
Project Management
Create new Apps Script projects
Retrieve project metadata
Get and update project source code/files
Version Control
Create new versions with descriptions
Retrieve specific version details
List all versions of a project
Deployment Management
Create, retrieve, list, update, and delete deployments
Specify version and manifest when creating deployments
Script Execution
Remotely execute Google Apps Script functions
Process Monitoring
List execution processes with filtering by status, type, function name, time range, and deployment
Metrics & Analytics
Retrieve execution metrics and analytics (counts, error rates, performance) by deployment and granularity
Security
OAuth 2.0 authentication with automatic token refresh and OS-level secure credential storage
Compatible with MCP clients such as Claude Desktop, VS Code, and Postman.
Enables comprehensive interaction with Google Apps Script API, allowing management of script projects, deployments, versions, and executions. Includes tools for creating and updating script content, managing versioned snapshots, deploying scripts, and monitoring script execution processes and metrics.
Integrates with Google Cloud Resource Manager API for project operations, supporting the management of Google Apps Script projects in the Google Cloud environment.
Provides access to Google Drive API for file access, which is mentioned as a recommended API to enable for complete functionality with the Google Apps Script integration.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Apps Script MCP Serverlist my recent script deployments"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Apps Script 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
Related MCP server: Google Workspace MCP
🌟 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

Watch the Google Apps Script MCP Server in action - creating projects, managing deployments, and executing scripts through VS Code AI Agent.
🚀 Features
Core Capabilities
Project Management: Create, retrieve, and update Google Apps Script projects
Deployment Management: Create, list, update, and delete script deployments
Version Control: Create and manage script versions
Content Management: Get and update script content and files
Process Monitoring: List and monitor script execution processes
Metrics Access: Retrieve script execution metrics and analytics
Script Execution: Run Google Apps Script functions remotely
Security Features
OAuth 2.0 Flow: Full Google OAuth implementation
Secure Token Storage: Refresh tokens stored in OS keychain/credential manager
Automatic Token Refresh: No manual token management required
Environment Variable Support: Secure credential configuration
⚙️ Prerequisites
Before starting, ensure you have:
Node.js (v18+ required, v20+ recommended) - Download here
npm (included with Node.js)
Google Account with access to Google Cloud Console
Git (for cloning the repository)
🚀 Quick Start Guide
1. Clone the Repository
git clone https://github.com/mohalmah/google-apps-script-mcp-server.git
cd google-apps-script-mcp-server2. Install Dependencies
npm install3. Set Up Google Cloud OAuth
Follow the detailed OAuth setup guide below.
4. Run OAuth Setup
npm run setup-oauth5. Test the Server
npm start1.1 MCP config for Node.js
Edit your claude_desktop_config.json file:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"google-apps-script": {
"command": "node",
"args": ["/path/to/google-appscript-mcp-server/mcpServer.js"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "your_client_id",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "your_client_secret"
}
}
}
}1.2 MCP config for Docker
Build the Docker image:
docker build -t google-appscript-mcp:latest .Edit your claude_desktop_config.json file:
{
"mcpServers": {
"google-apps-script": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e", "GOOGLE_APP_SCRIPT_API_CLIENT_ID=your_client_id",
"-e", "GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=your_client_secret",
"-v", "google-appscript-tokens:/home/app/.config/google-apps-script-mcp",
"google-appscript-mcp:latest"
]
}
}
}📖 Detailed Setup Instructions
If you haven't cloned the repository and installed dependencies yet, follow the Quick Start Guide first.
Step 1: Google Cloud Console Setup
1.1 Create or Select a Google Cloud Project
Go to Google Cloud Console
Click the project dropdown at the top
Click "New Project" or select an existing project
If creating new:
Enter a project name (e.g., "Google Apps Script MCP")
Note your Project ID (you'll need this)
Click "Create"
1.2 Enable Required APIs
In the Google Cloud Console, navigate to APIs & Services → Library
Search for and enable the following APIs:
Google Apps Script API (required)
Google Drive API (recommended for file access)
Google Cloud Resource Manager API (for project operations)
For Google Apps Script API:
Search "Google Apps Script API"
Click on the result
Click "Enable"
Wait for the API to be enabled (may take a few minutes)
1.3 Configure OAuth Consent Screen
Go to APIs & Services → OAuth consent screen
Choose External (unless you're in a Google Workspace organization)
Fill in the required information:
App name: "Google Apps Script MCP Server"
User support email: Your email address
App logo: (optional)
App domain: Leave blank for development
Developer contact information: Your email address
Click "Save and Continue"
Configure Scopes (Optional but Recommended):
Click "Add or Remove Scopes"
Add these scopes:
https://www.googleapis.com/auth/script.projectshttps://www.googleapis.com/auth/script.projects.readonlyhttps://www.googleapis.com/auth/script.deploymentshttps://www.googleapis.com/auth/script.deployments.readonlyhttps://www.googleapis.com/auth/script.metricshttps://www.googleapis.com/auth/script.processes
Click "Update"
Add Test Users (for External apps):
Click "Add Users"
Add your Gmail address as a test user
Click "Save and Continue"
1.4 Create OAuth 2.0 Credentials
Go to APIs & Services → Credentials
Click "+ CREATE CREDENTIALS" → "OAuth 2.0 Client IDs"
For Application Type, select "Web application"
Configure the client:
Name: "Google Apps Script MCP Client"
Authorized JavaScript origins: (leave empty for now)
Authorized redirect URIs: Add exactly this URL:
http://localhost:3001/oauth/callback
Click "Create"
IMPORTANT: Copy your Client ID and Client Secret immediately
Client ID looks like:
1234567890-abcdefghijklmnop.apps.googleusercontent.comClient Secret looks like:
GOCSPX-abcdefghijklmnopqrstuvwxyz
Step 2: Configure Environment Variables
2.1 Create .env File
Create a .env file in your project root:
# On Windows
type nul > .env
# On macOS/Linux
touch .env2.2 Add OAuth Credentials
Edit the .env file and add your credentials:
# Google Apps Script API OAuth Configuration
GOOGLE_APP_SCRIPT_API_CLIENT_ID=your_client_id_here
GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=your_client_secret_here
# Optional: Logging level
LOG_LEVEL=infoReplace the placeholders with your actual values:
Replace
your_client_id_herewith your Client IDReplace
your_client_secret_herewith your Client Secret
Step 3: OAuth Authentication Setup
3.1 Run OAuth Setup
Execute the OAuth setup script:
npm run setup-oauthWhat this does:
Starts a temporary local server on
http://localhost:3001Opens your default browser to Google's authorization page
Asks you to grant permissions to the application
Captures the authorization code via the callback URL
Exchanges the code for access and refresh tokens
Stores the refresh token securely in your OS credential store
Tests the token by making a test API call
3.2 Grant Permissions
When your browser opens:
Select your Google account (must be the test user you added)
Review the permissions being requested:
See and manage your Google Apps Script projects
See your script executions and metrics
Access your script deployments
Click "Continue" or "Allow"
You should see: "OAuth setup completed successfully!"
3.3 Verify Token Storage
The setup process stores tokens securely:
Windows: Windows Credential Manager
macOS: Keychain Access
Linux: Secret Service API (GNOME Keyring/KDE Wallet)
Step 4: Test Your Setup
4.1 Test the MCP Server
npm startYou should see output like:
Google Apps Script MCP Server running on stdio
OAuth tokens loaded successfully
Server ready to handle MCP requests4.2 Test with Available Commands
# List all available tools
npm run list-tools
# Test OAuth connection
npm run test-oauth
# Enable debug logging
npm run debug🛠️ Available Tools
This MCP server provides 16 comprehensive tools for Google Apps Script management:
Project Management Tools
1. script-projects-create
Purpose: Create a new Google Apps Script project Parameters:
title(required): The title of the new script projectparentId(optional): The ID of the parent project
Example Usage: Create a new script for automation tasks
// Creates: "My Automation Script" project
{
"title": "My Automation Script",
"parentId": "1234567890"
}2. script-projects-get
Purpose: Get metadata of a Google Apps Script project Parameters:
scriptId(required): The ID of the script project to retrievefields(optional): Specific fields to include in responsealt(optional): Data format for response (default: 'json')
Example Usage: Retrieve project information
// Gets project details for script ID
{
"scriptId": "1ABC123def456GHI789jkl"
}3. script-projects-get-content
Purpose: Get the content of a Google Apps Script project Parameters:
scriptId(required): The ID of the script projectversionNumber(optional): Specific version number to retrieve
What it returns: Complete source code and files in the project Example Usage: Download script source code for backup or analysis
4. script-projects-update-content
Purpose: Update the content of a Google Apps Script project Parameters:
scriptId(required): The ID of the script project to updatefiles(required): Array of file objects with name, type, and source
Example Usage: Deploy code changes to your script project
Version Management Tools
5. script-projects-versions-create
Purpose: Create a new version of a Google Apps Script project Parameters:
scriptId(required): The ID of the script projectdescription(required): Description for the new version
Example Usage: Create versioned snapshots for deployment
{
"scriptId": "1ABC123def456GHI789jkl",
"description": "Added email notification feature"
}6. script-projects-versions-get
Purpose: Get details of a specific script version Parameters:
scriptId(required): The ID of the script projectversionNumber(required): The version number to retrieve
7. script-projects-versions-list
Purpose: List all versions of a script project Parameters:
scriptId(required): The ID of the script projectpageSize(optional): Number of versions per pagepageToken(optional): Token for pagination
Deployment Management Tools
8. script-projects-deployments-create
Purpose: Create a deployment of a Google Apps Script project Parameters:
scriptId(required): The ID of the script to deployversionNumber(required): Version number to deploymanifestFileName(required): Name of the manifest filedescription(required): Description for the deployment
Example Usage: Deploy your script as a web app or API executable
{
"scriptId": "1ABC123def456GHI789jkl",
"versionNumber": 3,
"manifestFileName": "appsscript.json",
"description": "Production deployment v1.2"
}Note: If your deployment uses Google services like DriveApp or SpreadsheetApp, you must manually authorize the script in the Apps Script editor before the web app will respond. See Script Authorization.
9. script-projects-deployments-get
Purpose: Get details of a specific deployment Parameters:
scriptId(required): The ID of the script projectdeploymentId(required): The ID of the deployment
10. script-projects-deployments-list
Purpose: List all deployments of a script project Parameters:
scriptId(required): The ID of the script projectpageSize(optional): Number of deployments per page
11. script-projects-deployments-update
Purpose: Update an existing deployment Parameters:
scriptId(required): The ID of the script projectdeploymentId(required): The ID of the deployment to updatedeploymentConfig(required): New deployment configuration
12. script-projects-deployments-delete
Purpose: Delete a deployment Parameters:
scriptId(required): The ID of the script projectdeploymentId(required): The ID of the deployment to delete
Execution and Monitoring Tools
13. script-scripts-run
Purpose: Execute a Google Apps Script function Parameters:
scriptId(required): The ID of the script to runAdditional parameters specific to the function being executed
Example Usage: Trigger script execution remotely Note: The script must be deployed and you must have execution permissions
14. script-processes-list
Purpose: List execution processes for a script project Parameters:
scriptId(required): The ID of the script projectpageSize(optional): Number of processes per pagepageToken(optional): Token for paginationstatuses(optional): Filter by process statusestypes(optional): Filter by process typesfunctionName(optional): Filter by function namestartTime(optional): Filter by start timeendTime(optional): Filter by end time
What it shows: Running, completed, and failed script executions
15. script-processes-list-script-processes
Purpose: Alternative method to list script processes with additional filtering
Parameters: Similar to script-processes-list with enhanced filtering options
16. script-projects-get-metrics
Purpose: Get execution metrics and analytics for a script project Parameters:
scriptId(required): The ID of the script projectdeploymentId(required): The ID of the deploymentmetricsGranularity(required): Granularity of metrics datafields(required): Specific metric fields to retrieve
What it provides:
Execution counts
Error rates
Performance metrics
Usage analytics
Tool Categories Summary
Category | Tools | Purpose |
Project Management | create, get, get-content, update-content | Manage script projects and source code |
Version Control | versions-create, versions-get, versions-list | Handle script versioning |
Deployment | deployments-create, deployments-get, deployments-list, deployments-update, deployments-delete | Manage script deployments |
Execution | scripts-run | Execute script functions |
Monitoring | processes-list, get-metrics | Monitor execution and performance |
Common Use Cases
Development Workflow:
Use
script-projects-createto create new projectsUse
script-projects-update-contentto upload codeUse
script-projects-versions-createto create stable versionsUse
script-projects-deployments-createto deploy for production
Monitoring and Debugging:
Use
script-processes-listto see execution historyUse
script-projects-get-metricsto analyze performanceUse
script-projects-get-contentto backup source code
Production Management:
Use
script-projects-deployments-listto see all deploymentsUse
script-projects-deployments-updateto update production configsUse
script-scripts-runto trigger automated workflows
⚠️ Script Authorization
When a script uses Google services such as DriveApp, SpreadsheetApp, GmailApp, or CalendarApp, it must be manually authorized before the deployed web app will respond correctly. The MCP server's API deployment does not trigger Google's OAuth consent flow.
If your deployed web app returns "Access Denied" or "You need access", complete these steps once after deployment:
Open the script in the Apps Script editor:
https://script.google.com/d/{SCRIPT_ID}/edit(Replace
{SCRIPT_ID}with the ID returned byscript-projects-createorscript-projects-get.)Click Run on any function that calls a Google service (e.g.,
doGet).When prompted, click Review Permissions.
Complete the Google OAuth consent flow:
Select your Google account
Click Advanced → Go to {project name} (unsafe)
Click Allow
Your deployed web app will now work correctly.
Note: This is a Google Apps Script platform requirement and cannot be bypassed via the API.
🌐 Test the MCP Server with Postman
The MCP Server (mcpServer.js) exposes your automated API tools to MCP-compatible clients, such as Claude Desktop or the Postman Desktop Application. We recommend that you test the server with Postman first and then move on to using it with an LLM.
Step 1: Download the latest Postman Desktop Application from https://www.postman.com/downloads/.
Step 2: Read the documentation article here and see how to create an MCP request inside the Postman app.
Step 3: Set the type of the MCP request to STDIO and set the command to node <absolute/path/to/mcpServer.js>.
For Windows users, you can get the full path to node by running:
Get-Command node | Select-Object -ExpandProperty SourceFor macOS/Linux users, you can get the full path to node by running:
which nodeTo check the node version on any platform, run:
node --versionFor Windows users, to get the absolute path to mcpServer.js, run:
Get-Location | Select-Object -ExpandProperty PathThen append \mcpServer.js to the path.
For macOS/Linux users, to get the absolute path to mcpServer.js, run:
realpath mcpServer.jsUse the node command followed by the full path to mcpServer.js as the command for your new Postman MCP Request. Then click the Connect button. You should see a list of tools that you selected before generating the server. You can test that each tool works here before connecting the MCP server to an LLM.
🔗 MCP Client Configuration
You can connect your MCP server to various MCP clients. Below are detailed instructions for both Claude Desktop and VS Code.
📋 Getting Required Paths
Before configuring any MCP client, you'll need the absolute paths to Node.js and your mcpServer.js file.
🪟 Windows Users
Get Node.js path:
Get-Command node | Select-Object -ExpandProperty SourceExample output: C:\nvm4w\nodejs\node.exe
Alternative method if first doesn't work:
where.exe nodeGet current directory path:
Get-Location | Select-Object -ExpandProperty PathExample output: C:\Users\mohal\Downloads\google-appscriot-mcp-server
Complete mcpServer.js path:
Join-Path (Get-Location) "mcpServer.js"Example output: C:\Users\mohal\Downloads\google-appscriot-mcp-server\mcpServer.js
Quick copy-paste command to get both paths:
Write-Host "Node.js path: $((Get-Command node).Source)"
Write-Host "mcpServer.js path: $(Join-Path (Get-Location) 'mcpServer.js')"🍎 macOS Users
Get Node.js path:
which nodeExample output: /usr/local/bin/node or /opt/homebrew/bin/node
Get mcpServer.js path:
realpath mcpServer.jsExample output: /Users/username/google-apps-script-mcp-server/mcpServer.js
Alternative method:
echo "$(pwd)/mcpServer.js"Quick copy-paste command to get both paths:
echo "Node.js path: $(which node)"
echo "mcpServer.js path: $(realpath mcpServer.js)"🐧 Linux Users
Get Node.js path:
which nodeExample output: /usr/bin/node or /usr/local/bin/node
Get mcpServer.js path:
realpath mcpServer.jsExample output: /home/username/google-apps-script-mcp-server/mcpServer.js
Quick copy-paste command to get both paths:
echo "Node.js path: $(which node)"
echo "mcpServer.js path: $(realpath mcpServer.js)"✅ Verify Node.js Version
On any platform, verify your Node.js version:
node --versionEnsure it shows v18.0.0 or higher.
🤖 Claude Desktop Setup
Step 1: Note the full paths from the previous section.
Step 2: Open Claude Desktop and navigate to:
Settings → Developers → Edit Config
Step 3: Add your MCP server configuration:
Configuration Template
{
"mcpServers": {
"google-apps-script": {
"command": "<absolute_path_to_node_executable>",
"args": ["<absolute_path_to_mcpServer.js>"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "your_client_id_here",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "your_client_secret_here"
}
}
}
}Windows Example
{
"mcpServers": {
"google-apps-script": {
"command": "C:\\nvm4w\\nodejs\\node.exe",
"args": ["C:\\Users\\mohal\\Downloads\\google-appscriot-mcp-server\\mcpServer.js"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "1234567890-abcdefghijk.apps.googleusercontent.com",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "GOCSPX-abcdefghijklmnopqrstuvwxyz"
}
}
}
}macOS/Linux Example
{
"mcpServers": {
"google-apps-script": {
"command": "/usr/local/bin/node",
"args": ["/Users/username/google-apps-script-mcp-server/mcpServer.js"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "1234567890-abcdefghijk.apps.googleusercontent.com",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "GOCSPX-abcdefghijklmnopqrstuvwxyz"
}
}
}
}Step 4: Replace the OAuth credentials with your actual values from the .env file.
Step 5: Save the configuration and restart Claude Desktop.
Step 6: Verify the connection by checking that the MCP server shows a green circle indicator next to it in Claude Desktop.
📝 VS Code Setup (Cline/MCP Extensions)
VS Code can use MCP servers through extensions like Cline or other MCP-compatible extensions.
Using with Cline Extension
Step 1: Install the Cline extension from the VS Code marketplace.
Step 2: Open VS Code settings (Ctrl+, on Windows/Linux, Cmd+, on macOS).
Step 3: Search for "Cline" or "MCP" in the settings.
Step 4: Add your MCP server configuration:
Method 1: VS Code Settings.json
Add to your VS Code settings.json (accessible via Ctrl+Shift+P → "Preferences: Open Settings (JSON)"):
{
"cline.mcpServers": {
"google-apps-script": {
"command": "C:\\nvm4w\\nodejs\\node.exe",
"args": ["C:\\Users\\mohal\\Downloads\\google-appscriot-mcp-server\\mcpServer.js"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "your_client_id_here",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "your_client_secret_here"
}
}
}
}Method 2: Workspace Configuration
Create a .vscode/settings.json file in your project root:
{
"cline.mcpServers": {
"google-apps-script": {
"command": "node",
"args": ["./mcpServer.js"],
"env": {
"GOOGLE_APP_SCRIPT_API_CLIENT_ID": "your_client_id_here",
"GOOGLE_APP_SCRIPT_API_CLIENT_SECRET": "your_client_secret_here"
}
}
}
}🔧 Configuration File Locations
Claude Desktop Config Location:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/claude-desktop/claude_desktop_config.json
VS Code Settings Location:
Windows:
%APPDATA%\Code\User\settings.jsonmacOS:
~/Library/Application Support/Code/User/settings.jsonLinux:
~/.config/Code/User/settings.json
🔑 Remember to:
Replace
your_actual_client_idandyour_actual_client_secretwith your OAuth credentialsUpdate the paths based on your actual system output from the commands above
Use your actual username instead of
usernamein the pathsEnsure you've run
npm run setup-oauthbefore configuring MCP clients
🔍 Troubleshooting
Common Issues and Solutions
1. "Command not found" or "Node not found" errors
Problem: MCP client can't find Node.js executable Solutions:
Ensure Node.js is properly installed and in your PATH
Use absolute paths to the Node.js executable (recommended)
Verify Node.js version is 18+ using
node --versionOn Windows, check if multiple Node.js versions are installed
2. "fetch is not defined" errors
Problem: Your Node.js version is below 18 Solutions:
Recommended: Upgrade to Node.js 18+
Alternative: Install
node-fetchas a dependency:npm install node-fetchThen modify each tool file to import fetch:
import fetch from 'node-fetch';
3. OAuth authentication errors
Problem: Authentication failures or token issues Solutions:
Verify your OAuth credentials are correct in the
.envfileEnsure environment variables are properly set in the MCP configuration
Re-run the OAuth setup:
npm run setup-oauthCheck that you've followed all steps in the Google Cloud Console setup
Verify the callback URL is exactly:
http://localhost:3001/oauth/callbackMake sure your Google account is added as a test user
4. "Authorization Error: Access blocked"
Problem: Google OAuth consent screen configuration issues Solutions:
Ensure your app is configured for "External" users
Add your Gmail address as a test user in OAuth consent screen
Verify all required scopes are added
Make sure the OAuth consent screen is properly published
5. MCP server not appearing in Claude Desktop
Problem: Configuration file syntax or path issues Solutions:
Check the configuration file syntax (valid JSON)
Ensure file paths use proper escaping (double backslashes on Windows)
Restart Claude Desktop after configuration changes
Check Claude Desktop logs for error messages
Verify the config file is in the correct location
6. VS Code/Cline connection issues
Problem: Extension not recognizing MCP server Solutions:
Verify the extension is properly installed and enabled
Check that the MCP configuration is in the correct settings location
Reload the VS Code window after configuration changes
Use workspace-specific settings if global settings don't work
7. "Permission denied" errors (macOS/Linux)
Problem: File permission issues Solutions:
Make the
mcpServer.jsfile executable:chmod +x mcpServer.jsOr use the full node command:
node /path/to/mcpServer.jsCheck file ownership and permissions
8. "EADDRINUSE" or port conflicts
Problem: Port 3001 is already in use during OAuth setup Solutions:
Kill any processes using port 3001:
# Find process using port 3001 lsof -i :3001 # macOS/Linux netstat -ano | findstr :3001 # Windows # Kill the process kill -9 <PID> # macOS/Linux taskkill /PID <PID> /F # WindowsOr temporarily change the port in
oauth-setup.js
9. "Token expired" or "Invalid credentials" errors
Problem: OAuth tokens have expired or are invalid Solutions:
Re-run the OAuth setup:
npm run setup-oauthClear stored tokens and re-authenticate
Check that your OAuth app credentials haven't changed
Verify the OAuth app is still active in Google Cloud Console
10. Script execution permission errors
Problem: Can't execute scripts or access projects Solutions:
Ensure your Google account has access to the Apps Script projects
Verify the script is shared with your account
Check that the required scopes are granted
For script execution, ensure the script is deployed and executable
11. "Access Denied" or "You need access" on deployed web app
Problem: Scripts using Google services (DriveApp, SpreadsheetApp, etc.) require manual authorization before the deployed URL works.
Solution: See the Script Authorization section for step-by-step instructions.
Testing Your Configuration
Test MCP Server Independently
npm startIf it starts without errors, your basic setup is correct.
Test OAuth Authentication
npm run test-oauthThis verifies your OAuth setup is working correctly.
Test with Debug Logging
npm run debugThis provides detailed logging to help identify issues.
Test Individual Tools
npm run list-toolsThis lists all available tools and their parameters.
Log Files and Debugging
Enable Debug Logging
Set the LOG_LEVEL environment variable:
# In .env file
LOG_LEVEL=debug
# Or run with debug
npm run debugCheck OAuth Flow
The OAuth setup process provides detailed output. Watch for:
Browser opening successfully
Authorization code capture
Token exchange success
Test API call success
Common Log Messages
Success Messages:
OAuth tokens loaded successfullyServer ready to handle MCP requestsTool executed successfully
Warning Messages:
Token refresh required(normal operation)Retrying API call with refreshed token
Error Messages:
OAuth credentials not found→ Check .env fileFailed to refresh token→ Re-run OAuth setupAPI call failed→ Check permissions and quotas
Getting Help
Support Resources
Google Apps Script API Documentation: https://developers.google.com/apps-script/api
MCP Protocol Documentation: https://modelcontextprotocol.io/
OAuth 2.0 Guide: https://developers.google.com/identity/protocols/oauth2
Diagnostic Information to Collect
When seeking help, please provide:
Node.js version (
node --version)Operating system and version
Error messages from console/logs
Steps you followed before the error
Contents of your
.envfile (without secrets)MCP client configuration (without secrets)
🚀 Advanced Usage
Environment Variables
Core Configuration
# Required OAuth credentials
GOOGLE_APP_SCRIPT_API_CLIENT_ID=your_client_id
GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=your_client_secret
# Optional configuration
LOG_LEVEL=info # debug, info, warn, error
NODE_ENV=development # development, production
PORT=3001 # OAuth callback portLogging Levels
debug: Detailed debugging informationinfo: General information messageswarn: Warning messageserror: Error messages only
Running in Production
Using PM2 Process Manager
# Install PM2
npm install -g pm2
# Start with PM2
pm2 start mcpServer.js --name "gas-mcp-server"
# Monitor
pm2 status
pm2 logs gas-mcp-server
# Auto-restart on system boot
pm2 startup
pm2 saveUsing Docker
Build Docker image:
docker build -t google-apps-script-mcp .Run with Docker:
docker run -i --rm --env-file=.env google-apps-script-mcpDocker Compose setup:
version: '3.8'
services:
gas-mcp:
build: .
env_file:
- .env
stdin_open: true
tty: trueClaude Desktop with Docker
{
"mcpServers": {
"google-apps-script": {
"command": "docker",
"args": ["run", "-i", "--rm", "--env-file=.env", "google-apps-script-mcp"]
}
}
}Custom Tool Development
Adding New Tools
Create a new tool file in
tools/google-app-script-api/apps-script-api/:
import { getAuthHeaders } from '../../../lib/oauth-helper.js';
const executeFunction = async ({ param1, param2 }) => {
const baseUrl = 'https://script.googleapis.com';
try {
const headers = await getAuthHeaders();
const response = await fetch(`${baseUrl}/v1/your-endpoint`, {
method: 'POST',
headers,
body: JSON.stringify({ param1, param2 })
});
return await response.json();
} catch (error) {
throw new Error(`API call failed: ${error.message}`);
}
};
export { executeFunction };Add to paths.js:
export const toolPaths = [
// ...existing paths...
'google-app-script-api/apps-script-api/your-new-tool.js'
];Update tool descriptions in your MCP server tool definitions.
Tool Template Structure
import { getAuthHeaders } from '../../../lib/oauth-helper.js';
/**
* Tool description and JSDoc comments
*/
const executeFunction = async (args) => {
const baseUrl = 'https://script.googleapis.com';
try {
// 1. Validate parameters
if (!args.requiredParam) {
throw new Error('requiredParam is required');
}
// 2. Get authentication headers
const headers = await getAuthHeaders();
// 3. Make API call
const response = await fetch(`${baseUrl}/v1/endpoint`, {
method: 'GET/POST/PUT/DELETE',
headers,
body: JSON.stringify(args) // for POST/PUT
});
// 4. Handle response
if (!response.ok) {
throw new Error(`API error: ${response.status} ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error('Tool execution failed:', error);
throw error;
}
};
export { executeFunction };Server-Sent Events (SSE) Mode
For real-time communication with web interfaces:
npm run start-sseThe server will run on HTTP with SSE support for streaming responses.
Multiple Environment Support
Development Environment
NODE_ENV=development
LOG_LEVEL=debug
GOOGLE_APP_SCRIPT_API_CLIENT_ID=dev_client_id
GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=dev_client_secretProduction Environment
NODE_ENV=production
LOG_LEVEL=info
GOOGLE_APP_SCRIPT_API_CLIENT_ID=prod_client_id
GOOGLE_APP_SCRIPT_API_CLIENT_SECRET=prod_client_secretPerformance Optimization
Token Caching
The OAuth helper automatically caches access tokens in memory and refreshes them as needed.
Request Batching
For multiple operations, consider batching requests where possible:
// Instead of multiple individual calls
const results = await Promise.all([
tool1(args1),
tool2(args2),
tool3(args3)
]);Rate Limiting
Google Apps Script API has rate limits. The tools include automatic retry logic with exponential backoff.
Security Best Practices
Credential Management
Never commit
.envfiles to version controlUse different OAuth apps for development and production
Regularly rotate OAuth credentials
Monitor OAuth app usage in Google Cloud Console
Access Control
Use least-privilege OAuth scopes
Add only necessary test users to your OAuth app
Monitor script execution logs for unauthorized access
Implement logging for all API calls
Network Security
Run the MCP server in a secure environment
Use HTTPS for production deployments
Implement proper firewall rules
Monitor network traffic for anomalies
🛠️ Additional CLI Commands
Available npm Scripts
# Start the MCP server
npm start
# Start with SSE support
npm run start-sse
# Start with debug logging
npm run debug
# Start SSE with debug logging
npm run debug-sse
# List all available tools and their descriptions
npm run list-tools
# Test OAuth authentication
npm run test-oauth
# Set up or refresh OAuth tokens
npm run setup-oauth
# Test logging functionality
npm run test-loggingTool Information
List Available Tools
npm run list-toolsExample output:
Available Tools:
Google Apps Script API:
script-projects-create
Description: Create a new Google Apps Script project
Parameters:
- title (required): The title of the new script project
- parentId (optional): The ID of the parent project
script-projects-get
Description: Get metadata of a Google Apps Script project
Parameters:
- scriptId (required): The ID of the script project to retrieve
- fields (optional): Specific fields to include in response
[... additional parameters ...]Adding New Tools from Postman
Visit Postman MCP Generator
Select new API requests for Google Apps Script or other APIs
Generate a new MCP server
Copy new tool files into your existing
tools/folderUpdate
tools/paths.jsto include new tool referencesRestart your MCP server
💬 Support and Community
Getting Help
GitHub Issues: Report bugs and request features
Postman Discord: Join the
#mcp-labchannel in Postman DiscordDocumentation: Visit Postman MCP Generator for updates
Contributing
Contributions are welcome! Please:
Fork the repository
Create a feature branch
Add tests for new functionality
Submit a pull request
License
This project is licensed under the MIT License. See the LICENSE file for details.
Available Tools
16 toolsget_script_metricsC
Get metrics data for Google Apps Script projects.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| deploymentId | Yes | The ID of the deployment to filter metrics. | |
| metricsGranularity | Yes | The granularity of the metrics data. | |
| fields | Yes | Selector specifying which fields to include in a partial response. | |
| key | Yes | API key for the request. | |
| access_token | Yes | OAuth access token for authorization. | |
| oauth_token | Yes | OAuth 2.0 token for the current user. | |
| prettyPrint | No | Whether to return the response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get metrics data' implies a read-only operation, but the description doesn't address authentication requirements (despite 3 auth parameters), rate limits, what specific metrics are returned, or whether this is a real-time or historical query. For a tool with 8 parameters including multiple auth options, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states the core purpose without unnecessary words. It's appropriately sized and front-loaded with the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters (7 required) and no output schema, the description is inadequate. It doesn't explain what metrics are returned, how they're formatted, or why multiple authentication parameters exist. With no annotations and complex parameter requirements, the description should provide more context about the tool's behavior and output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description doesn't add any parameter-specific information beyond what's in the schema. The baseline score of 3 reflects adequate coverage through the schema alone, though the description adds no additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and resource 'metrics data for Google Apps Script projects', making the purpose unambiguous. However, it doesn't differentiate this tool from sibling tools like 'script_projects_get' or 'script_projects_deployments_get', which also retrieve information about scripts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling tools that retrieve script-related data (e.g., 'script_projects_get', 'script_projects_deployments_get'), there's no indication of when metrics data is needed versus other script information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_script_processesC
List information about a script's executed processes.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script to list processes for. | |
| pageSize | No | The number of processes to return per page. | |
| functionName | No | Filter by function name. | |
| pageToken | No | Token for pagination. | |
| startTime | No | Filter by start time. | |
| endTime | No | Filter by end time. | |
| deploymentId | No | Filter by deployment ID. | |
| types | No | Filter by process types. | |
| statuses | No | Filter by process statuses. | |
| userAccessLevels | No | Filter by user access levels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions listing information but fails to describe key traits like whether this is a read-only operation, if it supports pagination (implied by 'pageToken' in schema but not explained), rate limits, authentication needs, or what the output format looks like. This leaves significant gaps for an agent to understand how to interact with the tool effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('List information about a script's executed processes'). There is no wasted verbiage, making it easy for an agent to parse quickly and understand the basic intent without unnecessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 10 parameters, no annotations, and no output schema, the description is incomplete. It doesn't address behavioral aspects like pagination, filtering logic, or response structure, which are critical for an agent to use this tool correctly. The schema covers parameters well, but the overall context lacks sufficient guidance for safe and effective invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with all 10 parameters well-documented in the schema. The description adds no additional meaning beyond what the schema provides, such as explaining filter interactions or parameter constraints. Since the schema does the heavy lifting, a baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't detract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('script's executed processes'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'script_processes_list' or 'get_script_metrics', which appear to have overlapping functionality, leaving some ambiguity about when to choose this specific tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'script_processes_list' or 'get_script_metrics'. It lacks context about prerequisites, such as needing a valid script ID, or exclusions, leaving the agent to infer usage from the schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_processes_listC
List processes for a Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script to filter processes. | |
| startTime | No | The start time for filtering processes. | |
| functionName | No | The name of the function to filter processes. | |
| deploymentId | No | The deployment ID to filter processes. | |
| projectName | No | The project name to filter processes. | |
| statuses | No | The statuses to filter processes. | |
| pageToken | No | Token for pagination. | |
| types | No | The types of processes to filter. | |
| userAccessLevels | No | User access levels to filter. | |
| pageSize | No | The number of processes to return per page. | |
| endTime | No | The end time for filtering processes. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a list operation but doesn't mention whether it's paginated (though 'pageToken' and 'pageSize' parameters suggest it is), what authentication is required, rate limits, or what the output format looks like. For a tool with 13 parameters and no output schema, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that states exactly what the tool does without any unnecessary words. It's appropriately sized and front-loaded with the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain the relationship between parameters, how filtering works, what the output contains, or provide any context about the processes being listed. The agent would need to infer too much from parameter names alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters thoroughly. The description doesn't add any parameter-specific information beyond what's in the schema descriptions, so it meets the baseline expectation without adding extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and resource ('processes for a Google Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate this tool from the sibling 'list_script_processes' which appears to serve a similar function, preventing a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'list_script_processes' or 'get_script_metrics'. There's no mention of prerequisites, typical use cases, or when other tools might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_createC
Create a new Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| parentId | Yes | The ID of the parent project. | |
| title | Yes | The title of the new script project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Create' implies a write operation, the description doesn't address permissions required, whether this is idempotent, what happens on failure, or what the response contains (e.g., project ID). This leaves significant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose with zero wasted words. It's appropriately sized and front-loaded, making it easy to understand at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with no annotations and no output schema, the description is incomplete. It doesn't explain what happens after creation (e.g., returns a project ID), potential errors, or how it integrates with sibling tools. Given the complexity of script projects and the rich sibling toolset, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters clearly documented in the schema. The description adds no additional parameter information beyond what's in the schema, so it meets the baseline score of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Create') and resource ('new Google Apps Script project'), making the purpose immediately understandable. However, it doesn't distinguish this tool from sibling tools like 'script_projects_versions_create' or 'script_projects_deployments_create', which also create related resources but not the project itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a parent project), when not to use it, or how it differs from sibling tools like 'script_projects_versions_create' that might be more appropriate in certain contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_deployments_createC
Creates a deployment of an Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script to deploy. | |
| manifestFileName | Yes | The name of the manifest file. | |
| versionNumber | Yes | The version number of the script. | |
| description | Yes | A description for the deployment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. While 'creates' implies a write operation, it doesn't disclose behavioral traits like whether this requires specific permissions, what happens if deployment fails, whether it's idempotent, or what the typical response looks like. For a mutation tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, with every word earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations, no output schema, and siblings that suggest complex workflows (e.g., versions, updates, deletions), the description is incomplete. It doesn't address what happens after creation, error conditions, or how this fits into the broader deployment lifecycle, leaving significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters with basic descriptions. The description adds no additional meaning about parameters beyond what's in the schema, such as explaining relationships between them (e.g., manifestFileName must match an existing file) or providing examples. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('creates') and resource ('deployment of an Apps Script project'), making the purpose immediately understandable. However, it doesn't distinguish this tool from its sibling 'script_projects_versions_create' which also creates something related to Apps Script projects, nor does it specify what type of deployment this creates (e.g., web app, API executable).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'script_projects_deployments_update' and 'script_projects_versions_create', there's no indication of prerequisites (e.g., needing an existing script project), sequencing (e.g., create version first), or when to choose this over other deployment-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_deployments_deleteC
Delete a deployment of an Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| deploymentId | Yes | The ID of the deployment to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool performs a deletion, implying it's destructive, but doesn't clarify if the deletion is permanent, reversible, requires specific permissions, affects associated resources, or has side effects like breaking linked scripts. This is inadequate for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the key action ('Delete'), making it easy to scan and understand immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after deletion (e.g., success confirmation, error handling), whether it affects project versions or runs, or any dependencies. Given the complexity of deployments in a scripting context, more behavioral context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with both parameters ('scriptId' and 'deploymentId') clearly documented. The description doesn't add any semantic context beyond what the schema provides, such as where to find these IDs or format requirements. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete') and the resource ('a deployment of an Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling deletion tools (none are listed) or other destructive operations like 'update_script_content' that might also modify deployments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a deployment ID from 'script_projects_deployments_list'), when not to use it (e.g., for active deployments), or how it differs from related tools like 'script_projects_deployments_update' or 'update_script_content'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_deployments_getC
Get a deployment of an Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| deploymentId | Yes | The ID of the deployment to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. While 'Get' implies a read operation, it doesn't specify whether this requires authentication, returns specific data formats, has rate limits, or handles errors. For a tool with zero annotation coverage, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately front-loaded and earns its place by clearly communicating the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is insufficiently complete. It doesn't explain what a 'deployment' entails in this context, what data is returned, or any prerequisites for successful execution. For a retrieval tool in a complex domain (Apps Script projects), more contextual information would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters clearly documented in the schema. The description doesn't add any meaningful parameter context beyond what the schema already provides, so it meets the baseline expectation without compensating value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('deployment of an Apps Script project'), making the purpose immediately understandable. However, it doesn't distinguish this tool from potential siblings like 'script_projects_deployments_list' or 'script_projects_versions_get' which might retrieve related but different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'script_projects_deployments_list' (likely for listing multiple deployments) and 'script_projects_get' (for retrieving project metadata), the agent must infer usage context without explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_deployments_listC
Lists the deployments of an Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| pageSize | No | The number of deployments to return per page. | |
| pageToken | No | Token for pagination. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states it 'Lists' deployments, implying a read-only operation, but doesn't describe pagination behavior (implied by parameters), return format, error conditions, or authentication requirements. The description is minimal and lacks essential operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero wasted words. It's front-loaded with the core purpose and efficiently communicates the essential action without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain what a 'deployment' entails in this context, the structure of returned data, pagination behavior, or error handling. The minimal description leaves too many operational questions unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 5 parameters. The description adds no additional parameter semantics beyond implying 'scriptId' is required (stated in schema). Baseline 3 is appropriate when schema does all the work, though the description could have explained relationships between parameters like pagination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('deployments of an Apps Script project'), making the purpose immediately understandable. It distinguishes from siblings like 'script_projects_deployments_get' (singular) and 'script_projects_deployments_create' (creation), but doesn't explicitly contrast with 'script_projects_versions_list' which lists versions rather than deployments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a valid scriptId), compare to similar tools like 'script_projects_versions_list', or indicate scenarios where deployments listing is appropriate over other operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_deployments_updateC
Updates a deployment of an Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script to update. | |
| deploymentId | Yes | The ID of the deployment to update. | |
| deploymentConfig | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but lacks behavioral details. It states 'Updates' implying mutation, but doesn't disclose permissions needed, whether changes are reversible, rate limits, or what the response looks like (no output schema). This is inadequate for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste, front-loading the core action and resource. It's appropriately sized for the tool's complexity, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with no annotations, 67% schema coverage, no output schema, and nested objects, the description is incomplete. It doesn't address behavioral aspects (e.g., side effects, error handling) or provide usage context, leaving significant gaps for an AI agent to understand how to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (2 of 3 top-level parameters have descriptions), and the description adds no parameter semantics beyond the schema. It doesn't explain what 'deploymentConfig' entails or provide context for the parameters. With moderate schema coverage, the baseline is 3 as the description doesn't compensate for gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Updates') and resource ('a deployment of an Apps Script project'), making the purpose evident. It distinguishes from siblings like 'script_projects_deployments_create' (create) and 'script_projects_deployments_delete' (delete), though it doesn't explicitly differentiate from 'update_script_content' which updates content rather than deployments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., existing deployment), exclusions, or compare to siblings like 'script_projects_deployments_create' for new deployments or 'update_script_content' for content updates, leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_getC
Get metadata of a Google Apps Script project. OAuth authentication is handled automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project to retrieve. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| alt | No | Data format for response. | json |
| quotaUser | No | Arbitrary string assigned to a user for quota purposes. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions OAuth authentication is handled automatically, which is useful context, but fails to describe critical behaviors like what metadata is returned, error conditions, rate limits, or whether this is a read-only operation. For a tool with 5 parameters and no annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Get metadata of a Google Apps Script project') and adds one useful contextual note about authentication. There's no wasted verbiage or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (5 parameters, no annotations, no output schema), the description is incomplete. It doesn't explain what 'metadata' includes, the response format, error handling, or how this differs from sibling tools. The authentication note is helpful but insufficient for a tool that likely returns structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 5 parameters. The description adds no additional parameter semantics beyond what's in the schema, such as explaining the format of 'scriptId' or typical use cases for 'fields'. This meets the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('metadata of a Google Apps Script project'), making the purpose immediately understandable. It doesn't explicitly differentiate from siblings like 'script_projects_get_content' or 'script_projects_versions_get', but the focus on 'metadata' provides some implicit distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention siblings like 'script_projects_get_content' (which retrieves content) or 'script_projects_versions_get' (which retrieves version details), leaving the agent to guess based on tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_get_contentC
Get the content of a Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project to retrieve content for. | |
| versionNumber | No | The version number of the script project. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| alt | No | Data format for response. | |
| key | No | API key for the project. | |
| access_token | No | OAuth access token. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It states it 'gets' content, implying a read-only operation, but doesn't mention authentication requirements (though parameters suggest OAuth or API key), rate limits, error conditions, or what format the content returns (e.g., code files, JSON). For a tool with 7 parameters and no output schema, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that efficiently conveys the core action without unnecessary words. It's front-loaded with the essential information ('Get the content'), making it easy to parse quickly, which is ideal for conciseness in tool definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 parameters, no annotations, no output schema), the description is insufficiently complete. It doesn't explain what 'content' entails (e.g., source code, project structure), how authentication works despite parameters suggesting it, or return values, leaving the agent under-informed for effective use in a broader context with many sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all parameters well-documented in the schema itself (e.g., scriptId, versionNumber, fields). The description adds no additional parameter semantics beyond implying retrieval of 'content,' which aligns with the schema but doesn't provide extra context like default behaviors or parameter interactions. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('content of a Google Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'script_projects_get' (which might get metadata) or 'update_script_content' (which modifies content), leaving some ambiguity about its specific scope within the family of script project tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'script_projects_get' (likely for metadata) and 'update_script_content' (for modifications), there's no indication of the appropriate context or prerequisites for retrieving content specifically, leaving the agent to guess based on tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_versions_createC
Creates a new version of a Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| description | Yes | A description for the new version. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is a creation operation, implying mutation, but doesn't cover critical aspects like required permissions, whether this action is reversible, rate limits, or what happens to existing versions. For a mutation tool with zero annotation coverage, this is a significant gap in behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any fluff or redundancy. It's appropriately sized and front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, or behavioral nuances like side effects. With 2 parameters and 100% schema coverage, the parameter aspect is covered, but the overall context for safe and effective use is lacking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with both parameters ('scriptId' and 'description') clearly documented in the schema. The description adds no additional parameter information beyond what the schema provides, so it meets the baseline of 3 for adequate but not additive parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Creates') and resource ('a new version of a Google Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'script_projects_create' or 'script_projects_deployments_create', which also create things in the script ecosystem.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing script project), when not to use it, or how it differs from similar creation tools in the sibling list, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_versions_getC
Get a version of a Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| versionNumber | Yes | The version number of the script project. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| alt | No | Data format for response. | |
| key | No | API key for the project. | |
| access_token | No | OAuth access token. | |
| quotaUser | No | Available to use for quota purposes for server-side applications. | |
| oauth_token | No | OAuth 2.0 token for the current user. | |
| callback | No | JSONP callback. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure but provides minimal information. It states this is a 'Get' operation which implies read-only behavior, but doesn't clarify authentication requirements (OAuth vs API key), rate limits, error conditions, or what specific version information is returned. For a tool with 10 parameters including authentication options, this lack of behavioral context is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that states the core purpose without unnecessary words. It's front-loaded with the essential information and contains zero wasted language. For a tool with this level of schema documentation, the concise approach is appropriate and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (10 parameters including authentication options), lack of annotations, and absence of an output schema, the description is insufficiently complete. It doesn't address what information is returned about script versions, how authentication works, error handling, or how this differs from related tools. For a tool in a crowded namespace with authentication-sensitive operations, more contextual information is needed to guide proper usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema itself. The description doesn't add any parameter-specific information beyond what's already in the schema descriptions. It doesn't explain the relationship between required parameters (scriptId, versionNumber) and optional ones, or provide guidance on which authentication method to use. The baseline score of 3 reflects adequate but minimal value added beyond the comprehensive schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('a version of a Google Apps Script project'), making the purpose immediately understandable. It distinguishes this as a retrieval operation for specific versions rather than general project information or list operations. However, it doesn't explicitly differentiate from sibling tools like 'script_projects_get' or 'script_projects_versions_list', which would require more specific language about retrieving individual version details versus general project info or listing multiple versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling tools including 'script_projects_get', 'script_projects_versions_list', and 'script_projects_get_content', there's no indication whether this tool retrieves metadata, content, or other version-specific details. The agent must infer usage from the name alone, which is insufficient given the crowded tool namespace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_projects_versions_listC
List the versions of a Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| pageSize | No | The number of versions to return per page. | |
| pageToken | No | The token for the next page of results. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| alt | No | Data format for response. | |
| key | No | API key for the request. | |
| access_token | No | OAuth access token. | |
| oauth_token | No | OAuth 2.0 token for the current user. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. While 'List' implies a read-only operation, the description doesn't specify whether this requires authentication, has rate limits, returns paginated results (though schema hints at pagination via pageSize/pageToken), or what the output format looks like. For a tool with 9 parameters and no annotations, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that states the core purpose without unnecessary words. It's front-loaded with the essential information ('List the versions'), making it efficient and easy to parse. Every word earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (9 parameters, no annotations, no output schema), the description is insufficient. It doesn't address authentication requirements, pagination behavior, error conditions, or relationship to sibling tools. For a list operation in a family of script project tools, more context about what 'versions' represent and how this fits into the broader workflow would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 9 parameters. The description adds no parameter-specific information beyond what's in the schema (e.g., it doesn't explain how scriptId is obtained or typical pageSize values). With high schema coverage, the baseline score of 3 is appropriate as the description doesn't enhance parameter understanding but doesn't need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('versions of a Google Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'script_projects_deployments_list' or 'script_projects_versions_get', which could cause confusion about when to use this specific list operation versus other list or get operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like 'script_projects_versions_get' (for a single version) and 'script_projects_deployments_list' (for deployments), the agent lacks context about when this list operation is appropriate versus other retrieval methods. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
script_runC
Run a Google Apps Script.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script to run. | |
| fields | No | Selector specifying which fields to include in a partial response. | |
| alt | No | Data format for response. | |
| key | No | API key for the project. | |
| access_token | No | OAuth access token. | |
| oauth_token | No | OAuth 2.0 token for the current user. | |
| quotaUser | No | Available to use for quota purposes for server-side applications. | |
| prettyPrint | No | Returns response with indentations and line breaks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but offers minimal information. It states the action ('Run') but doesn't describe what happens during execution (e.g., synchronous/asynchronous, side effects, error handling, permissions required, or rate limits). For a tool that likely performs mutations, this lack of detail is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core action and resource, making it immediately clear. Every word earns its place, and there's no redundancy or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of running a script (likely a mutation with side effects), no annotations, and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, execution context, or how it differs from sibling tools. For a tool with 8 parameters and significant potential impact, more context is needed to guide safe and effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter semantics beyond what the input schema provides. However, schema description coverage is 100%, with all 8 parameters well-documented in the schema (e.g., scriptId, fields, alt, key). This meets the baseline of 3, as the schema does the heavy lifting, but the description doesn't enhance understanding of how parameters interact or affect execution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Run') and resource ('a Google Apps Script'), making the purpose immediately understandable. It distinguishes this execution tool from sibling tools that focus on metrics, processes, projects, deployments, versions, or content updates. However, it doesn't specify what 'run' entails (e.g., execution of a function, deployment, or script trigger).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites (e.g., needing a script ID from another tool), appropriate contexts (e.g., testing vs. production), or comparisons to siblings like 'script_projects_deployments_create' or 'update_script_content'. Usage is implied but not explicitly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_script_contentC
Updates the content of a specified Google Apps Script project.
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project to update. | |
| files | Yes | The files to be updated in the script project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states this is an update operation but doesn't disclose critical behavioral traits: whether this overwrites existing content, requires specific permissions, has rate limits, returns confirmation or error details, or affects running scripts. For a mutation tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It's appropriately sized and front-loaded, with every word contributing to understanding the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't address what happens during the update (e.g., overwrite behavior, error handling), what permissions are needed, or what the return value looks like. With rich sibling tools and complex parameters (files array with nested objects), more context is needed for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (scriptId, files) well-documented in the schema. The description adds no additional parameter semantics beyond implying content update, which is already clear from the tool name and schema. This meets the baseline of 3 when schema does the heavy lifting, but doesn't compensate with extra context like file format expectations or update constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Updates') and resource ('content of a specified Google Apps Script project'), making the purpose immediately understandable. However, it doesn't differentiate this tool from similar siblings like 'script_projects_deployments_update' or 'script_projects_versions_create', which also involve updates to script-related entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling tools involving script updates (e.g., deployments_update, versions_create), there's no indication of whether this is for modifying source code versus other aspects, or any prerequisites like needing the script ID first from get_content tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
16 tool updates
- First observed
get_script_metrics - First observed
list_script_processes - First observed
script_processes_list - First observed
script_projects_create - First observed
script_projects_deployments_create - First observed
script_projects_deployments_delete - First observed
script_projects_deployments_get - First observed
script_projects_deployments_list - First observed
script_projects_deployments_update - First observed
script_projects_get - First observed
script_projects_get_content - First observed
script_projects_versions_create - First observed
script_projects_versions_get - First observed
script_projects_versions_list - First observed
script_run - First observed
update_script_content
TDQS
Most tools have distinct purposes, but there is notable overlap between 'list_script_processes' and 'script_processes_list', which appear to do the same thing, causing potential confusion. Other tools like 'script_projects_get' and 'script_projects_get_content' are closely related but serve different functions, which might require careful reading to differentiate.
The naming follows a consistent snake_case pattern with a clear structure, primarily using verb_noun combinations like 'script_projects_get' and 'script_projects_deployments_list'. However, there is a minor inconsistency with 'script_run' and 'update_script_content' not fully adhering to the 'script_projects_' prefix used by most tools, slightly breaking the pattern.
With 16 tools, the count is reasonable for managing Google Apps Script projects, covering metrics, processes, deployments, versions, and content. It's slightly on the higher side but still well-scoped for the domain, avoiding being overly heavy or thin.
The tool set provides comprehensive coverage for Google Apps Script management, including CRUD operations for projects, deployments, and versions, as well as running scripts and updating content. There are no obvious gaps, offering a complete lifecycle from creation to execution and monitoring.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Provides tools for searching Google Workspace documentation and much more.
List, read, edit, and deploy your GenMB AI-generated apps from any MCP client.
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables users to create, manage, and execute Google Apps Script projects through natural language. It provides comprehensive tools for code editing, function execution, deployment management, and monitoring script processes.5010MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Google Workspace services (Gmail, Calendar, Drive, Docs, Sheets, Chat, Slides, People) through natural language using Claude Desktop, Claude Code CLI, and other MCP clients.4543MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for Claude Code CLI that integrates with Google Workspace, enabling management of Docs, Sheets, Drive, Gmail, Calendar, and Apps Script.113MIT
- FlicenseBqualityFmaintenanceProvides comprehensive management of Google Apps Script projects via clasp CLI, enabling AI assistants to create, clone, deploy, and run scripts with full version control and deployment management.189-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mohalmah/google-appscript-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server