/**
* Session management tools for MCP WPPConnect Server.
* Handles session initialization, QR code retrieval, status checking, and closing.
*/
import { z } from 'zod';
import {
InitializeSessionSchema,
GetQrSnapshotSchema,
GetSessionStatusSchema,
CloseSessionSchema,
} from '../schemas/validations.js';
import { sessionManager } from '../utils/sessionManager.js';
import { logger } from '../utils/logger.js';
import { ToolResponse } from '../types/index.js';
/**
* Initialize a new WhatsApp session.
* Returns a sessionId and initial status.
*/
export const initializeSessionTool = {
name: 'initialize_session',
description: 'Initialize a new WhatsApp session. Returns a session ID and QR code instructions.',
inputSchema: InitializeSessionSchema,
execute: async (
input: z.infer<typeof InitializeSessionSchema>
): Promise<ToolResponse> => {
try {
logger.info('initializeSessionTool', `Initializing session: ${input.sessionId}`);
const result = await sessionManager.initializeSession(input.sessionId);
return {
ok: result.ok,
data: {
sessionId: input.sessionId,
status: result.status,
qr: result.qr,
message: 'Session initialized. Use get_qr_snapshot to retrieve the QR code.',
},
error: result.error,
};
} catch (error) {
logger.error('initializeSessionTool', error);
return {
ok: false,
error: `Failed to initialize session: ${String(error)}`,
};
}
},
};
/**
* Get the current QR code snapshot for a session.
* Returns a base64-encoded QR code image.
*/
export const getQRSnapshotTool = {
name: 'get_qr_snapshot',
description: 'Retrieve the current QR code for a session as base64-encoded image.',
inputSchema: GetQrSnapshotSchema,
execute: async (
input: z.infer<typeof GetQrSnapshotSchema>
): Promise<ToolResponse> => {
try {
logger.info('getQRSnapshotTool', `Getting QR snapshot for session: ${input.sessionId}`);
const qrCode = sessionManager.getQRSnapshot(input.sessionId);
if (!qrCode) {
return {
ok: false,
error: 'QR code not available. Session may be already authenticated or not initialized.',
};
}
return {
ok: true,
data: {
qr: qrCode,
expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
},
};
} catch (error) {
logger.error('getQRSnapshotTool', error);
return {
ok: false,
error: `Failed to get QR snapshot: ${String(error)}`,
};
}
},
};
/**
* Get the current status of a session.
* Returns authentication state and session information.
*/
export const getSessionStatusTool = {
name: 'get_session_status',
description: 'Get the current status of a WhatsApp session (authenticated, pending, disconnected).',
inputSchema: GetSessionStatusSchema,
execute: async (
input: z.infer<typeof GetSessionStatusSchema>
): Promise<ToolResponse> => {
try {
logger.info('getSessionStatusTool', `Getting session status: ${input.sessionId}`);
const status = await sessionManager.getSessionStatus(input.sessionId);
if (!status) {
return {
ok: false,
error: `Session ${input.sessionId} not found or closed.`,
};
}
const session = sessionManager.getSessionInfo(input.sessionId);
return {
ok: true,
data: {
sessionId: input.sessionId,
status,
isAuthenticated: status === 'authenticated',
createdAt: session?.createdAt.toISOString() || new Date().toISOString(),
lastActivity: session?.lastActivity.toISOString() || new Date().toISOString(),
},
};
} catch (error) {
logger.error('getSessionStatusTool', error);
return {
ok: false,
error: `Failed to get session status: ${String(error)}`,
};
}
},
};
/**
* Close an active session and clean up resources.
*/
export const closeSessionTool = {
name: 'close_session',
description: 'Close an active WhatsApp session and clean up resources.',
inputSchema: CloseSessionSchema,
execute: async (
input: z.infer<typeof CloseSessionSchema>
): Promise<ToolResponse> => {
try {
logger.info('closeSessionTool', `Closing session: ${input.sessionId}`);
await sessionManager.closeSession(input.sessionId);
return {
ok: true,
data: {
message: `Session ${input.sessionId} closed successfully.`,
},
};
} catch (error) {
logger.error('closeSessionTool', error);
return {
ok: false,
error: `Failed to close session: ${String(error)}`,
};
}
},
};
/**
* Array of all session management tools.
*/
export const sessionTools = [
initializeSessionTool,
getQRSnapshotTool,
getSessionStatusTool,
closeSessionTool,
];