@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
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Handles the `run_query` MCP tool: one LangWatchQL statement rendered as a markdown table. Rows
3
+ * are capped, and the cap is announced, so an unaggregated query cannot flood the conversation.
4
+ * @see specs/mcp-server/schema-discovery.feature
5
+ */
6
+
7
+ import { runQuery } from "../langwatch-api-query.ts";
8
+ import { markdownTable } from "../utils/markdown-table.ts";
9
+
10
+ /** Rows the table prints. Beyond this, aggregate or export through the CLI. */
11
+ export const RUN_QUERY_ROW_CAP = 50;
12
+
13
+ export async function handleRunQuery(params: {
14
+ sql: string;
15
+ parameters?: Record<string, string | number | boolean | null>;
16
+ }): Promise<string> {
17
+ const result = await runQuery(params);
18
+ const headers = result.columns.map((column) => column.name);
19
+ const shown = result.rows.slice(0, RUN_QUERY_ROW_CAP);
20
+
21
+ const lines: string[] = [];
22
+ lines.push(
23
+ markdownTable({
24
+ headers,
25
+ rows: shown,
26
+ emptyMessage: "The statement ran and returned no rows.",
27
+ }),
28
+ );
29
+ lines.push("");
30
+ lines.push(
31
+ `Returned ${result.rows.length} row${result.rows.length === 1 ? "" : "s"} in ${result.statistics.elapsedMs}ms.`,
32
+ );
33
+ if (result.rows.length > shown.length) {
34
+ lines.push(
35
+ `Showing the first ${shown.length}. Aggregate further, or export every row with \`langwatch query "<statement>" --format jsonl\`.`,
36
+ );
37
+ }
38
+ if (result.truncated) {
39
+ lines.push(
40
+ "The result hit a response ceiling and was cut short, so this is not the whole answer.",
41
+ );
42
+ }
43
+ for (const diagnostic of result.diagnostics) {
44
+ lines.push(`${diagnostic.code}: ${diagnostic.message}`);
45
+ }
46
+ return lines.join("\n");
47
+ }
@@ -0,0 +1,27 @@
1
+ import type { RunParameters, RunPlanTarget } from "../langwatch-api-run-plans.ts";
2
+ import { runTestSuite as apiRunTestSuite } from "../langwatch-api-test-suites.ts";
3
+ import { toWireTargets } from "../schemas/run-plan.ts";
4
+ import { formatRunPlanRun } from "./format-run-plan.ts";
5
+
6
+ /**
7
+ * Handles the platform_run_test_suite MCP tool invocation.
8
+ */
9
+ export async function handleRunTestSuite(params: {
10
+ id: string;
11
+ targets: RunPlanTarget[];
12
+ name?: string;
13
+ repeatCount?: number;
14
+ simulatorModel?: string;
15
+ judgeModel?: string;
16
+ parameters?: RunParameters;
17
+ note?: string;
18
+ idempotencyKey?: string;
19
+ }): Promise<string> {
20
+ const { targets, ...rest } = params;
21
+ const result = await apiRunTestSuite({
22
+ ...rest,
23
+ targets: toWireTargets(targets),
24
+ });
25
+
26
+ return formatRunPlanRun(result);
27
+ }
@@ -1,12 +1,9 @@
1
- import { runWorkflow as apiRunWorkflow } from "../langwatch-api-workflows.js";
1
+ import { runWorkflow as apiRunWorkflow } from "../langwatch-api-workflows.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_run_workflow MCP tool invocation.
5
5
  */
6
- export async function handleRunWorkflow(params: {
7
- id: string;
8
- input?: string;
9
- }): Promise<string> {
6
+ export async function handleRunWorkflow(params: { id: string; input?: string }): Promise<string> {
10
7
  let parsedInput: Record<string, unknown> = {};
11
8
  if (params.input) {
12
9
  try {
@@ -1,17 +1,142 @@
1
- import { searchTraces as apiSearchTraces } from "../langwatch-api.js";
2
- import { parseRelativeDate } from "../utils/date-parsing.js";
3
- import { formatEvaluationLines } from "../utils/format-evaluations.js";
1
+ import { searchTraces as apiSearchTraces, type TraceSearchResult } from "../langwatch-api.ts";
2
+ import { parseRelativeDate } from "../utils/date-parsing.ts";
3
+ import { formatEvaluationLines } from "../utils/format-evaluations.ts";
4
+ import { looksLikeTraceId } from "../utils/trace-id-shape.ts";
5
+
6
+ const HOUR_MS = 3600000;
7
+ const DAY_MS = 86400000;
8
+
9
+ /** Default window for a text search. */
10
+ const TEXT_SEARCH_WINDOW_MS = DAY_MS;
11
+
12
+ /**
13
+ * Default window when trace ids are named: an exact-match intent must not be
14
+ * answered against yesterday alone. Mirrors the platform's 90-day id lookup
15
+ * bound (ADR-164).
16
+ */
17
+ const ID_LOOKUP_WINDOW_MS = 90 * DAY_MS;
18
+
19
+ function previewLine({
20
+ label,
21
+ text,
22
+ }: {
23
+ label: string;
24
+ text: { value: string } | undefined;
25
+ }): string {
26
+ const value = text?.value ? String(text.value) : "N/A";
27
+ return `- **${label}**: ${value.slice(0, 100)}${value.length > 100 ? "..." : ""}`;
28
+ }
29
+
30
+ function traceLines(trace: TraceSearchResult): string[] {
31
+ const lines = [`### Trace: ${trace.trace_id}`];
32
+
33
+ if (trace.formatted_trace) {
34
+ lines.push(trace.formatted_trace);
35
+ } else {
36
+ lines.push(previewLine({ label: "Input", text: trace.input }));
37
+ lines.push(previewLine({ label: "Output", text: trace.output }));
38
+ }
39
+
40
+ if (trace.timestamps) {
41
+ lines.push(`- **Time**: ${trace.timestamps.started_at || "N/A"}`);
42
+ }
43
+ if (trace.error) {
44
+ lines.push(`- **Error**: ${JSON.stringify(trace.error)}`);
45
+ }
46
+ if (trace.evaluations && trace.evaluations.length > 0) {
47
+ lines.push(...formatEvaluationLines(trace.evaluations));
48
+ }
49
+ lines.push("");
50
+ return lines;
51
+ }
52
+
53
+ function describeSpan({ ms }: { ms: number }): string {
54
+ if (ms % DAY_MS === 0) {
55
+ const days = ms / DAY_MS;
56
+ return days === 1 ? "24 hours" : `${days} days`;
57
+ }
58
+ const hours = Math.round(ms / HOUR_MS);
59
+ return hours === 1 ? "1 hour" : `${hours} hours`;
60
+ }
61
+
62
+ /** The next sensible window to offer, or undefined once the span is already wide. */
63
+ function suggestWiderWindow({ spanMs }: { spanMs: number }): string | undefined {
64
+ if (spanMs < 7 * DAY_MS) return "7d";
65
+ if (spanMs < 30 * DAY_MS) return "30d";
66
+ if (spanMs < 90 * DAY_MS) return "90d";
67
+ return undefined;
68
+ }
69
+
70
+ /** An empty result states the searched window and names the tool that looks an id up. */
71
+ function buildEmptyResult({
72
+ query,
73
+ traceIds,
74
+ spanMs,
75
+ windowWasDefaulted,
76
+ startDate,
77
+ endDate,
78
+ }: {
79
+ query?: string;
80
+ traceIds?: string[];
81
+ spanMs: number;
82
+ windowWasDefaulted: boolean;
83
+ startDate: number;
84
+ endDate: number;
85
+ }): string {
86
+ const hasTraceIds = (traceIds?.length ?? 0) > 0;
87
+ const lines = [
88
+ hasTraceIds
89
+ ? "No traces matched the requested trace ids in the searched window."
90
+ : "No traces found matching your query.",
91
+ "",
92
+ ];
93
+
94
+ const range = `${new Date(startDate).toISOString()} to ${new Date(endDate).toISOString()}`;
95
+ lines.push(
96
+ windowWasDefaulted
97
+ ? `Searched the last ${describeSpan({ ms: spanMs })} (the default): ${range}.`
98
+ : `Searched ${range}.`,
99
+ );
100
+ lines.push("", "Tips:");
101
+
102
+ if (query && looksLikeTraceId(query)) {
103
+ lines.push(
104
+ `- "${query}" looks like a trace id. Free text never matches trace ids — use \`get_trace\` with traceId: "${query}".`,
105
+ );
106
+ }
107
+
108
+ const wider = suggestWiderWindow({ spanMs });
109
+ if (wider) {
110
+ lines.push(
111
+ `- Widen the window with startDate, e.g. startDate: "${wider}". Accepts h (hours), d (days), w (weeks), m (30-day months), or an ISO date.`,
112
+ );
113
+ }
114
+
115
+ if (hasTraceIds) {
116
+ lines.push(
117
+ "- Retry with an earlier startDate, or relax the query and filters if you supplied them.",
118
+ "- Looking up one full id? `get_trace` has no time window. A unique 8–31 character hex prefix searches the last 90 days.",
119
+ );
120
+ } else {
121
+ lines.push(
122
+ "- Looking up a known trace id? `get_trace` takes a traceId. A full id has no time window; a unique 8–31 character hex prefix searches the last 90 days.",
123
+ "- To fetch several known trace ids at once, pass `traceIds` instead of `query`.",
124
+ );
125
+ }
126
+
127
+ return lines.join("\n");
128
+ }
4
129
 
5
130
  /**
6
- * Handles the search_traces MCP tool invocation.
7
- *
8
- * Searches LangWatch traces with optional filters, text query, and date range.
9
- * In digest mode (default), returns AI-readable formatted digests per trace.
10
- * In json mode, returns the full raw JSON.
131
+ * Handles the search_traces MCP tool: searches with optional filters, text
132
+ * query, trace ids and date range. Digest mode (default) returns AI-readable
133
+ * digests per trace; json mode returns the full raw JSON.
11
134
  */
12
135
  export async function handleSearchTraces(params: {
13
136
  query?: string;
137
+ traceIds?: string[];
14
138
  filters?: Record<string, string[]>;
139
+ filter?: string;
15
140
  startDate?: string;
16
141
  endDate?: string;
17
142
  pageSize?: number;
@@ -19,15 +144,27 @@ export async function handleSearchTraces(params: {
19
144
  format?: "digest" | "json";
20
145
  }): Promise<string> {
21
146
  const now = Date.now();
22
- const startDate = params.startDate
23
- ? parseRelativeDate(params.startDate)
24
- : now - 86400000;
25
- const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;
147
+ const hasTraceIds = (params.traceIds?.length ?? 0) > 0;
148
+ const defaultSpanMs = hasTraceIds ? ID_LOOKUP_WINDOW_MS : TEXT_SEARCH_WINDOW_MS;
149
+
150
+ const endDate = params.endDate !== undefined ? parseRelativeDate(params.endDate) : now;
151
+ const startDate =
152
+ params.startDate !== undefined ? parseRelativeDate(params.startDate) : endDate - defaultSpanMs;
153
+
154
+ if (startDate >= endDate) {
155
+ throw new Error(
156
+ `Invalid trace search window: startDate (${new Date(startDate).toISOString()}) must be before endDate (${new Date(endDate).toISOString()}).`,
157
+ );
158
+ }
26
159
  const format = params.format ?? "digest";
27
160
 
28
161
  const result = await apiSearchTraces({
29
162
  query: params.query,
163
+ traceIds: params.traceIds,
30
164
  filters: params.filters,
165
+ // Forwarded as itself: the filter language and the free-text query are two
166
+ // different searches, and the server combines them.
167
+ ...(params.filter ? { filter: params.filter } : {}),
31
168
  startDate,
32
169
  endDate,
33
170
  pageSize: params.pageSize ?? 25,
@@ -37,7 +174,14 @@ export async function handleSearchTraces(params: {
37
174
 
38
175
  const traces = result.traces ?? [];
39
176
  if (traces.length === 0) {
40
- return "No traces found matching your query.";
177
+ return buildEmptyResult({
178
+ query: params.query,
179
+ traceIds: params.traceIds,
180
+ spanMs: endDate - startDate,
181
+ windowWasDefaulted: params.startDate === undefined,
182
+ startDate,
183
+ endDate,
184
+ });
41
185
  }
42
186
 
43
187
  if (format === "json") {
@@ -45,50 +189,20 @@ export async function handleSearchTraces(params: {
45
189
  }
46
190
 
47
191
  const lines: string[] = [];
48
- lines.push(
49
- `Found ${result.pagination?.totalHits ?? traces.length} traces:\n`
50
- );
192
+ lines.push(`Found ${result.pagination?.totalHits ?? traces.length} traces:\n`);
51
193
 
52
194
  for (const trace of traces) {
53
- lines.push(`### Trace: ${trace.trace_id}`);
54
-
55
- if (trace.formatted_trace) {
56
- lines.push(trace.formatted_trace);
57
- } else {
58
- const inputStr = trace.input?.value
59
- ? String(trace.input.value)
60
- : "N/A";
61
- const outputStr = trace.output?.value
62
- ? String(trace.output.value)
63
- : "N/A";
64
- lines.push(
65
- `- **Input**: ${inputStr.slice(0, 100)}${inputStr.length > 100 ? "..." : ""}`
66
- );
67
- lines.push(
68
- `- **Output**: ${outputStr.slice(0, 100)}${outputStr.length > 100 ? "..." : ""}`
69
- );
70
- }
71
-
72
- if (trace.timestamps) {
73
- lines.push(`- **Time**: ${trace.timestamps.started_at || "N/A"}`);
74
- }
75
- if (trace.error) {
76
- lines.push(`- **Error**: ${JSON.stringify(trace.error)}`);
77
- }
78
- if (trace.evaluations && trace.evaluations.length > 0) {
79
- lines.push(...formatEvaluationLines(trace.evaluations));
80
- }
81
- lines.push("");
195
+ lines.push(...traceLines(trace));
82
196
  }
83
197
 
84
198
  if (result.pagination?.scrollId) {
85
199
  lines.push(
86
- `\n**More results available.** Use scrollId: "${result.pagination.scrollId}" to get next page.`
200
+ `\n**More results available.** Use scrollId: "${result.pagination.scrollId}" to get next page.`,
87
201
  );
88
202
  }
89
203
 
90
204
  lines.push(
91
- '\n> Tip: Use `get_trace` with a trace_id for full details. Use `search_traces` with `format: "json"` for raw data. Use `discover_schema` to see available filter fields.'
205
+ '\n> Tip: Use `get_trace` with a traceId for full details. Use `search_traces` with `format: "json"` for raw data. Use `discover_schema` to see available filter fields.',
92
206
  );
93
207
 
94
208
  return lines.join("\n");
@@ -1,10 +1,8 @@
1
- import { setModelProvider as apiSetModelProvider } from "../langwatch-api-model-providers.js";
1
+ import { setModelProvider as apiSetModelProvider } from "../langwatch-api-model-providers.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_set_model_provider MCP tool invocation.
5
- *
6
- * Creates or updates a model provider configuration, including API keys.
7
- * Returns confirmation with the updated provider status.
4
+ * Handles the platform_set_model_provider MCP tool: creates or updates
5
+ * a provider config (including API keys) and returns its status.
8
6
  */
9
7
  export async function handleSetModelProvider(params: {
10
8
  provider: string;
@@ -18,7 +16,7 @@ export async function handleSetModelProvider(params: {
18
16
 
19
17
  if (!updated) {
20
18
  throw new Error(
21
- `Model provider "${params.provider}" was not found in the response. The provider name may be invalid.`
19
+ `Model provider "${params.provider}" was not found in the response. The provider name may be invalid.`,
22
20
  );
23
21
  }
24
22
 
@@ -0,0 +1,18 @@
1
+ import { testAgent as apiTestAgent } from "../langwatch-api-agents.ts";
2
+
3
+ /**
4
+ * Handles the platform_test_agent MCP tool invocation.
5
+ *
6
+ * @see specs/agents/agent-test-run.feature
7
+ */
8
+ export async function handleTestAgent(params: { id: string }): Promise<string> {
9
+ const run = await apiTestAgent(params.id);
10
+ return [
11
+ 'Test run scheduled. The user sends "ping"; the run succeeds when the agent answers.',
12
+ "",
13
+ `**Scenario run ID:** ${run.scenarioRunId}`,
14
+ `**Batch run ID:** ${run.batchRunId}`,
15
+ "",
16
+ `Follow it with platform_get_simulation_run using scenarioRunId "${run.scenarioRunId}".`,
17
+ ].join("\n");
18
+ }
@@ -1,4 +1,4 @@
1
- import { updateAgent as apiUpdateAgent } from "../langwatch-api-agents.js";
1
+ import { updateAgent as apiUpdateAgent } from "../langwatch-api-agents.ts";
2
2
 
3
3
  export async function handleUpdateAgent(params: {
4
4
  id: string;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The `update_dashboard_widget` MCP tool over the widget PATCH: a field left out keeps its
3
+ * stored value. The widget must sit on the named dashboard, so an agent never edits one it
4
+ * found somewhere else by mistake. Spec: modules/dashboard/specs/dashboard-widget-mcp.feature
5
+ */
6
+
7
+ import {
8
+ type DashboardWidget,
9
+ getDashboardWidget,
10
+ updateDashboardWidget,
11
+ } from "../langwatch-api-dashboard-widgets.js";
12
+ import { getCurrentProject } from "../langwatch-api-projects.js";
13
+ import { LangWatchApiError } from "../langwatch-api.js";
14
+ import { assertDashboardExists } from "./dashboard-exists.js";
15
+ import {
16
+ type DashboardWidgetQueriesInput,
17
+ normalizeDashboardWidgetQueries,
18
+ } from "./dashboard-widget-queries.js";
19
+
20
+ export interface UpdateDashboardWidgetParams {
21
+ dashboardId: string;
22
+ widgetId: string;
23
+ name?: string;
24
+ code?: string;
25
+ queries?: DashboardWidgetQueriesInput;
26
+ description?: string;
27
+ }
28
+
29
+ export async function handleUpdateDashboardWidget(
30
+ params: UpdateDashboardWidgetParams,
31
+ ): Promise<string> {
32
+ const { dashboardId, widgetId, name, code, description } = params;
33
+ if (
34
+ name === undefined &&
35
+ code === undefined &&
36
+ params.queries === undefined &&
37
+ description === undefined
38
+ ) {
39
+ throw new Error("Provide at least one of name, code, queries or description to change.");
40
+ }
41
+ const queries =
42
+ params.queries === undefined
43
+ ? undefined
44
+ : normalizeDashboardWidgetQueries({ queries: params.queries });
45
+
46
+ const project = await getCurrentProject();
47
+ await assertDashboardExists({ projectId: project.id, dashboardId });
48
+ const current = await getWidgetOnDashboard({ projectId: project.id, widgetId, dashboardId });
49
+
50
+ const widget = await updateDashboardWidget({
51
+ projectId: project.id,
52
+ widgetId: current.id,
53
+ ...(name === undefined ? {} : { name }),
54
+ ...(code === undefined ? {} : { code }),
55
+ ...(queries === undefined ? {} : { queries }),
56
+ ...(description === undefined ? {} : { description }),
57
+ });
58
+
59
+ return [
60
+ `Widget "${widget.name}" updated on dashboard "${dashboardId}".`,
61
+ `**Widget ID**: ${widget.id}`,
62
+ `**Queries**: ${widget.definition.queries.map((query) => query.name).join(", ") || "(none)"}`,
63
+ "",
64
+ "```json",
65
+ JSON.stringify(widget, null, 2),
66
+ "```",
67
+ ].join("\n");
68
+ }
69
+
70
+ /** The widget, refused by id when it is not in this project or not on this dashboard. */
71
+ async function getWidgetOnDashboard({
72
+ projectId,
73
+ widgetId,
74
+ dashboardId,
75
+ }: {
76
+ projectId: string;
77
+ widgetId: string;
78
+ dashboardId: string;
79
+ }): Promise<DashboardWidget> {
80
+ let widget: DashboardWidget;
81
+ try {
82
+ widget = await getDashboardWidget({ projectId, widgetId });
83
+ } catch (error) {
84
+ if (error instanceof LangWatchApiError && error.status === 404) {
85
+ throw new Error(
86
+ `No widget with ID "${widgetId}" was found in this project. Use the widget ID add_dashboard_widget returned.`,
87
+ );
88
+ }
89
+ throw error;
90
+ }
91
+ if (widget.dashboardId !== dashboardId) {
92
+ throw new Error(
93
+ `Widget "${widgetId}" is not on dashboard "${dashboardId}". Pass the dashboard the widget was added to.`,
94
+ );
95
+ }
96
+ return widget;
97
+ }
@@ -1,4 +1,4 @@
1
- import { updateDatasetRecord as apiUpdateDatasetRecord } from "../langwatch-api-datasets.js";
1
+ import { updateDatasetRecord as apiUpdateDatasetRecord } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_update_dataset_record MCP tool invocation.
@@ -1,12 +1,10 @@
1
- import { updateDataset as apiUpdateDataset } from "../langwatch-api-datasets.js";
2
- import type { DatasetColumnType } from "../langwatch-api-datasets.js";
3
- import { formatDatasetMutationDetails } from "./format-dataset-mutation.js";
1
+ import { updateDataset as apiUpdateDataset } 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_update_dataset MCP tool invocation.
7
- *
8
- * Updates an existing dataset and returns a confirmation
9
- * with the updated details.
6
+ * Handles the platform_update_dataset MCP tool: updates a dataset and
7
+ * returns a confirmation with the updated details.
10
8
  */
11
9
  export async function handleUpdateDataset(params: {
12
10
  slugOrId: string;
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  updateEvaluator as apiUpdateEvaluator,
3
3
  getEvaluatorType,
4
- } from "../langwatch-api-evaluators.js";
4
+ } from "../langwatch-api-evaluators.ts";
5
5
 
6
6
  /**
7
- * Handles the platform_update_evaluator MCP tool invocation.
8
- *
9
- * Updates an existing evaluator and returns a confirmation
10
- * with the updated details.
7
+ * Handles the platform_update_evaluator MCP tool: updates an evaluator
8
+ * and returns a confirmation with the updated details.
11
9
  */
12
10
  export async function handleUpdateEvaluator(params: {
13
11
  evaluatorId: string;
@@ -1,4 +1,4 @@
1
- import { updateProject as apiUpdateProject } from "../langwatch-api-projects.js";
1
+ import { updateProject as apiUpdateProject } from "../langwatch-api-projects.ts";
2
2
 
3
3
  export async function handleUpdateProject(params: {
4
4
  id: string;