Home / Docs / Integrations

Integrations

Zubo integrates with popular services via pre-built skill packs. Each integration installs one or more skills and can be connected using API keys or OAuth 2.0 authentication. You can connect integrations via chat, the dashboard, or the connect_service tool. For supported providers, OAuth is the recommended approach — it is more secure, easier to manage, and handles token refresh automatically.

Copy-Paste Task Cards

Secure API Access

Enable API auth and create a key before exposing ports beyond localhost.

zubo config set auth.enabled true
zubo auth create-key my-app

Set Local Model Fallback

Keep responses available during provider outages or API quota issues.

zubo config set failover '["openai","ollama"]'
zubo config set providers.ollama.model llama3.3

Common Errors

401 Unauthorized / Missing Bearer token

If auth.enabled is true, all /api/* calls require Authorization: Bearer <key>. Create a new key if needed.

curl -H "Authorization: Bearer YOUR_KEY" http://localhost:3000/api/dashboard/status
Provider Timeout / Upstream unavailable

Use failover and switch temporarily to a responsive provider or smaller model. Check logs for repeated timeout patterns.

zubo model openai/gpt-4o-mini
zubo logs --follow
Missing local model (Ollama/LM Studio)

If local providers fail, ensure the runtime is running and a model is installed.

ollama serve
ollama pull llama3.3

Connecting an Integration

There are three ways to connect a service:

  1. Chat: Tell Zubo directly — for example, "Connect GitHub with token ghp_abc123". Zubo will store the secret and install the skill pack automatically.
  2. Dashboard: Navigate to Settings → API Keys. Enter the secret name and value, then Zubo detects the associated integration and installs the skills.
  3. CLI: Run zubo start, then use the connect_service tool programmatically to provide the credentials.

When you connect a service, Zubo performs the following steps:

  1. Stores the API key as a secret in the local database
  2. Installs the relevant skill pack for that service
  3. Makes all integration tools available immediately (hot-loaded — no restart required)

GitHub

FieldDetails
Secret Namegithub_token
Token TypePersonal Access Token (classic)
Required Scopesrepo, read:user

Getting a Token

  1. Go to github.com/settings/tokens
  2. Click “Generate new token (classic)”
  3. Select the repo and read:user scopes
  4. Copy the generated token

Skills Installed

Example

"Connect GitHub with token ghp_abc123xyz"

After connecting, try: "List my GitHub repos" or "Show open issues on myorg/myrepo"

Google

FieldDetails
Secret Namegoogle_api_key
Token TypeAPI Key or OAuth credentials
Required APIsGmail API, Calendar API, Sheets API, Docs API, Drive API

Getting a Key

  1. Go to console.cloud.google.com
  2. Create a new project (or select an existing one)
  3. Navigate to APIs & Services → Library and enable the Gmail, Calendar, Sheets, Docs, and Drive APIs
  4. Go to APIs & Services → Credentials
  5. Create an API key or OAuth 2.0 client credentials

Skills Installed

Notion

FieldDetails
Secret Namenotion_token
Token TypeInternal Integration Token

Getting a Token

  1. Go to notion.so/my-integrations
  2. Click “New integration”
  3. Give it a name and select the workspace
  4. Copy the Internal Integration Token
  5. Important: Share the databases and pages you want Zubo to access with the integration inside Notion (click “Share” on the page and add the integration)

Skills Installed

Linear

FieldDetails
Secret Namelinear_token
Token TypePersonal API Key

Getting a Key

  1. Open Linear and go to Settings → API → Personal API Keys
  2. Click “Create key”
  3. Copy the generated key

Skills Installed

Jira

FieldDetails
Secret Namesjira_token, jira_email, jira_url
Token TypeAtlassian API Token

Jira requires three secrets: your API token, the email address associated with your Atlassian account, and your Jira URL (e.g., https://yourcompany.atlassian.net).

Getting a Token

  1. Go to id.atlassian.com/manage-profile/security/api-tokens
  2. Click “Create API token”
  3. Copy the token
  4. Store all three secrets:
    "Store my jira_token: atl_abc123..."
    "Store my jira_email: you@company.com"
    "Store my jira_url: https://yourcompany.atlassian.net"

Skills Installed

Slack (Integration)

FieldDetails
Secret Nameslack_token
Token TypeBot User OAuth Token

The Slack integration allows Zubo to proactively send messages to Slack channels and read channel history. This is used for the agent to interact with Slack on your behalf.

Note: This is different from the Slack channel (configured in Channel Setup), which lets users send messages to Zubo via Slack. The integration allows the agent to proactively interact with Slack channels — sending messages, reading history, and responding to events.

Skills Installed

Twitter / X

FieldDetails
Secret Nametwitter_bearer_token
Token TypeAPI v2 Bearer Token

Getting a Token

  1. Go to developer.twitter.com
  2. Create a project and app
  3. Navigate to Keys and Tokens
  4. Generate a Bearer Token

Skills Installed

Note: The twitter_posts tool has confirm permission level — the agent will always describe the tweet and ask for your explicit approval before posting. This cannot be bypassed.

Claude Code

FieldDetails
Secret Nameanthropic_api_key (if using as LLM provider)
RequirementClaude Code CLI installed (npm i -g @anthropic-ai/claude-code)
ModesTask delegation, LLM provider, MCP server

Zubo integrates with Claude Code in three ways:

  1. Task delegation: Zubo can delegate coding tasks to Claude Code CLI. The agent spawns a Claude Code session, passes the task, and collects the result.
  2. LLM provider: Use Claude Code as the underlying LLM provider for Zubo's agent loop, leveraging Claude's tool-use capabilities.
  3. MCP server mode: Run Zubo as an MCP server (zubo mcp-serve) so Claude Code can access Zubo's tools — memory, knowledge graph, integrations, scheduling, and more — as MCP tools.

Setup

  1. Install Claude Code CLI: npm i -g @anthropic-ai/claude-code
  2. Ensure your ANTHROPIC_API_KEY environment variable is set, or store it as a Zubo secret: "Store my anthropic_api_key: sk-ant-..."

Using as MCP Server

To let Claude Code use Zubo's tools, start Zubo in MCP server mode and add it to your Claude Code configuration:

# Start Zubo as an MCP server
zubo mcp-serve

Then add Zubo to your Claude Code MCP config (~/.claude/claude_desktop_config.json):

{
  "mcpServers": {
    "zubo": {
      "command": "zubo",
      "args": ["mcp-serve"]
    }
  }
}

Claude Code will then have access to Zubo's memory search, knowledge graph, integrations, scheduling, and all other tools.

Example

"Use Claude Code to refactor the auth module in ~/projects/myapp"

Zubo delegates the task to Claude Code, which performs the refactoring and returns the result.

MCP Server Mode

Zubo can run as an MCP (Model Context Protocol) server, exposing all of its tools to any MCP-compatible client. This means Claude Code or any other MCP client can use Zubo's memory, knowledge graph, integrations, scheduling, and other tools natively.

Start the MCP server with:

zubo mcp-serve

The server communicates over stdio using JSON-RPC, following the MCP specification. It exposes Zubo's full tool catalog to the connected client. See the CLI reference for flags and options.

Exposed Tools

When running as an MCP server, Zubo exposes all built-in tools and installed skill tools, including:

This lets you use Zubo as a shared intelligence layer — Claude Code can search your memory, check your calendar, create GitHub issues, or query your knowledge graph, all through MCP.

Integration Summary

Service Secret Name Skills Notes
GitHub github_token repos, issues, prs PAT with repo scope
Google google_api_key gmail, calendar, sheets, docs, drive Enable APIs in Cloud Console
Notion notion_token databases, pages, search Share pages with integration
Linear linear_token issues, projects Personal API key
Jira jira_token + jira_email + jira_url issues, boards Atlassian API token
Slack slack_token messages For proactive messages
Twitter twitter_bearer_token posts Requires confirmation
Claude Code anthropic_api_key task delegation, MCP server Requires Claude Code CLI

Managing API Keys

All integration secrets are managed through the same unified secret system.

Dashboard

Chat

You can also manage secrets conversationally:

"List my secrets"
"Delete the github_token secret"
"Update my notion_token to ntn_newvalue123"

OAuth Authentication

In addition to raw API keys, Zubo supports OAuth 2.0 for connecting to services securely. OAuth is the standard authorization protocol used by Google, GitHub, Notion, Linear, and Slack. Instead of pasting long-lived API keys, OAuth lets you authenticate through the provider's own login page. Zubo receives short-lived access tokens and refresh tokens, automatically refreshing them when they expire — so your connections stay alive without manual intervention.

Why OAuth?

Supported OAuth Providers

Provider Services Default Scopes
Google Gmail, Calendar, Sheets, Docs, Drive gmail.readonly, calendar.events, spreadsheets, drive.readonly
GitHub Repos, Issues, Pull Requests, Code Search repo, read:user
Notion Pages, Databases, Blocks Full workspace access (Notion uses a single scope)
Linear Issues, Projects, Teams read, write
Slack Channels, Messages, Users channels:read, chat:write, users:read

Setting Up OAuth

OAuth requires a one-time setup where you register an OAuth app with each provider. This gives you a clientId and clientSecret pair that Zubo uses to initiate the authorization flow.

Step 1: Create an OAuth App with the Provider

Each provider has its own developer console for creating OAuth apps:

Step 2: Add Credentials to config.json

Add the clientId and clientSecret for each provider you want to use to your ~/.zubo/config.json:

{
  "oauth": {
    "providers": {
      "google": {
        "clientId": "YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com",
        "clientSecret": "YOUR_GOOGLE_CLIENT_SECRET"
      },
      "github": {
        "clientId": "YOUR_GITHUB_CLIENT_ID",
        "clientSecret": "YOUR_GITHUB_CLIENT_SECRET"
      },
      "notion": {
        "clientId": "YOUR_NOTION_CLIENT_ID",
        "clientSecret": "YOUR_NOTION_CLIENT_SECRET"
      },
      "linear": {
        "clientId": "YOUR_LINEAR_CLIENT_ID",
        "clientSecret": "YOUR_LINEAR_CLIENT_SECRET"
      },
      "slack": {
        "clientId": "YOUR_SLACK_CLIENT_ID",
        "clientSecret": "YOUR_SLACK_CLIENT_SECRET"
      }
    }
  }
}

You only need to add the providers you plan to use. Providers without credentials are simply skipped.

Step 3: Connect via Dashboard or Chat

Once credentials are configured, connect in one of two ways:

Automatic Token Refresh

OAuth access tokens are short-lived (typically 1 hour for Google, longer for others). When Zubo detects an expired token, it automatically uses the stored refresh token to obtain a new access token. This happens transparently — you never see an error or get asked to re-authenticate. If a refresh token is revoked or expires (rare), Zubo will notify you and prompt you to re-connect through the dashboard.

Graceful Fallback

OAuth and API keys work side-by-side. If you have both an OAuth token and an API key for the same provider, Zubo prefers the OAuth token. If no OAuth token is available, Zubo falls back to the API key automatically. This means you can adopt OAuth incrementally — start with API keys and upgrade providers to OAuth one at a time without breaking anything.

Dashboard UI

The OAuth Connections panel in the dashboard (Settings → OAuth Connections) shows:

The oauth_manage Tool

Zubo includes a built-in oauth_manage tool that the agent uses to manage OAuth connections programmatically. You can interact with it through natural conversation:

The tool supports four actions: list, connect, disconnect, and status. All token storage and refresh logic is handled internally.

Best Practices