Mcp Google Sheets — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Google Sheets (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A comprehensive Model Context Protocol (MCP) server that provides full programmatic access to Google Sheets. This server enables AI assistants and applications to create, read, update, delete, share, and format Google Spreadsheets through a standardized MCP interface.
# Clone the repository
git clone https://github.com/yourusername/mcp-google-sheets.git
cd mcp-google-sheets
# Install dependencies
npm install
# Build the project
npm run buildYou have two options for providing credentials:
Option 1: Environment Variables (Recommended for Production)
Create a .env file in the project root:
SERVICE_ACCOUNT_EMAIL=your-service-account@project-id.iam.gserviceaccount.com
SERVICE_ACCOUNT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
SERVICE_ACCOUNT_PROJECT_ID=your-project-id
SERVICE_ACCOUNT_PRIVATE_KEY_ID=your-private-key-id
SERVICE_ACCOUNT_CLIENT_ID=your-client-idOption 2: JSON File
Place your downloaded service account JSON file in a credentials directory:
mkdir credentials
mv /path/to/your-service-account.json credentials/service-account.jsonOr set the path via environment variable:
SERVICE_ACCOUNT_PATH=/path/to/your-service-account.jsonIf you want the service account to access existing spreadsheets, share them with the service account email:
[email protected])# Development mode (with hot reload)
npm run dev
# Production mode
npm startThe server will start and listen for MCP requests via stdio.
Add the following to your Cursor MCP settings (usually in ~/.cursor/mcp.json or Cursor settings):
{
"mcpServers": {
"google-sheets": {
"command": "node",
"args": ["/absolute/path/to/mcp-google-sheets/dist/index.js"],
"env": {
"SERVICE_ACCOUNT_PATH": "/absolute/path/to/credentials/service-account.json"
}
}
}
}Or using environment variables:
{
"mcpServers": {
"google-sheets": {
"command": "node",
"args": ["/absolute/path/to/mcp-google-sheets/dist/index.js"],
"env": {
"SERVICE_ACCOUNT_EMAIL": "[email protected]",
"SERVICE_ACCOUNT_PRIVATE_KEY": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
"SERVICE_ACCOUNT_PROJECT_ID": "your-project-id"
}
}
}
}Add to your Claude Desktop configuration file (usually ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"google-sheets": {
"command": "node",
"args": ["/absolute/path/to/mcp-google-sheets/dist/index.js"],
"env": {
"SERVICE_ACCOUNT_PATH": "/absolute/path/to/credentials/service-account.json"
}
}
}
} {
title: string;
initialData?: {
sheetName: string;
values: any[][];
};
} {
spreadsheetId: string;
sheetName: string;
rows?: number; // Default: 1000
columns?: number; // Default: 26
} {
spreadsheetId: string;
range: string; // e.g., "Sheet1!A1:B10"
} {
spreadsheetId: string;
sheetName: string;
} {
spreadsheetId: string;
} {
spreadsheetId: string;
} {
spreadsheetId: string;
range: string;
values: any[][];
valueInputOption?: 'RAW' | 'USER_ENTERED'; // Default: 'RAW'
} {
spreadsheetId: string;
range: string;
values: any[][];
valueInputOption?: 'RAW' | 'USER_ENTERED';
} {
spreadsheetId: string;
range: string; // e.g., "A1"
value: any;
valueInputOption?: 'RAW' | 'USER_ENTERED';
} {
spreadsheetId: string;
sheetName: string;
} {
spreadsheetId: string;
} {
spreadsheetId: string;
emailAddress: string;
role: 'reader' | 'writer' | 'commenter';
sendNotificationEmail?: boolean; // Default: true
} {
spreadsheetId: string;
} {
pageSize?: number; // Default: 100
query?: string; // Optional search query
}{
"name": "create_spreadsheet",
"arguments": {
"title": "Sales Report Q1 2024",
"initialData": {
"sheetName": "Sales",
"values": [
["Product", "Quantity", "Revenue"],
["Widget A", 150, "$15,000"],
["Widget B", 200, "$20,000"],
["Widget C", 100, "$10,000"]
]
}
}
}{
"name": "read_range",
"arguments": {
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Sheet1!A1:C10"
}
}{
"name": "write_range",
"arguments": {
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Sheet1!A1",
"values": [
["Name", "Email", "Department"],
["John Doe", "[email protected]", "Engineering"],
["Jane Smith", "[email protected]", "Marketing"]
],
"valueInputOption": "USER_ENTERED"
}
}{
"name": "share_spreadsheet",
"arguments": {
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"emailAddress": "[email protected]",
"role": "writer",
"sendNotificationEmail": true
}
}# Install dependencies
npm install
# Run in development mode
npm run dev
# Build for production
npm run build
# Type checking
npm run type-check
# Start production server
npm start chmod 600 credentials/service-account.json1. "Service account credentials not found"
SERVICE_ACCOUNT_PATH points to the correct JSON file, orSERVICE_ACCOUNT_EMAIL and SERVICE_ACCOUNT_PRIVATE_KEY environment variables2. "Access denied" or "Permission denied" errors
3. "Spreadsheet not found"
https://docs.google.com/spreadsheets/d/{SPREADSHEET_ID}/edit)4. "API not enabled" errors
5. Connection or timeout issues
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)If you encounter any issues or have questions:
Made with ❤️ for the MCP community
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.