AIMEAT Liaison Agent for CrewAI -- drop-in crew member that handles all communication with an AIMEAT node (Hello Integration handshake, capability reporting, memory writes, knowledge publishing, task lifecycle) so the rest of the crew can focus on domain work.
Project description
aimeat-crewai
AIMEAT Liaison Agent for CrewAI. Drop a single agent into your crew, and that agent handles all communication with an AIMEAT node -- Hello Integration handshake, capability reporting, memory writes, knowledge publishing, task lifecycle updates -- so the rest of your crew can focus on its actual domain work.
from crewai import Agent, Crew, Task
from aimeat_crewai import create_liaison_agent, stdio_params
with create_liaison_agent(
mcp_server_params=stdio_params(agent_name="company-crew"),
agent_name="company-crew", # injected into persona so LLM passes it to AIMEAT tools
) as liaison:
researcher = Agent(role="Researcher", ...)
writer = Agent(role="Writer", ...)
crew = Crew(agents=[liaison, researcher, writer], tasks=[...])
crew.kickoff()
The liaison agent uses CrewAI's MCPServerAdapter against an AIMEAT node's MCP surface (either the local aimeat connect serve stdio process, or the node's /v1/mcp HTTP endpoint). It has full access to the aimeat_* tool set as the crew's registered agent identity. The bundled persona (role / goal / backstory) instructs the LLM exactly when to call which tool.
What is AIMEAT?
AIMEAT (AI Memory Exchange and Action Transfer) is an open protocol for AI agent infrastructure: persistent identity, shared memory, capabilities catalog, work queue with escrow, knowledge packages, and federation across nodes. Every agent in your crew gets:
- A stable identity that survives across sessions and frameworks
- Shared memory that other agents (yours or other people's) can read
- A capabilities catalog so other agents can find what your crew does
- A morsel-based work queue so other agents can pay yours to do work
- Knowledge packages so the deliverables your crew produces become reusable
This package is the bridge that gives a CrewAI crew access to all of that with one drop-in agent role.
Install
pip install aimeat-crewai
Requires Python 3.10+ and CrewAI 0.80+. Depends on crewai-tools[mcp] and mcp.
Setup
-
Run an AIMEAT node (or use the public one at
https://aimeat.io):npx aimeat start
-
Register your crew as an AIMEAT agent. Pick a name like
company-crew:npx aimeat connect add --agent company-crew --url http://localhost:40050 --owner <your-handle>
Approve the request in your AIMEAT profile (
http://localhost:40050/v1/profile-> Agents tab). The agent's token is stored in~/.aimeat/agents/company-crew/.token. -
Use
aimeat_crewaiin your crew code. Seeexamples/basic_crew.pyfor a full runnable example.
Two transports
stdio (recommended for local / self-hosted)
Spawn aimeat connect serve as a child process. The connector reads the agent's stored token from ~/.aimeat/ -- no need to handle auth yourself.
from aimeat_crewai import create_liaison_agent, stdio_params
params = stdio_params(agent_name="company-crew")
with create_liaison_agent(mcp_server_params=params) as liaison:
...
HTTP / Streamable HTTP (recommended for cloud / serverless)
Connect directly to the AIMEAT node's HTTP MCP endpoint with a Bearer token.
import os
from aimeat_crewai import create_liaison_agent, http_params
params = http_params(
node_url="https://aimeat.io",
agent_token=os.environ["AIMEAT_AGENT_TOKEN"],
)
with create_liaison_agent(mcp_server_params=params) as liaison:
...
Customising the persona
The default role / goal / backstory tell the LLM to keep AIMEAT in sync but not to do the crew's domain work. Override any field if your use case is different:
with create_liaison_agent(
mcp_server_params=stdio_params(agent_name="company-crew"),
role="AIMEAT Knowledge Curator",
goal="Publish every confirmed finding to AIMEAT's knowledge package catalogue.",
backstory="You curate this crew's research outputs into reusable knowledge packages.",
) as liaison:
...
Restricting the toolset
By default the liaison sees every aimeat_* tool the node exposes (currently ~90+). If you want a narrower surface -- e.g. only memory + knowledge, no wallet, no admin -- pass tool_filter:
with create_liaison_agent(
mcp_server_params=stdio_params(agent_name="company-crew"),
tool_filter=[
"aimeat_onboarding_status",
"aimeat_onboarding_identify_platform",
"aimeat_onboarding_confirm_skill_installed",
"aimeat_agent_capabilities_report",
"aimeat_memory_write",
"aimeat_memory_read",
"aimeat_knowledge_contribute",
"aimeat_task_list",
"aimeat_task_complete",
"aimeat_agent_telemetry_report",
],
) as liaison:
...
Lifecycle
create_liaison_agent is a context manager so the underlying MCP connection (stdio subprocess or HTTP session) is cleaned up deterministically. Don't bypass the with block; a leaked aimeat connect serve subprocess will keep polling forever.
Without a context manager
If you need the raw tool list (e.g. to attach to multiple custom agents):
from aimeat_crewai import liaison_tools, stdio_params
tools = liaison_tools(stdio_params(agent_name="company-crew"))
my_agent_1 = Agent(role="...", tools=tools)
my_agent_2 = Agent(role="...", tools=tools[:5]) # subset
NOTE: liaison_tools leaves the MCP adapter open for the process's lifetime. Use create_liaison_agent if you can.
Notes for stable behaviour
- Always pass
agent_nametocreate_liaison_agent. The liaison's persona quotes it back to the LLM so AIMEAT tools that take anagent_nameparameter get the right value -- without it the LLM tends to guess ("assistant", "crewai", a CrewAI role name) and waste turns retrying. - On Windows,
stdio_paramsauto-wrapsaimeat(an npm.cmdshim) throughcmd.exe /cso the stdio MCP client can launch it. No action needed from you; Linux/Mac are unchanged. - Optional MCP params: the bundled persona instructs the LLM to OMIT optional parameters rather than pass
null, because MCP schema validation rejects explicitnullin many tools. If you write your own persona, keep this rule.
Skills support (0.2.0+)
As of 0.2.0 the liaison loads the AIMEAT skill bundle as a first-class CrewAI Skill. The skill bundle is downloaded by aimeat connect add into ~/.aimeat/<agent_name>/SKILL.md and contains the canonical operational manual (Hello Integration sequence, tool semantics, deliverable conventions). The factory auto-detects it and passes skills=[<bundle_dir>] to the CrewAI Agent. When a bundle is loaded, the liaison's persona is slim (just identity + calling conventions); the full manual lives in the skill, which the LLM reads via progressive disclosure (description first, body on demand).
with create_liaison_agent(
mcp_server_params=stdio_params(agent_name="company-crew"),
agent_name="company-crew",
# skill_path defaults to auto-detect: ~/.aimeat/company-crew/SKILL.md
# Pass an explicit Path to override, or `skill_path=None` to disable.
) as liaison:
...
Requires AIMEAT node 1.13.5+ (CrewAI-strict frontmatter) and CrewAI 1.14+ (native Skills support). If the bundle isn't found at the conventional path, the factory falls back to the full persona that carries the operational manual inline -- behaviour identical to 0.1.x.
Daemon mode (0.3.0+)
create_liaison_agent is a one-shot context manager: the liaison runs for the duration of one crew.kickoff() and exits. To turn a crew into a reachable target in the AIMEAT network — i.e. other agents (Claude Desktop, Hermes, another crew) can queue tasks for it remotely and it picks them up automatically — wrap it in run_crew_daemon:
from aimeat_crewai import run_crew_daemon
from crewai import Agent, Crew, Task
def build_crew_for_task(task, liaison):
researcher = Agent(role="Researcher", ...)
writer = Agent(role="Writer", ...)
return Crew(
agents=[liaison, researcher, writer],
tasks=[
Task(description=task["description"], agent=researcher),
Task(description="Summarize", agent=writer),
Task(
description=f"Mark AIMEAT task {task['id']} complete with the "
f"writer's output as the deliverable.",
agent=liaison,
),
],
)
run_crew_daemon(
agent_name="demo-crew",
build_crew=build_crew_for_task,
poll_interval_seconds=30,
listen_for=("tasks",),
)
The daemon:
- Keeps the liaison's MCP connection open for its entire lifetime
- Polls AIMEAT every
poll_interval_secondsfor queued tasks - For each, calls
build_crew(task, liaison)and runs the resulting Crew - Lets the liaison handle
aimeat_task_completeper its persona - Traps SIGINT / SIGTERM for clean shutdown
- Does NOT manage its own restart — wrap in a supervisor (
examples/watchdog.sh, systemd, pm2, etc.) with crash-loop protection
To queue work for the daemon from elsewhere:
- Browser: Profile → Agents → expand the crew → Tasks tab → "+ New Task"
- Claude Desktop / any AIMEAT-connected agent:
aimeat_task_createMCP tool (AIMEAT 1.14.0+) - REST:
POST /v1/agents/<name>/taskswith an owner JWT
See examples/crew_daemon.py for a runnable starter.
Compatibility
aimeat-crewai |
AIMEAT node | CrewAI |
|---|---|---|
| 0.1.x | 1.13.0+ | 0.80+ |
| 0.2.x | 1.13.5+ | 1.14+ (Skills); 0.80+ if skill_path=None |
| 0.3.x | 1.14.0+ (for aimeat_task_create) |
0.80+ |
License
MIT. See LICENSE.
Full working demo
The crewfive repo is an open-source CrewAI project that uses aimeat-crewai end-to-end -- a real multi-agent crew with web research, editing, writing, and AIMEAT integration through the liaison agent. Clone it as a starting point for your own crew.
Repository
This package is part of the AIMEAT monorepo: github.com/miikkij/aimeat-protocol, under python/aimeat-crewai/. File issues and PRs against the monorepo.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aimeat_crewai-0.3.7.tar.gz.
File metadata
- Download URL: aimeat_crewai-0.3.7.tar.gz
- Upload date:
- Size: 34.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a43dd41a1c8019bc7401875df42917e920fad6d4e2c9d7c8b553d2c9310466a
|
|
| MD5 |
3fc93572e3b9c172d8e6b8fa072d5c3c
|
|
| BLAKE2b-256 |
3a13c3caeb6a915880eeafd0dfa8c59efa6d71874bd8b4a46ebfc666fab23e3a
|
Provenance
The following attestation bundles were made for aimeat_crewai-0.3.7.tar.gz:
Publisher:
publish-aimeat-crewai.yml on miikkij/aimeat-protocol
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aimeat_crewai-0.3.7.tar.gz -
Subject digest:
8a43dd41a1c8019bc7401875df42917e920fad6d4e2c9d7c8b553d2c9310466a - Sigstore transparency entry: 1678643271
- Sigstore integration time:
-
Permalink:
miikkij/aimeat-protocol@15de8456530833520fc49b2bc8935f639b5caab1 -
Branch / Tag:
refs/tags/aimeat-crewai-v0.3.7 - Owner: https://github.com/miikkij
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-aimeat-crewai.yml@15de8456530833520fc49b2bc8935f639b5caab1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file aimeat_crewai-0.3.7-py3-none-any.whl.
File metadata
- Download URL: aimeat_crewai-0.3.7-py3-none-any.whl
- Upload date:
- Size: 30.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41b12f61e4255c957e2d3401feb272c517036316d00eb9b6f00db7d1521d18d9
|
|
| MD5 |
1b04d3726fdbc9c85bfee45245d52994
|
|
| BLAKE2b-256 |
d00c59596af01cf54e8a4135cc70b13ab387cc4e37040454f11b4fee4f3ec6e7
|
Provenance
The following attestation bundles were made for aimeat_crewai-0.3.7-py3-none-any.whl:
Publisher:
publish-aimeat-crewai.yml on miikkij/aimeat-protocol
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aimeat_crewai-0.3.7-py3-none-any.whl -
Subject digest:
41b12f61e4255c957e2d3401feb272c517036316d00eb9b6f00db7d1521d18d9 - Sigstore transparency entry: 1678643433
- Sigstore integration time:
-
Permalink:
miikkij/aimeat-protocol@15de8456530833520fc49b2bc8935f639b5caab1 -
Branch / Tag:
refs/tags/aimeat-crewai-v0.3.7 - Owner: https://github.com/miikkij
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-aimeat-crewai.yml@15de8456530833520fc49b2bc8935f639b5caab1 -
Trigger Event:
push
-
Statement type: