Standalone MCP server for Adobe Experience Manager 6.5 Author (stdio and optional Streamable HTTP)
The aem-mcp-server demonstrates solid fundamental quality with 28 well-defined tools covering AEM page, component, asset, and workflow operations. All tools have names starting with action verbs (fetch, list, create, update, delete, search, get), descriptions between 34-194 chars, and documented input schemas with parameter types and descriptions. However, several systematic gaps reduce the score below 70: (1) Output schemas are not explicitly documented, the source shows tool registration with inputSchema but no visible outputSchema declarations or return type documentation; (2) Error handling lacks recovery guidance, tools do not appear to provide actionable error messages guiding the LLM to fallback tools or retries; (3) Tool descriptions are functional but often terse (34-72 chars baseline) and missing WHEN-to-use context that helps LLMs select between similar tools; (4) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible despite the rubric requiring these for production-grade tools; (5) Complex parameters like 'properties' (object type) lack structured schema definitions of what keys are valid; (6) Some tools accept free-form predicates or arbitrary properties without enums or validation guidance; (7) Parameter descriptions sometimes omit format/range constraints (e.g., 'fileName' says alphanumeric/dot/dash/underscore but doesn't state max length or why). Strengths: consistent verb-noun naming, all tools and parameters have descriptions, schemas include type information, tools are logically grouped by domain (discovery, pages, components, assets, search, workflow), and destructive operations are clearly marked with risk labels. The 28-tool catalog is well-sized with no obvious oversplitting or conflation.
Publish a page to the replication agent
Update multiple components in a single request with optional error handling
Create a new component on a page from an allowlisted component type
Create a new cq:Page at the specified parent path using a template
Initiate a workflow request for activation or other workflows
Unpublish a page from the replication agent
Delete an asset from the DAM
Output schemas not documented. Tools are registered with inputSchema but no visible outputSchema declarations or return type descriptions. LLMs cannot plan downstream calls without knowing what fields will be returned.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in schema registration. Despite risk labels in catalog, annotations are not passed to server.registerTool().
Error handling lacks recovery guidance. No evidence of error responses that tell LLMs what to try next (e.g., 'Channel not found. Try search_users() with a partial name.').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 75 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Delete a component from a page
Delete a page at the specified path
Retrieve available locales for a language master
Retrieve language master pages for a site
Retrieve all sites from the AEM sites root
Extract all text content from a page and its components
Retrieve metadata of an asset
Retrieve the full content tree of a page with optional depth limit
Extract all image references from a page and its components
Retrieve metadata and properties of a page
Retrieve the structure and policies of a template
Retrieve available templates for a site or global templates
Retrieve version history of a page or asset
List child resources of a given path
List pages within a site root with optional depth and limit
Restore a resource to a specific version
Scan a page and return all components with their resource types and properties
Search for content using QueryBuilder with path, type, and custom predicates
Update metadata of an existing asset
Update properties of an existing component with optional optimistic locking
Upload a new asset to the DAM with optional metadata
Object-type parameters ('properties', 'predicates', 'metadata', 'payload') lack structured schema definitions. Callers do not know what keys are valid, required, or expected types.
Tool descriptions are functional but terse (average 65-75 chars). Missing WHEN-to-use context that helps LLMs distinguish similar tools (e.g., getPageContent vs getPageProperties, activatePage vs createWorkflowRequest).
searchContent accepts free-form 'predicates' parameter (object) without guidance on what QueryBuilder predicates are valid or how to structure them. LLM must guess or know AEM internals.
uploadAsset 'fileName' parameter lacks max-length constraint and does not explain why certain characters are forbidden beyond the brief description.
bulkUpdateComponents response does not clarify per-item success/failure structure. If one update fails, does the entire batch fail or does it return partial results?