import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { getLogger } from '../utils/logger.js';
import { getPsadtService } from '../services/psadt.js';
export function registerResourceHandlers(server: McpServer): void {
const logger = getLogger().child({ handler: 'resources' });
const psadtService = getPsadtService();
// Get list of available resources
const resources = psadtService.listResources();
// Helper function to create resource handler
const createResourceHandler = (uri: string) => {
return async () => {
const resource = psadtService.loadResource(uri);
if (!resource) {
return {
contents: [{ uri, text: 'Resource not found', mimeType: 'text/plain' }],
};
}
return {
contents: [{ uri: resource.uri, text: resource.content, mimeType: 'text/markdown' }],
};
};
};
// Register PSADT documentation resources
server.resource(
'psadt-overview',
'psadt://docs/overview',
{ description: 'PSADT v4 architecture and concepts overview', mimeType: 'text/markdown' },
createResourceHandler('psadt://docs/overview')
);
server.resource(
'psadt-functions',
'psadt://docs/functions',
{ description: 'PSADT v4 function reference with all ADT-prefixed commands', mimeType: 'text/markdown' },
createResourceHandler('psadt://docs/functions')
);
server.resource(
'psadt-variables',
'psadt://docs/variables',
{ description: 'PSADT v4 built-in variables including $ADTSession object', mimeType: 'text/markdown' },
createResourceHandler('psadt://docs/variables')
);
server.resource(
'psadt-migration',
'psadt://docs/migration',
{ description: 'Guide for migrating PSADT scripts from v3 to v4', mimeType: 'text/markdown' },
createResourceHandler('psadt://docs/migration')
);
server.resource(
'psadt-best-practices',
'psadt://docs/best-practices',
{ description: 'Best practices and recommended patterns for PSADT deployments', mimeType: 'text/markdown' },
createResourceHandler('psadt://docs/best-practices')
);
// Register installer guide resources
server.resource(
'installers-msi',
'kb://installers/msi',
{ description: 'MSI Windows Installer packaging guide', mimeType: 'text/markdown' },
createResourceHandler('kb://installers/msi')
);
server.resource(
'installers-exe',
'kb://installers/exe',
{ description: 'EXE installer guide covering Inno Setup, NSIS, InstallShield, and more', mimeType: 'text/markdown' },
createResourceHandler('kb://installers/exe')
);
server.resource(
'installers-msix',
'kb://installers/msix',
{ description: 'MSIX/AppX modern packaging guide', mimeType: 'text/markdown' },
createResourceHandler('kb://installers/msix')
);
// Register pattern resources
server.resource(
'patterns-detection',
'kb://patterns/detection',
{ description: 'Intune detection rule patterns and examples', mimeType: 'text/markdown' },
createResourceHandler('kb://patterns/detection')
);
server.resource(
'patterns-prerequisites',
'kb://patterns/prerequisites',
{ description: 'Patterns for handling application prerequisites and dependencies', mimeType: 'text/markdown' },
createResourceHandler('kb://patterns/prerequisites')
);
// Register reference resources
server.resource(
'exit-codes',
'ref://exit-codes',
{ description: 'Common installer exit codes and their meanings', mimeType: 'text/markdown' },
createResourceHandler('ref://exit-codes')
);
logger.info('Registered PSADT resources', {
count: resources.length,
categories: ['psadt://docs/*', 'kb://installers/*', 'kb://patterns/*', 'ref://*'],
});
}