Skip to main content

StackOne plugin for Google ADK: Connect agents to 200+ SaaS providers

Project description

stackone-adk

Google ADK plugin for connecting agents to 200+ SaaS providers via StackOne.

StackOne provides a unified API gateway for HRIS, ATS, CRM, scheduling, and more. This plugin dynamically discovers available tools from StackOne's API and exposes them as native Google ADK tools, no hardcoded tool definitions needed.

Installation

pip install stackone-adk

Or with uv:

uv add stackone-adk

Configuration

StackOne API Key

Get your API key from the StackOne Dashboard.

# Environment variable (recommended)
export STACKONE_API_KEY="your-stackone-api-key"

Or pass directly:

plugin = StackOnePlugin(api_key="your-stackone-api-key")

Google API Key

Get your API key from Google AI Studio. This key is required to access Google's Gemini models.

export GOOGLE_API_KEY="your-google-api-key"

Quick Start

In standard ADK, you define tools as Python functions:

# Standard ADK — manual tool functions
def get_current_time(city: str) -> dict:
    """Returns the current time in a specified city."""
    return {"status": "success", "city": city, "time": "10:30 AM"}

root_agent = Agent(
    model="gemini-2.5-flash",
    name="root_agent",
    tools=[get_current_time],
)

With StackOne, tools are discovered dynamically from your connected providers — no manual tool definitions needed:

import asyncio
from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.runners import InMemoryRunner
from stackone_adk import StackOnePlugin

async def main():
    # StackOne replaces manual tool functions
    plugin = StackOnePlugin()  # reads STACKONE_API_KEY from env

    agent = Agent(
        model="gemini-2.5-flash",
        name="calendly_agent",  # replace with your agent name
        instruction="You are a scheduling assistant with access to Calendly.",
        tools=plugin.get_tools(),  # instead of: tools=[get_current_time]
    )

    app = App(name="calendly_app", root_agent=agent, plugins=[plugin])

    async with InMemoryRunner(app=app) as runner:
        response = await runner.run_debug("What event types do I have?")
        print(response)

asyncio.run(main())

Usage Patterns

With App (Recommended)

from google.adk.apps import App
from google.adk.runners import InMemoryRunner

plugin = StackOnePlugin(providers=["calendly"])

agent = Agent(
    model="gemini-2.5-flash",
    name="calendly_agent",  # replace with your agent name
    tools=plugin.get_tools(),
)

app = App(name="calendly_app", root_agent=agent, plugins=[plugin])

async with InMemoryRunner(app=app) as runner:
    response = await runner.run_debug("List my events")

With Runner Directly

from google.adk.runners import InMemoryRunner

plugin = StackOnePlugin(providers=["calendly"])

agent = Agent(
    model="gemini-2.5-flash",
    name="calendly_agent",  # replace with your agent name
    tools=plugin.get_tools(),
)

async with InMemoryRunner(app_name="calendly_app", agent=agent) as runner:
    response = await runner.run_debug("List my events")

Plugin Configuration

Parameter Type Default Description
api_key str | None None StackOne API key. Falls back to STACKONE_API_KEY env var.
account_id str | None None Default account ID for all tools.
base_url str | None None API URL override (default: https://api.stackone.com).
plugin_name str "stackone_plugin" Plugin identifier for ADK.
providers list[str] | None None Filter by provider names.
actions list[str] | None None Filter by action patterns (supports globs).
account_ids list[str] | None None Scope tools to specific account IDs.

Tool Filtering

By Provider

Filter tools to specific SaaS providers:

# Single provider
plugin = StackOnePlugin(providers=["calendly"])

# Multiple providers
plugin = StackOnePlugin(providers=["hibob", "bamboohr"])

By Action Pattern

Use glob patterns to filter specific actions:

# Read-only operations
plugin = StackOnePlugin(actions=["*_list_*", "*_get_*"])

# Specific actions
plugin = StackOnePlugin(actions=["calendly_list_events", "calendly_get_event_*"])

By Account ID

Scope tools to specific connected accounts:

# Multiple accounts
plugin = StackOnePlugin(account_ids=["acct-hibob-1", "acct-bamboohr-1"])

Combining Filters

plugin = StackOnePlugin(
    providers=["hibob", "bamboohr"],
    actions=["*_list_*", "*_get_*"],
    account_ids=["acct-hibob-1", "acct-bamboohr-1"],
)

Available Tools

Unlike plugins with a fixed set of tools, StackOne tools are dynamically discovered from your connected providers via the StackOne API. The available tools depend on which SaaS providers you have connected in your StackOne Dashboard. Print discovered tools:

plugin = StackOnePlugin(providers=["calendly"])
for tool in plugin.get_tools():
    print(f"{tool.name}: {tool.description}")

Examples

See the examples/ directory:

Example Description
calendly_agent.py Calendly scheduling agent — single provider

Development

git clone https://github.com/StackOneHQ/stackone-adk-plugin.git
cd stackone-adk-plugin
pip install -e ".[dev]"

Run tests:

pytest

Lint and type check:

ruff check stackone_adk/ tests/
mypy stackone_adk/

Try an example (requires a Calendly account connected in your StackOne Dashboard):

export STACKONE_API_KEY="your-stackone-api-key"
export GOOGLE_API_KEY="your-google-api-key"
python examples/calendly_agent.py

License

Apache 2.0 — see LICENSE.

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stackone_adk-0.1.0.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stackone_adk-0.1.0-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file stackone_adk-0.1.0.tar.gz.

File metadata

  • Download URL: stackone_adk-0.1.0.tar.gz
  • Upload date:
  • Size: 12.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for stackone_adk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 41e6ab565b62cf1ffcd41a6b856d59380538041a54e3b1946d6e7e69b8f3368a
MD5 517837061c880fe424e35a52431c77e7
BLAKE2b-256 d7b2f0f23c31208a9f37892114e18d131283c858b1326e803d5380687d6acec3

See more details on using hashes here.

File details

Details for the file stackone_adk-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: stackone_adk-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for stackone_adk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0ccd9a2dc258ba6b9225bfbbd0afd743a3f47edef33b4c52a098a84e4698534c
MD5 9a55f9a0af15b33817ab82d9520b81f4
BLAKE2b-256 44e08d640fc4298774434d9a30596a6ebdf58cc59f3b3d06b4337b9f39f30932

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page