Integrate with Google Workspace (Docs, Sheets, Drive, Calendar) using MCP servers
Overall
score
18%
Does it follow best practices?
If you maintain this skill, you can automatically optimize it using the tessl CLI to improve its score:
npx tessl skill review --optimize ./path/to/skillValidation for skill structure
Comprehensive Google Workspace integration using MCP servers for Docs, Sheets, Drive, and Calendar.
{
"mcpServers": {
"google-workspace": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-google-workspace"],
"env": {
"GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}",
"GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}"
}
}
}
}{
"mcpServers": {
"google-drive": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-google-drive"],
"env": {
"GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}",
"GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}"
}
}
}
}{
"mcpServers": {
"google-sheets": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-google-sheets"],
"env": {
"GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}",
"GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}"
}
}
}
}| Tool | Capabilities |
|---|---|
Bash(gcloud:*) | Execute gcloud CLI |
MCP(google-workspace:*) | Multi-service access |
MCP(google-drive:*) | Drive files, folders, sharing |
MCP(google-sheets:*) | Read/write sheets, formulas |
MCP(google-docs:*) | Create/edit docs |
Enable APIs
gcloud services enable docs.googleapis.com sheets.googleapis.com drive.googleapis.comCreate OAuth Credentials
Configure
export GOOGLE_CLIENT_ID="your-client-id"
export GOOGLE_CLIENT_SECRET="your-client-secret"Verify
gcloud auth list// 1. Load template
const template = await docs.get("template-doc-id");
// 2. Replace placeholders
const content = template.body.map(section => {
if (section.text.includes("{{COMPANY_NAME}}")) {
return { text: section.text.replace("{{COMPANY_NAME}}", "Acme Corp") };
}
return section;
});
// 3. Create new doc
const newDoc = await docs.create({
title: "Q1 Report - Acme Corp",
body: content
});
// 4. Share with team
await drive.share(newDoc.id, {
email: "team@company.com",
role: "writer"
});// 1. Load data from sheet
const sheet = await sheets.get("spreadsheet-id", "Sales!A1:H100");
// 2. Process data
const totals = {
revenue: 0,
deals: 0,
avgDeal: 0
};
for (const row of sheet.rows) {
totals.revenue += row.revenue;
totals.deals += 1;
}
totals.avgDeal = totals.revenue / totals.deals;
// 3. Create summary doc
const report = await docs.create({
title: `Sales Report - ${new Date().toLocaleDateString()}`,
body: [
{ heading: "Sales Summary" },
{ text: `Total Revenue: $${totals.revenue}` },
{ text: `Total Deals: ${totals.deals}` },
{ text: `Average Deal: $${totals.avgDeal}` }
]
});
// 4. Share
await drive.share(report.id, { email: "manager@company.com", role: "reader" });// 1. List local files
const localFiles = await fs.readDir("./reports");
// 2. Upload each to Drive
for (const file of localFiles) {
const content = await fs.readFile(file.path);
await drive.upload({
name: file.name,
parents: ["reports-folder-id"],
content: content
});
}
// 3. List Drive contents
const driveFiles = await drive.list({ folderId: "reports-folder-id" });
console.log(`Synced ${driveFiles.length} files`);// 1. Create event
const event = await calendar.createEvent({
summary: "Q1 Review Meeting",
description: "Quarterly sales review",
start: { dateTime: "2024-03-15T14:00:00", timeZone: "America/New_York" },
end: { dateTime: "2024-03-15T15:00:00", timeZone: "America/New_York" },
attendees: [
{ email: "team@company.com" }
],
conferenceData: {
createRequest: { requestId: "q1-review" }
}
});
// 2. Send invites
await calendar.sendNotifications(event.id);| Command | Description |
|---|---|
gcloud auth login | Authenticate |
gcloud docs create --title "Name" | Create doc |
gcloud sheets create --title "Name" | Create sheet |
gcloud drive list | List Drive files |
gcloud calendar events list | List events |
| Error | Meaning | Fix |
|---|---|---|
AUTH_001 | Not authenticated | Run gcloud auth login |
PERM_001 | Permission denied | Check sharing settings |
QUOTA_001 | Rate limited | Wait and retry |
NOT_FOUND | File not found | Check file ID |
async function uploadBatch(files: File[], folderId: string) {
const results = [];
for (const file of files) {
const result = await drive.upload({
name: file.name,
parents: [folderId],
content: file.content
});
results.push(result);
}
return results;
}async function updateSheet(spreadsheetId: string, data: any[]) {
// Read existing
const existing = await sheets.get(spreadsheetId, "Sheet1!A1");
// Append data
await sheets.append(spreadsheetId, "Sheet1", data);
}productivity/email-automation - Gmail integrationproductivity/calendar-management - Calendar eventsSkill v2.0 - Google Workspace MCP Integration
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.