从 Mastra 过来
mcpd 是 Mastra 的可观测性和它的持久化工作流的一个免费、自托管的替代。这一页说清它在哪里领先,在哪里落后,以及怎么迁移过来。
这是什么
Mastra 是一个智能体框架:智能体、工作流、记忆、RAG 和可观测性,装在一个 TypeScript 依赖里。mcpd 是一个待在你代码旁边的守护进程:它在步骤之间保住 一条工作流,并记录每一步,把模型、提示词和工具留给你。它不是围着你的智能体 搭起来的框架,而且它就是照着不成为框架写的。
这个差别决定了后面大部分内容。Mastra 的可观测性了解你的智能体,是因为它就在 智能体里面。mcpd 了解你的智能体,是因为你的智能体在发 OpenTelemetry,这也 意味着它对智能体周围的那些服务同样有效,对那些从来不是用 TypeScript 写的 智能体也一样。
要紧的那些差别
工作流的步骤主体留在你的进程里,语言随你
两者都跑持久化工作流。Mastra 的步骤是 Mastra 进程里的 TypeScript 函数,通过 它的存储挂起和恢复。mcpd 的定义是守护进程持有的数据,而它的步骤主体是你的进程 持有的代码,通过一套六个 SDK 都会说、任何语言也都能说的 HTTP 协议,一次领 一个租约地取走。守护进程从不会看到模型、提示词或者凭据,而一个步骤主体可以在 定义不变的情况下改动。
守护进程持有的,是那些必须活下来的部分:游标、流水、重试预算、定时器,以及 一个可能要等上一周才等到的事件等待。一次运行活得比启动它的那个进程久,也 比服务了它最后一步的那个 worker 久。参见 工作流。
它接收 OpenTelemetry,而不是从一个框架里导出
这就是全部论点。Mastra 的可观测性是从一个 Mastra 应用内部导出的,所以它能 看到的就是那个应用做了什么,而且是用它写成的那种语言。mcpd 就是那个 collector:它从任何语言的任何 OpenTelemetry SDK 接收 OTLP,你的应用里不需要 任何 mcpd 代码,而且它记录智能体周围的服务,和记录智能体一样顺手。
它也发出 OTLP,所以 mcpd 可以坐在你已经有的一条流水线中间,而不是坐在一条你 还得先搭起来的流水线末端。参见 转发。
脱敏覆盖全部六种信号
Mastra 的 SensitiveDataFilter 是一个 span 处理器。它只对 span
生效,别的都不管,所以一个传进结构化日志的密钥,或者一段被引在评分理由或
一条反馈里的机密,会原封不动地到达每一个导出器。
mcpd 对 span、日志、指标标签、评分、反馈和方面注释都做脱敏,默认开启, 在写入任何东西之前、也在转发任何东西之前就做。
它的键名匹配还是子串匹配,而不是全名相等,所以 awsSecretAccessKey
和 X-API-Key 会被 secret 和 x-api-key
这两条规则抓住。一套要求整个名字都对上的规则,两个都会漏掉。
这里的界限要说清楚:脱敏匹配的是一个字段的名字,不是它内容的形状。一个被粘 在提示词中间的令牌,或者被塞进一个存在无害键名下的 URL 里的令牌,两个工具 都去不掉。脱敏减少的是你不小心泄露出去的东西。它不是一份保证。
针对那种情况,mcpd 加的是一个评分器,而不是一个过滤器。内置的
no_leaked_secret 读一次运行的答案,按凭据的形状做匹配,所以一个
混进了补全里的密钥,至少会被报给你。参见
回归测试。
-
Decode
OTLP or native, gzip or plain
-
Sample
Decided once, at the root
-
Redact
Before anything is written
-
Price
From the configured price book
-
Store
One transaction per batch
Redaction is stage three, not a cleanup job. A value that a rule matches never reaches storage at all.
采样是确定性的
Mastra 的按比例采样调用 Math.random()。于是负载均衡后面的每一个
副本,对同一条 trace 都会做出不同的决定,而一次跨了两个服务的运行,可能被
一边留下、被另一边丢掉。
mcpd 对 trace id 做哈希,所以每一个实例不用协调就得出同一个答案,被留下的 trace 是整条留下的。守护进程的那些参数能到达两种策略:全都留下,以及这个 确定性的比例;一种不管比例怎么设都会留下每一个错误的尾部策略,在策略类型里 是存在的,但在这个构建里从命令行够不到。参见 采样。
其余的,简短地说
| 方面 | mcpd 怎么做 |
|---|---|
| 部署 | 一个静态二进制,存储和界面都编译在里面。不用 Node,不用 sidecar。 |
| 存储 | 笔记本上用 SQLite,团队用 Postgres 或 ClickHouse。三种都在 CI 里对着一台真实服务器测过。 |
| 检索 | 对每一条存下来的提示词和补全做全文检索。 |
| 指标 | 在摄取时聚合,带精确分位数,还带能回到一次运行的 exemplar。 |
| 成本 | 在摄取时定价并存下来。缓存的 token 按它自己的费率计价。一个未知的模型会被留成没有定价,而不是报成免费。 |
| SDK | TypeScript、Python、Rust、Go、Kotlin 和 Elixir,由同一份规范生成,所以它们不可能各走各的。每一个都带一个工作流构建器和一个 worker。 |
| 工作流 | 九种构造,由守护进程持有:步骤、智能体回合、睡眠、等待事件、并行分支、foreach、有界循环和子运行。重试、副作用和上限都是按步骤设的。一致性套件用全部六种语言服务同一次运行。 |
| 评估 | 十三个确定性评分器,外加对任何 OpenAI 形状端点的模型打分。数据集从生产运行里采集,实验比较会把自己的样本量报出来。 |
| 许可证 | Apache-2.0。可免账号自托管,也可在 mcpd.sh 免费使用托管版。 |
mcpd 落后的地方
写在这里,而不是留给你自己去发现,因为一份只列胜绩的对比是广告。
- 它不是围着你代码的框架。Mastra 在一个依赖里给你智能体、 记忆、RAG 和一个模型路由。mcpd 给你的是持久化的运行和它的记录,把模型、 提示词和工具留给你的代码。如果你想要一个什么都做的依赖,那个依赖是 Mastra。
- 没有点名的厂商导出器。Mastra 逐个点名地带了 Langfuse、 LangSmith、Braintrust、Arize、Datadog 等等的集成。mcpd 转发 OTLP,用一套 实现就能到达其中大多数,但一个只说自家协议的目的地就够不到了。
- 没有 SSO、SCIM 或 RBAC。认证就是六个 API 密钥作用域, 外加每把密钥一份项目清单。把它放在你已经在跑的身份代理后面。
完整的说明,随着东西落地而更新,在 PARITY.md 里。
迁移过来
如果你的智能体已经在发 OpenTelemetry,这就是两个环境变量的事。mcpd 用 HTTP 说 OTLP,端点也正是每一个 OpenTelemetry SDK 早就知道怎么对话的那几个。trace 用 JSON 或 protobuf 都行;日志和指标必须是 JSON。
把已有的 OpenTelemetry 配置指向 mcpd
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json 协议那一行很要紧。按惯例 4317 是 gRPC 端口,而 mcpd 在它上面说 HTTP,所以 一个还停在 gRPC 默认值上的 SDK 会连对端口然后失败。 OpenTelemetry 一页把这一点和其余的设置都讲了一遍。
两边一起跑两个星期。mcpd 会把它存下的 span 转发到你之前在用的东西上,所以你 可以在同样的 trace 上比较它们,而不是在一次没法回头的迁移上比较。它只转发 span:日志、指标、评分、反馈和方面注释都留在 mcpd 里。
在你拿定主意之前保住原来的目的地
mcpd serve --forward-endpoint https://your-existing-collector 如果你的智能体还没有在发 OpenTelemetry,那就从 快速开始着手,或者在 侧栏的“接入”下面挑你的语言。
这份对比是怎么做出来的
这一页上关于 Mastra 的说法,来自 2026 年 8 月读它的源码,不是来自它的文档, 也不是来自跑一次基准测试。这里没有任何性能数字,因为我们没有测出过任何我们 愿意为之背书的数字。
Mastra 在活跃开发中,上面任何一条都可能不再成立。如果你发现了过时的地方, 那就是这一页的缺陷: 提一个 issue, 它会被改正。
接下来
- 把已有的 collector 指向 mcpd: OpenTelemetry。
- 在存下任何东西之前会去掉什么: 脱敏与保留期。
- 给一个团队跑起来: Docker 与 Kubernetes。