Union Street /

Union Street

The Multi-Agent System

Profiles, managers, direct reports, scoped tools, memory, schedules, delegation, and OIDC identity — deployable on your laptop or airgapped VPC.

UnionStreetAI/unionstreetPre-alphaMIT

Install in one command

install
curl -fsSL https://unionstreet.ai/install.sh | bash

us doctor · us fleet validate fleet.yaml · us tui

The missing control layer for agent work

Every agent tool is becoming its own little worker. Union Street is the layer that names them, routes work between them, grants tools per agent, records what happened, and keeps the whole thing runnable anywhere.

Bring

  • Claude Code and Codex-style coding agents
  • Hermes, OpenClaw, and Pi-style workers
  • MCP tools with per-agent auth
  • Your own scripts behind the runtime API

Profiles

Agents become addressable

Each agent gets a name, role, model chain, manager, direct reports, tools, memory, runtime, and schedule.

OIDC

Agents become principals

Subject, issuer, audience, roles, groups. Tool grants and audit attach to the agent doing the work.

Lash

Agents can hand off work

Wake a peer, delegate through the org chart, and collect structured reports without hiding the handoff.

Runtime

Everything is drivable

Prompt agents, stream events, receive webhooks, and plan fleet changes from CLI, HTTP, or SDK.

OIDC for agents

Union Street treats an agent like a workload identity, not a prompt string. A profile can mint and verify OIDC-shaped claims, map external IdP groups, and fail closed when a principal is disabled.

That means MCP auth, runtime secrets, peer visibility, memory, usage, and audit all have something real to hang from: the agent principal.

# agent pack (excerpt)
oidc:
  issuer: urn:union-street:demo-enterprise
  subject: agent:vp-eng
  audiences:
    - union-street:runtime
lash:
  delegate: direct_reports
  report: manager

Play with the runtime

import { UnionStreetClient } from "@unionstreet/us/sdk";

const client = new UnionStreetClient({
  baseUrl: "http:">//127.0.0.1:8787",
  token: process.env.US_RUNTIME_BEARER_TOKEN,
});

const health = await client.health();
const snapshot = await client.snapshot();
const result = await client.sendAgentPrompt("coo", {
  prompt: "Summarize open scheduler runs and any blocked delegates.",
});