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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41e6ab565b62cf1ffcd41a6b856d59380538041a54e3b1946d6e7e69b8f3368a
|
|
| MD5 |
517837061c880fe424e35a52431c77e7
|
|
| BLAKE2b-256 |
d7b2f0f23c31208a9f37892114e18d131283c858b1326e803d5380687d6acec3
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ccd9a2dc258ba6b9225bfbbd0afd743a3f47edef33b4c52a098a84e4698534c
|
|
| MD5 |
9a55f9a0af15b33817ab82d9520b81f4
|
|
| BLAKE2b-256 |
44e08d640fc4298774434d9a30596a6ebdf58cc59f3b3d06b4337b9f39f30932
|