@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
@@ -1,6 +1,6 @@
1
- import { getRunPlan as apiGetRunPlan } from "../langwatch-api-run-plans.js";
2
- import { describeRunPlanScope } from "./format-run-plan.js";
3
- import { formatEvaluatorAttachments } from "./format-suite-details.js";
1
+ import { getRunPlan as apiGetRunPlan } from "../langwatch-api-run-plans.ts";
2
+ import { describeRunPlanScope } from "./format-run-plan.ts";
3
+ import { formatEvaluatorAttachments } from "./format-suite-details.ts";
4
4
 
5
5
  /**
6
6
  * Handles the platform_get_run_plan MCP tool invocation.
@@ -39,9 +39,7 @@ export async function handleGetRunPlan(params: {
39
39
  const overrides = Object.entries(target.runParameters ?? {})
40
40
  .map(([name, value]) => `${name}=${String(value)}`)
41
41
  .join(", ");
42
- lines.push(
43
- `- ${target.type}:${target.referenceId}${overrides ? ` (${overrides})` : ""}`,
44
- );
42
+ lines.push(`- ${target.type}:${target.referenceId}${overrides ? ` (${overrides})` : ""}`);
45
43
  }
46
44
 
47
45
  if (plan.scenarioIds.length > 0) {
@@ -1,11 +1,9 @@
1
- import { getScenario as apiGetScenario } from "../langwatch-api-scenarios.js";
2
- import { formatScenarioFields } from "./format-scenario.js";
1
+ import { getScenario as apiGetScenario } from "../langwatch-api-scenarios.ts";
2
+ import { formatScenarioFields } from "./format-scenario.ts";
3
3
 
4
4
  /**
5
- * Handles the get_scenario MCP tool invocation.
6
- *
7
- * Retrieves a specific scenario by ID and formats it as
8
- * AI-readable markdown or raw JSON.
5
+ * Handles the get_scenario MCP tool: retrieves a scenario by ID and
6
+ * formats it as AI-readable markdown or raw JSON.
9
7
  */
10
8
  export async function handleGetScenario(params: {
11
9
  scenarioId: string;
@@ -1,8 +1,29 @@
1
- import { getSimulationRun as apiGetSimulationRun } from "../langwatch-api-simulation-runs.js";
2
1
  import {
3
- formatEvaluations,
4
- pendingEvaluationNote,
5
- } from "./format-suite-details.js";
2
+ getSimulationRun as apiGetSimulationRun,
3
+ type SimulationRunSummary,
4
+ } from "../langwatch-api-simulation-runs.ts";
5
+ import { formatEvaluations, pendingEvaluationNote } from "./format-suite-details.ts";
6
+
7
+ function resultLines(results: NonNullable<SimulationRunSummary["results"]>): string[] {
8
+ const lines = ["\n## Results"];
9
+ if (results.verdict) {
10
+ lines.push(`**Verdict**: ${results.verdict}`);
11
+ }
12
+ if (results.reasoning) {
13
+ lines.push(`**Reasoning**: ${results.reasoning}`);
14
+ }
15
+ if (results.metCriteria && results.metCriteria.length > 0) {
16
+ lines.push(`**Met Criteria**: ${results.metCriteria.join(", ")}`);
17
+ }
18
+ if (results.unmetCriteria && results.unmetCriteria.length > 0) {
19
+ lines.push(`**Unmet Criteria**: ${results.unmetCriteria.join(", ")}`);
20
+ }
21
+ if (results.error) {
22
+ lines.push(`**Error**: ${results.error}`);
23
+ }
24
+ lines.push(...formatEvaluations(results.evaluations));
25
+ return lines;
26
+ }
6
27
 
7
28
  /**
8
29
  * Handles the platform_get_simulation_run MCP tool invocation.
@@ -36,31 +57,13 @@ export async function handleGetSimulationRun(params: {
36
57
  }
37
58
 
38
59
  if (run.results) {
39
- lines.push("\n## Results");
40
- if (run.results.verdict) {
41
- lines.push(`**Verdict**: ${run.results.verdict}`);
42
- }
43
- if (run.results.reasoning) {
44
- lines.push(`**Reasoning**: ${run.results.reasoning}`);
45
- }
46
- if (run.results.metCriteria && run.results.metCriteria.length > 0) {
47
- lines.push(`**Met Criteria**: ${run.results.metCriteria.join(", ")}`);
48
- }
49
- if (run.results.unmetCriteria && run.results.unmetCriteria.length > 0) {
50
- lines.push(`**Unmet Criteria**: ${run.results.unmetCriteria.join(", ")}`);
51
- }
52
- if (run.results.error) {
53
- lines.push(`**Error**: ${run.results.error}`);
54
- }
55
- lines.push(...formatEvaluations(run.results.evaluations));
60
+ lines.push(...resultLines(run.results));
56
61
  }
57
62
 
58
63
  if (run.messages && run.messages.length > 0) {
59
64
  lines.push("\n## Conversation");
60
65
  for (const msg of run.messages) {
61
- const content = msg.content.length > 300
62
- ? msg.content.slice(0, 300) + "..."
63
- : msg.content;
66
+ const content = msg.content.length > 300 ? msg.content.slice(0, 300) + "..." : msg.content;
64
67
  lines.push(`**[${msg.role}]**: ${content}`);
65
68
  }
66
69
  }
@@ -1,8 +1,5 @@
1
- import { getTestSuite as apiGetTestSuite } from "../langwatch-api-test-suites.js";
2
- import {
3
- formatEvaluatorAttachments,
4
- formatSuiteFields,
5
- } from "./format-suite-details.js";
1
+ import { getTestSuite as apiGetTestSuite } from "../langwatch-api-test-suites.ts";
2
+ import { formatEvaluatorAttachments, formatSuiteFields } from "./format-suite-details.ts";
6
3
 
7
4
  /**
8
5
  * Handles the platform_get_test_suite MCP tool invocation.
@@ -1,11 +1,9 @@
1
- import { getTraceById as apiGetTraceById } from "../langwatch-api.js";
2
- import { formatEvaluationLines } from "../utils/format-evaluations.js";
1
+ import { getTraceById as apiGetTraceById } from "../langwatch-api.ts";
2
+ import { formatEvaluationLines } from "../utils/format-evaluations.ts";
3
3
 
4
4
  /**
5
- * Handles the get_trace MCP tool invocation.
6
- *
7
- * Retrieves a single trace by ID. In digest mode (default), returns the
8
- * AI-readable formatted digest. In json mode, returns the full raw JSON.
5
+ * Handles the get_trace MCP tool: retrieves a trace by ID as an
6
+ * AI-readable digest (default) or full raw JSON.
9
7
  */
10
8
  export async function handleGetTrace(params: {
11
9
  traceId: string;
@@ -20,11 +18,20 @@ export async function handleGetTrace(params: {
20
18
 
21
19
  const lines: string[] = [];
22
20
  lines.push(`# Trace: ${params.traceId}\n`);
21
+ addTraceDigest(lines, result);
23
22
 
23
+ lines.push('\n> Tip: Use `get_trace` with `format: "json"` to get the full raw trace data.');
24
+
25
+ return lines.join("\n");
26
+ }
27
+
28
+ function addTraceDigest(
29
+ lines: string[],
30
+ result: Awaited<ReturnType<typeof apiGetTraceById>>,
31
+ ): void {
24
32
  if (result.timestamps) {
25
33
  lines.push(`**Started**: ${result.timestamps.started_at}`);
26
- if (result.timestamps.updated_at)
27
- lines.push(`**Updated**: ${result.timestamps.updated_at}`);
34
+ if (result.timestamps.updated_at) lines.push(`**Updated**: ${result.timestamps.updated_at}`);
28
35
  }
29
36
 
30
37
  if (result.metadata) {
@@ -39,13 +46,5 @@ export async function handleGetTrace(params: {
39
46
  lines.push("\n## Evaluations", ...formatEvaluationLines(result.evaluations));
40
47
  }
41
48
 
42
- if (result.formatted_trace) {
43
- lines.push(`\n## Trace Details\n${result.formatted_trace}`);
44
- }
45
-
46
- lines.push(
47
- '\n> Tip: Use `get_trace` with `format: "json"` to get the full raw trace data.'
48
- );
49
-
50
- return lines.join("\n");
49
+ if (result.formatted_trace) lines.push(`\n## Trace Details\n${result.formatted_trace}`);
51
50
  }
@@ -1,4 +1,4 @@
1
- import { getWorkflow as apiGetWorkflow } from "../langwatch-api-workflows.js";
1
+ import { getWorkflow as apiGetWorkflow } from "../langwatch-api-workflows.ts";
2
2
 
3
3
  export async function handleGetWorkflow(params: { id: string }): Promise<string> {
4
4
  const workflow = await apiGetWorkflow(params.id);
@@ -1,4 +1,4 @@
1
- import { listAgents as apiListAgents, type AgentSummary } from "../langwatch-api-agents.js";
1
+ import { listAgents as apiListAgents, type AgentSummary } from "../langwatch-api-agents.ts";
2
2
 
3
3
  /** Who a personal or host-scoped agent belongs to, empty for a shared one. */
4
4
  export const agentOwnerLabel = (agent: AgentSummary): string =>
@@ -0,0 +1,27 @@
1
+ import { listAnalyticsReports } from "../langwatch-api-analytics-reports.ts";
2
+
3
+ export async function handleListAnalyticsReports(): Promise<string> {
4
+ const result = await listAnalyticsReports();
5
+ const reports = result.data;
6
+
7
+ if (!Array.isArray(reports) || reports.length === 0) {
8
+ return "No Analytics Reports found in this project.\n\n> Tip: Use `platform_create_analytics_report` to create a new Analytics Report.";
9
+ }
10
+
11
+ const lines: string[] = [];
12
+ lines.push(`# Analytics Reports (${reports.length} total)\n`);
13
+
14
+ for (const report of reports) {
15
+ lines.push(`## ${report.name}`);
16
+ lines.push(`**ID**: ${report.id}`);
17
+ lines.push(`**Graphs**: ${report.graphCount}`);
18
+ lines.push(`**Updated**: ${report.updatedAt}`);
19
+ lines.push("");
20
+ }
21
+
22
+ lines.push(
23
+ "> Use `platform_get_analytics_report` with the ID to see the Analytics Report's details including graphs.",
24
+ );
25
+
26
+ return lines.join("\n");
27
+ }
@@ -1,11 +1,9 @@
1
1
  import {
2
2
  listAnnotations as apiListAnnotations,
3
3
  getAnnotationsByTrace as apiGetByTrace,
4
- } from "../langwatch-api-annotations.js";
4
+ } from "../langwatch-api-annotations.ts";
5
5
 
6
- export async function handleListAnnotations(params: {
7
- traceId?: string;
8
- }): Promise<string> {
6
+ export async function handleListAnnotations(params: { traceId?: string }): Promise<string> {
9
7
  const annotations = params.traceId
10
8
  ? await apiGetByTrace(params.traceId)
11
9
  : await apiListAnnotations();
@@ -20,7 +18,12 @@ export async function handleListAnnotations(params: {
20
18
  lines.push(`# Annotations (${annotations.length} total)\n`);
21
19
 
22
20
  for (const a of annotations) {
23
- const rating = a.isThumbsUp === true ? "👍" : a.isThumbsUp === false ? "👎" : "—";
21
+ let rating = "—";
22
+ if (a.isThumbsUp === true) {
23
+ rating = "👍";
24
+ } else if (a.isThumbsUp === false) {
25
+ rating = "👎";
26
+ }
24
27
  lines.push(`## Annotation ${a.id ?? "—"}`);
25
28
  lines.push(`**Trace ID**: ${a.traceId ?? "—"}`);
26
29
  lines.push(`**Rating**: ${rating}`);
@@ -1,4 +1,4 @@
1
- import { listApiKeys as apiListApiKeys } from "../langwatch-api-api-keys.js";
1
+ import { listApiKeys as apiListApiKeys } from "../langwatch-api-api-keys.ts";
2
2
 
3
3
  export async function handleListApiKeys(): Promise<string> {
4
4
  const result = await apiListApiKeys();
@@ -12,7 +12,12 @@ export async function handleListApiKeys(): Promise<string> {
12
12
  lines.push(`# API Keys (${keys.length} total)\n`);
13
13
 
14
14
  for (const k of keys) {
15
- const status = k.revokedAt ? "REVOKED" : k.expiresAt && new Date(k.expiresAt) < new Date() ? "EXPIRED" : "ACTIVE";
15
+ let status = "ACTIVE";
16
+ if (k.revokedAt) {
17
+ status = "REVOKED";
18
+ } else if (k.expiresAt && new Date(k.expiresAt) < new Date()) {
19
+ status = "EXPIRED";
20
+ }
16
21
  lines.push(`## ${k.name}`);
17
22
  lines.push(`**ID**: ${k.id}`);
18
23
  lines.push(`**Status**: ${status}`);
@@ -1,27 +1,26 @@
1
- import { listDashboards as apiListDashboards } from "../langwatch-api-dashboards.js";
1
+ /**
2
+ * The `list_dashboards` MCP tool: the dashboards a widget can be added to, with
3
+ * the id `add_dashboard_widget` and `update_dashboard_widget` take.
4
+ */
2
5
 
3
- export async function handleListDashboards(): Promise<string> {
4
- const result = await apiListDashboards();
5
- const dashboards = result.data;
6
-
7
- if (!Array.isArray(dashboards) || dashboards.length === 0) {
8
- return "No dashboards found in this project.\n\n> Tip: Use `platform_create_dashboard` to create a new dashboard.";
9
- }
6
+ import { listDashboards } from "../langwatch-api-dashboards.js";
10
7
 
11
- const lines: string[] = [];
12
- lines.push(`# Dashboards (${dashboards.length} total)\n`);
8
+ export async function handleListDashboards(): Promise<string> {
9
+ const { data: dashboards } = await listDashboards();
13
10
 
14
- for (const d of dashboards) {
15
- lines.push(`## ${d.name}`);
16
- lines.push(`**ID**: ${d.id}`);
17
- lines.push(`**Graphs**: ${d.graphCount}`);
18
- lines.push(`**Updated**: ${d.updatedAt}`);
19
- lines.push("");
11
+ if (dashboards.length === 0) {
12
+ return "No dashboards found in this project. Create one in the Dashboards area first.";
20
13
  }
21
14
 
22
- lines.push(
23
- "> Use `platform_get_dashboard` with the ID to see dashboard details including graphs.",
24
- );
25
-
26
- return lines.join("\n");
15
+ return [
16
+ `# Dashboards (${dashboards.length} total)\n`,
17
+ ...dashboards.flatMap((dashboard) => [
18
+ `## ${dashboard.name}`,
19
+ `**ID**: ${dashboard.id}`,
20
+ `**Widgets**: ${dashboard.widgetCount}`,
21
+ `**URL**: ${dashboard.platformUrl}`,
22
+ "",
23
+ ]),
24
+ "> Pass the ID to `add_dashboard_widget` to add a widget to that dashboard.",
25
+ ].join("\n");
27
26
  }
@@ -1,7 +1,5 @@
1
- import {
2
- listDatasetRecords as apiListDatasetRecords,
3
- } from "../langwatch-api-datasets.js";
4
- import { escapeMarkdown } from "../utils/escape-markdown.js";
1
+ import { listDatasetRecords as apiListDatasetRecords } from "../langwatch-api-datasets.ts";
2
+ import { escapeMarkdown } from "../utils/escape-markdown.ts";
5
3
 
6
4
  /**
7
5
  * Handles the platform_list_dataset_records MCP tool invocation.
@@ -31,7 +29,9 @@ export async function handleListDatasetRecords(params: {
31
29
  }
32
30
 
33
31
  const lines: string[] = [];
34
- lines.push(`# Records (page ${pagination.page} of ${pagination.totalPages}, ${pagination.total} total)\n`);
32
+ lines.push(
33
+ `# Records (page ${pagination.page} of ${pagination.totalPages}, ${pagination.total} total)\n`,
34
+ );
35
35
 
36
36
  for (const record of records) {
37
37
  lines.push(`**${escapeMarkdown(record.id)}**: ${escapeMarkdown(JSON.stringify(record.entry))}`);
@@ -39,7 +39,9 @@ export async function handleListDatasetRecords(params: {
39
39
 
40
40
  if (pagination.page < pagination.totalPages) {
41
41
  lines.push("");
42
- lines.push(`> Use \`platform_list_dataset_records\` with \`page: ${pagination.page + 1}\` to see the next page.`);
42
+ lines.push(
43
+ `> Use \`platform_list_dataset_records\` with \`page: ${pagination.page + 1}\` to see the next page.`,
44
+ );
43
45
  }
44
46
 
45
47
  return lines.join("\n");
@@ -1,15 +1,9 @@
1
- import {
2
- listDatasets as apiListDatasets,
3
- type DatasetSummary,
4
- } from "../langwatch-api-datasets.js";
5
- import { escapeMarkdown } from "../utils/escape-markdown.js";
1
+ import { listDatasets as apiListDatasets, type DatasetSummary } from "../langwatch-api-datasets.ts";
2
+ import { escapeMarkdown } from "../utils/escape-markdown.ts";
6
3
 
7
4
  /**
8
- * Fetches all datasets by paginating through the API until every page
9
- * has been retrieved.
10
- *
11
- * Returns the accumulated dataset summaries along with the total count
12
- * reported by the server.
5
+ * Fetches all datasets by paginating until every page is retrieved.
6
+ * Returns the accumulated summaries plus the total count from the server.
13
7
  */
14
8
  async function fetchAllDatasets(): Promise<{
15
9
  datasets: DatasetSummary[];
@@ -20,7 +14,6 @@ async function fetchAllDatasets(): Promise<{
20
14
  let page = 1;
21
15
  let total = 0;
22
16
 
23
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop until break
24
17
  while (true) {
25
18
  const response = await apiListDatasets({ page, limit: PAGE_SIZE });
26
19
  total = response.pagination.total;
@@ -36,14 +29,14 @@ async function fetchAllDatasets(): Promise<{
36
29
  }
37
30
 
38
31
  /**
39
- * Handles the platform_list_datasets MCP tool invocation.
40
- *
41
- * Lists all datasets in the LangWatch project, formatted as an
32
+ * Handles the platform_list_datasets MCP tool: lists datasets as an
42
33
  * AI-readable digest or raw JSON.
43
34
  */
44
- export async function handleListDatasets(params: {
45
- format?: "digest" | "json";
46
- } = {}): Promise<string> {
35
+ export async function handleListDatasets(
36
+ params: {
37
+ format?: "digest" | "json";
38
+ } = {},
39
+ ): Promise<string> {
47
40
  if (params.format === "json") {
48
41
  const { datasets, total } = await fetchAllDatasets();
49
42
  return JSON.stringify({ data: datasets, total }, null, 2);
@@ -66,15 +59,11 @@ export async function handleListDatasets(params: {
66
59
  const colNames = ds.columnTypes.map((c) => c.name).join(", ");
67
60
  lines.push(`**Columns**: ${colNames}`);
68
61
  }
69
- lines.push(
70
- `**Records**: ${ds.recordCount ?? "unknown"}`,
71
- );
62
+ lines.push(`**Records**: ${ds.recordCount ?? "unknown"}`);
72
63
  lines.push("");
73
64
  }
74
65
 
75
- lines.push(
76
- "> Use `platform_get_dataset` with the slug to see full dataset details and records.",
77
- );
66
+ lines.push("> Use `platform_get_dataset` with the slug to see full dataset details and records.");
78
67
 
79
68
  return lines.join("\n");
80
69
  }
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  listEvaluators as apiListEvaluators,
3
3
  getEvaluatorType,
4
- } from "../langwatch-api-evaluators.js";
4
+ } from "../langwatch-api-evaluators.ts";
5
5
 
6
6
  /**
7
- * Handles the platform_list_evaluators MCP tool invocation.
8
- *
9
- * Lists all evaluators in the LangWatch project, formatted as an
10
- * AI-readable digest.
7
+ * Handles the platform_list_evaluators MCP tool: lists evaluators in
8
+ * the project as an AI-readable digest.
11
9
  */
12
10
  export async function handleListEvaluators(): Promise<string> {
13
11
  const evaluators = await apiListEvaluators();
@@ -29,9 +27,7 @@ export async function handleListEvaluators(): Promise<string> {
29
27
  lines.push("");
30
28
  }
31
29
 
32
- lines.push(
33
- "> Use `platform_get_evaluator` with the ID or slug to see full evaluator details.",
34
- );
30
+ lines.push("> Use `platform_get_evaluator` with the ID or slug to see full evaluator details.");
35
31
 
36
32
  return lines.join("\n");
37
33
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "../langwatch-api.js";
1
+ import { makeRequest } from "../langwatch-api.ts";
2
2
 
3
3
  interface RunSummaryEvaluator {
4
4
  name: string;
@@ -52,12 +52,10 @@ const passRate = (evaluations: RunSummary["evaluations"]): string => {
52
52
  if (passed.length === 0) {
53
53
  const scored = entries.filter((e) => typeof e.averageScore === "number");
54
54
  if (scored.length === 0) return "—";
55
- const avg =
56
- scored.reduce((sum, e) => sum + (e.averageScore ?? 0), 0) / scored.length;
55
+ const avg = scored.reduce((sum, e) => sum + (e.averageScore ?? 0), 0) / scored.length;
57
56
  return `${avg.toFixed(2)} avg`;
58
57
  }
59
- const avg =
60
- passed.reduce((sum, e) => sum + (e.averagePassed ?? 0), 0) / passed.length;
58
+ const avg = passed.reduce((sum, e) => sum + (e.averagePassed ?? 0), 0) / passed.length;
61
59
  return `${(avg * 100).toFixed(0)}% pass`;
62
60
  };
63
61
 
@@ -72,9 +70,7 @@ export async function handleExperimentListRuns(params: {
72
70
  limit?: number;
73
71
  }): Promise<string> {
74
72
  const requested =
75
- typeof params.limit === "number" && params.limit > 0
76
- ? params.limit
77
- : DEFAULT_LIMIT;
73
+ typeof params.limit === "number" && params.limit > 0 ? params.limit : DEFAULT_LIMIT;
78
74
  const effectiveLimit = Math.min(requested, MAX_LIMIT);
79
75
 
80
76
  const search = new URLSearchParams();
@@ -85,7 +81,7 @@ export async function handleExperimentListRuns(params: {
85
81
  try {
86
82
  result = (await makeRequest(
87
83
  "GET",
88
- `/api/experiments/runs?${search.toString()}`,
84
+ `/api/v1/experiments/runs?${search.toString()}`,
89
85
  )) as ExperimentRunsListResponse;
90
86
  } catch (error) {
91
87
  const message = error instanceof Error ? error.message : String(error);
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "../langwatch-api.js";
1
+ import { makeRequest } from "../langwatch-api.ts";
2
2
 
3
3
  interface ExperimentSummary {
4
4
  id: string;
@@ -38,13 +38,9 @@ const escapeMarkdownTableCell = (value: string): string =>
38
38
  const formatInlineCode = (value: string): string =>
39
39
  `\`${value.replace(/[\\`|]/g, (c) => `\\${c}`).replace(/\n/g, " ")}\``;
40
40
 
41
- export async function handleExperimentList(params: {
42
- limit?: number;
43
- }): Promise<string> {
41
+ export async function handleExperimentList(params: { limit?: number }): Promise<string> {
44
42
  const requested =
45
- typeof params.limit === "number" && params.limit > 0
46
- ? params.limit
47
- : DEFAULT_LIMIT;
43
+ typeof params.limit === "number" && params.limit > 0 ? params.limit : DEFAULT_LIMIT;
48
44
  const effectiveLimit = Math.min(requested, MAX_LIMIT);
49
45
 
50
46
  const search = new URLSearchParams();
@@ -52,7 +48,7 @@ export async function handleExperimentList(params: {
52
48
 
53
49
  const result = (await makeRequest(
54
50
  "GET",
55
- `/api/experiments?${search.toString()}`,
51
+ `/api/v1/experiments?${search.toString()}`,
56
52
  )) as ExperimentListResponse;
57
53
 
58
54
  if (result.experiments.length === 0) {
@@ -88,8 +84,6 @@ export async function handleExperimentList(params: {
88
84
  }
89
85
 
90
86
  lines.push("");
91
- lines.push(
92
- "> Use `platform_experiment_list_runs` with one of these slugs to see its runs.",
93
- );
87
+ lines.push("> Use `platform_experiment_list_runs` with one of these slugs to see its runs.");
94
88
  return lines.join("\n");
95
89
  }
@@ -1,10 +1,8 @@
1
- import { listModelProviders as apiListModelProviders } from "../langwatch-api-model-providers.js";
1
+ import { listModelProviders as apiListModelProviders } from "../langwatch-api-model-providers.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_list_model_providers MCP tool invocation.
5
- *
6
- * Lists all model providers for the project, showing provider name,
7
- * enabled status, and which key fields are set (masked).
4
+ * Handles the platform_list_model_providers MCP tool: lists providers
5
+ * with name, enabled status, and which key fields are set (masked).
8
6
  */
9
7
  export async function handleListModelProviders(): Promise<string> {
10
8
  const providers = await apiListModelProviders();
@@ -1,4 +1,4 @@
1
- import { listProjects as apiListProjects } from "../langwatch-api-projects.js";
1
+ import { listProjects as apiListProjects } from "../langwatch-api-projects.ts";
2
2
 
3
3
  export async function handleListProjects(params?: {
4
4
  page?: number;
@@ -33,9 +33,7 @@ export async function handleListProjects(params?: {
33
33
  );
34
34
  }
35
35
 
36
- lines.push(
37
- "> Use `platform_get_project` with the ID to see full project details.",
38
- );
36
+ lines.push("> Use `platform_get_project` with the ID to see full project details.");
39
37
 
40
38
  return lines.join("\n");
41
39
  }
@@ -1,11 +1,11 @@
1
- import { listPromptTags as apiListPromptTags } from "../langwatch-api.js";
1
+ import { listPromptTags as apiListPromptTags } from "../langwatch-api.ts";
2
2
 
3
3
  export async function handleListPromptTags(): Promise<string> {
4
- const tags = (await apiListPromptTags()) as Array<{
4
+ const tags = (await apiListPromptTags()) as {
5
5
  id: string;
6
6
  name: string;
7
7
  createdAt?: string;
8
- }>;
8
+ }[];
9
9
 
10
10
  if (!tags || tags.length === 0) {
11
11
  return "No prompt tags found. The `latest` tag is always available.";
@@ -1,10 +1,8 @@
1
- import { listPrompts as apiListPrompts } from "../langwatch-api.js";
1
+ import { listPrompts as apiListPrompts } from "../langwatch-api.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_list_prompts MCP tool invocation.
5
- *
6
- * Lists all prompts in the LangWatch project, formatted as an
7
- * AI-readable markdown table.
4
+ * Handles the platform_list_prompts MCP tool: lists prompts in the
5
+ * project as an AI-readable markdown table.
8
6
  */
9
7
  export async function handleListPrompts(): Promise<string> {
10
8
  const prompts = await apiListPrompts();
@@ -26,9 +24,7 @@ export async function handleListPrompts(): Promise<string> {
26
24
  lines.push(`| ${handle} | ${name} | ${version} |`);
27
25
  }
28
26
 
29
- lines.push(
30
- "\n> Use `platform_get_prompt` with the handle or ID to see full prompt details."
31
- );
27
+ lines.push("\n> Use `platform_get_prompt` with the handle or ID to see full prompt details.");
32
28
 
33
29
  return lines.join("\n");
34
30
  }
@@ -1,5 +1,5 @@
1
- import { listRunPlans as apiListRunPlans } from "../langwatch-api-run-plans.js";
2
- import { describeRunPlanScope } from "./format-run-plan.js";
1
+ import { listRunPlans as apiListRunPlans } from "../langwatch-api-run-plans.ts";
2
+ import { describeRunPlanScope } from "./format-run-plan.ts";
3
3
 
4
4
  /**
5
5
  * Handles the platform_list_run_plans MCP tool invocation.
@@ -1,10 +1,8 @@
1
- import { listScenarios as apiListScenarios } from "../langwatch-api-scenarios.js";
1
+ import { listScenarios as apiListScenarios } from "../langwatch-api-scenarios.ts";
2
2
 
3
3
  /**
4
- * Handles the platform_list_scenarios MCP tool invocation.
5
- *
6
- * Lists all scenarios in the LangWatch project, formatted as an
7
- * AI-readable digest or raw JSON.
4
+ * Handles the platform_list_scenarios MCP tool: lists scenarios in the
5
+ * project as an AI-readable digest or raw JSON.
8
6
  */
9
7
  export async function handleListScenarios(params: {
10
8
  testSuiteId?: string;
@@ -35,23 +33,24 @@ export async function handleListScenarios(params: {
35
33
  for (const s of scenarios) {
36
34
  lines.push(`## ${s.name}`);
37
35
  lines.push(`**ID**: ${s.id}`);
38
- const preview =
39
- s.situation && s.situation.length > 60
40
- ? s.situation.slice(0, 60) + "..."
41
- : s.situation;
36
+ const preview = formatSituationPreview(s.situation);
42
37
  lines.push(`**Situation**: ${preview}`);
43
- lines.push(
44
- `**Criteria**: ${Array.isArray(s.criteria) ? s.criteria.length : 0} criteria`,
45
- );
38
+ lines.push(`**Criteria**: ${Array.isArray(s.criteria) ? s.criteria.length : 0} criteria`);
46
39
  if (Array.isArray(s.labels) && s.labels.length > 0) {
47
40
  lines.push(`**Labels**: ${s.labels.join(", ")}`);
48
41
  }
49
42
  lines.push("");
50
43
  }
51
44
 
52
- lines.push(
53
- "> Use `platform_get_scenario` with the ID to see full scenario details.",
54
- );
45
+ lines.push("> Use `platform_get_scenario` with the ID to see full scenario details.");
55
46
 
56
47
  return lines.join("\n");
57
48
  }
49
+
50
+ function formatSituationPreview(situation: string | undefined): string | undefined {
51
+ if (situation && situation.length > 60) {
52
+ return situation.slice(0, 60) + "...";
53
+ }
54
+
55
+ return situation;
56
+ }