UNPKG

@auth0/auth0-mcp-server

Version:

Auth0 Model Context Protocol (MCP) Server (Beta) — A secure and extendable implementation of an MCP server that provides AI assistants with controlled access to the Auth0 Management API through natural language. This project is in beta and not intended fo

219 lines • 9.04 kB
import { log } from '../utils/logger.js'; import { createErrorResponse, createSuccessResponse } from '../utils/http-utility.js'; import { getManagementClient } from '../utils/auth0-client.js'; // Define all available log tools export const LOG_TOOLS = [ { name: 'auth0_list_logs', description: 'List logs from the Auth0 tenant', inputSchema: { type: 'object', properties: { from: { type: 'string', description: 'Log ID to start retrieving logs from. Optional, used for pagination.', }, take: { type: 'number', description: 'Number of logs to retrieve (1-100). Optional, defaults to 50.', }, q: { type: 'string', description: 'Lucene query string to filter logs. ' + 'Valid fields: user_name (stores email for database users), user_id, type, ' + 'client_id, client_name, ip, connection, description, date. ' + 'Examples: user_name:"john@example.com", type:f, client_name:MyApp AND type:fp. ' + 'Do NOT use user_email — this field does not exist in Auth0 logs.', }, sort: { type: 'string', description: 'Field to sort by. Optional, defaults to date:-1 (newest first).', enum: ['date:1', 'date:-1'], }, include_fields: { type: 'boolean', description: 'Whether to include all fields. Optional, defaults to true.', }, include_totals: { type: 'boolean', description: 'Whether to include total count. Optional, defaults to true.', }, }, }, _meta: { requiredScopes: ['read:logs'], readOnly: true, }, annotations: { title: 'List Auth0 Logs', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, }, }, { name: 'auth0_get_log', description: 'Get a specific log entry by ID', inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'ID of the log entry to retrieve. Required.', }, }, required: ['id'], }, _meta: { requiredScopes: ['read:logs'], readOnly: true, }, annotations: { title: 'Get Auth0 Log Entry', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, }, }, ]; // Define handlers for each log tool export const LOG_HANDLERS = { auth0_list_logs: async (request, config) => { try { // Check for token if (!request.token) { log('Warning: Token is empty or undefined'); return createErrorResponse('Error: Missing authorization token'); } // Check if domain is configured if (!config.domain) { log('Error: Auth0 domain is not configured'); return createErrorResponse('Error: Auth0 domain is not configured'); } // Build query parameters const options = {}; if (request.parameters.from) { options.from = request.parameters.from; } if (request.parameters.take !== undefined) { const take = Math.min(request.parameters.take, 100); // Max 100 logs options.take = take; } else { // Default to 50 logs options.take = 50; } if (request.parameters.q) { options.q = request.parameters.q; } if (request.parameters.sort) { options.sort = request.parameters.sort; } else { // Default to newest first options.sort = 'date:-1'; } if (request.parameters.include_fields !== undefined) { options.include_fields = request.parameters.include_fields; } if (request.parameters.include_totals !== undefined) { options.include_totals = request.parameters.include_totals; } else { // Default to include totals options.include_totals = true; } try { const managementClientConfig = { domain: config.domain, token: request.token, }; const managementClient = await getManagementClient(managementClientConfig, config.headers); log(`Fetching logs with supplied options`); // Use the Auth0 SDK to get logs const { data: responseData } = await managementClient.logs.getAll(options); // Handle different response formats log(`Successfully retrieved logs`); if (!responseData) { return createSuccessResponse({ message: 'No logs found matching your criteria.', logs: [], }); } return createSuccessResponse(responseData); } catch (sdkError) { // Handle SDK errors log('Auth0 SDK error'); let errorMessage = `Failed to list logs: ${sdkError.message || 'Unknown error'}`; // Add context based on common error codes if (sdkError.statusCode === 401) { errorMessage += '\nError: Unauthorized. Your token might be expired or invalid or missing read:logs scope.'; } else if (sdkError.statusCode === 403) { errorMessage += '\nError: Forbidden. Your token might not have the required scopes (read:logs).'; } return createErrorResponse(errorMessage); } } catch (error) { // Handle any other errors log('Error processing request'); return createErrorResponse(`Error: ${error instanceof Error ? error.message : String(error)}`); } }, auth0_get_log: async (request, config) => { try { const id = request.parameters.id; if (!id) { return createErrorResponse('Error: id is required'); } // Check for token if (!request.token) { log('Warning: Token is empty or undefined'); return createErrorResponse('Error: Missing authorization token'); } // Check if domain is configured if (!config.domain) { log('Error: Auth0 domain is not configured'); return createErrorResponse('Error: Auth0 domain is not configured'); } try { const managementClientConfig = { domain: config.domain, token: request.token, }; const managementClient = await getManagementClient(managementClientConfig, config.headers); log(`Fetching log entry with ID: ${id}`); // Use the Auth0 SDK to get a specific log entry const { data: responseData } = await managementClient.logs.get({ id }); log(`Successfully retrieved log entry: ${responseData._id || id}`); return createSuccessResponse(responseData); } catch (sdkError) { // Handle SDK errors log('Auth0 SDK error'); let errorMessage = `Failed to get log: ${sdkError.message || 'Unknown error'}`; // Add context based on common error codes if (sdkError.statusCode === 404) { errorMessage = `Log with id '${id}' not found.`; } else if (sdkError.statusCode === 401) { errorMessage += '\nError: Unauthorized. Your token might be expired or invalid or missing read:logs scope.'; } return createErrorResponse(errorMessage); } } catch (error) { // Handle any other errors log('Error processing request'); return createErrorResponse(`Error: ${error instanceof Error ? error.message : String(error)}`); } }, }; //# sourceMappingURL=logs.js.map