You've already built a Glean agent. A2A (Agent2Agent) lets any A2A-compliant client — not just Glean's own UI — discover and run it, multi-turn and streamed, with Glean's permissions still enforced.
Scaffold the project
npx -y tiged@2.12.8 --mode=git gleanwork/glean-cookbook/recipes/a2a-client a2a-clientSet credentials
Use the shipped login flow, then set GLEAN_AGENT_ID and GLEAN_DEMO_QUERY from the answers already supplied. Never implement authentication.
cd a2a-client && node scripts/glean-auth.mjs login --scopes agents --email "<work-email>"Run it
Dependencies are declared inline (PEP 723) and locked, so uv installs them into an isolated environment on first run — no requirements.txt, venv, or activate step.
cd a2a-client && uv run main.pyVerify
Use the question supplied up front. Confirm a real answer, a follow-up reusing the same context_id to prove multi-turn, and a streaming response — all three paths this recipe exercises.
- Handle the
Task-based response shape explicitly if your agent uses tool calls that return structured artifacts, not just text. - Watch for the
a2a-sdk1.x upgrade path once Glean's server moves past spec 0.3 — the pinning caveat in this recipe is temporary. - Combine with connect-mcp-hosts to compare calling the same agent via MCP vs. A2A.
Who owns our most critical service?
The agent returns a non-empty answer via the A2A message/send response (a Message or Task, not an error), the scripted follow-up carries the same context_id proving multi-turn works, and the streamed turn prints its answer once rather than repeating it per event.
Each of these was run against a live Glean instance on 2026-08-02.