b24_save_user_mapping
Map user IDs between source and destination Bitrix24 instances for replicating automations. Saves the mapping to a JSON file at a specified path.
Instructions
Genera y guarda el mapeo de IDs de usuarios entre dos instancias, necesario para replicar automatizaciones.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| source_users | Yes | Lista de usuarios de la instancia origen | |
| dest_users | Yes | Lista de usuarios de la instancia destino | |
| output_file | Yes | Ruta donde guardar el JSON de mapeo |
Implementation Reference
- index.js:170-172 (registration)Registration of the 'b24_save_user_mapping' tool on the MCP server with its schema and handler.
server.tool('b24_save_user_mapping', 'Genera y guarda el mapeo de IDs de usuarios entre dos instancias, necesario para replicar automatizaciones.', saveUserMappingSchema.shape, wrap(saveUserMappingTool)); - src/tools/save-user-mapping.js:20-42 (handler)Main handler function 'saveUserMappingTool' that uses suggestUserMapping to match source users to destination users and saves the mapping to a file.
export async function saveUserMappingTool({ source_users, dest_users, output_file }) { const mapping = suggestUserMapping(source_users, dest_users); const unmapped = source_users.filter(u => !mapping[u.ID]); saveUserMapping(mapping, output_file); return { saved_to: output_file, mapped_count: Object.keys(mapping).length, unmapped_count: unmapped.length, mapping, unmapped_users: unmapped.map(u => ({ id: u.ID, name: `${u.NAME || ''} ${u.LAST_NAME || ''}`.trim(), email: u.EMAIL, })), summary: `${Object.keys(mapping).length} usuarios mapeados, ${unmapped.length} sin correspondencia en destino`, note: unmapped.length > 0 ? 'Los usuarios sin mapeo deberán asignarse manualmente. Las automatizaciones que los referencien tendrán advertencias al aplicar.' : null, }; } - src/tools/save-user-mapping.js:4-18 (schema)Zod schema 'saveUserMappingSchema' defining the input validation: source_users array, dest_users array, and output_file string.
export const saveUserMappingSchema = z.object({ source_users: z.array(z.object({ ID: z.string(), NAME: z.string().optional(), LAST_NAME: z.string().optional(), EMAIL: z.string().optional(), })).describe('Lista de usuarios de la instancia origen'), dest_users: z.array(z.object({ ID: z.string(), NAME: z.string().optional(), LAST_NAME: z.string().optional(), EMAIL: z.string().optional(), })).describe('Lista de usuarios de la instancia destino'), output_file: z.string().describe('Ruta donde guardar el JSON de mapeo'), }); - src/utils/user-mapping.js:22-33 (helper)Helper function 'suggestUserMapping' that matches users by email first, then by full name, creating a mapping from source ID to dest ID.
export function suggestUserMapping(sourceUsers, destUsers) { const mapping = {}; for (const src of sourceUsers) { const match = destUsers.find(d => d.EMAIL === src.EMAIL) || destUsers.find(d => `${d.NAME} ${d.LAST_NAME}`.trim() === `${src.NAME} ${src.LAST_NAME}`.trim()); if (match) { mapping[src.ID] = match.ID; } } return mapping; } - src/utils/user-mapping.js:35-37 (helper)Helper function 'saveUserMapping' that writes the mapping JSON object to a file.
export function saveUserMapping(mapping, outputFile) { writeFileSync(outputFile, JSON.stringify(mapping, null, 2), 'utf-8'); }