Install
openclaw skills install tapauthOAuth token provider for OpenClaw agents — Google Calendar, Gmail, GitHub, Slack, Linear, Notion, Vercel, Sentry, Asana, Discord, or Apify. Integrates with OpenClaw's exec secrets provider so tokens are resolved at startup and held in memory — no shell commands or inline credentials needed at runtime. Configure once in openclaw.json, reference tokens via SecretRef.
openclaw skills install tapauthTapAuth provides OAuth tokens through OpenClaw's exec secrets provider. Tokens are resolved at gateway startup and held in memory — they never appear in shell commands or config files as plaintext.
You must NEVER use tapauth.sh --token directly in shell commands, curl calls, or $(...) substitutions. Tokens are always resolved through the secrets manager. Your job as an agent is to configure the secrets provider, not to fetch tokens yourself.
Follow these steps in order. Do not skip to step 3. Do not run --token yourself.
Run the script without --token to create a grant. Set TAPAUTH_HOME so the grant cache is stored in a stable location that the exec provider can also find:
TAPAUTH_HOME=/home/node/.tapauth /home/node/.openclaw/skills/tapauth/scripts/tapauth.sh <provider> <scopes>
Example for Google Calendar:
TAPAUTH_HOME=/home/node/.tapauth /home/node/.openclaw/skills/tapauth/scripts/tapauth.sh google calendar.readonly
Output:
Approve access: https://tapauth.ai/approve/abc123
Show this URL to the user. Once they approve, run with --token to get the bearer token.
Show the approval URL to the user and ask them to approve. Wait for them to confirm before proceeding.
That final line is the script's generic output. In OpenClaw, do not run --token yourself — proceed to step 2 and let the secrets manager invoke it.
After the user confirms they approved, edit ~/.openclaw/openclaw.json to add an exec provider under secrets.providers:
{
"secrets": {
"providers": {
"tapauth_google_calendar": {
"source": "exec",
"command": "/home/node/.openclaw/skills/tapauth/scripts/tapauth.sh",
"args": ["--token", "google", "calendar.readonly"],
"passEnv": ["HOME"],
"env": {"TAPAUTH_HOME": "/home/node/.tapauth"},
"jsonOnly": false
}
}
}
}
Key fields:
command: Absolute path to scripts/tapauth.sh in this skill directoryargs: ["--token", "<provider>", "<scopes>"] — must match the grant you created in step 1jsonOnly: false: The script outputs a raw token string, not JSONpassEnv: Must include HOMEenv.TAPAUTH_HOME: Must be /home/node/.tapauth — the same path used when creating the grant in step 1Use the naming convention tapauth_<provider> or tapauth_<provider>_<scope> for the provider key.
After editing openclaw.json, run:
openclaw secrets reload
This tells the gateway to re-resolve all secret providers. The exec provider runs tapauth.sh --token in the background and stores the result in the in-memory secrets snapshot.
Tell the user the setup is complete. The token is now resolved and will be available at every gateway startup. If the user repeats their request in a new session, the token will already be available.
If you need to verify immediately, run openclaw secrets reload and then retry the user's request through the normal OpenClaw secret path. Do not invoke tapauth.sh --token directly.
tapauth.sh --token directly. Do not use it in $(...), do not capture its output, do not pipe it to curl. The secrets manager runs it for you.command field in the exec provider config.| Provider | Args for exec provider | Scopes Reference |
|---|---|---|
| Google Calendar | ["--token", "google", "calendar.readonly"] | references/google.md |
| Google Drive | ["--token", "google", "drive.readonly"] | references/google.md |
| Google Sheets | ["--token", "google", "spreadsheets.readonly"] | references/google.md |
| Gmail | ["--token", "google", "gmail.send"] | references/gmail.md |
| GitHub | ["--token", "github", "repo"] | references/github.md |
| Vercel | ["--token", "vercel", "deployment"] | references/vercel.md |
| Notion | ["--token", "notion", "read_content"] | references/notion.md |
| Slack | ["--token", "slack", "users:read"] | references/slack.md |
| Asana | ["--token", "asana", "tasks:read"] | references/asana.md |
| Linear | ["--token", "linear", "read"] | references/linear.md |
| Sentry | ["--token", "sentry", "project:read"] | references/sentry.md |
| Discord | ["--token", "discord", "identify"] | references/discord.md |
| Apify | ["--token", "apify", "full_api_access"] | references/apify.md |
Multiple scopes: comma-separate in a single string, e.g. ["--token", "google", "calendar.readonly,drive.readonly"].
openclaw secrets reload.tapauth.sh caches tokens locally with expiry. Subsequent calls return instantly if valid.~/.tapauth/<provider>-<scopes>.env and re-run scripts/tapauth.sh to create a new grant.| Symptom | Cause | Fix |
|---|---|---|
token refresh failed | Grant revoked or expired | Delete ~/.tapauth/<provider>-<scopes>.env, re-run scripts/tapauth.sh |
| Token works locally but not in OpenClaw | passEnv missing HOME | Add HOME to passEnv array |
command must be absolute path | Relative path in command | Resolve scripts/tapauth.sh to its absolute path |
| Symlink error | Skill installed via symlink | Add allowSymlinkCommand: true and trustedDirs to provider config |
tapauth: timed out | Grant not pre-approved | Run scripts/tapauth.sh <provider> <scopes> without --token first |