Concepts
Plugins
Connected services Harbor knows how to inspect and execute.
A plugin is a connected service Harbor knows how to talk to. Inside a workspace, an installed plugin is usually called a source. Runtime code calls tools through the source namespace returned by inspect.
Source fields
- Namespace: the runtime binding used from
hrbr execor Functions. - Kind: MCP, API, CLI, or GraphQL.
- State: ready, requires OAuth, needs credentials, no tools, or not installed.
- Tools: discovered callable operations with input/output schemas and examples.
Source states
| State | Meaning | Correct next step |
|---|---|---|
| ready | Auth complete, tools indexed | Execute tools from runtime code. |
| requires_oauth | OAuth not completed | Start OAuth from dashboard or hrbr.sources.oauthStart. |
| needs_credentials | Required secret missing | Add credentials through dashboard or SDK/admin flows. |
| no_tools | Auth completed but no tools indexed | Refresh or inspect in dashboard. |
| not_installed | Catalog entry not installed | Install from dashboard or SDK/admin flows. |
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" })'The public CLI does not expose a separate plugin subcommand family. Plugin lifecycle is dashboard or SDK/admin flow; CLI discovery goes through hrbr inspect.
Tool discovery
hrbr inspect 'return await hrbr.tools.search({ query: "create a linear issue", limit: 5 })'Use the returned js_var, js_name, callable example, and type details when writing hrbr exec code.
hrbr exec 'return await linearMcp.listIssues({ limit: 3 })'Credentials never leave Harbor. Runtime code sees tool outputs, not OAuth tokens or API keys.