Why Harbor
Models change. The context layer should not.
Most "agent + tools" stacks force a choice:
- Hardcode provider clients into your agent code — fragile, no audit trail, credentials sprayed across machines.
- Adopt a hosted black-box that owns your workspace, your identity, and your context — fast to start, painful to leave.
Harbor is built around a third option: a shared workspace that owns the connections, captures the runs, and exposes a small, stable surface to any agent — without locking your data or your agents into one vendor.
Without Harbor / With Harbor
| Without Harbor | With Harbor | |
|---|---|---|
| Credentials | Copied into every agent + every machine | Vaulted once per workspace |
| Setup | Each agent re-implements OAuth, API clients, retries | Any approved agent acts immediately |
| State | Lost when the chat ends | Workspace memory, durable jobs |
| Tool selection | Agent guesses from a name + description | Tools are routed, scoped, searched |
| Failures | Become more prompting | Become traceable runs |
| Audit | "Who ran this?" — nobody knows | Every run, every tool call, every artifact |
| Team | Each engineer reconnects everything | Shared workspace |
The 30-second case
// Without Harbor — agent makes 4 round-trips, each with model overhead
const issue = await sentry.getIssue({ id });
const owner = await github.searchCode({ query: issue.culprit });
const ticket = await linear.createIssue({ title: issue.title, ... });
await slack.postMessage({ channel: '#incidents', text: ticket.url });
// With Harbor — one exec, all calls run in a cloud isolate with bound
// plugin namespaces, returns one TOON-formatted result
await hrbr.exec(`
const issue = await sentry.getIssue({ id: input.id });
const owner = await github.searchCode({ query: issue.culprit });
const ticket = await linear.createIssue({ title: issue.title });
await slack.postMessage({ channel: '#incidents', text: ticket.url });
return { ticket: ticket.url, owner: owner[0]?.path };
`);Same logic, one round-trip, traced end-to-end, retried with backoff if you
add step.* calls.
Who it's for
AI agent builders
You're tired of teaching every model how to authenticate against Linear / GitHub / Sentry / Notion. Harbor does the connection layer once.
Engineering teams
You want shared, audited tool access for the team — not credentials
in someone's .env.
Power users of Claude Code / Cursor / Codex
Your IDE agent can now act in your workspace tools through one MCP connection.
Self-hosters
You want the same primitives on your own machine — @hrbr/client,
@hrbr/sdk, Python harbor-sdk, Local Harbor, and Cliff are
open-source.
Continue → Quickstart or How it's built.