@langwatch/mcp-server 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +218 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  6. package/dist/add-dashboard-widget-55UI6H22.js +44 -0
  7. package/dist/add-dashboard-widget-MJHIC3CC.js +45 -0
  8. package/dist/{archive-project-W3IKI7UL.js → archive-project-K5UD7A6X.js} +4 -4
  9. package/dist/archive-project-L4PAKT34.js +19 -0
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-5HSQG2HX.js} +4 -4
  11. package/dist/archive-run-plan-AOKNYQIO.js +15 -0
  12. package/dist/archive-scenario-2CWJW2VD.js +19 -0
  13. package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-5IJQESHH.js} +4 -4
  14. package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-OPB7NFI7.js} +4 -4
  15. package/dist/archive-test-suite-ZC3TN6VH.js +15 -0
  16. package/dist/assign-prompt-tag-6DDE6ZZ5.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-D7O23MJM.js} +8 -4
  18. package/dist/chunk-3YLN3ATJ.js +241 -0
  19. package/dist/{chunk-EYXMLE5X.js → chunk-4RX3G62A.js} +56 -47
  20. package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  21. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  22. package/dist/chunk-7CZQDZ2K.js +319 -0
  23. package/dist/{chunk-RVAE2MEA.js → chunk-7GETGE6B.js} +7 -7
  24. package/dist/{chunk-OJLYYJWI.js → chunk-AASW2TO2.js} +7 -10
  25. package/dist/{chunk-QAMP3CGR.js → chunk-B4RFWIUP.js} +4 -4
  26. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  27. package/dist/{chunk-G4ZAZTZW.js → chunk-D2HS73VI.js} +7 -10
  28. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  29. package/dist/{chunk-WT4PO4A3.js → chunk-DULFP3MK.js} +10 -7
  30. package/dist/chunk-EYPJBL7P.js +516 -0
  31. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  32. package/dist/chunk-GA5JUSPT.js +64 -0
  33. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  34. package/dist/chunk-HLQJXUR6.js +67 -0
  35. package/dist/{chunk-JTQJRNFJ.js → chunk-KILVK3FS.js} +4 -4
  36. package/dist/chunk-MOCU5XWF.js +79 -0
  37. package/dist/chunk-O2WGVCED.js +41 -0
  38. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  39. package/dist/{chunk-UFOYFYI7.js → chunk-QXLMHLRC.js} +6 -9
  40. package/dist/{chunk-QRO35SOM.js → chunk-R5YJIYPF.js} +981 -747
  41. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  42. package/dist/{chunk-SR6QPRIE.js → chunk-RFC2SBEX.js} +7 -13
  43. package/dist/chunk-SHSVN3SE.js +21 -0
  44. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  45. package/dist/{chunk-56OGTS24.js → chunk-VOUGDY2O.js} +4 -11
  46. package/dist/chunk-WCKZDOGF.js +31 -0
  47. package/dist/chunk-XQYH52SI.js +129 -0
  48. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  49. package/dist/{chunk-6DJDEXET.js → chunk-YCIUEZVK.js} +6 -12
  50. package/dist/config-2WQGMAEN.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-6JNLMYQD.js} +4 -4
  54. package/dist/create-agent-IRZOU4R5.js +23 -0
  55. package/dist/create-analytics-report-N4L4V5QL.js +19 -0
  56. package/dist/create-analytics-report-QEHXG7FU.js +18 -0
  57. package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-CCEGIZ67.js} +10 -5
  58. package/dist/create-annotation-DTHCMWHB.js +29 -0
  59. package/dist/{create-api-key-BGBB76JX.js → create-api-key-JKM2DSZO.js} +5 -7
  60. package/dist/create-api-key-JPEUIXGM.js +24 -0
  61. package/dist/create-dataset-DJNXYJ5B.js +22 -0
  62. package/dist/{create-dataset-FD5VAXU4.js → create-dataset-WON4SOTC.js} +6 -6
  63. package/dist/create-dataset-records-TMEOTLTO.js +20 -0
  64. package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-UJBW3C7C.js} +5 -7
  65. package/dist/create-evaluator-N5AEHI4K.js +27 -0
  66. package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-XYNY2YFY.js} +4 -4
  67. package/dist/create-mcp-server.cjs +9712 -0
  68. package/dist/create-mcp-server.js +2757 -10
  69. package/dist/{create-project-ZQ7TFIO2.js → create-project-EY4XZ7TH.js} +4 -4
  70. package/dist/create-project-YL345T5L.js +44 -0
  71. package/dist/{create-prompt-BS6QRCUU.js → create-prompt-JZQNQ7I3.js} +5 -7
  72. package/dist/create-prompt-ZUMQHHX7.js +37 -0
  73. package/dist/create-prompt-tag-CJ5FZ436.js +17 -0
  74. package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-JFP2Q3PO.js} +3 -3
  75. package/dist/create-scenario-CQU2SSFB.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-S6OWWKJO.js} +5 -5
  77. package/dist/create-test-suite-OLGCAGJA.js +36 -0
  78. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-Y7P2RI4L.js} +6 -6
  79. package/dist/create-trigger-4CNBTISJ.js +48 -0
  80. package/dist/create-trigger-RQ653WYF.js +49 -0
  81. package/dist/dashboards-BA7M6CMO.js +90 -0
  82. package/dist/dashboards-U663GUIB.js +91 -0
  83. package/dist/{delete-agent-SA4JMUZF.js → delete-agent-J2Q4DRZ2.js} +4 -4
  84. package/dist/delete-agent-ZAU4LTXB.js +18 -0
  85. package/dist/delete-analytics-report-QK6X7P4S.js +19 -0
  86. package/dist/delete-analytics-report-YUYLDHLL.js +18 -0
  87. package/dist/delete-annotation-7X4NYXXM.js +17 -0
  88. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-KJOCDLV3.js} +4 -4
  89. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-NXP7ZPPV.js} +5 -7
  90. package/dist/delete-dataset-RUTZBBVD.js +18 -0
  91. package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-4Z7DZCDW.js} +5 -7
  92. package/dist/delete-dataset-records-75UAR5IS.js +19 -0
  93. package/dist/delete-evaluator-E3CUNGTQ.js +16 -0
  94. package/dist/delete-evaluator-RI4GALGX.js +15 -0
  95. package/dist/delete-prompt-tag-LE3WJPKS.js +17 -0
  96. package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-S4KBZTNG.js} +3 -3
  97. package/dist/delete-workflow-4CZFIQCQ.js +17 -0
  98. package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-PWQPDW6H.js} +4 -4
  99. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  100. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  101. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  102. package/dist/{discover-scenario-schema-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  103. package/dist/discover-schema-7WHIIATI.js +442 -0
  104. package/dist/{discover-schema-L6QDPON3.js → discover-schema-J2ANOBKO.js} +181 -186
  105. package/dist/get-agent-5T3CXQOR.js +69 -0
  106. package/dist/{get-agent-7THF7HCU.js → get-agent-ZKYQJUQ7.js} +15 -11
  107. package/dist/get-analytics-4MPEK4KV.js +79 -0
  108. package/dist/get-analytics-ZLI3A4F5.js +80 -0
  109. package/dist/get-analytics-report-JCKYMA2S.js +29 -0
  110. package/dist/get-analytics-report-SKIP2JWH.js +30 -0
  111. package/dist/get-dataset-APGZBYMH.js +64 -0
  112. package/dist/get-dataset-LWXDVMVE.js +63 -0
  113. package/dist/get-evaluator-3A7BJBAB.js +47 -0
  114. package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-IWNJINRY.js} +4 -4
  115. package/dist/get-project-EQVB4LEL.js +26 -0
  116. package/dist/{get-project-QSQEAB33.js → get-project-RK6AJTEP.js} +4 -4
  117. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-TLG2T2DS.js} +53 -58
  118. package/dist/get-prompt-ZER557X3.js +94 -0
  119. package/dist/get-run-plan-5X7DDJRN.js +58 -0
  120. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-PEHRO5M3.js} +7 -9
  121. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-375W5D6I.js} +5 -5
  122. package/dist/get-scenario-UQX45ZZO.js +37 -0
  123. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-2NBXJADG.js} +26 -22
  124. package/dist/get-simulation-run-QZTLGL7W.js +69 -0
  125. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GVIBDG7K.js} +5 -5
  126. package/dist/get-test-suite-OODIR3RI.js +48 -0
  127. package/dist/{get-trace-RCUV7N4O.js → get-trace-AGCHVPJK.js} +11 -13
  128. package/dist/get-trace-KJLYAZRC.js +45 -0
  129. package/dist/get-workflow-3TV2YYC5.js +25 -0
  130. package/dist/{get-workflow-EEOC7Y45.js → get-workflow-7LZSVPP2.js} +4 -4
  131. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  132. package/dist/{http-server-WCDUARTH.js → http-server-7CCN3EHJ.js} +4249 -325
  133. package/dist/index.js +59595 -38027
  134. package/dist/langwatch-api-analytics-reports-6CF6KUET.js +17 -0
  135. package/dist/langwatch-api-analytics-reports-RPFB5AO5.js +18 -0
  136. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-H4AI4TKG.js} +4 -4
  137. package/dist/langwatch-api-annotations-QSJNUQQS.js +17 -0
  138. package/dist/langwatch-api-monitors-ENHLOL3S.js +47 -0
  139. package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-OHSGADTH.js} +11 -16
  140. package/dist/langwatch-api-secrets-AGW6UUMD.js +55 -0
  141. package/dist/langwatch-api-secrets-CLTS766Q.js +56 -0
  142. package/dist/langwatch-api-triggers-G5UWFNN2.js +22 -0
  143. package/dist/langwatch-api-triggers-QMR7KEXW.js +23 -0
  144. package/dist/langwatch-api-workflows-HKTBIKKY.js +15 -0
  145. package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OMROZH2O.js} +4 -4
  146. package/dist/{list-agents-AMVDQPQL.js → list-agents-BYWDNAHT.js} +4 -4
  147. package/dist/list-agents-MG24MHZE.js +42 -0
  148. package/dist/list-analytics-reports-G3EPWGSQ.js +32 -0
  149. package/dist/list-analytics-reports-PPWIFRES.js +33 -0
  150. package/dist/list-annotations-QCLGEK5A.js +38 -0
  151. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-Y4EUBJHG.js} +10 -5
  152. package/dist/list-api-keys-DAVOBPFK.js +42 -0
  153. package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-JMW5WRXX.js} +10 -5
  154. package/dist/list-dashboards-2P3VJFRS.js +29 -0
  155. package/dist/list-dashboards-MW5O3MKH.js +30 -0
  156. package/dist/list-dataset-records-KEHT7G6Q.js +43 -0
  157. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-KMLLMZAZ.js} +14 -10
  158. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-P3JK2ZHS.js} +9 -13
  159. package/dist/list-datasets-Z7OOE4KI.js +56 -0
  160. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-7RRESBOU.js} +5 -7
  161. package/dist/list-evaluators-VATJVOHR.js +32 -0
  162. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-OXDRPUCJ.js} +4 -4
  163. package/dist/list-model-providers-VXQJWDXU.js +35 -0
  164. package/dist/{list-projects-AQVI6SUK.js → list-projects-HUVK7L3W.js} +5 -7
  165. package/dist/list-projects-X72ZXVY5.js +40 -0
  166. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-3I3LWFIR.js} +3 -3
  167. package/dist/list-prompt-tags-DRHUH2ND.js +23 -0
  168. package/dist/list-prompts-6DX3QECJ.js +30 -0
  169. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-PS423RU3.js} +4 -6
  170. package/dist/list-run-plans-5SXPOV3X.js +45 -0
  171. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-6VNHINPY.js} +5 -5
  172. package/dist/list-scenarios-EQWCW7Q4.js +45 -0
  173. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-GKNH3YND.js} +13 -11
  174. package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-KHY7KALI.js} +12 -8
  175. package/dist/list-simulation-runs-PUDK32C2.js +53 -0
  176. package/dist/list-test-suites-7H2DRILK.js +34 -0
  177. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-GY56LGLY.js} +4 -4
  178. package/dist/list-trigger-fires-7RZUP54Y.js +19 -0
  179. package/dist/list-trigger-fires-OZUF65LI.js +20 -0
  180. package/dist/list-triggers-BGUCUXTJ.js +45 -0
  181. package/dist/list-triggers-XC5KMX4C.js +46 -0
  182. package/dist/list-workflows-55NYC3PC.js +33 -0
  183. package/dist/{list-workflows-6MV4XJHF.js → list-workflows-HV7FUWZA.js} +5 -7
  184. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-2I7Z5FCY.js} +3 -3
  185. package/dist/rename-prompt-tag-SZYTOWDX.js +18 -0
  186. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-27AYY33K.js} +4 -4
  187. package/dist/rename-test-suite-CLIEPZDO.js +20 -0
  188. package/dist/report-issue-5HSL7CNB.js +924 -0
  189. package/dist/{report-issue-RHZZ33IS.js → report-issue-N7ND5TM6.js} +107 -67
  190. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-O3VUZ6CG.js} +5 -5
  191. package/dist/rerun-run-plan-OJTVVGJI.js +21 -0
  192. package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-BU6BKGCG.js} +4 -4
  193. package/dist/revoke-api-key-NZNCFOIR.js +15 -0
  194. package/dist/run-agent-244O4Y5M.js +75 -0
  195. package/dist/run-agent-HPCGZGYW.js +74 -0
  196. package/dist/run-plan-2ZPGGZ4H.js +38 -0
  197. package/dist/{run-plan-T4ZYOZGA.js → run-plan-KSXUYQT3.js} +7 -7
  198. package/dist/run-query-4LMOQ5UW.js +47 -0
  199. package/dist/run-query-BQUHIUC2.js +46 -0
  200. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-P3WLVPXC.js} +6 -6
  201. package/dist/run-test-suite-UEOMCON6.js +25 -0
  202. package/dist/run-workflow-EFZ6HG5B.js +36 -0
  203. package/dist/{run-workflow-DFIS23AP.js → run-workflow-I4IHEN54.js} +4 -4
  204. package/dist/search-traces-6IR7PR4L.js +170 -0
  205. package/dist/search-traces-BYML2NQ4.js +171 -0
  206. package/dist/set-model-provider-RBNGWFVI.js +33 -0
  207. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-SHEVKWRC.js} +4 -4
  208. package/dist/{update-agent-DUWNYBNA.js → update-agent-PTKTM2B5.js} +4 -4
  209. package/dist/update-agent-ZPXWRMS2.js +20 -0
  210. package/dist/update-dashboard-widget-HKCBXH7X.js +62 -0
  211. package/dist/update-dashboard-widget-IP2TTQ5G.js +63 -0
  212. package/dist/update-dataset-GHIN6JR3.js +22 -0
  213. package/dist/{update-dataset-YSOMDCOB.js → update-dataset-IRVMY5PF.js} +6 -6
  214. package/dist/update-dataset-record-6VI7K2CL.js +19 -0
  215. package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-Z3L7ACNF.js} +4 -4
  216. package/dist/update-evaluator-5NLNE6VY.js +24 -0
  217. package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-FEH7H6NS.js} +4 -4
  218. package/dist/update-project-75H3LDQT.js +24 -0
  219. package/dist/{update-project-Q26FBSYH.js → update-project-QPR3QX55.js} +4 -4
  220. package/dist/update-prompt-BCDFTNLK.js +140 -0
  221. package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-NPRXYSWA.js} +27 -29
  222. package/dist/update-scenario-BNOMDCMV.js +34 -0
  223. package/dist/{update-scenario-WUX34JAR.js → update-scenario-EM5XGMB7.js} +5 -5
  224. package/package.json +35 -39
  225. package/pyproject.toml +23 -8
  226. package/src/config.d.ts +6 -0
  227. package/src/config.ts +22 -29
  228. package/src/create-mcp-server.ts +887 -634
  229. package/src/documentation-fetch.ts +21 -20
  230. package/src/http-security.ts +166 -135
  231. package/src/http-server.ts +189 -224
  232. package/src/index.ts +14 -16
  233. package/src/langwatch-api-agents.ts +18 -21
  234. package/src/langwatch-api-analytics-reports.ts +62 -0
  235. package/src/langwatch-api-annotations.ts +11 -12
  236. package/src/langwatch-api-api-keys.ts +8 -9
  237. package/src/langwatch-api-dashboard-widgets.ts +47 -0
  238. package/src/langwatch-api-dashboards.ts +109 -24
  239. package/src/langwatch-api-datasets.ts +98 -32
  240. package/src/langwatch-api-evaluators.ts +13 -19
  241. package/src/langwatch-api-model-providers.ts +4 -4
  242. package/src/langwatch-api-monitors.ts +14 -18
  243. package/src/langwatch-api-projects.ts +10 -9
  244. package/src/langwatch-api-query.ts +114 -0
  245. package/src/langwatch-api-run-plans.ts +12 -29
  246. package/src/langwatch-api-scenarios.ts +9 -11
  247. package/src/langwatch-api-secrets.ts +31 -24
  248. package/src/langwatch-api-simulation-runs.ts +6 -8
  249. package/src/langwatch-api-test-suites.ts +14 -33
  250. package/src/langwatch-api-triggers.ts +96 -34
  251. package/src/langwatch-api-workflows.ts +9 -9
  252. package/src/langwatch-api.ts +118 -124
  253. package/src/public-http-request.ts +21 -12
  254. package/src/schemas/analytics-metrics.ts +3 -15
  255. package/src/schemas/create-dataset.ts +3 -4
  256. package/src/schemas/run-plan.ts +13 -29
  257. package/src/schemas/suite-fields.ts +6 -23
  258. package/src/schemas/triggers.ts +365 -0
  259. package/src/schemas/widget-sources.ts +33 -0
  260. package/src/tools/add-dashboard-widget.ts +51 -0
  261. package/src/tools/archive-project.ts +2 -4
  262. package/src/tools/archive-run-plan.ts +2 -4
  263. package/src/tools/archive-scenario.ts +2 -4
  264. package/src/tools/archive-test-suite.ts +2 -4
  265. package/src/tools/assign-prompt-tag.ts +6 -2
  266. package/src/tools/create-agent.ts +1 -1
  267. package/src/tools/create-analytics-report.ts +7 -0
  268. package/src/tools/create-annotation.ts +7 -2
  269. package/src/tools/create-api-key.ts +4 -6
  270. package/src/tools/create-dataset-records.ts +4 -8
  271. package/src/tools/create-dataset.ts +5 -7
  272. package/src/tools/create-evaluator.ts +3 -5
  273. package/src/tools/create-project.ts +2 -2
  274. package/src/tools/create-prompt-tag.ts +2 -4
  275. package/src/tools/create-prompt.ts +9 -18
  276. package/src/tools/create-scenario.ts +5 -7
  277. package/src/tools/create-test-suite.ts +4 -9
  278. package/src/tools/create-trigger.ts +55 -0
  279. package/src/tools/dashboard-widget-queries.ts +45 -0
  280. package/src/tools/dashboards.ts +104 -0
  281. package/src/tools/delete-agent.ts +1 -1
  282. package/src/tools/delete-analytics-report.ts +7 -0
  283. package/src/tools/delete-annotation.ts +1 -1
  284. package/src/tools/delete-dataset-records.ts +4 -8
  285. package/src/tools/delete-dataset.ts +3 -7
  286. package/src/tools/delete-evaluator.ts +4 -6
  287. package/src/tools/delete-prompt-tag.ts +2 -4
  288. package/src/tools/delete-workflow.ts +1 -1
  289. package/src/tools/discover-evaluator-schema.ts +34 -25
  290. package/src/tools/discover-scenario-schema.ts +41 -21
  291. package/src/tools/discover-schema.ts +149 -27
  292. package/src/tools/experiment-run-status.ts +2 -8
  293. package/src/tools/format-dataset-mutation.ts +5 -10
  294. package/src/tools/format-run-plan.ts +7 -21
  295. package/src/tools/format-scenario.ts +2 -4
  296. package/src/tools/format-suite-details.ts +6 -12
  297. package/src/tools/get-agent.ts +15 -6
  298. package/src/tools/get-analytics-report.ts +23 -0
  299. package/src/tools/get-analytics.ts +52 -46
  300. package/src/tools/get-dataset.ts +34 -16
  301. package/src/tools/get-evaluator.ts +4 -11
  302. package/src/tools/get-experiment-results.ts +219 -186
  303. package/src/tools/get-project.ts +2 -4
  304. package/src/tools/get-prompt.ts +63 -84
  305. package/src/tools/get-run-plan.ts +4 -6
  306. package/src/tools/get-scenario.ts +4 -6
  307. package/src/tools/get-simulation-run.ts +27 -24
  308. package/src/tools/get-test-suite.ts +2 -5
  309. package/src/tools/get-trace.ts +16 -17
  310. package/src/tools/get-workflow.ts +1 -1
  311. package/src/tools/list-agents.ts +1 -1
  312. package/src/tools/list-analytics-reports.ts +27 -0
  313. package/src/tools/list-annotations.ts +8 -5
  314. package/src/tools/list-api-keys.ts +7 -2
  315. package/src/tools/list-dashboards.ts +20 -21
  316. package/src/tools/list-dataset-records.ts +8 -6
  317. package/src/tools/list-datasets.ts +12 -23
  318. package/src/tools/list-evaluators.ts +4 -8
  319. package/src/tools/list-experiment-runs.ts +5 -9
  320. package/src/tools/list-experiments.ts +5 -11
  321. package/src/tools/list-model-providers.ts +3 -5
  322. package/src/tools/list-projects.ts +2 -4
  323. package/src/tools/list-prompt-tags.ts +3 -3
  324. package/src/tools/list-prompts.ts +4 -8
  325. package/src/tools/list-run-plans.ts +2 -2
  326. package/src/tools/list-scenarios.ts +14 -15
  327. package/src/tools/list-simulation-runs.ts +8 -4
  328. package/src/tools/list-test-suites.ts +1 -1
  329. package/src/tools/list-trigger-fires.ts +17 -0
  330. package/src/tools/list-triggers.ts +39 -0
  331. package/src/tools/list-workflows.ts +2 -4
  332. package/src/tools/rename-prompt-tag.ts +1 -1
  333. package/src/tools/rename-test-suite.ts +2 -5
  334. package/src/tools/report-issue.ts +7 -9
  335. package/src/tools/rerun-run-plan.ts +2 -5
  336. package/src/tools/revoke-api-key.ts +2 -4
  337. package/src/tools/run-agent.ts +29 -26
  338. package/src/tools/run-experiment.ts +37 -34
  339. package/src/tools/run-plan.ts +4 -7
  340. package/src/tools/run-query.ts +47 -0
  341. package/src/tools/run-test-suite.ts +4 -7
  342. package/src/tools/run-workflow.ts +2 -5
  343. package/src/tools/search-traces.ts +161 -47
  344. package/src/tools/set-model-provider.ts +4 -6
  345. package/src/tools/test-agent.ts +2 -2
  346. package/src/tools/update-agent.ts +1 -1
  347. package/src/tools/update-dashboard-widget.ts +86 -0
  348. package/src/tools/update-dataset-record.ts +1 -1
  349. package/src/tools/update-dataset.ts +5 -7
  350. package/src/tools/update-evaluator.ts +3 -5
  351. package/src/tools/update-project.ts +1 -1
  352. package/src/tools/update-prompt.ts +44 -59
  353. package/src/tools/update-scenario.ts +5 -7
  354. package/src/tools/update-test-suite.ts +6 -11
  355. package/src/utils/date-parsing.ts +1 -1
  356. package/src/utils/escape-markdown.ts +3 -8
  357. package/src/utils/format-evaluations.ts +6 -6
  358. package/src/utils/markdown-table.ts +58 -0
  359. package/src/utils/trace-id-shape.ts +20 -0
  360. package/tsconfig.app.json +24 -0
  361. package/tsconfig.json +14 -12
  362. package/uv.lock +667 -341
  363. package/vitest.integration.config.js +10 -0
  364. package/vitest.scenario.config.js +9 -0
  365. package/.eslintrc.cjs +0 -36
  366. package/dist/chunk-AN4OUA4D.js +0 -86
  367. package/dist/chunk-GELJ2MQR.js +0 -226
  368. package/dist/chunk-K37ZNPXK.js +0 -24
  369. package/dist/chunk-S4GVX36W.js +0 -39
  370. package/dist/config.d.ts +0 -17
  371. package/dist/create-dashboard-Z76AIPLS.js +0 -19
  372. package/dist/create-mcp-server.d.ts +0 -10
  373. package/dist/delete-dashboard-LYMRPF27.js +0 -19
  374. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  375. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  376. package/dist/get-analytics-R6AZD3AW.js +0 -73
  377. package/dist/get-dashboard-P4WWVHFU.js +0 -30
  378. package/dist/get-dataset-AKTYSQDI.js +0 -49
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-dashboards-2KJL2M42.js +0 -18
  381. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  382. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  383. package/dist/list-dashboards-Z3BZKDGF.js +0 -33
  384. package/dist/run-agent-CAGWGTYT.js +0 -72
  385. package/dist/search-traces-4XTJYXIK.js +0 -79
  386. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  387. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  388. package/src/__tests__/config.unit.test.ts +0 -202
  389. package/src/__tests__/datasets.integration.test.ts +0 -620
  390. package/src/__tests__/datasets.unit.test.ts +0 -244
  391. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  392. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  393. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  394. package/src/__tests__/docker.integration.test.ts +0 -318
  395. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  396. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  397. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  398. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  399. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  400. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  401. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  402. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  403. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  404. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  405. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  406. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  407. package/src/__tests__/http-transport.integration.test.ts +0 -395
  408. package/src/__tests__/integration.integration.test.ts +0 -284
  409. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  410. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  411. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  412. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  413. package/src/__tests__/prompts.integration.test.ts +0 -736
  414. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  415. package/src/__tests__/report-issue.integration.test.ts +0 -147
  416. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  421. package/src/__tests__/support/http-server-harness.ts +0 -138
  422. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  423. package/src/__tests__/tools.integration.test.ts +0 -896
  424. package/src/schemas/filter-fields.ts +0 -119
  425. package/src/schemas/index.ts +0 -9
  426. package/src/tools/create-dashboard.ts +0 -7
  427. package/src/tools/delete-dashboard.ts +0 -7
  428. package/src/tools/get-dashboard.ts +0 -22
@@ -0,0 +1,7 @@
1
+ import { createAnalyticsReport } from "../langwatch-api-analytics-reports.ts";
2
+
3
+ export async function handleCreateAnalyticsReport(params: { name: string }): Promise<string> {
4
+ const report = await createAnalyticsReport({ name: params.name });
5
+
6
+ return `Analytics Report created successfully!\n\n**Name**: ${report.name}\n**ID**: ${report.id}`;
7
+ }
@@ -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,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,45 @@
1
+ import type { DashboardWidgetQueryInput } from "../langwatch-api-dashboard-widgets.js";
2
+ import type { WidgetSource } from "../schemas/widget-sources.js";
3
+
4
+ /** Every query with `sources` set to the list given; as given when no list was named. */
5
+ export function withSources({
6
+ queries,
7
+ sources,
8
+ }: {
9
+ queries: readonly DashboardWidgetQueryInput[];
10
+ sources: WidgetSource[] | null | undefined;
11
+ }): DashboardWidgetQueryInput[] {
12
+ if (sources === undefined) return [...queries];
13
+ return queries.map((query) => ({ ...query, sources }));
14
+ }
15
+
16
+ /** A widget file rarely needs more than a couple of named queries (server bound). */
17
+ export const MAX_DASHBOARD_WIDGET_QUERIES = 8;
18
+
19
+ /** The `{ name: sql }` shorthand or the array form the REST endpoint takes. */
20
+ export type DashboardWidgetQueriesInput = DashboardWidgetQueryInput[] | Record<string, string>;
21
+
22
+ /**
23
+ * Turns the `{ name: sql }` shorthand into the array shape the REST endpoint validates,
24
+ * refusing an empty or oversized set before any request is made.
25
+ */
26
+ export function normalizeDashboardWidgetQueries({
27
+ queries,
28
+ }: {
29
+ queries: DashboardWidgetQueriesInput;
30
+ }): DashboardWidgetQueryInput[] {
31
+ const normalized = Array.isArray(queries)
32
+ ? queries
33
+ : Object.entries(queries).map(([name, sql]) => ({ name, sql }));
34
+ if (normalized.length === 0) {
35
+ throw new Error(
36
+ "Provide at least one named LWQL query in `queries`. Validate each query's SQL first with run_query.",
37
+ );
38
+ }
39
+ if (normalized.length > MAX_DASHBOARD_WIDGET_QUERIES) {
40
+ throw new Error(
41
+ `A widget may declare at most ${MAX_DASHBOARD_WIDGET_QUERIES} queries, got ${normalized.length}.`,
42
+ );
43
+ }
44
+ return normalized;
45
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * The dashboard tools over `/api/v1/dashboards`: read, create, rename and delete a dashboard,
3
+ * list a dashboard's widgets and delete one. Spec: modules/dashboard/specs/dashboards-v2.feature
4
+ * AC199s.
5
+ */
6
+
7
+ import {
8
+ type Dashboard,
9
+ createDashboard,
10
+ deleteDashboard,
11
+ deleteWidgetOnDashboard,
12
+ getDashboard,
13
+ listWidgetsOnDashboard,
14
+ updateDashboard,
15
+ } from "../langwatch-api-dashboards.js";
16
+
17
+ function describeDashboard(dashboard: Dashboard): string[] {
18
+ return [
19
+ `**Name**: ${dashboard.name}`,
20
+ `**ID**: ${dashboard.id}`,
21
+ `**Scope**: ${dashboard.scope}`,
22
+ ...(dashboard.description ? [`**Description**: ${dashboard.description}`] : []),
23
+ `**URL**: ${dashboard.platformUrl}`,
24
+ ];
25
+ }
26
+
27
+ /** Reads only `/api/v1/dashboards`; an Analytics Report's id is not found there. */
28
+ export async function handleGetDashboard({
29
+ dashboardId,
30
+ }: {
31
+ dashboardId: string;
32
+ }): Promise<string> {
33
+ const dashboard = await getDashboard({ dashboardId });
34
+ return [`# ${dashboard.name}\n`, ...describeDashboard(dashboard)].join("\n");
35
+ }
36
+
37
+ export async function handleCreateDashboard({ name }: { name: string }): Promise<string> {
38
+ const dashboard = await createDashboard({ name });
39
+ return [
40
+ "Dashboard created.\n",
41
+ ...describeDashboard(dashboard),
42
+ "",
43
+ "> Pass the ID to `add_dashboard_widget` to add a widget to it.",
44
+ ].join("\n");
45
+ }
46
+
47
+ export async function handleRenameDashboard({
48
+ dashboardId,
49
+ name,
50
+ description,
51
+ }: {
52
+ dashboardId: string;
53
+ name?: string;
54
+ description?: string;
55
+ }): Promise<string> {
56
+ if (name === undefined && description === undefined) {
57
+ throw new Error("Provide at least one of name or description to change.");
58
+ }
59
+ const dashboard = await updateDashboard({
60
+ dashboardId,
61
+ ...(name === undefined ? {} : { name }),
62
+ ...(description === undefined ? {} : { description }),
63
+ });
64
+ return ["Dashboard updated.\n", ...describeDashboard(dashboard)].join("\n");
65
+ }
66
+
67
+ export async function handleDeleteDashboard({
68
+ dashboardId,
69
+ }: {
70
+ dashboardId: string;
71
+ }): Promise<string> {
72
+ const deleted = await deleteDashboard({ dashboardId });
73
+ return `Dashboard "${deleted.name}" deleted with its widgets (ID: ${deleted.id}).`;
74
+ }
75
+
76
+ export async function handleListDashboardWidgets({
77
+ dashboardId,
78
+ }: {
79
+ dashboardId: string;
80
+ }): Promise<string> {
81
+ const { data: widgets } = await listWidgetsOnDashboard({ dashboardId });
82
+ if (widgets.length === 0) return `Dashboard "${dashboardId}" has no widgets.`;
83
+
84
+ return [
85
+ `# Widgets on dashboard ${dashboardId} (${widgets.length} total)\n`,
86
+ ...widgets.flatMap((widget) => [
87
+ `## ${widget.name}`,
88
+ `**ID**: ${widget.id}`,
89
+ `**Queries**: ${widget.definition.queries.map((query) => query.name).join(", ") || "(none)"}`,
90
+ "",
91
+ ]),
92
+ ].join("\n");
93
+ }
94
+
95
+ export async function handleDeleteDashboardWidget({
96
+ dashboardId,
97
+ widgetId,
98
+ }: {
99
+ dashboardId: string;
100
+ widgetId: string;
101
+ }): Promise<string> {
102
+ await deleteWidgetOnDashboard({ dashboardId, widgetId });
103
+ return `Widget "${widgetId}" deleted from dashboard "${dashboardId}".`;
104
+ }
@@ -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);
@@ -0,0 +1,7 @@
1
+ import { deleteAnalyticsReport } from "../langwatch-api-analytics-reports.ts";
2
+
3
+ export async function handleDeleteAnalyticsReport(params: { reportId: string }): Promise<string> {
4
+ const result = await deleteAnalyticsReport({ reportId: params.reportId });
5
+
6
+ return `Analytics Report deleted successfully!\n\n**Name**: ${result.name}\n**ID**: ${result.id}`;
7
+ }
@@ -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,10 +1,8 @@
1
- import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.js";
1
+ import { deleteDatasetRecords as apiDeleteDatasetRecords } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_delete_dataset_records MCP tool invocation.
5
- *
6
- * Deletes records from a dataset by IDs and returns confirmation
7
- * with the count of records deleted.
4
+ * Handles the platform_delete_dataset_records MCP tool: deletes records
5
+ * by ID and returns a confirmation with the count deleted.
8
6
  */
9
7
  export async function handleDeleteDatasetRecords(params: {
10
8
  slugOrId: string;
@@ -14,9 +12,7 @@ export async function handleDeleteDatasetRecords(params: {
14
12
 
15
13
  const lines: string[] = [];
16
14
  lines.push(`${result.deletedCount} record(s) deleted successfully!\n`);
17
- lines.push(
18
- "> Use `platform_get_dataset` to see the updated dataset.",
19
- );
15
+ lines.push("> Use `platform_get_dataset` to see the updated dataset.");
20
16
 
21
17
  return lines.join("\n");
22
18
  }
@@ -1,20 +1,16 @@
1
- import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.js";
1
+ import { deleteDataset as apiDeleteDataset } from "../langwatch-api-datasets.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_delete_dataset MCP tool invocation.
5
5
  *
6
6
  * Archives (soft-deletes) a dataset and returns confirmation.
7
7
  */
8
- export async function handleDeleteDataset(params: {
9
- slugOrId: string;
10
- }): Promise<string> {
8
+ export async function handleDeleteDataset(params: { slugOrId: string }): Promise<string> {
11
9
  await apiDeleteDataset(params.slugOrId);
12
10
 
13
11
  const lines: string[] = [];
14
12
  lines.push("Dataset deleted successfully!\n");
15
- lines.push(
16
- "> The dataset has been archived and will no longer appear in listings.",
17
- );
13
+ lines.push("> The dataset has been archived and will no longer appear in listings.");
18
14
 
19
15
  return lines.join("\n");
20
16
  }
@@ -1,12 +1,10 @@
1
- import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.js";
1
+ import { deleteEvaluator as apiDeleteEvaluator } from "../langwatch-api-evaluators.ts";
2
2
 
3
3
  /**
4
4
  * Handles the platform_delete_evaluator MCP tool invocation.
5
5
  */
6
- export async function handleDeleteEvaluator(params: {
7
- idOrSlug: string;
8
- }): Promise<string> {
9
- const result = await apiDeleteEvaluator(params.idOrSlug);
6
+ export async function handleDeleteEvaluator(params: { idOrSlug: string }): Promise<string> {
7
+ await apiDeleteEvaluator(params.idOrSlug);
10
8
 
11
- return `Evaluator ${result.id} has been archived (soft-deleted).`;
9
+ return `Evaluator ${params.idOrSlug} has been archived (soft-deleted).`;
12
10
  }
@@ -1,8 +1,6 @@
1
- import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.js";
1
+ import { deletePromptTag as apiDeletePromptTag } from "../langwatch-api.ts";
2
2
 
3
- export async function handleDeletePromptTag(params: {
4
- tag: string;
5
- }): Promise<string> {
3
+ export async function handleDeletePromptTag(params: { tag: string }): Promise<string> {
6
4
  await apiDeletePromptTag(params.tag);
7
5
 
8
6
  const lines: string[] = [];
@@ -1,4 +1,4 @@
1
- import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.js";
1
+ import { deleteWorkflow as apiDeleteWorkflow } from "../langwatch-api-workflows.ts";
2
2
 
3
3
  export async function handleDeleteWorkflow(params: { id: string }): Promise<string> {
4
4
  const result = await apiDeleteWorkflow(params.id);
@@ -1,12 +1,12 @@
1
- import { AVAILABLE_EVALUATORS } from "../../../../services/langevals/ts-integration/evaluators.generated.js";
2
- import type { EvaluatorDefinition, EvaluatorTypes } from "../../../../services/langevals/ts-integration/evaluators.generated.js";
1
+ import {
2
+ AVAILABLE_EVALUATORS,
3
+ type EvaluatorDefinition,
4
+ type EvaluatorTypes,
5
+ } from "@langwatch/evaluator-contract";
3
6
 
4
7
  /**
5
- * Formats evaluator schema information for the discover_schema tool.
6
- *
7
- * Two levels of detail:
8
- * - Overview (no evaluatorType): compact list of all evaluator types
9
- * - Detail (with evaluatorType): full schema for one evaluator type
8
+ * Formats evaluator schema for discover_schema: an overview (all types,
9
+ * compact) when no evaluatorType is given, else the full schema for one.
10
10
  */
11
11
  export function formatEvaluatorSchema(evaluatorType?: string): string {
12
12
  if (evaluatorType) {
@@ -50,9 +50,22 @@ function formatEvaluatorOverview(): string {
50
50
  return lines.join("\n");
51
51
  }
52
52
 
53
+ function settingsSection(settingsEntries: [string, unknown][]): string[] {
54
+ if (settingsEntries.length === 0) return [];
55
+ const lines = ["\n## Settings\n"];
56
+ for (const [key, setting] of settingsEntries) {
57
+ const s = setting as { description?: string; default: unknown };
58
+ const defaultStr = JSON.stringify(s.default);
59
+ const desc = s.description ? ` - ${s.description}` : "";
60
+ lines.push(`- **${key}**${desc}`);
61
+ lines.push(` Default: \`${defaultStr}\``);
62
+ }
63
+ return lines;
64
+ }
65
+
53
66
  /**
54
- * Returns the full schema for a specific evaluator type.
55
- * Includes settings with descriptions and defaults, required/optional fields, env vars, and result fields.
67
+ * Returns the full schema for a specific evaluator type: settings, required/optional
68
+ * fields, env vars, and result fields.
56
69
  */
57
70
  function formatEvaluatorDetail(evaluatorType: string): string {
58
71
  const def = AVAILABLE_EVALUATORS[evaluatorType as EvaluatorTypes] as
@@ -85,18 +98,8 @@ function formatEvaluatorDetail(evaluatorType: string): string {
85
98
  lines.push(`**Optional**: ${def.optionalFields.join(", ")}`);
86
99
  }
87
100
 
88
- // Settings
89
101
  const settingsEntries = Object.entries(def.settings);
90
- if (settingsEntries.length > 0) {
91
- lines.push("\n## Settings\n");
92
- for (const [key, setting] of settingsEntries) {
93
- const s = setting as { description?: string; default: unknown };
94
- const defaultStr = JSON.stringify(s.default);
95
- const desc = s.description ? ` - ${s.description}` : "";
96
- lines.push(`- **${key}**${desc}`);
97
- lines.push(` Default: \`${defaultStr}\``);
98
- }
99
- }
102
+ lines.push(...settingsSection(settingsEntries));
100
103
 
101
104
  // Env vars
102
105
  if (def.envVars.length > 0) {
@@ -118,12 +121,18 @@ function formatEvaluatorDetail(evaluatorType: string): string {
118
121
 
119
122
  lines.push("\n## Usage Example\n");
120
123
  lines.push("```json");
121
- lines.push(JSON.stringify({
122
- evaluatorType: evaluatorType,
123
- settings: Object.fromEntries(
124
- settingsEntries.map(([key, setting]) => [key, (setting as { default: unknown }).default]),
124
+ lines.push(
125
+ JSON.stringify(
126
+ {
127
+ evaluatorType: evaluatorType,
128
+ settings: Object.fromEntries(
129
+ settingsEntries.map(([key, setting]) => [key, (setting as { default: unknown }).default]),
130
+ ),
131
+ },
132
+ null,
133
+ 2,
125
134
  ),
126
- }, null, 2));
135
+ );
127
136
  lines.push("```");
128
137
 
129
138
  return lines.join("\n");