From existing function to MCP tool
Wrap your existing logic with act.action() to make it MCP-ready.
// your existing function
async function getDoughnuts({ userId, limit }: { userId: string; limit?: number }) {
return db.doughnuts.findMany({ where: { userId }, take: limit ?? 10 });
}
// register it — now MCP-ready
export const getDoughnuts = act.action({
id: 'getDoughnuts',
description: 'Get doughnuts for a user',
input: z.object({
userId: z.string(),
limit: z.number().optional(),
}),
handler: async ({ userId, limit }) => {
return db.doughnuts.findMany({ where: { userId }, take: limit ?? 10 });
},
});
// your app
await getDoughnuts({ userId: '123', limit: 5 });
// an MCP agent
// → calls getDoughnuts with { userId: '123', limit: 5 }No new server. No separate process. No MCP knowledge required.
Install
npx @act-sdk/cli initOr manually:
npm install @act-sdk/core @act-sdk/mcp @act-sdk/adapters zodNext.js Integration
1. Wrap your existing logic (lib/actions/doughnuts.ts)
import { z } from 'zod';
import { act } from '@/act-sdk.config';
export const getDoughnuts = act.action({
id: 'getDoughnuts',
description: 'Get doughnuts for the authenticated user',
input: z.object({ limit: z.number().optional() }),
handler: async ({ limit }, context) => {
return db.doughnuts.findMany({
where: { userId: context?.authInfo.userId },
take: limit ?? 10,
});
},
});
export const orderDoughnut = act.action({
id: 'orderDoughnut',
description: 'Order a doughnut for the authenticated user',
input: z.object({ flavour: z.string() }),
handler: async ({ flavour }, context) => {
return db.orders.create({
data: { flavour, userId: context?.authInfo.userId },
});
},
});2. Config File (act-sdk.config.ts)
import { createAct, defineConfig } from '@act-sdk/core';
export const act = createAct();
export default defineConfig({
name: 'my-app',
description: 'My app MCP server',
version: '1.0.0',
act,
});3. Add the route (app/api/mcp/route.ts)
import { createNextHandler } from '@act-sdk/adapters/nextjs';
import config from '@/act-sdk.config';
export const { GET, POST, DELETE } = createNextHandler(config, {
auth: async (req) => {
const token = req.headers.get('authorization')?.split(' ')[1];
if (!token) return null;
return verifyJWT(token);
},
});STDIO
import { createStdioServer } from '@act-sdk/adapters/stdio';
import config from './act-sdk.config.js';
createStdioServer(config);Packages
| Package | Purpose |
|---|---|
| @act-sdk/core | Action registry, createAct(), defineConfig() |
| @act-sdk/mcp | Translates actions into MCP tools |
| @act-sdk/adapters | Next.js and STDIO adapters |
Contribute to other frameworks
Help us expand Act SDK to more ecosystems. If you want support for Express, Hono, Fastify, or another framework, open an issue or contribute an adapter.