MCP Server

ACMI ships as a Model Context Protocol server. The hosted path is Streamable HTTP at /api/mcp (17 tools, OAuth 2.1). Local agents use stdio @madezmedia/acmi-mcp. Both talk to Redis by POSTing a JSON command array — Polar HTTPS exec is canonical; Upstash Cloud REST still works as a secondary.

┌──────────────────┐ HTTP / stdio ┌──────────────────┐ POST JSON ┌─────────────────────┐ │ MCP Client │ ◄────────────► │ ACMI MCP │ ◄──────────► │ Polar HTTPS exec │ │ Claude / Cursor │ │ /api/mcp or │ │ /bridge/exec │ │ Smithery / Grok │ │ acmi-mcp stdio │ │ (no trailing slash) │ └──────────────────┘ └──────────────────┘ └─────────────────────┘ Do not append a trailing slash. Do not open native Redis :26379 from Mac or cloud sandboxes.

Canonical Redis

POST https://acmi-redis-u70402.vm.elestio.app/bridge/exec
Authorization: Bearer vm-local-bridge
Content-Type: application/json

["PING"]  →  {"result":"PONG"}

/bridge/exec/ (trailing slash) is a hard 404. Path-style Upstash /GET/key is not implemented.

Hosted MCP (Smithery / Claude.ai)

Endpoint: https://acmi-product.vercel.app/api/mcp
Listing: smithery.ai/servers/madezmediapartners/acmi-mcp

Smithery form values (madez fleet)

upstashRedisRestUrl   = https://acmi-redis-u70402.vm.elestio.app/bridge/exec
upstashRedisRestToken = vm-local-bridge

Field names stay upstashRedisRest* so existing Smithery connections do not break. The values are Polar exec, not Upstash Cloud.

Local stdio (Claude Desktop / Grok / Codex / OpenClaw)

{
  "mcpServers": {
    "acmi": {
      "command": "acmi-mcp",
      "env": {
        "ACMI_BRIDGE_URL": "https://acmi-redis-u70402.vm.elestio.app/bridge/exec",
        "ACMI_BRIDGE_TOKEN": "vm-local-bridge",
        "ACMI_DEFAULT_TENANT": "madez",
        "ACMI_ALLOWED_TENANTS": "madez,client:duane,client:suzanne"
      }
    }
  }
}

UPSTASH_REDIS_REST_URL / _TOKEN pointing at the same Polar exec URL also work. Do not set ACMI_REDIS_HOST.

Tool Reference (17 hosted tools)

1. acmi_profile

Create or update an entity's hard state (name, stage, specs).

Params: namespace id profile (JSON string)

2. acmi_signal

Update AI-synthesized soft state (sentiment, priorities, scores). Mutable, changes frequently.

Params: namespace id signals (JSON string)

3. acmi_event

The workhorse. Log a timestamped event to the timeline. Follows Communication Standard v1.1.

Params: namespace id source summary kind (optional) correlationId (optional)

4. acmi_get

Fetch complete entity context: profile + signals + last 10 timeline events.

Params: namespace id

5. acmi_list

List all entity IDs in a namespace.

Params: namespace

6. acmi_work_create

Create a cross-session project, task, or idea.

Params: id profile (JSON string)

7. acmi_work_event

Log progress on a work item. Optionally bind to a session ID.

Params: id source summary sessionId (optional)

8. acmi_work_signal

Update work item signals (progress, blockers, metrics).

Params: id signals (JSON string)

9. acmi_work_get

Read a work item's full context: profile + signals + timeline (last 50) + sessions.

Params: id

10. acmi_work_list

List all work item IDs.

Params: none

11. acmi_cat

Multi-stream merge view. Combines timeline events from multiple entities, sorted by timestamp. Supports time filtering.

Params: keys (string array) since (e.g. "24h", "7d") limit

12. acmi_spawn

Log an agent session start. Records when an agent boots, with model and session info.

Params: agentId sessionId (optional) modelId (optional)

13. acmi_bootstrap

One-shot agent context bundle. Fetches everything a fresh session needs: profile, signals, active threads, rollup, recent timeline, and spawns.

Params: agentId

14. acmi_active

Track agent thread engagement. Add/remove threads or list current active threads.

Params: agentId action ("add"|"remove"|"list") threadKey role

15. acmi_rollup_set

Write the latest session rollup for an agent (read by acmi_bootstrap).

Params: agentId rollup (JSON string)

16. acmi_delete

Delete an ACMI key. Dry-run by default; pass confirm=true to actually delete. Protected prefixes refused.

Params: key confirm (optional)

17. acmi_search_semantic

Semantic search across fleet coordination history. Returns original correlationIds.

Params: query

Local stdio also exposes acmi_mcp_status and acmi_tenant_list.

Package

{
  "name": "@madezmedia/acmi-mcp",
  "version": "2.0.2"
}

Example: Multi-Agent Coordination

# Agent 1 claims a task
acmi_event("thread", "agent-coordination", "claude-engineer",
  "Claiming README rewrite for batch execution",
  { kind: "coord-claim", correlationId: "lock-readme-1745947200000" })

# Agent 2 sees the claim and defers
acmi_cat(["thread:agent-coordination"], { since: "10m" })
# → sees coord-claim from claude-engineer → defers

# Agent 1 completes the task
acmi_event("thread", "agent-coordination", "claude-engineer",
  "[done] README.md v1.2 — 320 lines",
  { kind: "coord-release", correlationId: "lock-readme-1745947200000" })