@mastra/mcp-docs-server 1.2.2-alpha.5 → 1.2.2-alpha.9
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.
- package/.docs/docs/harness/modes.md +21 -0
- package/.docs/models/gateways/openrouter.md +2 -1
- package/.docs/models/gateways/vercel.md +2 -1
- package/.docs/models/index.md +1 -1
- package/.docs/models/providers/berget.md +4 -3
- package/.docs/models/providers/evroc.md +19 -17
- package/.docs/models/providers/llmgateway.md +24 -23
- package/.docs/models/providers/minimax-cn-coding-plan.md +1 -1
- package/.docs/models/providers/minimax-cn.md +1 -1
- package/.docs/models/providers/minimax-coding-plan.md +1 -1
- package/.docs/models/providers/minimax.md +1 -1
- package/.docs/models/providers/neuralwatt.md +2 -1
- package/.docs/models/providers/stepfun.md +3 -2
- package/.docs/reference/harness/harness-class.md +64 -51
- package/.docs/reference/harness/session.md +15 -0
- package/.docs/reference/processors/processor-interface.md +2 -0
- package/CHANGELOG.md +14 -0
- package/package.json +3 -3
|
@@ -79,6 +79,27 @@ const buildMode = { id: 'build', additionalTools: { deployTool } }
|
|
|
79
79
|
|
|
80
80
|
You can't set both `tools` and `additionalTools` on the same mode.
|
|
81
81
|
|
|
82
|
+
### Restricting tool visibility
|
|
83
|
+
|
|
84
|
+
`tools` and `additionalTools` control which tools are **added** to a mode's run — they don't hide the backing agent's own tools. To restrict which of those tools the model can actually see and call, set `availableTools`:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const reviewMode = {
|
|
88
|
+
id: 'review',
|
|
89
|
+
name: 'Review',
|
|
90
|
+
// Only these tools are visible to the model in this mode.
|
|
91
|
+
availableTools: ['view', 'find_files', 'search_content'],
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`availableTools` is a per-mode visibility allowlist that matches each tool by its final exposed name:
|
|
96
|
+
|
|
97
|
+
- **`undefined`** (default): no mode-level restriction — every tool is visible.
|
|
98
|
+
- **`[]`**: no tools are available for this mode.
|
|
99
|
+
- A denied tool stays hidden even if it appears in the list. Per-tool and per-category `deny` rules in your permission config always take precedence.
|
|
100
|
+
|
|
101
|
+
Workspace tools use the same list as every other tool — reference them by their exposed names (`view`, `write_file`, `find_files`, etc.). Visibility is enforced at LLM-call time, so the model never sees — and can't attempt to call — a tool outside the allowlist.
|
|
102
|
+
|
|
82
103
|
### Mode transitions
|
|
83
104
|
|
|
84
105
|
A mode can declare a `transitionsTo` target. When the `submit_plan` built-in tool runs in that mode, the Harness transitions to the target mode on approval:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# OpenRouter
|
|
2
2
|
|
|
3
|
-
OpenRouter aggregates models from multiple providers with enhanced features like rate limiting and failover. Access
|
|
3
|
+
OpenRouter aggregates models from multiple providers with enhanced features like rate limiting and failover. Access 337 models through Mastra's model router.
|
|
4
4
|
|
|
5
5
|
Learn more in the [OpenRouter documentation](https://openrouter.ai/models).
|
|
6
6
|
|
|
@@ -336,6 +336,7 @@ ANTHROPIC_API_KEY=ant-...
|
|
|
336
336
|
| `rekaai/reka-flash-3` |
|
|
337
337
|
| `relace/relace-apply-3` |
|
|
338
338
|
| `relace/relace-search` |
|
|
339
|
+
| `sakana/fugu-ultra` |
|
|
339
340
|
| `sao10k/l3-lunaris-8b` |
|
|
340
341
|
| `sao10k/l3.1-70b-hanami-x1` |
|
|
341
342
|
| `sao10k/l3.1-euryale-70b` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vercel
|
|
2
2
|
|
|
3
|
-
Vercel aggregates models from multiple providers with enhanced features like rate limiting and failover. Access
|
|
3
|
+
Vercel aggregates models from multiple providers with enhanced features like rate limiting and failover. Access 291 models through Mastra's model router.
|
|
4
4
|
|
|
5
5
|
Learn more in the [Vercel documentation](https://ai-sdk.dev/providers/ai-sdk-providers).
|
|
6
6
|
|
|
@@ -323,4 +323,5 @@ ANTHROPIC_API_KEY=ant-...
|
|
|
323
323
|
| `zai/glm-5-turbo` |
|
|
324
324
|
| `zai/glm-5.1` |
|
|
325
325
|
| `zai/glm-5.2` |
|
|
326
|
+
| `zai/glm-5.2-fast` |
|
|
326
327
|
| `zai/glm-5v-turbo` |
|
package/.docs/models/index.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Model Providers
|
|
2
2
|
|
|
3
|
-
Mastra provides a unified interface for working with LLMs across multiple providers, giving you access to
|
|
3
|
+
Mastra provides a unified interface for working with LLMs across multiple providers, giving you access to 4544 models from 133 providers through a single API.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Berget.AI
|
|
2
2
|
|
|
3
|
-
Access
|
|
3
|
+
Access 8 Berget.AI models through Mastra's model router. Authentication is handled automatically using the `BERGET_API_KEY` environment variable.
|
|
4
4
|
|
|
5
5
|
Learn more in the [Berget.AI documentation](https://api.berget.ai).
|
|
6
6
|
|
|
@@ -39,8 +39,9 @@ for await (const chunk of stream) {
|
|
|
39
39
|
| `berget/mistralai/Mistral-Medium-3.5-128B` | 262K | | | | | | $2 | $6 |
|
|
40
40
|
| `berget/mistralai/Mistral-Small-3.2-24B-Instruct-2506` | 32K | | | | | | $0.33 | $0.33 |
|
|
41
41
|
| `berget/moonshotai/Kimi-K2.6` | 262K | | | | | | $0.83 | $4 |
|
|
42
|
-
| `berget/openai/gpt-oss-120b` | 128K | | | | | | $0.
|
|
42
|
+
| `berget/openai/gpt-oss-120b` | 128K | | | | | | $0.22 | $0.83 |
|
|
43
43
|
| `berget/zai-org/GLM-4.7` | 128K | | | | | | $0.77 | $3 |
|
|
44
|
+
| `berget/zai-org/GLM-5.2` | 524K | | | | | | $2 | $5 |
|
|
44
45
|
|
|
45
46
|
## Advanced configuration
|
|
46
47
|
|
|
@@ -70,7 +71,7 @@ const agent = new Agent({
|
|
|
70
71
|
model: ({ requestContext }) => {
|
|
71
72
|
const useAdvanced = requestContext.task === "complex";
|
|
72
73
|
return useAdvanced
|
|
73
|
-
? "berget/zai-org/GLM-
|
|
74
|
+
? "berget/zai-org/GLM-5.2"
|
|
74
75
|
: "berget/google/gemma-4-31B-it";
|
|
75
76
|
}
|
|
76
77
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# evroc
|
|
2
2
|
|
|
3
|
-
Access
|
|
3
|
+
Access 15 evroc models through Mastra's model router. Authentication is handled automatically using the `EVROC_API_KEY` environment variable.
|
|
4
4
|
|
|
5
5
|
Learn more in the [evroc documentation](https://docs.evroc.com/products/think/overview.html).
|
|
6
6
|
|
|
@@ -32,21 +32,23 @@ for await (const chunk of stream) {
|
|
|
32
32
|
|
|
33
33
|
## Models
|
|
34
34
|
|
|
35
|
-
| Model
|
|
36
|
-
|
|
|
37
|
-
| `evroc/
|
|
38
|
-
| `evroc/
|
|
39
|
-
| `evroc/
|
|
40
|
-
| `evroc/
|
|
41
|
-
| `evroc/mistralai/
|
|
42
|
-
| `evroc/mistralai/Voxtral-Small-24B-2507`
|
|
43
|
-
| `evroc/moonshotai/Kimi-K2.
|
|
44
|
-
| `evroc/nvidia/Llama-3.3-70B-Instruct-FP8`
|
|
45
|
-
| `evroc/openai/gpt-oss-120b`
|
|
46
|
-
| `evroc/openai/whisper-large-v3`
|
|
47
|
-
| `evroc/
|
|
48
|
-
| `evroc/Qwen/Qwen3-Embedding-8B`
|
|
49
|
-
| `evroc/Qwen/Qwen3-
|
|
35
|
+
| Model | Context | Tools | Reasoning | Image | Audio | Video | Input $/1M | Output $/1M |
|
|
36
|
+
| ----------------------------------------------- | ------- | ----- | --------- | ----- | ----- | ----- | ---------- | ----------- |
|
|
37
|
+
| `evroc/evroc/roc` | 262K | | | | | | $3 | $12 |
|
|
38
|
+
| `evroc/google/gemma-4-26B-A4B-it` | 262K | | | | | | $0.14 | $0.57 |
|
|
39
|
+
| `evroc/intfloat/multilingual-e5-large-instruct` | 512 | | | | | | $0.11 | $0.11 |
|
|
40
|
+
| `evroc/KBLab/kb-whisper-large` | 448 | | | | | | $0.00 | $0.00 |
|
|
41
|
+
| `evroc/mistralai/Mistral-Medium-3.5-128B` | 262K | | | | | | $2 | $7 |
|
|
42
|
+
| `evroc/mistralai/Voxtral-Small-24B-2507` | 32K | | | | | | $0.00 | $0.00 |
|
|
43
|
+
| `evroc/moonshotai/Kimi-K2.6` | 262K | | | | | | $1 | $6 |
|
|
44
|
+
| `evroc/nvidia/Llama-3.3-70B-Instruct-FP8` | 128K | | | | | | $1 | $1 |
|
|
45
|
+
| `evroc/openai/gpt-oss-120b` | 66K | | | | | | $0.23 | $0.92 |
|
|
46
|
+
| `evroc/openai/whisper-large-v3` | 448 | | | | | | $0.00 | $0.00 |
|
|
47
|
+
| `evroc/openai/whisper-large-v3-turbo` | 448 | | | | | | $0.00 | $0.00 |
|
|
48
|
+
| `evroc/Qwen/Qwen3-Embedding-8B` | 41K | | | | | | $0.12 | $0.12 |
|
|
49
|
+
| `evroc/Qwen/Qwen3-Reranker-4B` | 32K | | | | | | $0.06 | — |
|
|
50
|
+
| `evroc/Qwen/Qwen3-VL-30B-A3B-Instruct` | 100K | | | | | | $0.23 | $0.92 |
|
|
51
|
+
| `evroc/Qwen/Qwen3.6-35B-A3B-FP8` | 262K | | | | | | $0.34 | $1 |
|
|
50
52
|
|
|
51
53
|
## Advanced configuration
|
|
52
54
|
|
|
@@ -76,7 +78,7 @@ const agent = new Agent({
|
|
|
76
78
|
model: ({ requestContext }) => {
|
|
77
79
|
const useAdvanced = requestContext.task === "complex";
|
|
78
80
|
return useAdvanced
|
|
79
|
-
? "evroc/openai/whisper-large-v3"
|
|
81
|
+
? "evroc/openai/whisper-large-v3-turbo"
|
|
80
82
|
: "evroc/KBLab/kb-whisper-large";
|
|
81
83
|
}
|
|
82
84
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# LLM Gateway
|
|
2
2
|
|
|
3
|
-
Access
|
|
3
|
+
Access 182 LLM Gateway models through Mastra's model router. Authentication is handled automatically using the `LLMGATEWAY_API_KEY` environment variable.
|
|
4
4
|
|
|
5
5
|
Learn more in the [LLM Gateway documentation](https://llmgateway.io/docs).
|
|
6
6
|
|
|
@@ -51,7 +51,7 @@ for await (const chunk of stream) {
|
|
|
51
51
|
| `llmgateway/codestral-2508` | 256K | | | | | | $0.30 | $0.90 |
|
|
52
52
|
| `llmgateway/custom` | 128K | | | | | | — | — |
|
|
53
53
|
| `llmgateway/deepseek-v3.1` | 128K | | | | | | $0.56 | $2 |
|
|
54
|
-
| `llmgateway/deepseek-v3.2` | 164K | | | | | | $0.
|
|
54
|
+
| `llmgateway/deepseek-v3.2` | 164K | | | | | | $0.26 | $0.38 |
|
|
55
55
|
| `llmgateway/deepseek-v4-flash` | 1.1M | | | | | | $0.14 | $0.28 |
|
|
56
56
|
| `llmgateway/deepseek-v4-pro` | 1.1M | | | | | | $0.43 | $0.87 |
|
|
57
57
|
| `llmgateway/fugu-ultra` | 1.0M | | | | | | $5 | $30 |
|
|
@@ -68,21 +68,21 @@ for await (const chunk of stream) {
|
|
|
68
68
|
| `llmgateway/gemma-4-31b-it` | 262K | | | | | | $0.13 | $0.38 |
|
|
69
69
|
| `llmgateway/glm-4-32b-0414-128k` | 128K | | | | | | $0.10 | $0.10 |
|
|
70
70
|
| `llmgateway/glm-4.5` | 131K | | | | | | $0.60 | $2 |
|
|
71
|
-
| `llmgateway/glm-4.5-air` | 131K | | | | | | $0.
|
|
71
|
+
| `llmgateway/glm-4.5-air` | 131K | | | | | | $0.13 | $0.85 |
|
|
72
72
|
| `llmgateway/glm-4.5-airx` | 128K | | | | | | $1 | $5 |
|
|
73
73
|
| `llmgateway/glm-4.5-flash` | 128K | | | | | | — | — |
|
|
74
74
|
| `llmgateway/glm-4.5-x` | 128K | | | | | | $2 | $9 |
|
|
75
75
|
| `llmgateway/glm-4.5v` | 128K | | | | | | $0.60 | $2 |
|
|
76
|
-
| `llmgateway/glm-4.6` | 205K | | | | | | $0.
|
|
76
|
+
| `llmgateway/glm-4.6` | 205K | | | | | | $0.43 | $2 |
|
|
77
77
|
| `llmgateway/glm-4.6v` | 131K | | | | | | $0.30 | $0.90 |
|
|
78
78
|
| `llmgateway/glm-4.6v-flash` | 128K | | | | | | — | — |
|
|
79
79
|
| `llmgateway/glm-4.6v-flashx` | 128K | | | | | | $0.04 | $0.40 |
|
|
80
|
-
| `llmgateway/glm-4.7` | 205K | | | | | | $0.
|
|
80
|
+
| `llmgateway/glm-4.7` | 205K | | | | | | $0.38 | $2 |
|
|
81
81
|
| `llmgateway/glm-4.7-flash` | 200K | | | | | | $0.06 | $0.40 |
|
|
82
82
|
| `llmgateway/glm-4.7-flash-free` | 200K | | | | | | — | — |
|
|
83
83
|
| `llmgateway/glm-4.7-flashx` | 200K | | | | | | $0.07 | $0.40 |
|
|
84
|
-
| `llmgateway/glm-5` | 203K | | | | | | $
|
|
85
|
-
| `llmgateway/glm-5.1` | 205K | | | | | | $
|
|
84
|
+
| `llmgateway/glm-5` | 203K | | | | | | $0.72 | $2 |
|
|
85
|
+
| `llmgateway/glm-5.1` | 205K | | | | | | $0.93 | $3 |
|
|
86
86
|
| `llmgateway/glm-5.2` | 1.0M | | | | | | $1 | $4 |
|
|
87
87
|
| `llmgateway/gpt-3.5-turbo` | 16K | | | | | | $0.50 | $2 |
|
|
88
88
|
| `llmgateway/gpt-4` | 8K | | | | | | $30 | $60 |
|
|
@@ -114,8 +114,8 @@ for await (const chunk of stream) {
|
|
|
114
114
|
| `llmgateway/gpt-5.4-pro` | 1.1M | | | | | | $30 | $180 |
|
|
115
115
|
| `llmgateway/gpt-5.5` | 1.1M | | | | | | $5 | $30 |
|
|
116
116
|
| `llmgateway/gpt-5.5-pro` | 1.1M | | | | | | $30 | $180 |
|
|
117
|
-
| `llmgateway/gpt-oss-120b` | 131K | | | | | | $0.
|
|
118
|
-
| `llmgateway/gpt-oss-20b` | 131K | | | | | | $0.
|
|
117
|
+
| `llmgateway/gpt-oss-120b` | 131K | | | | | | $0.05 | $0.25 |
|
|
118
|
+
| `llmgateway/gpt-oss-20b` | 131K | | | | | | $0.04 | $0.15 |
|
|
119
119
|
| `llmgateway/grok-4` | 256K | | | | | | $3 | $15 |
|
|
120
120
|
| `llmgateway/grok-4-1-fast-non-reasoning` | 2.0M | | | | | | $0.20 | $0.50 |
|
|
121
121
|
| `llmgateway/grok-4-1-fast-reasoning` | 2.0M | | | | | | $0.20 | $0.50 |
|
|
@@ -125,11 +125,11 @@ for await (const chunk of stream) {
|
|
|
125
125
|
| `llmgateway/grok-4-20-reasoning` | 2.0M | | | | | | $2 | $6 |
|
|
126
126
|
| `llmgateway/grok-4-3` | 1.0M | | | | | | $1 | $3 |
|
|
127
127
|
| `llmgateway/grok-build-0-1` | 256K | | | | | | $1 | $2 |
|
|
128
|
-
| `llmgateway/kimi-k2` | 256K | | | | | | $
|
|
129
|
-
| `llmgateway/kimi-k2-thinking` | 262K | | | | | | $0.
|
|
128
|
+
| `llmgateway/kimi-k2` | 256K | | | | | | $0.57 | $2 |
|
|
129
|
+
| `llmgateway/kimi-k2-thinking` | 262K | | | | | | $0.57 | $2 |
|
|
130
130
|
| `llmgateway/kimi-k2-thinking-turbo` | 262K | | | | | | $1 | $8 |
|
|
131
|
-
| `llmgateway/kimi-k2.5` | 262K | | | | | | $0.
|
|
132
|
-
| `llmgateway/kimi-k2.6` | 262K | | | | | | $0.
|
|
131
|
+
| `llmgateway/kimi-k2.5` | 262K | | | | | | $0.41 | $2 |
|
|
132
|
+
| `llmgateway/kimi-k2.6` | 262K | | | | | | $0.50 | $3 |
|
|
133
133
|
| `llmgateway/kimi-k2.7-code` | 262K | | | | | | $0.95 | $4 |
|
|
134
134
|
| `llmgateway/kimi-k2.7-code-highspeed` | 262K | | | | | | $2 | $8 |
|
|
135
135
|
| `llmgateway/llama-3-70b-instruct` | 8K | | | | | | $0.51 | $0.74 |
|
|
@@ -139,8 +139,8 @@ for await (const chunk of stream) {
|
|
|
139
139
|
| `llmgateway/llama-3.2-11b-instruct` | 128K | | | | | | $0.07 | $0.33 |
|
|
140
140
|
| `llmgateway/llama-3.2-3b-instruct` | 33K | | | | | | $0.03 | $0.05 |
|
|
141
141
|
| `llmgateway/llama-3.3-70b-instruct` | 131K | | | | | | $0.13 | $0.40 |
|
|
142
|
-
| `llmgateway/llama-4-maverick-17b-instruct` | 1.0M | | | | | | $0.
|
|
143
|
-
| `llmgateway/llama-4-scout-17b-instruct` | 131K | | | | | | $0.
|
|
142
|
+
| `llmgateway/llama-4-maverick-17b-instruct` | 1.0M | | | | | | $0.27 | $0.85 |
|
|
143
|
+
| `llmgateway/llama-4-scout-17b-instruct` | 131K | | | | | | $0.18 | $0.59 |
|
|
144
144
|
| `llmgateway/mimo-v2-omni` | 256K | | | | | | $0.40 | $2 |
|
|
145
145
|
| `llmgateway/mimo-v2-pro` | 1.0M | | | | | | $1 | $3 |
|
|
146
146
|
| `llmgateway/mimo-v2.5` | 1.0M | | | | | | $0.14 | $0.28 |
|
|
@@ -159,6 +159,7 @@ for await (const chunk of stream) {
|
|
|
159
159
|
| `llmgateway/ministral-8b-2512` | 262K | | | | | | $0.15 | $0.15 |
|
|
160
160
|
| `llmgateway/mistral-large-2512` | 262K | | | | | | $0.50 | $2 |
|
|
161
161
|
| `llmgateway/mistral-large-latest` | 128K | | | | | | $4 | $12 |
|
|
162
|
+
| `llmgateway/mistral-ocr-latest` | — | | | | | | — | — |
|
|
162
163
|
| `llmgateway/mistral-small-2506` | 128K | | | | | | $0.10 | $0.30 |
|
|
163
164
|
| `llmgateway/nemotron-3-ultra-550b` | 262K | | | | | | $0.50 | $3 |
|
|
164
165
|
| `llmgateway/o1` | 200K | | | | | | $15 | $60 |
|
|
@@ -179,21 +180,21 @@ for await (const chunk of stream) {
|
|
|
179
180
|
| `llmgateway/qwen2-5-vl-32b-instruct` | 131K | | | | | | $1 | $4 |
|
|
180
181
|
| `llmgateway/qwen2-5-vl-72b-instruct` | 33K | | | | | | $0.13 | $0.40 |
|
|
181
182
|
| `llmgateway/qwen3-235b-a22b-fp8` | 41K | | | | | | $0.20 | $0.80 |
|
|
182
|
-
| `llmgateway/qwen3-235b-a22b-instruct-2507` | 262K | | | | | | $0.
|
|
183
|
+
| `llmgateway/qwen3-235b-a22b-instruct-2507` | 262K | | | | | | $0.09 | $0.58 |
|
|
183
184
|
| `llmgateway/qwen3-235b-a22b-thinking-2507` | 262K | | | | | | $0.20 | $0.60 |
|
|
184
185
|
| `llmgateway/qwen3-30b-a3b-instruct-2507` | 262K | | | | | | $0.10 | $0.30 |
|
|
185
186
|
| `llmgateway/qwen3-32b` | 33K | | | | | | $0.10 | $0.30 |
|
|
186
187
|
| `llmgateway/qwen3-4b-fp8` | 128K | | | | | | $0.03 | $0.03 |
|
|
187
|
-
| `llmgateway/qwen3-coder-30b-a3b-instruct` | 262K | | | | | | $0.
|
|
188
|
-
| `llmgateway/qwen3-coder-480b-a35b-instruct` | 262K | | | | | | $0.
|
|
188
|
+
| `llmgateway/qwen3-coder-30b-a3b-instruct` | 262K | | | | | | $0.07 | $0.27 |
|
|
189
|
+
| `llmgateway/qwen3-coder-480b-a35b-instruct` | 262K | | | | | | $0.30 | $1 |
|
|
189
190
|
| `llmgateway/qwen3-coder-flash` | 1.0M | | | | | | $0.30 | $2 |
|
|
190
191
|
| `llmgateway/qwen3-coder-next` | 262K | | | | | | $0.11 | $0.68 |
|
|
191
192
|
| `llmgateway/qwen3-coder-plus` | 1.0M | | | | | | $6 | $60 |
|
|
192
|
-
| `llmgateway/qwen3-max` | 262K | | | | | | $
|
|
193
|
+
| `llmgateway/qwen3-max` | 262K | | | | | | $0.84 | $3 |
|
|
193
194
|
| `llmgateway/qwen3-max-2026-01-23` | 262K | | | | | | $1 | $6 |
|
|
194
|
-
| `llmgateway/qwen3-next-80b-a3b-instruct` | 131K | | | | | | $0.
|
|
195
|
-
| `llmgateway/qwen3-next-80b-a3b-thinking` | 131K | | | | | | $0.
|
|
196
|
-
| `llmgateway/qwen3-vl-235b-a22b-instruct` | 131K | | | | | | $0.
|
|
195
|
+
| `llmgateway/qwen3-next-80b-a3b-instruct` | 131K | | | | | | $0.15 | $2 |
|
|
196
|
+
| `llmgateway/qwen3-next-80b-a3b-thinking` | 131K | | | | | | $0.15 | $1 |
|
|
197
|
+
| `llmgateway/qwen3-vl-235b-a22b-instruct` | 131K | | | | | | $0.30 | $2 |
|
|
197
198
|
| `llmgateway/qwen3-vl-235b-a22b-thinking` | 131K | | | | | | $0.50 | $2 |
|
|
198
199
|
| `llmgateway/qwen3-vl-30b-a3b-instruct` | 131K | | | | | | $0.20 | $0.70 |
|
|
199
200
|
| `llmgateway/qwen3-vl-30b-a3b-thinking` | 131K | | | | | | $0.20 | $1 |
|
|
@@ -204,7 +205,7 @@ for await (const chunk of stream) {
|
|
|
204
205
|
| `llmgateway/qwen3.6-35b-a3b` | 262K | | | | | | $0.25 | $1 |
|
|
205
206
|
| `llmgateway/qwen3.6-max-preview` | 262K | | | | | | $1 | $8 |
|
|
206
207
|
| `llmgateway/qwen3.6-plus` | 262K | | | | | | $0.50 | $3 |
|
|
207
|
-
| `llmgateway/qwen3.7-max` | 1.0M | | | | | | $
|
|
208
|
+
| `llmgateway/qwen3.7-max` | 1.0M | | | | | | $1 | $4 |
|
|
208
209
|
| `llmgateway/qwen3.7-plus` | 1.0M | | | | | | $0.40 | $2 |
|
|
209
210
|
| `llmgateway/qwen35-397b-a17b` | 262K | | | | | | $0.60 | $4 |
|
|
210
211
|
| `llmgateway/qwq-plus` | 131K | | | | | | $0.80 | $2 |
|
|
@@ -40,7 +40,7 @@ for await (const chunk of stream) {
|
|
|
40
40
|
| `minimax-cn-coding-plan/MiniMax-M2.5-highspeed` | 205K | | | | | | — | — |
|
|
41
41
|
| `minimax-cn-coding-plan/MiniMax-M2.7` | 205K | | | | | | — | — |
|
|
42
42
|
| `minimax-cn-coding-plan/MiniMax-M2.7-highspeed` | 205K | | | | | | — | — |
|
|
43
|
-
| `minimax-cn-coding-plan/MiniMax-M3` |
|
|
43
|
+
| `minimax-cn-coding-plan/MiniMax-M3` | 1.0M | | | | | | — | — |
|
|
44
44
|
|
|
45
45
|
## Advanced configuration
|
|
46
46
|
|
|
@@ -40,7 +40,7 @@ for await (const chunk of stream) {
|
|
|
40
40
|
| `minimax-cn/MiniMax-M2.5-highspeed` | 205K | | | | | | $0.60 | $2 |
|
|
41
41
|
| `minimax-cn/MiniMax-M2.7` | 205K | | | | | | $0.30 | $1 |
|
|
42
42
|
| `minimax-cn/MiniMax-M2.7-highspeed` | 205K | | | | | | $0.60 | $2 |
|
|
43
|
-
| `minimax-cn/MiniMax-M3` |
|
|
43
|
+
| `minimax-cn/MiniMax-M3` | 1.0M | | | | | | $0.30 | $1 |
|
|
44
44
|
|
|
45
45
|
## Advanced configuration
|
|
46
46
|
|
|
@@ -40,7 +40,7 @@ for await (const chunk of stream) {
|
|
|
40
40
|
| `minimax-coding-plan/MiniMax-M2.5-highspeed` | 205K | | | | | | — | — |
|
|
41
41
|
| `minimax-coding-plan/MiniMax-M2.7` | 205K | | | | | | — | — |
|
|
42
42
|
| `minimax-coding-plan/MiniMax-M2.7-highspeed` | 205K | | | | | | — | — |
|
|
43
|
-
| `minimax-coding-plan/MiniMax-M3` |
|
|
43
|
+
| `minimax-coding-plan/MiniMax-M3` | 1.0M | | | | | | — | — |
|
|
44
44
|
|
|
45
45
|
## Advanced configuration
|
|
46
46
|
|
|
@@ -40,7 +40,7 @@ for await (const chunk of stream) {
|
|
|
40
40
|
| `minimax/MiniMax-M2.5-highspeed` | 205K | | | | | | $0.60 | $2 |
|
|
41
41
|
| `minimax/MiniMax-M2.7` | 205K | | | | | | $0.30 | $1 |
|
|
42
42
|
| `minimax/MiniMax-M2.7-highspeed` | 205K | | | | | | $0.60 | $2 |
|
|
43
|
-
| `minimax/MiniMax-M3` |
|
|
43
|
+
| `minimax/MiniMax-M3` | 1.0M | | | | | | $0.30 | $1 |
|
|
44
44
|
|
|
45
45
|
## Advanced configuration
|
|
46
46
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Neuralwatt
|
|
2
2
|
|
|
3
|
-
Access
|
|
3
|
+
Access 14 Neuralwatt models through Mastra's model router. Authentication is handled automatically using the `NEURALWATT_API_KEY` environment variable.
|
|
4
4
|
|
|
5
5
|
Learn more in the [Neuralwatt documentation](https://portal.neuralwatt.com/docs).
|
|
6
6
|
|
|
@@ -37,6 +37,7 @@ for await (const chunk of stream) {
|
|
|
37
37
|
| `neuralwatt/glm-5-fast` | 203K | | | | | | $1 | $4 |
|
|
38
38
|
| `neuralwatt/glm-5.1-fast` | 203K | | | | | | $1 | $4 |
|
|
39
39
|
| `neuralwatt/glm-5.2` | 1.0M | | | | | | $1 | $5 |
|
|
40
|
+
| `neuralwatt/glm-5.2-short` | 200K | | | | | | $1 | $5 |
|
|
40
41
|
| `neuralwatt/kimi-k2.5-fast` | 262K | | | | | | $0.52 | $3 |
|
|
41
42
|
| `neuralwatt/kimi-k2.6-fast` | 262K | | | | | | $0.69 | $3 |
|
|
42
43
|
| `neuralwatt/moonshotai/Kimi-K2.5` | 262K | | | | | | $0.52 | $3 |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# StepFun
|
|
2
2
|
|
|
3
|
-
Access
|
|
3
|
+
Access 5 StepFun models through Mastra's model router. Authentication is handled automatically using the `STEPFUN_API_KEY` environment variable.
|
|
4
4
|
|
|
5
5
|
Learn more in the [StepFun documentation](https://platform.stepfun.com/docs/zh/overview/concept).
|
|
6
6
|
|
|
@@ -38,6 +38,7 @@ for await (const chunk of stream) {
|
|
|
38
38
|
| `stepfun/step-2-16k` | 16K | | | | | | $5 | $16 |
|
|
39
39
|
| `stepfun/step-3.5-flash` | 256K | | | | | | $0.10 | $0.30 |
|
|
40
40
|
| `stepfun/step-3.5-flash-2603` | 256K | | | | | | $0.10 | $0.30 |
|
|
41
|
+
| `stepfun/step-3.7-flash` | 256K | | | | | | $0.19 | $1 |
|
|
41
42
|
|
|
42
43
|
## Advanced configuration
|
|
43
44
|
|
|
@@ -67,7 +68,7 @@ const agent = new Agent({
|
|
|
67
68
|
model: ({ requestContext }) => {
|
|
68
69
|
const useAdvanced = requestContext.task === "complex";
|
|
69
70
|
return useAdvanced
|
|
70
|
-
? "stepfun/step-3.
|
|
71
|
+
? "stepfun/step-3.7-flash"
|
|
71
72
|
: "stepfun/step-1-32k";
|
|
72
73
|
}
|
|
73
74
|
});
|
|
@@ -82,6 +82,8 @@ await harness.sendMessage({ content: 'Hello!' })
|
|
|
82
82
|
|
|
83
83
|
**modes.additionalTools** (`ToolsInput`): Tools layered on top of the backing agent's tools. Mutually exclusive with \`tools\`.
|
|
84
84
|
|
|
85
|
+
**modes.availableTools** (`string[]`): Per-mode tool visibility allowlist. When set, only tools whose final exposed names appear in this list are visible to the model and executable during this mode's runs. \`undefined\` = all tools visible; \`\[]\` = no tools. Per-tool and per-category \`deny\` rules take precedence over this list. Workspace tools use the same list — reference them by exposed names (\`view\`, \`write\_file\`, etc.).
|
|
86
|
+
|
|
85
87
|
**modes.agent** (`Agent`): The agent for this mode. Deprecated in favor of the top-level \`agent\` config with mode-level overrides.
|
|
86
88
|
|
|
87
89
|
**agent** (`Agent`): Shared backing agent that each mode forks and decorates. When provided, modes layer instructions and tool overrides on top of this agent instead of providing their own.
|
|
@@ -92,9 +94,9 @@ await harness.sendMessage({ content: 'Hello!' })
|
|
|
92
94
|
|
|
93
95
|
**tools** (`ToolsInput | ((ctx) => ToolsInput)`): Tools available to all agents across all modes. It can be a static tools object or a dynamic function that receives the request context.
|
|
94
96
|
|
|
95
|
-
**workspace** (`Workspace |
|
|
97
|
+
**workspace** (`Workspace | ((ctx) => Workspace)`): Workspace instance or a dynamic factory function. When omitted, each session created via createSession must provide its own workspace. The factory receives the request context and Mastra instance.
|
|
96
98
|
|
|
97
|
-
**browser** (`MastraBrowser | ((ctx) => MastraBrowser)`): Browser automation
|
|
99
|
+
**browser** (`MastraBrowser | ((ctx) => MastraBrowser)`): Browser automation instance or a dynamic factory function. When omitted, each session created via createSession can provide its own browser.
|
|
98
100
|
|
|
99
101
|
**subagents** (`HarnessSubagent[]`): Subagent definitions. When provided, the harness creates a built-in \`subagent\` tool that parent agents can call to spawn focused subagents.
|
|
100
102
|
|
|
@@ -160,20 +162,22 @@ await harness.sendMessage({ content: 'Hello!' })
|
|
|
160
162
|
|
|
161
163
|
#### `init()`
|
|
162
164
|
|
|
163
|
-
Initialize the harness. Loads storage, initializes
|
|
165
|
+
Initialize the harness. Loads storage, initializes a static workspace (dynamic factory workspaces are resolved per-session during `createSession`), propagates memory and workspace to mode agents, and starts heartbeat handlers. Call this before using the harness.
|
|
164
166
|
|
|
165
167
|
```typescript
|
|
166
168
|
await harness.init()
|
|
167
169
|
```
|
|
168
170
|
|
|
169
|
-
#### `createSession({ id, ownerId, resourceId? })`
|
|
171
|
+
#### `createSession({ id, ownerId, resourceId?, tags?, workspace?, browser?, requestContext? })`
|
|
170
172
|
|
|
171
|
-
Create a new, fully-wired `Session` and bring it online. The session starts in the default mode with the seeded model, connects to the Harness's shared machinery (agent, storage/lock, config catalog), and has a current thread (the most recent thread for the resource, or a freshly created one). Call `init()` once before creating sessions so shared storage
|
|
173
|
+
Create a new, fully-wired `Session` and bring it online. The session starts in the default mode with the seeded model, connects to the Harness's shared machinery (agent, storage/lock, config catalog), and has a current thread (the most recent thread for the resource, or a freshly created one). Call `init()` once before creating sessions so shared storage is ready.
|
|
172
174
|
|
|
173
175
|
The Harness owns no session of its own — every consumer creates its own session and drives all work through it. In a server or multiplayer setting, each request, thread, or user gets its own session, isolated from every other: independent event bus, mode, model, state, and current thread.
|
|
174
176
|
|
|
175
177
|
`id` and `ownerId` are required — they mirror `SessionRecord.id` and `SessionRecord.ownerId` and are stable for the life of the session. `resourceId` is optional and defaults to `config.resourceId` then `config.id`.
|
|
176
178
|
|
|
179
|
+
Each session owns its own `Workspace` and `Browser` instance. When `workspace` is omitted, the Harness resolves its configured workspace (a static instance or a dynamic factory) and passes it to the session. Pass a `workspace` override to give a specific session a different workspace than the Harness default. The workspace is initialized during session creation; `workspace_ready` and `workspace_status_changed` events are emitted on the session bus after `init()` completes, and late subscribers receive a replay of the last workspace status.
|
|
180
|
+
|
|
177
181
|
```typescript
|
|
178
182
|
const session = await harness.createSession({
|
|
179
183
|
id: 'session-xyz',
|
|
@@ -191,6 +195,19 @@ const session = await harness.createSession({
|
|
|
191
195
|
})
|
|
192
196
|
```
|
|
193
197
|
|
|
198
|
+
Override the workspace and browser for a specific session:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
const session = await harness.createSession({
|
|
202
|
+
id: 'session-xyz',
|
|
203
|
+
ownerId: 'user-123',
|
|
204
|
+
workspace: myWorkspace,
|
|
205
|
+
browser: myBrowser,
|
|
206
|
+
})
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`tags` scopes initial thread selection: a thread is a resume candidate only when its metadata matches every provided tag. This lets worktrees sharing a resourceId each resume their own thread (via a `projectPath` tag).
|
|
210
|
+
|
|
194
211
|
Switching the resource ID via `harness.setResourceId()` changes only the resource ID, not `id` or `ownerId`. Read them through `session.identity.getId()` and `session.identity.getOwnerId()`.
|
|
195
212
|
|
|
196
213
|
#### `selectOrCreateThread()`
|
|
@@ -249,6 +266,48 @@ Return the internal `Mastra` instance, or `undefined` before `init()`. Useful fo
|
|
|
249
266
|
const mastra = harness.getMastra()
|
|
250
267
|
```
|
|
251
268
|
|
|
269
|
+
#### `getWorkspace()`
|
|
270
|
+
|
|
271
|
+
Return the Harness-level workspace if it is a static `Workspace` instance. Dynamic factory workspaces are not resolved here — use [`resolveWorkspace()`](#resolveworkspace-session-requestcontext-) to resolve a factory against a session's request context.
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
const workspace = harness.getWorkspace()
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
#### `resolveWorkspace({ session, requestContext? })`
|
|
278
|
+
|
|
279
|
+
Eagerly resolve and cache the workspace. For dynamic workspaces (factory function), this triggers the factory against the given session's request context and caches the result so `getWorkspace()` returns it. Returns the resolved workspace or `undefined` if none is configured.
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
const workspace = await harness.resolveWorkspace({ session })
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// With an explicit request context
|
|
287
|
+
const requestContext = new RequestContext()
|
|
288
|
+
const workspace = await harness.resolveWorkspace({ session, requestContext })
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
#### `hasWorkspace()`
|
|
292
|
+
|
|
293
|
+
Whether a workspace is configured on this Harness (static instance or dynamic factory). Sessions without an explicit workspace override fall back to this.
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
if (harness.hasWorkspace()) {
|
|
297
|
+
// ...
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
#### `isWorkspaceReady()`
|
|
302
|
+
|
|
303
|
+
Whether the Harness-level static workspace has been initialized. Dynamic factory workspaces are resolved and initialized per-session during `createSession`, so this returns `false` for factory configs until a session is created.
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
if (harness.isWorkspaceReady()) {
|
|
307
|
+
// ...
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
252
311
|
### Modes
|
|
253
312
|
|
|
254
313
|
#### `listModes()`
|
|
@@ -469,52 +528,6 @@ const category = harness.getToolCategory({ toolName: 'mastra_workspace_write_fil
|
|
|
469
528
|
// 'edit'
|
|
470
529
|
```
|
|
471
530
|
|
|
472
|
-
### Workspace
|
|
473
|
-
|
|
474
|
-
#### `getWorkspace()`
|
|
475
|
-
|
|
476
|
-
Return the current workspace instance, or `undefined` if no workspace is configured or it hasn't been resolved yet.
|
|
477
|
-
|
|
478
|
-
```typescript
|
|
479
|
-
const workspace = harness.getWorkspace()
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
#### `resolveWorkspace({ requestContext? })`
|
|
483
|
-
|
|
484
|
-
Eagerly resolve and cache the workspace. For dynamic workspaces (factory function), this triggers the factory and caches the result so `getWorkspace()` returns it. Returns the resolved workspace or `undefined` if none is configured.
|
|
485
|
-
|
|
486
|
-
```typescript
|
|
487
|
-
const workspace = await harness.resolveWorkspace()
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
#### `hasWorkspace()`
|
|
491
|
-
|
|
492
|
-
Return whether a workspace is configured (static, config-based, or dynamic).
|
|
493
|
-
|
|
494
|
-
```typescript
|
|
495
|
-
if (harness.hasWorkspace()) {
|
|
496
|
-
const workspace = await harness.resolveWorkspace()
|
|
497
|
-
}
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
#### `isWorkspaceReady()`
|
|
501
|
-
|
|
502
|
-
Return whether the workspace is ready to use. For dynamic workspaces (factory function), always returns `true`. For static workspaces, returns `true` after `init()` succeeds.
|
|
503
|
-
|
|
504
|
-
```typescript
|
|
505
|
-
if (harness.isWorkspaceReady()) {
|
|
506
|
-
const workspace = harness.getWorkspace()
|
|
507
|
-
}
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
#### `destroyWorkspace()`
|
|
511
|
-
|
|
512
|
-
Destroy the workspace and release resources. Only applies to static workspaces — dynamic workspaces aren't destroyed.
|
|
513
|
-
|
|
514
|
-
```typescript
|
|
515
|
-
await harness.destroyWorkspace()
|
|
516
|
-
```
|
|
517
|
-
|
|
518
531
|
### Observational Memory
|
|
519
532
|
|
|
520
533
|
#### `loadOMProgress()`
|
|
@@ -51,6 +51,8 @@ The session is organized into sub-objects, each owning one domain of per-convers
|
|
|
51
51
|
|
|
52
52
|
**state** (`SessionState<TState>`): The schema-validated, session-owned Harness state. See state methods below.
|
|
53
53
|
|
|
54
|
+
**browser** (`MastraBrowser | undefined`): The browser automation instance for this session. Set at creation via createSession, or from the Harness config default. Undefined when no browser is configured.
|
|
55
|
+
|
|
54
56
|
## Methods
|
|
55
57
|
|
|
56
58
|
### Permissions
|
|
@@ -563,6 +565,19 @@ const added = await harness.session.state.update(current => ({
|
|
|
563
565
|
}))
|
|
564
566
|
```
|
|
565
567
|
|
|
568
|
+
## Scoping tags
|
|
569
|
+
|
|
570
|
+
Sessions carry scoping tags (e.g. `{ projectPath }`) seeded at creation and stamped onto every thread the session creates. Thread listings can be filtered back to the session's scope using these tags.
|
|
571
|
+
|
|
572
|
+
### `getTags()`
|
|
573
|
+
|
|
574
|
+
Return a copy of the session's scoping tags. Empty object when the session is unscoped.
|
|
575
|
+
|
|
576
|
+
```typescript
|
|
577
|
+
const tags = harness.session.getTags()
|
|
578
|
+
// { projectPath: '/my/project' }
|
|
579
|
+
```
|
|
580
|
+
|
|
566
581
|
## Related
|
|
567
582
|
|
|
568
583
|
- [Harness class](https://mastra.ai/reference/harness/harness-class)
|
|
@@ -638,6 +638,8 @@ processOutputStep?(args: ProcessOutputStepArgs): ProcessorMessageResult;
|
|
|
638
638
|
|
|
639
639
|
**finishReason** (`string`): The finish reason from the LLM (stop, tool-use, length, etc.).
|
|
640
640
|
|
|
641
|
+
**providerMetadata** (`ProviderMetadata`): Provider-specific metadata for the finishing step (e.g. AWS Bedrock guardrail trace). Present when the model step produced provider metadata, including on content-filter blocks where \`steps\` is empty.
|
|
642
|
+
|
|
641
643
|
**toolCalls** (`ToolCallInfo[]`): Tool calls made in this step (if any).
|
|
642
644
|
|
|
643
645
|
**text** (`string`): Generated text from this step.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @mastra/mcp-docs-server
|
|
2
2
|
|
|
3
|
+
## 1.2.2-alpha.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`023766f`](https://github.com/mastra-ai/mastra/commit/023766f44d59b30a50f3a381e33eddde8ab56c00), [`a0509c7`](https://github.com/mastra-ai/mastra/commit/a0509c731a08aa3ed626557c5338126362856f57), [`01caf93`](https://github.com/mastra-ai/mastra/commit/01caf93d71ae2c1e65f49735cafb531975187426), [`c2c1d7b`](https://github.com/mastra-ai/mastra/commit/c2c1d7bb61d2602955f14ed3952f807c2d6eb576), [`3eb852e`](https://github.com/mastra-ai/mastra/commit/3eb852e5435bc908b800193498103dc724f455b0)]:
|
|
8
|
+
- @mastra/core@1.47.0-alpha.5
|
|
9
|
+
|
|
10
|
+
## 1.2.2-alpha.6
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies [[`462a769`](https://github.com/mastra-ai/mastra/commit/462a769da61850862ca1be3d74134d33078ee6a7), [`f328049`](https://github.com/mastra-ai/mastra/commit/f3280498c324afd2a8d36cd828f5b9f94a2dddc1), [`e545228`](https://github.com/mastra-ai/mastra/commit/e54522856934a5dc030b7b6385771e3548020d59)]:
|
|
15
|
+
- @mastra/core@1.47.0-alpha.4
|
|
16
|
+
|
|
3
17
|
## 1.2.2-alpha.5
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/mcp-docs-server",
|
|
3
|
-
"version": "1.2.2-alpha.
|
|
3
|
+
"version": "1.2.2-alpha.9",
|
|
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.47.0-alpha.
|
|
31
|
+
"@mastra/core": "1.47.0-alpha.5",
|
|
32
32
|
"@mastra/mcp": "^1.12.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"vitest": "4.1.8",
|
|
48
48
|
"@internal/lint": "0.0.108",
|
|
49
49
|
"@internal/types-builder": "0.0.83",
|
|
50
|
-
"@mastra/core": "1.47.0-alpha.
|
|
50
|
+
"@mastra/core": "1.47.0-alpha.5"
|
|
51
51
|
},
|
|
52
52
|
"homepage": "https://mastra.ai",
|
|
53
53
|
"repository": {
|