Persistent agent memory via ACMI — Profile/Signals/Timeline. 16 tools on Upstash Redis.
One address for any MCP client. You sign in at auth.smithery.ai once, after adding it.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
The coordination backbone for AI agent fleets. Three Redis keys - Profile, Signals, Timeline.
ACMI is the open protocol for persistent agent context. Version v1.5 formalizes Fleet Comms Protocol: atomic pre/post events, wake-directives, handoff-ack chains, and correlation-aware timelines that make multi-agent work auditable instead of anecdotal.
Every entity stores exactly three things an LLM needs to make decisions:
Profile -> who (identity, preferences, stable facts)
Signals -> now (current state, blockers, next action)
Timeline -> then (append-only event log from every source)
The shape is intentionally small:
This repo ships the public ACMI package, the MCP server subpackage, and the docs that keep the fleet aligned:
@madezmedia/acmi - the TypeScript SDK, CLI, and conformance suite.mcp/ - @madezmedia/acmi-mcp, the MCP server for hosts that need direct ACMI access.SPEC.md - canonical protocol spec.CHANGELOG.md - release history, including the v1.5.0 fleet-comms update.docs/ - operator guide, cheatsheet, and protocol notes.The v1.5.0 release aligns the fleet around a shared event language:
source, kind, correlationId, summary event envelope disciplineagent:<id> source naming across the fleetnpm install @madezmedia/acmi
import { createAcmi } from "@madezmedia/acmi";
import { InMemoryAdapter } from "@madezmedia/acmi/adapters/in-memory";
const acmi = createAcmi(new InMemoryAdapter());
await acmi.profile.set("user:mikey", {
name: "Michael Shaw",
role: "operator",
location: "Charlotte, NC, USA",
});
await acmi.signals.set("user:mikey", "current_focus", "ACMI v1.5 fleet sync");
await acmi.timeline.append("user:mikey", {
ts: Date.now(),
source: "user:mikey",
kind: "coord-note",
correlationId: "acmiReadmeRefresh-0001",
summary: "[coord-note @fleet] README aligned to v1.5 and local assets.",
});
import { createAcmi } from "@madezmedia/acmi";
import { UpstashAdapter } from "@madezmedia/acmi/adapters/upstash";
const acmi = createAcmi(
new UpstashAdapter({
url: process.env.UPSTASH_REDIS_REST_URL!,
token: process.env.UPSTASH_REDIS_REST_TOKEN!,
})
);
| Adapter | Use case | Edge-compatible |
|---|---|---|
@madezmedia/acmi/adapters/in-memory | tests, examples, local dev | n/a |
@madezmedia/acmi/adapters/upstash | Vercel, Workers, edge runtimes | yes |
@madezmedia/acmi/adapters/redis | self-hosted Redis / Node | no |
ACMI v1.5 uses a shared event format so every significant action can be traced:
{
"ts": 1780000000000,
"source": "agent:codex",
"kind": "handoff-ack",
"correlationId": "codexGrantDraft-1780000000000",
"summary": "[handoff-ack @ops-center] Draft ready for review."
}
Rules that matter in practice:
[kind-tag @recipient] in summariessource prefixed with agent:, user:, or system:parentCorrelationIdACMI is used across the Mad EZ Media fleet as the common context layer for:
ops-center - orchestration and routingbentley - comms and governancecodex - coding and implementation supporthermes - deep scans and guardian checksandroid-worker - mobile bridge and notificationsMIT - Copyright Michael Shaw / Mad EZ Media