IntegrateIntegrate
Database

Drizzle

Use the Drizzle ORM database adapter with createMCPServer

The Drizzle adapter stores provider tokens and triggers using your existing Drizzle schema.

Install

bun add integrate-sdk drizzle-orm

drizzle-orm is a peer dependency of the adapter.

Schema

Define provider_token and optional trigger tables. You can copy the reference schema or align your existing tables with the same column names.

// db/schema/integrate.ts
import { integrateProviderToken, integrateTrigger } from "integrate-sdk/server";

export const providerToken = integrateProviderToken;
export const trigger = integrateTrigger;

Configuration

import { createMCPServer, githubIntegration } from "integrate-sdk/server";
import { drizzleAdapter } from "integrate-sdk/adapters/drizzle";
import { db } from "./db";
import { providerToken, trigger } from "./db/schema";

export const { client } = createMCPServer({
  apiKey: process.env.INTEGRATE_API_KEY,
  integrations: [githubIntegration({ scopes: ["repo"] })],
  database: drizzleAdapter(db, {
    provider: "pg", // "pg" | "mysql" | "sqlite"
    schema: { providerToken, trigger },
    hooks: {
      onTokenChange: ({ userId }) => revalidateTag(`integrations:${userId}`),
    },
  }),
  getSessionContext: async (req) => {
    const session = await auth.api.getSession({ headers: req.headers });
    return session?.user?.id ? { userId: session.user.id } : undefined;
  },
});

Session context example

Integrate's Drizzle adapter persists integration OAuth tokens in provider_token. It is separate from your app's user/session tables—wire getSessionContext to whatever auth layer you already use.

import { auth } from "./auth";
import { drizzleAdapter } from "integrate-sdk/adapters/drizzle";

database: drizzleAdapter(db, {
  provider: "pg",
  schema: { providerToken, trigger },
}),
getSessionContext: async (req) => {
  const session = await auth.api.getSession({ headers: req.headers });
  if (!session?.user?.id) return undefined;
  return {
    userId: session.user.id,
    organizationId: session.session?.activeOrganizationId,
  };
},

API

drizzleAdapter(db, {
  provider: "pg",
  schema: { providerToken, trigger? },
  hooks?: IntegrateAdapterHooks,
  debugLogs?: boolean,
})

Returns a lazy factory () => IntegrateDatabaseCallbacks compatible with createMCPServer({ database }).

You can also use drizzleAdapterCallbacks(db, config) if you need the callback object directly without the factory wrapper.

Multi-account tokens

The adapter handles multiple accounts per provider via account_email and account_id. See Schema for the recommended unique index.

Example

See the Drizzle database example for a complete Next.js app with SQLite and GitHub OAuth.

On this page