Skip to main content
Glama
harshwadhawe

Google Calendar MCP Server

by harshwadhawe
README.md
# Project Management MCP Server

A **Model Context Protocol (MCP)** server that acts as a context-aware middleware for AI assistants. It intercepts user queries, analyzes intent, fetches context from multiple productivity systems (Google Calendar, GitHub, Slack, and JIRA), assembles a structured context package, and delivers it alongside the original prompt to the Gemini AI model for hyper-relevant responses.

This repository (together with a Devpost demo video) forms the submission for the Build-Your-Own-MCP Challenge.

---

## Table of Contents
1. [High-Level Workflow](#high-level-workflow)
2. [Key Capabilities](#key-capabilities)
3. [Architecture](#architecture)
4. [Integrations & Required Credentials](#integrations--required-credentials)
5. [Installation & Setup](#installation--setup)
6. [Running the Server & UI](#running-the-server--ui)
7. [Available MCP Tools](#available-mcp-tools)
8. [Submission Checklist](#submission-checklist)
9. [Project Structure](#project-structure)
10. [Troubleshooting](#troubleshooting)
11. [License & Contact](#license--contact)

---

## High-Level Workflow

1. **Intercept** user queries (via MCP client, CLI, or Streamlit dashboard).
2. **Analyze** intent with an NLP-powered `QueryAnalyzer` (intent detection, entity extraction, domain classification, temporal parsing).
3. **Fetch** supplemental context from the relevant data sources.
4. **Assemble** a ranked & summarized context package using caching, ranking, summarization, and correlation engines.
5. **Deliver** the context bundle and original prompt to Gemini for the final response.

---

## Key Capabilities

### Intelligent Query Understanding
- Detects calendar, GitHub, Slack, and JIRA domains (or multi-domain queries).
- Extracts entities such as repositories, PR/issue counts, calendar dates, backlog keywords, etc.
- Supports relative and absolute time references via a time-aware analyzer.

### Multi-Source Context Gathering
- **Google Calendar:** Events, availability, conflicts, and multi-calendar aggregation.
- **GitHub:** Repositories, issues, PRs, commits, deployments, README summaries.
- **Slack:** Channels, mentions, unread messages, recent activity.
- **JIRA:** Boards, assigned issues, backlog items, sprint insights.

### Context Packaging
- **ContextCache:** TTL-based cache to minimize redundant API calls.
- **ContextRanker:** Prioritizes the most relevant events/issues per query.
- **ContextSummarizer:** Compresses context to stay within token budgets.
- **ContextCorrelator:** Cross-links signals across services (e.g., meetings vs. deployments vs. Slack alerts).

### Delivery via Gemini
- Aggregated context + user prompt → Gemini (primarily `gemini-2.5-flash`) to craft a tailored response.

---

## Architecture

```
┌──────────────────────────┐
│      User Request        │
└────────────┬─────────────┘
             │
             ▼
┌──────────────────────────┐
│     Query Analyzer       │  ← intent detection, entities, time range
└────────────┬─────────────┘
             │
  ┌──────────┼───────────┐
  │          │           │
  ▼          ▼           ▼
Calendar   GitHub      Slack      JIRA
Client     Client      Client     Client
(fetch)    (fetch)     (fetch)    (fetch)
  │          │           │         │
  └──────────┴───────────┴─────────┘
             │
             ▼
┌──────────────────────────┐
│ Cache / Rank / Summarize │
└────────────┬─────────────┘
             │
             ▼
┌──────────────────────────┐
│ Gemini Client (Chat)     │ → context + prompt → AI answer
└──────────────────────────┘
```

---

## Integrations & Required Credentials

| Service          | Credentials / Env Vars                                  | Notes |
|------------------|----------------------------------------------------------|-------|
| Google Calendar  | `config/credentials.json`, `config/token.json` (generated) | OAuth desktop credentials with Calendar scopes |
| GitHub           | `.env` → `GITHUB_TOKEN`                                   | Personal Access Token with repo scope |
| Slack            | `.env` → `SLACK_USER_TOKEN`                               | User token with `channels:read`, `channels:history`, `groups:*`, `im:*`, `search:read`, `users:read` |
| JIRA             | `.env` → `JIRA_BASE_URL`, `JIRA_EMAIL`, `JIRA_API_TOKEN`  | Jira Cloud site, email, and API token |
| Gemini           | `.env` → `GEMINI_API_KEY`                                 | Google AI Studio API key |

Optional environment variables (with defaults in code):
- `GOOGLE_CREDENTIALS_PATH` (default `config/credentials.json`)
- `GOOGLE_TOKEN_PATH`       (default `config/token.json`)
- `CALENDAR_TIMEZONE`       (used for time parsing defaults)

Make sure sensitive files (credentials and tokens) stay out of version control. `.gitignore` already excludes them.

---

## Installation & Setup

1. **Clone the repository**
   ```bash
   git clone <repo-url>
   cd MCP\ server
   ```

2. **Create & activate a Python environment**
   ```bash
   python3 -m venv .venv
   source .venv/bin/activate            # Windows: .venv\Scripts\activate
   ```

3. **Install dependencies**
   ```bash
   pip install -r requirements.txt
   ```

4. **Provide credentials**
   - Place Google OAuth desktop credentials at `config/credentials.json`.
   - Create a `.env` file (copy `.env.example`) and populate the tokens/keys listed above.

5. **Authenticate Google Calendar (first run)**
   Running the server for the first time will launch a browser window for Google OAuth and produce `config/token.json`.

---

## Running the Server & UI

### 1. MCP Server (JSON-RPC over stdio)
```bash
python main.py
```
This registers tools such as `chat`, `get_calendar_context`, `get_github_repositories`, `get_slack_mentions`, `get_jira_backlog`, etc.

### 2. Streamlit Dashboard (optional UI)
```bash
streamlit run streamlit_app.py
```
Features predefined queries, quick actions, and a custom prompt box for Calendar/GitHub/Slack/JIRA.

### 3. CLI Test Scripts (optional)
- `interactive_client.py` for command-line chat testing.
- `slack_test.py`, `jira_test.py` for quick credential and API verification.

---

## Available MCP Tools

| Tool | Description |
|------|-------------|
| `chat` | Main conversational endpoint; auto-fetches relevant context across all services. |
| **Calendar** |
| `get_calendar_context` | Analyze a query and return formatted calendar context. |
| `check_availability` | Check availability for a specific timeslot. |
| `get_upcoming_events` | List upcoming events. |
| `detect_conflicts` | Identify conflicts on a date. |
| **GitHub** |
| `get_github_repositories` | List repositories (with metadata). |
| `get_github_issues` | Fetch open issues. |
| `get_github_pull_requests` | Fetch PRs. |
| `get_github_deployments` | Retrieve deployments + status. |
| **Slack** |
| `get_slack_channels` | List channels. |
| `get_slack_unread` | Channels with unread messages. |
| `get_slack_mentions` | Recent mentions. |
| **JIRA** |
| `get_jira_boards` | List boards. |
| `get_jira_issues` | General issue retrieval (board/JQL). |
| `get_my_jira_issues` | Issues assigned to the authenticated user (with fallbacks). |
| `get_jira_backlog` | Backlog items (Agile API + JQL fallback). |

Each tool returns a formatted string suitable for direct inclusion in a context package.

---

## Submission Checklist

✅ **GitHub Repository** – contains the full MCP server implementation, connectors, UI, and test scripts.

✅ **Context-Aware Workflow** – intercept → analyze → fetch → assemble → deliver implemented across four services.

⚠️ **Devpost Video Demo** – still needed. Please record a short walkthrough showing:
  - How a query flows through the system (e.g., via Streamlit UI).
  - The resulting context assembly (logs/UI snippets).
  - The Gemini-powered responses.
  - Any unique 2.0 features (caching, correlation, summarization).
  Upload the video to Devpost along with the repo link.

---

## Project Structure

```
MCP server/
├── main.py                     # Entry point for MCP server
├── streamlit_app.py            # Optional Streamlit UI
├── interactive_client.py       # Simple CLI client
├── slack_test.py / jira_test.py# Quick integration smoke tests
├── src/
│   ├── server.py               # MCP tools & orchestration layer
│   ├── query_analyzer.py       # NLP intent/time/entity detection
│   ├── context_cache.py        # TTL cache for API responses
│   ├── context_ranker.py       # Relevance scoring
│   ├── context_summarizer.py   # Compression + summarization utilities
│   ├── context_correlator.py   # Multi-source correlation engine
│   ├── context_formatter.py    # Human-friendly context formatting
│   ├── gemini_client.py        # Gemini chat integration
│   ├── calendar_client.py      # Google Calendar wrapper
│   ├── github_client.py        # GitHub REST wrapper
│   ├── slack_client.py         # Slack WebClient wrapper
│   ├── jira_client.py          # Jira REST (Agile + Core) wrapper
│   └── connectors/             # Connector facades per service
├── config/
│   ├── credentials.json        # Google OAuth client (excluded from git)
│   └── token.json              # Google OAuth token (excluded from git)
├── requirements.txt
├── .env.example
└── README.md (this file)
```

---

## Troubleshooting

| Issue | Resolution |
|-------|------------|
| Google Calendar auth loop | Delete `config/token.json` and rerun to reauthenticate. Ensure OAuth consent screen has you as a test user. |
| GitHub 401 | Regenerate `GITHUB_TOKEN` (classic PAT) with `repo` scope. |
| Slack `missing_scope` | Add required scopes under **User Token Scopes** and reinstall the app. |
| JIRA 410 errors | Confirm you have access to the Jira Cloud site and use valid API tokens. The client already falls back to board-based queries when search fails. |
| Gemini errors | Verify `GEMINI_API_KEY` is correct and the selected model is available in your region/account. |

Logging is configured to stderr to avoid interfering with MCP stdio responses.

---

## License & Contact

Created for the **Build-Your-Own-MCP Challenge**.

For questions, open an issue or reach out via the Devpost discussion board when submitting your demo.

Maintenance

ActivityInactive
ResponsivenessNo issues