import { MCPServer, oauthWorkOSProvider, text, error, json } from 'mcp-use/server'
import { WorkOS } from '@workos-inc/node'
import { z } from 'zod'
const workosClient = new WorkOS(process.env.MCP_USE_OAUTH_WORKOS_API_KEY!)
const server = new MCPServer({
name: 'workos-example',
version: '1.0.0',
oauth: oauthWorkOSProvider({
subdomain: process.env.MCP_USE_OAUTH_WORKOS_SUBDOMAIN!,
apiKey: process.env.MCP_USE_OAUTH_WORKOS_API_KEY!,
clientId: process.env.MCP_USE_OAUTH_WORKOS_CLIENT_ID,
getUserInfo: (payload) => ({
userId: payload.sub,
email: payload.email,
name: payload.name,
organizationId: payload.org_id,
organizationName: payload.org_name,
})
})
})
server.tool({
name: 'get-profile',
description: 'Get user profile with organization',
cb: async (params, context) => {
return json({
user: {
id: context.auth.userId,
email: context.auth.email,
name: context.auth.name
},
organization: {
id: context.auth.organizationId,
name: context.auth.organizationName
}
})
}
})
server.tool({
name: 'get-team',
description: 'Get team members from directory',
cb: async (params, context) => {
const orgId = context.auth.organizationId
const { data: users } = await workosClient.directorySync.listUsers({
directory: orgId,
limit: 100
})
return json({ teamMembers: users })
}
})
server.tool({
name: 'create-org-document',
description: 'Create organization document',
schema: z.object({
title: z.string(),
content: z.string()
}),
cb: async ({ title, content }, context) => {
const doc = await db.documents.create({
data: {
title,
content,
organizationId: context.auth.organizationId,
createdBy: context.auth.userId
}
})
return text(`Document created: ${doc.id}`)
}
})
server.listen(3000)
console.log('🔒 WorkOS server: http://localhost:3000')
console.log('🔍 Inspector: http://localhost:3000/inspector')