Skip to main content
Glama
DynamicEndpoints

Microsoft 365 Core MCP Server

manage_intune_windows_apps

Destructive

Deploy and manage Windows applications in Microsoft Intune, including Win32, Microsoft Store, and Office 365 apps, with assignment controls for enterprise environments.

Instructions

Manage Windows application deployment including Win32 apps, Microsoft Store apps, and Office 365 assignments.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesIntune Windows app management action
appIdNoApp ID for app-specific operations
appTypeNoWindows app type
nameNoApplication name
versionNoApplication version
assignmentGroupsNoTarget groups for app deployment
assignmentNoApp assignment configuration
appInfoNoApplication information

Implementation Reference

  • The core handler function implementing manage_intune_windows_apps tool. Handles Windows app operations in Intune including list, get, deploy, update, remove, and sync status via Microsoft Graph API endpoints under /deviceAppManagement/mobileApps.
    export async function handleIntuneWindowsApps(
      graphClient: Client,
      args: IntuneWindowsAppArgs
    ): Promise<{ content: { type: string; text: string }[] }> {
      let apiPath = '';
      let result: any;
    
      switch (args.action) {
        case 'list':
          apiPath = '/deviceAppManagement/mobileApps';
          let filter = '';
          
          if (args.appType) {
            const odataType = 
              args.appType === 'win32LobApp' ? '#microsoft.graph.win32LobApp' :
              args.appType === 'microsoftStoreForBusinessApp' ? '#microsoft.graph.microsoftStoreForBusinessApp' :
              args.appType === 'officeSuiteApp' ? '#microsoft.graph.officeSuiteApp' :
              args.appType === 'webApp' ? '#microsoft.graph.webApp' :
              args.appType === 'microsoftEdgeApp' ? '#microsoft.graph.microsoftEdgeApp' :
              '';
            
            if (odataType) {
              filter = `@odata.type eq '${odataType}'`;
            }
          }
    
          if (filter) {
            apiPath += `?$filter=${filter}`;
          }
    
          result = await graphClient.api(apiPath).get();
          break;
    
        case 'get':
          if (!args.appId) {
            throw new McpError(ErrorCode.InvalidParams, 'appId is required for get action');
          }
          apiPath = `/deviceAppManagement/mobileApps/${args.appId}`;
          result = await graphClient.api(apiPath).get();
          break;
    
        case 'deploy':
          if (!args.appId || !args.assignmentGroups) {
            throw new McpError(ErrorCode.InvalidParams, 'appId and assignmentGroups are required for deploy action');
          }      const assignments = args.assignmentGroups.map(groupId => ({
            target: {
              '@odata.type': '#microsoft.graph.groupAssignmentTarget',
              groupId: groupId
            },
            intent: args.assignment?.installIntent || 'available',
            settings: {
              '@odata.type': '#microsoft.graph.win32LobAppAssignmentSettings',
              notifications: 'showAll',
              restartSettings: null,
              installTimeSettings: null
            }
          }));
    
          apiPath = `/deviceAppManagement/mobileApps/${args.appId}/assign`;
          result = await graphClient.api(apiPath).post({
            mobileAppAssignments: assignments
          });
          break;
    
        case 'update':
          if (!args.appId) {
            throw new McpError(ErrorCode.InvalidParams, 'appId is required for update action');
          }
    
          const updatePayload: any = {};
          if (args.name) updatePayload.displayName = args.name;
          if (args.version) updatePayload.displayVersion = args.version;
    
          apiPath = `/deviceAppManagement/mobileApps/${args.appId}`;
          result = await graphClient.api(apiPath).patch(updatePayload);
          break;
    
        case 'remove':
          if (!args.appId) {
            throw new McpError(ErrorCode.InvalidParams, 'appId is required for remove action');
          }
          apiPath = `/deviceAppManagement/mobileApps/${args.appId}`;
          result = await graphClient.api(apiPath).delete();      break;
    
        case 'sync_status':
          if (!args.appId) {
            throw new McpError(ErrorCode.InvalidParams, 'appId is required for sync_status action');
          }
          
          // Get app installation status across devices
          apiPath = `/deviceAppManagement/mobileApps/${args.appId}/deviceStatuses`;
          result = await graphClient.api(apiPath).get();
          break;
    
        default:
          throw new McpError(ErrorCode.InvalidParams, `Unknown action: ${args.action}`);
      }
    
      return {
        content: [
          {
            type: 'text',
            text: `Windows App Management Result:\n${JSON.stringify(result, null, 2)}`
          }
        ]
      };
    }
  • Tool metadata definition including description, title, and annotations (readOnlyHint, destructiveHint, etc.) for the manage_intune_windows_apps tool.
    manage_intune_windows_apps: {
      description: "Manage Windows application deployment including Win32 apps, Microsoft Store apps, and Office 365 assignments.",
      title: "Intune Windows App Manager",
      annotations: { title: "Intune Windows App Manager", readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true }
  • TypeScript interface defining input parameters (IntuneWindowsAppArgs) for the handler function.
    export interface IntuneWindowsAppArgs {
      action: 'list' | 'get' | 'deploy' | 'update' | 'remove' | 'sync_status';
      appId?: string;
      appType?: 'win32LobApp' | 'microsoftStoreForBusinessApp' | 'webApp' | 'officeSuiteApp' | 'microsoftEdgeApp';
      name?: string;
      version?: string;
      assignmentGroups?: string[];
      assignment?: {
        groupIds: string[];
        installIntent: 'available' | 'required' | 'uninstall' | 'availableWithoutEnrollment';
        deliveryOptimizationPriority?: 'notConfigured' | 'foreground';
      };
      appInfo?: {
        displayName: string;
        description?: string;
        publisher: string;
        fileName?: string;
        setupFilePath?: string;
        installCommandLine?: string;
        uninstallCommandLine?: string;
        minimumSupportedOperatingSystem?: string;
        packageFilePath?: string;
      };
    }
  • Zod schema (intuneWindowsAppSchema) for input validation and MCP tool discovery of manage_intune_windows_apps.
    export const intuneWindowsAppSchema = z.object({
      action: z.enum(['list', 'get', 'deploy', 'update', 'remove', 'sync_status']).describe('Intune Windows app management action'),
      appId: z.string().optional().describe('App ID for app-specific operations'),
      appType: z.enum(['win32LobApp', 'microsoftStoreForBusinessApp', 'webApp', 'officeSuiteApp', 'microsoftEdgeApp']).optional().describe('Windows app type'),
      name: z.string().optional().describe('Application name'),
      version: z.string().optional().describe('Application version'),
      assignmentGroups: z.array(z.string()).optional().describe('Target groups for app deployment'),
      assignment: z.object({
        groupIds: z.array(z.string()).describe('Target group IDs'),
        installIntent: z.enum(['available', 'required', 'uninstall', 'availableWithoutEnrollment']).describe('Installation intent'),
        deliveryOptimizationPriority: z.enum(['notConfigured', 'foreground']).optional().describe('Delivery optimization priority'),
      }).optional().describe('App assignment configuration'),
      appInfo: z.object({
        displayName: z.string().describe('Application display name'),
        description: z.string().optional().describe('Application description'),
        publisher: z.string().describe('Application publisher'),
        fileName: z.string().optional().describe('Installation file name'),
        setupFilePath: z.string().optional().describe('Setup file path'),
        installCommandLine: z.string().optional().describe('Install command line'),
        uninstallCommandLine: z.string().optional().describe('Uninstall command line'),
        minimumSupportedOperatingSystem: z.string().optional().describe('Minimum OS version'),
        packageFilePath: z.string().optional().describe('Package file path'),
      }).optional().describe('Application information'),
    });
  • Example usage of manage_intune_windows_apps tool in device compliance analysis prompt.
    manage_intune_windows_apps {
      action: "list"
    }
    \`\`\`
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=true, readOnlyHint=false, and idempotentHint=false, covering key behavioral traits. The description adds minimal context by implying deployment actions but doesn't elaborate on destructive effects (e.g., data loss), authentication needs, or rate limits. It doesn't contradict annotations, so it meets the lower bar with annotations present but adds limited value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. It avoids unnecessary words and directly states the tool's scope. While it could be more structured with bullet points or examples, it earns its place by being clear and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, nested objects, no output schema) and annotations that only cover basic hints, the description is insufficient. It lacks details on return values, error handling, or operational constraints, leaving significant gaps for an agent to understand how to use this tool effectively in practice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, providing detailed parameter documentation. The description mentions app types (Win32, Microsoft Store, Office 365) which loosely map to the 'appType' enum, adding slight semantic context. However, it doesn't explain parameter interactions or usage scenarios beyond what the schema already covers, aligning with the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: managing Windows application deployment with specific app types (Win32, Microsoft Store, Office 365). It uses the verb 'manage' with the resource 'Windows application deployment,' making the purpose understandable. However, it doesn't explicitly differentiate from sibling tools like 'manage_intune_macos_apps' beyond the Windows focus, preventing a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, dependencies, or compare it to similar tools like 'manage_intune_macos_apps' or other Intune management tools. Without any usage context, the agent must infer when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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