Guides
Integrations
Connect Gmail, Slack, GitHub and more, or add your own API or MCP server with defineIntegration.
Connect an account or API, then grant agents only the actions they need. Integrations keep credentials encrypted and can require approval for writes.
Connecting Built-in Providers
The catalog includes Gmail, Google Calendar, Google Drive, Slack, GitHub, Linear, Notion, HubSpot,
Stripe, Shopify, Vercel, and hosted MCP servers. At /dashboard/integrations, connect an account
for yourself or the workspace, then grant actions. Agents can call granted actions as tools.
- Credentials are encrypted with
AGENTIC_ENCRYPTION_KEYand stay on the server. Agents supply path values,body, andquery, never a URL or a token. - Actions marked
approval: truewait for a person, with the exact request shown. - Webhooks from providers are verified and become automation events.
Registering OAuth Apps
Register an OAuth app with each provider you use. Set its client ID and secret as
AGENTIC_<PROVIDER>_CLIENT_ID and AGENTIC_<PROVIDER>_CLIENT_SECRET. For Google, for example,
set AGENTIC_GOOGLE_CLIENT_ID and AGENTIC_GOOGLE_CLIENT_SECRET.
Set the callback URL to <your app URL>/api/agentic/oauth/<provider>/callback. Some providers
also accept API tokens before you configure OAuth. See the environment variable
reference for provider-specific settings.
Adding Your Own API
Files in server/integrations (Nuxt), or integrations passed to defineVoidAgentic (Void),
appear next to the built-in catalog. The starters include Resend, with approval on every email:
export default defineIntegration({
id: 'resend',
name: 'Resend',
category: 'Communication',
logo: 'i-lucide-send',
description: 'Send transactional email from your verified Resend domains.',
details:
'Connect a full-access Resend API key. Agents can list your sending domains and send email after a person approves each message.',
auth: { apiKey: true },
ownership: ['workspace'],
fields: [{ key: 'token', label: 'API key', secret: true, placeholder: 're_…' }],
api: {
baseUrl: 'https://api.resend.com',
verify: { path: '/domains' },
},
actions: [
{ id: 'list_domains', label: 'List sending domains', path: '/domains', query: false },
{
id: 'send_email',
label: 'Send an email',
description: 'Send one email from a verified domain. A person approves every message.',
method: 'POST',
path: '/emails',
approval: true,
query: false,
body: {
type: 'object',
properties: {
from: { type: 'string', description: 'Sender, such as "Acme <team@acme.com>".' },
to: { type: 'array', items: { type: 'string' }, maxItems: 50 },
subject: { type: 'string' },
text: { type: 'string', description: 'Plain-text body.' },
},
required: ['from', 'to', 'subject', 'text'],
additionalProperties: false,
},
transform: ({ from, to, subject, text }) => ({ from, to, subject, text }),
},
],
})
Once a workspace connects Resend and grants the actions, agents see them as
resend_list_domains and resend_send_email. Integration ids are lowercase letters, digits, and
hyphens; action ids are lowercase letters, digits, and underscores.
| Option | Description |
|---|---|
auth | { apiKey: true }, { oauth: { provider, scopes } }, or { mcp: { server } } |
ownership | Who owns a connection: ['workspace'], ['user'], or both (the default) |
fields | What the connect form asks for; secret: true fields are encrypted |
details | The longer text on the connection panel; defaults to description |
api | baseUrl, verify, rejects, and authorization, headers, or prepare for other schemes |
actions | id, label, description, method, path, query, body, approval, transform, run |
events | Events delivered to each connection's signed webhook endpoint, usable as automation triggers |
Actions send Authorization: Bearer <token> by default. Use {name} in a path to insert a value
from the agent's input or connection fields. Use transform to limit which fields an agent can
change. For custom request logic, provide run(input, client); other options include
parameters, optional, defaults, form, and graphql.
Connecting Remote MCP Servers
Set auth.mcp.server to connect a fixed remote MCP server, or omit it to let users enter a URL.
Its tools become actions with the same grants and approvals as other integrations. Users authorize
OAuth from the connect panel. MCP integrations load their actions from the server, so omit
actions from their definition.
The app talks only to MCP servers you allow, including the hosted servers in the catalog:
| Variable | Value |
|---|---|
AGENTIC_MCP_ORIGINS | Comma-separated HTTPS origins of allowed MCP servers |
AGENTIC_MCP_AUTH_ORIGINS | Authorization servers on another origin than the MCP server |
AGENTIC_MCP_CLIENTS | JSON map of server URL to { issuer, client_id, client_secret? } for servers without dynamic client registration |