@langwatch/mcp-server 2.0.0 → 2.2.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 (430) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +280 -200
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +82 -52
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/archive-run-plan-65QN3XRX.js +16 -0
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/archive-test-suite-NKZDZY3D.js +16 -0
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/chunk-6YZUOD34.js +55 -0
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
  34. package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/chunk-O7EMWEVJ.js +44 -0
  38. package/dist/chunk-PTDR56Z3.js +37 -0
  39. package/dist/chunk-RABYBFX5.js +43 -0
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/chunk-U24EACC4.js +67 -0
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/chunk-VMWJD732.js +57 -0
  47. package/dist/chunk-XUIJYNRJ.js +15 -0
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -5
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
  77. package/dist/create-test-suite-4IPXVSFQ.js +37 -0
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/get-agent-OTIYUFZA.js +70 -0
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/get-prompt-OWXJZHQQ.js +95 -0
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/get-run-plan-BE3M2AUX.js +59 -0
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
  123. package/dist/get-test-suite-GC2O7YH6.js +49 -0
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
  131. package/dist/index.js +60221 -38077
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/list-agents-HVYWEQMI.js +43 -0
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/list-run-plans-PX2XI6EK.js +46 -0
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/list-scenarios-QZRPVHS4.js +46 -0
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/list-test-suites-N4WVLBKK.js +35 -0
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/rename-test-suite-4J7UX5S2.js +21 -0
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/report-issue-DCZFLGDO.js +899 -0
  188. package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/run-plan-PAARQSI4.js +39 -0
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/run-test-suite-SQJELEZX.js +26 -0
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/update-prompt-MY263DYF.js +141 -0
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
  222. package/package.json +39 -44
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +1021 -596
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +202 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +140 -0
  244. package/src/langwatch-api-scenarios.ts +17 -10
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +10 -7
  247. package/src/langwatch-api-test-suites.ts +116 -0
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +143 -109
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +76 -0
  255. package/src/schemas/suite-fields.ts +132 -0
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +10 -0
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +10 -0
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +11 -5
  274. package/src/tools/create-test-suite.ts +38 -0
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +86 -12
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +54 -0
  292. package/src/tools/format-scenario.ts +12 -0
  293. package/src/tools/format-suite-details.ts +90 -0
  294. package/src/tools/get-agent.ts +54 -3
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +100 -37
  302. package/src/tools/get-run-plan.ts +60 -0
  303. package/src/tools/get-scenario.ts +6 -5
  304. package/src/tools/get-simulation-run.ts +32 -20
  305. package/src/tools/get-test-suite.ts +46 -0
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +20 -3
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +47 -0
  323. package/src/tools/list-scenarios.ts +26 -17
  324. package/src/tools/list-simulation-runs.ts +13 -5
  325. package/src/tools/list-test-suites.ts +35 -0
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +15 -0
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +18 -0
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +65 -14
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +46 -0
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +27 -0
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +18 -0
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +185 -15
  350. package/src/tools/update-scenario.ts +11 -5
  351. package/src/tools/update-test-suite.ts +40 -0
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +19 -12
  359. package/uv.lock +416 -296
  360. package/vitest.integration.config.js +10 -0
  361. package/vitest.scenario.config.js +9 -0
  362. package/.eslintrc.cjs +0 -36
  363. package/dist/archive-suite-4T6BSRS7.js +0 -16
  364. package/dist/chunk-77BNWQ3U.js +0 -86
  365. package/dist/chunk-A2LEVYQ5.js +0 -217
  366. package/dist/chunk-TJCXFNDT.js +0 -24
  367. package/dist/chunk-YZLYHLLI.js +0 -48
  368. package/dist/config.d.ts +0 -17
  369. package/dist/create-mcp-server.d.ts +0 -10
  370. package/dist/create-suite-LZS6QIAF.js +0 -39
  371. package/dist/delete-evaluator-33SP2JFX.js +0 -16
  372. package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
  373. package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
  374. package/dist/get-agent-Y7MWZ65F.js +0 -29
  375. package/dist/get-analytics-TETCSOK6.js +0 -73
  376. package/dist/get-dataset-RCMU5VAH.js +0 -49
  377. package/dist/get-prompt-OY5B7TRI.js +0 -46
  378. package/dist/get-suite-J7JVWO6O.js +0 -45
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
  381. package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
  382. package/dist/list-agents-KFHKGPXV.js +0 -33
  383. package/dist/list-scenarios-F2WYNRIE.js +0 -41
  384. package/dist/list-suites-CRY4VWW6.js +0 -43
  385. package/dist/report-issue-XYVAPAYJ.js +0 -412
  386. package/dist/run-suite-NKZCJ2IN.js +0 -30
  387. package/dist/search-traces-A6HFKPLJ.js +0 -79
  388. package/dist/update-prompt-ODCRQRN6.js +0 -25
  389. package/dist/update-suite-SNO3GS7T.js +0 -40
  390. package/src/__tests__/all-tools.integration.test.ts +0 -1626
  391. package/src/__tests__/config.unit.test.ts +0 -202
  392. package/src/__tests__/datasets.integration.test.ts +0 -620
  393. package/src/__tests__/datasets.unit.test.ts +0 -244
  394. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  395. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  396. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  397. package/src/__tests__/docker.integration.test.ts +0 -318
  398. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  399. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  400. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  401. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  402. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  403. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  404. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  405. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  406. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  407. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  408. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  409. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  410. package/src/__tests__/http-transport.integration.test.ts +0 -395
  411. package/src/__tests__/integration.integration.test.ts +0 -288
  412. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  413. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  414. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  415. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  416. package/src/__tests__/report-issue.integration.test.ts +0 -147
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -188
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/support/http-server-harness.ts +0 -138
  421. package/src/__tests__/tools.unit.test.ts +0 -924
  422. package/src/langwatch-api-suites.ts +0 -118
  423. package/src/schemas/filter-fields.ts +0 -119
  424. package/src/schemas/index.ts +0 -4
  425. package/src/tools/archive-suite.ts +0 -12
  426. package/src/tools/create-suite.ts +0 -42
  427. package/src/tools/get-suite.ts +0 -47
  428. package/src/tools/list-suites.ts +0 -43
  429. package/src/tools/run-suite.ts +0 -28
  430. package/src/tools/update-suite.ts +0 -44
@@ -1,11 +1,15 @@
1
- import { assignPromptTag as apiAssignPromptTag } from "../langwatch-api.js";
1
+ import { assignPromptTag as apiAssignPromptTag } from "../langwatch-api.ts";
2
2
 
3
3
  export async function handleAssignPromptTag(params: {
4
4
  idOrHandle: string;
5
5
  tag: string;
6
6
  versionId: string;
7
7
  }): Promise<string> {
8
- await apiAssignPromptTag({ idOrHandle: params.idOrHandle, tag: params.tag, versionId: params.versionId });
8
+ await apiAssignPromptTag({
9
+ idOrHandle: params.idOrHandle,
10
+ tag: params.tag,
11
+ versionId: params.versionId,
12
+ });
9
13
 
10
14
  const lines: string[] = [];
11
15
  lines.push("Tag assigned successfully!\n");
@@ -1,4 +1,4 @@
1
- import { createAgent as apiCreateAgent } from "../langwatch-api-agents.js";
1
+ import { createAgent as apiCreateAgent } from "../langwatch-api-agents.ts";
2
2
 
3
3
  export async function handleCreateAgent(params: {
4
4
  name: string;
@@ -1,4 +1,4 @@
1
- import { createAnnotation as apiCreateAnnotation } from "../langwatch-api-annotations.js";
1
+ import { createAnnotation as apiCreateAnnotation } from "../langwatch-api-annotations.ts";
2
2
 
3
3
  export async function handleCreateAnnotation(params: {
4
4
  traceId: string;
@@ -12,7 +12,12 @@ export async function handleCreateAnnotation(params: {
12
12
  email: params.email,
13
13
  });
14
14
 
15
- const rating = params.isThumbsUp === true ? " 👍" : params.isThumbsUp === false ? " 👎" : "";
15
+ let rating = "";
16
+ if (params.isThumbsUp === true) {
17
+ rating = " 👍";
18
+ } else if (params.isThumbsUp === false) {
19
+ rating = " 👎";
20
+ }
16
21
 
17
22
  return `Annotation created successfully!${rating}\n\n**ID**: ${annotation.id ?? "—"}\n**Trace ID**: ${params.traceId}${params.comment ? `\n**Comment**: ${params.comment}` : ""}`;
18
23
  }
@@ -1,15 +1,15 @@
1
- import { createApiKey as apiCreateApiKey } from "../langwatch-api-api-keys.js";
1
+ import { createApiKey as apiCreateApiKey } from "../langwatch-api-api-keys.ts";
2
2
 
3
3
  export async function handleCreateApiKey(params: {
4
4
  keyType: "personal" | "service";
5
5
  name: string;
6
6
  description?: string;
7
7
  expiresAt?: string;
8
- bindings?: Array<{
8
+ bindings?: {
9
9
  role: "ADMIN" | "MEMBER" | "VIEWER";
10
10
  scopeType: "ORGANIZATION" | "TEAM" | "PROJECT";
11
11
  scopeId: string;
12
- }>;
12
+ }[];
13
13
  projectIds?: string[];
14
14
  }): Promise<string> {
15
15
  const result = await apiCreateApiKey(params);
@@ -21,9 +21,7 @@ export async function handleCreateApiKey(params: {
21
21
  lines.push(`**Token**: \`${result.token}\``);
22
22
  lines.push(`**Created**: ${result.apiKey.createdAt}`);
23
23
  lines.push("");
24
- lines.push(
25
- "> ⚠️ Save this token now — it will not be shown again.",
26
- );
24
+ lines.push("> ⚠️ Save this token now — it will not be shown again.");
27
25
 
28
26
  return lines.join("\n");
29
27
  }
@@ -1,4 +1,4 @@
1
- import { createDashboard as apiCreateDashboard } from "../langwatch-api-dashboards.js";
1
+ import { createDashboard as apiCreateDashboard } from "../langwatch-api-dashboards.ts";
2
2
 
3
3
  export async function handleCreateDashboard(params: { name: string }): Promise<string> {
4
4
  const dashboard = await apiCreateDashboard({ name: params.name });
@@ -1,10 +1,8 @@
1
- import { createDatasetRecords as apiCreateDatasetRecords } from "../langwatch-api-datasets.js";
1
+ import { createDatasetRecords as apiCreateDatasetRecords } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_create_dataset_records MCP tool invocation.
5
- *
6
- * Creates records in a dataset in batch and returns a confirmation
7
- * with the count of records created.
4
+ * Handles the platform_create_dataset_records MCP tool: creates records
5
+ * in batch and returns a confirmation with the count created.
8
6
  */
9
7
  export async function handleCreateDatasetRecords(params: {
10
8
  slugOrId: string;
@@ -15,9 +13,7 @@ export async function handleCreateDatasetRecords(params: {
15
13
 
16
14
  const lines: string[] = [];
17
15
  lines.push(`${count} record(s) created successfully!\n`);
18
- lines.push(
19
- "> Use `platform_get_dataset` to see the updated dataset with all records.",
20
- );
16
+ lines.push("> Use `platform_get_dataset` to see the updated dataset with all records.");
21
17
 
22
18
  return lines.join("\n");
23
19
  }
@@ -1,12 +1,10 @@
1
- import { createDataset as apiCreateDataset } from "../langwatch-api-datasets.js";
2
- import type { DatasetColumnType } from "../langwatch-api-datasets.js";
3
- import { formatDatasetMutationDetails } from "./format-dataset-mutation.js";
1
+ import { createDataset as apiCreateDataset } from "../langwatch-api-datasets.ts";
2
+ import type { DatasetColumnType } from "../langwatch-api-datasets.ts";
3
+ import { formatDatasetMutationDetails } from "./format-dataset-mutation.ts";
4
4
 
5
5
  /**
6
- * Handles the platform_create_dataset MCP tool invocation.
7
- *
8
- * Creates a new dataset in the LangWatch project and returns a
9
- * confirmation with the created dataset's details.
6
+ * Handles the platform_create_dataset MCP tool: creates a dataset and
7
+ * returns a confirmation with its details.
10
8
  */
11
9
  export async function handleCreateDataset(params: {
12
10
  name: string;
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  createEvaluator as apiCreateEvaluator,
3
3
  getEvaluatorType,
4
- } from "../langwatch-api-evaluators.js";
4
+ } from "../langwatch-api-evaluators.ts";
5
5
 
6
6
  /**
7
- * Handles the platform_create_evaluator MCP tool invocation.
8
- *
9
- * Creates a new evaluator in the LangWatch project and returns a
10
- * confirmation with the created evaluator's details.
7
+ * Handles the platform_create_evaluator MCP tool: creates an evaluator
8
+ * and returns a confirmation with its details.
11
9
  */
12
10
  export async function handleCreateEvaluator(params: {
13
11
  name: string;
@@ -1,4 +1,4 @@
1
- import { createProject as apiCreateProject } from "../langwatch-api-projects.js";
1
+ import { createProject as apiCreateProject } from "../langwatch-api-projects.ts";
2
2
 
3
3
  export async function handleCreateProject(params: {
4
4
  name: string;
@@ -38,7 +38,7 @@ export async function handleCreateProject(params: {
38
38
  lines.push("");
39
39
  lines.push(
40
40
  "> ⚠️ Save the service API key now — it will not be shown again. " +
41
- "Use it as `LANGWATCH_API_KEY` to authenticate project-scoped operations.",
41
+ "Use it as `LANGWATCH_API_KEY` to authenticate project-scoped operations.",
42
42
  );
43
43
 
44
44
  return lines.join("\n");
@@ -1,8 +1,6 @@
1
- import { createPromptTag as apiCreatePromptTag } from "../langwatch-api.js";
1
+ import { createPromptTag as apiCreatePromptTag } from "../langwatch-api.ts";
2
2
 
3
- export async function handleCreatePromptTag(params: {
4
- name: string;
5
- }): Promise<string> {
3
+ export async function handleCreatePromptTag(params: { name: string }): Promise<string> {
6
4
  await apiCreatePromptTag(params.name);
7
5
 
8
6
  const lines: string[] = [];
@@ -1,13 +1,11 @@
1
- import { createPrompt as apiCreatePrompt } from "../langwatch-api.js";
1
+ import { createPrompt as apiCreatePrompt } from "../langwatch-api.ts";
2
2
 
3
3
  const HANDLE_PATTERN = /^[a-z0-9_-]+(?:\/[a-z0-9_-]+)?$/;
4
4
 
5
5
  /**
6
- * Converts a human-readable name into a URL-friendly handle.
7
- *
8
- * Lowercases the input, replaces non-alphanumeric runs with hyphens,
9
- * and strips leading/trailing hyphens. May return an empty string
10
- * for inputs with no alphanumeric characters — callers must validate.
6
+ * Converts a human-readable name into a URL-friendly handle: lowercased,
7
+ * non-alphanumeric runs replaced with hyphens, leading/trailing hyphens
8
+ * stripped. May return empty — callers must validate.
11
9
  */
12
10
  function toHandle(name: string): string {
13
11
  return name
@@ -16,23 +14,18 @@ function toHandle(name: string): string {
16
14
  .replace(/^-|-$/g, "");
17
15
  }
18
16
 
19
- /**
20
- * Handles the platform_create_prompt MCP tool invocation.
21
- *
22
- * Creates a new prompt in the LangWatch project and returns a
23
- * confirmation with the created prompt's details.
24
- */
17
+ /** Handles the platform_create_prompt MCP tool: creates a prompt and returns its details. */
25
18
  export async function handleCreatePrompt(params: {
26
19
  name: string;
27
20
  handle?: string;
28
- messages: Array<{ role: string; content: string }>;
21
+ messages: { role: string; content: string }[];
29
22
  model: string;
30
23
  tags?: string[];
31
24
  }): Promise<string> {
32
25
  const handle = params.handle?.trim() || toHandle(params.name);
33
26
  if (!handle || !HANDLE_PATTERN.test(handle)) {
34
27
  throw new Error(
35
- `Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly.`
28
+ `Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly.`,
36
29
  );
37
30
  }
38
31
 
@@ -49,10 +42,8 @@ export async function handleCreatePrompt(params: {
49
42
  if (result.handle) lines.push(`**Handle**: ${result.handle}`);
50
43
  lines.push(`**Name**: ${result.name || params.name}`);
51
44
  lines.push(`**Model**: ${params.model}`);
52
- if (result.latestVersionNumber != null)
53
- lines.push(`**Version**: v${result.latestVersionNumber}`);
54
- if (params.tags && params.tags.length > 0)
55
- lines.push(`**Tags**: ${params.tags.join(", ")}`);
45
+ if (result.latestVersionNumber != null) lines.push(`**Version**: v${result.latestVersionNumber}`);
46
+ if (params.tags && params.tags.length > 0) lines.push(`**Tags**: ${params.tags.join(", ")}`);
56
47
 
57
48
  return lines.join("\n");
58
49
  }
@@ -1,16 +1,18 @@
1
- import { createScenario as apiCreateScenario } from "../langwatch-api-scenarios.js";
1
+ import { createScenario as apiCreateScenario } from "../langwatch-api-scenarios.ts";
2
+ import type { ScenarioFieldValues } from "../schemas/suite-fields.ts";
3
+ import { formatScenarioFields } from "./format-scenario.ts";
2
4
 
3
5
  /**
4
- * Handles the platform_create_scenario MCP tool invocation.
5
- *
6
- * Creates a new scenario in the LangWatch project and returns a
7
- * confirmation with the created scenario's details.
6
+ * Handles the platform_create_scenario MCP tool: creates a scenario and
7
+ * returns a confirmation with its details.
8
8
  */
9
9
  export async function handleCreateScenario(params: {
10
10
  name: string;
11
11
  situation: string;
12
12
  criteria?: string[];
13
13
  labels?: string[];
14
+ testSuiteId?: string | null;
15
+ fields?: ScenarioFieldValues;
14
16
  }): Promise<string> {
15
17
  const result = await apiCreateScenario(params);
16
18
 
@@ -25,6 +27,10 @@ export async function handleCreateScenario(params: {
25
27
  if (Array.isArray(result.labels) && result.labels.length > 0) {
26
28
  lines.push(`**Labels**: ${result.labels.join(", ")}`);
27
29
  }
30
+ if (result.testSuiteId) {
31
+ lines.push(`**Test suite**: ${result.testSuiteId}`);
32
+ }
33
+ lines.push(...formatScenarioFields(result.fields));
28
34
 
29
35
  return lines.join("\n");
30
36
  }
@@ -0,0 +1,38 @@
1
+ import { createTestSuite as apiCreateTestSuite } from "../langwatch-api-test-suites.ts";
2
+ import {
3
+ type EvaluatorAttachmentInput,
4
+ type SuiteField,
5
+ toWireAttachments,
6
+ } from "../schemas/suite-fields.ts";
7
+ import { formatEvaluatorAttachments, formatSuiteFields } from "./format-suite-details.ts";
8
+
9
+ /**
10
+ * Handles the platform_create_test_suite MCP tool invocation.
11
+ */
12
+ export async function handleCreateTestSuite(params: {
13
+ name: string;
14
+ fields?: SuiteField[];
15
+ evaluators?: EvaluatorAttachmentInput[];
16
+ }): Promise<string> {
17
+ const suite = await apiCreateTestSuite({
18
+ name: params.name,
19
+ ...(params.fields !== undefined ? { fields: params.fields } : {}),
20
+ ...(params.evaluators !== undefined
21
+ ? { evaluators: toWireAttachments(params.evaluators) }
22
+ : {}),
23
+ });
24
+
25
+ return [
26
+ `Test suite "${suite.name}" created.`,
27
+ "",
28
+ `**ID**: ${suite.id}`,
29
+ `**Slug**: ${suite.slug}`,
30
+ `**View**: ${suite.platformUrl}`,
31
+ ...formatSuiteFields(suite.fields),
32
+ ...formatEvaluatorAttachments(suite.evaluators),
33
+ "",
34
+ `> File scenarios in it with \`platform_create_scenario\` or \`platform_update_scenario\`, passing testSuiteId \`${suite.id}\`${
35
+ suite.fields && suite.fields.length > 0 ? ` and a value per field under \`fields\`` : ""
36
+ }.`,
37
+ ].join("\n");
38
+ }
@@ -0,0 +1,55 @@
1
+ import {
2
+ createTrigger as apiCreateTrigger,
3
+ type CreateTriggerInput,
4
+ } from "../langwatch-api-triggers.ts";
5
+ import { validateActionParamsForAction } from "../schemas/triggers.ts";
6
+
7
+ /** An MCP tool result; `isError` tells the client the call was refused. */
8
+ export type TriggerToolResult = {
9
+ content: { type: "text"; text: string }[];
10
+ isError?: boolean;
11
+ };
12
+
13
+ /** A refusal the client must read as a failed call, not a success. */
14
+ export function toolError(message: string): TriggerToolResult {
15
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
16
+ }
17
+
18
+ /**
19
+ * Handles the platform_create_trigger MCP tool invocation. `actionParams` is
20
+ * optional, as it was before it was stated per channel: omitted sends `{}` and
21
+ * the server decides; stated, it is checked against the channel first.
22
+ */
23
+ export async function handleCreateTrigger(
24
+ params: Omit<CreateTriggerInput, "filters"> & { filters?: string },
25
+ ): Promise<TriggerToolResult> {
26
+ if (params.actionParams !== undefined) {
27
+ const verdict = validateActionParamsForAction({
28
+ action: params.action,
29
+ actionParams: params.actionParams,
30
+ });
31
+ if (!verdict.ok) return toolError(verdict.message);
32
+ }
33
+ let filters: Record<string, unknown> | undefined;
34
+ if (params.filters) {
35
+ const parsed = parseJsonObject(params.filters);
36
+ if (!parsed) return toolError("filters must be a JSON object");
37
+ filters = parsed;
38
+ }
39
+ const trigger = await apiCreateTrigger({ ...params, filters });
40
+ const text = `Trigger "${trigger.name}" created (ID: ${trigger.id}, Kind: ${trigger.kind ?? "AUTOMATION"}, Action: ${trigger.action}).`;
41
+ return { content: [{ type: "text", text }] };
42
+ }
43
+
44
+ /** A flag value that must be a JSON object; undefined for anything else. */
45
+ export function parseJsonObject(raw: string): Record<string, unknown> | undefined {
46
+ try {
47
+ const parsed: unknown = JSON.parse(raw);
48
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
49
+ return undefined;
50
+ }
51
+ return Object.fromEntries(Object.entries(parsed));
52
+ } catch {
53
+ return undefined;
54
+ }
55
+ }
@@ -0,0 +1,25 @@
1
+ import { getBoard } from "../langwatch-api-boards.js";
2
+ import { LangWatchApiError } from "../langwatch-api.js";
3
+
4
+ /**
5
+ * Refuses a dashboard id that names no Dashboards board in this project, naming the id, so an
6
+ * agent's typo, or the id of an Analytics Reports board, fails before any widget is written.
7
+ */
8
+ export async function assertDashboardExists({
9
+ projectId,
10
+ dashboardId,
11
+ }: {
12
+ projectId: string;
13
+ dashboardId: string;
14
+ }): Promise<void> {
15
+ try {
16
+ await getBoard({ projectId, boardId: dashboardId });
17
+ } catch (error) {
18
+ if (error instanceof LangWatchApiError && error.status === 404) {
19
+ throw new Error(
20
+ `No dashboard with ID "${dashboardId}" was found in this project. Use list_dashboard_boards to find a valid dashboard ID.`,
21
+ );
22
+ }
23
+ throw error;
24
+ }
25
+ }
@@ -0,0 +1,32 @@
1
+ import type { DashboardWidgetQueryInput } from "../langwatch-api-dashboard-widgets.js";
2
+
3
+ /** A widget file rarely needs more than a couple of named queries (server bound). */
4
+ export const MAX_DASHBOARD_WIDGET_QUERIES = 8;
5
+
6
+ /** The `{ name: sql }` shorthand or the array form the REST endpoint takes. */
7
+ export type DashboardWidgetQueriesInput = DashboardWidgetQueryInput[] | Record<string, string>;
8
+
9
+ /**
10
+ * Turns the `{ name: sql }` shorthand into the array shape the REST endpoint validates,
11
+ * refusing an empty or oversized set before any request is made.
12
+ */
13
+ export function normalizeDashboardWidgetQueries({
14
+ queries,
15
+ }: {
16
+ queries: DashboardWidgetQueriesInput;
17
+ }): DashboardWidgetQueryInput[] {
18
+ const normalized = Array.isArray(queries)
19
+ ? queries
20
+ : Object.entries(queries).map(([name, sql]) => ({ name, sql }));
21
+ if (normalized.length === 0) {
22
+ throw new Error(
23
+ "Provide at least one named LWQL query in `queries`. Validate each query's SQL first with run_query.",
24
+ );
25
+ }
26
+ if (normalized.length > MAX_DASHBOARD_WIDGET_QUERIES) {
27
+ throw new Error(
28
+ `A widget may declare at most ${MAX_DASHBOARD_WIDGET_QUERIES} queries, got ${normalized.length}.`,
29
+ );
30
+ }
31
+ return normalized;
32
+ }
@@ -1,4 +1,4 @@
1
- import { deleteAgent as apiDeleteAgent } from "../langwatch-api-agents.js";
1
+ import { deleteAgent as apiDeleteAgent } from "../langwatch-api-agents.ts";
2
2
 
3
3
  export async function handleDeleteAgent(params: { id: string }): Promise<string> {
4
4
  const result = await apiDeleteAgent(params.id);
@@ -1,4 +1,4 @@
1
- import { deleteAnnotation as apiDeleteAnnotation } from "../langwatch-api-annotations.js";
1
+ import { deleteAnnotation as apiDeleteAnnotation } from "../langwatch-api-annotations.ts";
2
2
 
3
3
  export async function handleDeleteAnnotation(params: { id: string }): Promise<string> {
4
4
  await apiDeleteAnnotation(params.id);
@@ -1,4 +1,4 @@
1
- import { deleteDashboard as apiDeleteDashboard } from "../langwatch-api-dashboards.js";
1
+ import { deleteDashboard as apiDeleteDashboard } from "../langwatch-api-dashboards.ts";
2
2
 
3
3
  export async function handleDeleteDashboard(params: { id: string }): Promise<string> {
4
4
  const result = await apiDeleteDashboard(params.id);
@@ -1,10 +1,8 @@
1
- import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.js";
1
+ import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_delete_dataset_records MCP tool invocation.
5
- *
6
- * Deletes records from a dataset by IDs and returns confirmation
7
- * with the count of records deleted.
4
+ * Handles the platform_delete_dataset_records MCP tool: deletes records
5
+ * by ID and returns a confirmation with the count deleted.
8
6
  */
9
7
  export async function handleDeleteDatasetRecords(params: {
10
8
  slugOrId: string;
@@ -14,9 +12,7 @@ export async function handleDeleteDatasetRecords(params: {
14
12
 
15
13
  const lines: string[] = [];
16
14
  lines.push(`${result.deletedCount} record(s) deleted successfully!\n`);
17
- lines.push(
18
- "> Use `platform_get_dataset` to see the updated dataset.",
19
- );
15
+ lines.push("> Use `platform_get_dataset` to see the updated dataset.");
20
16
 
21
17
  return lines.join("\n");
22
18
  }
@@ -1,20 +1,16 @@
1
- import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.js";
1
+ import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_delete_dataset MCP tool invocation.
5
5
  *
6
6
  * Archives (soft-deletes) a dataset and returns confirmation.
7
7
  */
8
- export async function handleDeleteDataset(params: {
9
- slugOrId: string;
10
- }): Promise<string> {
8
+ export async function handleDeleteDataset(params: { slugOrId: string }): Promise<string> {
11
9
  await apiDeleteDataset(params.slugOrId);
12
10
 
13
11
  const lines: string[] = [];
14
12
  lines.push("Dataset deleted successfully!\n");
15
- lines.push(
16
- "> The dataset has been archived and will no longer appear in listings.",
17
- );
13
+ lines.push("> The dataset has been archived and will no longer appear in listings.");
18
14
 
19
15
  return lines.join("\n");
20
16
  }
@@ -1,12 +1,10 @@
1
- import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.js";
1
+ import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_delete_evaluator MCP tool invocation.
5
5
  */
6
- export async function handleDeleteEvaluator(params: {
7
- idOrSlug: string;
8
- }): Promise<string> {
9
- const result = await apiDeleteEvaluator(params.idOrSlug);
6
+ export async function handleDeleteEvaluator(params: { idOrSlug: string }): Promise<string> {
7
+ await apiDeleteEvaluator(params.idOrSlug);
10
8
 
11
- return `Evaluator ${result.id} has been archived (soft-deleted).`;
9
+ return `Evaluator ${params.idOrSlug} has been archived (soft-deleted).`;
12
10
  }
@@ -1,8 +1,6 @@
1
- import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.js";
1
+ import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.ts";
2
2
 
3
- export async function handleDeletePromptTag(params: {
4
- tag: string;
5
- }): Promise<string> {
3
+ export async function handleDeletePromptTag(params: { tag: string }): Promise<string> {
6
4
  await apiDeletePromptTag(params.tag);
7
5
 
8
6
  const lines: string[] = [];
@@ -1,4 +1,4 @@
1
- import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.js";
1
+ import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.ts";
2
2
 
3
3
  export async function handleDeleteWorkflow(params: { id: string }): Promise<string> {
4
4
  const result = await apiDeleteWorkflow(params.id);
@@ -1,12 +1,12 @@
1
- import { AVAILABLE_EVALUATORS } from "../../../../services/langevals/ts-integration/evaluators.generated.js";
2
- import type { EvaluatorDefinition, EvaluatorTypes } from "../../../../services/langevals/ts-integration/evaluators.generated.js";
1
+ import {
2
+ AVAILABLE_EVALUATORS,
3
+ type EvaluatorDefinition,
4
+ type EvaluatorTypes,
5
+ } from "@langwatch/evaluator-contract";
3
6
 
4
7
  /**
5
- * Formats evaluator schema information for the discover_schema tool.
6
- *
7
- * Two levels of detail:
8
- * - Overview (no evaluatorType): compact list of all evaluator types
9
- * - Detail (with evaluatorType): full schema for one evaluator type
8
+ * Formats evaluator schema for discover_schema: an overview (all types,
9
+ * compact) when no evaluatorType is given, else the full schema for one.
10
10
  */
11
11
  export function formatEvaluatorSchema(evaluatorType?: string): string {
12
12
  if (evaluatorType) {
@@ -50,9 +50,22 @@ function formatEvaluatorOverview(): string {
50
50
  return lines.join("\n");
51
51
  }
52
52
 
53
+ function settingsSection(settingsEntries: [string, unknown][]): string[] {
54
+ if (settingsEntries.length === 0) return [];
55
+ const lines = ["\n## Settings\n"];
56
+ for (const [key, setting] of settingsEntries) {
57
+ const s = setting as { description?: string; default: unknown };
58
+ const defaultStr = JSON.stringify(s.default);
59
+ const desc = s.description ? ` - ${s.description}` : "";
60
+ lines.push(`- **${key}**${desc}`);
61
+ lines.push(` Default: \`${defaultStr}\``);
62
+ }
63
+ return lines;
64
+ }
65
+
53
66
  /**
54
- * Returns the full schema for a specific evaluator type.
55
- * Includes settings with descriptions and defaults, required/optional fields, env vars, and result fields.
67
+ * Returns the full schema for a specific evaluator type: settings, required/optional
68
+ * fields, env vars, and result fields.
56
69
  */
57
70
  function formatEvaluatorDetail(evaluatorType: string): string {
58
71
  const def = AVAILABLE_EVALUATORS[evaluatorType as EvaluatorTypes] as
@@ -85,18 +98,8 @@ function formatEvaluatorDetail(evaluatorType: string): string {
85
98
  lines.push(`**Optional**: ${def.optionalFields.join(", ")}`);
86
99
  }
87
100
 
88
- // Settings
89
101
  const settingsEntries = Object.entries(def.settings);
90
- if (settingsEntries.length > 0) {
91
- lines.push("\n## Settings\n");
92
- for (const [key, setting] of settingsEntries) {
93
- const s = setting as { description?: string; default: unknown };
94
- const defaultStr = JSON.stringify(s.default);
95
- const desc = s.description ? ` - ${s.description}` : "";
96
- lines.push(`- **${key}**${desc}`);
97
- lines.push(` Default: \`${defaultStr}\``);
98
- }
99
- }
102
+ lines.push(...settingsSection(settingsEntries));
100
103
 
101
104
  // Env vars
102
105
  if (def.envVars.length > 0) {
@@ -118,12 +121,18 @@ function formatEvaluatorDetail(evaluatorType: string): string {
118
121
 
119
122
  lines.push("\n## Usage Example\n");
120
123
  lines.push("```json");
121
- lines.push(JSON.stringify({
122
- evaluatorType: evaluatorType,
123
- settings: Object.fromEntries(
124
- settingsEntries.map(([key, setting]) => [key, (setting as { default: unknown }).default]),
124
+ lines.push(
125
+ JSON.stringify(
126
+ {
127
+ evaluatorType: evaluatorType,
128
+ settings: Object.fromEntries(
129
+ settingsEntries.map(([key, setting]) => [key, (setting as { default: unknown }).default]),
130
+ ),
131
+ },
132
+ null,
133
+ 2,
125
134
  ),
126
- }, null, 2));
135
+ );
127
136
  lines.push("```");
128
137
 
129
138
  return lines.join("\n");