Skip to main content
Glama
progrmoiz

Google Calendar MCP Server

by progrmoiz

πŸ—“οΈ Google Calendar MCP Server

I got tired of the Google Cloud setup BS, so I built this.

Connect your calendar in 30 seconds, not 3 hours.

Skip the OAuth nightmare. No Google Cloud Console. No service accounts. No headaches. Just works with Claude Desktop, Cursor, Zed, or whatever MCP client you're using.

✨ Why This Rocks

  • πŸš€ Actually Easy Setup - 30 seconds vs 3 hours of Google Cloud hell

  • πŸ”’ OAuth That Works - No token management headaches

  • πŸ”§ Works Everywhere - Claude, Cursor, Zed... if it does MCP, we got you

  • ⚑ Deploy & Forget - One-click Vercel deployment

  • πŸ—“οΈ Full Calendar Power - Create, edit, delete events like a boss

  • 🌐 Your Server - Host it yourself, own your data

  • πŸ“± Test Drive - Web UI to make sure everything works before going live

Related MCP server: Google Calendar MCP Server

Just Want to Use It?

  1. Connect your calendar:

  2. Add to your MCP client:

    Option A: Streamable HTTP (Recommended)

    {
      "mcpServers": {
        "google-calendar": {
          "url": "https://cal-mcp.com/api/mcp"
        }
      }
    }

    Option B: STDIO (Local Server)

    {
      "mcpServers": {
        "google-calendar": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "https://cal-mcp.com/api/mcp"]
        }
      }
    }

Want to Run Your Own?

  1. Grab the code:

    git clone https://github.com/progrmoiz/cal-mcp
    cd cal-mcp
    npm install
  2. Google OAuth setup (yeah, still need this part):

    • Hit up Google Cloud Console

    • Make a project (or use an existing one)

    • Enable Google Calendar API

    • Create OAuth 2.0 credentials

    • Add this redirect URI: http://localhost:3000/api/auth/callback/google

  3. Environment variables:

    cp .env.example .env.local

    Drop in your Google stuff:

    GOOGLE_CLIENT_ID=your_client_id
    GOOGLE_CLIENT_SECRET=your_client_secret
    BETTER_AUTH_SECRET=any_random_string
    BETTER_AUTH_URL=http://localhost:3000
  4. Fire it up:

    npm run dev
  5. Connect your calendar:

πŸ§ͺ Test Drive

Built-in web interface because who wants to debug blind?

  • Play with Events - Create, edit, delete events right in the browser

  • OAuth Testing - Make sure the auth flow actually works

  • Debug Mode - See raw API responses when things go sideways

  • Sanity Check - Verify everything works before plugging into your AI

Hit http://localhost:3000 once you're running and give it a spin.

What You Can Do

All the calendar stuff you'd expect:

  • list-calendars - See all your calendars

  • list-events - Get events for a date range

  • create-event - Make new events

  • update-event - Change existing events

  • delete-event - Remove events

  • search-events - Find events by text

  • get-event - Get event details

  • move-event - Move events between calendars

  • list-colors - Get color options for calendars/events

  • get-freebusy - Check when you're available

  • get-current-time - Current time and timezone info

For Builders

What's under the hood:

  • Better Auth handling the OAuth mess

  • MCP server that actually works

  • Next.js for the web stuff

  • TypeScript because we're not animals

Going Live

Ready to deploy? Here's what you need:

  1. Environment Variables - Set them on your hosting platform

  2. Database - Point to your Neon PostgreSQL URL

  3. Google OAuth - Update redirect URIs for your domain

  4. HTTPS - Because OAuth demands it

Security Stuff

  • Better Auth handles tokens so you don't have to

  • Secrets stay in environment variables where they belong

  • Everything needs auth (obviously)

  • Token refresh happens automatically

πŸ› οΈ When Things Break

Stuff not working? Try these:

Your AI Tool Doesn't Do MCP

Not all AI tools support MCP yet. Check if yours does before pulling your hair out.

Remote Connections Failing

Some tools do MCP but hate remote servers. Use the STDIO config instead.

OAuth Acting Up

Did you actually complete the Google login? Try connecting again from the homepage.

No MCP Support At All

Bug your AI tool's developers to add MCP support. The more people ask, the faster it happens.

πŸ› οΈ Architecture

Built with modern technologies for reliability and ease of use:

  • Next.js 15 - Full-stack framework with API routes

  • Better Auth - Secure OAuth 2.0 authentication

  • MCP Handler - Model Context Protocol server implementation

  • Google Calendar API - Direct integration with Google's calendar services

  • Vercel - Serverless deployment platform

  • TypeScript - Type-safe development

🀝 Want to Help?

Contributions welcome! Here's how:

  1. πŸ› Found a Bug? - Open an issue, tell us what broke

  2. πŸ’‘ Got Ideas? - Issues are perfect for brainstorming

  3. πŸ”§ Can Code? - PRs for fixes and features always welcome

  4. πŸ“– Hate Bad Docs? - Make them better!

  5. πŸ§ͺ Just Testing? - Feedback is gold

How to Contribute:

  1. Fork it

  2. Branch it: git checkout -b feature/cool-thing

  3. Code it (and test it!)

  4. PR it with a good description

If you want to contribute, here are some ideas worth tackling:

  • πŸ“Š Google Sheets MCP - Spreadsheets meet AI (imagine the possibilities!)

  • πŸ“§ Gmail MCP - Email automation that doesn't suck

  • ☁️ Google Drive MCP - File management for the AI era

  • πŸ“ Google Docs MCP - Collaborative writing with AI superpowers

Other Calendar Providers:

  • πŸ“… Outlook/Microsoft 365 - Because not everyone lives in Google land

  • 🍎 Apple Calendar (CalDAV) - For the Mac enthusiasts

Got another idea? Just build it!

The beauty of this setup is that it's dead simple to extend. Copy the auth flow, swap the API endpoints, and boom - you've got yourself a new MCP server.

Feel free to fork this repo and create a pull request. Let's build the future of productivity tools together, one API at a time. πŸ› οΈ

πŸ“„ License

MIT License - do whatever you want with it.

πŸ’¬ Need Help?

  • πŸ“– Docs: This README + code comments

  • πŸ› Bugs: GitHub Issues

  • πŸ’¬ Questions: GitHub Discussions

  • πŸ“§ Collaboration: Hit me up

Available Tools

4 tools
batchGetDateByTimestampC

Batch convert the provided list of timestamps to date format, used for processing multiple timestamps

ParametersJSON Schema
NameRequiredDescriptionDefault
tsListYes

TDQS

C2.9/5.0
Behavior2/5

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 conversion, implying a read-only operation, but doesn't specify any behavioral traits such as error handling, rate limits, output format, or whether it's idempotent. The description lacks details on what happens with invalid timestamps or the structure of the returned dates, leaving significant gaps 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.

Conciseness5/5

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 is front-loaded with the core action ('batch convert') and avoids redundancy. Every part of the sentence earns its place by conveying essential information, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (batch processing with 1 parameter), no annotations, no output schema, and low schema coverage, the description is incomplete. It doesn't explain the output format, error conditions, or how the conversion works (e.g., timezone handling). For a tool that processes multiple timestamps, more context is needed to ensure proper usage, making it inadequate for the given context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 0% description coverage, so the schema provides no semantic information. The description adds some value by explaining that 'tsList' is a 'list of timestamps' for 'batch convert,' but it doesn't specify the timestamp format (e.g., Unix time in seconds/milliseconds), units, or any constraints. This provides basic semantics but doesn't fully compensate for the low schema coverage, meeting the baseline for minimal parameter insight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('batch convert') and resource ('list of timestamps to date format'), making the purpose understandable. It distinguishes from sibling 'getDateByTimestamp' by specifying batch processing, though it doesn't explicitly mention all siblings. The description is specific enough to understand what the tool does without being tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides minimal guidance by stating it's 'used for processing multiple timestamps,' which implies when to use it versus single-timestamp alternatives. However, it doesn't explicitly name when to use this tool versus siblings like 'getDateByTimestamp' or 'cal,' nor does it mention any prerequisites or exclusions. The guidance is limited to an implied context without clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calC

Use the expr-eval library to evaluate the input mathematical expression and return the result.

Constant Description E The value of Math.E from your JavaScript runtime PI The value of Math.PI from your JavaScript runtime true Logical true value false Logical false value

ParametersJSON Schema
NameRequiredDescriptionDefault
expYes

TDQS

C2.8/5.0
Behavior2/5

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 mentions the expr-eval library and lists available constants (E, PI, true, false), but doesn't describe important behavioral traits like error handling, supported operators, performance characteristics, or whether it's a read-only operation. For a tool with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise with two sentences, but the constant table feels appended rather than integrated. The first sentence clearly states the purpose, but the table of constants could be more efficiently integrated. The structure is adequate but could be improved with better flow between the main description and the constant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a mathematical evaluation tool with no annotations, no output schema, and only 0% schema description coverage, the description is incomplete. It doesn't explain what types of expressions are supported, error conditions, return format, or limitations. For a tool that could have significant behavioral complexity, this description leaves too many questions unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds some meaning beyond the input schema, which has 0% description coverage. It clarifies that the 'exp' parameter should be a 'mathematical expression' and mentions available constants. However, it doesn't fully compensate for the schema coverage gap by explaining expression syntax, operator support, or validation rules. The baseline is 3 since the description provides some parameter context but not comprehensive documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'evaluate the input mathematical expression and return the result' using the expr-eval library. It specifies the verb (evaluate), resource (mathematical expression), and mechanism (expr-eval library). However, it doesn't explicitly differentiate from sibling tools like batchGetDateByTimestamp, which handle date calculations rather than general math expressions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 sibling tools or suggest scenarios where this mathematical evaluator would be preferred over date-related tools. The only implicit usage context is for mathematical expressions, but no explicit when/when-not or alternative recommendations are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getDateByTimestampC

Convert the provided timestamp to date format

ParametersJSON Schema
NameRequiredDescriptionDefault
tsYes

TDQS

C2.8/5.0
Behavior2/5

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. It states the tool converts a timestamp to date format, implying a read-only transformation, but doesn't specify details like timezone handling, output format (e.g., ISO 8601, human-readable), error behavior for invalid inputs, or performance characteristics. This leaves significant gaps in understanding how the tool behaves beyond its basic function.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely conciseβ€”a single sentence that directly states the tool's function without unnecessary words. It's front-loaded with the core purpose, making it efficient and easy to parse. Every part of the sentence earns its place by conveying essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 parameter, no annotations, no output schema), the description is incomplete. It doesn't explain the output (e.g., what date format is returned), error handling, or how it differs from siblings. For a conversion tool, details like timezone or format are critical for effective use, making this description inadequate despite the low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 0% description coverage, meaning the parameter 'ts' is undocumented in the schema. The description adds minimal semantics by implying 'ts' is a timestamp to convert, but doesn't specify units (e.g., seconds, milliseconds), range, or format expectations. This insufficiently compensates for the low schema coverage, leaving the parameter poorly defined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: converting a timestamp to date format. It specifies the verb 'convert' and the resource 'timestamp', making it easy to understand what the tool does. However, it doesn't differentiate from sibling tools like 'batchGetDateByTimestamp' or 'cal', which might offer similar or related functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 sibling tools like 'batchGetDateByTimestamp' for batch processing, 'cal' for calendar-related operations, or 'getNow' for current time. There's no context on prerequisites, limitations, or appropriate scenarios for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getNowB

Get the current timestamp

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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. 'Get the current timestamp' implies a read-only operation that returns time data, but it doesn't specify format (e.g., ISO 8601, Unix timestamp), timezone behavior, or whether it's real-time vs. cached. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description 'Get the current timestamp' is a single, efficient sentence that front-loads the core functionality with zero wasted words. Every word earns its place by clearly conveying what the tool does without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (0 parameters, no annotations, no output schema), the description is minimally adequate but incomplete. It doesn't explain what format the timestamp is returned in, which is critical context for a time-related tool. Without annotations or output schema, the description should provide more behavioral detail to be truly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters with 100% schema description coverage, so the schema already fully documents the lack of inputs. The description doesn't need to add parameter information, and it correctly implies no parameters are required by not mentioning any. This meets the baseline expectation for parameterless tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get the current timestamp' clearly states the verb 'Get' and the resource 'current timestamp', making the purpose immediately understandable. It distinguishes from siblings like 'getDateByTimestamp' which requires input parameters. However, it doesn't explicitly differentiate from 'cal' or 'batchGetDateByTimestamp', keeping it from 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.

Usage Guidelines2/5

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 'getDateByTimestamp' or 'batchGetDateByTimestamp'. It doesn't mention that this tool is for getting the current time without input, while siblings require timestamps as input. No explicit when/when-not or alternative recommendations are included.

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.

  1. 4 tool updates
    • First observedbatchGetDateByTimestamp
    • First observedcal
    • First observedgetDateByTimestamp
    • First observedgetNow

TDQS

C2.6/5.0

Scored across 4 tools

Disambiguation2/5

The tools have overlapping purposes that cause confusion. 'batchGetDateByTimestamp' and 'getDateByTimestamp' both convert timestamps to dates, differing only in batch vs. single processing, which could lead to misselection. 'cal' is completely unrelated to calendar operations, evaluating mathematical expressions instead, creating a domain mismatch. Only 'getNow' stands clearly apart as a distinct timestamp retrieval tool.

Naming Consistency2/5

The naming is inconsistent with mixed conventions and unclear patterns. 'batchGetDateByTimestamp' and 'getDateByTimestamp' use camelCase with a 'get' prefix, but 'getNow' uses snake_case-like simplicity. 'cal' is a vague abbreviation that doesn't follow any discernible pattern. There's no uniform verb_noun structure or consistent casing across the tool set.

Tool Count2/5

The tool count of 4 is too few for a Google Calendar server, indicating a severe mismatch. A calendar domain typically requires CRUD operations for events, calendars, and scheduling, but this set lacks core functionalities like creating, listing, updating, or deleting events. The tools provided are more about timestamp utilities than calendar management, making the count inappropriate for the stated purpose.

Completeness1/5

The tool surface is severely incomplete for a Google Calendar server. There are no tools for managing calendar events (e.g., create_event, list_events, update_event, delete_event), calendars, or scheduling features. The existing tools focus on timestamp conversion and math evaluation, which are tangential to calendar operations, leaving significant gaps that will cause agent failures in handling typical calendar tasks.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers