@mastra/mcp-docs-server 1.2.18-alpha.5 → 1.2.18-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -254,7 +254,7 @@ The exported event types are `ExperimentEvent`, `ExperimentRunStartedEvent`, `Ex
254
254
 
255
255
  ## Lifecycle hooks
256
256
 
257
- Use lifecycle hooks to prepare state before a target runs and clean it up afterwards. This is useful when an item can't be evaluated against an empty environment. A run might need a fixture file copied into the agent's workspace, or a sandbox provisioned before the agent can touch it.
257
+ Use lifecycle hooks to prepare state before a target runs and clean it up afterward. This is useful when an item can't be evaluated against an empty environment. A run might need a fixture file copied into the agent's workspace, or a sandbox provisioned before the agent can touch it.
258
258
 
259
259
  Hooks run at two levels. `beforeAll` and `afterAll` run once per experiment, and `beforeEach` and `afterEach` run once per item:
260
260
 
@@ -430,6 +430,91 @@ while (experiment.status === 'pending' || experiment.status === 'running') {
430
430
  console.log(experiment.status) // 'completed' | 'failed'
431
431
  ```
432
432
 
433
+ ## Caller-driven experiments
434
+
435
+ `startExperiment()` puts Mastra in charge of the whole run. If a durable orchestrator (for example Temporal, Airflow, or a custom worker fleet) owns the loop instead, create the experiment first and drive it yourself in one of these shapes:
436
+
437
+ - **Caller drives the loop, Mastra runs each item.** Create the experiment with a target, then call [`runExperimentItem()`](https://mastra.ai/reference/datasets/runExperimentItem) once per item. Mastra executes the target and runs the scorers, then persists the result.
438
+ - **Caller runs everything.** Create the experiment without a target, execute and score items on your own infrastructure, and ingest each result with [`submitExperimentResult()`](https://mastra.ai/reference/datasets/submitExperimentResult).
439
+
440
+ Both shapes finish with [`finalizeExperiment()`](https://mastra.ai/reference/datasets/finalizeExperiment), and both write to the same tables as native runs, so Studio views, comparisons, and review summaries work unchanged.
441
+
442
+ ### Run items server-side
443
+
444
+ Create the experiment with [`createExperiment()`](https://mastra.ai/reference/datasets/createExperiment), passing the target and scorers. Pass your own `id` (for example a workflow run id) to make creation idempotent: retrying the call with the same id returns the existing experiment instead of failing.
445
+
446
+ ```typescript
447
+ const dataset = await mastra.datasets.get({ id: 'translation-dataset-id' })
448
+
449
+ const { experimentId, totalItems, datasetVersion } = await dataset.createExperiment({
450
+ id: 'temporal-wf-run-42', // optional: reuse your workflow run id for idempotent creates
451
+ targetType: 'agent',
452
+ targetId: 'translation-agent',
453
+ scorers: ['accuracy'],
454
+ })
455
+ ```
456
+
457
+ Then run each item from your orchestrator. Mastra resolves the item at the pinned dataset version and executes the target with the resolved scorers. The result upserts keyed by `(experimentId, itemId, attempt)`, so a retried activity converges on a single row:
458
+
459
+ ```typescript
460
+ const { result, scores } = await dataset.runExperimentItem({
461
+ experimentId,
462
+ itemId: 'item-1',
463
+ })
464
+ ```
465
+
466
+ Retries and timeouts belong to your orchestrator: each `runExperimentItem` call executes the item exactly once. Scorers resolve with the same precedence as native runs: experiment `scorers` win over item `scorerIds`, which win over dataset `scorerIds`.
467
+
468
+ ### Ingest external results
469
+
470
+ If your workers execute and score items themselves, create the experiment without a target:
471
+
472
+ ```typescript
473
+ const { experimentId } = await dataset.createExperiment({
474
+ id: 'temporal-wf-run-42',
475
+ name: 'external-eval',
476
+ })
477
+ ```
478
+
479
+ Submit one result per item with [`submitExperimentResult()`](https://mastra.ai/reference/datasets/submitExperimentResult). Submissions are upserts keyed by `(experimentId, itemId, attempt)`, so a retried worker converges on a single row instead of duplicating results:
480
+
481
+ ```typescript
482
+ await dataset.submitExperimentResult({
483
+ experimentId,
484
+ itemId: 'item-1',
485
+ output: { translation: 'Hola' },
486
+ scores: [{ scorerId: 'accuracy', score: 0.92, reason: 'Faithful translation' }],
487
+ })
488
+ ```
489
+
490
+ `input` and `groundTruth` default to the dataset item's values at the experiment's pinned dataset version. Inline `scores` are persisted to the scores store under the experiment, so they show up in comparisons alongside native scorer runs. Experiments created with a target reject `submitExperimentResult` so two writers can't race on the same rows.
491
+
492
+ ### Finalize
493
+
494
+ When all items are done, call [`finalizeExperiment()`](https://mastra.ai/reference/datasets/finalizeExperiment). Mastra computes `succeededCount`, `failedCount`, and `skippedCount` from the persisted rows, so your workers never track completion bookkeeping. Finalization is idempotent. Calling it again returns the stored record:
495
+
496
+ ```typescript
497
+ const experiment = await dataset.finalizeExperiment({ experimentId })
498
+
499
+ console.log(experiment.status) // 'completed'
500
+ console.log(experiment.succeededCount) // items with at least one attempt that didn't error
501
+ console.log(experiment.failedCount) // items where every attempt errored
502
+ console.log(experiment.skippedCount) // items never submitted
503
+ ```
504
+
505
+ The same lifecycle is available over HTTP (`POST /api/datasets/:datasetId/experiments` with `start: false`, `POST .../experiments/:experimentId/items/:itemId/run`, `POST .../experiments/:experimentId/results`, `POST .../experiments/:experimentId/finalize`, see [Server routes](https://mastra.ai/reference/server/routes)) and through `@mastra/client-js` (see the [Datasets API](https://mastra.ai/reference/client-js/datasets)).
506
+
507
+ ### Retry and idempotency contract
508
+
509
+ Caller-driven calls are designed to be retried aggressively (for example by a Temporal retry policy). The exact guarantees:
510
+
511
+ - **Create is idempotent on `id`.** Calling `createExperiment` again with the same caller-supplied `id` returns the existing experiment. Reusing an `id` that belongs to another dataset or an experiment with a different target fails with `EXPERIMENT_ID_CONFLICT` (HTTP `409`).
512
+ - **Results upsert on `(experimentId, itemId, attempt)`.** Re-submitting the same key updates the existing row, and the last write wins for all mutable fields. A retried worker never creates duplicates.
513
+ - **`attempt` separates deliberate trials from retries.** Retries of the same run should reuse the same `attempt` (default `0`) so they converge. To record repeated trials of an item as separate rows, submit with `attempt: 0`, `attempt: 1`, and so on.
514
+ - **The dataset version is pinned at creation.** Submissions are validated against the items visible at that version, so editing or deleting items afterward doesn't affect an in-flight experiment. Submitting an `itemId` that isn't visible at the pinned version fails with `404`.
515
+ - **Finalize is idempotent and terminal.** Finalizing an already-completed experiment returns the stored record without recomputing. After finalization, further submissions are rejected with `EXPERIMENT_ALREADY_FINALIZED` (HTTP `409`).
516
+ - **Counts are server-computed and per-item.** At finalize time Mastra rolls attempts up per item: `succeededCount` (at least one attempt without an error), `failedCount` (every attempt errored), `skippedCount` (never submitted). `succeededCount + failedCount + skippedCount === totalItems` always holds, and callers keep no completion bookkeeping. Attempt-level rows remain available via `listExperimentResults`.
517
+
433
518
  ## Configuration options
434
519
 
435
520
  ### Concurrency
@@ -28,7 +28,7 @@ A local `.env` file is optional. Environment variables stored on the platform ar
28
28
 
29
29
  On the first run the CLI prompts you to create the platform project (named after your `package.json`) and the `production` environment. Accept the prompts, or pass `--yes` to accept defaults without confirmation.
30
30
 
31
- 2. The CLI runs a preflight check before anything ships. Storage that would fall back to a local file path (which doesn't survive on the platform's ephemeral filesystem) would normally block the deploy:
31
+ 2. The CLI runs a preflight check before every deploy. Storage that would fall back to a local file path (which doesn't survive on the platform's ephemeral filesystem) would normally block the deploy:
32
32
 
33
33
  ```text
34
34
  file:./mastra.db will be used at runtime because TURSO_DATABASE_URL is not set
@@ -48,6 +48,8 @@ A local `.env` file is optional. Environment variables stored on the platform ar
48
48
 
49
49
  The environment slug (`production` above) matches the environment the CLI would have deployed to — this is important because `mastra env db create` requires an environment argument in non-interactive shells when the project has more than one environment.
50
50
 
51
+ Preflight also catches database URLs that point at your local machine. A `.env` file with `REDIS_URL=redis://localhost:6379` works during development, but the deployed server can't reach your laptop — so the CLI warns and offers the same managed provisioning. If you decline, the deploy continues with your value as-is; if you accept, the managed database's connection variables take precedence at deploy time while your local `.env` keeps working for development.
52
+
51
53
  > **Note:** If preflight reports a hard-coded local path instead (`Build contains a host-local storage URL`), it can't offer the inline fix — guard the path with an environment variable first so the file is only used during local development:
52
54
  >
53
55
  > ```ts
@@ -2,7 +2,9 @@
2
2
 
3
3
  # Arize
4
4
 
5
- [Arize](https://arize.com/) provides observability platforms for AI applications through [Phoenix](https://phoenix.arize.com/) (open-source) and [Arize AX](https://arize.com/generative-ai/) (enterprise). The Arize exporter sends traces using OpenTelemetry and [OpenInference](https://github.com/Arize-ai/openinference/tree/main/spec) semantic conventions, compatible with any OpenTelemetry platform that supports OpenInference.
5
+ [Arize AI](https://arize.com/?utm_source=mastra-docs\&utm_medium=partner\&utm_campaign=partner-docs\&utm_content=observability-arize) provides observability and evaluation for AI applications through [Arize Phoenix](https://arize.com/phoenix/) and [Arize AX](https://arize.com/products/ax/). Use Phoenix for a local or self-hosted open-source workflow, and use Arize AX for managed cloud or enterprise self-hosted production observability. The Arize exporter sends traces using OpenTelemetry and [OpenInference](https://github.com/Arize-ai/openinference/tree/main/spec) semantic conventions, compatible with any OpenTelemetry platform that supports OpenInference.
6
+
7
+ For workflows that use traces to improve quality, see Arize's [agent evaluation guide](https://arize.com/guides/ai-agent-handbook/agent-evaluation/) and [LLM evaluation guide](https://arize.com/resources/llm-evaluation/).
6
8
 
7
9
  ## Installation
8
10
 
@@ -34,18 +36,18 @@ bun add @mastra/arize@latest
34
36
 
35
37
  ### Phoenix Setup
36
38
 
37
- Phoenix is an open-source observability platform that can be self-hosted or used via Phoenix Cloud.
39
+ Phoenix is an open-source observability platform that can run locally or be self-hosted.
38
40
 
39
41
  #### Prerequisites
40
42
 
41
- 1. **Phoenix Instance**: Deploy using Docker or sign up at [Phoenix Cloud](https://app.phoenix.arize.com/login)
43
+ 1. **Phoenix Instance**: Run Phoenix locally with Docker or connect to your self-hosted deployment
42
44
  2. **Endpoint**: Your Phoenix endpoint URL (ends in `/v1/traces`)
43
- 3. **API Key**: Optional for unauthenticated instances, required for Phoenix Cloud
45
+ 3. **API Key**: Optional for unauthenticated instances, required for authenticated deployments
44
46
  4. **Environment Variables**: Set your configuration
45
47
 
46
48
  ```bash
47
49
  # Required
48
- PHOENIX_COLLECTOR_ENDPOINT=http://localhost:6006/v1/traces # Or your Phoenix Cloud URL
50
+ PHOENIX_COLLECTOR_ENDPOINT=http://localhost:6006/v1/traces # Or your self-hosted Phoenix URL
49
51
 
50
52
  # Optional
51
53
  PHOENIX_API_KEY=your-api-key # For authenticated Phoenix instances
@@ -112,7 +114,7 @@ export const mastra = new Mastra({
112
114
 
113
115
  ### Arize AX Setup
114
116
 
115
- Arize AX is an enterprise observability platform with advanced features for production AI systems.
117
+ Arize AX is a managed cloud and enterprise self-hosted observability platform with advanced features for production AI systems.
116
118
 
117
119
  #### Prerequisites
118
120
 
@@ -541,11 +541,11 @@ mastra env db create --kind neon --name my-app-db --region aws-us-east-1 --share
541
541
 
542
542
  #### `--kind`
543
543
 
544
- Database provider (required). One of `turso` or `neon`.
544
+ Database provider (required). One of `turso`, `neon`, or `redis`.
545
545
 
546
546
  #### `--name`
547
547
 
548
- Database name. Defaults to a name derived from the project slug (for example `my-app-db`).
548
+ Database name. Defaults to a name derived from the project slug and provider (for example `my-app-turso` or `my-app-redis`).
549
549
 
550
550
  #### `--region`
551
551
 
@@ -0,0 +1,146 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # Datasets API
4
+
5
+ The Datasets API exposes Mastra's dataset and experiment routes from `MastraClient`. This page covers the caller-driven experiment methods, which let an orchestrator you own (for example a Temporal workflow) drive the experiment loop while Mastra acts as the system of record. Create the experiment, then either have Mastra execute each item server-side with `runExperimentItem` or ingest results you computed yourself with `submitExperimentResult`, and call finalize when the run is done.
6
+
7
+ Item runs, result submission, and finalization are safe to retry. Creation is safe to retry only when the request includes a caller-supplied `id`; without one, each retry creates a new experiment.
8
+
9
+ - `createDatasetExperiment` is idempotent on a caller-supplied `id`
10
+ - `runExperimentItem` and `submitExperimentResult` upsert on `(experimentId, itemId, attempt)`
11
+ - `finalizeExperiment` returns the stored record if the experiment is already completed
12
+
13
+ ## Usage example
14
+
15
+ ```typescript
16
+ import { MastraClient } from '@mastra/client-js'
17
+
18
+ const client = new MastraClient({
19
+ baseUrl: 'http://localhost:4111',
20
+ })
21
+
22
+ // 1. Create the experiment. Pass your orchestrator's run ID so a
23
+ // retried workflow converges on the same experiment.
24
+ const { experimentId, totalItems, datasetVersion } = await client.createDatasetExperiment({
25
+ datasetId: 'clinical-triage-evals',
26
+ id: 'temporal-wf-run-42',
27
+ targetType: 'agent',
28
+ targetId: 'triage-agent',
29
+ scorerIds: ['clinical-judge'],
30
+ })
31
+
32
+ // 2. Run one item per activity. Mastra executes the agent, runs the
33
+ // scorers, and upserts the result. Retried activities converge on
34
+ // a single row per (experimentId, itemId, attempt).
35
+ const { result, scores } = await client.runExperimentItem({
36
+ datasetId: 'clinical-triage-evals',
37
+ experimentId,
38
+ itemId: 'item-1',
39
+ })
40
+
41
+ // 3. Finalize. The server computes succeeded/failed/skipped counts
42
+ // from the persisted rows.
43
+ const experiment = await client.finalizeExperiment({
44
+ datasetId: 'clinical-triage-evals',
45
+ experimentId,
46
+ })
47
+ ```
48
+
49
+ For pure ingestion, create the experiment without `targetType`/`targetId` and replace step 2 with `submitExperimentResult`.
50
+
51
+ ## createDatasetExperiment()
52
+
53
+ Creates an experiment without starting a run. No runner is spawned, and the dataset version is pinned at creation time. Include a target when Mastra should execute items via `runExperimentItem`. Omit the target for pure ingestion via `submitExperimentResult`.
54
+
55
+ **datasetId** (`string`): ID of the dataset the experiment runs against.
56
+
57
+ **id** (`string`): Caller-supplied experiment ID (for example a workflow run ID). Makes creation idempotent on retry. Conflicting reuse of an ID returns a 409.
58
+
59
+ **targetType** (`'agent' | 'workflow' | 'scorer'`): Type of target that runExperimentItem executes. Provide together with targetId, or omit both.
60
+
61
+ **targetId** (`string`): ID of the registered target. Provide together with targetType.
62
+
63
+ **scorerIds** (`string[]`): Run-level scorer IDs resolved server-side by runExperimentItem. Requires a target.
64
+
65
+ **name** (`string`): Human-readable experiment name.
66
+
67
+ **description** (`string`): Experiment description.
68
+
69
+ **metadata** (`Record<string, unknown>`): Arbitrary metadata stored on the experiment.
70
+
71
+ **version** (`number`): Dataset version to pin. Defaults to the current dataset version.
72
+
73
+ **provenance** (`object`): Where the experiment came from (source, sourceId, sourceVersion, metadata).
74
+
75
+ **grouping** (`object`): Grouping fields (experimentSetId, comparisonId, variantId, trialIndex) for organizing related runs.
76
+
77
+ Returns `Promise<{ experimentId, status, totalItems, datasetVersion }>`.
78
+
79
+ ## runExperimentItem()
80
+
81
+ Executes one experiment item server-side: Mastra runs the experiment's target against the item, runs the resolved scorers, and upserts the result keyed by `(experimentId, itemId, attempt)`. Requires an experiment created with a target. Scorers resolve with the same precedence as native runs: experiment `scorerIds` win over item `scorerIds`, which win over dataset `scorerIds`.
82
+
83
+ **datasetId** (`string`): ID of the dataset the experiment runs against.
84
+
85
+ **experimentId** (`string`): ID of an experiment created with a target.
86
+
87
+ **itemId** (`string`): Dataset item to execute. Must exist at the pinned dataset version.
88
+
89
+ **attempt** (`number`): Zero-based repetition index for repeated trials. Defaults to 0. Retries of the same attempt converge on one row.
90
+
91
+ **requestContext** (`Record<string, unknown>`): Request context merged with the item's own request context (item values win).
92
+
93
+ Returns `Promise<{ result, scores }>` with the persisted result row and the scores produced for the item.
94
+
95
+ Calling it on a target-less experiment returns a `400`. Calling it after finalization returns a `409`.
96
+
97
+ ## submitExperimentResult()
98
+
99
+ Submits (or re-submits) one externally computed item result for a target-less experiment. Submitting the same `(experimentId, itemId, attempt)` key again updates the existing row instead of creating a duplicate. Use a different `attempt` value to record deliberate repeated trials as separate rows.
100
+
101
+ **datasetId** (`string`): ID of the dataset the experiment runs against.
102
+
103
+ **experimentId** (`string`): ID of the target-less experiment.
104
+
105
+ **itemId** (`string`): Dataset item this result belongs to. Must exist at the pinned dataset version.
106
+
107
+ **attempt** (`number`): Zero-based repetition index for repeated trials. Defaults to 0. Retries of the same attempt converge on one row.
108
+
109
+ **input** (`unknown`): Input replayed by the external runner. Defaults to the dataset item input.
110
+
111
+ **output** (`unknown`): Output produced by the external runner.
112
+
113
+ **groundTruth** (`unknown`): Ground truth. Defaults to the dataset item groundTruth.
114
+
115
+ **error** (`{ message: string; stack?: string; code?: string } | null`): Failure info when the item run failed. Counted as failed at finalization.
116
+
117
+ **startedAt** (`Date`): When the item run started.
118
+
119
+ **completedAt** (`Date`): When the item run completed.
120
+
121
+ **traceId** (`string`): Trace ID linking the result to observability data.
122
+
123
+ **scores** (`Array<{ scorerId: string; scorerName?: string; score: number; reason?: string; metadata?: Record<string, unknown> }>`): Externally computed scores. Persisted keyed by runId = experimentId, so they appear in comparisons like scorer-produced scores.
124
+
125
+ Returns `Promise<DatasetExperimentResult>`, the persisted result row.
126
+
127
+ Submitting to an experiment that has a target returns a `400`. Submitting after finalization returns a `409`.
128
+
129
+ ## finalizeExperiment()
130
+
131
+ Marks a caller-driven experiment completed. The server computes per-item counts from the persisted result rows, so the caller keeps no bookkeeping: `succeededCount` (at least one attempt without an error), `failedCount` (every attempt errored), and `skippedCount` (never submitted). Idempotent: finalizing an already-completed experiment returns the stored record.
132
+
133
+ **datasetId** (`string`): ID of the dataset the experiment runs against.
134
+
135
+ **experimentId** (`string`): ID of the experiment to finalize.
136
+
137
+ Returns `Promise<DatasetExperiment>`, the updated experiment record.
138
+
139
+ ## Related
140
+
141
+ - [Running experiments](https://mastra.ai/docs/datasets/running-experiments)
142
+ - [dataset.createExperiment()](https://mastra.ai/reference/datasets/createExperiment)
143
+ - [dataset.runExperimentItem()](https://mastra.ai/reference/datasets/runExperimentItem)
144
+ - [dataset.submitExperimentResult()](https://mastra.ai/reference/datasets/submitExperimentResult)
145
+ - [dataset.finalizeExperiment()](https://mastra.ai/reference/datasets/finalizeExperiment)
146
+ - [Server routes](https://mastra.ai/reference/server/routes)
@@ -731,6 +731,43 @@ export const mastra = new Mastra({
731
731
  })
732
732
  ```
733
733
 
734
+ ### server.handleShutdownSignals
735
+
736
+ **Type:** `boolean`\
737
+ **Default:** `true`
738
+
739
+ Whether the server generated by `mastra dev` and `mastra build` installs its own `SIGINT`/`SIGTERM` handlers. By default, receiving a signal begins graceful shutdown. The generated server stops accepting new connections and drains in-flight requests before it runs `mastra.shutdown()` and exits the process (see [`server.drainTimeout`](#serverdraintimeout)).
740
+
741
+ Set `handleShutdownSignals: false` to manage signals yourself, for example with a handler registered in your Mastra config module that calls `mastra.shutdown()`:
742
+
743
+ ```typescript
744
+ import { Mastra } from '@mastra/core'
745
+
746
+ export const mastra = new Mastra({
747
+ server: {
748
+ handleShutdownSignals: false,
749
+ },
750
+ })
751
+
752
+ let shuttingDown = false
753
+ const shutdown = async () => {
754
+ if (shuttingDown) return
755
+ shuttingDown = true
756
+ // custom shutdown coordination
757
+ await mastra.shutdown()
758
+ process.exit(0)
759
+ }
760
+
761
+ process.once('SIGINT', shutdown)
762
+ process.once('SIGTERM', shutdown)
763
+ ```
764
+
765
+ Be aware of these caveats:
766
+
767
+ - Without a handler of your own, Node.js default signal behavior applies: the process terminates immediately with no drain.
768
+ - Your handler has no access to the HTTP server handle in the generated entry file, so it can't drain in-flight HTTP requests. If you only need a longer drain window, prefer [`server.drainTimeout`](#serverdraintimeout). For full control over the server lifecycle, use a [server adapter](https://mastra.ai/docs/server/server-adapters).
769
+ - During `mastra dev`, the built-in handlers release storage resources between hot reloads (for example, DuckDB file locks). Disabling them without an equivalent handler can cause lock conflicts after a reload.
770
+
734
771
  ### server.host
735
772
 
736
773
  **Type:** `string`\
@@ -879,6 +916,27 @@ export const mastra = new Mastra({
879
916
  })
880
917
  ```
881
918
 
919
+ ### server.drainTimeout
920
+
921
+ **Type:** `number`\
922
+ **Default:** `5000` (5 seconds)
923
+
924
+ Maximum time in milliseconds to drain in-flight requests after the server receives `SIGINT` or `SIGTERM`. The value must be finite and between `0` and `2147483647`. During this window the server stops accepting new connections and waits for in-flight requests (including active streams) to finish; if the deadline passes first, remaining HTTP connections are closed. Upgraded connections such as WebSockets end when the process exits. Either way, `mastra.shutdown()` then runs (bounded by its own 5 second limit) before the process exits. Setting `0` skips the drain entirely.
925
+
926
+ Increase this when rolling deploys should let long-running agent turns finish. Configure it at least 5 seconds plus a safety margin below your platform's grace period so `mastra.shutdown()` can still complete. For example, account for `terminationGracePeriodSeconds` on Kubernetes:
927
+
928
+ ```typescript
929
+ import { Mastra } from '@mastra/core'
930
+
931
+ export const mastra = new Mastra({
932
+ server: {
933
+ drainTimeout: 600000, // 10 minutes
934
+ },
935
+ })
936
+ ```
937
+
938
+ Sending either shutdown signal again during the drain bypasses it and terminates the process immediately.
939
+
882
940
  ### server.studioBase
883
941
 
884
942
  **Type:** `string`\
@@ -0,0 +1,76 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # dataset.createExperiment()
4
+
5
+ **Added in:** `@mastra/core@1.61.0`
6
+
7
+ Creates an experiment without starting a run. Your own orchestrator (for example a Temporal workflow) drives the loop in one of two shapes:
8
+
9
+ - **With a target:** pass `targetType` and `targetId`, then call [`runExperimentItem()`](https://mastra.ai/reference/datasets/runExperimentItem) per item. Mastra executes the target and runs the scorers server-side.
10
+ - **Without a target:** omit both and run everything on your own infrastructure, ingesting each result with [`submitExperimentResult()`](https://mastra.ai/reference/datasets/submitExperimentResult).
11
+
12
+ Both shapes finish with [`finalizeExperiment()`](https://mastra.ai/reference/datasets/finalizeExperiment).
13
+
14
+ The experiment pins the dataset version at creation time, so submissions are validated against a stable set of items even if the dataset changes afterwards.
15
+
16
+ ## Usage example
17
+
18
+ ```typescript
19
+ import { Mastra } from '@mastra/core'
20
+
21
+ const mastra = new Mastra({/* storage config */})
22
+
23
+ const dataset = await mastra.datasets.get({ id: 'dataset-id' })
24
+
25
+ const { experimentId, totalItems, datasetVersion } = await dataset.createExperiment({
26
+ id: 'temporal-wf-run-42', // optional: idempotent create on retry
27
+ targetType: 'agent',
28
+ targetId: 'translation-agent',
29
+ scorers: ['accuracy'],
30
+ })
31
+ ```
32
+
33
+ Passing your own `id` makes creation idempotent: calling it again with the same `id` returns the existing experiment instead of failing, so a retried workflow activity is safe. If the `id` belongs to an experiment on another dataset or an experiment with a different target, the call throws an `EXPERIMENT_ID_CONFLICT` error.
34
+
35
+ `targetType` and `targetId` must be provided together, and the target must exist in the Mastra registry at create time. `scorers` requires a target because Mastra never scores target-less experiments; submit flat scores through `submitExperimentResult` instead.
36
+
37
+ ## Parameters
38
+
39
+ **id** (`string`): Caller-supplied experiment ID (for example a workflow run ID). Makes creation idempotent on retry.
40
+
41
+ **targetType** (`'agent' | 'workflow' | 'scorer'`): Type of target that runExperimentItem() executes. Provide together with targetId, or omit both for pure ingestion.
42
+
43
+ **targetId** (`string`): ID of the registered target. Provide together with targetType.
44
+
45
+ **scorers** (`string[]`): Run-level scorer IDs resolved server-side by runExperimentItem(). Requires a target.
46
+
47
+ **name** (`string`): Human-readable experiment name.
48
+
49
+ **description** (`string`): Experiment description.
50
+
51
+ **metadata** (`Record<string, unknown>`): Arbitrary metadata stored on the experiment.
52
+
53
+ **provenance** (`ExperimentProvenance`): Where the experiment came from (source system, ID, and version).
54
+
55
+ **grouping** (`ExperimentGrouping`): Grouping fields (experimentSetId, comparisonId, variantId, trialIndex) for organizing related runs.
56
+
57
+ **version** (`number`): Dataset version to pin. Defaults to the current dataset version.
58
+
59
+ ## Returns
60
+
61
+ **result** (`Promise<object>`): Immediate response with experiment ID.
62
+
63
+ **result.experimentId** (`string`): ID of the created (or existing) experiment.
64
+
65
+ **result.status** (`ExperimentStatus`): 'running' for a new experiment; the stored status when an existing experiment is returned.
66
+
67
+ **result.totalItems** (`number`): Number of dataset items visible at the pinned version.
68
+
69
+ **result.datasetVersion** (`number`): The pinned dataset version.
70
+
71
+ ## Related
72
+
73
+ - [dataset.runExperimentItem()](https://mastra.ai/reference/datasets/runExperimentItem)
74
+ - [dataset.submitExperimentResult()](https://mastra.ai/reference/datasets/submitExperimentResult)
75
+ - [dataset.finalizeExperiment()](https://mastra.ai/reference/datasets/finalizeExperiment)
76
+ - [Running experiments](https://mastra.ai/docs/datasets/running-experiments)
@@ -0,0 +1,43 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # dataset.finalizeExperiment()
4
+
5
+ **Added in:** `@mastra/core@1.61.0`
6
+
7
+ Finalizes a caller-driven experiment created with [`createExperiment()`](https://mastra.ai/reference/datasets/createExperiment), with or without a target. Mastra computes the final counts server-side from the persisted result rows and marks the experiment `'completed'`, so the caller never tracks completion bookkeeping.
8
+
9
+ Counts are per item, so `succeededCount + failedCount + skippedCount === totalItems` even when items have multiple attempts:
10
+
11
+ - `succeededCount`: items where at least one attempt completed without an error
12
+ - `failedCount`: items that were submitted but where every attempt errored
13
+ - `skippedCount`: dataset items that were never submitted (any attempt)
14
+
15
+ Attempt-level detail remains available through [`listExperimentResults()`](https://mastra.ai/reference/datasets/listExperimentResults).
16
+
17
+ Finalization is idempotent: calling it on an already-finalized experiment returns the stored record without recomputing.
18
+
19
+ ## Usage example
20
+
21
+ ```typescript
22
+ const experiment = await dataset.finalizeExperiment({ experimentId })
23
+
24
+ console.log(experiment.status) // 'completed'
25
+ console.log(experiment.succeededCount)
26
+ console.log(experiment.failedCount)
27
+ console.log(experiment.skippedCount)
28
+ ```
29
+
30
+ ## Parameters
31
+
32
+ **experimentId** (`string`): ID of the experiment to finalize.
33
+
34
+ ## Returns
35
+
36
+ Returns a `Promise<Experiment>`, the updated experiment record with final status, counts, and `completedAt` timestamp.
37
+
38
+ ## Related
39
+
40
+ - [dataset.createExperiment()](https://mastra.ai/reference/datasets/createExperiment)
41
+ - [dataset.runExperimentItem()](https://mastra.ai/reference/datasets/runExperimentItem)
42
+ - [dataset.submitExperimentResult()](https://mastra.ai/reference/datasets/submitExperimentResult)
43
+ - [Running experiments](https://mastra.ai/docs/datasets/running-experiments)
@@ -0,0 +1,55 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # dataset.runExperimentItem()
4
+
5
+ **Added in:** `@mastra/core@1.61.0`
6
+
7
+ Executes one experiment item server-side: runs the experiment's target against the item, runs the resolved scorers, and upserts the result row keyed by `(experimentId, itemId, attempt)`.
8
+
9
+ Built for caller-driven loops where a durable orchestrator (for example a Temporal workflow) fans out one call per item and owns retries and timeouts. A retried call converges on the same row. Requires an experiment created with a target via [`createExperiment()`](https://mastra.ai/reference/datasets/createExperiment).
10
+
11
+ Scorers resolve with the same precedence as native runs: experiment `scorers` win over item `scorerIds`, which win over dataset `scorerIds`.
12
+
13
+ ## Usage example
14
+
15
+ ```typescript
16
+ const { experimentId } = await dataset.createExperiment({
17
+ targetType: 'agent',
18
+ targetId: 'translation-agent',
19
+ scorers: ['accuracy'],
20
+ })
21
+
22
+ const { result, scores } = await dataset.runExperimentItem({
23
+ experimentId,
24
+ itemId: 'item-1',
25
+ })
26
+
27
+ console.log(result.output)
28
+ console.log(scores)
29
+ ```
30
+
31
+ Each call executes the item exactly once, with no internal retry loop. Calling it on a target-less experiment throws `EXPERIMENT_HAS_NO_TARGET`. Use [`submitExperimentResult()`](https://mastra.ai/reference/datasets/submitExperimentResult) for those. Calls after finalization throw `EXPERIMENT_ALREADY_FINALIZED`, and an `itemId` that isn't visible at the pinned dataset version throws `DATASET_ITEM_NOT_FOUND`.
32
+
33
+ ## Parameters
34
+
35
+ **experimentId** (`string`): ID of an experiment created with a target.
36
+
37
+ **itemId** (`string`): ID of the dataset item to execute. Must be visible at the pinned dataset version.
38
+
39
+ **attempt** (`number`): Attempt number for repeated trials. Defaults to 0. Same (experimentId, itemId, attempt) upserts the existing row.
40
+
41
+ **requestContext** (`Record<string, unknown>`): Request context merged with the item's own request context (item values win).
42
+
43
+ ## Returns
44
+
45
+ **result** (`Promise<object>`): The persisted result and its scores.
46
+
47
+ **result.result** (`ExperimentResult`): The persisted result row, including output, error, traceId, attempt, and timestamps.
48
+
49
+ **result.scores** (`ScorerResult[]`): Scores produced by the resolved scorers for this item.
50
+
51
+ ## Related
52
+
53
+ - [dataset.createExperiment()](https://mastra.ai/reference/datasets/createExperiment)
54
+ - [dataset.finalizeExperiment()](https://mastra.ai/reference/datasets/finalizeExperiment)
55
+ - [Running experiments](https://mastra.ai/docs/datasets/running-experiments)
@@ -0,0 +1,56 @@
1
+ > Discover all available pages from the documentation index: https://mastra.ai/llms.txt
2
+
3
+ # dataset.submitExperimentResult()
4
+
5
+ **Added in:** `@mastra/core@1.61.0`
6
+
7
+ Submits (or re-submits) one externally computed item result for a target-less experiment created with [`createExperiment()`](https://mastra.ai/reference/datasets/createExperiment).
8
+
9
+ Submissions are upserts keyed by `(experimentId, itemId, attempt)`: a retried worker that submits the same key converges on a single row instead of duplicating results. Use a different `attempt` value to record repeated trials as separate rows.
10
+
11
+ ## Usage example
12
+
13
+ ```typescript
14
+ const result = await dataset.submitExperimentResult({
15
+ experimentId,
16
+ itemId: 'item-1',
17
+ output: { translation: 'Hola' },
18
+ scores: [{ scorerId: 'accuracy', score: 0.92, reason: 'Faithful translation' }],
19
+ })
20
+ ```
21
+
22
+ The item must be visible at the experiment's pinned dataset version. Submissions to an experiment that has a target throw `EXPERIMENT_HAS_TARGET`, which prevents two writers from racing on the same rows. Submissions after finalization throw `EXPERIMENT_ALREADY_FINALIZED`.
23
+
24
+ ## Parameters
25
+
26
+ **experimentId** (`string`): ID of the target-less experiment.
27
+
28
+ **itemId** (`string`): ID of the dataset item this result belongs to.
29
+
30
+ **attempt** (`number`): Attempt number for repeated trials. Defaults to 0. Same (experimentId, itemId, attempt) upserts the existing row.
31
+
32
+ **input** (`unknown`): Input the worker ran. Defaults to the dataset item's input at the pinned version.
33
+
34
+ **output** (`unknown`): Output produced by the external worker.
35
+
36
+ **groundTruth** (`unknown`): Expected output. Defaults to the dataset item's ground truth at the pinned version.
37
+
38
+ **error** (`object`): Error details (message, optional stack and code) when the item failed.
39
+
40
+ **startedAt** (`Date`): When the worker started this item.
41
+
42
+ **completedAt** (`Date`): When the worker finished this item.
43
+
44
+ **traceId** (`string`): Trace ID linking the result to observability data.
45
+
46
+ **scores** (`array`): Externally computed scores (scorerId, score, optional scorerName, reason, metadata). Persisted to the scores store under the experiment, so they appear in comparisons alongside native scorer runs. Score persistence is best-effort and never fails the submission.
47
+
48
+ ## Returns
49
+
50
+ Returns a `Promise<ExperimentResult>`, the persisted result row, including its `id`, `attempt`, and timestamps.
51
+
52
+ ## Related
53
+
54
+ - [dataset.createExperiment()](https://mastra.ai/reference/datasets/createExperiment)
55
+ - [dataset.finalizeExperiment()](https://mastra.ai/reference/datasets/finalizeExperiment)
56
+ - [Running experiments](https://mastra.ai/docs/datasets/running-experiments)
@@ -68,6 +68,7 @@ The Reference section provides documentation of Mastra's API, including paramete
68
68
  - [mastra](https://mastra.ai/reference/cli/mastra)
69
69
  - [Agents API](https://mastra.ai/reference/client-js/agents)
70
70
  - [Conversations API](https://mastra.ai/reference/client-js/conversations)
71
+ - [Datasets API](https://mastra.ai/reference/client-js/datasets)
71
72
  - [Error Handling](https://mastra.ai/reference/client-js/error-handling)
72
73
  - [Logs API](https://mastra.ai/reference/client-js/logs)
73
74
  - [Mastra Client SDK](https://mastra.ai/reference/client-js/mastra-client)
@@ -166,10 +167,12 @@ The Reference section provides documentation of Mastra's API, including paramete
166
167
  - [.addItems()](https://mastra.ai/reference/datasets/addItems)
167
168
  - [.compareExperiments()](https://mastra.ai/reference/datasets/compareExperiments)
168
169
  - [.create()](https://mastra.ai/reference/datasets/create)
170
+ - [.createExperiment()](https://mastra.ai/reference/datasets/createExperiment)
169
171
  - [.delete()](https://mastra.ai/reference/datasets/delete)
170
172
  - [.deleteExperiment()](https://mastra.ai/reference/datasets/deleteExperiment)
171
173
  - [.deleteItem()](https://mastra.ai/reference/datasets/deleteItem)
172
174
  - [.deleteItems()](https://mastra.ai/reference/datasets/deleteItems)
175
+ - [.finalizeExperiment()](https://mastra.ai/reference/datasets/finalizeExperiment)
173
176
  - [.get()](https://mastra.ai/reference/datasets/get)
174
177
  - [.getDetails()](https://mastra.ai/reference/datasets/getDetails)
175
178
  - [.getExperiment()](https://mastra.ai/reference/datasets/getExperiment)
@@ -180,8 +183,10 @@ The Reference section provides documentation of Mastra's API, including paramete
180
183
  - [.listExperiments()](https://mastra.ai/reference/datasets/listExperiments)
181
184
  - [.listItems()](https://mastra.ai/reference/datasets/listItems)
182
185
  - [.listVersions()](https://mastra.ai/reference/datasets/listVersions)
186
+ - [.runExperimentItem()](https://mastra.ai/reference/datasets/runExperimentItem)
183
187
  - [.startExperiment()](https://mastra.ai/reference/datasets/startExperiment)
184
188
  - [.startExperimentAsync()](https://mastra.ai/reference/datasets/startExperimentAsync)
189
+ - [.submitExperimentResult()](https://mastra.ai/reference/datasets/submitExperimentResult)
185
190
  - [.update()](https://mastra.ai/reference/datasets/update)
186
191
  - [.updateItem()](https://mastra.ai/reference/datasets/updateItem)
187
192
  - [config.ts](https://mastra.ai/reference/file-based-agents/config)
@@ -135,4 +135,14 @@ When a subscriber calls `nack`, the event is republished with an incremented `de
135
135
 
136
136
  Lease keys are namespaced under the same `keyPrefix` as topics, as `<keyPrefix>:lease:<key>`. All operations are atomic: `acquireLease` uses `SET NX PX` and refreshes its own TTL idempotently, while `releaseLease`, `renewLease`, and `transferLease` use Lua scripts that check ownership before mutating, so a concurrent renewal from another owner is never clobbered.
137
137
 
138
- You don't call these methods directly. Configuring `RedisStreamsPubSub` as the `pubsub` backend is enough for the runtime to detect and use the capability. See [`LeaseProvider`](https://mastra.ai/reference/pubsub/lease-provider) for the full method contract.
138
+ You don't call these methods directly. Configuring `RedisStreamsPubSub` as the `pubsub` backend is enough for the runtime to detect and use the capability. See [`LeaseProvider`](https://mastra.ai/reference/pubsub/lease-provider) for the full method contract.
139
+
140
+ ## Managed provisioning
141
+
142
+ When you deploy a project that reads `REDIS_URL` from the environment, the Mastra CLI's `deploy` preflight offers to attach a managed Redis on the Mastra platform in one step.
143
+
144
+ If you accept, `mastra deploy` provisions the database and waits for it to reach the ready state before injecting `REDIS_URL` into the deploy so `new RedisStreamsPubSub({ url: process.env.REDIS_URL })` connects without extra setup.
145
+
146
+ The prompt is shown only when three conditions hold: `REDIS_URL` is referenced by user code, the environment's value is missing or points to a localhost address, and the run is interactive (a terminal without the `--yes` flag). Non-interactive runs (CI, `--yes`) report the issue with a copy-pasteable `mastra env db create --kind redis` command instead of silently creating infrastructure.
147
+
148
+ You can also provision a managed Redis up front with `mastra env db create --kind redis`. Once attached, the platform meters CPU seconds and memory GB-hours and shows them on the project's Database Usage page.
@@ -368,6 +368,117 @@ On authenticated servers, the read routes require the `stored-workflows:read` pe
368
368
  }
369
369
  ```
370
370
 
371
+ ## Datasets and experiments
372
+
373
+ | Method | Path | Description |
374
+ | -------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------- |
375
+ | `GET` | `/api/datasets` | List datasets |
376
+ | `POST` | `/api/datasets` | Create a dataset |
377
+ | `GET` | `/api/datasets/:datasetId` | Get dataset by ID |
378
+ | `PATCH` | `/api/datasets/:datasetId` | Update a dataset |
379
+ | `DELETE` | `/api/datasets/:datasetId` | Delete a dataset |
380
+ | `GET` | `/api/datasets/:datasetId/items` | List dataset items |
381
+ | `POST` | `/api/datasets/:datasetId/items` | Add a dataset item |
382
+ | `GET` | `/api/experiments` | List experiments across datasets |
383
+ | `GET` | `/api/datasets/:datasetId/experiments` | List experiments for a dataset |
384
+ | `POST` | `/api/datasets/:datasetId/experiments` | Trigger an experiment, or create one without starting it (`start: false`) |
385
+ | `POST` | `/api/datasets/:datasetId/experiments/:experimentId/items/:itemId/run` | Execute one experiment item server-side |
386
+ | `POST` | `/api/datasets/:datasetId/experiments/:experimentId/results` | Submit an externally computed item result |
387
+ | `POST` | `/api/datasets/:datasetId/experiments/:experimentId/finalize` | Finalize a caller-driven experiment |
388
+ | `GET` | `/api/datasets/:datasetId/experiments/:experimentId` | Get experiment by ID |
389
+ | `GET` | `/api/datasets/:datasetId/experiments/:experimentId/results` | List experiment results |
390
+ | `POST` | `/api/datasets/:datasetId/compare` | Compare two experiments |
391
+
392
+ ### Caller-driven experiment routes
393
+
394
+ Use these routes when your own orchestrator (for example a Temporal workflow) owns the experiment loop and Mastra acts as the system of record. Item runs, result submission, and finalization are safe to retry. Creation is safe to retry only when the request includes a caller-supplied `id`; without one, each retry creates a new experiment. Item runs and result submissions upsert on `(experimentId, itemId, attempt)`. Finalize returns the stored record if the experiment is already completed.
395
+
396
+ #### Create experiment request body
397
+
398
+ Post to `/api/datasets/:datasetId/experiments` with `start: false` to create the experiment without running it. Include `targetType` and `targetId` when Mastra should execute items via the run-item route. Omit both for pure ingestion via the results route.
399
+
400
+ ```typescript
401
+ {
402
+ start?: boolean; // false creates the experiment without running it. Defaults to true.
403
+ id?: string; // Caller-supplied experiment id (e.g. a workflow run id) for idempotent creates
404
+ targetType?: 'agent' | 'workflow' | 'scorer'; // Provide with targetId, or omit both
405
+ targetId?: string;
406
+ scorerIds?: string[]; // Run-level scorer ids, resolved server-side. Requires a target when start is false.
407
+ name?: string;
408
+ description?: string;
409
+ metadata?: Record<string, unknown>;
410
+ version?: number; // Pin to a specific dataset version (defaults to latest)
411
+ provenance?: {
412
+ source?: string;
413
+ sourceId?: string;
414
+ sourceVersion?: string;
415
+ metadata?: Record<string, unknown>;
416
+ };
417
+ grouping?: { // Stable grouping dimensions for comparisons and repeated trials
418
+ experimentSetId?: string;
419
+ comparisonId?: string;
420
+ variantId?: string;
421
+ trialIndex?: number;
422
+ };
423
+ }
424
+ ```
425
+
426
+ Returns `{ experimentId, status, totalItems, datasetVersion }` when `start` is `false`.
427
+
428
+ #### Run experiment item request body
429
+
430
+ `POST /api/datasets/:datasetId/experiments/:experimentId/items/:itemId/run` executes the experiment's target against one item and runs the resolved scorers, then upserts the result. Requires an experiment created with a target.
431
+
432
+ ```typescript
433
+ {
434
+ attempt?: number; // Zero-based repetition index. Defaults to 0.
435
+ requestContext?: Record<string, unknown>; // Merged with the item's own request context (item wins)
436
+ }
437
+ ```
438
+
439
+ Returns `{ result, scores }` with the persisted result row and the scores produced for the item.
440
+
441
+ #### Submit experiment result request body
442
+
443
+ ```typescript
444
+ {
445
+ itemId: string; // Dataset item this result belongs to
446
+ attempt?: number; // Zero-based repetition index. Defaults to 0.
447
+ input?: unknown; // Defaults to the dataset item input
448
+ output?: unknown; // Output produced by the external runner
449
+ groundTruth?: unknown; // Defaults to the dataset item groundTruth
450
+ error?: { // Failure info when the item run failed
451
+ message: string;
452
+ stack?: string;
453
+ code?: string;
454
+ } | null;
455
+ startedAt?: string; // ISO date
456
+ completedAt?: string; // ISO date
457
+ traceId?: string;
458
+ scores?: Array<{ // Externally computed scores, persisted keyed by runId = experimentId
459
+ scorerId: string;
460
+ scorerName?: string;
461
+ score: number;
462
+ reason?: string;
463
+ metadata?: Record<string, unknown>;
464
+ }>;
465
+ }
466
+ ```
467
+
468
+ Returns the persisted experiment result row.
469
+
470
+ #### Finalize experiment
471
+
472
+ `POST /api/datasets/:datasetId/experiments/:experimentId/finalize` takes no body. The server computes per-item counts from the persisted result rows and marks the experiment `completed`: `succeededCount` (at least one attempt without an error), `failedCount` (every attempt errored), and `skippedCount` (never submitted). Returns the updated experiment record.
473
+
474
+ #### Caller-driven experiment error responses
475
+
476
+ | Status | Condition |
477
+ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
478
+ | `400` | Result submitted to an experiment that has a target (`EXPERIMENT_HAS_TARGET`), item run requested on a target-less experiment (`EXPERIMENT_HAS_NO_TARGET`), `targetType` and `targetId` weren't provided together (`EXPERIMENT_INVALID_TARGET`), or the dataset has no items at the pinned version (`EXPERIMENT_NO_ITEMS`) |
479
+ | `404` | Dataset, experiment, dataset item, or target not found (`EXPERIMENT_TARGET_NOT_FOUND`) |
480
+ | `409` | Caller-supplied experiment `id` already exists for a different dataset or target (`EXPERIMENT_ID_CONFLICT`), or a call arrived after finalization (`EXPERIMENT_ALREADY_FINALIZED`) |
481
+
371
482
  ## MCP
372
483
 
373
484
  | Method | Path | Description |
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @mastra/mcp-docs-server
2
2
 
3
+ ## 1.2.18-alpha.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`9267e9b`](https://github.com/mastra-ai/mastra/commit/9267e9b3d9c2fcf16936050495a787054c2431ab), [`acc3471`](https://github.com/mastra-ai/mastra/commit/acc3471de5f3fde8027ee4e355af292b2bc1bc30), [`b6a771e`](https://github.com/mastra-ai/mastra/commit/b6a771ef23d203ddb348efca8065eff65def8191), [`9267e9b`](https://github.com/mastra-ai/mastra/commit/9267e9b3d9c2fcf16936050495a787054c2431ab), [`26d4016`](https://github.com/mastra-ai/mastra/commit/26d40160ff7f7d8bf95fee2039a52cbc83863533), [`9267e9b`](https://github.com/mastra-ai/mastra/commit/9267e9b3d9c2fcf16936050495a787054c2431ab), [`9267e9b`](https://github.com/mastra-ai/mastra/commit/9267e9b3d9c2fcf16936050495a787054c2431ab), [`57c5103`](https://github.com/mastra-ai/mastra/commit/57c51035a2a36e3df3c4f32f46bb789a66ed5946)]:
8
+ - @mastra/core@1.61.0-alpha.3
9
+
3
10
  ## 1.2.18-alpha.4
4
11
 
5
12
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/mcp-docs-server",
3
- "version": "1.2.18-alpha.5",
3
+ "version": "1.2.18-alpha.6",
4
4
  "description": "MCP server for accessing Mastra.ai documentation, changelogs, and news.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,7 +28,7 @@
28
28
  "jsdom": "^26.1.0",
29
29
  "local-pkg": "^1.1.2",
30
30
  "zod": "^4.4.3",
31
- "@mastra/core": "1.61.0-alpha.2",
31
+ "@mastra/core": "1.61.0-alpha.3",
32
32
  "@mastra/mcp": "^1.17.1-alpha.0"
33
33
  },
34
34
  "devDependencies": {
@@ -47,7 +47,7 @@
47
47
  "vitest": "4.1.10",
48
48
  "@internal/lint": "0.0.124",
49
49
  "@internal/types-builder": "0.0.99",
50
- "@mastra/core": "1.61.0-alpha.2"
50
+ "@mastra/core": "1.61.0-alpha.3"
51
51
  },
52
52
  "homepage": "https://mastra.ai",
53
53
  "repository": {