@langwatch/mcp-server 2.1.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 (415) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +192 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  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-W3IKI7UL.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-65QN3XRX.js} +4 -4
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-V5UNYK26.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-O7FLDMXK.js → archive-test-suite-NKZDZY3D.js} +4 -4
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-OJLYYJWI.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-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-G4ZAZTZW.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-EYXMLE5X.js → chunk-HGELNIVY.js} +56 -47
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-RVAE2MEA.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-S4GVX36W.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-QRO35SOM.js → chunk-J7PQKBLD.js} +652 -528
  34. package/dist/{chunk-SR6QPRIE.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-UFOYFYI7.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  38. package/dist/{chunk-56OGTS24.js → chunk-PTDR56Z3.js} +4 -11
  39. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-JTQJRNFJ.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-QAMP3CGR.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/{chunk-6DJDEXET.js → chunk-VMWJD732.js} +6 -12
  47. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  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-JFJ2K6X3.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-EUXXQ6NS.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-BGBB76JX.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-Z76AIPLS.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-FD5VAXU4.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-WQUXXOHI.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-6NV33Z52.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 -10
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-ZQ7TFIO2.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-BS6QRCUU.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-FCQ5ELSQ.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-UEM77OE7.js} +5 -5
  77. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-4IPXVSFQ.js} +6 -6
  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-SA4JMUZF.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-LYMRPF27.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-7CNOTALB.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-QB3OCZUV.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-NG2VXYYM.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-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  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-7THF7HCU.js → get-agent-OTIYUFZA.js} +15 -11
  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-P4WWVHFU.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-RZ44UIN6.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-QSQEAB33.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-OWXJZHQQ.js} +53 -58
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-BE3M2AUX.js} +7 -9
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-YM4ODWW6.js} +5 -5
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-LCFSMPGQ.js} +26 -22
  123. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GC2O7YH6.js} +5 -5
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-RCUV7N4O.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-EEOC7Y45.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-WCDUARTH.js → http-server-IR4QOS43.js} +4071 -347
  131. package/dist/index.js +58671 -37983
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-2KJL2M42.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-6ISFJ7WX.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-6UJL5U4Z.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/{list-agents-AMVDQPQL.js → list-agents-HVYWEQMI.js} +4 -4
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-GVPNBIHQ.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-Z3BZKDGF.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-AQVI6SUK.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-PX2XI6EK.js} +5 -5
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-QZRPVHS4.js} +13 -11
  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-D6YF4ZOU.js → list-simulation-runs-OEADLLQR.js} +12 -8
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-N4WVLBKK.js} +4 -4
  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-6MV4XJHF.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-4J7UX5S2.js} +4 -4
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/{report-issue-RHZZ33IS.js → report-issue-DCZFLGDO.js} +81 -67
  188. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-TG2V4WM4.js} +5 -5
  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-6LAZ3QZZ.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-T4ZYOZGA.js → run-plan-PAARQSI4.js} +7 -7
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-SQJELEZX.js} +6 -6
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-DFIS23AP.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/run-workflow-SP32SO5M.js +36 -0
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-DUWNYBNA.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-YSOMDCOB.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-DEA2ITYR.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-NH7Q5GWV.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-Q26FBSYH.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-ZQQ2C3KU.js → update-prompt-MY263DYF.js} +27 -29
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-WUX34JAR.js → update-scenario-MOHRQKAQ.js} +5 -5
  222. package/package.json +35 -39
  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 +755 -609
  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 +18 -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 +12 -29
  244. package/src/langwatch-api-scenarios.ts +9 -11
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +6 -8
  247. package/src/langwatch-api-test-suites.ts +14 -33
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +108 -124
  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 +13 -29
  255. package/src/schemas/suite-fields.ts +6 -23
  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 +2 -4
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +2 -4
  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 +5 -7
  274. package/src/tools/create-test-suite.ts +4 -9
  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 +41 -21
  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 +7 -21
  292. package/src/tools/format-scenario.ts +2 -4
  293. package/src/tools/format-suite-details.ts +6 -12
  294. package/src/tools/get-agent.ts +15 -6
  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 +63 -84
  302. package/src/tools/get-run-plan.ts +4 -6
  303. package/src/tools/get-scenario.ts +4 -6
  304. package/src/tools/get-simulation-run.ts +27 -24
  305. package/src/tools/get-test-suite.ts +2 -5
  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 +1 -1
  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 +2 -2
  323. package/src/tools/list-scenarios.ts +14 -15
  324. package/src/tools/list-simulation-runs.ts +8 -4
  325. package/src/tools/list-test-suites.ts +1 -1
  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 +2 -5
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +2 -5
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +29 -26
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +4 -7
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +4 -7
  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 +2 -2
  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 +44 -59
  350. package/src/tools/update-scenario.ts +5 -7
  351. package/src/tools/update-test-suite.ts +6 -11
  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 +14 -12
  359. package/vitest.integration.config.js +10 -0
  360. package/vitest.scenario.config.js +9 -0
  361. package/.eslintrc.cjs +0 -36
  362. package/dist/chunk-AN4OUA4D.js +0 -86
  363. package/dist/chunk-GELJ2MQR.js +0 -226
  364. package/dist/chunk-K37ZNPXK.js +0 -24
  365. package/dist/config.d.ts +0 -17
  366. package/dist/create-mcp-server.d.ts +0 -10
  367. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  368. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  369. package/dist/get-analytics-R6AZD3AW.js +0 -73
  370. package/dist/get-dataset-AKTYSQDI.js +0 -49
  371. package/dist/index.d.ts +0 -2
  372. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  373. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  374. package/dist/run-agent-CAGWGTYT.js +0 -72
  375. package/dist/search-traces-4XTJYXIK.js +0 -79
  376. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  377. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  378. package/src/__tests__/config.unit.test.ts +0 -202
  379. package/src/__tests__/datasets.integration.test.ts +0 -620
  380. package/src/__tests__/datasets.unit.test.ts +0 -244
  381. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  382. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  383. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  384. package/src/__tests__/docker.integration.test.ts +0 -318
  385. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  386. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  387. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  388. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  389. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  390. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  391. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  392. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  393. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  394. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  395. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  396. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  397. package/src/__tests__/http-transport.integration.test.ts +0 -395
  398. package/src/__tests__/integration.integration.test.ts +0 -284
  399. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  400. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  401. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  402. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  403. package/src/__tests__/prompts.integration.test.ts +0 -736
  404. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  405. package/src/__tests__/report-issue.integration.test.ts +0 -147
  406. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  407. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  408. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  409. package/src/__tests__/schemas.unit.test.ts +0 -85
  410. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  411. package/src/__tests__/support/http-server-harness.ts +0 -138
  412. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  413. package/src/__tests__/tools.integration.test.ts +0 -896
  414. package/src/schemas/filter-fields.ts +0 -119
  415. package/src/schemas/index.ts +0 -9
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The `add_dashboard_widget` MCP tool: create, then place, as the platform's own write path
3
+ * does. The dashboard is checked first so a typo leaves no unplaced widget behind, and a
4
+ * failed placement deletes the widget it just created.
5
+ */
6
+
7
+ import {
8
+ assignDashboardWidgetToDashboard,
9
+ createDashboardWidget,
10
+ deleteDashboardWidget,
11
+ } from "../langwatch-api-dashboard-widgets.js";
12
+ import { getCurrentProject } from "../langwatch-api-projects.js";
13
+ import { assertDashboardExists } from "./dashboard-exists.js";
14
+ import {
15
+ type DashboardWidgetQueriesInput,
16
+ normalizeDashboardWidgetQueries,
17
+ } from "./dashboard-widget-queries.js";
18
+
19
+ export interface AddDashboardWidgetParams {
20
+ dashboardId: string;
21
+ name: string;
22
+ code: string;
23
+ queries: DashboardWidgetQueriesInput;
24
+ }
25
+
26
+ export async function handleAddDashboardWidget(params: AddDashboardWidgetParams): Promise<string> {
27
+ const queries = normalizeDashboardWidgetQueries({ queries: params.queries });
28
+
29
+ const project = await getCurrentProject();
30
+ await assertDashboardExists({ projectId: project.id, dashboardId: params.dashboardId });
31
+
32
+ const widget = await createDashboardWidget({
33
+ projectId: project.id,
34
+ name: params.name,
35
+ code: params.code,
36
+ queries,
37
+ });
38
+
39
+ try {
40
+ await assignDashboardWidgetToDashboard({
41
+ projectId: project.id,
42
+ widgetId: widget.id,
43
+ dashboardId: params.dashboardId,
44
+ });
45
+ } catch (error) {
46
+ // The widget now exists but is not on the dashboard we promised — never
47
+ // leave it dangling because the dashboard vanished between the check
48
+ // above and this call.
49
+ await deleteDashboardWidget({
50
+ projectId: project.id,
51
+ widgetId: widget.id,
52
+ }).catch(() => {
53
+ // Best-effort cleanup; the assign error below is what the caller needs.
54
+ });
55
+ throw error;
56
+ }
57
+
58
+ return [
59
+ `Widget "${params.name}" created and added to dashboard "${params.dashboardId}".`,
60
+ `**Widget ID**: ${widget.id}`,
61
+ `**Queries**: ${queries.map((q) => q.name).join(", ")}`,
62
+ ].join("\n");
63
+ }
@@ -1,8 +1,6 @@
1
- import { archiveProject as apiArchiveProject } from "../langwatch-api-projects.js";
1
+ import { archiveProject as apiArchiveProject } from "../langwatch-api-projects.ts";
2
2
 
3
- export async function handleArchiveProject(params: {
4
- id: string;
5
- }): Promise<string> {
3
+ export async function handleArchiveProject(params: { id: string }): Promise<string> {
6
4
  const result = await apiArchiveProject(params.id);
7
5
 
8
6
  return (
@@ -1,11 +1,9 @@
1
- import { archiveRunPlan as apiArchiveRunPlan } from "../langwatch-api-run-plans.js";
1
+ import { archiveRunPlan as apiArchiveRunPlan } from "../langwatch-api-run-plans.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_archive_run_plan MCP tool invocation.
5
5
  */
6
- export async function handleArchiveRunPlan(params: {
7
- id: string;
8
- }): Promise<string> {
6
+ export async function handleArchiveRunPlan(params: { id: string }): Promise<string> {
9
7
  const result = await apiArchiveRunPlan(params.id);
10
8
 
11
9
  return `Run plan ${result.id} is archived. Its past runs stay readable, and the name is free for a new plan.`;
@@ -1,13 +1,11 @@
1
- import { archiveScenario as apiArchiveScenario } from "../langwatch-api-scenarios.js";
1
+ import { archiveScenario as apiArchiveScenario } from "../langwatch-api-scenarios.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_archive_scenario MCP tool invocation.
5
5
  *
6
6
  * Archives (soft-deletes) a scenario and returns confirmation.
7
7
  */
8
- export async function handleArchiveScenario(params: {
9
- scenarioId: string;
10
- }): Promise<string> {
8
+ export async function handleArchiveScenario(params: { scenarioId: string }): Promise<string> {
11
9
  const result = await apiArchiveScenario(params.scenarioId);
12
10
 
13
11
  const lines: string[] = [];
@@ -1,11 +1,9 @@
1
- import { archiveTestSuite as apiArchiveTestSuite } from "../langwatch-api-test-suites.js";
1
+ import { archiveTestSuite as apiArchiveTestSuite } from "../langwatch-api-test-suites.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_archive_test_suite MCP tool invocation.
5
5
  */
6
- export async function handleArchiveTestSuite(params: {
7
- id: string;
8
- }): Promise<string> {
6
+ export async function handleArchiveTestSuite(params: { id: string }): Promise<string> {
9
7
  const result = await apiArchiveTestSuite(params.id);
10
8
 
11
9
  return `Test suite ${result.id} is archived, and the scenarios filed in it are archived with it.`;
@@ -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,12 +1,10 @@
1
- import { createScenario as apiCreateScenario } from "../langwatch-api-scenarios.js";
2
- import type { ScenarioFieldValues } from "../schemas/suite-fields.js";
3
- import { formatScenarioFields } from "./format-scenario.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";
4
4
 
5
5
  /**
6
- * Handles the platform_create_scenario MCP tool invocation.
7
- *
8
- * Creates a new scenario in the LangWatch project and returns a
9
- * 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.
10
8
  */
11
9
  export async function handleCreateScenario(params: {
12
10
  name: string;
@@ -1,13 +1,10 @@
1
- import { createTestSuite as apiCreateTestSuite } from "../langwatch-api-test-suites.js";
1
+ import { createTestSuite as apiCreateTestSuite } from "../langwatch-api-test-suites.ts";
2
2
  import {
3
3
  type EvaluatorAttachmentInput,
4
4
  type SuiteField,
5
5
  toWireAttachments,
6
- } from "../schemas/suite-fields.js";
7
- import {
8
- formatEvaluatorAttachments,
9
- formatSuiteFields,
10
- } from "./format-suite-details.js";
6
+ } from "../schemas/suite-fields.ts";
7
+ import { formatEvaluatorAttachments, formatSuiteFields } from "./format-suite-details.ts";
11
8
 
12
9
  /**
13
10
  * Handles the platform_create_test_suite MCP tool invocation.
@@ -35,9 +32,7 @@ export async function handleCreateTestSuite(params: {
35
32
  ...formatEvaluatorAttachments(suite.evaluators),
36
33
  "",
37
34
  `> File scenarios in it with \`platform_create_scenario\` or \`platform_update_scenario\`, passing testSuiteId \`${suite.id}\`${
38
- suite.fields && suite.fields.length > 0
39
- ? ` and a value per field under \`fields\``
40
- : ""
35
+ suite.fields && suite.fields.length > 0 ? ` and a value per field under \`fields\`` : ""
41
36
  }.`,
42
37
  ].join("\n");
43
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);