@langwatch/mcp-server 2.0.0 → 2.1.0

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.
Files changed (177) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/README.md +31 -3
  3. package/dist/{archive-project-4EQGLBJJ.js → archive-project-W3IKI7UL.js} +3 -3
  4. package/dist/archive-run-plan-474OKHHU.js +16 -0
  5. package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-V5UNYK26.js} +3 -3
  6. package/dist/archive-test-suite-O7FLDMXK.js +16 -0
  7. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-Q46WRB6P.js} +2 -2
  8. package/dist/chunk-56OGTS24.js +44 -0
  9. package/dist/chunk-6DJDEXET.js +63 -0
  10. package/dist/chunk-7E4FZIYJ.js +15 -0
  11. package/dist/{chunk-77BNWQ3U.js → chunk-AN4OUA4D.js} +2 -2
  12. package/dist/chunk-CKNAH5TG.js +74 -0
  13. package/dist/{chunk-TOXJQDIZ.js → chunk-EYXMLE5X.js} +85 -10
  14. package/dist/{chunk-7RHG56OH.js → chunk-G4ZAZTZW.js} +2 -2
  15. package/dist/{chunk-A2LEVYQ5.js → chunk-GELJ2MQR.js} +11 -2
  16. package/dist/chunk-HV4DWKBI.js +46 -0
  17. package/dist/chunk-JR6DJZOU.js +49 -0
  18. package/dist/{chunk-SFB4MU6H.js → chunk-JTQJRNFJ.js} +2 -2
  19. package/dist/{chunk-TJCXFNDT.js → chunk-K37ZNPXK.js} +2 -2
  20. package/dist/{chunk-CDYQOY5U.js → chunk-OJLYYJWI.js} +2 -2
  21. package/dist/{chunk-ZWIL4EFL.js → chunk-QAMP3CGR.js} +2 -2
  22. package/dist/{chunk-4QC7SA2L.js → chunk-QRO35SOM.js} +345 -144
  23. package/dist/{chunk-J42FWRJ2.js → chunk-RVAE2MEA.js} +2 -2
  24. package/dist/{chunk-AQJO2EI5.js → chunk-S4GVX36W.js} +2 -2
  25. package/dist/{chunk-YX3A3CFM.js → chunk-SR6QPRIE.js} +2 -2
  26. package/dist/chunk-UF6XIGYR.js +58 -0
  27. package/dist/{chunk-5CCZFUXS.js → chunk-UFOYFYI7.js} +2 -2
  28. package/dist/{create-agent-7XHO6UIS.js → create-agent-JFJ2K6X3.js} +3 -3
  29. package/dist/{create-annotation-YQXRQC6A.js → create-annotation-EUXXQ6NS.js} +3 -3
  30. package/dist/{create-api-key-YUS36KBU.js → create-api-key-BGBB76JX.js} +3 -3
  31. package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-Z76AIPLS.js} +3 -3
  32. package/dist/{create-dataset-E6NMSVX7.js → create-dataset-FD5VAXU4.js} +3 -3
  33. package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-WQUXXOHI.js} +3 -3
  34. package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-6NV33Z52.js} +3 -3
  35. package/dist/create-mcp-server.js +7 -2
  36. package/dist/{create-project-CS2CB57Y.js → create-project-ZQ7TFIO2.js} +3 -3
  37. package/dist/{create-prompt-F5RMX3L3.js → create-prompt-BS6QRCUU.js} +2 -2
  38. package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-FCQ5ELSQ.js} +2 -2
  39. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-DRPTPXU3.js} +10 -3
  40. package/dist/create-test-suite-ZIZCCFJ4.js +37 -0
  41. package/dist/{delete-agent-O3EEH4S5.js → delete-agent-SA4JMUZF.js} +3 -3
  42. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-X3KKK7QY.js} +3 -3
  43. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-LYMRPF27.js} +3 -3
  44. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-W6EZ44HY.js} +3 -3
  45. package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-7CNOTALB.js} +3 -3
  46. package/dist/{delete-evaluator-33SP2JFX.js → delete-evaluator-RKYC4TNB.js} +3 -3
  47. package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-QB3OCZUV.js} +2 -2
  48. package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-NG2VXYYM.js} +3 -3
  49. package/dist/{discover-evaluator-schema-XTAD4X7D.js → discover-evaluator-schema-ESSHQGPY.js} +7 -286
  50. package/dist/{discover-scenario-schema-FE64QK2D.js → discover-scenario-schema-W7KBXA4J.js} +53 -1
  51. package/dist/get-agent-7THF7HCU.js +66 -0
  52. package/dist/{get-analytics-TETCSOK6.js → get-analytics-R6AZD3AW.js} +2 -2
  53. package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-P4WWVHFU.js} +3 -3
  54. package/dist/{get-dataset-RCMU5VAH.js → get-dataset-AKTYSQDI.js} +3 -3
  55. package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-RZ44UIN6.js} +3 -3
  56. package/dist/{get-project-RAK7URQJ.js → get-project-QSQEAB33.js} +3 -3
  57. package/dist/get-prompt-GVKXF5NL.js +100 -0
  58. package/dist/get-run-plan-NY7J5GRE.js +61 -0
  59. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-Q3LLQE4T.js} +7 -3
  60. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-WINEYDMK.js} +12 -3
  61. package/dist/get-test-suite-4HKA7OKS.js +49 -0
  62. package/dist/{get-trace-K7U234Q4.js → get-trace-RCUV7N4O.js} +2 -2
  63. package/dist/{get-workflow-L5L2PSK3.js → get-workflow-EEOC7Y45.js} +3 -3
  64. package/dist/{http-server-YXHFPPGA.js → http-server-WCDUARTH.js} +8 -3
  65. package/dist/index.js +3366 -1910
  66. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-6DHVZWUK.js} +3 -3
  67. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-2KJL2M42.js} +3 -3
  68. package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-6ISFJ7WX.js} +2 -2
  69. package/dist/{langwatch-api-secrets-BUBSNCNO.js → langwatch-api-secrets-OEBD6GBU.js} +2 -2
  70. package/dist/{langwatch-api-triggers-EDFUCJN6.js → langwatch-api-triggers-5E6DDGX6.js} +2 -2
  71. package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-6UJL5U4Z.js} +3 -3
  72. package/dist/list-agents-AMVDQPQL.js +43 -0
  73. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-6PR5NLIC.js} +3 -3
  74. package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-GVPNBIHQ.js} +3 -3
  75. package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-Z3BZKDGF.js} +3 -3
  76. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-O67HZ35Y.js} +3 -3
  77. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-WXZL6UMP.js} +3 -3
  78. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-PAX72WCN.js} +3 -3
  79. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-VVLZMLCX.js} +3 -3
  80. package/dist/{list-projects-K7QAIX2I.js → list-projects-AQVI6SUK.js} +3 -3
  81. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-WZFBJOHG.js} +2 -2
  82. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-BQOHRHYT.js} +2 -2
  83. package/dist/list-run-plans-UBAU2DGH.js +46 -0
  84. package/dist/{list-scenarios-F2WYNRIE.js → list-scenarios-MS4IUIVM.js} +8 -5
  85. package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-D6YF4ZOU.js} +11 -5
  86. package/dist/list-test-suites-L7R2O6DR.js +35 -0
  87. package/dist/{list-workflows-QSJWURCK.js → list-workflows-6MV4XJHF.js} +3 -3
  88. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-K5LQ4CY6.js} +2 -2
  89. package/dist/rename-test-suite-NTYHAO5X.js +21 -0
  90. package/dist/report-issue-RHZZ33IS.js +885 -0
  91. package/dist/rerun-run-plan-MUDWJBE4.js +22 -0
  92. package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-6LAZ3QZZ.js} +3 -3
  93. package/dist/run-agent-CAGWGTYT.js +72 -0
  94. package/dist/run-plan-T4ZYOZGA.js +39 -0
  95. package/dist/run-test-suite-L4MZ7G4D.js +26 -0
  96. package/dist/{run-workflow-QPXC627O.js → run-workflow-DFIS23AP.js} +3 -3
  97. package/dist/{search-traces-A6HFKPLJ.js → search-traces-4XTJYXIK.js} +2 -2
  98. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-XRNMFOVR.js} +3 -3
  99. package/dist/{update-agent-SMAEHLXH.js → update-agent-DUWNYBNA.js} +3 -3
  100. package/dist/{update-dataset-BDUK7TUO.js → update-dataset-YSOMDCOB.js} +3 -3
  101. package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-DEA2ITYR.js} +3 -3
  102. package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-NH7Q5GWV.js} +3 -3
  103. package/dist/{update-project-LKVYXENH.js → update-project-Q26FBSYH.js} +3 -3
  104. package/dist/update-prompt-ZQQ2C3KU.js +143 -0
  105. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-WUX34JAR.js} +10 -3
  106. package/package.json +8 -9
  107. package/pyproject.toml +4 -4
  108. package/src/__tests__/agent-tools.unit.test.ts +257 -0
  109. package/src/__tests__/all-tools.integration.test.ts +321 -75
  110. package/src/__tests__/integration.integration.test.ts +7 -11
  111. package/src/__tests__/prompt-response-types.unit.test.ts +51 -0
  112. package/src/__tests__/prompts.integration.test.ts +736 -0
  113. package/src/__tests__/run-plan-tools.unit.test.ts +565 -0
  114. package/src/__tests__/scenario-tools.unit.test.ts +19 -0
  115. package/src/__tests__/simulation-run-tools.unit.test.ts +116 -0
  116. package/src/__tests__/test-suite-tools.unit.test.ts +615 -0
  117. package/src/__tests__/{tools.unit.test.ts → tools.integration.test.ts} +31 -59
  118. package/src/create-mcp-server.ts +334 -55
  119. package/src/langwatch-api-agents.ts +196 -12
  120. package/src/langwatch-api-run-plans.ts +157 -0
  121. package/src/langwatch-api-scenarios.ts +9 -0
  122. package/src/langwatch-api-simulation-runs.ts +5 -0
  123. package/src/langwatch-api-test-suites.ts +135 -0
  124. package/src/langwatch-api.ts +62 -12
  125. package/src/schemas/index.ts +5 -0
  126. package/src/schemas/run-plan.ts +92 -0
  127. package/src/schemas/suite-fields.ts +149 -0
  128. package/src/tools/archive-run-plan.ts +12 -0
  129. package/src/tools/archive-test-suite.ts +12 -0
  130. package/src/tools/create-scenario.ts +8 -0
  131. package/src/tools/create-test-suite.ts +43 -0
  132. package/src/tools/discover-scenario-schema.ts +54 -0
  133. package/src/tools/format-run-plan.ts +68 -0
  134. package/src/tools/format-scenario.ts +14 -0
  135. package/src/tools/format-suite-details.ts +96 -0
  136. package/src/tools/get-agent.ts +45 -3
  137. package/src/tools/get-prompt.ts +108 -24
  138. package/src/tools/get-run-plan.ts +62 -0
  139. package/src/tools/get-scenario.ts +3 -0
  140. package/src/tools/get-simulation-run.ts +9 -0
  141. package/src/tools/get-test-suite.ts +49 -0
  142. package/src/tools/list-agents.ts +20 -3
  143. package/src/tools/list-run-plans.ts +47 -0
  144. package/src/tools/list-scenarios.ts +12 -2
  145. package/src/tools/list-simulation-runs.ts +6 -2
  146. package/src/tools/list-test-suites.ts +35 -0
  147. package/src/tools/rename-test-suite.ts +18 -0
  148. package/src/tools/rerun-run-plan.ts +21 -0
  149. package/src/tools/run-agent.ts +54 -6
  150. package/src/tools/run-plan.ts +49 -0
  151. package/src/tools/run-test-suite.ts +30 -0
  152. package/src/tools/test-agent.ts +18 -0
  153. package/src/tools/update-prompt.ts +195 -10
  154. package/src/tools/update-scenario.ts +8 -0
  155. package/src/tools/update-test-suite.ts +45 -0
  156. package/tsconfig.json +5 -0
  157. package/uv.lock +416 -296
  158. package/dist/archive-suite-4T6BSRS7.js +0 -16
  159. package/dist/chunk-YZLYHLLI.js +0 -48
  160. package/dist/create-suite-LZS6QIAF.js +0 -39
  161. package/dist/get-agent-Y7MWZ65F.js +0 -29
  162. package/dist/get-prompt-OY5B7TRI.js +0 -46
  163. package/dist/get-suite-J7JVWO6O.js +0 -45
  164. package/dist/list-agents-KFHKGPXV.js +0 -33
  165. package/dist/list-suites-CRY4VWW6.js +0 -43
  166. package/dist/report-issue-XYVAPAYJ.js +0 -412
  167. package/dist/run-agent-6SM4XNA7.js +0 -37
  168. package/dist/run-suite-NKZCJ2IN.js +0 -30
  169. package/dist/update-prompt-ODCRQRN6.js +0 -25
  170. package/dist/update-suite-SNO3GS7T.js +0 -40
  171. package/src/langwatch-api-suites.ts +0 -118
  172. package/src/tools/archive-suite.ts +0 -12
  173. package/src/tools/create-suite.ts +0 -42
  174. package/src/tools/get-suite.ts +0 -47
  175. package/src/tools/list-suites.ts +0 -43
  176. package/src/tools/run-suite.ts +0 -28
  177. package/src/tools/update-suite.ts +0 -44
@@ -1,7 +1,28 @@
1
+ import {
2
+ testAgent
3
+ } from "./chunk-EYXMLE5X.js";
4
+ import {
5
+ runParametersSchema,
6
+ runPlanScopeSchema,
7
+ runPlanTargetSchema
8
+ } from "./chunk-HV4DWKBI.js";
9
+ import {
10
+ evaluatorAttachmentsSchema,
11
+ scenarioFieldValuesSchema,
12
+ suiteFieldsSchema,
13
+ toWireAttachments
14
+ } from "./chunk-CKNAH5TG.js";
15
+ import {
16
+ formatEvaluatorAttachments,
17
+ formatSuiteFields
18
+ } from "./chunk-UF6XIGYR.js";
19
+ import {
20
+ updateTestSuite
21
+ } from "./chunk-6DJDEXET.js";
1
22
  import {
2
23
  LangWatchApiError,
3
24
  makeRequest
4
- } from "./chunk-A2LEVYQ5.js";
25
+ } from "./chunk-GELJ2MQR.js";
5
26
  import {
6
27
  requireApiKey
7
28
  } from "./chunk-WT4PO4A3.js";
@@ -13,7 +34,7 @@ import { z as z2 } from "zod";
13
34
  // package.json
14
35
  var package_default = {
15
36
  name: "@langwatch/mcp-server",
16
- version: "2.0.0",
37
+ version: "2.1.0",
17
38
  description: "An MCP server for Langwatch.",
18
39
  type: "module",
19
40
  main: "./dist/index.js",
@@ -55,21 +76,20 @@ var package_default = {
55
76
  },
56
77
  devDependencies: {
57
78
  "@ai-sdk/anthropic": "^3.0.44",
58
- "@anthropic-ai/claude-code": "2.1.202",
79
+ "@anthropic-ai/claude-code": "2.1.228",
59
80
  "@eslint/js": "^10.0.1",
60
81
  "@langwatch/handled-error": "workspace:*",
61
82
  "@langwatch/redaction": "workspace:*",
62
83
  "@langwatch/scenario": "^0.4.6",
63
84
  "@langwatch/ssrf": "workspace:*",
64
85
  "@opentelemetry/context-async-hooks": "^2.1.0",
65
- "@opentelemetry/sdk-node": "^0.219.0",
86
+ "@opentelemetry/sdk-node": "^0.221.0",
66
87
  "@types/debug": "^4.1.13",
67
88
  "@types/express": "^5.0.6",
68
- "@types/node": "^25.6.0",
89
+ "@types/node": "^26.2.0",
69
90
  "@types/yargs": "^17.0.33",
70
- "@typescript/native-preview": "7.0.0-dev.20260705.1",
71
91
  ai: "^6.0.161",
72
- chalk: "^5.6.2",
92
+ chalk: "^6.0.0",
73
93
  "date-fns": "^4.1.0",
74
94
  dotenv: "^17.2.2",
75
95
  esbuild: "^0.28.1",
@@ -78,7 +98,7 @@ var package_default = {
78
98
  "node-pty": "^1.0.0",
79
99
  tsup: "^8.1.0",
80
100
  tsx: "^4.20.5",
81
- typescript: "^5.0.0",
101
+ typescript: "^6.0.3",
82
102
  "typescript-eslint": "^8.55.0",
83
103
  vitest: "^4.1.8",
84
104
  yargs: "^18.0.0",
@@ -680,6 +700,40 @@ async function handleExperimentStatus(params) {
680
700
  return lines.join("\n");
681
701
  }
682
702
 
703
+ // src/tools/test-agent.ts
704
+ async function handleTestAgent(params) {
705
+ const run = await testAgent(params.id);
706
+ return [
707
+ 'Test run scheduled. The user sends "ping"; the run succeeds when the agent answers.',
708
+ "",
709
+ `**Scenario run ID:** ${run.scenarioRunId}`,
710
+ `**Batch run ID:** ${run.batchRunId}`,
711
+ "",
712
+ `Follow it with platform_get_simulation_run using scenarioRunId "${run.scenarioRunId}".`
713
+ ].join("\n");
714
+ }
715
+
716
+ // src/tools/update-test-suite.ts
717
+ async function handleUpdateTestSuite(params) {
718
+ const suite = await updateTestSuite({
719
+ id: params.id,
720
+ ...params.name !== void 0 ? { name: params.name } : {},
721
+ ...params.fields !== void 0 ? { fields: params.fields } : {},
722
+ ...params.evaluators !== void 0 ? { evaluators: toWireAttachments(params.evaluators) } : {}
723
+ });
724
+ return [
725
+ `Test suite "${suite.name}" updated.`,
726
+ "",
727
+ `**ID**: ${suite.id}`,
728
+ `**Slug**: ${suite.slug}`,
729
+ `**Scenarios**: ${suite.scenarioCount}`,
730
+ ...formatSuiteFields(suite.fields),
731
+ ...formatEvaluatorAttachments(suite.evaluators),
732
+ "",
733
+ `**View**: ${suite.platformUrl}`
734
+ ].join("\n");
735
+ }
736
+
683
737
  // src/create-mcp-server.ts
684
738
  var modelSchema = z2.string().describe(
685
739
  'Model in "provider/model-name" format, e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4-5-20250929"'
@@ -738,7 +792,7 @@ function registerTools(server) {
738
792
  agent: z2.string().optional().describe("Which coding agent this is, e.g. claude-code, codex, cursor")
739
793
  },
740
794
  withToolLogging("report_issue", async (params) => {
741
- const { handleReportIssue } = await import("./report-issue-XYVAPAYJ.js");
795
+ const { handleReportIssue } = await import("./report-issue-RHZZ33IS.js");
742
796
  return {
743
797
  content: [{ type: "text", text: await handleReportIssue(params) }]
744
798
  };
@@ -776,13 +830,13 @@ function registerTools(server) {
776
830
  },
777
831
  async ({ category, evaluatorType }) => {
778
832
  if (category === "scenarios") {
779
- const { formatScenarioSchema } = await import("./discover-scenario-schema-FE64QK2D.js");
833
+ const { formatScenarioSchema } = await import("./discover-scenario-schema-W7KBXA4J.js");
780
834
  return {
781
835
  content: [{ type: "text", text: formatScenarioSchema() }]
782
836
  };
783
837
  }
784
838
  if (category === "evaluators") {
785
- const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-XTAD4X7D.js");
839
+ const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-ESSHQGPY.js");
786
840
  return {
787
841
  content: [
788
842
  { type: "text", text: formatEvaluatorSchema(evaluatorType) }
@@ -792,9 +846,9 @@ function registerTools(server) {
792
846
  const { formatSchema } = await import("./discover-schema-L6QDPON3.js");
793
847
  let text = formatSchema(category);
794
848
  if (category === "all") {
795
- const { formatScenarioSchema } = await import("./discover-scenario-schema-FE64QK2D.js");
849
+ const { formatScenarioSchema } = await import("./discover-scenario-schema-W7KBXA4J.js");
796
850
  text += "\n\n" + formatScenarioSchema();
797
- const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-XTAD4X7D.js");
851
+ const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-ESSHQGPY.js");
798
852
  text += "\n\n" + formatEvaluatorSchema();
799
853
  }
800
854
  return { content: [{ type: "text", text }] };
@@ -820,7 +874,7 @@ function registerTools(server) {
820
874
  },
821
875
  withToolLogging("search_traces", async (params) => {
822
876
  requireApiKey();
823
- const { handleSearchTraces } = await import("./search-traces-A6HFKPLJ.js");
877
+ const { handleSearchTraces } = await import("./search-traces-4XTJYXIK.js");
824
878
  return {
825
879
  content: [{ type: "text", text: await handleSearchTraces(params) }]
826
880
  };
@@ -837,7 +891,7 @@ function registerTools(server) {
837
891
  },
838
892
  withToolLogging("get_trace", async (params) => {
839
893
  requireApiKey();
840
- const { handleGetTrace } = await import("./get-trace-K7U234Q4.js");
894
+ const { handleGetTrace } = await import("./get-trace-RCUV7N4O.js");
841
895
  return {
842
896
  content: [{ type: "text", text: await handleGetTrace(params) }]
843
897
  };
@@ -863,7 +917,7 @@ function registerTools(server) {
863
917
  },
864
918
  withToolLogging("get_analytics", async (params) => {
865
919
  requireApiKey();
866
- const { handleGetAnalytics } = await import("./get-analytics-TETCSOK6.js");
920
+ const { handleGetAnalytics } = await import("./get-analytics-R6AZD3AW.js");
867
921
  return {
868
922
  content: [{ type: "text", text: await handleGetAnalytics(params) }]
869
923
  };
@@ -897,7 +951,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
897
951
  },
898
952
  withToolLogging("platform_create_prompt", async (params) => {
899
953
  requireApiKey();
900
- const { handleCreatePrompt } = await import("./create-prompt-F5RMX3L3.js");
954
+ const { handleCreatePrompt } = await import("./create-prompt-BS6QRCUU.js");
901
955
  return {
902
956
  content: [{ type: "text", text: await handleCreatePrompt(params) }]
903
957
  };
@@ -909,7 +963,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
909
963
  {},
910
964
  withToolLogging("platform_list_prompts", async () => {
911
965
  requireApiKey();
912
- const { handleListPrompts } = await import("./list-prompts-SC2HAUFG.js");
966
+ const { handleListPrompts } = await import("./list-prompts-BQOHRHYT.js");
913
967
  return {
914
968
  content: [{ type: "text", text: await handleListPrompts() }]
915
969
  };
@@ -917,12 +971,15 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
917
971
  );
918
972
  server.tool(
919
973
  "platform_get_prompt",
920
- "Get a specific prompt from the LangWatch platform by ID or handle, including messages, model config, and version history.",
974
+ "Get a specific prompt from the LangWatch platform by ID or handle, including messages, model config, and version history. Use format: 'json' for the full raw API payload, or 'digest' (default) for a formatted summary.",
921
975
  {
922
976
  idOrHandle: z2.string().describe("Prompt ID or handle"),
923
977
  version: z2.number().optional().describe("Specific version number (default: latest)"),
924
978
  tag: z2.string().optional().describe(
925
979
  'Fetch the version pointed to by this tag (e.g., "production", "staging"). Alternatively, use shorthand in idOrHandle: "pizza-prompt:production"'
980
+ ),
981
+ format: z2.enum(["digest", "json"]).optional().describe(
982
+ "Output format: 'digest' (default, AI-readable) or 'json' (full raw data)"
926
983
  )
927
984
  },
928
985
  withToolLogging("platform_get_prompt", async (params) => {
@@ -933,7 +990,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
933
990
  };
934
991
  }
935
992
  requireApiKey();
936
- const { handleGetPrompt } = await import("./get-prompt-OY5B7TRI.js");
993
+ const { handleGetPrompt } = await import("./get-prompt-GVKXF5NL.js");
937
994
  return {
938
995
  content: [{ type: "text", text: await handleGetPrompt(params) }]
939
996
  };
@@ -958,7 +1015,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
958
1015
  },
959
1016
  withToolLogging("platform_update_prompt", async (params) => {
960
1017
  requireApiKey();
961
- const { handleUpdatePrompt } = await import("./update-prompt-ODCRQRN6.js");
1018
+ const { handleUpdatePrompt } = await import("./update-prompt-ZQQ2C3KU.js");
962
1019
  return {
963
1020
  content: [{ type: "text", text: await handleUpdatePrompt(params) }]
964
1021
  };
@@ -974,7 +1031,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
974
1031
  },
975
1032
  withToolLogging("platform_assign_prompt_tag", async (params) => {
976
1033
  requireApiKey();
977
- const { handleAssignPromptTag } = await import("./assign-prompt-tag-VLXUWEKU.js");
1034
+ const { handleAssignPromptTag } = await import("./assign-prompt-tag-Q46WRB6P.js");
978
1035
  return {
979
1036
  content: [{ type: "text", text: await handleAssignPromptTag(params) }]
980
1037
  };
@@ -986,7 +1043,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
986
1043
  {},
987
1044
  withToolLogging("platform_list_prompt_tags", async () => {
988
1045
  requireApiKey();
989
- const { handleListPromptTags } = await import("./list-prompt-tags-FOO6TNHB.js");
1046
+ const { handleListPromptTags } = await import("./list-prompt-tags-WZFBJOHG.js");
990
1047
  return {
991
1048
  content: [{ type: "text", text: await handleListPromptTags() }]
992
1049
  };
@@ -1000,7 +1057,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1000
1057
  },
1001
1058
  withToolLogging("platform_create_prompt_tag", async (params) => {
1002
1059
  requireApiKey();
1003
- const { handleCreatePromptTag } = await import("./create-prompt-tag-GMRWTEFR.js");
1060
+ const { handleCreatePromptTag } = await import("./create-prompt-tag-FCQ5ELSQ.js");
1004
1061
  return {
1005
1062
  content: [{ type: "text", text: await handleCreatePromptTag(params) }]
1006
1063
  };
@@ -1015,7 +1072,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1015
1072
  },
1016
1073
  withToolLogging("platform_rename_prompt_tag", async (params) => {
1017
1074
  requireApiKey();
1018
- const { handleRenamePromptTag } = await import("./rename-prompt-tag-EKWU5QF3.js");
1075
+ const { handleRenamePromptTag } = await import("./rename-prompt-tag-K5LQ4CY6.js");
1019
1076
  return {
1020
1077
  content: [{ type: "text", text: await handleRenamePromptTag(params) }]
1021
1078
  };
@@ -1029,7 +1086,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1029
1086
  },
1030
1087
  withToolLogging("platform_delete_prompt_tag", async (params) => {
1031
1088
  requireApiKey();
1032
- const { handleDeletePromptTag } = await import("./delete-prompt-tag-KNMZVSPB.js");
1089
+ const { handleDeletePromptTag } = await import("./delete-prompt-tag-QB3OCZUV.js");
1033
1090
  return {
1034
1091
  content: [{ type: "text", text: await handleDeletePromptTag(params) }]
1035
1092
  };
@@ -1053,11 +1110,15 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1053
1110
  criteria: z2.array(z2.string()).optional().describe(
1054
1111
  "Pass/fail conditions the agent's response must satisfy"
1055
1112
  ),
1056
- labels: z2.array(z2.string()).optional().describe("Tags for organizing and filtering scenarios")
1113
+ labels: z2.array(z2.string()).optional().describe("Tags for organizing and filtering scenarios"),
1114
+ testSuiteId: z2.string().nullish().describe(
1115
+ "The test suite to file this scenario in. Pass a test suite ID, or null to unfile it."
1116
+ ),
1117
+ fields: scenarioFieldValuesSchema.optional()
1057
1118
  },
1058
1119
  withToolLogging("platform_create_scenario", async (params) => {
1059
1120
  requireApiKey();
1060
- const { handleCreateScenario } = await import("./create-scenario-JDR2VB2H.js");
1121
+ const { handleCreateScenario } = await import("./create-scenario-DRPTPXU3.js");
1061
1122
  return {
1062
1123
  content: [
1063
1124
  { type: "text", text: await handleCreateScenario(params) }
@@ -1069,13 +1130,14 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1069
1130
  "platform_list_scenarios",
1070
1131
  "List all scenarios on the LangWatch platform. Returns AI-readable digest by default.",
1071
1132
  {
1133
+ testSuiteId: z2.string().optional().describe("Only the scenarios filed in this test suite"),
1072
1134
  format: z2.enum(["digest", "json"]).optional().describe(
1073
1135
  "Output format: 'digest' (default, AI-readable) or 'json' (full raw data)"
1074
1136
  )
1075
1137
  },
1076
1138
  withToolLogging("platform_list_scenarios", async (params) => {
1077
1139
  requireApiKey();
1078
- const { handleListScenarios } = await import("./list-scenarios-F2WYNRIE.js");
1140
+ const { handleListScenarios } = await import("./list-scenarios-MS4IUIVM.js");
1079
1141
  return {
1080
1142
  content: [
1081
1143
  { type: "text", text: await handleListScenarios(params) }
@@ -1094,7 +1156,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1094
1156
  },
1095
1157
  withToolLogging("platform_get_scenario", async (params) => {
1096
1158
  requireApiKey();
1097
- const { handleGetScenario } = await import("./get-scenario-ZTAJJL5T.js");
1159
+ const { handleGetScenario } = await import("./get-scenario-Q3LLQE4T.js");
1098
1160
  return {
1099
1161
  content: [{ type: "text", text: await handleGetScenario(params) }]
1100
1162
  };
@@ -1108,11 +1170,15 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1108
1170
  name: z2.string().optional().describe("Updated scenario name"),
1109
1171
  situation: z2.string().optional().describe("Updated situation"),
1110
1172
  criteria: z2.array(z2.string()).optional().describe("Updated criteria"),
1111
- labels: z2.array(z2.string()).optional().describe("Updated labels")
1173
+ labels: z2.array(z2.string()).optional().describe("Updated labels"),
1174
+ testSuiteId: z2.string().nullish().describe(
1175
+ "The test suite to file this scenario in. Pass a test suite ID, or null to unfile it."
1176
+ ),
1177
+ fields: scenarioFieldValuesSchema.optional()
1112
1178
  },
1113
1179
  withToolLogging("platform_update_scenario", async (params) => {
1114
1180
  requireApiKey();
1115
- const { handleUpdateScenario } = await import("./update-scenario-NEXCAQI7.js");
1181
+ const { handleUpdateScenario } = await import("./update-scenario-WUX34JAR.js");
1116
1182
  return {
1117
1183
  content: [
1118
1184
  { type: "text", text: await handleUpdateScenario(params) }
@@ -1128,7 +1194,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1128
1194
  },
1129
1195
  withToolLogging("platform_archive_scenario", async (params) => {
1130
1196
  requireApiKey();
1131
- const { handleArchiveScenario } = await import("./archive-scenario-W6BXYDZ3.js");
1197
+ const { handleArchiveScenario } = await import("./archive-scenario-V5UNYK26.js");
1132
1198
  return {
1133
1199
  content: [
1134
1200
  { type: "text", text: await handleArchiveScenario(params) }
@@ -1137,98 +1203,215 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1137
1203
  })
1138
1204
  );
1139
1205
  server.tool(
1140
- "platform_list_suites",
1141
- "List all suites (run plans) on the LangWatch platform. A suite bundles scenarios with targets for batch execution.",
1206
+ "platform_run_plan",
1207
+ "Run scenarios against targets. The plan name identifies the run plan: an existing name is re-run with the configuration you send here, a new name creates the plan. Configuration is the scope, the targets, the repeat count and the models; parameters, the note and the idempotency key belong to this run alone. Send more than one target to compare them in the same run, and give a target its own parameters to compare one agent on two models.",
1208
+ {
1209
+ name: z2.string().optional().describe(
1210
+ "The run plan to run. An existing name is replaced with this configuration, a new name creates the plan. Omit to let the server name it after the suite and the target."
1211
+ ),
1212
+ scope: runPlanScopeSchema.describe(
1213
+ "What the plan covers: every scenario in the project, the scenarios filed in given test suites, the scenarios carrying given labels, or the hand-picked list in scenarioIds."
1214
+ ),
1215
+ scenarioIds: z2.array(z2.string()).optional().describe(
1216
+ "The scenarios to run. Read only when scope.mode is 'scenarios'."
1217
+ ),
1218
+ targets: z2.array(runPlanTargetSchema).describe(
1219
+ "What to run the scenarios against. Every target runs every scenario, and the results show one column for each, so this is how one run compares two agents or one agent on two models."
1220
+ ),
1221
+ repeatCount: z2.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1222
+ simulatorModel: z2.string().optional().describe("Model that plays the user. Omit for the project default."),
1223
+ judgeModel: z2.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1224
+ evaluators: evaluatorAttachmentsSchema.optional().describe(
1225
+ "The plan's own evaluators, run beside the ones attached to the test suites its scenarios belong to. A plan evaluator reads the conversation and the trace, never a scenario field. Omit to keep what the plan already holds. See discover_schema({ category: 'scenarios' }) for the mapping paths."
1226
+ ),
1227
+ parameters: runParametersSchema.optional().describe(
1228
+ "Values for the parameters the scenarios declare, by name. They apply to every target; a target that names the same parameter overrides them for itself."
1229
+ ),
1230
+ note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)"),
1231
+ idempotencyKey: z2.string().optional().describe("Send the same key to make a retry join the run it already started instead of starting a second one.")
1232
+ },
1233
+ withToolLogging("platform_run_plan", async (params) => {
1234
+ requireApiKey();
1235
+ const { handleRunPlan } = await import("./run-plan-T4ZYOZGA.js");
1236
+ return {
1237
+ content: [{ type: "text", text: await handleRunPlan(params) }]
1238
+ };
1239
+ })
1240
+ );
1241
+ server.tool(
1242
+ "platform_list_run_plans",
1243
+ "List the run plans of the project. A run plan holds the configuration a run used, keyed by its name.",
1244
+ {
1245
+ includeArchived: z2.boolean().optional().describe("Include archived plans (default false)"),
1246
+ format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1247
+ },
1248
+ withToolLogging("platform_list_run_plans", async (params) => {
1249
+ requireApiKey();
1250
+ const { handleListRunPlans } = await import("./list-run-plans-UBAU2DGH.js");
1251
+ return {
1252
+ content: [{ type: "text", text: await handleListRunPlans(params) }]
1253
+ };
1254
+ })
1255
+ );
1256
+ server.tool(
1257
+ "platform_get_run_plan",
1258
+ "Get the full configuration of a run plan: what it covers, its targets, its repeat count and its models.",
1259
+ {
1260
+ id: z2.string().describe("The run plan ID"),
1261
+ format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1262
+ },
1263
+ withToolLogging("platform_get_run_plan", async (params) => {
1264
+ requireApiKey();
1265
+ const { handleGetRunPlan } = await import("./get-run-plan-NY7J5GRE.js");
1266
+ return {
1267
+ content: [{ type: "text", text: await handleGetRunPlan(params) }]
1268
+ };
1269
+ })
1270
+ );
1271
+ server.tool(
1272
+ "platform_rerun_run_plan",
1273
+ "Run a plan again with the configuration it already holds. Only the parameters and the note belong to the new run.",
1274
+ {
1275
+ id: z2.string().describe("The run plan ID to run again"),
1276
+ parameters: runParametersSchema.optional().describe("Values for the parameters the scenarios declare, by name."),
1277
+ note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1278
+ },
1279
+ withToolLogging("platform_rerun_run_plan", async (params) => {
1280
+ requireApiKey();
1281
+ const { handleRerunRunPlan } = await import("./rerun-run-plan-MUDWJBE4.js");
1282
+ return {
1283
+ content: [{ type: "text", text: await handleRerunRunPlan(params) }]
1284
+ };
1285
+ })
1286
+ );
1287
+ server.tool(
1288
+ "platform_archive_run_plan",
1289
+ "Archive a run plan. Its past runs stay readable and the name is free for a new plan.",
1290
+ {
1291
+ id: z2.string().describe("The run plan ID to archive")
1292
+ },
1293
+ withToolLogging("platform_archive_run_plan", async (params) => {
1294
+ requireApiKey();
1295
+ const { handleArchiveRunPlan } = await import("./archive-run-plan-474OKHHU.js");
1296
+ return {
1297
+ content: [{ type: "text", text: await handleArchiveRunPlan(params) }]
1298
+ };
1299
+ })
1300
+ );
1301
+ server.tool(
1302
+ "platform_list_test_suites",
1303
+ "List the test suites of the project. A test suite groups scenarios.",
1142
1304
  {
1143
1305
  format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1144
1306
  },
1145
- withToolLogging("platform_list_suites", async (params) => {
1307
+ withToolLogging("platform_list_test_suites", async (params) => {
1146
1308
  requireApiKey();
1147
- const { handleListSuites } = await import("./list-suites-CRY4VWW6.js");
1309
+ const { handleListTestSuites } = await import("./list-test-suites-L7R2O6DR.js");
1148
1310
  return {
1149
- content: [{ type: "text", text: await handleListSuites(params) }]
1311
+ content: [{ type: "text", text: await handleListTestSuites(params) }]
1150
1312
  };
1151
1313
  })
1152
1314
  );
1153
1315
  server.tool(
1154
- "platform_get_suite",
1155
- "Get detailed information about a specific suite (run plan) by ID.",
1316
+ "platform_create_test_suite",
1317
+ "Create a test suite. A test suite groups scenarios: file a scenario in it by passing the suite ID as testSuiteId on platform_create_scenario or platform_update_scenario. A suite can declare typed fields every scenario carries a value for, and attach saved evaluators that run after every scenario run with mappings from their inputs to the conversation, the scenario's fields or the trace. Call discover_schema({ category: 'scenarios' }) first for the field rules and the mapping paths.",
1156
1318
  {
1157
- id: z2.string().describe("The suite ID"),
1319
+ name: z2.string().describe("Test suite name"),
1320
+ fields: suiteFieldsSchema.optional(),
1321
+ evaluators: evaluatorAttachmentsSchema.optional()
1322
+ },
1323
+ withToolLogging("platform_create_test_suite", async (params) => {
1324
+ requireApiKey();
1325
+ const { handleCreateTestSuite } = await import("./create-test-suite-ZIZCCFJ4.js");
1326
+ return {
1327
+ content: [{ type: "text", text: await handleCreateTestSuite(params) }]
1328
+ };
1329
+ })
1330
+ );
1331
+ server.tool(
1332
+ "platform_get_test_suite",
1333
+ "Get a test suite and the scenarios filed in it.",
1334
+ {
1335
+ id: z2.string().describe("The test suite ID"),
1158
1336
  format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1159
1337
  },
1160
- withToolLogging("platform_get_suite", async (params) => {
1338
+ withToolLogging("platform_get_test_suite", async (params) => {
1161
1339
  requireApiKey();
1162
- const { handleGetSuite } = await import("./get-suite-J7JVWO6O.js");
1340
+ const { handleGetTestSuite } = await import("./get-test-suite-4HKA7OKS.js");
1163
1341
  return {
1164
- content: [{ type: "text", text: await handleGetSuite(params) }]
1342
+ content: [{ type: "text", text: await handleGetTestSuite(params) }]
1165
1343
  };
1166
1344
  })
1167
1345
  );
1168
1346
  server.tool(
1169
- "platform_create_suite",
1170
- "Create a new suite (run plan) that bundles scenarios with targets for batch execution.",
1347
+ "platform_update_test_suite",
1348
+ "Edit a test suite: any of its name, its fields and its evaluators. A field list or an evaluator list replaces the one the suite holds; a key left out keeps what the suite has. A field an attached evaluator still reads cannot be removed. Call discover_schema({ category: 'scenarios' }) first for the field rules and the mapping paths.",
1171
1349
  {
1172
- name: z2.string().describe("Suite name"),
1173
- description: z2.string().optional().describe("Suite description"),
1174
- scenarioIds: z2.array(z2.string()).describe("Array of scenario IDs to include"),
1175
- targets: z2.string().describe('JSON array of target objects, e.g. [{"type":"http","referenceId":"agent_abc"}]'),
1176
- repeatCount: z2.number().optional().describe("Number of times to repeat each scenario-target pair (default: 1)"),
1177
- labels: z2.array(z2.string()).optional().describe("Tags for organizing suites")
1350
+ id: z2.string().describe("The test suite ID"),
1351
+ name: z2.string().optional().describe("The new name. The slug is kept."),
1352
+ fields: suiteFieldsSchema.optional().describe("The full list of fields the suite declares. It replaces the list the suite holds."),
1353
+ evaluators: evaluatorAttachmentsSchema.optional().describe("The full list of evaluators attached to the suite. It replaces the list the suite holds.")
1178
1354
  },
1179
- withToolLogging("platform_create_suite", async (params) => {
1355
+ withToolLogging("platform_update_test_suite", async (params) => {
1180
1356
  requireApiKey();
1181
- const { handleCreateSuite } = await import("./create-suite-LZS6QIAF.js");
1182
1357
  return {
1183
- content: [{ type: "text", text: await handleCreateSuite(params) }]
1358
+ content: [{ type: "text", text: await handleUpdateTestSuite(params) }]
1184
1359
  };
1185
1360
  })
1186
1361
  );
1187
1362
  server.tool(
1188
- "platform_update_suite",
1189
- "Update an existing suite (run plan).",
1363
+ "platform_rename_test_suite",
1364
+ "Rename a test suite.",
1190
1365
  {
1191
- id: z2.string().describe("The suite ID to update"),
1192
- name: z2.string().optional().describe("New suite name"),
1193
- description: z2.string().optional().describe("New description"),
1194
- scenarioIds: z2.array(z2.string()).optional().describe("New array of scenario IDs"),
1195
- targets: z2.string().optional().describe("New JSON array of targets"),
1196
- repeatCount: z2.number().optional().describe("New repeat count"),
1197
- labels: z2.array(z2.string()).optional().describe("New labels")
1366
+ id: z2.string().describe("The test suite ID"),
1367
+ name: z2.string().describe("The new name")
1198
1368
  },
1199
- withToolLogging("platform_update_suite", async (params) => {
1369
+ withToolLogging("platform_rename_test_suite", async (params) => {
1200
1370
  requireApiKey();
1201
- const { handleUpdateSuite } = await import("./update-suite-SNO3GS7T.js");
1371
+ const { handleRenameTestSuite } = await import("./rename-test-suite-NTYHAO5X.js");
1202
1372
  return {
1203
- content: [{ type: "text", text: await handleUpdateSuite(params) }]
1373
+ content: [{ type: "text", text: await handleRenameTestSuite(params) }]
1204
1374
  };
1205
1375
  })
1206
1376
  );
1207
1377
  server.tool(
1208
- "platform_run_suite",
1209
- "Trigger a suite run. Schedules all scenario x target x repeat jobs for execution.",
1378
+ "platform_archive_test_suite",
1379
+ "Archive a test suite. The scenarios filed in it are archived with it.",
1210
1380
  {
1211
- id: z2.string().describe("The suite ID to run")
1381
+ id: z2.string().describe("The test suite ID to archive")
1212
1382
  },
1213
- withToolLogging("platform_run_suite", async (params) => {
1383
+ withToolLogging("platform_archive_test_suite", async (params) => {
1214
1384
  requireApiKey();
1215
- const { handleRunSuite } = await import("./run-suite-NKZCJ2IN.js");
1385
+ const { handleArchiveTestSuite } = await import("./archive-test-suite-O7FLDMXK.js");
1216
1386
  return {
1217
- content: [{ type: "text", text: await handleRunSuite(params) }]
1387
+ content: [{ type: "text", text: await handleArchiveTestSuite(params) }]
1218
1388
  };
1219
1389
  })
1220
1390
  );
1221
1391
  server.tool(
1222
- "platform_archive_suite",
1223
- "Archive (soft-delete) a suite (run plan).",
1392
+ "platform_run_test_suite",
1393
+ "Run every scenario of a test suite against targets. This creates or joins the run plan named '<suite name> <target name>' unless you send a name of your own. Send more than one target to compare them in the same run, and give a target its own parameters to compare one agent on two models.",
1224
1394
  {
1225
- id: z2.string().describe("The suite ID to archive")
1395
+ id: z2.string().describe("The test suite ID to run"),
1396
+ targets: z2.array(runPlanTargetSchema).describe(
1397
+ "What to run the scenarios against. Every target runs every scenario, and the results show one column for each."
1398
+ ),
1399
+ name: z2.string().optional().describe(
1400
+ "The run plan to run. Omit to let the server name it after the suite and the target."
1401
+ ),
1402
+ repeatCount: z2.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1403
+ simulatorModel: z2.string().optional().describe("Model that plays the user. Omit for the project default."),
1404
+ judgeModel: z2.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1405
+ parameters: runParametersSchema.optional().describe(
1406
+ "Values for the parameters the scenarios declare, by name. They apply to every target; a target that names the same parameter overrides them for itself."
1407
+ ),
1408
+ note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1226
1409
  },
1227
- withToolLogging("platform_archive_suite", async (params) => {
1410
+ withToolLogging("platform_run_test_suite", async (params) => {
1228
1411
  requireApiKey();
1229
- const { handleArchiveSuite } = await import("./archive-suite-4T6BSRS7.js");
1412
+ const { handleRunTestSuite } = await import("./run-test-suite-L4MZ7G4D.js");
1230
1413
  return {
1231
- content: [{ type: "text", text: await handleArchiveSuite(params) }]
1414
+ content: [{ type: "text", text: await handleRunTestSuite(params) }]
1232
1415
  };
1233
1416
  })
1234
1417
  );
@@ -1243,7 +1426,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1243
1426
  },
1244
1427
  withToolLogging("platform_list_simulation_runs", async (params) => {
1245
1428
  requireApiKey();
1246
- const { handleListSimulationRuns } = await import("./list-simulation-runs-KF5THG5H.js");
1429
+ const { handleListSimulationRuns } = await import("./list-simulation-runs-D6YF4ZOU.js");
1247
1430
  return {
1248
1431
  content: [{ type: "text", text: await handleListSimulationRuns(params) }]
1249
1432
  };
@@ -1251,14 +1434,14 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1251
1434
  );
1252
1435
  server.tool(
1253
1436
  "platform_get_simulation_run",
1254
- "Get full details of a simulation run including conversation messages, results, costs, and verdict.",
1437
+ "Get full details of a simulation run including conversation messages, results, costs, the verdict and the result of every evaluator attached to its test suite or run plan.",
1255
1438
  {
1256
1439
  scenarioRunId: z2.string().describe("The simulation run ID"),
1257
1440
  format: z2.enum(["digest", "json"]).optional().describe("Output format")
1258
1441
  },
1259
1442
  withToolLogging("platform_get_simulation_run", async (params) => {
1260
1443
  requireApiKey();
1261
- const { handleGetSimulationRun } = await import("./get-simulation-run-T2ZQWYH2.js");
1444
+ const { handleGetSimulationRun } = await import("./get-simulation-run-WINEYDMK.js");
1262
1445
  return {
1263
1446
  content: [{ type: "text", text: await handleGetSimulationRun(params) }]
1264
1447
  };
@@ -1275,7 +1458,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1275
1458
  },
1276
1459
  withToolLogging("platform_create_evaluator", async (params) => {
1277
1460
  requireApiKey();
1278
- const { handleCreateEvaluator } = await import("./create-evaluator-JXF5PF33.js");
1461
+ const { handleCreateEvaluator } = await import("./create-evaluator-6NV33Z52.js");
1279
1462
  return {
1280
1463
  content: [
1281
1464
  { type: "text", text: await handleCreateEvaluator(params) }
@@ -1289,7 +1472,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1289
1472
  {},
1290
1473
  withToolLogging("platform_list_evaluators", async () => {
1291
1474
  requireApiKey();
1292
- const { handleListEvaluators } = await import("./list-evaluators-SJHC7VBH.js");
1475
+ const { handleListEvaluators } = await import("./list-evaluators-PAX72WCN.js");
1293
1476
  return {
1294
1477
  content: [{ type: "text", text: await handleListEvaluators() }]
1295
1478
  };
@@ -1303,7 +1486,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1303
1486
  },
1304
1487
  withToolLogging("platform_get_evaluator", async (params) => {
1305
1488
  requireApiKey();
1306
- const { handleGetEvaluator } = await import("./get-evaluator-ADMKVWYZ.js");
1489
+ const { handleGetEvaluator } = await import("./get-evaluator-RZ44UIN6.js");
1307
1490
  return {
1308
1491
  content: [{ type: "text", text: await handleGetEvaluator(params) }]
1309
1492
  };
@@ -1321,7 +1504,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1321
1504
  },
1322
1505
  withToolLogging("platform_update_evaluator", async (params) => {
1323
1506
  requireApiKey();
1324
- const { handleUpdateEvaluator } = await import("./update-evaluator-LS6TIBY7.js");
1507
+ const { handleUpdateEvaluator } = await import("./update-evaluator-NH7Q5GWV.js");
1325
1508
  return {
1326
1509
  content: [
1327
1510
  { type: "text", text: await handleUpdateEvaluator(params) }
@@ -1337,7 +1520,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1337
1520
  },
1338
1521
  withToolLogging("platform_delete_evaluator", async (params) => {
1339
1522
  requireApiKey();
1340
- const { handleDeleteEvaluator } = await import("./delete-evaluator-33SP2JFX.js");
1523
+ const { handleDeleteEvaluator } = await import("./delete-evaluator-RKYC4TNB.js");
1341
1524
  return {
1342
1525
  content: [{ type: "text", text: await handleDeleteEvaluator(params) }]
1343
1526
  };
@@ -1358,7 +1541,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1358
1541
  },
1359
1542
  withToolLogging("platform_set_model_provider", async (params) => {
1360
1543
  requireApiKey();
1361
- const { handleSetModelProvider } = await import("./set-model-provider-3WKT63ZN.js");
1544
+ const { handleSetModelProvider } = await import("./set-model-provider-XRNMFOVR.js");
1362
1545
  return {
1363
1546
  content: [
1364
1547
  { type: "text", text: await handleSetModelProvider(params) }
@@ -1372,7 +1555,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1372
1555
  {},
1373
1556
  withToolLogging("platform_list_model_providers", async () => {
1374
1557
  requireApiKey();
1375
- const { handleListModelProviders } = await import("./list-model-providers-PPD2WPD2.js");
1558
+ const { handleListModelProviders } = await import("./list-model-providers-VVLZMLCX.js");
1376
1559
  return {
1377
1560
  content: [{ type: "text", text: await handleListModelProviders() }]
1378
1561
  };
@@ -1380,11 +1563,11 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1380
1563
  );
1381
1564
  server.tool(
1382
1565
  "platform_list_agents",
1383
- "List all agents in the LangWatch project with their names, types, and IDs.",
1566
+ "List all agents in the LangWatch project with their names, types and IDs. A connected agent (one that registered itself from code with connectAgent or connect_agent) also shows its environment, whether it is online, how many instances are connected, and its owner.",
1384
1567
  {},
1385
1568
  withToolLogging("platform_list_agents", async () => {
1386
1569
  requireApiKey();
1387
- const { handleListAgents } = await import("./list-agents-KFHKGPXV.js");
1570
+ const { handleListAgents } = await import("./list-agents-AMVDQPQL.js");
1388
1571
  return {
1389
1572
  content: [{ type: "text", text: await handleListAgents() }]
1390
1573
  };
@@ -1392,13 +1575,13 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1392
1575
  );
1393
1576
  server.tool(
1394
1577
  "platform_get_agent",
1395
- "Get detailed information about a specific agent by its ID, including its configuration.",
1578
+ "Get detailed information about a specific agent by its ID, including its configuration. A connected agent also shows its environment, status, the run parameters it declared (with options and defaults) and the instances connected right now.",
1396
1579
  {
1397
1580
  id: z2.string().describe("The agent ID")
1398
1581
  },
1399
1582
  withToolLogging("platform_get_agent", async (params) => {
1400
1583
  requireApiKey();
1401
- const { handleGetAgent } = await import("./get-agent-Y7MWZ65F.js");
1584
+ const { handleGetAgent } = await import("./get-agent-7THF7HCU.js");
1402
1585
  return {
1403
1586
  content: [{ type: "text", text: await handleGetAgent(params) }]
1404
1587
  };
@@ -1406,7 +1589,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1406
1589
  );
1407
1590
  server.tool(
1408
1591
  "platform_create_agent",
1409
- "Create a new agent. Supported types: 'signature' (LLM prompt), 'code' (Python), 'workflow' (sub-workflow), 'http' (external API).",
1592
+ "Create a new agent. Supported types: 'signature' (LLM prompt), 'code' (Python), 'workflow' (sub-workflow), 'http' (external API). A 'connected' agent is not created here: it registers itself from code, with connectAgent from langwatch/agent in TypeScript or langwatch.connect_agent in Python, and appears in the list once that process runs.",
1410
1593
  {
1411
1594
  name: z2.string().describe("Agent name"),
1412
1595
  type: z2.enum(["signature", "code", "workflow", "http"]).describe("Agent type"),
@@ -1414,7 +1597,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1414
1597
  },
1415
1598
  withToolLogging("platform_create_agent", async (params) => {
1416
1599
  requireApiKey();
1417
- const { handleCreateAgent } = await import("./create-agent-7XHO6UIS.js");
1600
+ const { handleCreateAgent } = await import("./create-agent-JFJ2K6X3.js");
1418
1601
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1419
1602
  return {
1420
1603
  content: [{ type: "text", text: await handleCreateAgent({ ...params, config: parsedConfig }) }]
@@ -1432,7 +1615,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1432
1615
  },
1433
1616
  withToolLogging("platform_update_agent", async (params) => {
1434
1617
  requireApiKey();
1435
- const { handleUpdateAgent } = await import("./update-agent-SMAEHLXH.js");
1618
+ const { handleUpdateAgent } = await import("./update-agent-DUWNYBNA.js");
1436
1619
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1437
1620
  return {
1438
1621
  content: [{ type: "text", text: await handleUpdateAgent({ ...params, config: parsedConfig }) }]
@@ -1447,7 +1630,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1447
1630
  },
1448
1631
  withToolLogging("platform_delete_agent", async (params) => {
1449
1632
  requireApiKey();
1450
- const { handleDeleteAgent } = await import("./delete-agent-O3EEH4S5.js");
1633
+ const { handleDeleteAgent } = await import("./delete-agent-SA4JMUZF.js");
1451
1634
  return {
1452
1635
  content: [{ type: "text", text: await handleDeleteAgent(params) }]
1453
1636
  };
@@ -1455,26 +1638,44 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1455
1638
  );
1456
1639
  server.tool(
1457
1640
  "platform_run_agent",
1458
- "Execute an agent with JSON input. HTTP agents call their configured URL directly; workflow-linked agents execute via the workflow engine.",
1641
+ "Run one turn of an agent. A connected agent runs through the platform relay on a live instance: give `message` (one user turn) or `input` with a `messages` list, plus `parameters` and `threadId` to continue a conversation. HTTP agents call their configured URL directly; workflow-linked agents execute via the workflow engine.",
1459
1642
  {
1460
1643
  id: z2.string().describe("The agent ID to run"),
1461
- input: z2.string().optional().describe("Input data as a JSON object string")
1644
+ input: z2.string().optional().describe(
1645
+ "Input data as a JSON object string. For a connected agent it is the relay body: messages (OpenAI style), and optionally threadId, session and params."
1646
+ ),
1647
+ message: z2.string().optional().describe("One user message to send to a connected agent, instead of input"),
1648
+ parameters: z2.record(z2.string(), z2.union([z2.string(), z2.number(), z2.boolean()])).optional().describe("Run parameter values for a connected agent, by name"),
1649
+ threadId: z2.string().optional().describe("Continue a conversation on a connected agent")
1462
1650
  },
1463
1651
  withToolLogging("platform_run_agent", async (params) => {
1464
1652
  requireApiKey();
1465
- const { handleRunAgent } = await import("./run-agent-6SM4XNA7.js");
1653
+ const { handleRunAgent } = await import("./run-agent-CAGWGTYT.js");
1466
1654
  return {
1467
1655
  content: [{ type: "text", text: await handleRunAgent(params) }]
1468
1656
  };
1469
1657
  })
1470
1658
  );
1659
+ server.tool(
1660
+ "platform_test_agent",
1661
+ 'Test an agent with one scripted scenario run: the user sends "ping", the agent answers, and the run succeeds when the answer arrives. No model is used, and no scenario, run plan or test suite is added to the project. Answers at once with the scenario run id to follow with platform_get_simulation_run; the run itself is asynchronous.',
1662
+ {
1663
+ id: z2.string().describe("The agent ID to test")
1664
+ },
1665
+ withToolLogging("platform_test_agent", async (params) => {
1666
+ requireApiKey();
1667
+ return {
1668
+ content: [{ type: "text", text: await handleTestAgent(params) }]
1669
+ };
1670
+ })
1671
+ );
1471
1672
  server.tool(
1472
1673
  "platform_list_dashboards",
1473
1674
  "List all analytics dashboards in the LangWatch project.",
1474
1675
  {},
1475
1676
  withToolLogging("platform_list_dashboards", async () => {
1476
1677
  requireApiKey();
1477
- const { handleListDashboards } = await import("./list-dashboards-PWG6P6KR.js");
1678
+ const { handleListDashboards } = await import("./list-dashboards-Z3BZKDGF.js");
1478
1679
  return {
1479
1680
  content: [{ type: "text", text: await handleListDashboards() }]
1480
1681
  };
@@ -1488,7 +1689,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1488
1689
  },
1489
1690
  withToolLogging("platform_get_dashboard", async (params) => {
1490
1691
  requireApiKey();
1491
- const { handleGetDashboard } = await import("./get-dashboard-KHBEGZGL.js");
1692
+ const { handleGetDashboard } = await import("./get-dashboard-P4WWVHFU.js");
1492
1693
  return {
1493
1694
  content: [{ type: "text", text: await handleGetDashboard(params) }]
1494
1695
  };
@@ -1502,7 +1703,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1502
1703
  },
1503
1704
  withToolLogging("platform_create_dashboard", async (params) => {
1504
1705
  requireApiKey();
1505
- const { handleCreateDashboard } = await import("./create-dashboard-4Z5JO5LB.js");
1706
+ const { handleCreateDashboard } = await import("./create-dashboard-Z76AIPLS.js");
1506
1707
  return {
1507
1708
  content: [{ type: "text", text: await handleCreateDashboard(params) }]
1508
1709
  };
@@ -1516,7 +1717,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1516
1717
  },
1517
1718
  withToolLogging("platform_delete_dashboard", async (params) => {
1518
1719
  requireApiKey();
1519
- const { handleDeleteDashboard } = await import("./delete-dashboard-RFUNYCNP.js");
1720
+ const { handleDeleteDashboard } = await import("./delete-dashboard-LYMRPF27.js");
1520
1721
  return {
1521
1722
  content: [{ type: "text", text: await handleDeleteDashboard(params) }]
1522
1723
  };
@@ -1531,7 +1732,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1531
1732
  },
1532
1733
  withToolLogging("platform_rename_dashboard", async (params) => {
1533
1734
  requireApiKey();
1534
- const { renameDashboard } = await import("./langwatch-api-dashboards-JTVCS7ZJ.js");
1735
+ const { renameDashboard } = await import("./langwatch-api-dashboards-2KJL2M42.js");
1535
1736
  const result = await renameDashboard(params.id, { name: params.name });
1536
1737
  return {
1537
1738
  content: [{ type: "text", text: `Dashboard "${result.name}" renamed successfully (ID: ${result.id}).` }]
@@ -1544,7 +1745,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1544
1745
  {},
1545
1746
  withToolLogging("platform_list_workflows", async () => {
1546
1747
  requireApiKey();
1547
- const { handleListWorkflows } = await import("./list-workflows-QSJWURCK.js");
1748
+ const { handleListWorkflows } = await import("./list-workflows-6MV4XJHF.js");
1548
1749
  return {
1549
1750
  content: [{ type: "text", text: await handleListWorkflows() }]
1550
1751
  };
@@ -1558,7 +1759,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1558
1759
  },
1559
1760
  withToolLogging("platform_get_workflow", async (params) => {
1560
1761
  requireApiKey();
1561
- const { handleGetWorkflow } = await import("./get-workflow-L5L2PSK3.js");
1762
+ const { handleGetWorkflow } = await import("./get-workflow-EEOC7Y45.js");
1562
1763
  return {
1563
1764
  content: [{ type: "text", text: await handleGetWorkflow(params) }]
1564
1765
  };
@@ -1572,7 +1773,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1572
1773
  },
1573
1774
  withToolLogging("platform_delete_workflow", async (params) => {
1574
1775
  requireApiKey();
1575
- const { handleDeleteWorkflow } = await import("./delete-workflow-3NUXO46U.js");
1776
+ const { handleDeleteWorkflow } = await import("./delete-workflow-NG2VXYYM.js");
1576
1777
  return {
1577
1778
  content: [{ type: "text", text: await handleDeleteWorkflow(params) }]
1578
1779
  };
@@ -1587,7 +1788,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1587
1788
  },
1588
1789
  withToolLogging("platform_run_workflow", async (params) => {
1589
1790
  requireApiKey();
1590
- const { handleRunWorkflow } = await import("./run-workflow-QPXC627O.js");
1791
+ const { handleRunWorkflow } = await import("./run-workflow-DFIS23AP.js");
1591
1792
  return {
1592
1793
  content: [{ type: "text", text: await handleRunWorkflow(params) }]
1593
1794
  };
@@ -1601,7 +1802,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1601
1802
  },
1602
1803
  withToolLogging("platform_list_annotations", async (params) => {
1603
1804
  requireApiKey();
1604
- const { handleListAnnotations } = await import("./list-annotations-ZTVP4EEL.js");
1805
+ const { handleListAnnotations } = await import("./list-annotations-6PR5NLIC.js");
1605
1806
  return {
1606
1807
  content: [{ type: "text", text: await handleListAnnotations(params) }]
1607
1808
  };
@@ -1618,7 +1819,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1618
1819
  },
1619
1820
  withToolLogging("platform_create_annotation", async (params) => {
1620
1821
  requireApiKey();
1621
- const { handleCreateAnnotation } = await import("./create-annotation-YQXRQC6A.js");
1822
+ const { handleCreateAnnotation } = await import("./create-annotation-EUXXQ6NS.js");
1622
1823
  return {
1623
1824
  content: [{ type: "text", text: await handleCreateAnnotation(params) }]
1624
1825
  };
@@ -1632,7 +1833,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1632
1833
  },
1633
1834
  withToolLogging("platform_delete_annotation", async (params) => {
1634
1835
  requireApiKey();
1635
- const { handleDeleteAnnotation } = await import("./delete-annotation-XP6FQM7A.js");
1836
+ const { handleDeleteAnnotation } = await import("./delete-annotation-X3KKK7QY.js");
1636
1837
  return {
1637
1838
  content: [{ type: "text", text: await handleDeleteAnnotation(params) }]
1638
1839
  };
@@ -1646,7 +1847,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1646
1847
  },
1647
1848
  withToolLogging("platform_get_annotation", async (params) => {
1648
1849
  requireApiKey();
1649
- const { getAnnotation } = await import("./langwatch-api-annotations-FDAS6NQ7.js");
1850
+ const { getAnnotation } = await import("./langwatch-api-annotations-6DHVZWUK.js");
1650
1851
  const annotation = await getAnnotation(params.id);
1651
1852
  const lines = [
1652
1853
  `**ID**: ${annotation.id}`,
@@ -1668,7 +1869,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1668
1869
  },
1669
1870
  withToolLogging("platform_list_triggers", async (params) => {
1670
1871
  requireApiKey();
1671
- const { listTriggers } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1872
+ const { listTriggers } = await import("./langwatch-api-triggers-5E6DDGX6.js");
1672
1873
  const triggers = await listTriggers();
1673
1874
  if (params.format === "json") {
1674
1875
  return { content: [{ type: "text", text: JSON.stringify(triggers, null, 2) }] };
@@ -1701,7 +1902,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1701
1902
  },
1702
1903
  withToolLogging("platform_create_trigger", async (params) => {
1703
1904
  requireApiKey();
1704
- const { createTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1905
+ const { createTrigger } = await import("./langwatch-api-triggers-5E6DDGX6.js");
1705
1906
  let filters = {};
1706
1907
  if (params.filters) {
1707
1908
  try {
@@ -1732,7 +1933,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1732
1933
  },
1733
1934
  withToolLogging("platform_update_trigger", async (params) => {
1734
1935
  requireApiKey();
1735
- const { updateTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1936
+ const { updateTrigger } = await import("./langwatch-api-triggers-5E6DDGX6.js");
1736
1937
  const trigger = await updateTrigger(params);
1737
1938
  return { content: [{ type: "text", text: `Trigger "${trigger.name}" updated (active: ${trigger.active}).` }] };
1738
1939
  })
@@ -1745,7 +1946,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1745
1946
  },
1746
1947
  withToolLogging("platform_delete_trigger", async (params) => {
1747
1948
  requireApiKey();
1748
- const { deleteTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1949
+ const { deleteTrigger } = await import("./langwatch-api-triggers-5E6DDGX6.js");
1749
1950
  const result = await deleteTrigger(params.id);
1750
1951
  return { content: [{ type: "text", text: `Trigger ${result.id} deleted.` }] };
1751
1952
  })
@@ -1756,7 +1957,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1756
1957
  {},
1757
1958
  withToolLogging("platform_list_monitors", async () => {
1758
1959
  requireApiKey();
1759
- const { listMonitors } = await import("./langwatch-api-monitors-3J7UIQME.js");
1960
+ const { listMonitors } = await import("./langwatch-api-monitors-6ISFJ7WX.js");
1760
1961
  const monitors = await listMonitors();
1761
1962
  if (monitors.length === 0) {
1762
1963
  return { content: [{ type: "text", text: "No monitors found." }] };
@@ -1783,7 +1984,7 @@ ${lines.join("\n")}`
1783
1984
  },
1784
1985
  withToolLogging("platform_get_monitor", async (params) => {
1785
1986
  requireApiKey();
1786
- const { getMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
1987
+ const { getMonitor } = await import("./langwatch-api-monitors-6ISFJ7WX.js");
1787
1988
  const m = await getMonitor(params.id);
1788
1989
  const lines = [
1789
1990
  `**${m.name}** (${m.id})`,
@@ -1810,7 +2011,7 @@ ${lines.join("\n")}`
1810
2011
  },
1811
2012
  withToolLogging("platform_create_monitor", async (params) => {
1812
2013
  requireApiKey();
1813
- const { createMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
2014
+ const { createMonitor } = await import("./langwatch-api-monitors-6ISFJ7WX.js");
1814
2015
  const monitor = await createMonitor(params);
1815
2016
  return {
1816
2017
  content: [
@@ -1834,7 +2035,7 @@ ${lines.join("\n")}`
1834
2035
  },
1835
2036
  withToolLogging("platform_update_monitor", async (params) => {
1836
2037
  requireApiKey();
1837
- const { updateMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
2038
+ const { updateMonitor } = await import("./langwatch-api-monitors-6ISFJ7WX.js");
1838
2039
  const monitor = await updateMonitor(params);
1839
2040
  return {
1840
2041
  content: [
@@ -1854,7 +2055,7 @@ ${lines.join("\n")}`
1854
2055
  },
1855
2056
  withToolLogging("platform_delete_monitor", async (params) => {
1856
2057
  requireApiKey();
1857
- const { deleteMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
2058
+ const { deleteMonitor } = await import("./langwatch-api-monitors-6ISFJ7WX.js");
1858
2059
  const result = await deleteMonitor(params.id);
1859
2060
  return {
1860
2061
  content: [
@@ -1869,7 +2070,7 @@ ${lines.join("\n")}`
1869
2070
  {},
1870
2071
  withToolLogging("platform_list_secrets", async () => {
1871
2072
  requireApiKey();
1872
- const { listSecrets } = await import("./langwatch-api-secrets-BUBSNCNO.js");
2073
+ const { listSecrets } = await import("./langwatch-api-secrets-OEBD6GBU.js");
1873
2074
  const secrets = await listSecrets();
1874
2075
  if (secrets.length === 0) {
1875
2076
  return { content: [{ type: "text", text: "No secrets found." }] };
@@ -1897,7 +2098,7 @@ ${lines.join("\n")}`
1897
2098
  },
1898
2099
  withToolLogging("platform_create_secret", async (params) => {
1899
2100
  requireApiKey();
1900
- const { createSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
2101
+ const { createSecret } = await import("./langwatch-api-secrets-OEBD6GBU.js");
1901
2102
  const secret = await createSecret({ name: params.name, value: params.value });
1902
2103
  return {
1903
2104
  content: [
@@ -1918,7 +2119,7 @@ ${lines.join("\n")}`
1918
2119
  },
1919
2120
  withToolLogging("platform_update_secret", async (params) => {
1920
2121
  requireApiKey();
1921
- const { updateSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
2122
+ const { updateSecret } = await import("./langwatch-api-secrets-OEBD6GBU.js");
1922
2123
  const secret = await updateSecret({ id: params.id, value: params.value });
1923
2124
  return {
1924
2125
  content: [
@@ -1938,7 +2139,7 @@ ${lines.join("\n")}`
1938
2139
  },
1939
2140
  withToolLogging("platform_delete_secret", async (params) => {
1940
2141
  requireApiKey();
1941
- const { deleteSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
2142
+ const { deleteSecret } = await import("./langwatch-api-secrets-OEBD6GBU.js");
1942
2143
  const result = await deleteSecret(params.id);
1943
2144
  return { content: [{ type: "text", text: `Secret ${result.id} deleted.` }] };
1944
2145
  })
@@ -2041,7 +2242,7 @@ ${lines.join("\n")}`
2041
2242
  async (params) => {
2042
2243
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2043
2244
  requireApiKey2();
2044
- const { handleListDatasets } = await import("./list-datasets-ZT4JYUDT.js");
2245
+ const { handleListDatasets } = await import("./list-datasets-WXZL6UMP.js");
2045
2246
  return {
2046
2247
  content: [{ type: "text", text: await handleListDatasets(params) }]
2047
2248
  };
@@ -2059,7 +2260,7 @@ ${lines.join("\n")}`
2059
2260
  async (params) => {
2060
2261
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2061
2262
  requireApiKey2();
2062
- const { handleGetDataset } = await import("./get-dataset-RCMU5VAH.js");
2263
+ const { handleGetDataset } = await import("./get-dataset-AKTYSQDI.js");
2063
2264
  return {
2064
2265
  content: [{ type: "text", text: await handleGetDataset(params) }]
2065
2266
  };
@@ -2072,7 +2273,7 @@ ${lines.join("\n")}`
2072
2273
  async (params) => {
2073
2274
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2074
2275
  requireApiKey2();
2075
- const { handleCreateDataset } = await import("./create-dataset-E6NMSVX7.js");
2276
+ const { handleCreateDataset } = await import("./create-dataset-FD5VAXU4.js");
2076
2277
  return {
2077
2278
  content: [{ type: "text", text: await handleCreateDataset(params) }]
2078
2279
  };
@@ -2089,7 +2290,7 @@ ${lines.join("\n")}`
2089
2290
  async (params) => {
2090
2291
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2091
2292
  requireApiKey2();
2092
- const { handleUpdateDataset } = await import("./update-dataset-BDUK7TUO.js");
2293
+ const { handleUpdateDataset } = await import("./update-dataset-YSOMDCOB.js");
2093
2294
  return {
2094
2295
  content: [{ type: "text", text: await handleUpdateDataset(params) }]
2095
2296
  };
@@ -2104,7 +2305,7 @@ ${lines.join("\n")}`
2104
2305
  async (params) => {
2105
2306
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2106
2307
  requireApiKey2();
2107
- const { handleDeleteDataset } = await import("./delete-dataset-3MJFRDLP.js");
2308
+ const { handleDeleteDataset } = await import("./delete-dataset-W6EZ44HY.js");
2108
2309
  return {
2109
2310
  content: [{ type: "text", text: await handleDeleteDataset(params) }]
2110
2311
  };
@@ -2122,7 +2323,7 @@ ${lines.join("\n")}`
2122
2323
  async (params) => {
2123
2324
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2124
2325
  requireApiKey2();
2125
- const { handleListDatasetRecords } = await import("./list-dataset-records-IOE7LQXS.js");
2326
+ const { handleListDatasetRecords } = await import("./list-dataset-records-O67HZ35Y.js");
2126
2327
  return {
2127
2328
  content: [
2128
2329
  { type: "text", text: await handleListDatasetRecords(params) }
@@ -2140,7 +2341,7 @@ ${lines.join("\n")}`
2140
2341
  async (params) => {
2141
2342
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2142
2343
  requireApiKey2();
2143
- const { handleCreateDatasetRecords } = await import("./create-dataset-records-SKHPRD2K.js");
2344
+ const { handleCreateDatasetRecords } = await import("./create-dataset-records-WQUXXOHI.js");
2144
2345
  return {
2145
2346
  content: [
2146
2347
  { type: "text", text: await handleCreateDatasetRecords(params) }
@@ -2159,7 +2360,7 @@ ${lines.join("\n")}`
2159
2360
  async (params) => {
2160
2361
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2161
2362
  requireApiKey2();
2162
- const { handleUpdateDatasetRecord } = await import("./update-dataset-record-4ZSDRBSW.js");
2363
+ const { handleUpdateDatasetRecord } = await import("./update-dataset-record-DEA2ITYR.js");
2163
2364
  return {
2164
2365
  content: [
2165
2366
  { type: "text", text: await handleUpdateDatasetRecord(params) }
@@ -2177,7 +2378,7 @@ ${lines.join("\n")}`
2177
2378
  async (params) => {
2178
2379
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2179
2380
  requireApiKey2();
2180
- const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-WPMU5GL5.js");
2381
+ const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-7CNOTALB.js");
2181
2382
  return {
2182
2383
  content: [
2183
2384
  { type: "text", text: await handleDeleteDatasetRecords(params) }
@@ -2194,7 +2395,7 @@ ${lines.join("\n")}`
2194
2395
  },
2195
2396
  withToolLogging("platform_list_projects", async (params) => {
2196
2397
  requireApiKey();
2197
- const { handleListProjects } = await import("./list-projects-K7QAIX2I.js");
2398
+ const { handleListProjects } = await import("./list-projects-AQVI6SUK.js");
2198
2399
  return {
2199
2400
  content: [{ type: "text", text: await handleListProjects(params) }]
2200
2401
  };
@@ -2208,7 +2409,7 @@ ${lines.join("\n")}`
2208
2409
  },
2209
2410
  withToolLogging("platform_get_project", async (params) => {
2210
2411
  requireApiKey();
2211
- const { handleGetProject } = await import("./get-project-RAK7URQJ.js");
2412
+ const { handleGetProject } = await import("./get-project-QSQEAB33.js");
2212
2413
  return {
2213
2414
  content: [{ type: "text", text: await handleGetProject(params) }]
2214
2415
  };
@@ -2228,7 +2429,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2228
2429
  },
2229
2430
  withToolLogging("platform_create_project", async (params) => {
2230
2431
  requireApiKey();
2231
- const { handleCreateProject } = await import("./create-project-CS2CB57Y.js");
2432
+ const { handleCreateProject } = await import("./create-project-ZQ7TFIO2.js");
2232
2433
  return {
2233
2434
  content: [{ type: "text", text: await handleCreateProject(params) }]
2234
2435
  };
@@ -2246,7 +2447,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2246
2447
  },
2247
2448
  withToolLogging("platform_update_project", async (params) => {
2248
2449
  requireApiKey();
2249
- const { handleUpdateProject } = await import("./update-project-LKVYXENH.js");
2450
+ const { handleUpdateProject } = await import("./update-project-Q26FBSYH.js");
2250
2451
  return {
2251
2452
  content: [{ type: "text", text: await handleUpdateProject(params) }]
2252
2453
  };
@@ -2260,7 +2461,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2260
2461
  },
2261
2462
  withToolLogging("platform_archive_project", async (params) => {
2262
2463
  requireApiKey();
2263
- const { handleArchiveProject } = await import("./archive-project-4EQGLBJJ.js");
2464
+ const { handleArchiveProject } = await import("./archive-project-W3IKI7UL.js");
2264
2465
  return {
2265
2466
  content: [{ type: "text", text: await handleArchiveProject(params) }]
2266
2467
  };
@@ -2272,7 +2473,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2272
2473
  {},
2273
2474
  withToolLogging("platform_list_api_keys", async () => {
2274
2475
  requireApiKey();
2275
- const { handleListApiKeys } = await import("./list-api-keys-CWD4UQT5.js");
2476
+ const { handleListApiKeys } = await import("./list-api-keys-GVPNBIHQ.js");
2276
2477
  return {
2277
2478
  content: [{ type: "text", text: await handleListApiKeys() }]
2278
2479
  };
@@ -2300,7 +2501,7 @@ The token is returned once and cannot be retrieved again.`,
2300
2501
  },
2301
2502
  withToolLogging("platform_create_api_key", async (params) => {
2302
2503
  requireApiKey();
2303
- const { handleCreateApiKey } = await import("./create-api-key-YUS36KBU.js");
2504
+ const { handleCreateApiKey } = await import("./create-api-key-BGBB76JX.js");
2304
2505
  return {
2305
2506
  content: [{ type: "text", text: await handleCreateApiKey(params) }]
2306
2507
  };
@@ -2314,7 +2515,7 @@ The token is returned once and cannot be retrieved again.`,
2314
2515
  },
2315
2516
  withToolLogging("platform_revoke_api_key", async (params) => {
2316
2517
  requireApiKey();
2317
- const { handleRevokeApiKey } = await import("./revoke-api-key-FTRTZMOF.js");
2518
+ const { handleRevokeApiKey } = await import("./revoke-api-key-6LAZ3QZZ.js");
2318
2519
  return {
2319
2520
  content: [{ type: "text", text: await handleRevokeApiKey(params) }]
2320
2521
  };
@@ -2325,4 +2526,4 @@ The token is returned once and cannot be retrieved again.`,
2325
2526
  export {
2326
2527
  createMcpServer
2327
2528
  };
2328
- //# sourceMappingURL=chunk-4QC7SA2L.js.map
2529
+ //# sourceMappingURL=chunk-QRO35SOM.js.map