Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Validate and run Groovy scripts on Adobe Experience Manager through AEM Content Manager (ACM).
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
ACM_CONFIG_FILE, ACM_CONFIG「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"acm": {
"command": "npx",
"args": [
"-y",
"@wppes/acm-mcp-server"
],
"env": {
"ACM_CONFIG_FILE": "your-value",
"ACM_CONFIG": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add acm --env ACM_CONFIG_FILE=your-value --env ACM_CONFIG=your-value -- npx -y @wppes/acm-mcp-server動かす前に、空欄の値を入力してください。
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"acm": {
"command": "npx",
"args": [
"-y",
"@wppes/acm-mcp-server"
],
"env": {
"ACM_CONFIG_FILE": "your-value",
"ACM_CONFIG": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"acm": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@wppes/acm-mcp-server"
],
"env": {
"ACM_CONFIG_FILE": "your-value",
"ACM_CONFIG": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月6日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント wttech で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:ACM_CONFIG_FILE, ACM_CONFIG
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.1.4)がレジストリに届いたのは24 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, HotCodePush
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Manage over-the-air (OTA) updates for React Native, Expo, Capacitor and Cordova apps.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
A Model Context Protocol server that connects AI agents (Claude Code, Claude Desktop, VS Code, Cursor and other MCP clients) to AEM Content Manager (ACM) running on Adobe Experience Manager, including AEM as a Cloud Service.
An agent can validate and run Groovy scripts on AEM through ACM, follow long-running executions, read execution history and console output, and browse the scripts stored on the instance — on any of the configured instances, so it can also compare author against publish or against another environment. Every call runs as the user whose credentials you configure.
graph LR
client["MCP client (Claude, ...)"] <-- "stdio (MCP)" --> server["acm-mcp-server (your machine)"] server <-- "HTTPS" --> aem["AEM instances + ACM /apps/acm/api/*.json"]
[!WARNING]
This server lets an AI agent run arbitrary Groovy code on AEM with your permissions. Read Security before pointing it at a shared or production instance.
[!TIP]
Using VS Code? The ACM extension bundles this server and registers it for all enabled instances, with credentials from VS Code's secret storage. No setup below is needed — and ACM: Export MCP Config writes a ready config file for other agents.
history: false) needs ACM 0.9.74 or later.The server is configured by a JSON document using the same keys as the VS Code extension settings, including the acm. prefix — a block copied from settings.json is a valid config:
{
"acm.instances": [ { "name": "local-author", "url": "http://localhost:4502", "authMode": "basic", "user": "admin" }, { "name": "local-publish", "url": "http://localhost:4503", "authMode": "basic", "user": "admin" }, { "name": "dev", "url": "https://author-pXXXX-eYYYY.adobeaemcloud.com", "authMode": "bearer", "secret": { "env": "ACM_DEV_TOKEN" }, "readonly": true }, { "name": "prod", "url": "https://author.example.com", "authMode": "cookie", "secret": { "file": "~/.config/acm/prod.cookie" }, "enabled": false } ], "acm.activeInstance": "local-author", "acm.http.timeout": 30000, "acm.run.timeout": 120000, "acm.run.pollInterval": 1000 }
The timeout keys are optional; their defaults are shown. Unknown keys are ignored, so a whole settings block can be pasted.
Instance fields:
| Field | Description |
|---|---|
name | Unique name; tools take it as the optional instance argument. |
url | AEM URL, author or publish, e.g. http://localhost:4502. |
authMode | bearer, cookie or basic. |
user | Basic-auth user (required for basic). |
secret | The credential — see Secrets. Omitted for a local admin/admin SDK. |
readonly | true disables the tools that run or abort code on this instance. Recommended for production; see Security. |
enabled | false hides the instance from all tools, e.g. to park prod temporarily (default true). |
Choosing credentials:
authMode | When to use | How to get the secret |
|---|---|---|
bearer | AEM as a Cloud Service (recommended) | Cloud Manager → Developer Console of the environment → Integrations → Local token → "Get Local Development Token". Valid for 24 hours and acts as your user. |
cookie | AEM as a Cloud Service, quick start; any instance you can log into | Value of the login-token cookie (DevTools → Application → Cookies) after logging into AEM. CSRF tokens are handled for you. |
basic | Local AEM SDK, on-premise | Usually admin / admin. |
The login-token cookie expires after about 12 hours; use secret: { "file": "path" } to refresh it without restarting the server.
secret is the bearer token, the login-token cookie (value or name=value) or the basic-auth password, given as:
chmod 600); the server warns when it is not.{ "env": "NAME" } — read from an environment variable of the server process. Nothing is written to the config file.{ "file": "path" } — ~ is expanded and a relative path resolves against the config file. Re-read on every request, so refreshing a token on disk needs no restart. A missing or empty file fails only that instance.Basic auth with user admin on a local URL defaults to password admin, so the local SDK needs no secret at all.
Every MCP client needs the same things. Where they go and in which format depends on the client, so this guide does not list client-specific files:
| Setting | Value |
|---|---|
| Transport | stdio |
| Command | npx |
| Arguments | -y, @wppes/acm-mcp-server |
| Environment | ACM_CONFIG_FILE with the path from step 1 |
Instead of ACM_CONFIG_FILE you can pass the document inline as ACM_CONFIG; it takes precedence over the file.
The easiest way is to ask your agent, which knows its own configuration:
Add the ACM MCP server to this tool's MCP configuration: transport stdio, command
npx, arguments-y @wppes/acm-mcp-server, environmentACM_CONFIG_FILEpointing at a JSON file with the ACM instances I list below. Keep secrets out of that file — reference environment variables or files instead — and never write them into a file that may be committed; tell me where to put the values. Find in this tool's documentation where MCP servers are configured and in which format. Then callacm_list_instancesandacm_healthto verify.
Ask the agent to call acm_list_instances, then acm_health. The first shows every enabled instance with its auth mode and whether credentials are configured; the second reports the state ACM reports for each of them.
Tools act on exactly one instance, chosen like this:
instance argument, when given — it must name an enabled instance;acm.activeInstance, when it names an enabled instance;If acm.activeInstance names an unknown or disabled instance (a typo, say), the server warns on stderr at startup and acm_list_instances repeats the warning, so the agent can tell you; the rules above then apply as if it were unset.
acm_list_instances shows which instance is active and which have credentials. Write tools (acm_run_code, acm_abort_execution, acm_describe_inputs) always act on exactly one instance — there is deliberately no run-everywhere call. To compare instances (e.g. author vs publish drift), run the same read-only code on each and diff the results; the bundled scripting guide covers the pattern. This needs ACM reachable on both sides, which works on local, on-premise and AMS (direct publish URL) — an AEMaaCS publish is not reachable.
| Tool | Description |
|---|---|
acm_list_instances | List the enabled instances: name, URL, auth mode, read-only flag, the active one and whether credentials are configured. |
acm_health | Check connectivity, auth and the instance state ACM reports (/apps/acm/api/state.json), with a warning when ACM's health check finds the instance unhealthy. Without instance, checks every enabled instance. Call it first. |
acm_validate_code | Compile-check Groovy without running it (mode=parse). Returns compile errors with line and column. Never recorded in execution history. |
acm_run_code | Queue Groovy for execution, poll until it finishes or times out, and return the status and full console output. Supports inputs for scripts with describeRun(). With history: false it runs synchronously and is not recorded in history (see below). |
acm_get_execution | Get the status, inputs, error and console output of an execution by ID, whether queued, running or archived. |
acm_abort_execution | Abort a queued or running execution. Scripts that call context.checkAborted() stop cleanly. |
acm_list_executions | List execution history, newest first, optionally only queued and running executions. |
acm_list_scripts | List Groovy scripts stored under /conf/acm/settings/script by type (MANUAL, AUTOMATIC, …). |
acm_get_script | Read the Groovy content of a stored script by ID or path. |
acm_describe_inputs | Resolve the inputs a script declares in describeRun(): names, types and defaults. ACM runs describeRun() to do this, so it counts as running code. |
acm_get_output_file | Download a named execution output: console, or an output created with outputs.file(...) / outputs.text(...). |
Every tool takes an optional instance argument; see Instances for the default.
Bare Groovy snippets are wrapped in the canRun()/doRun() structure automatically, so println "hello" is valid input for acm_validate_code and acm_run_code.
Every queued run is stored in ACM execution history, so iterating on a script quickly fills it up. With history: false, acm_run_code calls /apps/acm/api/execute-code.json directly and the run is not recorded. Such a run:
waitMs, while the script may keep running on AEM.Use it for short read-only runs or dry runs while you develop a script. Run the final version, and anything that changes content, with the default history: true so the change stays auditable.
Running without history needs the console/execute/nohistory ACM feature (administrators only by default); without it the call fails with 403. Such runs still appear in ACM's audit log.
The server ships the ACM Groovy scripting skill, so agents write valid, safe scripts without extra setup:
acm-groovy-script returns the full guide.acm://skill/SKILL.md, acm://skill/references/api.md (every ACM variable, class and method, generated from the ACM source), acm://skill/references/scripts.md and the script templates under acm://skill/templates/.Ask the agent something like:
Use ACM to count how many
wknd/components/teasercomponents are under/content/wknd/us/en.
It calls acm_health, then validates and runs a script such as:
boolean canRun() {
return conditions.always() }
void doRun() { def sql = "SELECT * FROM [nt:base] AS n WHERE ISDESCENDANTNODE(n, '/content/wknd/us/en') AND n.[sling:resourceType] = 'wknd/components/teaser'" def count = 0 repo.queryRaw(sql).forEach { resource -> context.checkAborted() count++ } out.info("Found ${count} instance(s)") }
ACM checks access at three levels. The user behind the credentials needs jcr:read on each:
/apps/acm/api;/apps/acm/feature;/conf/acm/settings/script.By default only administrator
冒頭だけを表示しています。続きはリポジトリで読めます