Package Layout
smithers.connector.json is the contract. package.json exposes the loader module as an ESM export, with a smithers.connector field pointing at the manifest:
Manifest Format
The manifest format id issmithers.connector.v1. Unknown top-level keys are ignored; unknown keys inside tools, triggers, auth, and surfaces must fail validation, so authors catch typos before an agent receives the tool catalog.
Loader Contract
A Smithers connector loader must:- validate the manifest before loading package code.
- resolve auth via the OAuth plane and token broker, never by handing durable credentials to an LLM-visible tool call.
- project tools from
surfaces.openapi,surfaces.mcp, or the package loader into AI SDK-compatible tools. - register triggers from
surfaces.webhookswith signature verification and dedupe before workflow dispatch. - enforce scopes for every tool and trigger invocation against the connected user and tenant.
- Preserve idempotency metadata so retries and resumes avoid duplicate write-side effects.
loadConnector function:
Tool Declarations
Each tool declaration describes one agent-callable capability, distinct from a raw endpoint. Keep the surface small and curated, with clear names and task-shaped descriptions. Required fields:
OpenAPI tools bind via
operationId, MCP tools via the upstream MCP tool name, custom tools to code returned by loadConnector.
Side-effecting tools must declare idempotency.required: true unless the upstream provider already supplies an idempotency key, request id, or natural unique key.
Trigger Declarations
Triggers describe external events that start or resume workflows: not workflow nodes, and shouldn’t grow into a provider-specific palette. Required fields:
Webhook triggers declare the provider signature scheme and payload mapper through
surfaces.webhooks; poll triggers declare interval bounds and cursor storage requirements in the manifest before registration.
Auth Requirements
Connector auth declarations are requirements, not secrets: the OAuth plane owns authorization-code + PKCE flows, encrypted refresh-token storage, single-flight refresh, and per-user/per-tenant scoping. Supported auth profiles:
Never put tokens, client secrets, refresh tokens, service-account credentials, or shared bot tokens in a connector package. Runtime calls receive scoped action tokens from the
tokenBroker; the broker exchanges or unwraps provider credentials outside the agent transcript.
Tier 0 Integration Points
Community connectors plug into these universal surfaces:Anti-Patterns
- Don’t add a node per app: connectors contribute agent tools and triggers, not a giant fixed-schema workflow palette.
- Don’t publish every OpenAPI operation as a tool: collapse noisy endpoint sets into task-shaped actions.
- Don’t bypass delegated OAuth with service-account or shared-bot tokens.
- Don’t refresh tokens independently per tool call; route refresh through the single-flight OAuth/token broker path.
- Don’t omit idempotency from write tools or webhook triggers.
- Don’t hide tool behavior in package code when the manifest can declare it.
Review Checklist
Before accepting a community connector, verify:- The manifest validates as
smithers.connector.v1. - Every tool has a clear description, auth profile, scope list, and side-effect marker.
- Every write tool has idempotency metadata.
- Every trigger has signature verification or polling cursor rules plus dedupe.
- OAuth scopes are the minimum needed for the declared tools and triggers.
- The package uses OpenAPI, MCP, webhook ingress, or the token broker instead of inventing a parallel integration plane.