Intermediate

Connecting MCP Servers

What this gives you: Claude connected directly to your live business data. Your calendar, CRM, payment system, project boards, and meeting transcripts - all accessible in one conversation. Ask 'what revenue did we do this month?' and get a real answer.

Paste this guide into Claude Code and it will walk you through every step interactively.

What Is MCP?

MCP stands for Model Context Protocol. It is an open standard developed by Anthropic that defines how AI models connect to external tools and data sources. Think of it as a standardised plug socket: instead of every AI tool and every data source needing a custom integration, they both implement MCP and they just work together.

Before MCP, connecting Claude to an external service meant writing custom code: an API wrapper, a function that Claude could call, error handling, auth management. It worked, but every integration was its own small project. MCP standardises all of that. You configure a server once, and Claude gets native access to every tool that server exposes - no custom code, no wrappers.

How it differs from manual API calls

When you ask Claude to "check my Stripe revenue," there are two ways it can do that. The old way: Claude writes a curl command, you run it, paste the output back, Claude reads it. Or Claude writes a Python script, you execute it, copy the JSON, paste it in. Every step is manual and the context gets polluted with raw API responses.

With MCP: Claude has a stripe_list_charges tool. It calls it directly, receives structured data, and uses it - all in the same turn. No copy-paste, no script-writing, no context pollution. The tool call is invisible to you. You just see the answer.

ApproachHow It Works
Manual API callsWrite code, execute, paste output, Claude reads it. 3-5 manual steps per data fetch.
MCP tool callsClaude calls the tool, reads the result, responds. Zero manual steps.
LatencyMCP calls complete in under 2 seconds for most services. No file I/O, no subprocess overhead.
ContextMCP results are injected into Claude's context cleanly. Raw API paste can eat 2,000+ tokens for simple responses.

The 10 MCP Servers Used Daily

These are not theoretical - these are the servers running in an active Claude Code setup, used across real client work every day. Each one is listed with what it gives you and the primary use cases.

ServerWhat It ConnectsWhat You Can Do
Google CalendarYour calendarCheck availability, create events, see upcoming meetings
GoHighLevelYour CRMSearch contacts, view conversations, update pipeline stages
n8nYour automation platformCreate workflows, trigger automations, manage connections
TrelloYour project boardsCreate cards, move tasks, add comments, manage checklists
NotionYour knowledge baseSearch pages, create docs, update databases
StripeYour paymentsCheck revenue, view customers, pull subscription data
FirefliesYour meeting recordingsSearch transcripts, get summaries, extract action items
fal.aiAI image/video generationGenerate thumbnails, edit images, create video
CanvaYour design toolCreate designs, export assets, use brand kits
ApifyWeb scrapingScrape LinkedIn, extract website data, run actors

Configuration: settings.json Structure

MCP servers are configured in ~/.claude/settings.json. This file is read by Claude Code at startup. Each server gets its own entry under the mcpServers key.

{ "mcpServers": { "google-calendar": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-google-calendar"], "env": { "GOOGLE_CLIENT_ID": "${GOOGLE_CLIENT_ID}", "GOOGLE_CLIENT_SECRET": "${GOOGLE_CLIENT_SECRET}", "GOOGLE_REFRESH_TOKEN": "${GOOGLE_REFRESH_TOKEN}" } }, "gohighlevel": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-gohighlevel"], "env": { "GHL_API_KEY": "${GHL_API_KEY}", "GHL_LOCATION_ID": "${GHL_LOCATION_ID}" } }, "stripe": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-stripe"], "env": { "STRIPE_SECRET_KEY": "${STRIPE_SECRET_KEY}" } }, "notion": { "command": "npx", "args": ["-y", "@notionhq/notion-mcp-server"], "env": { "NOTION_API_KEY": "${NOTION_API_KEY}" } }, "trello": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-trello"], "env": { "TRELLO_API_KEY": "${TRELLO_API_KEY}", "TRELLO_TOKEN": "${TRELLO_TOKEN}" } } } }
Tip: Use ${VAR_NAME} syntax in settings.json - Claude Code automatically reads these from your environment. Your secrets stay in ~/.env and are never hardcoded into the config file.

Walkthrough: Connect Google Calendar MCP

Google Calendar is the most useful first MCP to connect because it immediately unlocks meeting prep and scheduling workflows. Here is the full process from zero to working tool calls.

Step 1: Create a Google Cloud project

Go to console.cloud.google.com and create a new project. Name it something like "Claude Code MCP." Inside the project, enable the Google Calendar API from the API Library.

Step 2: Create OAuth2 credentials

In the Google Cloud Console, go to APIs and Services > Credentials. Create an OAuth 2.0 Client ID. Set the application type to "Desktop app." Download the JSON credentials file - you'll need the client_id and client_secret from it.

Step 3: Generate the refresh token

# Install the Google auth helper npx -y @modelcontextprotocol/server-google-calendar auth # Follow the prompts - it opens a browser, you authorize, # it prints a refresh token. Copy it.

Step 4: Add credentials to ~/.env

# ~/.env - never commit this file GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=GOCSPX-your-secret GOOGLE_REFRESH_TOKEN=1//your-refresh-token

Step 5: Add to settings.json

Add the Google Calendar entry to ~/.claude/settings.json as shown in the configuration section above.

Step 6: Verify

Restart Claude Code and ask: "What's on my calendar today?" Claude should call the list_events tool and return your actual calendar data. If it returns an error, check that your ~/.env is being sourced in your shell profile (source ~/.env in ~/.zshrc).

Want your MCP stack configured and connected for you?

Full setup: Calendar, GHL, Stripe, Notion, Fireflies, and more - installed and tested.

Book a Call

Walkthrough: Connect GoHighLevel MCP

GHL is the highest-leverage MCP for service businesses. Every contact, pipeline, conversation, and appointment lives there. Connecting it to Claude gives you a CRM you can talk to.

Step 1: Generate your GHL API key

In GoHighLevel, go to Settings > Integrations > API Keys. Create a new API key. Give it a descriptive name like "Claude Code MCP." Copy the key immediately - GHL only shows it once.

Step 2: Find your Location ID

Your Location ID is in the GHL URL when you're inside a sub-account: app.gohighlevel.com/location/abc123xyz/dashboard. Copy the alphanumeric string - that is your Location ID.

Warning: If you manage multiple GHL sub-accounts (multiple clients), use a separate Location ID per client and name your MCP servers accordingly - ghl-client-a and ghl-client-b. Never mix credentials across client accounts.

Step 3: Add to ~/.env and settings.json

# ~/.env GHL_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... GHL_LOCATION_ID=abc123xyzLocationId
# ~/.claude/settings.json - add to mcpServers "gohighlevel": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-gohighlevel"], "env": { "GHL_API_KEY": "${GHL_API_KEY}", "GHL_LOCATION_ID": "${GHL_LOCATION_ID}" } }

Step 4: Verify

Restart Claude Code and ask: "Search my CRM for [a contact name you know exists]." Claude should call search_contacts and return the matching record with their pipeline stage, tags, and contact details.

Security: Credentials and Permissions

Two rules that protect you from the most common MCP security mistakes:

RuleWhy It Matters
Read-only by defaultFor any agent that runs automatically (scheduled, triggered by webhook, or managed by a VA), use read-only API keys where the service supports them. GHL has read-only tokens. Stripe has restricted keys. Use them. An agent that can only read cannot accidentally delete data or send messages.
Credentials in .env, never in settings.jsonThe ${VAR_NAME} syntax exists precisely for this. Your settings.json can be committed to a private dotfiles repo safely because it contains no actual secrets - only references to environment variables that live in ~/.env.

Troubleshooting MCP Connection Issues

The most common failure modes and how to resolve them:

Tool calls return "tool not found"

The MCP server is not connecting at startup. Check: (1) the package name in args is spelled correctly, (2) npx can install it (run the npx command manually in your terminal), (3) Claude Code has been restarted since you edited settings.json - changes are not hot-reloaded.

Authentication errors

The env vars are not being loaded. Check: (1) your ~/.env file has the correct variable names matching exactly what settings.json references, (2) your shell profile sources ~/.env on startup (grep "source ~/.env" ~/.zshrc), (3) the API key hasn't expired or been revoked.

Tool calls succeed but return empty data

Auth is working but permissions are wrong. This usually means the API key has access to a different location/workspace than the one you're querying. Double-check the Location ID, workspace ID, or account ID matches the data you're expecting.

Slow tool calls (5+ seconds)

MCP servers launched via npx download the package on first use. After the first call they're cached. If you're consistently seeing slow calls, consider installing the package globally: npm install -g @modelcontextprotocol/server-google-calendar and changing the command to the installed binary path.

Tip: Add a note to your CLAUDE.md listing which MCP servers are connected and what they can do. Claude reads CLAUDE.md at the start of every session, so it immediately knows what tools are available without having to discover them through trial and error.
Next Guide
Building Your AI Dashboard