Skip to main content
Glama

AEM MCP Server

aem-tools.ts6.58 kB
import { AEMClient, AEMConfig } from './aem-client.js'; export class AEMTools { constructor(private aemClient: AEMClient) {} private getConfig(args: any): AEMConfig { return { host: args.host || 'localhost', port: args.port || 4506, username: args.username || 'admin', password: args.password || 'admin', }; } async checkStatus(args: any) { const config = this.getConfig(args); const status = await this.aemClient.checkStatus(config); return { content: [ { type: 'text', text: `AEM Instance Status: Host: ${config.host}:${config.port} Status: ${status.status} ${status.version ? `Version: ${status.version}` : ''} ${status.totalBundles ? `Total Bundles: ${status.totalBundles}` : ''} ${status.activeBundles ? `Active Bundles: ${status.activeBundles}` : ''} ${status.message ? `Message: ${status.message}` : ''}`, }, ], }; } async installPackage(args: any) { const config = this.getConfig(args); const { packagePath, force = false } = args; if (!packagePath) { throw new Error('Package path is required'); } const result = await this.aemClient.installPackage(config, packagePath, force); return { content: [ { type: 'text', text: `Package Installation Result: Success: ${result.success} Message: ${result.message} Package: ${packagePath} Force: ${force}`, }, ], }; } async listPackages(args: any) { const config = this.getConfig(args); const result = await this.aemClient.listPackages(config); let packagesText = 'Installed Packages:\n'; if (result.success && result.packages) { if (typeof result.packages === 'string') { // Parse HTML response if needed packagesText += result.packages; } else { packagesText += JSON.stringify(result.packages, null, 2); } } else { packagesText += result.message || 'Failed to retrieve packages'; } return { content: [ { type: 'text', text: packagesText, }, ], }; } async createPage(args: any) { const config = this.getConfig(args); const { parentPath, pageName, pageTitle, template } = args; if (!parentPath || !pageName || !pageTitle || !template) { throw new Error('parentPath, pageName, pageTitle, and template are required'); } const result = await this.aemClient.createPage(config, parentPath, pageName, pageTitle, template); return { content: [ { type: 'text', text: `Page Creation Result: Success: ${result.success} Message: ${result.message} ${result.path ? `Path: ${result.path}` : ''} Parent: ${parentPath} Name: ${pageName} Title: ${pageTitle} Template: ${template}`, }, ], }; } async replicateContent(args: any) { const config = this.getConfig(args); const { path, action = 'activate' } = args; if (!path) { throw new Error('Content path is required'); } const result = await this.aemClient.replicateContent(config, path, action); return { content: [ { type: 'text', text: `Content Replication Result: Success: ${result.success} Message: ${result.message} Path: ${path} Action: ${action}`, }, ], }; } async queryContent(args: any) { const config = this.getConfig(args); const { query, type = 'JCR-SQL2', limit = 20 } = args; if (!query) { throw new Error('Query is required'); } const result = await this.aemClient.queryContent(config, query, type, limit); let queryText = `Content Query Result: Query: ${query} Type: ${type} Limit: ${limit} Success: ${result.success} `; if (result.success && result.results) { queryText += `Results:\n${JSON.stringify(result.results, null, 2)}`; } else { queryText += `Message: ${result.message || 'Query failed'}`; } return { content: [ { type: 'text', text: queryText, }, ], }; } async getBundleStatus(args: any) { const config = this.getConfig(args); const { bundleId } = args; const result = await this.aemClient.getBundleStatus(config, bundleId); let bundleText = `OSGi Bundle Status: ${bundleId ? `Bundle ID: ${bundleId}` : 'All Bundles'} Success: ${result.success} `; if (result.success && result.bundles) { if (bundleId) { // Single bundle bundleText += `Bundle Details:\n${JSON.stringify(result.bundles, null, 2)}`; } else { // All bundles summary const bundles = result.bundles; if (bundles.s && Array.isArray(bundles.s)) { const totalBundles = bundles.s.length; const activeBundles = bundles.s.filter((bundle: any) => bundle.state === 'Active').length; const resolvedBundles = bundles.s.filter((bundle: any) => bundle.state === 'Resolved').length; const installedBundles = bundles.s.filter((bundle: any) => bundle.state === 'Installed').length; bundleText += `Total Bundles: ${totalBundles} Active Bundles: ${activeBundles} Resolved Bundles: ${resolvedBundles} Installed Bundles: ${installedBundles} Bundle Summary: ${bundles.s.slice(0, 10).map((bundle: any) => `- ${bundle.name} (${bundle.symbolicName}): ${bundle.state}` ).join('\n')} ${totalBundles > 10 ? `\n... and ${totalBundles - 10} more bundles` : ''}`; } else { bundleText += `Bundle Data:\n${JSON.stringify(bundles, null, 2)}`; } } } else { bundleText += `Message: ${result.message || 'Failed to get bundle status'}`; } return { content: [ { type: 'text', text: bundleText, }, ], }; } async clearCache(args: any) { const config = this.getConfig(args); const { cacheType = 'all' } = args; const result = await this.aemClient.clearCache(config, cacheType); let cacheText = `Cache Clear Result: Cache Type: ${cacheType} Success: ${result.success} `; if (result.success && result.results) { cacheText += `\nResults:\n`; result.results.forEach((res: any) => { cacheText += `- ${res.type}: ${res.success ? 'Success' : 'Failed'} - ${res.message}\n`; }); } else { cacheText += `Message: Failed to clear cache`; } return { content: [ { type: 'text', text: cacheText, }, ], }; } }

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/pradeep-moolemane/aem-mcp'

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