AEM MCP Server
# AEM 6.5 MCP Server
Standalone Node.js [Model Context Protocol](https://modelcontextprotocol.io/) server for **Adobe Experience Manager 6.5 Author**. It does not install anything on AEM.
**Status: pre-production.** Use the [capability matrix](docs/CAPABILITY_MATRIX.md) as the list of supported operations. Release gates are in [docs/adr/0001-standalone-http-mcp.md](docs/adr/0001-standalone-http-mcp.md).
[](https://nodejs.org/)
[](https://experienceleague.adobe.com/)
[](LICENSE)
This project is AGPL-3.0 for open source use. Commercial licensing is described in [COMMERCIAL_LICENSE.md](COMMERCIAL_LICENSE.md).
AEMaaCS is a different product: see [aemaacs-mcp-server](https://github.com/indrasishbanerjee/aemaacs-mcp-server). AEM 6.5 LTS is out of scope.
## What this is
- MCP **stdio** for IDE clients (primary).
- Optional MCP **Streamable HTTP** (`POST /mcp`) with API key or HTTP Basic. **OAuth is out of scope.**
- One typed tool catalog driving both transports.
- Documented AEM 6.5 HTTP only: Granite CSRF, `/bin/wcmcommand`, `/bin/replicate.json`, QueryBuilder, Assets `createasset.html`, Workflow REST.
## What this is not
- Production-ready until CI gates and live Author contract tests pass.
- An AEM package, OSGi service, or RepoInit installer.
- Atomic bulk rollback, JCR-SQL2, MSM rollout, tree activation, or `.infinity.json` dumps.
- An OpenAI/Anthropic/Telegram bot.
## Requirements
- Node.js 20 or 22
- AEM 6.5 Author SP17+ reachable over HTTP(S)
- A technical user that already exists in AEM User Admin ([ACL checklist](docs/AEM_ACL_CHECKLIST.md))
## Quick start (stdio)
```bash
cp .env.example .env
# set AEM_HOST, AEM_SERVICE_USER, AEM_SERVICE_PASSWORD
npm ci
npm run build
npm run mcp
```
Cursor / Claude desktop config:
```json
{
"mcpServers": {
"aem-65": {
"command": "node",
"args": ["/absolute/path/to/dist/mcp/stdio.js"],
"env": {
"AEM_HOST": "http://localhost:4502",
"AEM_SERVICE_USER": "mcp-technical",
"AEM_SERVICE_PASSWORD": "<secret>"
}
}
}
}
```
## Optional HTTP gateway
```bash
export MCP_API_KEY=replace-me
export HTTP_ENABLED=true
npm start
```
- Liveness (no auth): `GET /health/live`
- Readiness (auth): `GET /health/ready`
- MCP: `POST /mcp` (SDK Streamable HTTP)
- Convenience REST: `GET /api/methods`, `POST /api/methods/:name` (same auth; not a substitute for MCP)
Put TLS in front. Bind `HOST=127.0.0.1`. Set `ALLOWED_HOSTS` and `CORS_ORIGINS`.
```bash
curl -sS -H "X-API-Key: $MCP_API_KEY" http://127.0.0.1:3001/api/methods
```
## Configuration
See `.env.example`. Required: `AEM_HOST`, `AEM_SERVICE_USER`, `AEM_SERVICE_PASSWORD`. Production/staging refuse `admin`/`admin` and refuse HTTP without API key or Basic.
Default page resource type is `core/wcm/components/page/v3/page`. Override with `AEM_DEFAULT_PAGE_RESOURCE_TYPE` and `AEM_DEFAULT_CONTAINER` for your project.
## Architecture
```
MCP client → stdio or Streamable HTTP → typed tool catalog
→ validation / path policy / audit → AEM 6.5 HTTP adapter → Author
```
Details: [capability matrix](docs/CAPABILITY_MATRIX.md), [tool reference](docs/TOOLS.md), [operations](docs/OPERATIONS.md), [threat model](docs/THREAT_MODEL.md), [1.x migration](docs/MIGRATION.md).
## Development
```bash
npm ci
npm run lint
npm test
npm run build
```
Live Author tests (optional): `AEM_INTEGRATION=1 npm test`.
## License
AGPL-3.0-or-later. Contact via [LinkedIn](https://www.linkedin.com/in/indrasish/) for commercial licensing.
TDQS
Scored across 48 tools
Most tools have distinct purposes targeting specific AEM operations like page management, asset handling, workflow control, and versioning. However, some overlap exists between 'getPageContent' and 'getAllTextContent'/'getPageTextContent', and between 'listPages' and 'enhancedPageSearch', which could cause minor confusion for agents.
The naming follows a consistent verb_noun pattern throughout (e.g., 'activatePage', 'createComponent', 'getAssetMetadata'), with clear action-object pairs. Minor deviations like 'enhancedPageSearch' (adjective-verb-noun) and 'listMethods' (which doesn't fit the AEM domain) slightly break the pattern but overall maintain good readability.
With 48 tools, the count is excessive for typical MCP server scope, likely overwhelming for agents and increasing complexity. While AEM is a complex system, this many tools suggests poor scoping or fragmentation, as many operations could be consolidated into fewer, more general tools.
The tool set provides comprehensive coverage for AEM content management, including full CRUD operations for pages, components, assets, and versions, plus workflow management, search, and validation. No obvious gaps exist; agents can perform end-to-end tasks without dead ends in this domain.