# Send gcal-oauth-bridge to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "gcal-oauth-bridge",
    "name": "gcal-oauth-bridge",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/DanielKillenberger/gcal-oauth-bridge",
    "canonicalUrl": "https://clawhub.ai/DanielKillenberger/gcal-oauth-bridge",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/gcal-oauth-bridge",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=gcal-oauth-bridge",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "_meta.json"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/gcal-oauth-bridge"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/gcal-oauth-bridge",
    "downloadUrl": "https://openagent3.xyz/downloads/gcal-oauth-bridge",
    "agentUrl": "https://openagent3.xyz/skills/gcal-oauth-bridge/agent",
    "manifestUrl": "https://openagent3.xyz/skills/gcal-oauth-bridge/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/gcal-oauth-bridge/agent.md"
  }
}
```
## Documentation

### Calendar Bridge Skill

Use 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

### What is Calendar Bridge?

A tiny Node.js/Express service running at http://localhost:3000 that:

Handles Google Calendar OAuth once via browser
Stores and auto-refreshes tokens (solves the "token expired every 7 days" problem)
Exposes a dead-simple REST API for events, calendars, and auth

### API Endpoints

EndpointDescriptionGET /healthService status + auth stateGET /auth/urlGet OAuth consent URLGET /events?days=7Upcoming events from primary calendarGET /events?days=7&calendar=allEvents from ALL calendarsGET /events?days=7&calendar=<id>Events from a specific calendarGET /calendarsList all available calendarsPOST /auth/refreshForce token refresh (normally automatic)

Events response includes: id, summary, start, end, location, description, htmlLink, status, calendarId, calendarSummary

### Checking Events

# 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

### 1. Clone and install

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

### 2. Get Google OAuth credentials

Go to https://console.cloud.google.com/apis/credentials
Create OAuth 2.0 Client ID (Desktop app)
Enable Google Calendar API
Add redirect URI: http://localhost:3000/auth/callback
Copy Client ID + Secret to .env

### 3. Start the service

node app.js
# or: npm start

### 4. Authorize (one-time browser flow)

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}

### 5. Keep it running (systemd)

systemctl --user enable calendar-bridge.service
systemctl --user start calendar-bridge.service

### Re-authentication

If tokens are ever revoked (rare — auto-refresh prevents expiry):

ssh -L 3000:localhost:3000 your-server
curl http://localhost:3000/auth/url → open URL → complete consent
Done — new tokens overwrite old ones

### Troubleshooting

{"error":"Not authenticated"} → Run the OAuth setup flow above
401 Unauthorized → CALENDAR_BRIDGE_API_KEY is set; add Authorization: Bearer <key> header
Can't reach localhost:3000 → Service not running; check systemctl --user status calendar-bridge
"invalid_grant" / "token expired" → Tokens were revoked externally; re-authenticate

### Personal Gmail Users

Works 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.

### Files

GitHub repo: https://github.com/DanielKillenberger/gcal-oauth-bridge
App: app.js — main Express server
Config: .env (from .env.example)
Tokens: tokens.json (auto-generated, gitignored, never committed)
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: DanielKillenberger
- Version: 1.0.3
## Source health
- Status: healthy
- Source download looks usable.
- Yavira can redirect you to the upstream package for this source.
- Health scope: source
- Reason: direct_download_ok
- Checked at: 2026-04-30T16:55:25.780Z
- Expires at: 2026-05-07T16:55:25.780Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/gcal-oauth-bridge)
- [Send to Agent page](https://openagent3.xyz/skills/gcal-oauth-bridge/agent)
- [JSON manifest](https://openagent3.xyz/skills/gcal-oauth-bridge/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/gcal-oauth-bridge/agent.md)
- [Download page](https://openagent3.xyz/downloads/gcal-oauth-bridge)