Migrer depuis Mastra
mcpd est une alternative gratuite et auto-hébergée à l’observabilité de Mastra et à ses workflows durables. Cette page dit où il est devant, où il est derrière, et comment migrer.
Ce que c’est
Mastra est un framework d’agents : agents, workflows, mémoire, RAG et observabilité, dans une seule dépendance TypeScript. mcpd est un daemon à côté de votre code : il tient un workflow entre ses étapes et enregistre chacune d’elles, et il vous laisse les modèles, les prompts et les outils. Ce n’est pas un framework autour de votre agent, et il est écrit pour rester en dehors.
Cette différence décide de presque tout ce qui suit. L’observabilité de Mastra connaît votre agent parce qu’elle est dedans. mcpd connaît votre agent parce que votre agent émet de l’OpenTelemetry, ce qui veut dire qu’il vaut aussi pour les services autour de votre agent, et pour des agents qui n’ont jamais été écrits en TypeScript.
Les différences qui comptent
Le corps des étapes reste dans votre processus, dans n’importe quel langage
Les deux font tourner des workflows durables. Chez Mastra, les étapes sont des fonctions TypeScript à l’intérieur du processus Mastra, suspendues et reprises par son stockage. Chez mcpd, la définition est une donnée que tient le daemon, et le corps des étapes est du code que tient votre processus, réclamé un bail à la fois par un protocole HTTP que six SDK parlent et que n’importe quel langage peut parler. Le daemon ne voit jamais un modèle, un prompt ni un secret, et un corps peut changer sans que la définition change.
Ce que le daemon tient, c’est la part qui doit survivre : le curseur, le journal, le budget de tentatives, les timers, et l’attente d’un événement qui peut mettre une semaine à venir. Une exécution survit au processus qui l’a démarrée et au worker qui a servi sa dernière étape. Voir Workflows.
Il reçoit OpenTelemetry au lieu de l’exporter depuis un seul framework
C’est toute la thèse. L’observabilité de Mastra exporte depuis l’intérieur d’une application Mastra, donc ce qu’elle voit est ce que fait cette application, dans le langage où elle est écrite. mcpd est le collecteur : il reçoit de l’OTLP depuis n’importe quel SDK OpenTelemetry, dans n’importe quel langage, sans une ligne de mcpd dans votre application, et il enregistre les services autour de l’agent aussi bien que l’agent.
Il émet aussi de l’OTLP, donc mcpd peut se placer au milieu d’un pipeline que vous avez déjà plutôt qu’au bout d’un pipeline que vous devez construire. Voir Transfert.
Le masquage couvre les six signaux
Le SensitiveDataFilter de Mastra est un processeur de spans. Il
tourne sur les spans et sur rien d’autre : une clé passée à un log
structuré, ou un secret cité dans le motif d’un score ou dans un feedback,
atteint tous les exporteurs sans avoir été masqué.
mcpd masque les spans, les logs, les étiquettes de métriques, les scores, le feedback et les notes d’aspect. C’est actif par défaut, avant toute écriture et avant tout transfert.
Sa correspondance de clés porte de plus sur une sous-chaîne et non sur un
nom exact : awsSecretAccessKey et X-API-Key sont
donc attrapés par les règles secret et x-api-key.
Un jeu de règles qui exige que le nom entier corresponde rate les deux.
Soyons nets sur la limite : le masquage porte sur le nom d’un champ, pas sur la forme de son contenu. Un token collé au milieu d’un prompt, ou dans une URL stockée sous une clé anodine, n’est retiré par aucun des deux outils. Le masquage réduit ce que vous laissez fuir par accident. Ce n’est pas une garantie.
Ce que mcpd ajoute pour ce cas est un scorer, pas un filtre. Le scorer
intégré no_leaked_secret lit la réponse d’une exécution et
reconnaît la forme d’un secret, de sorte qu’une clé arrivée dans une
complétion vous est au moins signalée. Voir
Tests de régression.
-
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.
L’échantillonnage est déterministe
L’échantillonnage par ratio de Mastra appelle Math.random().
Chaque réplique derrière un répartiteur de charge décide donc différemment
de la même trace, et une exécution qui traverse deux services peut être
gardée par l’un et jetée par l’autre.
mcpd hache l’identifiant de trace : chaque instance arrive à la même réponse sans aucune coordination, et une trace gardée l’est en entier. Les indicateurs du daemon atteignent deux stratégies, tout garder et cette fraction déterministe ; une stratégie de queue, qui garderait chaque erreur quel que soit le taux, existe dans le type de politique et n’est pas atteignable en ligne de commande dans cette version. Voir Échantillonnage.
Le reste, en bref
| Domaine | Ce que fait mcpd |
|---|---|
| Déploiement | Un seul binaire statique, avec le stockage et l’interface compilés dedans. Pas de Node, pas de sidecar. |
| Stockage | SQLite pour un portable, Postgres ou ClickHouse pour une équipe. Les trois sont testés sur un vrai serveur en CI. |
| Recherche | Plein texte sur chaque prompt et chaque complétion stockés. |
| Métriques | Agrégées à l’ingestion, avec des quantiles exacts et des exemplars qui ramènent à une exécution. |
| Coût | Tarifé à l’ingestion, puis stocké. Les tokens mis en cache sont facturés à leur propre tarif. Un modèle inconnu reste sans prix plutôt que d’être compté comme gratuit. |
| SDK | TypeScript, Python, Rust, Go, Kotlin et Elixir, générés depuis une seule spécification pour qu’ils ne puissent pas diverger. Chacun porte un constructeur de workflow et un worker. |
| Workflows | Neuf constructions, tenues par le daemon : étapes, tours d’agent, mises en sommeil, attentes d’événement, branches parallèles, foreach, boucles bornées et exécutions filles. Les tentatives, les effets et les limites se règlent par étape. Une suite de conformité sert la même exécution depuis les six langages. |
| Évaluation | Treize scorers déterministes, plus la notation par modèle auprès de n’importe quel endpoint de forme OpenAI. Des datasets capturés depuis des exécutions de production, et une comparaison d’expériences qui rapporte son effectif. |
| Licence | Apache-2.0. Auto-hébergé sans compte, ou hébergé gratuitement sur mcpd.sh. |
Là où mcpd est derrière
Nous le disons ici plutôt que de vous le laisser découvrir, parce qu’une comparaison qui ne liste que des victoires est une publicité.
- Ce n’est pas un framework autour de votre code. Mastra vous donne des agents, la mémoire, le RAG et un routeur de modèles dans une seule dépendance. mcpd vous donne l’exécution durable et son enregistrement, et laisse les modèles, les prompts et les outils à votre code. Si vous voulez une seule dépendance qui fasse tout, c’est Mastra.
- Pas d’exporteurs nommés par fournisseur. Mastra livre des intégrations pour Langfuse, LangSmith, Braintrust, Arize, Datadog et d’autres, nommément. mcpd transfère de l’OTLP, ce qui en atteint la plupart avec une seule implémentation, mais une destination qui ne parle que son propre protocole reste hors de portée.
- Pas de SSO, de SCIM ni de RBAC. L’authentification, ce sont six portées de clé d’API et une liste de projets par clé. Mettez-le derrière le proxy d’identité que vous faites déjà tourner.
Le compte rendu complet, mis à jour au fil des livraisons, est dans PARITY.md.
Migrer
Si votre agent émet déjà de l’OpenTelemetry, ce sont deux variables d’environnement. mcpd parle OTLP sur HTTP, sur les endpoints auxquels tout SDK OpenTelemetry sait déjà s’adresser. Les traces peuvent être en JSON ou en protobuf ; les logs et les métriques doivent être en JSON.
pointer une installation OpenTelemetry existante vers mcpd
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json La ligne du protocole compte. Le port 4317 est par convention celui de gRPC, et mcpd y parle HTTP : un SDK laissé sur son défaut gRPC se connecte au bon port et échoue. OpenTelemetry détaille ce point et le reste des réglages.
Faites tourner les deux pendant quinze jours. mcpd transfère les spans qu’il stocke vers ce que vous utilisiez avant, ce qui vous permet de les comparer sur les mêmes traces plutôt que sur une migration que vous ne pouvez pas annuler. Il ne transfère que les spans : les logs, les métriques, les scores, les retours et les notes d’aspect restent dans mcpd.
garder l’ancienne destination pendant que vous décidez
mcpd serve --forward-endpoint https://your-existing-collector Si votre agent n’émet pas encore d’OpenTelemetry, commencez par la Prise en main, ou choisissez votre langage sous « Instrumenter » dans la barre latérale.
Comment cette comparaison a été faite
Les affirmations sur Mastra qui figurent ici viennent de la lecture de son code source en août 2026, pas de sa documentation et pas d’un banc d’essai. Il n’y a aucun chiffre de performance ici, parce que nous n’en avons mesuré aucun que nous défendrions.
Mastra est activement développé et tout ceci peut cesser d’être vrai. Si vous trouvez quelque chose de périmé, c’est un défaut de cette page : ouvrez une issue et elle sera corrigée.
Ensuite
- Pointer un collecteur existant vers mcpd : OpenTelemetry.
- Ce qui est retiré avant tout stockage : Masquage et conservation.
- Le faire tourner pour une équipe : Docker et Kubernetes.