Dome Systems

Google ADK agents and Dome

Keep your ADK agents. Govern every call they make.

ADK is built around Gemini. Through Dome, the same agent can think with Claude or GPT. Swap its model for a LiteLLM model pointed at the Broker and its tools for an MCP toolset on the Gateway. Sub-agents and the runner don't change, and a rule decides every call.

PeopleAgentsDomeTools & modelsCallersPeopleAgentscoordinatorAgentsresearcherAgentsnotifierGatewaysprod-gatewayGitHubMCP serverSlackMCP serverclaude-opus-5-5Model poolRulesGuardsAuditsaudit-trail
coordinator→claude-opus-5-5· as a.mensahAllowed

How Dome helps

Dome provides governance for every Google ADK tool and model call

Sub-agents stay as they are

Agents, instructions and the runner are unchanged. The model and the toolset change.

Any model, not only Gemini

ADK's LiteLLM wrapper talks to the Broker's OpenAI-compatible endpoint. The model name is a pool, so Claude, GPT and Gemini sit behind one setting.

Gemini and Claude in one trail

Whichever pool answers, the model call is recorded beside the agent's tool calls, against the person it acted for.

Get started

Google ADK on Dome in two changes

Two edits to the agent's constructor: a LiteLlm model with the Broker as api_base, and an McpToolset on the Gateway.

  1. 01

    Install the packages

    ADK with its MCP extra, and LiteLLM for non-Gemini endpoints. Python 3.10 or later.

    $ pip install "google-adk[mcp]" litellm
  2. 02

    Load tools from the Gateway

    McpToolset connects over streamable HTTP and lists the tools this agent is granted, schemas included.

    from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
     
    dome = McpToolset(connection_params=StreamableHTTPConnectionParams(
    url=f"{GATEWAY_URL}/mcp",
    headers={"Authorization": f"Bearer {DOME_AGENT_KEY}"},
    ))
  3. 03

    Call models through the Broker

    LiteLLM's OpenAI route with the Gateway as its base. The model name is a pool.

    from google.adk.models.lite_llm import LiteLlm
     
    model = LiteLlm(
    model="openai/claude-opus-5-5",
    api_base=f"{GATEWAY_URL}/v1",
    api_key=DOME_AGENT_KEY,
    )

Commands and rules tested against a Dome workspace on October 1, 2026. For anything about Google ADK itself, see Google's documentation.

Example agents

One agent, end to end

An ADK LlmAgent that runs Claude Opus through LiteLlm and takes its tools from a McpToolset on the Gateway. No Google or Anthropic key in the code.

researcher

Answer questions about the code

InMemoryRunner drives the agent through the repositories. The Gateway decides each tool call, and the Broker sends each model call to a provider that answers.

import asyncio
 
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.runners import InMemoryRunner
from google.adk.tools.mcp_tool import McpToolset, StreamableHTTPConnectionParams
from google.genai import types
 
researcher = LlmAgent(
name="researcher",
instruction="Answer questions about the code. Search before you answer.",
# Model: a pool on the Broker, through the OpenAI-compatible endpoint
model=LiteLlm(
model="openai/claude-opus-5-5",
api_base=f"{GATEWAY_URL}/v1",
api_key=DOME_AGENT_KEY,
),
# Tools: whatever this agent is granted on the Gateway
tools=[McpToolset(connection_params=StreamableHTTPConnectionParams(
url=f"{GATEWAY_URL}/mcp",
headers={"Authorization": f"Bearer {DOME_AGENT_KEY}"},
))],
)
 
 
async def main():
runner = InMemoryRunner(agent=researcher, app_name="researcher")
session = await runner.session_service.create_session(app_name="researcher", user_id="k.brandt")
question = types.Content(role="user", parts=[types.Part(text="Where is rate limiting handled?")])
async for event in runner.run_async(user_id="k.brandt", session_id=session.id, new_message=question):
if event.is_final_response() and event.content:
print(event.content.parts[0].text)
 
 
asyncio.run(main())

Agent workflow

Bringing it together

Connecting Google ADK agents to tools, models, and identity in Dome completes a governed agent application.

Dome

Agent

Runtime

Google ADK

This page

Control point

Gateway

  • Rules
  • Guards
  • Quotas

Every call decided and audited

FAQ

Common questions

Can Google ADK use models other than Gemini?

Yes. Wrap the model in LiteLlm with openai/ plus a pool name and the Gateway's /v1 endpoint as api_base.

How do I connect Google ADK to a remote MCP server?

Use McpToolset with StreamableHTTPConnectionParams, the Gateway's /mcp URL, and the Dome key as a bearer token. Install google-adk with its mcp extra.

What does an ADK agent see when Dome refuses a call?

A 403 with the reason, from the Gateway. The call never reaches the model or the tool.

Next steps

Talk with our FDE team

Our forward deployed engineers work with your platform team to get your agents into production and under control: the first one governed on your own systems, and a pattern your teams can repeat for every agent after it.