Skip to main content
Glama
README.md
# Google Docs MCP Server (Next.js)

A remote Model Context Protocol (MCP) server that provides Google Docs integration for Claude Desktop, built with Next.js and deployed on Vercel.

## Features

- **Remote MCP Server**: Deployed on Vercel with SSE transport
- **Google OAuth**: Secure authentication with Google Docs and Drive permissions
- **Web Dashboard**: User-friendly interface for managing API keys
- **Multi-user**: Support for multiple users with isolated access
- **API Key Management**: Secure token-based authentication for MCP clients

## Architecture

```
User Browser → Next.js App → Google OAuth → Database (User/Tokens)
Claude Desktop → MCP SSE Transport → API Key Auth → Google APIs
```

## Setup

### 1. Google Cloud Console Setup

1. Create a new project in [Google Cloud Console](https://console.cloud.google.com/)
2. Enable Google Docs API and Google Drive API
3. Create OAuth 2.0 credentials:
   - Application type: Web application
   - Authorized redirect URIs: `https://your-app.vercel.app/api/auth/callback/google`
4. Copy Client ID and Client Secret

### 2. Database Setup

Create a PostgreSQL database (recommended: [Neon](https://neon.tech/) or [Supabase](https://supabase.com/))

### 3. Redis Setup

Create a Redis instance (required for Vercel MCP adapter). Recommended: [Upstash](https://upstash.com/)

### 4. Deploy to Vercel

1. Fork this repository
2. Import to Vercel
3. Add environment variables:
   ```
   NEXTAUTH_SECRET=your-random-secret
   NEXTAUTH_URL=https://your-app.vercel.app
   GOOGLE_CLIENT_ID=your-google-client-id
   GOOGLE_CLIENT_SECRET=your-google-client-secret
   DATABASE_URL=your-postgresql-url
   REDIS_URL=your-redis-url
   ```
4. Deploy

### 5. Initialize Database

After deployment, run database migrations:

```bash
pnpm db:push
```

## Usage

### Simple Setup (OAuth-on-Demand)

1. **Add MCP server to Claude Desktop** (no setup required):

```bash
claude mcp add --transport sse google-docs https://your-app.vercel.app/sse
```

Or manually add to `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "google-docs": {
      "command": "claude",
      "args": ["mcp", "connect", "sse", "https://your-app.vercel.app/sse"]
    }
  }
}
```

2. **First-time authorization**:
   - In Claude Desktop, run: "Use the authorize_google tool"
   - Claude will provide an authorization link
   - Click the link → browser opens → sign in with Google
   - After authorization, all Google Docs tools work automatically

3. **Available Tools**:
   - `authorize_google` - Authorize Google Docs access (run this first)
   - `read_document` - Read content from Google Docs
   - `create_document` - Create new Google Docs
   - `update_document` - Update document content with batch operations
   - `append_text` - Append text to documents
   - `list_documents` - List your Google Docs

### Alternative: API Key Setup (Advanced)

For programmatic access or multiple clients:

1. **Web Setup**:
   - Visit your deployed app: `https://your-app.vercel.app`
   - Sign in with Google
   - Create an API key

2. **Claude Desktop Setup**:
```bash
claude mcp add --transport sse google-docs \\
  https://your-app.vercel.app/sse \\
  --header "X-API-Key: your-api-key"
```

## Development

### Local Setup

1. Clone the repository
2. Install dependencies: `pnpm install`
3. Copy `.env.example` to `.env` and fill in values
4. Run database migrations: `pnpm db:push`
5. Start development server: `pnpm dev`

### Commands

- `pnpm dev` - Start development server
- `pnpm build` - Build for production
- `pnpm start` - Start production server
- `pnpm lint` - Run ESLint
- `pnpm db:generate` - Generate database migrations
- `pnpm db:push` - Push schema to database
- `pnpm db:studio` - Open Drizzle Studio

## Security

- API keys are hashed before storage
- Google refresh tokens are encrypted in database
- User isolation prevents cross-user access
- HTTPS enforced for OAuth callbacks

## Troubleshooting

### Common Issues

1. **OAuth Error**: Check redirect URI matches exactly
2. **Database Connection**: Verify DATABASE_URL format
3. **API Key Invalid**: Ensure X-API-Key header is set correctly
4. **Redis Connection**: Verify REDIS_URL for SSE transport

### Logs

Check Vercel function logs for detailed error information.

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make changes
4. Test locally
5. Submit a pull request

## License

MIT License - see LICENSE file for details.