Connector
A connector implements one of five capability interfaces: payment, storage, notification, auth-provider, or mailbox. Once approved, every Vincia site that needs that capability can install your connector. The flag value auth-provider is what the CLI expects; on the marketplace and in user-facing copy, the capability is called sign-in.
Files in a connector
manifest.json— declaresid,version,capability,scopes,capssrc/index.ts— exports the defaultdefineConnector<I>(...)calltests/— unit tests using@vincia/sdk/testing
A minimal payment connector
import { defineConnector } from '@vincia/sdk/connector';
import type { PaymentProvider } from '@vincia/sdk/connector';
export default defineConnector<PaymentProvider>({
id: 'my-payment',
capability: 'payment',
version: '0.1.0',
implementation: {
async charge(ctx, params) {
const res = await ctx.outbound.fetch('https://api.example.com/charge', {
method: 'POST',
body: JSON.stringify(params),
});
return await res.json();
},
async refund(ctx, params) {
// ...
},
},
});
Manifest
{
"id": "my-payment",
"version": "0.1.0",
"tier": "T1",
"capability": "payment",
"scopes_required": ["outbound.fetch:api.example.com"],
"resource_budget": { "cpu_ms": 5000, "memory_mb": 64 }
}
The manifest is your declaration of intent — what scopes you need, what caps you'll respect. The LLM gate verifies your code actually stays inside them.
Develop and publish
vincia test
vincia dev
vincia publish --dry-run
vincia publish
What gets reviewed
- Stays inside declared scopes (no unrelated outbound calls)
- Honors resource caps (no infinite loops, no memory bloat)
- Capability interface fully implemented (every required method)
- Secret handling correct (no logging of credentials, no storing in plain storage)
Next
- API reference for the full
PaymentProvider/StorageProvider/ etc. types - Cookbook for working patterns (webhook reconciliation, idempotency keys)