server-stdio.ts•3.65 kB
import 'dotenv/config';
import { config } from 'dotenv';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import {
listUsers,
deleteUser,
lockUser,
unlockUser,
listUsersSchema,
deleteUserSchema,
lockUserSchema
} from './clerk-tools.js';
// Carregar variáveis de ambiente do .env.local
config({ path: '.env.local' });
// Criar o servidor MCP
const server = new McpServer({
name: 'clerk-mcp-server',
version: '1.0.0'
});
// Registrar ferramenta: Listar Usuários
server.registerTool(
'list-users',
{
title: 'Listar Usuários',
description: 'Lista todos os usuários cadastrados no Clerk com paginação',
inputSchema: listUsersSchema,
outputSchema: {
success: z.boolean(),
data: z.object({
users: z.array(z.object({
id: z.string(),
email: z.string().nullable(),
firstName: z.string().nullable(),
lastName: z.string().nullable(),
username: z.string().nullable(),
createdAt: z.number(),
updatedAt: z.number(),
locked: z.boolean(),
banned: z.boolean()
})),
total: z.number(),
limit: z.number(),
offset: z.number()
}).optional(),
error: z.string().optional()
}
},
async (params) => {
const result = await listUsers(params);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result
};
}
);
// Registrar ferramenta: Deletar Usuário
server.registerTool(
'delete-user',
{
title: 'Deletar Usuário',
description: 'Deleta permanentemente um usuário do Clerk pelo ID. Esta ação é irreversível!',
inputSchema: deleteUserSchema,
outputSchema: {
success: z.boolean(),
message: z.string().optional(),
error: z.string().optional()
}
},
async (params) => {
const result = await deleteUser(params);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result
};
}
);
// Registrar ferramenta: Bloquear Usuário
server.registerTool(
'lock-user',
{
title: 'Bloquear Usuário',
description: 'Bloqueia um usuário do Clerk, impedindo que ele faça login',
inputSchema: lockUserSchema,
outputSchema: {
success: z.boolean(),
message: z.string().optional(),
error: z.string().optional()
}
},
async (params) => {
const result = await lockUser(params);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result
};
}
);
// Registrar ferramenta: Desbloquear Usuário
server.registerTool(
'unlock-user',
{
title: 'Desbloquear Usuário',
description: 'Desbloqueia um usuário do Clerk, permitindo que ele faça login novamente',
inputSchema: lockUserSchema,
outputSchema: {
success: z.boolean(),
message: z.string().optional(),
error: z.string().optional()
}
},
async (params) => {
const result = await unlockUser(params);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
structuredContent: result
};
}
);
// Conectar ao transporte STDIO
const transport = new StdioServerTransport();
await server.connect(transport);
// Log de inicialização para stderr (não interfere com stdio)
console.error('✅ Clerk MCP Server (STDIO) iniciado com sucesso');
console.error('📦 Ferramentas: list-users, delete-user, lock-user, unlock-user');