[{"data":1,"prerenderedAt":776},["ShallowReactive",2],{"tool-mastra-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":22,"sources":29,"cover":62,"og":63,"expertise":64,"locales":65,"lang":66,"title":69,"description":70,"coverAlt":71,"url":25,"pricing":72,"kind":10,"metaTitle":73,"takeaways":74,"faq":80,"toc":93,"blocks":118,"others":543},"mastra","2026-07-15",11,"agents",[9,10,11,12,13],"TypeScript","Agent framework","Workflows","MCP","Evals",[15,16,17,18,19,20,21],"mastra ai framework","mastra vs langgraph","typescript agent framework","mastra agent framework review","mastra workflows and memory","mastra mcp server","mastra pricing",[23,26],{"name":24,"url":25},"Mastra","https:\u002F\u002Fmastra.ai",{"name":27,"url":28},"Mastra on GitHub","https:\u002F\u002Fgithub.com\u002Fmastra-ai\u002Fmastra",[30,33,36,39,42,45,48,51,54,57,59],{"title":31,"url":32},"Mastra documentation: agents","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fagents\u002Foverview",{"title":34,"url":35},"Mastra documentation: workflows","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fworkflows\u002Foverview",{"title":37,"url":38},"Mastra documentation: memory","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fmemory\u002Foverview",{"title":40,"url":41},"Mastra documentation: MCP","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Ftools-mcp\u002Fmcp-overview",{"title":43,"url":44},"Mastra documentation: guardrails","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fagents\u002Fguardrails",{"title":46,"url":47},"Mastra documentation: evals","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fevals\u002Foverview",{"title":49,"url":50},"Mastra documentation: observability","https:\u002F\u002Fmastra.ai\u002Fdocs\u002Fobservability\u002Foverview",{"title":52,"url":53},"Mastra documentation: model providers","https:\u002F\u002Fmastra.ai\u002Fmodels",{"title":55,"url":56},"Mastra pricing","https:\u002F\u002Fmastra.ai\u002Fpricing",{"title":58,"url":28},"mastra-ai\u002Fmastra on GitHub",{"title":60,"url":61},"Mastra Enterprise Edition License v2.0","https:\u002F\u002Fgithub.com\u002Fmastra-ai\u002Fmastra\u002Fblob\u002Fmain\u002Fee\u002FLICENSE","\u002Fimages\u002Fblog\u002Fmastra\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmastra\u002Fog.jpg","ai-engineer",[66,67,68],"en","de","hu","Mastra review: TypeScript agents with a real evaluation loop","Mastra bundles agents, workflows, memory, MCP, guardrails, tracing and evals into one TypeScript framework. What the Apache-2.0 core covers, what the ee\u002F split costs and who should adopt it.","Diagram of the Mastra runtime: an agent calling tools and a model, workflow steps, memory and storage below, and a strip of observability spans at the bottom.","Apache-2.0 core · hosted paid","Mastra: TypeScript agents reviewed · Balázs Csorba",[75,76,77,78,79],"Mastra is the most complete TypeScript agent framework in one repository: agents, workflows, memory, MCP server authoring, guardrails, tracing and evals, with Apache-2.0 on everything outside the ee\u002F directories.","The licence has a commercial edge. Code under ee\u002F - currently auth, the agent builder and the editor - is source-available, and production use needs both a written agreement and a license key.","The framework moves fast: 99 releases of @mastra\u002Fcore shipped in the 30 days to 7 October 2026, so pinning exact versions and running evals in CI is not optional.","The real strength is the loop between code, traces and evals rather than the agent loop itself, which is commodity; Studio time travel and experiments are what keep a team on the paid platform.","Against LangGraph.js and the Vercel AI SDK, Mastra owns more of the runtime and asks for more dependency surface: @mastra\u002Fcore alone pulls 30 direct dependencies.",[81,84,87,90],{"q":82,"a":83},"Is Mastra open source?","Mostly. The core framework and the vast majority of the monorepo are Apache-2.0, published as @mastra\u002Fcore, which stood at 1.75.0 on 7 October 2026. Directories named ee\u002F - @mastra\u002Fcore\u002Fauth\u002Fee, @mastra\u002Fcore\u002Fagent-builder\u002Fee and @mastra\u002Feditor\u002Fee - are source-available under the Mastra Enterprise Edition License, which allows development and testing but not production use without a license key and a written agreement.",{"q":85,"a":86},"How does Mastra compare with LangGraph.js?","LangGraph.js is a graph runtime built around durable execution and state, it is MIT licensed, and it pulls more weekly downloads: 4.55 million against 2.23 million for @mastra\u002Fcore in the week to 4 October 2026. Mastra bundles more around the agent instead, with memory, guardrails, MCP server authoring, tracing, evals and a hosted platform. Choose on whether you need the graph primitives or the surrounding product surface.",{"q":88,"a":89},"Does Mastra support MCP?","In both directions. MCPClient connects to stdio and Streamable HTTP MCP servers, with requireToolApproval for gating and allowedHosts to restrict outbound hosts. MCPServer exposes Mastra agents, tools, workflows, prompts and resources at \u002Fapi\u002Fmcp\u002F:serverId\u002Fmcp and speaks the 2026-07-28 revision of the protocol.",{"q":91,"a":92},"What does Mastra cost?","The framework is free. The hosted platform lists a free Starter tier with 100k observability events, 24 CPU hours and 15-day retention, a 250 USD per month Teams tier with 1M events, 250 CPU hours, 6-month retention, SSO and SOC 2 documentation, and a custom Enterprise tier. An always-on deployment costs 100 USD per project on top, and the model gateway adds 5.5 per cent to market token rates.",[94,97,100,103,106,109,112,115],{"id":95,"title":96},"what-it-is","What Mastra actually is",{"id":98,"title":99},"how-it-works","How it works",{"id":101,"title":102},"getting-started","Getting started",{"id":104,"title":105},"observability-and-evals","Observability and evals are the real product",{"id":107,"title":108},"pricing-and-licensing","Pricing and the licence split",{"id":110,"title":111},"where-it-shingles","Where it shingles",{"id":113,"title":114},"verdict","Verdict",{"id":116,"title":117},"sources","Sources",[119,123,131,134,168,208,209,243,252,259,263,278,280,299,300,303,305,319,326,327,335,357,371,372,375,414,417,422,423,426,480,483,484,487,500,506,507],{"type":120,"content":121},"paragraph",[122],"Mastra is a TypeScript framework for building LLM agents, and it is one of the more complete ones: agents, a workflow engine, memory, MCP server authoring, guardrails, tracing, evals and a hosted platform in a single repository. The position here is plain. Mastra is the best-supported way to ship an agent inside an existing Node or Next.js codebase, and the wrong choice for a Python shop or for a team that only wants the tool-calling loop.",{"type":120,"content":124},[125,126,130],"It sits above the model layer and below the application: models go in as ",{"tag":127,"children":128},"code",[129],"provider\u002Fmodel"," strings, and the framework takes over the agent loop, the workflow graph, thread state and the traces. The direct competitors are LangGraph.js, the Vercel AI SDK, the OpenAI Agents SDK and newer entries such as VoltAgent. The difference is not the loop, which is commodity, but how much of the surrounding runtime each framework is willing to own.",{"type":132,"level":133,"id":95,"text":96},"heading",2,{"type":120,"content":135},[136,137,140,141,144,145,144,148,144,151,144,154,144,157,160,161,163,164,167],"Mastra is a monorepo of scoped npm packages rather than one library. The core is ",{"tag":127,"children":138},[139],"@mastra\u002Fcore",", and everything else hangs off it: ",{"tag":127,"children":142},[143],"@mastra\u002Fmemory",", ",{"tag":127,"children":146},[147],"@mastra\u002Flibsql",{"tag":127,"children":149},[150],"@mastra\u002Fpg",{"tag":127,"children":152},[153],"@mastra\u002Fobservability",{"tag":127,"children":155},[156],"@mastra\u002Fevals",{"tag":127,"children":158},[159],"@mastra\u002Fmcp"," and the rest. The ",{"tag":127,"children":162},[24]," class in ",{"tag":127,"children":165},[166],"src\u002Fmastra\u002Findex.ts"," is the registry that wires agents, workflows, storage, logging and observability together, and it is where every other part of the framework resolves its services from.",{"type":169,"ordered":170,"items":171},"list",false,[172,178,183,188,193,198,203],[173,177],{"tag":174,"children":175},"strong",[176],"Licence",": Apache-2.0 for everything outside the ee\u002F directories, source-available under the Mastra Enterprise Edition License inside them.",[179,182],{"tag":174,"children":180},[181],"Maturity",": @mastra\u002Fcore stood at 1.75.0 on 7 October 2026; the repository shows 28.6k stars and 2.9k forks, and the first release shipped in October 2024.",[184,187],{"tag":174,"children":185},[186],"Adoption",": 2.23 million npm downloads for @mastra\u002Fcore in the week to 4 October 2026, against 4.55 million for @langchain\u002Flanggraph and 34.5 million for Vercel's ai package.",[189,192],{"tag":174,"children":190},[191],"Release velocity",": 99 releases of @mastra\u002Fcore in the 30 days to 7 October 2026 and 301 in 90 days, out of 1,656 since October 2024.",[194,197],{"tag":174,"children":195},[196],"Runtime",": Node 22.18 or later, with a Hono-based server, deployers for Vercel, Netlify and Cloudflare, or any HTTP host of your own.",[199,202],{"tag":174,"children":200},[201],"Model access",": a model router that resolves a provider\u002Fmodel string, lists 213 providers and 7,790 models, supports per-model fallback chains and reads the provider key from the environment.",[204,207],{"tag":174,"children":205},[206],"Types",": Zod, Valibot or ArkType through Standard JSON Schema for tools, workflow steps and structured output.",{"type":132,"level":133,"id":98,"text":99},{"type":120,"content":210},[211,212,215,216,219,220,223,224,144,227,144,230,219,233,236,237,242],"Two primitives carry most of the load. An ",{"tag":127,"children":213},[214],"Agent"," binds a model, instructions and tools and iterates until the model emits a final answer or a stop condition is met. A workflow, built from ",{"tag":127,"children":217},[218],"createStep"," and ",{"tag":127,"children":221},[222],"createWorkflow"," with ",{"tag":127,"children":225},[226],".then()",{"tag":127,"children":228},[229],".branch()",{"tag":127,"children":231},[232],".parallel()",{"tag":127,"children":234},[235],".commit()",", is the deterministic path for a process with a known sequence. The docs are explicit that the second is right for a defined pipeline and the first for open-ended work, which matches the split described in ",{"tag":238,"to":239,"children":240},"link","\u002Fblog\u002Fagent-loop-explained",[241],"the agent loop explained",".",{"type":244,"attrs":245,"inner":249,"caption":250},"diagram",{"viewBox":246,"role":247,"aria-labelledby":248},"0 0 720 356","img","ma-t ma-d","\u003Ctitle id=\"ma-t\">Mastra runtime: agent path, workflow path, observability\u003C\u002Ftitle>\u003Cdesc id=\"ma-d\">A request reaches an agent, which calls a tool and a model in a loop. Below it sit workflow steps, memory and storage. Every run is traced into spans, logs and metrics that go to Mastra storage or to OpenTelemetry-compatible backends.\u003C\u002Fdesc>\u003Ctext x=\"20\" y=\"26\" class=\"d-title\">Mastra runtime\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"26\" text-anchor=\"end\" class=\"d-label\">@mastra\u002Fcore 1.75.0\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"58\" class=\"d-label\">AGENT PATH\u003C\u002Ftext>\u003Crect x=\"20\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"80\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Request\u003C\u002Ftext>\u003Ctext x=\"80\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">text or event\u003C\u002Ftext>\u003Cpath d=\"M140 102 H172\" class=\"d-line\" \u002F>\u003Cpath d=\"M180 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"180\" y=\"70\" width=\"130\" height=\"64\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"245\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Agent\u003C\u002Ftext>\u003Ctext x=\"245\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">model, tools\u003C\u002Ftext>\u003Cpath d=\"M310 102 H342\" class=\"d-line\" \u002F>\u003Cpath d=\"M350 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"350\" y=\"70\" width=\"130\" height=\"64\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"415\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Tool\u003C\u002Ftext>\u003Ctext x=\"415\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">createTool, zod\u003C\u002Ftext>\u003Cpath d=\"M480 102 H512\" class=\"d-line\" \u002F>\u003Cpath d=\"M520 102 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"520\" y=\"70\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"580\" y=\"98\" text-anchor=\"middle\" class=\"d-text\">Model\u003C\u002Ftext>\u003Ctext x=\"580\" y=\"119\" text-anchor=\"middle\" class=\"d-small\">provider\u002Fmodel\u003C\u002Ftext>\u003Cpath d=\"M415 134 C415 152 245 152 245 136\" class=\"d-line-accent d-dash\" \u002F>\u003Cpath d=\"M245 134 l-6 10 h12 z\" class=\"d-head-accent\" \u002F>\u003Ctext x=\"330\" y=\"162\" text-anchor=\"middle\" class=\"d-small\">observe and repeat\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"186\" class=\"d-label\">WORKFLOW AND STATE\u003C\u002Ftext>\u003Crect x=\"200\" y=\"198\" width=\"170\" height=\"64\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"285\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">Workflow steps\u003C\u002Ftext>\u003Ctext x=\"285\" y=\"247\" text-anchor=\"middle\" class=\"d-small\">then, branch, parallel\u003C\u002Ftext>\u003Cpath d=\"M370 230 H392\" class=\"d-line\" \u002F>\u003Cpath d=\"M400 230 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"400\" y=\"198\" width=\"150\" height=\"64\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"475\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">Memory\u003C\u002Ftext>\u003Ctext x=\"475\" y=\"247\" text-anchor=\"middle\" class=\"d-small\">threads, observations\u003C\u002Ftext>\u003Cpath d=\"M550 230 H572\" class=\"d-line\" \u002F>\u003Cpath d=\"M580 230 l-9 -5 v10 z\" class=\"d-head\" \u002F>\u003Crect x=\"580\" y=\"198\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"640\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">Storage\u003C\u002Ftext>\u003Ctext x=\"640\" y=\"247\" text-anchor=\"middle\" class=\"d-small\">LibSQL, Postgres\u003C\u002Ftext>\u003Cpath d=\"M160 134 V286\" class=\"d-line d-dash\" \u002F>\u003Cpath d=\"M160 296 l-5 -9 h10 z\" class=\"d-head\" \u002F>\u003Ctext x=\"172\" y=\"212\" class=\"d-small\">traced\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"288\" class=\"d-label\">OBSERVABILITY\u003C\u002Ftext>\u003Crect x=\"20\" y=\"296\" width=\"680\" height=\"44\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"360\" y=\"323\" text-anchor=\"middle\" class=\"d-text\">Spans, logs, metrics, scorers to storage, Langfuse, Datadog, Arize\u003C\u002Ftext>",[251],"The Mastra runtime: an agent loops over tools and a model, workflow steps and memory sit below it, and every run is traced.",{"type":120,"content":253},[254,255,242],"Around those two sit the parts that keep an agent alive in production. Memory splits into message history, working memory, semantic recall and Observational Memory, where background agents compress older turns into observations before the context window fills. Storage is pluggable across LibSQL, Postgres, ClickHouse, MongoDB, MSSQL and DuckDB, and the same engine backs workflow suspend and resume, so a workflow can wait for a human approval and continue hours later, as described in ",{"tag":238,"to":256,"children":257},"\u002Fblog\u002Fhuman-in-the-loop-ai-agents",[258],"human-in-the-loop patterns",{"type":132,"level":260,"id":261,"text":262},3,"mcp-support","MCP support is the differentiator",{"type":120,"content":264},[265,266,269,270,273,274,277],"Mastra is one of the few frameworks that both consumes and serves MCP. ",{"tag":127,"children":267},[268],"MCPClient"," connects to stdio or Streamable HTTP servers and ",{"tag":127,"children":271},[272],"MCPServer"," exposes Mastra agents, tools, workflows, prompts and resources to other systems. Registered servers are served at ",{"tag":127,"children":275},[276],"\u002Fapi\u002Fmcp\u002F:serverId\u002Fmcp"," and speak the 2026-07-28 revision of the protocol, so a team whose internal tools already sit behind an MCP server can wire an agent to them without writing an integration layer.",{"type":127,"code":279},"import { Agent } from '@mastra\u002Fcore\u002Fagent'\nimport { Mastra } from '@mastra\u002Fcore\u002Fmastra'\nimport { MCPServer, MCPClient } from '@mastra\u002Fmcp'\n\n\u002F\u002F Expose Mastra primitives to other agents and systems\nconst mcpServer = new MCPServer({\n  id: 'support-mcp',\n  name: 'Support tools',\n  version: '1.0.0',\n  agents: { supportAgent },\n  tools: { refundTool },\n  workflows: { triage },\n})\n\n\u002F\u002F Consume remote MCP tools, gating the destructive ones\nconst client = new MCPClient({\n  servers: {\n    jira: {\n      url: new URL('https:\u002F\u002Fjira.example.com\u002Fmcp'),\n      requireToolApproval: ({ toolName }) => toolName.startsWith('delete_'),\n    },\n  },\n})\n\nconst assistant = new Agent({\n  id: 'assistant',\n  name: 'Assistant',\n  instructions: 'Answer from the available tools and cite the source.',\n  model: 'anthropic\u002Fclaude-sonnet-4-6',\n  tools: await client.listTools(),\n})\n\nexport const mastra = new Mastra({\n  agents: { assistant },\n  mcpServers: { mcpServer },\n})",{"type":120,"content":281},[282,283,286,287,290,291,294,295,242],"The security defaults are better than average. ",{"tag":127,"children":284},[285],"requireToolApproval"," gates tools by name or arguments, stdio subprocesses inherit only a curated environment whitelist unless ",{"tag":127,"children":288},[289],"inheritDefaultEnv"," is set, ",{"tag":127,"children":292},[293],"allowedHosts"," restricts outbound HTTP hosts, and the docs tell you to treat annotations from servers you do not control as untrusted hints. Tool results remain untrusted model input, which is why the guardrail processors, not the MCP layer, are the place where that content has to be sanitised, as in ",{"tag":238,"to":296,"children":297},"\u002Fblog\u002Fprompt-injection-lethal-trifecta-patterns",[298],"the injection patterns",{"type":132,"level":133,"id":101,"text":102},{"type":120,"content":301},[302],"npm create mastra@latest produces a project with the src\u002Fmastra layout, a dev server, Studio and a deployer. The smallest useful surface is small: one tool, one agent, one registry.",{"type":127,"code":304},"\u002F\u002F src\u002Fmastra\u002Ftools\u002Fstock-price.ts\nimport { createTool } from '@mastra\u002Fcore\u002Ftools'\nimport { z } from 'zod'\n\nexport const stockPrice = createTool({\n  id: 'stock-price',\n  description: 'Latest price for a ticker symbol',\n  inputSchema: z.object({ symbol: z.string().describe('Ticker, for example INGY') }),\n  outputSchema: z.object({ symbol: z.string(), price: z.number() }),\n  execute: async ({ symbol }) => ({ symbol, price: await quote(symbol) }),\n})\n\n\u002F\u002F src\u002Fmastra\u002Findex.ts\nimport { Mastra } from '@mastra\u002Fcore'\nimport { Agent } from '@mastra\u002Fcore\u002Fagent'\nimport { LibSQLStore } from '@mastra\u002Flibsql'\nimport { stockPrice } from '.\u002Ftools\u002Fstock-price'\n\nexport const agent = new Agent({\n  id: 'research',\n  name: 'Research agent',\n  instructions: 'Look prices up with the tool. Never guess a number.',\n  model: 'anthropic\u002Fclaude-sonnet-4-6',\n  tools: { stockPrice },\n})\n\nexport const mastra = new Mastra({\n  agents: { agent },\n  storage: new LibSQLStore({ id: 'mastra', url: 'file:.\u002Fmastra.db' }),\n})\n\n\u002F\u002F run.ts - Node 22.18 and later run TypeScript directly\nconst answer = await mastra.getAgentById('research').generate('INGY price')\nconsole.log(answer.text, answer.usage)",{"type":120,"content":306},[307,308,311,312,314,315,318],"Two details trip newcomers up. Resolve agents through ",{"tag":127,"children":309},[310],"mastra.getAgentById()"," rather than importing them directly, because a direct import still runs but misses the instance storage, logger and telemetry, which leaves those runs invisible in traces. And the model string is the router format, ",{"tag":127,"children":313},[129]," read from an environment variable such as ",{"tag":127,"children":316},[317],"ANTHROPIC_API_KEY",", not a provider object.",{"type":320,"variant":321,"title":322,"body":323},"callout","warn","Pin the version before anything else",[324],[325],"With 99 releases of @mastra\u002Fcore in a single month, an unpinned range in package.json is a scheduled incident. Pin exact versions, run your evals on the upgrade, and use a Renovate or Dependabot pull request flow instead of merging whatever the registry serves.",{"type":132,"level":133,"id":104,"text":105},{"type":120,"content":328},[329,330,334],"This is the part that justifies the framework rather than the agent loop. Every agent run, workflow step, tool call and model call emits a span, and exporters write those spans to Mastra storage or to any OpenTelemetry-compatible backend, with named integrations for Langfuse, Arize Phoenix and Datadog. Metrics are derived from spans without extra instrumentation, and Studio adds a graph view, time travel for replaying a single step and an experiments tab. Teams that already built this with ",{"tag":238,"to":331,"children":332},"\u002Fblog\u002Fagent-observability-opentelemetry",[333],"OpenTelemetry tracing"," by hand will recognise the shape.",{"type":169,"ordered":170,"items":336},[337,342,347,352],[338,341],{"tag":174,"children":339},[340],"Tracing and logging",": spans plus structured logs correlated by trace and span ID, so a log line jumps to the run that produced it.",[343,346],{"tag":174,"children":344},[345],"Metrics",": token counts, latency and cost estimates extracted when a span closes; aggregation needs an analytics-capable store such as DuckDB, ClickHouse or Postgres.",[348,351],{"tag":174,"children":349},[350],"Scorers",": prebuilt and custom scorers attached to an agent or a single workflow step, with sampling that is deterministic per trace, so scores stay comparable across runs.",[353,356],{"tag":174,"children":354},[355],"Guardrails as processors",": prompt-injection detection, moderation, PII masking, system prompt scrubbing and a cost ceiling, each with a block, redact or warn strategy.",{"type":120,"content":358},[359,360,363,364,366,367,370],"One sharp edge is worth knowing before the first CI run. Scorers attached to an agent or a step register themselves; scorers passed straight to ",{"tag":127,"children":361},[362],"runEvals()"," or to the quick checks must also be registered on the ",{"tag":127,"children":365},[24]," instance, otherwise every save fails with ",{"tag":127,"children":368},[369],"Scorer with id \u003Cid> not found"," and the scores never reach the store. The docs are candid that the results are identical either way, which is exactly what makes the failure confusing.",{"type":132,"level":133,"id":107,"text":108},{"type":120,"content":373},[374],"The framework is free and the hosted platform is where the money is. The pricing page lists three tiers, and the meter is the interesting part: observability events, CPU hours, data egress and a model gateway that adds 5.5 per cent to market token rates.",{"type":376,"head":377,"rows":386},"table",[378,380,382,384],[379],"Tier",[381],"Price",[383],"Observability",[385],"Compute and retention",[387,396,405],[388,390,392,394],[389],"Starter",[391],"0 USD per month",[393],"100k events, then 10 USD per 100k",[395],"24 CPU hours, then 0.35 USD per hour; 15-day retention",[397,399,401,403],[398],"Teams",[400],"250 USD per month",[402],"1M events, then 8 USD per 100k",[404],"250 CPU hours, then 0.25 USD per hour; 6-month retention",[406,408,410,412],[407],"Enterprise",[409],"Custom",[411],"Custom volume and retention",[413],"RBAC, audit logs, uptime SLAs, on-prem deployment",{"type":120,"content":415},[416],"Two line items deserve attention. An always-on deployment costs 100 USD per project on top of the tier, and the gateway charges market rate plus 5.5 per cent on input and output tokens with your own key. Memory is billed again, at 10 USD per million tokens beyond the first 100,000 or 1M depending on tier, so a chatty long-context agent shows up in three separate meters.",{"type":320,"variant":321,"title":418,"body":419},"The licence split is worth reading twice",[420],[421],"Everything outside ee\u002F is Apache-2.0. Inside ee\u002F - currently @mastra\u002Fcore\u002Fauth\u002Fee, @mastra\u002Fcore\u002Fagent-builder\u002Fee and @mastra\u002Feditor\u002Fee - the code is source-available, and the Mastra Enterprise Edition License v2.0, effective 22 September 2026, requires both a signed agreement and a valid license key before production use. Running it without either is stated to be unlicensed production use. Authentication is not an edge feature, so check that boundary before an architecture depends on it.",{"type":132,"level":133,"id":110,"text":111},{"type":120,"content":424},[425],"The weaknesses come first. Release velocity is the operational one: 301 releases in 90 days means the framework's own API moves underneath you and reading release notes becomes part of the job. Second, the breadth cuts both ways. The repository ships harnesses, workspaces, channels, voice, browser control, code mode and agent factories, so a small team pays in review surface for features it will not use. Third, Observational Memory is not free, because background agents compress the history on top of every turn. Fourth, the Studio extras, time travel, experiments and the evaluate tab, are precisely the reason to stay on the paid tier, and they are gone if you export traces to Langfuse and self-host everything else.",{"type":376,"head":427,"rows":435},[428,430,431,433],[429],"Criterion",[24],[432],"LangGraph.js",[434],"Vercel AI SDK",[436,444,453,462,471],[437,438,440,442],[176],[439],"Apache-2.0 core, enterprise in ee\u002F",[441],"MIT",[443],"Apache-2.0",[445,447,449,451],[446],"Scope it owns",[448],"Agents, workflows, memory, MCP, evals, platform",[450],"Graph runtime, durable execution",[452],"Model calls, streaming, UI primitives",[454,456,458,460],[455],"Evals and traces",[457],"Built in, plus a hosted platform",[459],"LangSmith is separate and paid",[461],"Bring your own provider",[463,465,467,469],[464],"Fit",[466],"Product teams shipping agents in Node",[468],"Python-first shops needing durable graphs",[470],"Apps that mostly stream model output",[472,474,476,478],[473],"Weekly downloads, 4 Oct 2026",[475],"2.23M (@mastra\u002Fcore)",[477],"4.55M (@langchain\u002Flanggraph)",[479],"34.5M (ai)",{"type":120,"content":481},[482],"Set against the OpenAI Agents SDK, which is thinner, MIT licensed and stays close to the Responses API, Mastra is the more portable and the heavier option. The honest summary is that Mastra buys breadth and a genuine evaluation loop, and pays for it in dependency count, with 30 direct dependencies from @mastra\u002Fcore alone, and in the pace at which that dependency changes.",{"type":132,"level":133,"id":113,"text":114},{"type":120,"content":485},[486],"Mastra is a well-run, unusually complete framework with a clear centre of gravity: the loop between code, traces and evals is better than anything a TypeScript team would otherwise assemble by hand. The catch is that it is a moving target with a commercial overlay, and the two things a buyer cares about most, stable APIs and a licence that does not move, are exactly the two it is weakest on.",{"type":169,"ordered":488,"items":489},true,[490,492,494,496,498],[491],"Adopt it when the agent ships inside an existing Node or Next.js application and the team wants tracing, evals and a workflow engine without assembling six packages.",[493],"Adopt it when human approval, long-running suspended workflows and MCP tool servers are requirements rather than nice-to-haves.",[495],"Adopt it with pinned versions and an eval suite in CI, because the release cadence will otherwise decide your upgrade schedule.",[497],"Skip it when the model provider is fixed and the surface is a single chat endpoint: the Vercel AI SDK or the OpenAI Agents SDK is smaller to reason about.",[499],"Skip it when the stack is Python, or when the ee\u002F boundary falls inside something the product depends on.",{"type":320,"variant":501,"title":502,"body":503},"note","In one line",[504],[505],"Mastra is the best-integrated TypeScript agent framework available today, provided you treat it as a platform with an open-source core rather than a stable library, and accept that the hosted tier, not the code, is the vendor's business.",{"type":132,"level":133,"id":116,"text":117},{"type":169,"ordered":488,"items":508},[509,513,516,519,522,525,528,531,534,537,540],[510],{"tag":511,"href":32,"children":512},"a",[31],[514],{"tag":511,"href":35,"children":515},[34],[517],{"tag":511,"href":38,"children":518},[37],[520],{"tag":511,"href":41,"children":521},[40],[523],{"tag":511,"href":44,"children":524},[43],[526],{"tag":511,"href":47,"children":527},[46],[529],{"tag":511,"href":50,"children":530},[49],[532],{"tag":511,"href":53,"children":533},[52],[535],{"tag":511,"href":56,"children":536},[55],[538],{"tag":511,"href":28,"children":539},[58],[541],{"tag":511,"href":61,"children":542},[60],[544,607,657,722],{"slug":545,"published":546,"minutes":547,"category":7,"tags":548,"keywords":552,"about":559,"sources":563,"cover":600,"og":601,"expertise":64,"locales":602,"lang":66,"title":603,"description":604,"coverAlt":605,"url":566,"pricing":441,"kind":606},"mcp-reference-servers","2026-09-25",9,[12,549,550,551],"Reference servers","Tool protocol","Server SDKs",[553,554,555,556,557,558],"mcp reference servers","modelcontextprotocol servers github","write an mcp server","mcp server examples","mcp server sdk","mcp server security",[560],{"name":561,"url":562},"Model Context Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_Context_Protocol",[564,567,570,573,576,579,582,585,588,591,594,597],{"title":565,"url":566},"MCP reference servers repository","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers",{"title":568,"url":569},"Repository README and server list","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FREADME.md",{"title":571,"url":572},"Security policy","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FSECURITY.md",{"title":574,"url":575},"Release process and trusted publishing","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FRELEASING.md",{"title":577,"url":578},"Filesystem server README","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002Fsrc\u002Ffilesystem\u002FREADME.md",{"title":580,"url":581},"Everything server feature list","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002Fsrc\u002Feverything\u002Fdocs\u002Ffeatures.md",{"title":583,"url":584},"MCP Registry","https:\u002F\u002Fregistry.modelcontextprotocol.io\u002F",{"title":586,"url":587},"Archived reference servers","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers-archived",{"title":589,"url":590},"Model Context Protocol documentation","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"title":592,"url":593},"TypeScript MCP SDK","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk",{"title":595,"url":596},"Python MCP SDK","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fpython-sdk",{"title":598,"url":599},"FastMCP on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Ffastmcp\u002F","\u002Fimages\u002Fblog\u002Fmcp-reference-servers\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmcp-reference-servers\u002Fog.jpg",[66,67,68],"MCP reference servers: what they demonstrate and what they omit","A review of modelcontextprotocol\u002Fservers: seven reference servers, what each one teaches, the SDK versions behind them and why none of them should reach production.","Seven reference servers fanning out from a single MCP client over stdio","Protocol tooling",{"slug":608,"published":609,"minutes":610,"category":7,"tags":611,"keywords":617,"about":625,"sources":632,"cover":649,"og":650,"expertise":64,"locales":651,"lang":66,"title":652,"description":653,"coverAlt":654,"url":655,"pricing":656,"kind":612},"aider","2026-09-23",10,[612,613,614,615,616],"Coding agent","Terminal","Git workflow","BYO key","Open source",[608,618,619,620,621,622,623,624],"aider vs claude code","aider polyglot benchmark","ai pair programming terminal","aider leaderboard","open source coding agent","aider architect mode","aider install",[626,629],{"name":627,"url":628},"Aider","https:\u002F\u002Faider.chat\u002F",{"name":630,"url":631},"Aider on GitHub","https:\u002F\u002Fgithub.com\u002FAider-AI\u002Faider",[633,635,638,641,644,646],{"title":634,"url":628},"Aider website",{"title":636,"url":637},"Aider LLM leaderboards","https:\u002F\u002Faider.chat\u002Fdocs\u002Fleaderboards\u002F",{"title":639,"url":640},"Aider linting and testing","https:\u002F\u002Faider.chat\u002Fdocs\u002Fusage\u002Flint-test.html",{"title":642,"url":643},"Aider token limits","https:\u002F\u002Faider.chat\u002Fdocs\u002Ftroubleshooting\u002Ftoken-limits.html",{"title":645,"url":631},"Aider repository on GitHub",{"title":647,"url":648},"aider-chat on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Faider-chat\u002F","\u002Fimages\u002Fblog\u002Faider\u002Fcover.webp","\u002Fimages\u002Fblog\u002Faider\u002Fog.jpg",[66,67,68],"Aider review: git-first pair programming in the terminal","A review of Aider 0.86.2, an Apache-2.0 terminal pair programmer whose benchmark ranks models honestly and whose release cadence has stopped.","Cover art for the Aider review: a terminal session turning a single request into a row of git commits","https:\u002F\u002Faider.chat","Free · BYO API key",{"slug":658,"published":659,"minutes":610,"category":7,"tags":660,"keywords":665,"about":674,"sources":684,"cover":715,"og":716,"expertise":64,"locales":717,"lang":66,"title":718,"description":719,"coverAlt":720,"url":687,"pricing":721,"kind":10},"openai-agents-sdk","2026-09-11",[661,662,663,12,664],"Agent runtime","Tracing","Guardrails","Python",[666,667,668,669,670,671,672,673],"openai agents sdk","openai agents sdk vs langgraph","python agent framework comparison","openai agents sdk guardrails","agent run tracing tool calls","openai agents sdk human in the loop","openai-agents pypi","agents sdk vs responses api",[675,678,681],{"name":676,"url":677},"Model context protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_context_protocol",{"name":679,"url":680},"Software framework","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_framework",{"name":682,"url":683},"Agentic AI","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgentic_AI",[685,688,691,694,697,700,703,706,709,712],{"title":686,"url":687},"OpenAI Agents SDK documentation: Intro, and Agents SDK or Responses API","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002F",{"title":689,"url":690},"OpenAI Agents SDK documentation: Running agents","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Frunning_agents\u002F",{"title":692,"url":693},"OpenAI Agents SDK documentation: Guardrails","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fguardrails\u002F",{"title":695,"url":696},"OpenAI Agents SDK documentation: Human-in-the-loop","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fhuman_in_the_loop\u002F",{"title":698,"url":699},"OpenAI Agents SDK documentation: Tracing","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Ftracing\u002F",{"title":701,"url":702},"OpenAI Agents SDK documentation: Configuration","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fconfig\u002F",{"title":704,"url":705},"openai-agents 0.23.1 on PyPI, release history and licence","https:\u002F\u002Fpypi.org\u002Fproject\u002Fopenai-agents\u002F",{"title":707,"url":708},"OpenAI: The next evolution of the Agents SDK (15 April 2026)","https:\u002F\u002Fopenai.com\u002Findex\u002Fthe-next-evolution-of-the-agents-sdk\u002F",{"title":710,"url":711},"OpenAI API documentation: Agents, comparison of the three runtimes","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fagents",{"title":713,"url":714},"Arize: AI agent frameworks compared (1 October 2026)","https:\u002F\u002Farize.com\u002Fai-agents\u002Fagent-frameworks\u002F","\u002Fimages\u002Fblog\u002Fopenai-agents-sdk\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fopenai-agents-sdk\u002Fog.jpg",[66,67,68],"OpenAI Agents SDK: a small agent runtime with sharp edges","A review of the OpenAI Agents SDK: the runner loop, tracing, guardrails and approvals, plus what the release churn and the Responses-only features cost.","Diagram of the Agents SDK runner loop: input, agent, model call, final output, guardrails, and tool calls feeding back into the input","MIT · API pay per token",{"slug":723,"published":724,"minutes":547,"category":7,"tags":725,"keywords":730,"about":737,"sources":747,"cover":768,"og":769,"expertise":64,"locales":770,"lang":66,"title":771,"description":772,"coverAlt":773,"url":774,"pricing":775,"kind":612},"openhands","2026-09-09",[612,726,727,728,729],"Sandboxed execution","Automations","Self-hosted","MIT licence",[723,731,732,733,734,735,622,736],"openhands self-host","open hands coding agent","openhands vs claude code","agent canvas","openhands docker sandbox","openhands cloud pricing",[738,741,744],{"name":739,"url":740},"OpenHands","https:\u002F\u002Fwww.openhands.dev",{"name":742,"url":743},"OpenHands on GitHub","https:\u002F\u002Fgithub.com\u002FOpenHands\u002FOpenHands",{"name":745,"url":746},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",[748,750,753,756,759,762,765],{"title":749,"url":743},"OpenHands README",{"title":751,"url":752},"OpenHands licence (MIT)","https:\u002F\u002Fgithub.com\u002FOpenHands\u002FOpenHands\u002Fblob\u002Fmain\u002FLICENSE",{"title":754,"url":755},"Agent Canvas 1.25.0 release notes","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Fagent-canvas\u002Frelease-notes\u002Fv1.25.0.md",{"title":757,"url":758},"OpenHands sandbox overview","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Fsandboxes\u002Foverview.md",{"title":760,"url":761},"OpenHands quick start","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Finstallation",{"title":763,"url":764},"OpenHands pricing","https:\u002F\u002Fwww.openhands.dev\u002Fpricing",{"title":766,"url":767},"Introducing the OpenHands Index","https:\u002F\u002Fwww.openhands.dev\u002Fblog\u002Fintroducing-the-openhands-index","\u002Fimages\u002Fblog\u002Fopenhands\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fopenhands\u002Fog.jpg",[66,67,68],"OpenHands: the open-source coding agent you operate","OpenHands 1.25.0 is an MIT-licensed coding agent platform with a web canvas, a CLI, sandboxed execution and scheduled automations. A review of where it is strong and where it gets heavy.","Cover artwork for the OpenHands review showing a loop from task to agent to sandboxed run and back","https:\u002F\u002Fgithub.com\u002FAll-Hands-AI\u002FOpenHands","Free · self-host",1791383548869]