google-mcp-suite-network
A tiny TypeScript wrapper that exposes five stdio MCP servers (Gmail, Calendar, Sheets, Docs, Drive) as Streamable HTTP endpoints, enabling a single Docker host to serve all Google services to any MCP client.
README
google-mcp-suite-network
A tiny TypeScript wrapper that takes google-mcp-suite
— five stdio MCP servers for Gmail, Calendar, Sheets, Docs, and Drive — and
exposes each one over the network as a Streamable HTTP MCP endpoint, so you
can run it once on a homelab/Docker host and point any MCP client at it.
MCP client ──HTTP──► this proxy ──stdio──► google-mcp-<service> ──► Google APIs
Each service is mounted at its own path:
| Service | Endpoint |
|---|---|
| Gmail | /gmail/mcp |
| Calendar | /calendar/mcp |
| Sheets | /sheets/mcp |
| Docs | /docs/mcp |
| Drive | /drive/mcp |
Plus GET /healthz for health checks and GET / for a service listing.
Every incoming HTTP session spawns its own child stdio server (identity in this suite is bound per process) and JSON-RPC messages are bridged transparently in both directions.
How it works
src/index.tsruns an Express server. On the MCPinitializerequest it spawns the matchinggoogle-mcp-<service>binary and wires its stdin/stdout to aStreamableHTTPServerTransport. The session id maps to that child for follow-up requests; closing either side tears down the other.- No tool logic is duplicated — the proxy forwards raw JSON-RPC, so every operation the suite ships is available unchanged.
Prerequisites: Google OAuth
google-mcp-suite needs a Google Cloud OAuth client (Desktop app type) and
per-account tokens stored in ~/.google-mcp/. It loads these at startup, so a
service endpoint only works once its account is authorized.
- In Google Cloud: create a project, enable the Gmail/Calendar/Sheets/Docs/Drive APIs, create a Desktop app OAuth client, and download the client secret.
- Save it as
client_secret.json.
Authorize an account (recommended: on your workstation)
The consent flow opens a browser and uses a loopback redirect, which is awkward
in a headless container. The simplest path is to authorize on a machine with a
browser, then ship the resulting ~/.google-mcp/ into the Docker volume.
# On your workstation (Node 22+):
npm i -g google-mcp-suite
mkdir -p ~/.google-mcp && cp client_secret.json ~/.google-mcp/
google-mcp-doctor scopes # see required APIs/scopes
google-mcp-doctor auth you@example.com # browser consent -> writes the token
google-mcp-doctor # verify every account is reachable
Then load the populated directory into the named volume used by compose:
docker volume create google-mcp-suite-docker_google-mcp-config
docker run --rm \
-v google-mcp-suite-docker_google-mcp-config:/dest \
-v "$HOME/.google-mcp:/src:ro" \
alpine sh -c 'cp -a /src/. /dest/'
The volume name is
<project-dir>_google-mcp-config. Confirm yours withdocker volume lsafter the firstdocker compose up.
Alternative: authorize inside the container
docker compose run --rm \
-v "$PWD/client_secret.json:/home/node/.google-mcp/client_secret.json:ro" \
google-mcp-suite google-mcp-doctor auth you@example.com
This writes the token into the persistent volume. If no browser is available, the doctor prints a URL to complete consent manually.
Run
cp .env.example .env # set GOOGLE_MCP_ACCOUNT and (recommended) AUTH_TOKEN
docker compose up -d --build
curl localhost:3000/healthz
Configuration
| Variable | Default | Purpose |
|---|---|---|
PORT |
3000 |
Published port. |
GOOGLE_MCP_ACCOUNT |
— | Account label/email bound to every service (must match doctor auth). |
<SERVICE>_ACCOUNT |
— | Per-service override, e.g. GMAIL_ACCOUNT, DRIVE_ACCOUNT. |
AUTH_TOKEN |
— | If set, every /<service>/mcp request needs Authorization: Bearer <token>. |
HOST |
0.0.0.0 |
Bind address. |
BODY_LIMIT |
50mb |
Max JSON body (Drive uploads ride inside JSON-RPC). |
Connect an MCP client
Point any Streamable-HTTP-capable MCP client at the per-service URL. Example
(.mcp.json style):
{
"mcpServers": {
"gmail": {
"type": "http",
"url": "http://your-homelab-host:3000/gmail/mcp",
"headers": { "Authorization": "Bearer YOUR_AUTH_TOKEN" }
},
"drive": {
"type": "http",
"url": "http://your-homelab-host:3000/drive/mcp",
"headers": { "Authorization": "Bearer YOUR_AUTH_TOKEN" }
}
}
}
Drop the headers block if you did not set AUTH_TOKEN.
Local development
npm install
npm run dev # tsx watch
npm run build # tsc -> dist/
npm start # node dist/index.js
Releases & Docker image
Released images are published to Docker Hub at
vantreeseba/google-mcp-suite.
Pull a pinned version (or latest) instead of building locally:
docker pull vantreeseba/google-mcp-suite:latest
To run the published image, set image: vantreeseba/google-mcp-suite:latest
in docker-compose.yml, remove the build: . line, and run
docker compose up -d (without --build).
Versioning is automated with semantic-release.
On every push to main, GitHub Actions analyzes the
Conventional Commits since the last
release and, when a release is warranted:
- bumps the version and updates
CHANGELOG.md, - creates the Git tag and GitHub release,
- builds and pushes
vantreeseba/google-mcp-suite:<version>and:latest.
Commit messages drive the version bump: fix: → patch, feat: → minor,
feat!:/BREAKING CHANGE: → major. Commits like chore:/docs: alone do not
trigger a release.
CI setup
The release workflow (.github/workflows/release.yml) requires two repository
secrets for Docker Hub auth (Settings → Secrets and variables → Actions):
DOCKERHUB_USERNAME— your Docker Hub username (vantreeseba).DOCKERHUB_TOKEN— a Docker Hub access token with Read & Write scope.
GITHUB_TOKEN is provided automatically by Actions.
Security notes
- Set
AUTH_TOKENwhenever the port is reachable beyondlocalhost. The bearer check is the only access control in front of full read/write access to your Google account. - Terminate TLS at a reverse proxy (Caddy / Traefik / nginx) if exposing it beyond your LAN.
- Tokens live only in the
google-mcp-configvolume; back it up accordingly.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。