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-ormdrizzle-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.