{
  "markdown": "# AEM MCP Server (aem-mcp-server)\r\n\r\n[![Version](https://img.shields.io/npm/v/aem-mcp-server.svg)](https://npmjs.org/package/aem-mcp-server)\r\n[![Release Status](https://github.com/easingthemes/aem-mcp-server/actions/workflows/release.yml/badge.svg)](https://github.com/easingthemes/aem-mcp-server/actions/workflows/release.yml)\r\n[![CodeQL Analysis](https://github.com/easingthemes/aem-mcp-server/actions/workflows/codeql-analysis.yml/badge.svg?branch=main)](https://github.com/easingthemes/aem-mcp-server/actions/workflows/codeql-analysis.yml)\r\n[![semver: semantic-release](https://img.shields.io/badge/semver-semantic--release-blue.svg)](https://github.com/semantic-release/semantic-release)\r\n[![AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](LICENSE)\r\n\r\n\r\n\r\nAEM MCP Server is a full-featured Model Context Protocol (MCP) server for Adobe Experience Manager (AEM). \r\nIt provides a simple integration with any AI Agent.\r\nThis project is designed for non-technical persons who want to manage AEM via natural language.\r\n\r\n---\r\n\r\n## Overview\r\n\r\n- **Manage your AEM instance with natural language** — content, components, assets, workflows\r\n- **Works with any MCP-compatible client:**\r\n  - **AI IDEs** — Cursor, VS Code + Copilot, Windsurf, Cline, JetBrains AI Assistant, Zed\r\n  - **CLI agents** — Claude Code, GitHub Copilot CLI, Gemini CLI, Amazon Q CLI\r\n  - **Chat & desktop apps** — Claude Desktop, ChatGPT Desktop, Goose\r\n- **Supports both AEMaaCS and self-hosted AEM instances**\r\n- **Two transport modes** — stdio via `npx` (recommended, zero install) and streamable HTTP\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n### Prerequisites\r\n- Node.js 20.19.0+ || 22.12.0+ || 23+\r\n- Access to an AEM instance (local or remote)\r\n\r\n### Stdio Transport (recommended)\r\n\r\nNo installation needed — the AI agent downloads and spawns the process automatically via `npx`.\r\n\r\nAdd to your project's MCP config (`.mcp.json`, `.vscode/mcp.json`, `.cursor/mcp.json`, etc.):\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"AEM\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"aem-mcp-server\", \"-t\", \"stdio\", \"-H\", \"http://localhost:4502\", \"-u\", \"admin\", \"-p\", \"admin\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> **Secrets:** Since MCP config files are typically committed to the repo, avoid hardcoding credentials. Use your client's env var syntax instead:\r\n>\r\n> | Client | Syntax |\r\n> |---|---|\r\n> | Claude Code (`.mcp.json`) | `${AEM_PASSWORD}` or `${AEM_PASSWORD:-admin}` |\r\n> | VS Code / Copilot | `${input:aem-password}` (prompts securely) or `envFile` |\r\n> | Cursor | `${env:AEM_PASSWORD}` |\r\n>\r\n> Example with env var references (Claude Code):\r\n> ```json\r\n> {\r\n>   \"mcpServers\": {\r\n>     \"AEM\": {\r\n>       \"command\": \"npx\",\r\n>       \"args\": [\"-y\", \"aem-mcp-server\", \"-t\", \"stdio\", \"-H\", \"${AEM_HOST:-http://localhost:4502}\", \"-u\", \"${AEM_USER:-admin}\", \"-p\", \"${AEM_PASSWORD:-admin}\"]\r\n>     }\r\n>   }\r\n> }\r\n> ```\r\n\r\n### Streamable HTTP Transport (alternative)\r\n\r\nFor scenarios where you need a persistent server (shared team server, multiple clients connecting simultaneously, etc.), install globally and start the server manually:\r\n\r\n```sh\r\nnpm install aem-mcp-server -g\r\naem-mcp -H=http://localhost:4502 -u=admin -p=admin\r\n```\r\n\r\nThen point your AI agent to the URL:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"AEM\": {\r\n      \"url\": \"http://127.0.0.1:8502/mcp\"\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n[![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=AEM&config=eyJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjg1MDIvbWNwIn0%3D)\r\n\r\n### Configuration\r\n\r\n```\r\nOptions:\r\n      --version    Show version number                                 [boolean]\r\n  -H, --host                         [string] [default: \"http://localhost:4502\"]\r\n  -u, --user                                         [string] [default: \"admin\"]\r\n  -p, --pass                                         [string] [default: \"admin\"]\r\n  -i, --id         clientId                               [string] [default: \"\"]\r\n  -s, --secret     clientSecret                           [string] [default: \"\"]\r\n  -m, --mcpPort                                         [number] [default: 8502]\r\n  -t, --transport  Transport mode: http (default) or stdio\r\n                           [string] [choices: \"http\", \"stdio\"] [default: \"http\"]\r\n  -I, --instances  Named AEM instances: \"local:http://localhost:4502:admin:admin\r\n                   ,qa:https://qa.example.com:user:pass\"  [string] [default: \"\"]\r\n  -h, --help       Show help                                           [boolean]\r\n```\r\n\r\n**Authentication:**\r\n- For **AEMaaCS**, use `clientId` and `clientSecret` for OAuth S2S authentication. [More info](https://developer.adobe.com/developer-console/docs/guides/authentication/ServerToServerAuthentication/implementation).\r\n- For **self-hosted AEM**, use `user`/`pass`. Default credentials are `admin:admin`.\r\n\r\n**Multi-instance:** Connect to multiple AEM instances simultaneously:\r\n```sh\r\naem-mcp --instances \"author:http://localhost:4502:admin:admin,publish:http://localhost:4503:admin:admin\"\r\n```\r\nAll tools will get an `instance` parameter to target a specific instance.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- **57 MCP Tools** covering pages, components, assets, workflows, content fragments, and experience fragments\r\n- **MCP Resources** — agents discover components, sites, templates, and workflow models upfront via `resources/list`, eliminating discovery roundtrips\r\n- **Tool Annotations** — every tool tagged with `group`, `readOnly`, and `complexity` so agents can make smarter tool selection decisions\r\n- **Response Verbosity** — `verbosity` parameter (`summary`/`standard`/`full`) on content-reading tools strips JCR internals and truncates long text\r\n- **Actionable Errors** — error responses include `suggestion` and `alternatives` fields for self-healing agent workflows\r\n- **Component Operations**: Update, scan, add, convert, and bulk-manage AEM components (including Experience Fragments)\r\n- **Content & Experience Fragments**: Full CRUD + variation management for both CF and XF, plus server-side JSON-string field merging (`manageContentFragment` action `mergeJsonField`) for CFs that store a whole key→value map inside one JSON-encoded field\r\n- **Advanced Search**: QueryBuilder, fulltext, fuzzy, and enhanced page search\r\n- **Replication & Workflows**: Publish/unpublish content, start/advance/delegate workflow stages\r\n- **Text & Image Extraction**: Extract all text and images from pages, including fragments\r\n- **Template & Structure Discovery**: List templates, analyze page/component structure\r\n- **Multi-instance**: Connect to multiple AEM instances simultaneously; tools and resources are instance-aware\r\n- **Security**: Basic auth and OAuth S2S, environment-based config, safe operation defaults\r\n\r\n---\r\n\r\n## Usage\r\n\r\nOnce configured in your AI IDE, just ask in natural language:\r\n\r\n```\r\nList all components on MyPage\r\n```\r\n\r\n### Merging into a JSON-string field\r\n\r\nSome Content Fragments store an entire key→value map inside a single field as a JSON-encoded\r\nstring. To upsert a few keys without round-tripping the whole blob, use the `mergeJsonField`\r\naction — the read-merge-write happens server-side:\r\n\r\n```jsonc\r\n{\r\n  \"action\": \"mergeJsonField\",\r\n  \"fragmentPath\": \"/content/dam/<site>/.../labels\",\r\n  \"field\": \"CFMValue\",                 // the field holding the JSON string\r\n  \"jsonPointer\": \"/0/content/0/value\", // RFC-6901 pointer to the object to merge into (\"\" = field root)\r\n  \"merge\": { \"search\": \"Search\", \"clear_search\": \"Clear search\" },\r\n  \"variation\": \"master\"                // default: master\r\n}\r\n```\r\n\r\nNew keys are added, existing keys overwritten (deep-merge), and untouched keys preserved. The\r\nresponse reports the keys added/overwritten and the before/after key count at the pointer.\r\n\r\n## MCP Resources\r\n\r\nThe server exposes read-only MCP resources so agents can discover AEM catalogs without tool calls:\r\n\r\n| Resource URI | Description |\r\n|---|---|\r\n| `aem://{instance}/components` | All components (name, resourceType, title, group) |\r\n| `aem://{instance}/sites` | Site roots and language structure under /content |\r\n| `aem://{instance}/templates` | Available page templates (path, title) |\r\n| `aem://{instance}/workflow-models` | Workflow models (ID, title, description) |\r\n\r\nResources return summary data only. In multi-instance mode, each instance gets its own set of resource URIs.\r\n\r\n## API Documentation\r\n\r\nFor detailed API documentation, please refer to the [API Docs](docs/API.md).\r\n\r\n## Similar Projects\r\n\r\n1. https://github.com/easingthemes/aem-mcp-server (Used as a base for this project)\r\n1. https://github.com/indrasishbanerjee/aem-mcp-server (Used as a base for #1)\r\n1. https://www.npmjs.com/package/@myea/aem-mcp-handler (Looks like an original source of #2)\r\n",
  "bytes": 8768,
  "sha": "19e2e111998f9ab63419243709c75bd07c555a2a31fb21f3a07a38cb5a66335a",
  "repo_slug": "easingthemes/aem-mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_easingthemes_aem_mcp_server_3a461dde/readme"
}