Skip to main content
Glama
AarushiG09

Google Docs & Gmail MCP Server

by AarushiG09
README.md
# Google Docs & Gmail MCP Server

A Python-based MCP-style FastAPI server that integrates with Google Docs and Gmail APIs.

## Features
- **Append to Doc (`POST /append_to_doc`)**: Appends text content to a Google Document.
- **Create Email Draft (`POST /create_email_draft`)**: Creates a Gmail draft.
- **Terminal Approval Gate**: Before executing any action, the server outputs the details in the console and blocks waiting for operator approval `Approve? (y/n)`.

---

## Setup Instructions

### 1. Enable Google APIs & Get Credentials

To run the server, you need to download OAuth client credentials from the Google Cloud Console.

1. Go to the [Google Cloud Console](https://console.cloud.google.com/).
2. Create a new project or select an existing one.
3. Enable the **Google Docs API** and **Gmail API** under **APIs & Services > Library**.
4. Configure the OAuth Consent Screen:
   - Choose user type (**External** or **Internal**).
   - Add the scopes:
     - `https://www.googleapis.com/auth/documents`
     - `https://www.googleapis.com/auth/gmail.compose`
   - Add your Gmail account under **Test users**.
5. Create Credentials:
   - Go to **APIs & Services > Credentials**.
   - Click **Create Credentials > OAuth client ID**.
   - Select application type **Desktop App** and name it (e.g., `MCP Google Server`).
   - Click **Create**, then download the client secrets JSON.
6. Rename the downloaded file to `credentials.json` and place it in the project root directory (`google-mcp-server/credentials.json`).

*Note: `credentials.json` and `token.json` (created after authentication) are added to `.gitignore` to prevent committing them to VCS.*

---

### 2. Install Dependencies

It is recommended to run in a Python virtual environment:

```bash
# Create and activate virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Install required packages
pip install -r requirements.txt
```

---

### 3. Run the Server

Start the FastAPI application:

```bash
python server.py
```

- On the first run, a browser window will open asking you to log into your Google Account.
- Grant permissions for the Docs and Gmail scopes.
- Once completed, the browser will show "The authentication flow has completed..." and `token.json` will be saved to the directory.
- Subsequent startups will automatically load credentials from `token.json` and skip the browser login.

*Note: The server binds to `127.0.0.1:8000` to prevent external network access.*

---

## API Usage & Verification

### 1. Append Text to a Google Doc

Sends a request to append text to the Google Document specified by `doc_id`.

**Request:**
```bash
curl -X POST http://127.0.0.1:8000/append_to_doc \
     -H "Content-Type: application/json" \
     -d '{
       "doc_id": "YOUR_DOCUMENT_ID_HERE",
       "content": "\nThis text was appended via the MCP-style server!"
     }'
```

**Terminal Prompt:**
```text
========================================
ACTION REQUESTED: append_to_doc
Payload: {'doc_id': 'YOUR_DOCUMENT_ID_HERE', 'content': '\nThis text was appended via the MCP-style server!'}
========================================
Approve? (y/n): 
```
- Type `y` and press **Enter** to execute the append operation.
- Type `n` (or any other input) to abort. The endpoint returns `403 Forbidden`.

---

### 2. Create a Gmail Draft

Sends a request to create a draft email.

**Request:**
```bash
curl -X POST http://127.0.0.1:8000/create_email_draft \
     -H "Content-Type: application/json" \
     -d '{
       "to": "recipient@example.com",
       "subject": "Hello from MCP",
       "body": "This is a draft generated by the Google MCP server."
     }'
```

**Terminal Prompt:**
```text
========================================
ACTION REQUESTED: create_email_draft
Payload: {'to': 'recipient@example.com', 'subject': 'Hello from MCP', 'body': 'This is a draft generated by the Google MCP server.'}
========================================
Approve? (y/n): 
```
- Type `y` and press **Enter** to execute the draft creation.
- Type `n` (or any other input) to abort. The endpoint returns `403 Forbidden`.