Local-first MCP tools: workflow routing/spec + keyword memory (JSON) with optional toggles.
Project description
agent-supervisor-memory (MCP server)
本目录提供一个 单进程 的 Python MCP server(stdio),默认启用:
workflow_*: 生成最小化 spec(lite/spike/heavy)+ 路由建议(模型/effort)memory_*: 个人记忆(JSON 存储,关键词+tags+key 命名空间检索;无向量数据库/无 embedding)
MCP server ID:agent-supervisor-memory(见 mcp-tools/agent-supervisor-memory/src/agent_supervisor_memory/server.py)。
代码结构(便于加载更小的上下文):
server.py: wiring(组合 config + services + tools)config.py: env/flag 解析(主前缀AGENT_SUPERVISOR_MEMORY_*)services/:dispatch.py/memory_store.py/policy.py/workflow_spec.pytools/:core.py/dispatch.py/memory.py/workflow.pyutils/: env/fs/text helpers(路径推断、tail 截断、verbosity 归一化)
Quickstart
cd mcp-tools/agent-supervisor-memory
poetry install
poetry run agent-supervisor-memory --dispatch-dir "$HOME/.codex/codex-dispatch"
环境变量(优先顺序):
- 推荐前缀:
AGENT_SUPERVISOR_MEMORY_*(如 DISPATCH_DIR / MEMORY_PATH / POLICY_PATH / ENABLED / MEMORY_MAX / VERBOSE / VERBOSITY)
默认存储文件:
- Memory:优先使用“最近的祖先目录中已存在的
.codex/”下的.codex/memory.json;若不存在,则用<cwd>/.codex/memory.json - Policy:同理,默认
.codex/agent-policy.json - Dispatch:
--dispatch-dir指定一个 base 目录,server 会按项目自动分桶:<dispatch-dir>/<project_bucket>/<job_id>/{meta.json,stdout.jsonl,stderr.log,last_message.txt}project_bucket会尽量从codex_dispatch_start(cwd=...)的 cwd 向上推断(优先.codex/,其次.git/),并用 hash 保证稳定且不会太长job_id形如<project_bucket>--<uuid>
说明:Poetry 会统一管理虚拟环境与依赖,避免你本机 shell 的 python/pip alias 干扰。
如何引用(MCP client 注册)
不同 MCP client 的配置方式不同,但核心信息通常是:
command:uvxargs:["agent-supervisor-memory", "...flags"]
工具名引用方式是 tool name,例如:memory_search、workflow_route。
参考配置片段(TOML 风格)
如果你的 client 支持类似下面这种配置(你贴的 exa 例子就是这种风格),可以这样写:
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory", "--dispatch-dir", "/ABS/PATH/TO/.codex/codex-dispatch"]
# 或仅配置 env:AGENT_SUPERVISOR_MEMORY_DISPATCH_DIR=/ABS/...
说明:
[mcp_servers.supervisor_memory]里的supervisor_memory是 client 侧别名,你可以随便取(只要不跟别的 server 重名)。- 是否“唯一”由你的 client 配置决定;PyPI 包名的唯一性是另一层(发布时)。
常用开关
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory", "--dispatch-dir", "/ABS/PATH/TO/.codex/codex-dispatch", "--global-memory", "--global-policy"]
关闭某些能力(默认都是启用):
[mcp_servers.supervisor_memory]
command = "uvx"
args = ["agent-supervisor-memory", "--dispatch-dir", "/ABS/PATH/TO/.codex/codex-dispatch", "--no-memory", "--no-subagents", "--no-policy"]
高级覆盖(一般不需要)
为兼容少数 client 场景,仍保留路径覆盖参数(优先级最高;不建议作为默认配置):
agent-supervisor-memory --dispatch-dir /abs/path/to/codex-dispatch --memory-path /abs/path/to/memory.json --policy-path /abs/path/to/agent-policy.json
每次 tool 调用也可传:
options.enable_memory:true|falseoptions.enable_subagents:true|false
模型与模式(跨模型路由)
本 server 不直接调用模型;它只提供“建议路由”,由你的 Supervisor/Client 负责真正使用什么模型去执行。
policy_get: 读取策略文件workflow_route: 根据任务文本 +mode/effort/auto给出建议的supervisor_model/coder_model/effort
默认配置:
- Supervisor:
codex-5.2 - Coder:
gpt-5.1-codex-max saving:默认effort=mediumefficient:默认effort=medium
如何确认正在使用(VSCode/其他 client)
- 调用
capabilities_get,查看返回里的memory.mode/policy.mode(project|global|disabled)以及落盘path。 - 写入/检索验证:
memory_put写入一条,然后memory_search搜索关键字。
VSCode:自动“主/子模型”分工(推荐)
如果你同时启用了:
mcp__supervisor_memory__*(本 server 的 tools)mcp__codex__codex/mcp__codex__codex-reply(Codex MCP)
那么可以在一个 Supervisor 会话里自动启动 Coder 子会话,并显式指定 coder 使用 model=gpt-5.1-codex-max(或按策略自动选择):
- 生成最小 spec(供 coder 执行):
- 调用
mcp__supervisor_memory__workflow_ensure_spec(输入你的任务文本)
- 获取路由建议(选择 coder 模型与 effort):
- 调用
mcp__supervisor_memory__workflow_route(task_text传上一步的 spec)
- 启动 coder 子会话并执行:
- 调用
mcp__codex__codex,并设置:cwd: 项目根目录model: 上一步返回的coder_modelprompt: spec + 约束(例如:只做必要改动、不要跑 build gate、先做最小校验)
- 迭代直至完成:
- 用
mcp__codex__codex-reply(conversationId为上一步返回)继续
如果 mcp__codex__codex 超时/返回类型不兼容
部分环境下,Codex MCP tool 可能会遇到 tool-call 超时(例如 60s)或 “Unexpected response type”。
此时可以改用本 server 自带的 dispatch 工具:它会在本机启动 codex exec 作为后台任务,并通过轮询查询结果。
流程:
- 启动任务(内部记录
job_id,可按需返回):
- 调用
codex_dispatch_start(model用workflow_route返回的coder_model;cwd为项目根目录;prompt传 spec) - 默认 异步:返回
{state:\"running\", job_id, job_ref}(job_ref为本进程内短句柄);如需 job 目录等完整字段,请传options={\"verbosity\":\"full\"}。 - 如需进一步缩短返回:传
options={\"omit_job_id\":true}(仅保留job_ref);如需路径 artifacts:传options={\"include_artifacts\":true}。 - 如需“阻塞等待”一小段时间:传
options={\"wait\":true,\"max_wait_seconds\":45}(到点仍在运行则返回state:\"running\",避免 tool-call 60s 超时)。 - 为避免大 prompt 导致 UI/context 膨胀:用
prompt_path=\"/abs/path/to/spec.txt\"(或options={\"prompt_path\":\"...\"})替代直接传prompt。 - 支持
options.max_model_reasoning_effort(例如 medium)来限制 codex exec 的推理开销。 - 如项目根目录存在
.codex/structured-request.json,可用options={\"use_project_prompt\":true}让 server 自动读取作为 prompt(避免在参数里携带文本)。
- 轮询结果:
- 调用
codex_dispatch_status(job_id=... 可省略)直到state变为completed|failed(默认仅回传最小字段) - 默认输出最小化:运行/完成返回
{state, message}(message为提取后的“最后一条用户可读消息”,非原始 JSONL);失败返回{state:'failed', exit_code?, message}(message 优先 stderr 摘要);未找到返回{state:'not_found'}。默认不会返回job_id/meta/artifacts/last_message;若需原始 JSONL/full meta,请用options={\"verbosity\":\"full\"}。 - 默认 tail 读取约 2KB 的 stdout/stderr(可通过
stdout_tail_bytes/stderr_tail_bytes调整);需要完整日志时,请使用 full 模式。 job_id参数可选:缺省时自动使用 server 进程内记录的上一次codex_dispatch_startjob;也可用job_ref(短句柄)替代job_id。- 增量轮询(推荐,减少重复 tail):传
stdout_cursor/stderr_cursor(首次传0),并设置stdout_tail_bytes/stderr_tail_bytes作为“本次最多返回的新增字节”;响应会附带cursor={stdout,stderr}与stdout_delta/stderr_delta(如有新增)。 - 默认增量轮询只回
{state,cursor,has_*_delta,*_delta_len};如需实际文本,传options={\"include_deltas\":true,\"delta_max_chars\":1200}。 - 如需原始/完整响应(含
meta/artifacts/last_message等),请传options={\"verbosity\":\"full\"}或options={\"verbose\":true},或在启动 server 时设置AGENT_SUPERVISOR_MEMORY_VERBOSE=1(或AGENT_SUPERVISOR_MEMORY_VERBOSITY=full)。 - summary 游标:
options.include_summary_cursor=true时,codex_dispatch_status输出会附带基于内部增量的summary_cursor(cursor/非 cursor 模式均支持);codex_dispatch_wait_all也会在 summary-only entries 与详细 jobs 中附带summary_cursor,便于增量判断摘要是否更新。 - 批量等待:
codex_dispatch_wait_all(job_ids? , options?)默认 summary-only(返回{state, jobs:[{job_id,state,summary?}], counts?},每个 job 都包含状态及近期 summary;跳过 stdout/stderr tail);若需 jobs 详情/last_message/artifacts,传options={\"summary_only\":false}。options.problem_only=true(可配合options.problem_states,支持 JSON list 或逗号分隔字符串,默认集合为 failed/timeout/not_found/canceled)时 jobs 仅保留问题状态且强制返回 counts;options.include_problem_job_ids=true会额外返回failed_job_ids/timeout_job_ids/not_found_job_ids/canceled_job_ids(以及额外的problem_job_idsmap);options.include_summary_cursor=true让 summary-only entries/详细 jobs 附带summary_cursor。 - 取消任务:
codex_dispatch_cancel(job_id|job_ref)会发送 SIGTERM 并标记 cancel requested;任务退出后状态会变为canceled|failed|completed。 - 事件级增量(推荐,最省 context):
codex_dispatch_events(job_id|job_ref, cursor=0)返回解析后的 stdout.jsonl events(默认已过滤噪声并压缩 text),并用cursor增量拉取;options.max_paths(默认 20,仅 compact 生效)限制file_change事件的paths长度并返回paths_total/paths_extra,text仍展示前 3 个路径并用+N表示剩余数量;如需原始事件对象(不裁剪paths),传options={\"raw\":true}。
兼容性(Compatibility)
保留 MCP_* 路径/开关 与 SUPERVISOR_MEMORY_*(verbosity 只读)的解析,便于旧配置继续工作;新配置请统一使用 AGENT_SUPERVISOR_MEMORY_*。
Tools
capabilities_gethealth_get(快速健康检查,无磁盘 I/O)policy_getmemory_putmemory_searchmemory_deletememory_compact(生成profile.json,把“杂乱记忆”压缩为分类摘要)workflow_ensure_specworkflow_routesubagents_echo(示例)codex_dispatch_start(启动codex exec后台任务)codex_dispatch_status(轮询任务状态/输出)codex_dispatch_cancel(取消后台任务)codex_dispatch_events(增量读取 stdout.jsonl events)
发布到 PyPI(维护者)
PyPI 不允许覆盖已发布的同版本号,所以每次发布前都需要 bump version。
cd mcp-tools/agent-supervisor-memory
# 1) release helper(bump patch + build + publish + 清理 uv/uvx 缓存)
chmod +x scripts/bump_patch_and_clear_uv_cache.sh # 一次即可
./scripts/bump_patch_and_clear_uv_cache.sh [--dry-run] [--verbose] [--testpypi] [--cache-only]
# token:优先用 Poetry 配置(如 `poetry config pypi-token.pypi ...`);也可用环境变量覆盖:`PYPI_TOKEN` / `TESTPYPI_TOKEN`
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 agent_supervisor_memory-0.2.29.tar.gz.
File metadata
- Download URL: agent_supervisor_memory-0.2.29.tar.gz
- Upload date:
- Size: 38.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.14.2 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4779fabc2be9e6bb8d76e2bc2f319885f4c695ef2dee822403cf8c4fbfe4b486
|
|
| MD5 |
1fa359cf5999e3700815c2de4d73361e
|
|
| BLAKE2b-256 |
8f28dad32d4f52e20f51cac46b325d80067133f09ce8c7ee7fcd6bed588bb608
|
File details
Details for the file agent_supervisor_memory-0.2.29-py3-none-any.whl.
File metadata
- Download URL: agent_supervisor_memory-0.2.29-py3-none-any.whl
- Upload date:
- Size: 40.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.14.2 Darwin/24.6.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f934662eee509fed3fb538da1e05b57712d4452cffb44f5cb766c481a8185b23
|
|
| MD5 |
7c0185085dfe926e4618c2942f732045
|
|
| BLAKE2b-256 |
7e83dc9668b1d6f74590d14f93efec3220a1a485ab245aba09f40f33f88cc32a
|