Skip to content

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_KEY and stay on the server. Agents supply path values, body, and query, never a URL or a token.
  • Actions marked approval: true wait 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:

server/integrations/resend.ts
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.

OptionDescription
auth{ apiKey: true }, { oauth: { provider, scopes } }, or { mcp: { server } }
ownershipWho owns a connection: ['workspace'], ['user'], or both (the default)
fieldsWhat the connect form asks for; secret: true fields are encrypted
detailsThe longer text on the connection panel; defaults to description
apibaseUrl, verify, rejects, and authorization, headers, or prepare for other schemes
actionsid, label, description, method, path, query, body, approval, transform, run
eventsEvents 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:

VariableValue
AGENTIC_MCP_ORIGINSComma-separated HTTPS origins of allowed MCP servers
AGENTIC_MCP_AUTH_ORIGINSAuthorization servers on another origin than the MCP server
AGENTIC_MCP_CLIENTSJSON map of server URL to { issuer, client_id, client_secret? } for servers without dynamic client registration