Skip to main content
Glama
intune-handler-enhanced.ts6.06 kB
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'; import { Client } from '@microsoft/microsoft-graph-client'; import { handleIntuneMacOSPolicies } from './intune-macos-handler.js'; import { handleIntuneWindowsPolicies } from './intune-windows-handler.js'; import { validatePolicySettings, applyPolicyDefaults, generatePolicyExample, validateAssignments, POLICY_TEMPLATES } from '../validators/intune-policy-validator.js'; export async function handleCreateIntunePolicyEnhanced( graphClient: Client, args: any ): Promise<any> { const { platform, policyType, displayName, description, settings, assignments, useTemplate } = args; // Basic parameter validation if (!platform || !policyType || !displayName) { throw new McpError( ErrorCode.InvalidParams, 'Missing required parameters: platform, policyType, and displayName are required.' ); } // Validate platform if (!['macos', 'windows'].includes(platform)) { throw new McpError( ErrorCode.InvalidParams, `Invalid platform: ${platform}. Must be 'macos' or 'windows'.` ); } // Validate policy type const validPolicyTypes = ['Configuration', 'Compliance', 'Security', 'Update', 'AppProtection', 'EndpointSecurity']; if (!validPolicyTypes.includes(policyType)) { throw new McpError( ErrorCode.InvalidParams, `Invalid policyType: ${policyType}. Must be one of: ${validPolicyTypes.join(', ')}` ); } let finalSettings = settings || {}; // Apply template if requested if (useTemplate) { const platformTemplates = POLICY_TEMPLATES[platform as 'macos' | 'windows']; if (platformTemplates && useTemplate in platformTemplates) { const template = platformTemplates[useTemplate as keyof typeof platformTemplates]; if (template && 'settings' in template) { finalSettings = template.settings; console.debug(`Applied template: ${useTemplate} for ${platform} ${policyType}`); } } else { console.warn(`Template '${useTemplate}' not found for ${platform}`); } } // Apply defaults finalSettings = applyPolicyDefaults(platform, policyType, finalSettings); // Validate settings const validationResult = validatePolicySettings(platform, policyType, finalSettings); // Log warnings if (validationResult.warnings.length > 0) { console.warn('Policy validation warnings:', validationResult.warnings); } // Check for validation errors if (!validationResult.isValid) { const errorMessage = `Policy validation failed:\n${validationResult.errors.join('\n')}`; const example = generatePolicyExample(platform, policyType); throw new McpError( ErrorCode.InvalidParams, `${errorMessage}\n\nExample of valid settings:\n${example}` ); } // Validate assignments if provided let assignmentValidation = { warnings: [] as string[], errors: [] as string[], isValid: true }; if (assignments) { assignmentValidation = validateAssignments(assignments); if (assignmentValidation.warnings.length > 0) { console.warn('Assignment validation warnings:', assignmentValidation.warnings); } if (!assignmentValidation.isValid) { throw new McpError( ErrorCode.InvalidParams, `Assignment validation failed:\n${assignmentValidation.errors.join('\n')}` ); } } // Prepare the policy arguments const policyArgs = { action: 'create' as const, policyType: policyType, name: displayName, description: description, settings: finalSettings, assignments: assignments }; try { // Route to appropriate handler based on platform let result; if (platform === 'macos') { result = await handleIntuneMacOSPolicies(graphClient, policyArgs as any); } else if (platform === 'windows') { result = await handleIntuneWindowsPolicies(graphClient, policyArgs as any); } // Add validation info to result const enhancedResult = { ...result, validationInfo: { platform, policyType, settingsValidated: true, defaultsApplied: true, warnings: [...validationResult.warnings, ...assignmentValidation.warnings] } }; return enhancedResult; } catch (error) { // Enhance error message with context if (error instanceof Error) { const enhancedError = new McpError( ErrorCode.InternalError, `Failed to create ${platform} ${policyType} policy: ${error.message}\n\n` + `Policy Name: ${displayName}\n` + `Platform: ${platform}\n` + `Type: ${policyType}` ); throw enhancedError; } throw error; } } // Export the enhanced handler as the main handler export async function handleCreateIntunePolicy( graphClient: Client, args: any ): Promise<any> { return handleCreateIntunePolicyEnhanced(graphClient, args); } // Helper function to list available templates export function listPolicyTemplates(platform?: string): any { if (platform && (platform === 'macos' || platform === 'windows')) { return POLICY_TEMPLATES[platform] || {}; } return POLICY_TEMPLATES; } // Helper function to get policy creation help export function getPolicyCreationHelp(platform: string, policyType: string): string { const example = generatePolicyExample(platform, policyType); const templates = (platform === 'macos' || platform === 'windows') ? POLICY_TEMPLATES[platform] : {}; const templateNames = templates ? Object.keys(templates) : []; return ` # Creating ${platform} ${policyType} Policy ## Required Parameters: - platform: '${platform}' - policyType: '${policyType}' - displayName: string (required) - description: string (optional) - settings: object (structure depends on policy type) - assignments: array (optional) ## Available Templates for ${platform}: ${templateNames.length > 0 ? templateNames.join(', ') : 'No templates available'} ## Example: ${example} ## Using a Template: Add "useTemplate": "templateName" to use a pre-configured template. `; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DynamicEndpoints/m365-core-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server