Skip to main content
AI-Developer → AI Engineering

AI Productivity with MCP: How I Automated Gmail, Calendar, Slack, and Projects with Plain English

Model Context Protocol (MCP) transforms Claude from a chatbot into a command center for your entire workday. Learn how to connect your tools with plain English—no coding required—and save 2+ hours every day.

March 14, 2026
18 min read
#MCP#Model Context Protocol#Claude#Automation#Productivity#N8N#Zapier#Gmail#Slack

I used to spend 2 hours every morning just managing my tools. Reading 50+ emails to find the 5 that mattered. Manually blocking calendar time. Scrolling through Slack for action items. Copy-pasting meeting notes into ClickUp. That's 40 hours a month on busywork. Then I discovered Model Context Protocol (MCP)—and now I control everything with a single sentence.

"Prioritize unread emails from last 24 hours, draft polite replies, label urgent versus later."

→ Done in 30 seconds. That's what MCP makes possible.

What This Article Covers

🔌
MCP Architecture
How servers, clients, and tools connect to give AI access to your real-world apps
5 Real Use Cases
Gmail, Calendar, Slack, Airtable, and ClickUp—with exact commands that work
🏗️
Build Your Own
TypeScript MCP server from scratch—correct SDK, full error handling, production-ready

What Is MCP? (The 60-Second Explanation)

Model Context Protocol (MCP) is an open standard, introduced by Anthropic in November 2024, that gives AI models a standardized way to connect to external tools and services. Before MCP, every AI integration was custom-built, fragile, and tool-specific. MCP standardizes the entire interface.

❌ Without MCP
  • AI can chat, but can't touch your tools
  • Every integration is custom-built
  • Switching AI models means rebuilding everything
  • No standard for "what tools exist"
  • You copy-paste between AI and your apps
✅ With MCP
  • AI reads emails, creates events, sends messages
  • One standard works with any MCP-compatible AI
  • Swap Claude for GPT-4—same tools still work
  • AI discovers tools automatically at runtime
  • Plain English commands trigger real actions

The MCP Architecture (Three Layers)

┌─────────────────────────────────────────────────────────────────┐
│                        YOUR COMMAND                              │
│   "Prioritize my inbox and draft replies for urgent emails"      │
└─────────────────────────┬───────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                    MCP CLIENT (Claude)                           │
│  • Receives your natural language command                        │
│  • Queries MCP server: "What tools are available?"               │
│  • Decides which tools to call and in what order                 │
│  • Returns structured response                                   │
└─────────────────────────┬───────────────────────────────────────┘
                          │  JSON-RPC 2.0 over stdio/HTTP/SSE
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                    MCP SERVER                                    │
│  • Exposes tools with JSON Schema definitions                    │
│  • Handles authentication to external services                  │
│  • Executes tool calls (read_emails, create_event, etc.)         │
│  • Returns results back to the client                           │
└────────────────┬────────────────┬───────────────┬───────────────┘
                 │                │               │
                 ▼                ▼               ▼
           ┌─────────┐     ┌──────────┐    ┌──────────┐
           │  Gmail  │     │ Calendar │    │  Slack   │
           │   API   │     │   API    │    │   API    │
           └─────────┘     └──────────┘    └──────────┘

Key insight: MCP uses JSON-RPC 2.0 as its transport protocol. Claude asks the server "list your tools," gets back a manifest of capabilities, then calls specific tools with arguments. This is why it works with any tool that has an API.


Two Ways to Set Up MCP: N8N vs. Zapier

Before building anything, choose your platform based on your technical comfort level.

🔧 N8N (Custom MCP Servers)
Best for: Full control, complex workflows, custom business logic
Pros:
  • Complete control over what tools expose
  • Combine multiple APIs in one tool
  • Free for self-hosted instances
  • Open source—no vendor lock-in
Cons:
  • Requires learning N8N workflow builder
  • More initial setup time (20–30 min)
📦 Setup: npm install -g n8n → n8n start → Add "MCP Server Trigger" node → Configure tools → Copy production URL
⚡ Zapier (Pre-Built Integrations)
Best for: Quick setup, 7,000+ official app integrations, non-technical users
Pros:
  • 5-minute setup for most tools
  • Official integrations with enterprise SaaS
  • No coding required
  • Handles OAuth automatically
Cons:
  • Less customization per tool
  • Some advanced tools require paid plans
📦 Setup: Go to mcp.zapier.com → Create MCP server → Add tools → Copy connection URL → Add to Claude

Connecting Either Server to Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "zapier": {
      "command": "npx",
      "args": ["-y", "@zapier/mcp-server"],
      "env": {
        "ZAPIER_API_KEY": "your-api-key-here"
      }
    },
    "n8n": {
      "command": "npx",
      "args": ["-y", "n8n-mcp"],
      "env": {
        "N8N_API_URL": "http://localhost:5678",
        "N8N_API_KEY": "your-n8n-api-key"
      }
    }
  }
}

Restart Claude Desktop. You'll see a hammer (🔨) icon in the chat input—that means tools are connected.


Use Case 1: Email Command Center (Gmail + MCP)

The problem: 50+ emails per day. You spend 45 minutes sorting, prioritizing, and drafting replies—for email that could be summarized in 2 minutes.

The fix: Connect Gmail via MCP. Three plain-English commands replace your entire morning email routine.

N8N Setup (Step-by-Step)

Step 1: Create your MCP server workflow in N8N

  1. Open N8N → New Workflow
  2. Add node: MCP Server Trigger
  3. Click "Generate Production URL" — copy this URL

Step 2: Add Gmail tools

  1. Add node: Gmail → Connect your Google account
  2. Configure Tool 1 — Read Emails:
    • Operation: Get Many
    • Search filter: Let AI define ← this is key
    • Max results: 50
  3. Configure Tool 2 — Send Email:
    • Operation: Send
    • To/Subject/Body: Let AI define for all three

Step 3: Add to Claude

  1. Claude Desktop → Settings → Developer → MCP Servers
  2. Add the N8N production URL as a custom server
  3. Restart Claude — Gmail tools now appear automatically

Real-World Commands That Work

Morning Triage
Prioritize unread emails from last 24 hours. Draft polite replies for anything requiring a response. Label urgent (needs reply today) vs. later (can wait 3+ days). Give me a summary of the top 5 most important threads.
⏱ Time: 30 seconds instead of 45 minutes
Action Item Extraction
Extract all the action items from my inbox for today (last 12 hours). Format as a numbered list with: sender, deadline if mentioned, and what I need to do.
→ Replaces manual note-taking from email threads
Financial Oversight
Analyze all invoices and subscription payment notifications from last week. List each service, amount, billing date. Flag anything over $200 or anything I don't recognize.
→ Catches unexpected charges and subscription creep
Targeted Send
Send an email to [email protected] reminding her about the discovery call scheduled for Thursday at 3 PM. Keep it brief and friendly—two sentences max.
→ Writes and sends—no composing required

Net result: Email management drops from 60 minutes → 5 minutes per day.


Use Case 2: Calendar Command Center (Google Calendar + MCP)

The problem: Scheduling is fragmented. You check availability, create events, set recurrences, and manage attendees across multiple screens. It's 30 minutes of context-switching every morning.

The fix: Three calendar tools plus natural language = complete schedule control.

Three Tools You Need

Add these to your N8N MCP workflow (or Zapier MCP server):

Tool N8N Operation What It Does
Create Event Calendar → Create New meetings, deep work blocks, reminders
Get Many Events Calendar → Get Many Read schedule, check availability, find conflicts
Delete Event Calendar → Delete Cancel meetings, clear blocked time

Critical config for recurring events: Set the RRule field to Let AI define. This lets Claude generate proper iCal recurrence rules (FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR;BYHOUR=8) without you having to know the syntax.

Commands That Replace Your Calendar App

Daily Review
How is my day looking today? What meetings do I have and when is my first block of free time over 90 minutes?
Deep Work Protection
Block 2 hours for deep work daily from 8:00 AM to 10:00 AM, Monday through Friday. Mark as busy. Repeat for the next 4 weeks.
Scheduling
Set a 30-minute call with [email protected] for next Monday at 2:00 PM. Title it "Product Roadmap Review." Add a Google Meet link.
Emergency Clear
Clear all non-essential events from today. Keep meetings with external people but remove any internal holds and focus blocks.

Net result: Calendar management drops from 30 minutes → 2 minutes per day.


Use Case 3: Slack Intelligence (Slack + MCP via Zapier)

The problem: Slack is a river of information. Hundreds of messages across dozens of channels. Finding what matters—announcements, action items, decisions—takes 45 minutes of manual scrolling.

The fix: Zapier MCP + Slack = instant intelligence from any channel.

Zapier Setup (5 Minutes)

  1. Go to mcp.zapier.com → Sign in → "New MCP Server"
  2. Select Claude as the client
  3. Click "Add Tool" → Slack → Connect your workspace
  4. Click "Add All Slack Tools" (includes: find message, send message, get channel history, list channels)
  5. Copy the connection URL
  6. In Claude Desktop config, add:
{
  "mcpServers": {
    "zapier-slack": {
      "command": "npx",
      "args": ["-y", "@zapier/mcp-server"],
      "env": {
        "ZAPIER_API_KEY": "your-zapier-api-key"
      }
    }
  }
}

Commands for Slack Overload

Weekly Channel Summary
Give me an overview of all the Slack activity in the #engineering channel from the past week. What were the main decisions made? What's still unresolved? List any action items assigned to anyone.
Action Item Extraction
Extract any announcements or action items from the #product-updates channel in the last 3 days. Format as a checklist with the person responsible and any mentioned deadline.
Smart Reply Drafting
Look at the thread in #deals where the team is discussing the Q2 pricing change. Draft a reply I can send that summarizes our agreed position and asks for final confirmation from the team.

Net result: Slack management drops from 45 minutes → 10 minutes per day.


Use Case 4: Data-to-Insights Pipeline (Airtable + MCP via Zapier)

The problem: Weekly reporting is a 4-hour slog. Fetch data from your database, analyze it in Excel, copy numbers into slides, format the deck, send to stakeholders. Every step is manual, error-prone, and mind-numbing.

The fix: A single Claude command triggers the entire pipeline—data fetch, analysis, slide creation, and Slack delivery.

The Three Tools Required

Add to your Zapier MCP server:

Tool What It Does
Airtable: Get Records Fetch raw data from any base/table
Airtable: Create Record Write results back to your database
Slack: Send Message Deliver reports directly to channels

Optional add-ons: Google Slides (create deck), Google Sheets (pivot tables), Notion (update wiki pages)

The End-to-End Reporting Command

Create a thorough analysis of our orders table in Airtable for this week.

Then:
1. Identify the top 3 trends in order volume
2. Flag any orders that are delayed beyond 5 days
3. Calculate total revenue vs. last week (percentage change)
4. Create a 3-slide summary presentation
5. Send the summary to #weekly-reports in Slack with the key numbers highlighted

What Claude actually does (in sequence):

  1. Calls airtable_get_records → fetches all orders
  2. Runs in-context analysis on the data
  3. Generates structured insights with numbers
  4. Calls google_slides_create → builds deck
  5. Calls slack_send_message → posts to channel

Net result: Weekly reporting drops from 4 hours → 15 minutes.


Use Case 5: Project Management Automation (ClickUp + MCP via Zapier)

The problem: After every meeting you have a transcript full of action items. Someone has to read it, extract tasks, figure out who owns what, and manually create each item in your PM tool. Nobody does this consistently.

The fix: One command reads the transcript, extracts tasks, and creates them—with the right assignees, descriptions, and lists.

ClickUp Setup

Get your ClickUp API Token:

  1. ClickUp → Settings (bottom-left avatar) → Apps
  2. Generate API Token → Copy

Add to Zapier MCP:

  1. Zapier MCP → Add Tool → ClickUp
  2. Connect with your API token
  3. Enable: Create Task, Update Task, Get Tasks, Move Task

Works identically for Asana, Linear, and Jira — just substitute the tool name.

Commands That Eliminate Manual Task Creation

Meeting Transcript → Tasks (The Big One)
Here's the transcript from today's sprint planning:

[paste transcript]

Extract all action items. For each one: identify the responsible person, set priority (high/medium/low), and create a task in the "Sprint 12" list in my ClickUp workspace. Add the original context as the task description.

→ 45 minutes of manual work → 2 minutes
Status Update Automation
Move all tasks assigned to me that are in "To Do" and have a due date of today or earlier to "In Progress". Then give me a summary of what I'm now working on.
Sprint Review Prep
Get all tasks from Sprint 11 in ClickUp. Show me: how many were completed vs. incomplete, which are carried over to Sprint 12, and what the team velocity was this sprint vs. last sprint.

Net result: Project management overhead drops from 60 minutes → 10 minutes per day.


Build Your Own MCP Server (TypeScript)

Ready to go beyond pre-built integrations? Here's how to build a production-ready custom MCP server. This uses the correct @modelcontextprotocol/sdk package (not the incorrect @modelcontextprotocol/server import sometimes shown in early tutorials).

Project Setup

mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx
npx tsc --init

Complete MCP Server (src/server.ts)

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
  Tool,
} from "@modelcontextprotocol/sdk/types.js";
import { z } from "zod";

// Define your tool schemas with Zod for type safety
const SendEmailSchema = z.object({
  to: z.string().email(),
  subject: z.string().min(1),
  body: z.string().min(1),
  priority: z.enum(["normal", "urgent"]).default("normal"),
});

const GetEmailsSchema = z.object({
  filter: z.string().optional().describe("Search query (e.g., 'from:[email protected]')"),
  maxResults: z.number().int().min(1).max(100).default(20),
  unreadOnly: z.boolean().default(false),
});

// Tool definitions (sent to Claude at handshake)
const TOOLS: Tool[] = [
  {
    name: "send_email",
    description: "Send an email to one or more recipients",
    inputSchema: {
      type: "object",
      properties: {
        to: { type: "string", description: "Recipient email address" },
        subject: { type: "string", description: "Email subject line" },
        body: { type: "string", description: "Email body (plain text or HTML)" },
        priority: { type: "string", enum: ["normal", "urgent"], description: "Email priority" },
      },
      required: ["to", "subject", "body"],
    },
  },
  {
    name: "get_emails",
    description: "Retrieve emails from inbox with optional filtering",
    inputSchema: {
      type: "object",
      properties: {
        filter: { type: "string", description: "Gmail search query" },
        maxResults: { type: "number", description: "Max emails to return (1-100)" },
        unreadOnly: { type: "boolean", description: "Return only unread emails" },
      },
    },
  },
];

// Tool implementations
async function handleSendEmail(args: unknown) {
  const { to, subject, body, priority } = SendEmailSchema.parse(args);

  // In production: call Gmail API here
  // const gmail = google.gmail({ version: 'v1', auth });
  // await gmail.users.messages.send({ ... });

  console.error(`[send_email] Sending to ${to}: "${subject}" (priority: ${priority})`);

  return {
    content: [
      {
        type: "text" as const,
        text: `✅ Email sent successfully to ${to}\nSubject: ${subject}\nPriority: ${priority}`,
      },
    ],
  };
}

async function handleGetEmails(args: unknown) {
  const { filter, maxResults, unreadOnly } = GetEmailsSchema.parse(args);

  // In production: call Gmail API here
  // const response = await gmail.users.messages.list({ q: filter, maxResults });

  const query = [filter, unreadOnly ? "is:unread" : ""].filter(Boolean).join(" ");
  console.error(`[get_emails] Fetching ${maxResults} emails (query: "${query}")`);

  // Mock response for illustration
  return {
    content: [
      {
        type: "text" as const,
        text: JSON.stringify({
          count: maxResults,
          query,
          message: "In production, real Gmail API results would appear here",
        }, null, 2),
      },
    ],
  };
}

// Server initialization
const server = new Server(
  { name: "email-mcp-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

// Handle tool list requests (Claude calls this first)
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return { tools: TOOLS };
});

// Handle tool execution requests
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  try {
    switch (name) {
      case "send_email":
        return await handleSendEmail(args);
      case "get_emails":
        return await handleGetEmails(args);
      default:
        throw new Error(`Unknown tool: ${name}`);
    }
  } catch (error) {
    const message = error instanceof Error ? error.message : String(error);
    return {
      content: [{ type: "text" as const, text: `❌ Error in ${name}: ${message}` }],
      isError: true,
    };
  }
});

// Start server (communicates over stdio)
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Email MCP server running on stdio");
}

main().catch((err) => {
  console.error("Fatal error:", err);
  process.exit(1);
});

Register With Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "email-server": {
      "command": "npx",
      "args": ["tsx", "/path/to/my-mcp-server/src/server.ts"],
      "env": {
        "GMAIL_CLIENT_ID": "your-client-id",
        "GMAIL_CLIENT_SECRET": "your-client-secret",
        "GMAIL_REFRESH_TOKEN": "your-refresh-token"
      }
    }
  }
}

Adding Authentication

For HTTP-based MCP servers (when sharing with a team), add authentication middleware:

import express from "express";
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";

const app = express();

// API key validation middleware
app.use("/mcp", async (req, res, next) => {
  const apiKey = req.headers["x-api-key"];

  if (!apiKey || !isValidApiKey(apiKey as string)) {
    return res.status(401).json({ error: "Invalid or missing API key" });
  }

  next();
});

// MCP endpoint
app.get("/mcp/sse", async (req, res) => {
  const transport = new SSEServerTransport("/mcp/messages", res);
  await server.connect(transport);
});

app.post("/mcp/messages", async (req, res) => {
  // Handle incoming messages
  await transport.handlePostMessage(req, res);
});

function isValidApiKey(key: string): boolean {
  // In production: check against your key store
  return key === process.env.MCP_API_KEY;
}

app.listen(3000);

Security and Privacy: What to Know Before You Connect

⚠️ MCP Servers Have Real Access to Your Data

When you connect Gmail via MCP, Claude can read every email in your inbox. When you connect ClickUp, it can create and modify every task in your workspace. This is the power—and the responsibility.

🔐 Credential Safety
  • Store API keys in environment variables, never in config files committed to git
  • Use OAuth tokens with the narrowest possible scopes (Gmail: `gmail.readonly` unless you need to send)
  • Rotate refresh tokens every 90 days
  • Use a secrets manager (AWS Secrets Manager, 1Password) for production
👁️ Review Before Confirming
  • Claude shows you what tool it's about to call — read it before clicking Allow
  • Use "Allow Once" for sensitive operations (deleting events, sending emails)
  • Reserve "Always Allow" only for read-only tools
  • Never allow bulk delete operations automatically
📊 Audit and Monitor
  • Check N8N/Zapier execution logs weekly for unexpected calls
  • Set up email alerts for tool call failures
  • Review Google OAuth permissions quarterly
  • MCP servers don't permanently store data — but Zapier logs do

What Data MCP Servers Can Access

Tool What Claude Can Read What Claude Can Write
Gmail Subject, sender, body, attachments Send emails, create drafts, add labels
Google Calendar All events, attendees, locations Create, modify, delete any event
Slack Message history, channel list, user profiles Send messages, create channels
Airtable All records, field values, table structure Create, update, delete records
ClickUp All tasks, assignees, status, comments Create, update, move, delete tasks

Performance: Real Time Savings

Task Manual Time With MCP Time Saved
Morning email triage (50 emails) 60 min 5 min 55 min
Calendar scheduling + blocking 30 min 2 min 28 min
Slack channel catch-up (5 channels) 45 min 10 min 35 min
Weekly data report (Airtable → Slides → Slack) 4 hrs 15 min 3h 45m
Post-meeting task creation (10 action items) 20 min 2 min 18 min
Daily total ~2.5 hrs ~34 min ~2 hrs

Monthly saving: ~40 hours of busywork converted into focused work.


Common Mistakes (and How to Avoid Them)

Mistake Why It Fails Fix
Using official Claude connectors only Gmail connector is read-only; can't send emails Use custom MCP server via N8N for full Gmail access
Not restarting Claude after config changes MCP servers don't hot-reload Quit and reopen Claude Desktop after every config change
Vague commands like "check my email" No context = unhelpful output Specify timeframe, action, and format: "last 24 hours, label urgent/later, draft replies"
Forgetting to set timezone in calendar tools Events scheduled at wrong time Set `timezone: "America/New_York"` (or your TZ) in the calendar tool config
Testing production tools without dry-run Accidentally sends real emails during testing Use separate test accounts; add a `dry_run: true` param to your tools during development
Connecting tools you don't regularly use Expands Claude's attack surface unnecessarily Only connect tools you'll use daily; disconnect others
Wrong SDK imports (`@modelcontextprotocol/server`) This package doesn't exist; server won't start Use `@modelcontextprotocol/sdk` — the correct official package

Key Takeaways

What to remember from this article:
1
MCP is a standard, not a product. Anthropic's Model Context Protocol (Nov 2024) gives any AI a universal interface to connect to any tool with an API. Claude, GPT-4, Gemini — all can use the same MCP servers.
2
Two paths: N8N (control) vs. Zapier (speed). Use Zapier MCP for fast setup with official integrations (5 minutes). Use N8N for custom tools, complex logic, and full control over what data Claude can access.
3
Specific commands outperform vague ones every time. "Check my email" returns noise. "Prioritize unread emails from the last 24 hours, draft polite replies, and label urgent vs. later" returns actionable results.
4
Security defaults matter. Use "Allow Once" for write operations, store credentials in environment variables, and only connect tools you use daily. MCP access is real access—treat it that way.
5
The correct SDK is @modelcontextprotocol/sdk. Build servers with Server from this package, ListToolsRequestSchema, and CallToolRequestSchema for robust, type-safe tool handling.

What's Next in the Series
You've automated your workday with MCP. Now go deeper into building autonomous AI systems:
→ Build an Autonomous Agent with Claude SDK
Go beyond single commands—build a multi-turn agent that plans, uses tools, and remembers context across sessions. Uses Anthropic's Messages API with tool use and Streamlit UI.
→ Local AI Agent with Ollama (No API Costs)
Run the same agentic loop completely offline using Llama 3.2 and Mistral. Zero data leaves your machine—perfect for sensitive workflows like processing confidential emails.
MH

Mohamed Hamed

20 years building production systems — the last several deep in AI integration, LLMs, and full-stack architecture. I write what I've actually built and broken. If this was useful, the next one goes to LinkedIn first.

Follow on LinkedIn →

Continue Reading

View all articles