Install
openclaw skills install gcal-oauth-bridgeInteract with the Calendar Bridge — a self-hosted Node.js service that provides a persistent REST API for Google Calendar events. Handles OAuth token auto-re...
openclaw skills install gcal-oauth-bridgeUse this skill to interact with the Calendar Bridge service — a local REST API that wraps Google Calendar OAuth with persistent token storage and auto-refresh.
GitHub: https://github.com/DanielKillenberger/gcal-oauth-bridge
A tiny Node.js/Express service running at http://localhost:3000 that:
| Endpoint | Description |
|---|---|
GET /health | Service status + auth state |
GET /auth/url | Get OAuth consent URL |
GET /events?days=7 | Upcoming events from primary calendar |
GET /events?days=7&calendar=all | Events from ALL calendars |
GET /events?days=7&calendar=<id> | Events from a specific calendar |
GET /calendars | List all available calendars |
POST /auth/refresh | Force token refresh (normally automatic) |
Events response includes: id, summary, start, end, location, description, htmlLink, status, calendarId, calendarSummary
# Quick event check (7 days, primary calendar)
curl http://localhost:3000/events
# All calendars, next 14 days
curl http://localhost:3000/events?days=14&calendar=all
# With API key (if CALENDAR_BRIDGE_API_KEY is configured)
curl -H "Authorization: Bearer $API_KEY" http://localhost:3000/events?calendar=all
To call from OpenClaw/skill context (no API key needed when running on same host):
GET http://localhost:3000/events?calendar=all&days=7
git clone https://github.com/DanielKillenberger/gcal-oauth-bridge.git
cd gcal-oauth-bridge
npm install
cp .env.example .env
# Edit .env with GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET
http://localhost:3000/auth/callback.envnode app.js
# or: npm start
If on a remote VPS, first tunnel port 3000:
# From your local machine:
ssh -L 3000:localhost:3000 your-server
Then:
curl http://localhost:3000/auth/url
# Open the returned URL in your browser
# Complete Google consent → tokens saved automatically
Verify:
curl http://localhost:3000/health
# {"status":"ok","authenticated":true,"needsRefresh":false}
systemctl --user enable calendar-bridge.service
systemctl --user start calendar-bridge.service
If tokens are ever revoked (rare — auto-refresh prevents expiry):
ssh -L 3000:localhost:3000 your-servercurl http://localhost:3000/auth/url → open URL → complete consent{"error":"Not authenticated"} → Run the OAuth setup flow above401 Unauthorized → CALENDAR_BRIDGE_API_KEY is set; add Authorization: Bearer <key> headersystemctl --user status calendar-bridgeWorks with personal Gmail. Google shows an "unverified app" warning — click Advanced → Go to [app] to proceed. Tokens are stored locally on your server, not shared with anyone.
app.js — main Express server.env (from .env.example)tokens.json (auto-generated, gitignored, never committed)