{"id":50515066,"url":"https://github.com/larksuite/aamp","last_synced_at":"2026-06-02T23:03:49.663Z","repository":{"id":353055830,"uuid":"1217775138","full_name":"larksuite/aamp","owner":"larksuite","description":"Mailbox-native protocol and SDKs for asynchronous agent collaboration over email","archived":false,"fork":false,"pushed_at":"2026-05-22T16:29:12.000Z","size":651,"stargazers_count":38,"open_issues_count":0,"forks_count":8,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T20:52:30.336Z","etag":null,"topics":["a2a","agent-protocol","ai-agents","email","jmap","mailbox","protocol","sdk","smtp","workflow"],"latest_commit_sha":null,"homepage":"https://meshmail.ai","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/larksuite.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-22T07:53:09.000Z","updated_at":"2026-05-22T16:30:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/larksuite/aamp","commit_stats":null,"previous_names":["larksuite/aamp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/larksuite/aamp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larksuite%2Faamp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larksuite%2Faamp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larksuite%2Faamp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larksuite%2Faamp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/larksuite","download_url":"https://codeload.github.com/larksuite/aamp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larksuite%2Faamp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33840218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","agent-protocol","ai-agents","email","jmap","mailbox","protocol","sdk","smtp","workflow"],"created_at":"2026-06-02T23:03:48.931Z","updated_at":"2026-06-02T23:03:49.650Z","avatar_url":"https://github.com/larksuite.png","language":"TypeScript","funding_links":[],"categories":["🔗 Related Protocols \u0026 Concepts"],"sub_categories":[],"readme":"# AAMP\n\n[中文版](./README.zh-CN.md)\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-f0c040?style=flat-square)](./LICENSE)\n![Protocol AAMP 1.1](https://img.shields.io/badge/protocol-AAMP%201.1-111827?style=flat-square)\n![SDKs Node.js | Python | Go](https://img.shields.io/badge/SDKs-Node.js%20%7C%20Python%20%7C%20Go-2563eb?style=flat-square)\n![Go \u003e=1.21](https://img.shields.io/badge/go-%3E%3D1.21-0ea5e9?style=flat-square)\n![Python \u003e=3.10](https://img.shields.io/badge/python-%3E%3D3.10-0f766e?style=flat-square)\n\n`AAMP` stands for `Agent Asynchronous Messaging Protocol`.\n\nAAMP is an open protocol for asynchronous task collaboration between independent participants over ordinary mailbox infrastructure, especially for platform-to-agent and agent-to-agent scenarios.\n\nA mailbox identity gives an agent an address. AAMP adds the collaboration layer on top of that address: a small shared task vocabulary, machine-readable headers, and a portable discovery model so agents, workflows, and human operators can coordinate without sharing one runtime or one proprietary API.\n\nIt combines:\n\n- `SMTP` for durable message delivery\n- `JMAP` for mailbox sync, push, and attachment retrieval\n- structured `X-AAMP-*` headers for machine-readable task lifecycle\n\nThis repository contains the protocol definition and portable tooling around it. It does not require a custom mail server or a forked mail stack.\n\nThe canonical protocol document is [docs/AAMP_CORE_SPECIFICATION.md](./docs/AAMP_CORE_SPECIFICATION.md).\n\n## Why AAMP Exists\n\nMost agents today are still trapped inside one chat product, workflow engine, or vendor-specific runtime. That makes them hard to address independently and even harder to coordinate across system boundaries.\n\nIn many real deployments, the immediate problem is even more concrete: a workflow product needs to hand work to a local or sandboxed agent runtime, but that runtime cannot expose a public webhook or maintain a custom inbound API surface. The result is brittle glue services, bespoke adapters, or a hard dependency on one centralized platform.\n\nMailbox identity solves only part of the problem. It tells other participants where an agent can be reached, but not how work should be dispatched, how a blocked agent should ask for clarification, or how a result becomes authoritative and auditable.\n\nAAMP fills that gap by treating the mailbox thread as the control plane for work:\n\n- a dispatcher sends `task.dispatch`\n- an executor can acknowledge with `task.ack`\n- a blocked executor can escalate with `task.help_needed`\n- a final outcome returns through `task.result`\n- optional streaming can expose live progress without replacing the authoritative thread\n\nThat is the key shift in perspective: mailbox identity is the reachability layer, while AAMP is the collaboration layer built on top of it.\n\nIt is also why AAMP is deliberately mailbox-native rather than chat-native: mail is already decentralized, durable, globally routable, and extensible through headers, whereas proprietary IM systems usually collapse identity, transport, and application policy into one closed stack.\n\n```mermaid\nflowchart LR\n    A[\"Workflow / Dispatcher\"] --\u003e|\"task.dispatch\"| B[\"AAMP Task Thread\"]\n    B --\u003e C[\"Agent / Worker Runtime\"]\n    C --\u003e|\"task.ack\"| B\n    C --\u003e|\"task.help_needed\"| D[\"Human / Policy Owner\"]\n    D --\u003e|\"reply in thread\"| B\n    C --\u003e|\"task.result\"| B\n    B --\u003e A\n    E[\"SMTP\"] --- B\n    F[\"JMAP push + sync\"] --- B\n    G[\"X-AAMP-* headers\"] --- B\n```\n\n## Architecture\n\nAAMP keeps strict separation between transport, semantics, and application integration.\n\n```mermaid\nflowchart LR\n    subgraph L1[\"Transport Layer\"]\n        direction TB\n        T1[\"Standards-compliant mail server\"]\n        T2[\"SMTP delivery\"]\n        T3[\"JMAP sync / push / blob access\"]\n    end\n\n    subgraph L2[\"AAMP Semantics Layer\"]\n        direction TB\n        S1[\"Lifecycle intents\"]\n        S2[\"X-AAMP-* headers\"]\n        S3[\"/.well-known/aamp discovery\"]\n    end\n\n    subgraph L3[\"Runtime and Integration Layer\"]\n        direction TB\n        R1[\"SDKs: Node.js / Python / Go\"]\n        R2[\"CLI and worker runtimes\"]\n        R3[\"Workflow bridges, plugins, operator tools\"]\n    end\n\n    L1 --\u003e L2 --\u003e L3\n```\n\n- Transport layer: AAMP rides on ordinary mail infrastructure. Reference deployments commonly use a JMAP-capable server such as Stalwart, but the protocol stays transport-agnostic as long as required headers, threading, and retrieval semantics are preserved.\n- Semantics layer: AAMP standardizes the task lifecycle on the wire while keeping human-readable instructions and outputs in the message body.\n- Runtime layer: SDKs and integration packages hide protocol details from application code and let products treat AAMP as a task fabric instead of a raw mailbox API.\n- Deployment principle: extend the mail stack from the outside through standards, admin APIs, filters, hooks, or mail rules rather than by forking the server core.\n\n## Design Goals\n\nAAMP is designed to solve three adoption problems at once:\n\n- Identity: each agent gets a standard mailbox endpoint that other participants can address without vendor-specific session wiring.\n- Semantics: structured headers remove ambiguity about whether a message is a new task, a cancellation, a clarification request, or a terminal result.\n- Onboarding: SDKs, CLI tools, and bridges make it possible to connect local agent runtimes, workflow products, and operator tools without building custom glue services first.\n\nThis combination matters because protocol adoption fails when any one of these layers is missing. Identity without semantics is just another inbox. Semantics without tooling is a whitepaper. Tooling without open transport recreates a proprietary platform.\n\n## What AAMP Standardizes\n\nThe core protocol is intentionally small. It standardizes the minimum shared contract needed for interoperable async collaboration:\n\n- `task.dispatch`\n- `task.cancel`\n- `task.ack`\n- `task.help_needed`\n- `task.result`\n- `task.stream.opened`\n- `pair.request`\n- `pair.respond`\n- `card.query`\n- `card.response`\n\nThis keeps the wire protocol stable while allowing specific deployments to add helper surfaces such as mailbox registration, directory APIs, workflow writeback, or runtime compatibility profiles.\n\nTypical use cases:\n\n- dispatching work from one agent runtime to another\n- routing work from workflow systems into external agents\n- dispatching tasks from workflow nodes to local agents that cannot expose public callback endpoints\n- letting blocked agents ask humans or policy owners for clarification through `task.help_needed`\n- connecting terminal operators to mailbox-native tasks\n- bridging ACP-compatible runtimes into a shared task network\n- returning structured outputs and files through a standard message thread\n\n## Pairing Code\n\nPairing code is AAMP's first-contact authorization flow. It solves a practical onboarding problem: a local agent, bridge, plugin, or registered-command node may already have a mailbox identity, but an ordinary user should not have to edit sender-policy JSON or expose a public webhook before sending the first task.\n\nThe receiver generates a short-lived one-time code and publishes it as an `aamp://connect` URL. The consumer parses the URL, sends `pair.request` to the receiver mailbox, and the receiver only writes the requester into sender policy after validating the code. `pair.request` is the only intent that may bypass normal sender policy, and that bypass is limited to this one-time-code check.\n\n```text\naamp://connect?mailbox=agent@meshmail.ai\u0026pair_code=\u003cbase64url-code\u003e\naamp://connect?mailbox=agent@meshmail.ai\u0026pair_code=\u003cbase64url-code\u003e\u0026dispatch_context_rules=\u003cbase64url-json\u003e\n```\n\n- **Generation**: SDK helpers generate six random bytes encoded as base64url by default, persist the mailbox, code, connect URL, expiry, and optional dispatch-context rules, and use a five-minute TTL in the reference implementation. CLI, ACP Bridge, CLI Bridge, and OpenClaw Plugin can render the URL as text and as a terminal QR code.\n- **Consumption**: AAMP App, User UI, `aamp-cli pair`, Feishu Bridge, WeChat Bridge, and the AAMP Skill parse the URL and send mail to `mailbox` with `X-AAMP-Intent: pair.request`, a fresh `X-AAMP-TaskId`, `X-AAMP-Pair-Code`, and optional `X-AAMP-Dispatch-Context-Rules`.\n- **Policy update**: The receiver rejects unknown, expired, or already consumed codes. A valid request adds or updates the requester in sender policy, optionally attaches dispatch-context rules, then consumes the code so it cannot be reused.\n- **Response**: The receiver must answer with `pair.respond` using the same taskId. Success carries `X-AAMP-Status: completed`; failure carries `X-AAMP-Status: rejected` plus `X-AAMP-ErrorMsg`.\n\n## Run AAMP Quickly\n\nIf you want to feel the core AAMP experience end to end, the fastest path is:\n\n1. connect a real agent runtime to AAMP\n2. let the bridge or plugin provision a mailbox identity for that agent\n3. send the agent a `task.dispatch` message from an AAMP-compatible mailbox platform such as `meshmail.ai`\n4. watch the agent execute and reply with `task.result`\n\n### Option 1: Connect a local ACP agent in one step\n\nThis is the recommended first experience if you already have an ACP-compatible agent on your machine, such as `claude`, `codex`, `gemini`, `cursor`, `copilot`, `openclaw`, or another compatible runtime.\n\nInitialize the bridge:\n\n```bash\nnpx aamp-acp-bridge init\n```\n\nThe setup wizard will:\n\n- prompt for an AAMP host such as `https://meshmail.ai`\n- scan your machine for known ACP agents\n- let you choose which installed agents to bridge\n- register mailbox identities for the selected agents\n- write config under `~/.aamp/acp-bridge/config.json` and credentials under `~/.aamp/acp-bridge/credentials/`\n\nStart the bridge:\n\n```bash\nnpx aamp-acp-bridge start\n```\n\nThen open an AAMP-compatible mailbox UI such as `meshmail.ai`, send a `task.dispatch` message to the generated agent mailbox, and wait for the reply. If the agent receives the message, runs the task, and sends a `task.result` email back into the thread, you have a full end-to-end AAMP loop.\n\n### Option 2: Connect a direct CLI agent with CLI Bridge\n\nUse CLI Bridge when the agent is exposed as a command-line program rather than an ACP runtime. Profiles describe the command, args, stdin, environment, working directory, timeout, output cleanup, and optional stream parser.\n\n```bash\nnpx aamp-cli-bridge profile-maker\nnpx aamp-cli-bridge init\nnpx aamp-cli-bridge start\n```\n\nThe setup flow is:\n\n- `profile-maker`: create a custom profile under `~/.aamp/cli-bridge/profiles/` when a built-in profile is not enough\n- `init`: scan built-in, user-created, and already configured profiles; select one or more agents with arrow keys, Space, and Enter\n- `start`: provision or reuse each selected agent mailbox and begin handling `task.dispatch`\n\nBuilt-in profiles include `claude`, `codex`, `gemini`, and `codem`. Streaming profiles can parse SSE or NDJSON output and map standard text, delta, tool, usage, result, and done events into AAMP stream events before sending the final `task.result`.\n\nDefault storage:\n\n- config: `~/.aamp/cli-bridge/config.json`\n- credentials: `~/.aamp/cli-bridge/credentials/\u003cagent\u003e.json`\n- user profiles: `~/.aamp/cli-bridge/profiles/\u003cprofile\u003e.json`\n\n### Option 3: Connect OpenClaw directly\n\n```bash\nnpx aamp-openclaw-plugin init\n```\n\nThe installer will provision an AAMP mailbox for your OpenClaw agent, write the plugin config automatically, and make the agent ready to receive `task.dispatch` mail. From there, the same validation path applies: send the agent a task email from an AAMP-compatible mailbox platform and confirm that a result arrives back in the thread.\n\n### Option 4: Connect a local Feishu bot to an existing agent\n\n```bash\nnpx aamp-feishu-bridge init\nnpx aamp-feishu-bridge start\n```\n\nThis bridge keeps the Feishu app credentials on the user's own machine, provisions a mailbox identity for the bridge itself, and forwards Feishu direct messages or `@Bot` group messages to a target AAMP agent.\n\nEach message turn is sent as a fresh `task.dispatch`, while sticky chat continuity is carried through the standalone `X-AAMP-Session-Key` header. That lets compatible runtimes keep the same underlying agent session across multiple turns without violating the one-task-per-dispatch lifecycle.\n\n### Option 5: Connect a local WeChat bot to an existing agent\n\n```bash\nnpx aamp-wechat-bridge init\nnpx aamp-wechat-bridge login\nnpx aamp-wechat-bridge start\n```\n\nThis bridge keeps WeChat bot credentials on the user's own machine, authenticates through terminal QR scan, and forwards direct-message chat turns to a target AAMP agent. Like the Feishu bridge, every chat turn is a new `task.dispatch`, while sticky conversation continuity is carried through `X-AAMP-Session-Key`.\n\n### Option 6: Build a minimal worker with the SDK\n\nIf you are integrating AAMP into your own runtime instead of bridging an existing agent, start with the SDK:\n\nNode.js:\n\n```ts\nimport { AampClient } from 'aamp-sdk'\n\nconst client = AampClient.fromMailboxIdentity({\n  email: 'agent@example.com',\n  smtpPassword: '\u003csmtp-password\u003e',\n  baseUrl: 'https://meshmail.ai',\n})\n\nclient.on('task.dispatch', async (task) =\u003e {\n  await client.sendResult({\n    to: task.from,\n    taskId: task.taskId,\n    status: 'completed',\n    output: `Finished: ${task.title}`,\n    inReplyTo: task.messageId,\n  })\n})\n\nawait client.connect()\n```\n\nPython:\n\n```python\nfrom aamp_sdk import AampClient\n\nclient = AampClient.from_mailbox_identity(\n    email=\"agent@example.com\",\n    smtp_password=\"\u003csmtp-password\u003e\",\n    base_url=\"https://meshmail.ai\",\n)\n\ndef on_dispatch(task: dict) -\u003e None:\n    client.send_result(\n        to=task[\"from\"],\n        task_id=task[\"taskId\"],\n        status=\"completed\",\n        output=f\"Finished: {task['title']}\",\n        in_reply_to=task[\"messageId\"],\n    )\n\nclient.on(\"task.dispatch\", on_dispatch)\nclient.connect()\n```\n\nGo:\n\n```go\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/aamp/aamp-core/packages/sdks/go/aamp\"\n)\n\nfunc main() {\n\tclient, err := aamp.FromMailboxIdentity(aamp.MailboxIdentityConfig{\n\t\tEmail:        \"agent@example.com\",\n\t\tSMTPPassword: \"\u003csmtp-password\u003e\",\n\t\tBaseURL:      \"https://meshmail.ai\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tclient.On(\"task.dispatch\", func(payload any) {\n\t\ttask := payload.(aamp.ParsedMessage)\n\t\tif err := client.SendResult(aamp.SendResultOptions{\n\t\t\tTo:        task.From,\n\t\t\tTaskID:    task.TaskID,\n\t\t\tStatus:    \"completed\",\n\t\t\tOutput:    \"Finished\",\n\t\t\tInReplyTo: task.MessageID,\n\t\t}); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t})\n\n\tif err := client.Connect(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\n### Option 7: Expose a constrained local command node\n\nIf you need to connect a machine that does not run a long-lived agent runtime,\n`aamp-cli` can expose the local host as a **registered-command node**.\n\nThis mode is intentionally constrained. Instead of accepting free-form natural\nlanguage or arbitrary shell, the node only exposes commands that are\npre-registered locally, each with a fixed executable, working directory,\nargument schema, attachment slots, and sender policy.\n\nTypical setup:\n\n```bash\nnpm install -g aamp-cli\naamp-cli node init\naamp-cli node command add\naamp-cli node policy set --default-action deny --allow-from caller@meshmail.ai --allow-command update_bundle\naamp-cli node serve\n```\n\nFrom another mailbox profile or machine, call the node with:\n\n```bash\naamp-cli node call \\\n  --target worker@meshmail.ai \\\n  --command update_bundle \\\n  --stream full \\\n  --artifact_bundle /path/to/bundle.tar.gz\n```\n\nThe CLI assembles a valid `registered-command/v1` dispatch body, attaches any\nreferenced files, and streams progress back through `task.stream.opened` and\nthe final `task.result`.\n\n### Option 8: Inspect the protocol manually from the CLI\n\nIf you want to inspect the wire protocol directly, the CLI is still useful for manual send/listen flows and debugging:\n\n```bash\nnpm install -g aamp-cli\naamp-cli login\naamp-cli listen\n```\n\nYou can also dispatch messages manually:\n\n```bash\naamp-cli dispatch \\\n  --to agent@meshmail.ai \\\n  --title \"Review this patch\" \\\n  --priority high \\\n  --body \"Please review PR #42 and summarize the risks.\"\n```\n\n## Included Tooling\n\nThis repository provides reusable building blocks for AAMP implementations.\n\nIncluded:\n\n- [packages/sdks/nodejs](./packages/sdks/nodejs)\n- [packages/sdks/python](./packages/sdks/python)\n- [packages/sdks/go](./packages/sdks/go)\n- [packages/aamp-cli](./packages/aamp-cli) for mailbox profiles, local command nodes, and manual protocol inspection\n- [packages/aamp-openclaw-plugin](./packages/aamp-openclaw-plugin)\n- [packages/aamp-acp-bridge](./packages/aamp-acp-bridge)\n- [packages/aamp-cli-bridge](./packages/aamp-cli-bridge)\n- [packages/aamp-feishu-bridge](./packages/aamp-feishu-bridge)\n- [packages/aamp-wechat-bridge](./packages/aamp-wechat-bridge)\n- [skills/aamp](./skills/aamp/SKILL.md) for agent runtimes that consume Skill-style operating instructions\n\n```mermaid\nflowchart TB\n    SPEC[\"AAMP Specification\"] --\u003e NODE[\"SDK: Node.js\"]\n    SPEC --\u003e PY[\"SDK: Python\"]\n    SPEC --\u003e GO[\"SDK: Go\"]\n    NODE --\u003e CLI[\"aamp-cli\"]\n    NODE --\u003e OCP[\"aamp-openclaw-plugin\"]\n    NODE --\u003e ACP[\"aamp-acp-bridge\"]\n    NODE --\u003e CLIB[\"aamp-cli-bridge\"]\n    NODE --\u003e FEI[\"aamp-feishu-bridge\"]\n    NODE --\u003e WX[\"aamp-wechat-bridge\"]\n```\n\n## SDKs and Packages\n\nThe SDK layer is polyglot:\n\n- Node.js: full mailbox runtime with SMTP send + JMAP push receive\n- Python: full mailbox runtime with SMTP send + JMAP push receive\n- Go: full mailbox runtime with SMTP send + JMAP push receive\n\nUse the language-specific SDK that matches your runtime:\n\n- `packages/sdks/nodejs` for Node.js\n- `packages/sdks/python` for Python\n- `packages/sdks/go` for Go\n\n## Build and Test Locally\n\nRun the package you care about directly from this repo.\n\nNode.js:\n\n```bash\ncd packages/sdks/nodejs\nnpm install\nnpm run build\nnpm test\n```\n\nPython:\n\n```bash\ncd packages/sdks/python\npython -m pip install .\npython -m unittest discover -s tests\n```\n\nGo:\n\n```bash\ncd packages/sdks/go\ngo test ./...\n```\n\nCLI:\n\n```bash\ncd packages/aamp-cli\nnpm install\nnpm run build\nnpm test\n```\n\nTo exercise the local command-node workflow:\n\n```bash\ncd packages/aamp-cli\naamp-cli node init\naamp-cli node command add\naamp-cli node serve\n```\n\nOpenClaw plugin:\n\n```bash\ncd packages/aamp-openclaw-plugin\nnpm install\nnpm run build\nnpm test\n```\n\nACP bridge:\n\n```bash\ncd packages/aamp-acp-bridge\nnpm install\nnpm run build\n```\n\nCLI bridge:\n\n```bash\ncd packages/aamp-cli-bridge\nnpm install\nnpm run build\n```\n\nFeishu bridge:\n\n```bash\ncd packages/aamp-feishu-bridge\nnpm install\nnpm run build\n```\n\nWeChat bridge:\n\n```bash\ncd packages/aamp-wechat-bridge\nnpm install\nnpm run build\n```\n\n## Protocol Summary\n\nAAMP uses ordinary mailbox infrastructure plus structured `X-AAMP-*` headers.\n\nCore intents:\n\n- `task.dispatch`\n- `task.cancel`\n- `task.ack`\n- `task.help_needed`\n- `task.result`\n- `task.stream.opened`\n- `pair.request`\n- `pair.respond`\n- `card.query`\n- `card.response`\n\nCommon headers:\n\n- `X-AAMP-Intent`\n- `X-AAMP-TaskId`\n- `X-AAMP-Session-Key`\n- `X-AAMP-Priority`\n- `X-AAMP-Expires-At`\n- `X-AAMP-Stream-Id`\n- `X-AAMP-Pair-Code`\n- `X-AAMP-Dispatch-Context-Rules`\n- `X-AAMP-Dispatch-Context`\n- `X-AAMP-ParentTaskId`\n- `X-AAMP-Status`\n- `X-AAMP-ErrorMsg`\n- `X-AAMP-StructuredResult`\n- `X-AAMP-SuggestedOptions`\n- `X-AAMP-Card-Summary`\n\nFor protocol details, see:\n\n- [docs/AAMP_CORE_SPECIFICATION.md](./docs/AAMP_CORE_SPECIFICATION.md)\n\n## Repository Layout\n\n```text\ndocs/\n  AAMP_CORE_SPECIFICATION.md\n  assets/\npackages/\n  sdks/\n    nodejs/\n    python/\n    go/\n  aamp-cli/\n  aamp-openclaw-plugin/\n  aamp-acp-bridge/\n  aamp-cli-bridge/\n  aamp-feishu-bridge/\n```\n\nExamples in this repo may reference `meshmail.ai` as a compatible AAMP host.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarksuite%2Faamp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flarksuite%2Faamp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarksuite%2Faamp/lists"}