@langwatch/mcp-server 0.10.1 → 2.0.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 (144) hide show
  1. package/.python-version +1 -0
  2. package/.release-please-shim +1 -1
  3. package/CHANGELOG.md +75 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +64 -18
  6. package/dist/{archive-project-KAZFHR4A.js → archive-project-4EQGLBJJ.js} +5 -4
  7. package/dist/{archive-scenario-6M2IB7Y2.js → archive-scenario-W6BXYDZ3.js} +5 -4
  8. package/dist/{archive-suite-NXZ3YDS3.js → archive-suite-4T6BSRS7.js} +5 -4
  9. package/dist/{assign-prompt-tag-WPUJO55U.js → assign-prompt-tag-VLXUWEKU.js} +4 -3
  10. package/dist/chunk-37SMPMQS.js +12 -0
  11. package/dist/{chunk-HRFQAFPR.js → chunk-4QC7SA2L.js} +221 -134
  12. package/dist/{chunk-XRQNXN2Z.js → chunk-5CCZFUXS.js} +2 -2
  13. package/dist/{chunk-ITN2QGHF.js → chunk-77BNWQ3U.js} +2 -2
  14. package/dist/{chunk-B6UV3JVI.js → chunk-7RHG56OH.js} +2 -2
  15. package/dist/{chunk-CAY57CKF.js → chunk-A2LEVYQ5.js} +78 -5
  16. package/dist/{chunk-U2QIW2SW.js → chunk-AQJO2EI5.js} +2 -2
  17. package/dist/{chunk-GWEW5XON.js → chunk-CDYQOY5U.js} +2 -2
  18. package/dist/{chunk-LTEJDL4V.js → chunk-J42FWRJ2.js} +2 -2
  19. package/dist/chunk-SAS5OB7F.js +58 -0
  20. package/dist/{chunk-AGGE6NPR.js → chunk-SFB4MU6H.js} +2 -2
  21. package/dist/{chunk-COCNCXVJ.js → chunk-TJCXFNDT.js} +2 -2
  22. package/dist/chunk-TOXJQDIZ.js +432 -0
  23. package/dist/chunk-UJPXFA26.js +267 -0
  24. package/dist/{chunk-KOO5733S.js → chunk-WT4PO4A3.js} +8 -2
  25. package/dist/{chunk-RDUXCCFR.js → chunk-YX3A3CFM.js} +2 -2
  26. package/dist/{chunk-UKRCZJJC.js → chunk-YZLYHLLI.js} +2 -2
  27. package/dist/{chunk-ESGZVPPC.js → chunk-ZWIL4EFL.js} +2 -2
  28. package/dist/config.js +2 -1
  29. package/dist/{create-agent-BI7UTJ6A.js → create-agent-7XHO6UIS.js} +5 -4
  30. package/dist/{create-annotation-SNM2J6S4.js → create-annotation-YQXRQC6A.js} +5 -4
  31. package/dist/{create-api-key-23MXYC2L.js → create-api-key-YUS36KBU.js} +5 -4
  32. package/dist/{create-dashboard-CPOOOIKK.js → create-dashboard-4Z5JO5LB.js} +5 -4
  33. package/dist/{create-dataset-BVXPVVY2.js → create-dataset-E6NMSVX7.js} +5 -4
  34. package/dist/{create-dataset-records-S7VFIIMR.js → create-dataset-records-SKHPRD2K.js} +5 -4
  35. package/dist/{create-evaluator-WJAAQOUE.js → create-evaluator-JXF5PF33.js} +5 -4
  36. package/dist/create-mcp-server.js +4 -3
  37. package/dist/{create-project-BF7LMZH5.js → create-project-CS2CB57Y.js} +5 -4
  38. package/dist/{create-prompt-LZ3QHSU4.js → create-prompt-F5RMX3L3.js} +4 -3
  39. package/dist/{create-prompt-tag-IF4J24QM.js → create-prompt-tag-GMRWTEFR.js} +4 -3
  40. package/dist/{create-scenario-BK4E5DEU.js → create-scenario-JDR2VB2H.js} +5 -4
  41. package/dist/{create-suite-HEQPNLND.js → create-suite-LZS6QIAF.js} +5 -4
  42. package/dist/{delete-agent-Y4T2G5PT.js → delete-agent-O3EEH4S5.js} +5 -4
  43. package/dist/{delete-annotation-KYDMQTZG.js → delete-annotation-XP6FQM7A.js} +5 -4
  44. package/dist/{delete-dashboard-3RW647WJ.js → delete-dashboard-RFUNYCNP.js} +5 -4
  45. package/dist/{delete-dataset-SZAHFHHS.js → delete-dataset-3MJFRDLP.js} +5 -4
  46. package/dist/{delete-dataset-records-ISHKGEBH.js → delete-dataset-records-WPMU5GL5.js} +5 -4
  47. package/dist/{delete-evaluator-VKIG5I3S.js → delete-evaluator-33SP2JFX.js} +5 -4
  48. package/dist/{delete-prompt-tag-VYYL4GTF.js → delete-prompt-tag-KNMZVSPB.js} +4 -3
  49. package/dist/{delete-workflow-SHNPYSWQ.js → delete-workflow-3NUXO46U.js} +5 -4
  50. package/dist/discover-evaluator-schema-XTAD4X7D.js +2191 -0
  51. package/dist/{discover-scenario-schema-MEEEVND7.js → discover-scenario-schema-FE64QK2D.js} +3 -1
  52. package/dist/{discover-schema-3T52ORPB.js → discover-schema-L6QDPON3.js} +3 -1
  53. package/dist/{get-agent-IZSP7AR5.js → get-agent-Y7MWZ65F.js} +5 -4
  54. package/dist/{get-analytics-EDFAYYIQ.js → get-analytics-TETCSOK6.js} +4 -3
  55. package/dist/{get-dashboard-WSAO6IQ4.js → get-dashboard-KHBEGZGL.js} +5 -4
  56. package/dist/{get-dataset-BEVNXQNF.js → get-dataset-RCMU5VAH.js} +5 -4
  57. package/dist/{get-evaluator-HCVXNPZR.js → get-evaluator-ADMKVWYZ.js} +5 -4
  58. package/dist/{get-project-H4V3GYRQ.js → get-project-RAK7URQJ.js} +5 -4
  59. package/dist/{get-prompt-EWRJVVGB.js → get-prompt-OY5B7TRI.js} +4 -3
  60. package/dist/{get-scenario-24YUJS5W.js → get-scenario-ZTAJJL5T.js} +5 -4
  61. package/dist/{get-simulation-run-UX2W6F6I.js → get-simulation-run-T2ZQWYH2.js} +5 -4
  62. package/dist/{get-suite-B65ZKZJA.js → get-suite-J7JVWO6O.js} +5 -4
  63. package/dist/{get-trace-ZR7MIITH.js → get-trace-K7U234Q4.js} +8 -10
  64. package/dist/{get-workflow-YROHUQJW.js → get-workflow-L5L2PSK3.js} +5 -4
  65. package/dist/http-security-EU3CHTY7.js +26 -0
  66. package/dist/http-server-YXHFPPGA.js +24706 -0
  67. package/dist/index.js +23280 -3135
  68. package/dist/{langwatch-api-annotations-OPEXNTPF.js → langwatch-api-annotations-FDAS6NQ7.js} +5 -4
  69. package/dist/{langwatch-api-dashboards-NPQM6QJI.js → langwatch-api-dashboards-JTVCS7ZJ.js} +5 -4
  70. package/dist/{langwatch-api-monitors-3L25OOOS.js → langwatch-api-monitors-3J7UIQME.js} +4 -3
  71. package/dist/{langwatch-api-secrets-ZFURUA62.js → langwatch-api-secrets-BUBSNCNO.js} +4 -3
  72. package/dist/{langwatch-api-triggers-XGXXT7DD.js → langwatch-api-triggers-EDFUCJN6.js} +4 -3
  73. package/dist/langwatch-api-workflows-NBJX5KOG.js +16 -0
  74. package/dist/{list-agents-6ZNOV7FK.js → list-agents-KFHKGPXV.js} +5 -4
  75. package/dist/{list-annotations-6P3IWILH.js → list-annotations-ZTVP4EEL.js} +5 -4
  76. package/dist/{list-api-keys-JJI62KD2.js → list-api-keys-CWD4UQT5.js} +5 -4
  77. package/dist/{list-dashboards-G2WJOXWB.js → list-dashboards-PWG6P6KR.js} +5 -4
  78. package/dist/{list-dataset-records-GWWVOCII.js → list-dataset-records-IOE7LQXS.js} +5 -4
  79. package/dist/{list-datasets-HBTH33X4.js → list-datasets-ZT4JYUDT.js} +5 -4
  80. package/dist/{list-evaluators-K5OGB6TX.js → list-evaluators-SJHC7VBH.js} +5 -4
  81. package/dist/{list-model-providers-JMOGZLSO.js → list-model-providers-PPD2WPD2.js} +5 -4
  82. package/dist/{list-projects-OXJC2NW5.js → list-projects-K7QAIX2I.js} +5 -4
  83. package/dist/{list-prompt-tags-J2HPHVAZ.js → list-prompt-tags-FOO6TNHB.js} +4 -3
  84. package/dist/{list-prompts-C7GR72XL.js → list-prompts-SC2HAUFG.js} +4 -3
  85. package/dist/{list-scenarios-JEPGIIDO.js → list-scenarios-F2WYNRIE.js} +5 -4
  86. package/dist/{list-simulation-runs-DRSAGPEC.js → list-simulation-runs-KF5THG5H.js} +5 -4
  87. package/dist/{list-suites-POTZ3ZT6.js → list-suites-CRY4VWW6.js} +5 -4
  88. package/dist/{list-workflows-QQZQIOHB.js → list-workflows-QSJWURCK.js} +5 -4
  89. package/dist/{rename-prompt-tag-4AAV2BS4.js → rename-prompt-tag-EKWU5QF3.js} +4 -3
  90. package/dist/report-issue-XYVAPAYJ.js +412 -0
  91. package/dist/{revoke-api-key-TONB4ADQ.js → revoke-api-key-FTRTZMOF.js} +5 -4
  92. package/dist/{run-agent-7QE3YEH7.js → run-agent-6SM4XNA7.js} +5 -4
  93. package/dist/{run-suite-Q66OSPO4.js → run-suite-NKZCJ2IN.js} +5 -4
  94. package/dist/{run-workflow-RWX2D752.js → run-workflow-QPXC627O.js} +5 -4
  95. package/dist/{search-traces-M5E5VB4X.js → search-traces-A6HFKPLJ.js} +10 -3
  96. package/dist/{set-model-provider-XENT5D2P.js → set-model-provider-3WKT63ZN.js} +5 -4
  97. package/dist/{update-agent-GML25EE3.js → update-agent-SMAEHLXH.js} +5 -4
  98. package/dist/{update-dataset-R4MM6NNY.js → update-dataset-BDUK7TUO.js} +5 -4
  99. package/dist/{update-dataset-record-FN4BL5P4.js → update-dataset-record-4ZSDRBSW.js} +5 -4
  100. package/dist/{update-evaluator-LH2RDDB5.js → update-evaluator-LS6TIBY7.js} +5 -4
  101. package/dist/{update-project-H53IHRBB.js → update-project-LKVYXENH.js} +5 -4
  102. package/dist/{update-prompt-M33OTTAJ.js → update-prompt-ODCRQRN6.js} +4 -3
  103. package/dist/{update-scenario-FKTQRAFQ.js → update-scenario-NEXCAQI7.js} +5 -4
  104. package/dist/{update-suite-JJTNOTXN.js → update-suite-SNO3GS7T.js} +5 -4
  105. package/package.json +20 -18
  106. package/pyproject.toml +10 -2
  107. package/src/__tests__/all-tools.integration.test.ts +56 -120
  108. package/src/__tests__/config.unit.test.ts +33 -0
  109. package/src/__tests__/docker.integration.test.ts +91 -7
  110. package/src/__tests__/documentation-fetch-security.integration.test.ts +182 -0
  111. package/src/__tests__/feature-map-tool-drift.unit.test.ts +93 -0
  112. package/src/__tests__/http-security-origin.unit.test.ts +97 -0
  113. package/src/__tests__/http-security-sessions.unit.test.ts +209 -0
  114. package/src/__tests__/http-security-verifier.unit.test.ts +248 -0
  115. package/src/__tests__/http-server-allocation.integration.test.ts +279 -0
  116. package/src/__tests__/http-server-origin.integration.test.ts +169 -0
  117. package/src/__tests__/http-server-session-auth.integration.test.ts +341 -0
  118. package/src/__tests__/http-transport.integration.test.ts +85 -87
  119. package/src/__tests__/langwatch-api.unit.test.ts +206 -0
  120. package/src/__tests__/public-http-request-security.integration.test.ts +118 -0
  121. package/src/__tests__/report-issue.integration.test.ts +147 -0
  122. package/src/__tests__/support/http-server-harness.ts +138 -0
  123. package/src/__tests__/tools.unit.test.ts +24 -0
  124. package/src/config.ts +17 -2
  125. package/src/create-mcp-server.ts +43 -29
  126. package/src/documentation-fetch.ts +111 -0
  127. package/src/http-security.ts +492 -0
  128. package/src/http-server.ts +536 -152
  129. package/src/index.ts +49 -2
  130. package/src/langwatch-api-agents.ts +2 -2
  131. package/src/langwatch-api.ts +138 -8
  132. package/src/public-http-request.ts +242 -0
  133. package/src/tools/discover-evaluator-schema.ts +2 -2
  134. package/src/tools/get-trace.ts +2 -12
  135. package/src/tools/report-issue.ts +150 -0
  136. package/src/tools/search-traces.ts +4 -0
  137. package/src/utils/format-evaluations.ts +20 -0
  138. package/tsconfig.json +8 -1
  139. package/uv.lock +261 -207
  140. package/dist/chunk-IUP5IHBD.js +0 -71
  141. package/dist/discover-evaluator-schema-H23XCLNE.js +0 -1402
  142. package/dist/http-server-GXVEDA7G.js +0 -226
  143. package/dist/langwatch-api-workflows-CXCTTCXT.js +0 -15
  144. package/pnpm-workspace.yaml +0 -17
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  LangWatchApiError,
3
3
  makeRequest
4
- } from "./chunk-CAY57CKF.js";
4
+ } from "./chunk-A2LEVYQ5.js";
5
5
  import {
6
6
  requireApiKey
7
- } from "./chunk-KOO5733S.js";
7
+ } from "./chunk-WT4PO4A3.js";
8
8
 
9
9
  // src/create-mcp-server.ts
10
10
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -13,7 +13,7 @@ import { z as z2 } from "zod";
13
13
  // package.json
14
14
  var package_default = {
15
15
  name: "@langwatch/mcp-server",
16
- version: "0.10.1",
16
+ version: "2.0.0",
17
17
  description: "An MCP server for Langwatch.",
18
18
  type: "module",
19
19
  main: "./dist/index.js",
@@ -55,42 +55,129 @@ var package_default = {
55
55
  },
56
56
  devDependencies: {
57
57
  "@ai-sdk/anthropic": "^3.0.44",
58
- "@anthropic-ai/claude-code": "^2.1.119",
58
+ "@anthropic-ai/claude-code": "2.1.202",
59
59
  "@eslint/js": "^10.0.1",
60
+ "@langwatch/handled-error": "workspace:*",
61
+ "@langwatch/redaction": "workspace:*",
60
62
  "@langwatch/scenario": "^0.4.6",
61
- "@types/debug": "^4.1.12",
62
- "@types/eslint__js": "^8.42.3",
63
+ "@langwatch/ssrf": "workspace:*",
64
+ "@opentelemetry/context-async-hooks": "^2.1.0",
65
+ "@opentelemetry/sdk-node": "^0.219.0",
66
+ "@types/debug": "^4.1.13",
63
67
  "@types/express": "^5.0.6",
64
68
  "@types/node": "^25.6.0",
65
69
  "@types/yargs": "^17.0.33",
66
- "@typescript/native-preview": "7.0.0-dev.20250911.1",
70
+ "@typescript/native-preview": "7.0.0-dev.20260705.1",
67
71
  ai: "^6.0.161",
72
+ chalk: "^5.6.2",
73
+ "date-fns": "^4.1.0",
68
74
  dotenv: "^17.2.2",
69
- esbuild: "^0.25.0",
75
+ esbuild: "^0.28.1",
70
76
  eslint: "^10.2.1",
77
+ express: "^5.2.1",
78
+ "node-pty": "^1.0.0",
71
79
  tsup: "^8.1.0",
72
80
  tsx: "^4.20.5",
73
81
  typescript: "^5.0.0",
74
- "typescript-eslint": "^8.55.0"
82
+ "typescript-eslint": "^8.55.0",
83
+ vitest: "^4.1.8",
84
+ yargs: "^18.0.0",
85
+ "zod-validation-error": "^5.0.0"
75
86
  },
76
87
  dependencies: {
77
- "@modelcontextprotocol/sdk": "^1.26.0",
78
- "@opentelemetry/context-async-hooks": "^2.1.0",
79
- "@opentelemetry/sdk-node": "^0.217.0",
80
- chalk: "^5.6.2",
81
- "date-fns": "^4.1.0",
82
- express: "^5.2.1",
83
- "node-pty": "^1.0.0",
84
- vitest: "^3.2.4",
85
- yargs: "^17.7.2",
86
- zod: "^4.3.6",
87
- "zod-validation-error": "^5.0.0"
88
+ "@modelcontextprotocol/sdk": "^1.29.0",
89
+ zod: "^4.3.6"
88
90
  },
89
91
  bin: {
90
92
  "langwatch-mcp-server": "./dist/index.js"
91
93
  }
92
94
  };
93
95
 
96
+ // src/documentation-fetch.ts
97
+ var TRUSTED_DOCUMENTATION_ORIGIN = "https://langwatch.ai";
98
+ var MAX_DOCUMENTATION_BYTES = 2 * 1024 * 1024;
99
+ var DOCUMENTATION_TIMEOUT_MS = 3e4;
100
+ var DOCUMENTATION_CONTENT_TYPES = /* @__PURE__ */ new Set(["text/markdown", "text/plain"]);
101
+ var DOCUMENTATION_CONFIG = {
102
+ langwatch: {
103
+ defaultPath: "/docs/llms.txt",
104
+ namespace: "/docs"
105
+ },
106
+ scenario: {
107
+ defaultPath: "/scenario/llms.txt",
108
+ namespace: "/scenario"
109
+ }
110
+ };
111
+ function documentationUrlError(namespace) {
112
+ return new Error(
113
+ `Only a trusted LangWatch documentation URL under ${TRUSTED_DOCUMENTATION_ORIGIN}${namespace}/ may be fetched`
114
+ );
115
+ }
116
+ function resolveDocumentationUrl(kind, input) {
117
+ const { defaultPath, namespace } = DOCUMENTATION_CONFIG[kind];
118
+ const value = input?.trim();
119
+ let url;
120
+ try {
121
+ if (!value) {
122
+ url = new URL(defaultPath, TRUSTED_DOCUMENTATION_ORIGIN);
123
+ } else if (/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(value) || value.startsWith("//")) {
124
+ url = new URL(value, TRUSTED_DOCUMENTATION_ORIGIN);
125
+ } else {
126
+ const relativePath = value.replace(/^\/+/, "");
127
+ const namespacePath = namespace.slice(1);
128
+ const path = relativePath === namespacePath || relativePath.startsWith(`${namespacePath}/`) ? `/${relativePath}` : `${namespace}/${relativePath}`;
129
+ url = new URL(path, TRUSTED_DOCUMENTATION_ORIGIN);
130
+ }
131
+ } catch {
132
+ throw documentationUrlError(namespace);
133
+ }
134
+ if (url.protocol !== "https:" || url.hostname !== "langwatch.ai" || url.port !== "" || url.username !== "" || url.password !== "" || !url.pathname.startsWith(`${namespace}/`)) {
135
+ throw documentationUrlError(namespace);
136
+ }
137
+ const lowerPath = url.pathname.toLowerCase();
138
+ if (!lowerPath.endsWith(".md") && !lowerPath.endsWith(".txt")) {
139
+ url.pathname += ".md";
140
+ }
141
+ return url;
142
+ }
143
+ async function fetchDocumentation(kind, input, fetchImplementation = fetch) {
144
+ const url = resolveDocumentationUrl(kind, input);
145
+ const response = await fetchImplementation(url, {
146
+ redirect: "error",
147
+ signal: AbortSignal.timeout(DOCUMENTATION_TIMEOUT_MS)
148
+ });
149
+ if (!response.ok) {
150
+ throw new Error(`Documentation request failed with status ${response.status}`);
151
+ }
152
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim() ?? "";
153
+ if (!DOCUMENTATION_CONTENT_TYPES.has(contentType)) {
154
+ throw new Error("Documentation response has an unexpected content type");
155
+ }
156
+ const contentLength = Number(response.headers.get("content-length"));
157
+ if (Number.isFinite(contentLength) && contentLength > MAX_DOCUMENTATION_BYTES) {
158
+ throw new Error("Documentation response is too large");
159
+ }
160
+ if (!response.body) {
161
+ return "";
162
+ }
163
+ const reader = response.body.getReader();
164
+ const decoder = new TextDecoder();
165
+ let receivedBytes = 0;
166
+ let text = "";
167
+ for (; ; ) {
168
+ const { done, value } = await reader.read();
169
+ if (done) {
170
+ return text + decoder.decode();
171
+ }
172
+ receivedBytes += value.byteLength;
173
+ if (receivedBytes > MAX_DOCUMENTATION_BYTES) {
174
+ await reader.cancel();
175
+ throw new Error("Documentation response is too large");
176
+ }
177
+ text += decoder.decode(value, { stream: true });
178
+ }
179
+ }
180
+
94
181
  // src/schemas/create-dataset.ts
95
182
  import { z } from "zod";
96
183
  var DATASET_COLUMN_TYPES = [
@@ -629,19 +716,31 @@ function registerTools(server) {
629
716
  )
630
717
  },
631
718
  withToolLogging("fetch_langwatch_docs", async ({ url }) => {
632
- let urlToFetch = url || "https://langwatch.ai/docs/llms.txt";
633
- if (url && !urlToFetch.endsWith(".md") && !urlToFetch.endsWith(".txt")) {
634
- urlToFetch += ".md";
635
- }
636
- if (!urlToFetch.startsWith("http")) {
637
- if (!urlToFetch.startsWith("/")) {
638
- urlToFetch = "/" + urlToFetch;
639
- }
640
- urlToFetch = "https://langwatch.ai/docs" + urlToFetch;
641
- }
642
- const response = await fetch(urlToFetch);
719
+ const text = await fetchDocumentation("langwatch", url);
720
+ return { content: [{ type: "text", text }] };
721
+ })
722
+ );
723
+ server.tool(
724
+ "report_issue",
725
+ "Report an issue to the LangWatch team: anything that did not work, confused you, or took trial and error while using LangWatch (docs, MCP tools, CLI, SDKs, the platform). Use it whenever you struggled, it is how rough edges get fixed for every agent. Ask the user for permission first, then call with user_approved=true. Works without an API key. Put VERBATIM error messages in the summary; optionally attach raw session content. Secrets, API keys, emails and phone numbers are redacted locally before anything is sent.",
726
+ {
727
+ user_approved: z2.boolean().describe(
728
+ "Must be true, and only after the user explicitly agreed to send this report to LangWatch"
729
+ ),
730
+ title: z2.string().max(300).describe("One-line description of the issue"),
731
+ summary: z2.string().optional().describe(
732
+ "What you were trying to do, what went wrong (verbatim errors), and what you had to figure out the hard way"
733
+ ),
734
+ session_content: z2.string().optional().describe(
735
+ "Optional raw session transcript or log excerpt (JSONL or plain text); redacted locally before sending"
736
+ ),
737
+ contact_email: z2.string().optional().describe("Optional contact email for follow-up"),
738
+ agent: z2.string().optional().describe("Which coding agent this is, e.g. claude-code, codex, cursor")
739
+ },
740
+ withToolLogging("report_issue", async (params) => {
741
+ const { handleReportIssue } = await import("./report-issue-XYVAPAYJ.js");
643
742
  return {
644
- content: [{ type: "text", text: await response.text() }]
743
+ content: [{ type: "text", text: await handleReportIssue(params) }]
645
744
  };
646
745
  })
647
746
  );
@@ -654,20 +753,8 @@ function registerTools(server) {
654
753
  )
655
754
  },
656
755
  withToolLogging("fetch_scenario_docs", async ({ url }) => {
657
- let urlToFetch = url || "https://langwatch.ai/scenario/llms.txt";
658
- if (url && !urlToFetch.endsWith(".md") && !urlToFetch.endsWith(".txt")) {
659
- urlToFetch += ".md";
660
- }
661
- if (!urlToFetch.startsWith("http")) {
662
- if (!urlToFetch.startsWith("/")) {
663
- urlToFetch = "/" + urlToFetch;
664
- }
665
- urlToFetch = "https://langwatch.ai" + urlToFetch;
666
- }
667
- const response = await fetch(urlToFetch);
668
- return {
669
- content: [{ type: "text", text: await response.text() }]
670
- };
756
+ const text = await fetchDocumentation("scenario", url);
757
+ return { content: [{ type: "text", text }] };
671
758
  })
672
759
  );
673
760
  server.tool(
@@ -684,30 +771,30 @@ function registerTools(server) {
684
771
  "all"
685
772
  ]).describe("Which schema category to discover"),
686
773
  evaluatorType: z2.string().optional().describe(
687
- "When category is 'evaluators', provide a specific evaluator type (e.g. 'langevals/llm_judge') to get its full schema details"
774
+ "When category is 'evaluators', provide a specific evaluator type (e.g. 'langevals/llm_boolean') to get its full schema details"
688
775
  )
689
776
  },
690
777
  async ({ category, evaluatorType }) => {
691
778
  if (category === "scenarios") {
692
- const { formatScenarioSchema } = await import("./discover-scenario-schema-MEEEVND7.js");
779
+ const { formatScenarioSchema } = await import("./discover-scenario-schema-FE64QK2D.js");
693
780
  return {
694
781
  content: [{ type: "text", text: formatScenarioSchema() }]
695
782
  };
696
783
  }
697
784
  if (category === "evaluators") {
698
- const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-H23XCLNE.js");
785
+ const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-XTAD4X7D.js");
699
786
  return {
700
787
  content: [
701
788
  { type: "text", text: formatEvaluatorSchema(evaluatorType) }
702
789
  ]
703
790
  };
704
791
  }
705
- const { formatSchema } = await import("./discover-schema-3T52ORPB.js");
792
+ const { formatSchema } = await import("./discover-schema-L6QDPON3.js");
706
793
  let text = formatSchema(category);
707
794
  if (category === "all") {
708
- const { formatScenarioSchema } = await import("./discover-scenario-schema-MEEEVND7.js");
795
+ const { formatScenarioSchema } = await import("./discover-scenario-schema-FE64QK2D.js");
709
796
  text += "\n\n" + formatScenarioSchema();
710
- const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-H23XCLNE.js");
797
+ const { formatEvaluatorSchema } = await import("./discover-evaluator-schema-XTAD4X7D.js");
711
798
  text += "\n\n" + formatEvaluatorSchema();
712
799
  }
713
800
  return { content: [{ type: "text", text }] };
@@ -733,7 +820,7 @@ function registerTools(server) {
733
820
  },
734
821
  withToolLogging("search_traces", async (params) => {
735
822
  requireApiKey();
736
- const { handleSearchTraces } = await import("./search-traces-M5E5VB4X.js");
823
+ const { handleSearchTraces } = await import("./search-traces-A6HFKPLJ.js");
737
824
  return {
738
825
  content: [{ type: "text", text: await handleSearchTraces(params) }]
739
826
  };
@@ -750,7 +837,7 @@ function registerTools(server) {
750
837
  },
751
838
  withToolLogging("get_trace", async (params) => {
752
839
  requireApiKey();
753
- const { handleGetTrace } = await import("./get-trace-ZR7MIITH.js");
840
+ const { handleGetTrace } = await import("./get-trace-K7U234Q4.js");
754
841
  return {
755
842
  content: [{ type: "text", text: await handleGetTrace(params) }]
756
843
  };
@@ -776,7 +863,7 @@ function registerTools(server) {
776
863
  },
777
864
  withToolLogging("get_analytics", async (params) => {
778
865
  requireApiKey();
779
- const { handleGetAnalytics } = await import("./get-analytics-EDFAYYIQ.js");
866
+ const { handleGetAnalytics } = await import("./get-analytics-TETCSOK6.js");
780
867
  return {
781
868
  content: [{ type: "text", text: await handleGetAnalytics(params) }]
782
869
  };
@@ -810,7 +897,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
810
897
  },
811
898
  withToolLogging("platform_create_prompt", async (params) => {
812
899
  requireApiKey();
813
- const { handleCreatePrompt } = await import("./create-prompt-LZ3QHSU4.js");
900
+ const { handleCreatePrompt } = await import("./create-prompt-F5RMX3L3.js");
814
901
  return {
815
902
  content: [{ type: "text", text: await handleCreatePrompt(params) }]
816
903
  };
@@ -822,7 +909,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
822
909
  {},
823
910
  withToolLogging("platform_list_prompts", async () => {
824
911
  requireApiKey();
825
- const { handleListPrompts } = await import("./list-prompts-C7GR72XL.js");
912
+ const { handleListPrompts } = await import("./list-prompts-SC2HAUFG.js");
826
913
  return {
827
914
  content: [{ type: "text", text: await handleListPrompts() }]
828
915
  };
@@ -846,7 +933,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
846
933
  };
847
934
  }
848
935
  requireApiKey();
849
- const { handleGetPrompt } = await import("./get-prompt-EWRJVVGB.js");
936
+ const { handleGetPrompt } = await import("./get-prompt-OY5B7TRI.js");
850
937
  return {
851
938
  content: [{ type: "text", text: await handleGetPrompt(params) }]
852
939
  };
@@ -871,7 +958,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
871
958
  },
872
959
  withToolLogging("platform_update_prompt", async (params) => {
873
960
  requireApiKey();
874
- const { handleUpdatePrompt } = await import("./update-prompt-M33OTTAJ.js");
961
+ const { handleUpdatePrompt } = await import("./update-prompt-ODCRQRN6.js");
875
962
  return {
876
963
  content: [{ type: "text", text: await handleUpdatePrompt(params) }]
877
964
  };
@@ -887,7 +974,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
887
974
  },
888
975
  withToolLogging("platform_assign_prompt_tag", async (params) => {
889
976
  requireApiKey();
890
- const { handleAssignPromptTag } = await import("./assign-prompt-tag-WPUJO55U.js");
977
+ const { handleAssignPromptTag } = await import("./assign-prompt-tag-VLXUWEKU.js");
891
978
  return {
892
979
  content: [{ type: "text", text: await handleAssignPromptTag(params) }]
893
980
  };
@@ -899,7 +986,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
899
986
  {},
900
987
  withToolLogging("platform_list_prompt_tags", async () => {
901
988
  requireApiKey();
902
- const { handleListPromptTags } = await import("./list-prompt-tags-J2HPHVAZ.js");
989
+ const { handleListPromptTags } = await import("./list-prompt-tags-FOO6TNHB.js");
903
990
  return {
904
991
  content: [{ type: "text", text: await handleListPromptTags() }]
905
992
  };
@@ -913,7 +1000,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
913
1000
  },
914
1001
  withToolLogging("platform_create_prompt_tag", async (params) => {
915
1002
  requireApiKey();
916
- const { handleCreatePromptTag } = await import("./create-prompt-tag-IF4J24QM.js");
1003
+ const { handleCreatePromptTag } = await import("./create-prompt-tag-GMRWTEFR.js");
917
1004
  return {
918
1005
  content: [{ type: "text", text: await handleCreatePromptTag(params) }]
919
1006
  };
@@ -928,7 +1015,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
928
1015
  },
929
1016
  withToolLogging("platform_rename_prompt_tag", async (params) => {
930
1017
  requireApiKey();
931
- const { handleRenamePromptTag } = await import("./rename-prompt-tag-4AAV2BS4.js");
1018
+ const { handleRenamePromptTag } = await import("./rename-prompt-tag-EKWU5QF3.js");
932
1019
  return {
933
1020
  content: [{ type: "text", text: await handleRenamePromptTag(params) }]
934
1021
  };
@@ -942,7 +1029,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
942
1029
  },
943
1030
  withToolLogging("platform_delete_prompt_tag", async (params) => {
944
1031
  requireApiKey();
945
- const { handleDeletePromptTag } = await import("./delete-prompt-tag-VYYL4GTF.js");
1032
+ const { handleDeletePromptTag } = await import("./delete-prompt-tag-KNMZVSPB.js");
946
1033
  return {
947
1034
  content: [{ type: "text", text: await handleDeletePromptTag(params) }]
948
1035
  };
@@ -970,7 +1057,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
970
1057
  },
971
1058
  withToolLogging("platform_create_scenario", async (params) => {
972
1059
  requireApiKey();
973
- const { handleCreateScenario } = await import("./create-scenario-BK4E5DEU.js");
1060
+ const { handleCreateScenario } = await import("./create-scenario-JDR2VB2H.js");
974
1061
  return {
975
1062
  content: [
976
1063
  { type: "text", text: await handleCreateScenario(params) }
@@ -988,7 +1075,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
988
1075
  },
989
1076
  withToolLogging("platform_list_scenarios", async (params) => {
990
1077
  requireApiKey();
991
- const { handleListScenarios } = await import("./list-scenarios-JEPGIIDO.js");
1078
+ const { handleListScenarios } = await import("./list-scenarios-F2WYNRIE.js");
992
1079
  return {
993
1080
  content: [
994
1081
  { type: "text", text: await handleListScenarios(params) }
@@ -1007,7 +1094,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1007
1094
  },
1008
1095
  withToolLogging("platform_get_scenario", async (params) => {
1009
1096
  requireApiKey();
1010
- const { handleGetScenario } = await import("./get-scenario-24YUJS5W.js");
1097
+ const { handleGetScenario } = await import("./get-scenario-ZTAJJL5T.js");
1011
1098
  return {
1012
1099
  content: [{ type: "text", text: await handleGetScenario(params) }]
1013
1100
  };
@@ -1025,7 +1112,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1025
1112
  },
1026
1113
  withToolLogging("platform_update_scenario", async (params) => {
1027
1114
  requireApiKey();
1028
- const { handleUpdateScenario } = await import("./update-scenario-FKTQRAFQ.js");
1115
+ const { handleUpdateScenario } = await import("./update-scenario-NEXCAQI7.js");
1029
1116
  return {
1030
1117
  content: [
1031
1118
  { type: "text", text: await handleUpdateScenario(params) }
@@ -1041,7 +1128,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1041
1128
  },
1042
1129
  withToolLogging("platform_archive_scenario", async (params) => {
1043
1130
  requireApiKey();
1044
- const { handleArchiveScenario } = await import("./archive-scenario-6M2IB7Y2.js");
1131
+ const { handleArchiveScenario } = await import("./archive-scenario-W6BXYDZ3.js");
1045
1132
  return {
1046
1133
  content: [
1047
1134
  { type: "text", text: await handleArchiveScenario(params) }
@@ -1057,7 +1144,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1057
1144
  },
1058
1145
  withToolLogging("platform_list_suites", async (params) => {
1059
1146
  requireApiKey();
1060
- const { handleListSuites } = await import("./list-suites-POTZ3ZT6.js");
1147
+ const { handleListSuites } = await import("./list-suites-CRY4VWW6.js");
1061
1148
  return {
1062
1149
  content: [{ type: "text", text: await handleListSuites(params) }]
1063
1150
  };
@@ -1072,7 +1159,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1072
1159
  },
1073
1160
  withToolLogging("platform_get_suite", async (params) => {
1074
1161
  requireApiKey();
1075
- const { handleGetSuite } = await import("./get-suite-B65ZKZJA.js");
1162
+ const { handleGetSuite } = await import("./get-suite-J7JVWO6O.js");
1076
1163
  return {
1077
1164
  content: [{ type: "text", text: await handleGetSuite(params) }]
1078
1165
  };
@@ -1091,7 +1178,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1091
1178
  },
1092
1179
  withToolLogging("platform_create_suite", async (params) => {
1093
1180
  requireApiKey();
1094
- const { handleCreateSuite } = await import("./create-suite-HEQPNLND.js");
1181
+ const { handleCreateSuite } = await import("./create-suite-LZS6QIAF.js");
1095
1182
  return {
1096
1183
  content: [{ type: "text", text: await handleCreateSuite(params) }]
1097
1184
  };
@@ -1111,7 +1198,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1111
1198
  },
1112
1199
  withToolLogging("platform_update_suite", async (params) => {
1113
1200
  requireApiKey();
1114
- const { handleUpdateSuite } = await import("./update-suite-JJTNOTXN.js");
1201
+ const { handleUpdateSuite } = await import("./update-suite-SNO3GS7T.js");
1115
1202
  return {
1116
1203
  content: [{ type: "text", text: await handleUpdateSuite(params) }]
1117
1204
  };
@@ -1125,7 +1212,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1125
1212
  },
1126
1213
  withToolLogging("platform_run_suite", async (params) => {
1127
1214
  requireApiKey();
1128
- const { handleRunSuite } = await import("./run-suite-Q66OSPO4.js");
1215
+ const { handleRunSuite } = await import("./run-suite-NKZCJ2IN.js");
1129
1216
  return {
1130
1217
  content: [{ type: "text", text: await handleRunSuite(params) }]
1131
1218
  };
@@ -1139,7 +1226,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1139
1226
  },
1140
1227
  withToolLogging("platform_archive_suite", async (params) => {
1141
1228
  requireApiKey();
1142
- const { handleArchiveSuite } = await import("./archive-suite-NXZ3YDS3.js");
1229
+ const { handleArchiveSuite } = await import("./archive-suite-4T6BSRS7.js");
1143
1230
  return {
1144
1231
  content: [{ type: "text", text: await handleArchiveSuite(params) }]
1145
1232
  };
@@ -1156,7 +1243,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1156
1243
  },
1157
1244
  withToolLogging("platform_list_simulation_runs", async (params) => {
1158
1245
  requireApiKey();
1159
- const { handleListSimulationRuns } = await import("./list-simulation-runs-DRSAGPEC.js");
1246
+ const { handleListSimulationRuns } = await import("./list-simulation-runs-KF5THG5H.js");
1160
1247
  return {
1161
1248
  content: [{ type: "text", text: await handleListSimulationRuns(params) }]
1162
1249
  };
@@ -1171,7 +1258,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1171
1258
  },
1172
1259
  withToolLogging("platform_get_simulation_run", async (params) => {
1173
1260
  requireApiKey();
1174
- const { handleGetSimulationRun } = await import("./get-simulation-run-UX2W6F6I.js");
1261
+ const { handleGetSimulationRun } = await import("./get-simulation-run-T2ZQWYH2.js");
1175
1262
  return {
1176
1263
  content: [{ type: "text", text: await handleGetSimulationRun(params) }]
1177
1264
  };
@@ -1188,7 +1275,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1188
1275
  },
1189
1276
  withToolLogging("platform_create_evaluator", async (params) => {
1190
1277
  requireApiKey();
1191
- const { handleCreateEvaluator } = await import("./create-evaluator-WJAAQOUE.js");
1278
+ const { handleCreateEvaluator } = await import("./create-evaluator-JXF5PF33.js");
1192
1279
  return {
1193
1280
  content: [
1194
1281
  { type: "text", text: await handleCreateEvaluator(params) }
@@ -1202,7 +1289,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1202
1289
  {},
1203
1290
  withToolLogging("platform_list_evaluators", async () => {
1204
1291
  requireApiKey();
1205
- const { handleListEvaluators } = await import("./list-evaluators-K5OGB6TX.js");
1292
+ const { handleListEvaluators } = await import("./list-evaluators-SJHC7VBH.js");
1206
1293
  return {
1207
1294
  content: [{ type: "text", text: await handleListEvaluators() }]
1208
1295
  };
@@ -1216,7 +1303,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1216
1303
  },
1217
1304
  withToolLogging("platform_get_evaluator", async (params) => {
1218
1305
  requireApiKey();
1219
- const { handleGetEvaluator } = await import("./get-evaluator-HCVXNPZR.js");
1306
+ const { handleGetEvaluator } = await import("./get-evaluator-ADMKVWYZ.js");
1220
1307
  return {
1221
1308
  content: [{ type: "text", text: await handleGetEvaluator(params) }]
1222
1309
  };
@@ -1234,7 +1321,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1234
1321
  },
1235
1322
  withToolLogging("platform_update_evaluator", async (params) => {
1236
1323
  requireApiKey();
1237
- const { handleUpdateEvaluator } = await import("./update-evaluator-LH2RDDB5.js");
1324
+ const { handleUpdateEvaluator } = await import("./update-evaluator-LS6TIBY7.js");
1238
1325
  return {
1239
1326
  content: [
1240
1327
  { type: "text", text: await handleUpdateEvaluator(params) }
@@ -1250,7 +1337,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1250
1337
  },
1251
1338
  withToolLogging("platform_delete_evaluator", async (params) => {
1252
1339
  requireApiKey();
1253
- const { handleDeleteEvaluator } = await import("./delete-evaluator-VKIG5I3S.js");
1340
+ const { handleDeleteEvaluator } = await import("./delete-evaluator-33SP2JFX.js");
1254
1341
  return {
1255
1342
  content: [{ type: "text", text: await handleDeleteEvaluator(params) }]
1256
1343
  };
@@ -1271,7 +1358,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1271
1358
  },
1272
1359
  withToolLogging("platform_set_model_provider", async (params) => {
1273
1360
  requireApiKey();
1274
- const { handleSetModelProvider } = await import("./set-model-provider-XENT5D2P.js");
1361
+ const { handleSetModelProvider } = await import("./set-model-provider-3WKT63ZN.js");
1275
1362
  return {
1276
1363
  content: [
1277
1364
  { type: "text", text: await handleSetModelProvider(params) }
@@ -1285,7 +1372,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1285
1372
  {},
1286
1373
  withToolLogging("platform_list_model_providers", async () => {
1287
1374
  requireApiKey();
1288
- const { handleListModelProviders } = await import("./list-model-providers-JMOGZLSO.js");
1375
+ const { handleListModelProviders } = await import("./list-model-providers-PPD2WPD2.js");
1289
1376
  return {
1290
1377
  content: [{ type: "text", text: await handleListModelProviders() }]
1291
1378
  };
@@ -1297,7 +1384,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1297
1384
  {},
1298
1385
  withToolLogging("platform_list_agents", async () => {
1299
1386
  requireApiKey();
1300
- const { handleListAgents } = await import("./list-agents-6ZNOV7FK.js");
1387
+ const { handleListAgents } = await import("./list-agents-KFHKGPXV.js");
1301
1388
  return {
1302
1389
  content: [{ type: "text", text: await handleListAgents() }]
1303
1390
  };
@@ -1311,7 +1398,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1311
1398
  },
1312
1399
  withToolLogging("platform_get_agent", async (params) => {
1313
1400
  requireApiKey();
1314
- const { handleGetAgent } = await import("./get-agent-IZSP7AR5.js");
1401
+ const { handleGetAgent } = await import("./get-agent-Y7MWZ65F.js");
1315
1402
  return {
1316
1403
  content: [{ type: "text", text: await handleGetAgent(params) }]
1317
1404
  };
@@ -1327,7 +1414,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1327
1414
  },
1328
1415
  withToolLogging("platform_create_agent", async (params) => {
1329
1416
  requireApiKey();
1330
- const { handleCreateAgent } = await import("./create-agent-BI7UTJ6A.js");
1417
+ const { handleCreateAgent } = await import("./create-agent-7XHO6UIS.js");
1331
1418
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1332
1419
  return {
1333
1420
  content: [{ type: "text", text: await handleCreateAgent({ ...params, config: parsedConfig }) }]
@@ -1345,7 +1432,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1345
1432
  },
1346
1433
  withToolLogging("platform_update_agent", async (params) => {
1347
1434
  requireApiKey();
1348
- const { handleUpdateAgent } = await import("./update-agent-GML25EE3.js");
1435
+ const { handleUpdateAgent } = await import("./update-agent-SMAEHLXH.js");
1349
1436
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1350
1437
  return {
1351
1438
  content: [{ type: "text", text: await handleUpdateAgent({ ...params, config: parsedConfig }) }]
@@ -1360,7 +1447,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1360
1447
  },
1361
1448
  withToolLogging("platform_delete_agent", async (params) => {
1362
1449
  requireApiKey();
1363
- const { handleDeleteAgent } = await import("./delete-agent-Y4T2G5PT.js");
1450
+ const { handleDeleteAgent } = await import("./delete-agent-O3EEH4S5.js");
1364
1451
  return {
1365
1452
  content: [{ type: "text", text: await handleDeleteAgent(params) }]
1366
1453
  };
@@ -1375,7 +1462,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1375
1462
  },
1376
1463
  withToolLogging("platform_run_agent", async (params) => {
1377
1464
  requireApiKey();
1378
- const { handleRunAgent } = await import("./run-agent-7QE3YEH7.js");
1465
+ const { handleRunAgent } = await import("./run-agent-6SM4XNA7.js");
1379
1466
  return {
1380
1467
  content: [{ type: "text", text: await handleRunAgent(params) }]
1381
1468
  };
@@ -1387,7 +1474,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1387
1474
  {},
1388
1475
  withToolLogging("platform_list_dashboards", async () => {
1389
1476
  requireApiKey();
1390
- const { handleListDashboards } = await import("./list-dashboards-G2WJOXWB.js");
1477
+ const { handleListDashboards } = await import("./list-dashboards-PWG6P6KR.js");
1391
1478
  return {
1392
1479
  content: [{ type: "text", text: await handleListDashboards() }]
1393
1480
  };
@@ -1401,7 +1488,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1401
1488
  },
1402
1489
  withToolLogging("platform_get_dashboard", async (params) => {
1403
1490
  requireApiKey();
1404
- const { handleGetDashboard } = await import("./get-dashboard-WSAO6IQ4.js");
1491
+ const { handleGetDashboard } = await import("./get-dashboard-KHBEGZGL.js");
1405
1492
  return {
1406
1493
  content: [{ type: "text", text: await handleGetDashboard(params) }]
1407
1494
  };
@@ -1415,7 +1502,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1415
1502
  },
1416
1503
  withToolLogging("platform_create_dashboard", async (params) => {
1417
1504
  requireApiKey();
1418
- const { handleCreateDashboard } = await import("./create-dashboard-CPOOOIKK.js");
1505
+ const { handleCreateDashboard } = await import("./create-dashboard-4Z5JO5LB.js");
1419
1506
  return {
1420
1507
  content: [{ type: "text", text: await handleCreateDashboard(params) }]
1421
1508
  };
@@ -1429,7 +1516,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1429
1516
  },
1430
1517
  withToolLogging("platform_delete_dashboard", async (params) => {
1431
1518
  requireApiKey();
1432
- const { handleDeleteDashboard } = await import("./delete-dashboard-3RW647WJ.js");
1519
+ const { handleDeleteDashboard } = await import("./delete-dashboard-RFUNYCNP.js");
1433
1520
  return {
1434
1521
  content: [{ type: "text", text: await handleDeleteDashboard(params) }]
1435
1522
  };
@@ -1444,7 +1531,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1444
1531
  },
1445
1532
  withToolLogging("platform_rename_dashboard", async (params) => {
1446
1533
  requireApiKey();
1447
- const { renameDashboard } = await import("./langwatch-api-dashboards-NPQM6QJI.js");
1534
+ const { renameDashboard } = await import("./langwatch-api-dashboards-JTVCS7ZJ.js");
1448
1535
  const result = await renameDashboard(params.id, { name: params.name });
1449
1536
  return {
1450
1537
  content: [{ type: "text", text: `Dashboard "${result.name}" renamed successfully (ID: ${result.id}).` }]
@@ -1457,7 +1544,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1457
1544
  {},
1458
1545
  withToolLogging("platform_list_workflows", async () => {
1459
1546
  requireApiKey();
1460
- const { handleListWorkflows } = await import("./list-workflows-QQZQIOHB.js");
1547
+ const { handleListWorkflows } = await import("./list-workflows-QSJWURCK.js");
1461
1548
  return {
1462
1549
  content: [{ type: "text", text: await handleListWorkflows() }]
1463
1550
  };
@@ -1471,7 +1558,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1471
1558
  },
1472
1559
  withToolLogging("platform_get_workflow", async (params) => {
1473
1560
  requireApiKey();
1474
- const { handleGetWorkflow } = await import("./get-workflow-YROHUQJW.js");
1561
+ const { handleGetWorkflow } = await import("./get-workflow-L5L2PSK3.js");
1475
1562
  return {
1476
1563
  content: [{ type: "text", text: await handleGetWorkflow(params) }]
1477
1564
  };
@@ -1485,7 +1572,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1485
1572
  },
1486
1573
  withToolLogging("platform_delete_workflow", async (params) => {
1487
1574
  requireApiKey();
1488
- const { handleDeleteWorkflow } = await import("./delete-workflow-SHNPYSWQ.js");
1575
+ const { handleDeleteWorkflow } = await import("./delete-workflow-3NUXO46U.js");
1489
1576
  return {
1490
1577
  content: [{ type: "text", text: await handleDeleteWorkflow(params) }]
1491
1578
  };
@@ -1500,7 +1587,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1500
1587
  },
1501
1588
  withToolLogging("platform_run_workflow", async (params) => {
1502
1589
  requireApiKey();
1503
- const { handleRunWorkflow } = await import("./run-workflow-RWX2D752.js");
1590
+ const { handleRunWorkflow } = await import("./run-workflow-QPXC627O.js");
1504
1591
  return {
1505
1592
  content: [{ type: "text", text: await handleRunWorkflow(params) }]
1506
1593
  };
@@ -1514,7 +1601,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1514
1601
  },
1515
1602
  withToolLogging("platform_list_annotations", async (params) => {
1516
1603
  requireApiKey();
1517
- const { handleListAnnotations } = await import("./list-annotations-6P3IWILH.js");
1604
+ const { handleListAnnotations } = await import("./list-annotations-ZTVP4EEL.js");
1518
1605
  return {
1519
1606
  content: [{ type: "text", text: await handleListAnnotations(params) }]
1520
1607
  };
@@ -1531,7 +1618,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1531
1618
  },
1532
1619
  withToolLogging("platform_create_annotation", async (params) => {
1533
1620
  requireApiKey();
1534
- const { handleCreateAnnotation } = await import("./create-annotation-SNM2J6S4.js");
1621
+ const { handleCreateAnnotation } = await import("./create-annotation-YQXRQC6A.js");
1535
1622
  return {
1536
1623
  content: [{ type: "text", text: await handleCreateAnnotation(params) }]
1537
1624
  };
@@ -1545,7 +1632,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1545
1632
  },
1546
1633
  withToolLogging("platform_delete_annotation", async (params) => {
1547
1634
  requireApiKey();
1548
- const { handleDeleteAnnotation } = await import("./delete-annotation-KYDMQTZG.js");
1635
+ const { handleDeleteAnnotation } = await import("./delete-annotation-XP6FQM7A.js");
1549
1636
  return {
1550
1637
  content: [{ type: "text", text: await handleDeleteAnnotation(params) }]
1551
1638
  };
@@ -1559,7 +1646,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1559
1646
  },
1560
1647
  withToolLogging("platform_get_annotation", async (params) => {
1561
1648
  requireApiKey();
1562
- const { getAnnotation } = await import("./langwatch-api-annotations-OPEXNTPF.js");
1649
+ const { getAnnotation } = await import("./langwatch-api-annotations-FDAS6NQ7.js");
1563
1650
  const annotation = await getAnnotation(params.id);
1564
1651
  const lines = [
1565
1652
  `**ID**: ${annotation.id}`,
@@ -1581,7 +1668,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1581
1668
  },
1582
1669
  withToolLogging("platform_list_triggers", async (params) => {
1583
1670
  requireApiKey();
1584
- const { listTriggers } = await import("./langwatch-api-triggers-XGXXT7DD.js");
1671
+ const { listTriggers } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1585
1672
  const triggers = await listTriggers();
1586
1673
  if (params.format === "json") {
1587
1674
  return { content: [{ type: "text", text: JSON.stringify(triggers, null, 2) }] };
@@ -1614,7 +1701,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1614
1701
  },
1615
1702
  withToolLogging("platform_create_trigger", async (params) => {
1616
1703
  requireApiKey();
1617
- const { createTrigger } = await import("./langwatch-api-triggers-XGXXT7DD.js");
1704
+ const { createTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1618
1705
  let filters = {};
1619
1706
  if (params.filters) {
1620
1707
  try {
@@ -1645,7 +1732,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1645
1732
  },
1646
1733
  withToolLogging("platform_update_trigger", async (params) => {
1647
1734
  requireApiKey();
1648
- const { updateTrigger } = await import("./langwatch-api-triggers-XGXXT7DD.js");
1735
+ const { updateTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1649
1736
  const trigger = await updateTrigger(params);
1650
1737
  return { content: [{ type: "text", text: `Trigger "${trigger.name}" updated (active: ${trigger.active}).` }] };
1651
1738
  })
@@ -1658,7 +1745,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1658
1745
  },
1659
1746
  withToolLogging("platform_delete_trigger", async (params) => {
1660
1747
  requireApiKey();
1661
- const { deleteTrigger } = await import("./langwatch-api-triggers-XGXXT7DD.js");
1748
+ const { deleteTrigger } = await import("./langwatch-api-triggers-EDFUCJN6.js");
1662
1749
  const result = await deleteTrigger(params.id);
1663
1750
  return { content: [{ type: "text", text: `Trigger ${result.id} deleted.` }] };
1664
1751
  })
@@ -1669,7 +1756,7 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1669
1756
  {},
1670
1757
  withToolLogging("platform_list_monitors", async () => {
1671
1758
  requireApiKey();
1672
- const { listMonitors } = await import("./langwatch-api-monitors-3L25OOOS.js");
1759
+ const { listMonitors } = await import("./langwatch-api-monitors-3J7UIQME.js");
1673
1760
  const monitors = await listMonitors();
1674
1761
  if (monitors.length === 0) {
1675
1762
  return { content: [{ type: "text", text: "No monitors found." }] };
@@ -1696,7 +1783,7 @@ ${lines.join("\n")}`
1696
1783
  },
1697
1784
  withToolLogging("platform_get_monitor", async (params) => {
1698
1785
  requireApiKey();
1699
- const { getMonitor } = await import("./langwatch-api-monitors-3L25OOOS.js");
1786
+ const { getMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
1700
1787
  const m = await getMonitor(params.id);
1701
1788
  const lines = [
1702
1789
  `**${m.name}** (${m.id})`,
@@ -1723,7 +1810,7 @@ ${lines.join("\n")}`
1723
1810
  },
1724
1811
  withToolLogging("platform_create_monitor", async (params) => {
1725
1812
  requireApiKey();
1726
- const { createMonitor } = await import("./langwatch-api-monitors-3L25OOOS.js");
1813
+ const { createMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
1727
1814
  const monitor = await createMonitor(params);
1728
1815
  return {
1729
1816
  content: [
@@ -1747,7 +1834,7 @@ ${lines.join("\n")}`
1747
1834
  },
1748
1835
  withToolLogging("platform_update_monitor", async (params) => {
1749
1836
  requireApiKey();
1750
- const { updateMonitor } = await import("./langwatch-api-monitors-3L25OOOS.js");
1837
+ const { updateMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
1751
1838
  const monitor = await updateMonitor(params);
1752
1839
  return {
1753
1840
  content: [
@@ -1767,7 +1854,7 @@ ${lines.join("\n")}`
1767
1854
  },
1768
1855
  withToolLogging("platform_delete_monitor", async (params) => {
1769
1856
  requireApiKey();
1770
- const { deleteMonitor } = await import("./langwatch-api-monitors-3L25OOOS.js");
1857
+ const { deleteMonitor } = await import("./langwatch-api-monitors-3J7UIQME.js");
1771
1858
  const result = await deleteMonitor(params.id);
1772
1859
  return {
1773
1860
  content: [
@@ -1782,7 +1869,7 @@ ${lines.join("\n")}`
1782
1869
  {},
1783
1870
  withToolLogging("platform_list_secrets", async () => {
1784
1871
  requireApiKey();
1785
- const { listSecrets } = await import("./langwatch-api-secrets-ZFURUA62.js");
1872
+ const { listSecrets } = await import("./langwatch-api-secrets-BUBSNCNO.js");
1786
1873
  const secrets = await listSecrets();
1787
1874
  if (secrets.length === 0) {
1788
1875
  return { content: [{ type: "text", text: "No secrets found." }] };
@@ -1810,7 +1897,7 @@ ${lines.join("\n")}`
1810
1897
  },
1811
1898
  withToolLogging("platform_create_secret", async (params) => {
1812
1899
  requireApiKey();
1813
- const { createSecret } = await import("./langwatch-api-secrets-ZFURUA62.js");
1900
+ const { createSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
1814
1901
  const secret = await createSecret({ name: params.name, value: params.value });
1815
1902
  return {
1816
1903
  content: [
@@ -1831,7 +1918,7 @@ ${lines.join("\n")}`
1831
1918
  },
1832
1919
  withToolLogging("platform_update_secret", async (params) => {
1833
1920
  requireApiKey();
1834
- const { updateSecret } = await import("./langwatch-api-secrets-ZFURUA62.js");
1921
+ const { updateSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
1835
1922
  const secret = await updateSecret({ id: params.id, value: params.value });
1836
1923
  return {
1837
1924
  content: [
@@ -1851,7 +1938,7 @@ ${lines.join("\n")}`
1851
1938
  },
1852
1939
  withToolLogging("platform_delete_secret", async (params) => {
1853
1940
  requireApiKey();
1854
- const { deleteSecret } = await import("./langwatch-api-secrets-ZFURUA62.js");
1941
+ const { deleteSecret } = await import("./langwatch-api-secrets-BUBSNCNO.js");
1855
1942
  const result = await deleteSecret(params.id);
1856
1943
  return { content: [{ type: "text", text: `Secret ${result.id} deleted.` }] };
1857
1944
  })
@@ -1954,7 +2041,7 @@ ${lines.join("\n")}`
1954
2041
  async (params) => {
1955
2042
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
1956
2043
  requireApiKey2();
1957
- const { handleListDatasets } = await import("./list-datasets-HBTH33X4.js");
2044
+ const { handleListDatasets } = await import("./list-datasets-ZT4JYUDT.js");
1958
2045
  return {
1959
2046
  content: [{ type: "text", text: await handleListDatasets(params) }]
1960
2047
  };
@@ -1972,7 +2059,7 @@ ${lines.join("\n")}`
1972
2059
  async (params) => {
1973
2060
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
1974
2061
  requireApiKey2();
1975
- const { handleGetDataset } = await import("./get-dataset-BEVNXQNF.js");
2062
+ const { handleGetDataset } = await import("./get-dataset-RCMU5VAH.js");
1976
2063
  return {
1977
2064
  content: [{ type: "text", text: await handleGetDataset(params) }]
1978
2065
  };
@@ -1985,7 +2072,7 @@ ${lines.join("\n")}`
1985
2072
  async (params) => {
1986
2073
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
1987
2074
  requireApiKey2();
1988
- const { handleCreateDataset } = await import("./create-dataset-BVXPVVY2.js");
2075
+ const { handleCreateDataset } = await import("./create-dataset-E6NMSVX7.js");
1989
2076
  return {
1990
2077
  content: [{ type: "text", text: await handleCreateDataset(params) }]
1991
2078
  };
@@ -2002,7 +2089,7 @@ ${lines.join("\n")}`
2002
2089
  async (params) => {
2003
2090
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2004
2091
  requireApiKey2();
2005
- const { handleUpdateDataset } = await import("./update-dataset-R4MM6NNY.js");
2092
+ const { handleUpdateDataset } = await import("./update-dataset-BDUK7TUO.js");
2006
2093
  return {
2007
2094
  content: [{ type: "text", text: await handleUpdateDataset(params) }]
2008
2095
  };
@@ -2017,7 +2104,7 @@ ${lines.join("\n")}`
2017
2104
  async (params) => {
2018
2105
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2019
2106
  requireApiKey2();
2020
- const { handleDeleteDataset } = await import("./delete-dataset-SZAHFHHS.js");
2107
+ const { handleDeleteDataset } = await import("./delete-dataset-3MJFRDLP.js");
2021
2108
  return {
2022
2109
  content: [{ type: "text", text: await handleDeleteDataset(params) }]
2023
2110
  };
@@ -2035,7 +2122,7 @@ ${lines.join("\n")}`
2035
2122
  async (params) => {
2036
2123
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2037
2124
  requireApiKey2();
2038
- const { handleListDatasetRecords } = await import("./list-dataset-records-GWWVOCII.js");
2125
+ const { handleListDatasetRecords } = await import("./list-dataset-records-IOE7LQXS.js");
2039
2126
  return {
2040
2127
  content: [
2041
2128
  { type: "text", text: await handleListDatasetRecords(params) }
@@ -2053,7 +2140,7 @@ ${lines.join("\n")}`
2053
2140
  async (params) => {
2054
2141
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2055
2142
  requireApiKey2();
2056
- const { handleCreateDatasetRecords } = await import("./create-dataset-records-S7VFIIMR.js");
2143
+ const { handleCreateDatasetRecords } = await import("./create-dataset-records-SKHPRD2K.js");
2057
2144
  return {
2058
2145
  content: [
2059
2146
  { type: "text", text: await handleCreateDatasetRecords(params) }
@@ -2072,7 +2159,7 @@ ${lines.join("\n")}`
2072
2159
  async (params) => {
2073
2160
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2074
2161
  requireApiKey2();
2075
- const { handleUpdateDatasetRecord } = await import("./update-dataset-record-FN4BL5P4.js");
2162
+ const { handleUpdateDatasetRecord } = await import("./update-dataset-record-4ZSDRBSW.js");
2076
2163
  return {
2077
2164
  content: [
2078
2165
  { type: "text", text: await handleUpdateDatasetRecord(params) }
@@ -2090,7 +2177,7 @@ ${lines.join("\n")}`
2090
2177
  async (params) => {
2091
2178
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2092
2179
  requireApiKey2();
2093
- const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-ISHKGEBH.js");
2180
+ const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-WPMU5GL5.js");
2094
2181
  return {
2095
2182
  content: [
2096
2183
  { type: "text", text: await handleDeleteDatasetRecords(params) }
@@ -2107,7 +2194,7 @@ ${lines.join("\n")}`
2107
2194
  },
2108
2195
  withToolLogging("platform_list_projects", async (params) => {
2109
2196
  requireApiKey();
2110
- const { handleListProjects } = await import("./list-projects-OXJC2NW5.js");
2197
+ const { handleListProjects } = await import("./list-projects-K7QAIX2I.js");
2111
2198
  return {
2112
2199
  content: [{ type: "text", text: await handleListProjects(params) }]
2113
2200
  };
@@ -2121,7 +2208,7 @@ ${lines.join("\n")}`
2121
2208
  },
2122
2209
  withToolLogging("platform_get_project", async (params) => {
2123
2210
  requireApiKey();
2124
- const { handleGetProject } = await import("./get-project-H4V3GYRQ.js");
2211
+ const { handleGetProject } = await import("./get-project-RAK7URQJ.js");
2125
2212
  return {
2126
2213
  content: [{ type: "text", text: await handleGetProject(params) }]
2127
2214
  };
@@ -2141,7 +2228,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2141
2228
  },
2142
2229
  withToolLogging("platform_create_project", async (params) => {
2143
2230
  requireApiKey();
2144
- const { handleCreateProject } = await import("./create-project-BF7LMZH5.js");
2231
+ const { handleCreateProject } = await import("./create-project-CS2CB57Y.js");
2145
2232
  return {
2146
2233
  content: [{ type: "text", text: await handleCreateProject(params) }]
2147
2234
  };
@@ -2159,7 +2246,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2159
2246
  },
2160
2247
  withToolLogging("platform_update_project", async (params) => {
2161
2248
  requireApiKey();
2162
- const { handleUpdateProject } = await import("./update-project-H53IHRBB.js");
2249
+ const { handleUpdateProject } = await import("./update-project-LKVYXENH.js");
2163
2250
  return {
2164
2251
  content: [{ type: "text", text: await handleUpdateProject(params) }]
2165
2252
  };
@@ -2173,7 +2260,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2173
2260
  },
2174
2261
  withToolLogging("platform_archive_project", async (params) => {
2175
2262
  requireApiKey();
2176
- const { handleArchiveProject } = await import("./archive-project-KAZFHR4A.js");
2263
+ const { handleArchiveProject } = await import("./archive-project-4EQGLBJJ.js");
2177
2264
  return {
2178
2265
  content: [{ type: "text", text: await handleArchiveProject(params) }]
2179
2266
  };
@@ -2185,7 +2272,7 @@ You must provide either teamId (to add the project to an existing team) or newTe
2185
2272
  {},
2186
2273
  withToolLogging("platform_list_api_keys", async () => {
2187
2274
  requireApiKey();
2188
- const { handleListApiKeys } = await import("./list-api-keys-JJI62KD2.js");
2275
+ const { handleListApiKeys } = await import("./list-api-keys-CWD4UQT5.js");
2189
2276
  return {
2190
2277
  content: [{ type: "text", text: await handleListApiKeys() }]
2191
2278
  };
@@ -2213,7 +2300,7 @@ The token is returned once and cannot be retrieved again.`,
2213
2300
  },
2214
2301
  withToolLogging("platform_create_api_key", async (params) => {
2215
2302
  requireApiKey();
2216
- const { handleCreateApiKey } = await import("./create-api-key-23MXYC2L.js");
2303
+ const { handleCreateApiKey } = await import("./create-api-key-YUS36KBU.js");
2217
2304
  return {
2218
2305
  content: [{ type: "text", text: await handleCreateApiKey(params) }]
2219
2306
  };
@@ -2227,7 +2314,7 @@ The token is returned once and cannot be retrieved again.`,
2227
2314
  },
2228
2315
  withToolLogging("platform_revoke_api_key", async (params) => {
2229
2316
  requireApiKey();
2230
- const { handleRevokeApiKey } = await import("./revoke-api-key-TONB4ADQ.js");
2317
+ const { handleRevokeApiKey } = await import("./revoke-api-key-FTRTZMOF.js");
2231
2318
  return {
2232
2319
  content: [{ type: "text", text: await handleRevokeApiKey(params) }]
2233
2320
  };
@@ -2238,4 +2325,4 @@ The token is returned once and cannot be retrieved again.`,
2238
2325
  export {
2239
2326
  createMcpServer
2240
2327
  };
2241
- //# sourceMappingURL=chunk-HRFQAFPR.js.map
2328
+ //# sourceMappingURL=chunk-4QC7SA2L.js.map