HarborHarbor
DocumentationGuidesPlugins

Plugins

Connected services Harbor can inspect and execute through real CLI and SDK surfaces.

A plugin is a connected service Harbor knows how to talk to: Linear, GitHub, Sentry, Slack, Notion, Postgres, Stripe, Cloudflare, your own MCP server, and many others. In the runtime and API this installed workspace connection is usually called a source.

Real CLI surface

The public CLI does not have separate plugin or tool subcommands. Use the dashboard for guided install/connect flows, and use hrbr inspect for source readiness and tool discovery.

hrbr inspect 'return await hrbr.sources.list()'
hrbr inspect 'return await hrbr.sources.search({ query: "linear" })'
hrbr inspect 'return await hrbr.sources.oauthStart({ namespace: "linear-mcp" })'
hrbr inspect 'return await hrbr.tools.search({ query: "file a linear issue", limit: 5 })'

Use hrbr exec only after discovery, when you know the exact runtime namespace and tool call shape.

hrbr exec 'return await linearMcp.listIssues({ limit: 3 })'

Plugin kinds

KindWhat it isExamples
MCPModel Context Protocol serverLinear, Notion, Sentry, Stripe, Slack
APIDirect REST integrationResend, Twilio, Open-Meteo, GitHub REST
CLILocal CLI bridged through Sand when availablegit, gh, wrangler, aws, modal
GraphQLGraphQL endpoint adapterLinear GraphQL, GitHub GraphQL

Source states

StateMeaningNext step
readyAuth complete, tools indexedExecute tools from hrbr exec, Functions, Apps, or SDK clients.
requires_oauthOAuth not completedStart OAuth from dashboard or hrbr.sources.oauthStart.
needs_credentialsRequired secret missingAdd credentials in the dashboard or through SDK/admin flows.
no_toolsAuth completed but no tools indexedRefresh or inspect the source in the dashboard.
not_installedCatalog entry is not installedInstall from the dashboard or SDK/admin flows.

Only ready sources are callable from runtime code. If inspect reports setup state, treat it as configuration work, not as a runtime failure.

Tools

A tool is a discoverable function exposed by a source. Search before invoking so your code uses the returned js_var, js_name, callable example, and type details.

hrbr inspect 'return await hrbr.tools.search({ query: "create a linear issue", limit: 5 })'

Tool budgets are precious. Load the smallest shape you need, then execute the exact call.