@langwatch/mcp-server 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +280 -200
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +82 -52
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/archive-run-plan-65QN3XRX.js +16 -0
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/archive-test-suite-NKZDZY3D.js +16 -0
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/chunk-6YZUOD34.js +55 -0
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
  34. package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/chunk-O7EMWEVJ.js +44 -0
  38. package/dist/chunk-PTDR56Z3.js +37 -0
  39. package/dist/chunk-RABYBFX5.js +43 -0
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/chunk-U24EACC4.js +67 -0
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/chunk-VMWJD732.js +57 -0
  47. package/dist/chunk-XUIJYNRJ.js +15 -0
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -5
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
  77. package/dist/create-test-suite-4IPXVSFQ.js +37 -0
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/get-agent-OTIYUFZA.js +70 -0
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/get-prompt-OWXJZHQQ.js +95 -0
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/get-run-plan-BE3M2AUX.js +59 -0
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
  123. package/dist/get-test-suite-GC2O7YH6.js +49 -0
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
  131. package/dist/index.js +60221 -38077
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/list-agents-HVYWEQMI.js +43 -0
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/list-run-plans-PX2XI6EK.js +46 -0
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/list-scenarios-QZRPVHS4.js +46 -0
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/list-test-suites-N4WVLBKK.js +35 -0
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/rename-test-suite-4J7UX5S2.js +21 -0
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/report-issue-DCZFLGDO.js +899 -0
  188. package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/run-plan-PAARQSI4.js +39 -0
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/run-test-suite-SQJELEZX.js +26 -0
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/update-prompt-MY263DYF.js +141 -0
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
  222. package/package.json +39 -44
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +1021 -596
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +202 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +140 -0
  244. package/src/langwatch-api-scenarios.ts +17 -10
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +10 -7
  247. package/src/langwatch-api-test-suites.ts +116 -0
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +143 -109
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +76 -0
  255. package/src/schemas/suite-fields.ts +132 -0
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +10 -0
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +10 -0
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +11 -5
  274. package/src/tools/create-test-suite.ts +38 -0
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +86 -12
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +54 -0
  292. package/src/tools/format-scenario.ts +12 -0
  293. package/src/tools/format-suite-details.ts +90 -0
  294. package/src/tools/get-agent.ts +54 -3
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +100 -37
  302. package/src/tools/get-run-plan.ts +60 -0
  303. package/src/tools/get-scenario.ts +6 -5
  304. package/src/tools/get-simulation-run.ts +32 -20
  305. package/src/tools/get-test-suite.ts +46 -0
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +20 -3
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +47 -0
  323. package/src/tools/list-scenarios.ts +26 -17
  324. package/src/tools/list-simulation-runs.ts +13 -5
  325. package/src/tools/list-test-suites.ts +35 -0
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +15 -0
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +18 -0
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +65 -14
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +46 -0
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +27 -0
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +18 -0
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +185 -15
  350. package/src/tools/update-scenario.ts +11 -5
  351. package/src/tools/update-test-suite.ts +40 -0
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +19 -12
  359. package/uv.lock +416 -296
  360. package/vitest.integration.config.js +10 -0
  361. package/vitest.scenario.config.js +9 -0
  362. package/.eslintrc.cjs +0 -36
  363. package/dist/archive-suite-4T6BSRS7.js +0 -16
  364. package/dist/chunk-77BNWQ3U.js +0 -86
  365. package/dist/chunk-A2LEVYQ5.js +0 -217
  366. package/dist/chunk-TJCXFNDT.js +0 -24
  367. package/dist/chunk-YZLYHLLI.js +0 -48
  368. package/dist/config.d.ts +0 -17
  369. package/dist/create-mcp-server.d.ts +0 -10
  370. package/dist/create-suite-LZS6QIAF.js +0 -39
  371. package/dist/delete-evaluator-33SP2JFX.js +0 -16
  372. package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
  373. package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
  374. package/dist/get-agent-Y7MWZ65F.js +0 -29
  375. package/dist/get-analytics-TETCSOK6.js +0 -73
  376. package/dist/get-dataset-RCMU5VAH.js +0 -49
  377. package/dist/get-prompt-OY5B7TRI.js +0 -46
  378. package/dist/get-suite-J7JVWO6O.js +0 -45
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
  381. package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
  382. package/dist/list-agents-KFHKGPXV.js +0 -33
  383. package/dist/list-scenarios-F2WYNRIE.js +0 -41
  384. package/dist/list-suites-CRY4VWW6.js +0 -43
  385. package/dist/report-issue-XYVAPAYJ.js +0 -412
  386. package/dist/run-suite-NKZCJ2IN.js +0 -30
  387. package/dist/search-traces-A6HFKPLJ.js +0 -79
  388. package/dist/update-prompt-ODCRQRN6.js +0 -25
  389. package/dist/update-suite-SNO3GS7T.js +0 -40
  390. package/src/__tests__/all-tools.integration.test.ts +0 -1626
  391. package/src/__tests__/config.unit.test.ts +0 -202
  392. package/src/__tests__/datasets.integration.test.ts +0 -620
  393. package/src/__tests__/datasets.unit.test.ts +0 -244
  394. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  395. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  396. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  397. package/src/__tests__/docker.integration.test.ts +0 -318
  398. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  399. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  400. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  401. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  402. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  403. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  404. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  405. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  406. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  407. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  408. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  409. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  410. package/src/__tests__/http-transport.integration.test.ts +0 -395
  411. package/src/__tests__/integration.integration.test.ts +0 -288
  412. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  413. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  414. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  415. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  416. package/src/__tests__/report-issue.integration.test.ts +0 -147
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -188
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/support/http-server-harness.ts +0 -138
  421. package/src/__tests__/tools.unit.test.ts +0 -924
  422. package/src/langwatch-api-suites.ts +0 -118
  423. package/src/schemas/filter-fields.ts +0 -119
  424. package/src/schemas/index.ts +0 -4
  425. package/src/tools/archive-suite.ts +0 -12
  426. package/src/tools/create-suite.ts +0 -42
  427. package/src/tools/get-suite.ts +0 -47
  428. package/src/tools/list-suites.ts +0 -43
  429. package/src/tools/run-suite.ts +0 -28
  430. package/src/tools/update-suite.ts +0 -44
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { LangWatchApiError, makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  // --- Dataset types ---
4
4
 
@@ -40,6 +40,10 @@ export interface DatasetDetailResponse {
40
40
  createdAt: string;
41
41
  updatedAt: string;
42
42
  data: DatasetRecord[];
43
+ /** Records in the dataset, when `data` is a preview of them. */
44
+ totalRecords?: number;
45
+ /** Records of the dataset left out of `data`. */
46
+ omittedRecords?: number;
43
47
  }
44
48
 
45
49
  export interface DatasetMutationResponse {
@@ -72,8 +76,16 @@ export interface DatasetRecordListResponse {
72
76
  limit: number;
73
77
  totalPages: number;
74
78
  };
79
+ /** The dataset the page belongs to. Absent on servers that do not send it. */
80
+ dataset?: DatasetMutationResponse;
75
81
  }
76
82
 
83
+ /** The most records a dataset preview holds. */
84
+ export const DATASET_PREVIEW_MAX_RECORDS = 100;
85
+
86
+ /** The most bytes of records a dataset preview holds. */
87
+ export const DATASET_PREVIEW_MAX_BYTES = 1024 * 1024;
88
+
77
89
  // --- Dataset API functions ---
78
90
 
79
91
  /** Lists all datasets in the project (paginated). */
@@ -85,18 +97,82 @@ export async function listDatasets(params?: {
85
97
  if (params?.page != null) query.set("page", String(params.page));
86
98
  if (params?.limit != null) query.set("limit", String(params.limit));
87
99
  const qs = query.toString();
88
- const path = qs ? `/api/dataset?${qs}` : "/api/dataset";
100
+ const path = qs ? `/api/v1/dataset?${qs}` : "/api/v1/dataset";
89
101
  return makeRequest("GET", path) as Promise<DatasetListResponse>;
90
102
  }
91
103
 
92
- /** Retrieves a single dataset by slug or ID, including records. */
93
- export async function getDataset(
94
- slugOrId: string,
95
- ): Promise<DatasetDetailResponse> {
96
- return makeRequest(
97
- "GET",
98
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
99
- ) as Promise<DatasetDetailResponse>;
104
+ /**
105
+ * Retrieves a dataset by slug or ID with a preview of its records: the first page, cut at
106
+ * `DATASET_PREVIEW_MAX_RECORDS` records and `DATASET_PREVIEW_MAX_BYTES` bytes. A dataset of
107
+ * any size can be read this way. `omittedRecords` counts what the preview leaves out.
108
+ */
109
+ export async function getDataset(slugOrId: string): Promise<DatasetDetailResponse> {
110
+ const page = await readPreviewPage(slugOrId);
111
+ // A server without the records endpoint, or one that sends no dataset with a page, is
112
+ // asked for the whole dataset in one response.
113
+ if (!page?.dataset) {
114
+ return makeRequest(
115
+ "GET",
116
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
117
+ ) as Promise<DatasetDetailResponse>;
118
+ }
119
+
120
+ const data: DatasetRecord[] = [];
121
+ let bytes = 0;
122
+ for (const record of page.data) {
123
+ bytes += JSON.stringify(record).length;
124
+ if (bytes > DATASET_PREVIEW_MAX_BYTES) break;
125
+ data.push(record);
126
+ }
127
+
128
+ const { id, name, slug, columnTypes, createdAt, updatedAt } = page.dataset;
129
+ const totalRecords = page.pagination.total;
130
+ return {
131
+ id,
132
+ name,
133
+ slug,
134
+ columnTypes,
135
+ createdAt,
136
+ updatedAt,
137
+ data,
138
+ totalRecords,
139
+ omittedRecords: Math.max(0, totalRecords - data.length),
140
+ };
141
+ }
142
+
143
+ /**
144
+ * The first page of a dataset's records, or `null` when the records endpoint answers 404. A
145
+ * page refused as too large is asked for again with the size the refusal suggests, or half.
146
+ */
147
+ async function readPreviewPage(slugOrId: string): Promise<DatasetRecordListResponse | null> {
148
+ let limit = DATASET_PREVIEW_MAX_RECORDS;
149
+ for (;;) {
150
+ try {
151
+ return await listDatasetRecords({ slugOrId, page: 1, limit });
152
+ } catch (error) {
153
+ if (!(error instanceof LangWatchApiError)) throw error;
154
+ if (error.status === 404) return null;
155
+ if (error.status !== 413 || limit <= 1) throw error;
156
+ limit = smallerLimit(limit, error.responseBody);
157
+ }
158
+ }
159
+ }
160
+
161
+ /** The page size a `dataset_page_too_large` refusal suggests, or half the refused one. */
162
+ function smallerLimit(limit: number, responseBody: string): number {
163
+ const half = Math.max(1, Math.floor(limit / 2));
164
+ try {
165
+ const suggested: unknown = (JSON.parse(responseBody) as { meta?: { suggestedLimit?: unknown } })
166
+ .meta?.suggestedLimit;
167
+ const usable =
168
+ typeof suggested === "number" &&
169
+ Number.isInteger(suggested) &&
170
+ suggested >= 1 &&
171
+ suggested < limit;
172
+ return usable ? suggested : half;
173
+ } catch {
174
+ return half;
175
+ }
100
176
  }
101
177
 
102
178
  /** Creates a new dataset. */
@@ -104,11 +180,7 @@ export async function createDataset(data: {
104
180
  name: string;
105
181
  columnTypes?: DatasetColumnType[];
106
182
  }): Promise<DatasetMutationResponse> {
107
- return makeRequest(
108
- "POST",
109
- "/api/dataset",
110
- data,
111
- ) as Promise<DatasetMutationResponse>;
183
+ return makeRequest("POST", "/api/v1/dataset", data) as Promise<DatasetMutationResponse>;
112
184
  }
113
185
 
114
186
  /** Updates an existing dataset by slug or ID. */
@@ -120,18 +192,16 @@ export async function updateDataset(params: {
120
192
  const { slugOrId, ...data } = params;
121
193
  return makeRequest(
122
194
  "PATCH",
123
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
195
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
124
196
  data,
125
197
  ) as Promise<DatasetMutationResponse>;
126
198
  }
127
199
 
128
200
  /** Archives (soft-deletes) a dataset by slug or ID. */
129
- export async function deleteDataset(
130
- slugOrId: string,
131
- ): Promise<DatasetArchiveResponse> {
201
+ export async function deleteDataset(slugOrId: string): Promise<DatasetArchiveResponse> {
132
202
  return makeRequest(
133
203
  "DELETE",
134
- `/api/dataset/${encodeURIComponent(slugOrId)}`,
204
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
135
205
  ) as Promise<DatasetArchiveResponse>;
136
206
  }
137
207
 
@@ -141,11 +211,9 @@ export async function createDatasetRecords(params: {
141
211
  entries: Record<string, unknown>[];
142
212
  }): Promise<BatchCreateRecordsResponse> {
143
213
  const { slugOrId, entries } = params;
144
- return makeRequest(
145
- "POST",
146
- `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
147
- { entries },
148
- ) as Promise<BatchCreateRecordsResponse>;
214
+ return makeRequest("POST", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
215
+ entries,
216
+ }) as Promise<BatchCreateRecordsResponse>;
149
217
  }
150
218
 
151
219
  /** Updates or creates a single record in a dataset. */
@@ -157,7 +225,7 @@ export async function updateDatasetRecord(params: {
157
225
  const { slugOrId, recordId, entry } = params;
158
226
  return makeRequest(
159
227
  "PATCH",
160
- `/api/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
228
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
161
229
  { entry },
162
230
  ) as Promise<DatasetRecord>;
163
231
  }
@@ -168,11 +236,9 @@ export async function deleteDatasetRecords(params: {
168
236
  recordIds: string[];
169
237
  }): Promise<DeleteRecordsResponse> {
170
238
  const { slugOrId, recordIds } = params;
171
- return makeRequest(
172
- "DELETE",
173
- `/api/dataset/${encodeURIComponent(slugOrId)}/records`,
174
- { recordIds },
175
- ) as Promise<DeleteRecordsResponse>;
239
+ return makeRequest("DELETE", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
240
+ recordIds,
241
+ }) as Promise<DeleteRecordsResponse>;
176
242
  }
177
243
 
178
244
  /** Lists records in a dataset (paginated). */
@@ -186,6 +252,6 @@ export async function listDatasetRecords(params: {
186
252
  if (params.page != null) query.set("page", String(params.page));
187
253
  if (params.limit != null) query.set("limit", String(params.limit));
188
254
  const qs = query.toString();
189
- const path = `/api/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
255
+ const path = `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
190
256
  return makeRequest("GET", path) as Promise<DatasetRecordListResponse>;
191
257
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  // --- Evaluator types ---
4
4
 
@@ -13,8 +13,8 @@ export interface EvaluatorSummary {
13
13
  copiedFromEvaluatorId: string | null;
14
14
  createdAt: string;
15
15
  updatedAt: string;
16
- fields: Array<{ identifier: string; type: string; optional?: boolean }>;
17
- outputFields: Array<{ identifier: string; type: string; optional?: boolean }>;
16
+ fields: { identifier: string; type: string; optional?: boolean }[];
17
+ outputFields: { identifier: string; type: string; optional?: boolean }[];
18
18
  workflowName?: string;
19
19
  workflowIcon?: string;
20
20
  }
@@ -25,25 +25,22 @@ export interface EvaluatorSummary {
25
25
  * Extracts the evaluatorType from an evaluator's config.
26
26
  * Centralises the cast so callers don't repeat it.
27
27
  */
28
- export function getEvaluatorType(
29
- evaluator: Pick<EvaluatorSummary, "config">,
30
- ): string | undefined {
31
- return (evaluator.config as Record<string, unknown> | null)
32
- ?.evaluatorType as string | undefined;
28
+ export function getEvaluatorType(evaluator: Pick<EvaluatorSummary, "config">): string | undefined {
29
+ return (evaluator.config as Record<string, unknown> | null)?.evaluatorType as string | undefined;
33
30
  }
34
31
 
35
32
  // --- Evaluator API functions ---
36
33
 
37
34
  /** Lists all evaluators in the project. */
38
35
  export async function listEvaluators(): Promise<EvaluatorSummary[]> {
39
- return makeRequest("GET", "/api/evaluators") as Promise<EvaluatorSummary[]>;
36
+ return makeRequest("GET", "/api/v1/evaluators") as Promise<EvaluatorSummary[]>;
40
37
  }
41
38
 
42
39
  /** Retrieves a single evaluator by ID or slug. */
43
40
  export async function getEvaluator(idOrSlug: string): Promise<EvaluatorSummary> {
44
41
  return makeRequest(
45
42
  "GET",
46
- `/api/evaluators/${encodeURIComponent(idOrSlug)}`,
43
+ `/api/v1/evaluators/${encodeURIComponent(idOrSlug)}`,
47
44
  ) as Promise<EvaluatorSummary>;
48
45
  }
49
46
 
@@ -52,7 +49,7 @@ export async function createEvaluator(data: {
52
49
  name: string;
53
50
  config: Record<string, unknown>;
54
51
  }): Promise<EvaluatorSummary> {
55
- return makeRequest("POST", "/api/evaluators", data) as Promise<EvaluatorSummary>;
52
+ return makeRequest("POST", "/api/v1/evaluators", data) as Promise<EvaluatorSummary>;
56
53
  }
57
54
 
58
55
  /** Updates an existing evaluator. */
@@ -64,17 +61,14 @@ export async function updateEvaluator(params: {
64
61
  const { id, ...data } = params;
65
62
  return makeRequest(
66
63
  "PUT",
67
- `/api/evaluators/${encodeURIComponent(id)}`,
64
+ `/api/v1/evaluators/${encodeURIComponent(id)}`,
68
65
  data,
69
66
  ) as Promise<EvaluatorSummary>;
70
67
  }
71
68
 
72
69
  /** Archives (soft-deletes) an evaluator. */
73
- export async function deleteEvaluator(
74
- idOrSlug: string,
75
- ): Promise<{ id: string; archived: boolean }> {
76
- return makeRequest(
77
- "DELETE",
78
- `/api/evaluators/${encodeURIComponent(idOrSlug)}`,
79
- ) as Promise<{ id: string; archived: boolean }>;
70
+ export async function deleteEvaluator(idOrSlug: string): Promise<{ success: boolean }> {
71
+ return makeRequest("DELETE", `/api/v1/evaluators/${encodeURIComponent(idOrSlug)}`) as Promise<{
72
+ success: boolean;
73
+ }>;
80
74
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  // --- Model Provider types ---
4
4
 
@@ -13,14 +13,14 @@ export interface ModelProviderEntry {
13
13
  customEmbeddingsModels?: unknown[] | null;
14
14
  disabledByDefault?: boolean;
15
15
  deploymentMapping?: unknown;
16
- extraHeaders?: Array<{ key: string; value: string }> | null;
16
+ extraHeaders?: { key: string; value: string }[] | null;
17
17
  }
18
18
 
19
19
  // --- Model Provider API functions ---
20
20
 
21
21
  /** Lists all model providers for the project, with masked API keys. */
22
22
  export async function listModelProviders(): Promise<Record<string, ModelProviderEntry>> {
23
- return makeRequest("GET", "/api/model-providers") as Promise<
23
+ return makeRequest("GET", "/api/v1/model-providers") as Promise<
24
24
  Record<string, ModelProviderEntry>
25
25
  >;
26
26
  }
@@ -35,7 +35,7 @@ export async function setModelProvider(params: {
35
35
  const { provider, ...data } = params;
36
36
  return makeRequest(
37
37
  "PUT",
38
- `/api/model-providers/${encodeURIComponent(provider)}`,
38
+ `/api/v1/model-providers/${encodeURIComponent(provider)}`,
39
39
  data,
40
40
  ) as Promise<Record<string, ModelProviderEntry>>;
41
41
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface MonitorSummary {
4
4
  id: string;
@@ -19,13 +19,13 @@ export interface MonitorSummary {
19
19
  }
20
20
 
21
21
  export async function listMonitors(): Promise<MonitorSummary[]> {
22
- return makeRequest("GET", "/api/monitors") as Promise<MonitorSummary[]>;
22
+ return makeRequest("GET", "/api/v1/monitors") as Promise<MonitorSummary[]>;
23
23
  }
24
24
 
25
25
  export async function getMonitor(id: string): Promise<MonitorSummary> {
26
26
  return makeRequest(
27
27
  "GET",
28
- `/api/monitors/${encodeURIComponent(id)}`
28
+ `/api/v1/monitors/${encodeURIComponent(id)}`,
29
29
  ) as Promise<MonitorSummary>;
30
30
  }
31
31
 
@@ -38,7 +38,7 @@ export async function createMonitor(data: {
38
38
  level?: string;
39
39
  parameters?: Record<string, unknown>;
40
40
  }): Promise<MonitorSummary> {
41
- return makeRequest("POST", "/api/monitors", {
41
+ return makeRequest("POST", "/api/v1/monitors", {
42
42
  ...data,
43
43
  preconditions: [],
44
44
  parameters: data.parameters ?? {},
@@ -56,8 +56,8 @@ export async function updateMonitor(params: {
56
56
  const { id, ...data } = params;
57
57
  return makeRequest(
58
58
  "PATCH",
59
- `/api/monitors/${encodeURIComponent(id)}`,
60
- data
59
+ `/api/v1/monitors/${encodeURIComponent(id)}`,
60
+ data,
61
61
  ) as Promise<MonitorSummary>;
62
62
  }
63
63
 
@@ -65,18 +65,14 @@ export async function toggleMonitor(params: {
65
65
  id: string;
66
66
  enabled: boolean;
67
67
  }): Promise<{ id: string; enabled: boolean }> {
68
- return makeRequest(
69
- "POST",
70
- `/api/monitors/${encodeURIComponent(params.id)}/toggle`,
71
- { enabled: params.enabled }
72
- ) as Promise<{ id: string; enabled: boolean }>;
68
+ return makeRequest("POST", `/api/v1/monitors/${encodeURIComponent(params.id)}/toggle`, {
69
+ enabled: params.enabled,
70
+ }) as Promise<{ id: string; enabled: boolean }>;
73
71
  }
74
72
 
75
- export async function deleteMonitor(
76
- id: string
77
- ): Promise<{ id: string; deleted: boolean }> {
78
- return makeRequest(
79
- "DELETE",
80
- `/api/monitors/${encodeURIComponent(id)}`
81
- ) as Promise<{ id: string; deleted: boolean }>;
73
+ export async function deleteMonitor(id: string): Promise<{ id: string; deleted: boolean }> {
74
+ return makeRequest("DELETE", `/api/v1/monitors/${encodeURIComponent(id)}`) as Promise<{
75
+ id: string;
76
+ deleted: boolean;
77
+ }>;
82
78
  }
@@ -1,4 +1,4 @@
1
- import { makeRequest } from "./langwatch-api.js";
1
+ import { makeRequest } from "./langwatch-api.ts";
2
2
 
3
3
  export interface ProjectSummary {
4
4
  id: string;
@@ -35,16 +35,33 @@ export async function listProjects(params?: {
35
35
  if (params?.page) query.set("page", String(params.page));
36
36
  if (params?.limit) query.set("limit", String(params.limit));
37
37
  const qs = query.toString() ? `?${query}` : "";
38
- return makeRequest("GET", `/api/projects${qs}`) as Promise<ProjectListResponse>;
38
+ return makeRequest("GET", `/api/v1/projects${qs}`) as Promise<ProjectListResponse>;
39
39
  }
40
40
 
41
41
  export async function getProject(id: string): Promise<ProjectSummary> {
42
42
  return makeRequest(
43
43
  "GET",
44
- `/api/projects/${encodeURIComponent(id)}`,
44
+ `/api/v1/projects/${encodeURIComponent(id)}`,
45
45
  ) as Promise<ProjectSummary>;
46
46
  }
47
47
 
48
+ /** Identity of the project the calling API key belongs to. */
49
+ export interface CurrentProjectIdentity {
50
+ id: string;
51
+ name: string;
52
+ slug: string;
53
+ isPersonal: boolean;
54
+ }
55
+
56
+ /**
57
+ * Resolves the project behind the configured API key. Needed for the
58
+ * `/api/v1/projects/:projectId/...` route family, whose path must name the
59
+ * caller's own project — there is no "current project" shorthand there.
60
+ */
61
+ export async function getCurrentProject(): Promise<CurrentProjectIdentity> {
62
+ return makeRequest("GET", "/api/v1/me/project") as Promise<CurrentProjectIdentity>;
63
+ }
64
+
48
65
  export async function createProject(data: {
49
66
  name: string;
50
67
  language: string;
@@ -52,7 +69,7 @@ export async function createProject(data: {
52
69
  teamId?: string;
53
70
  newTeamName?: string;
54
71
  }): Promise<ProjectCreateResponse> {
55
- return makeRequest("POST", "/api/projects", data) as Promise<ProjectCreateResponse>;
72
+ return makeRequest("POST", "/api/v1/projects", data) as Promise<ProjectCreateResponse>;
56
73
  }
57
74
 
58
75
  export async function updateProject(params: {
@@ -65,7 +82,7 @@ export async function updateProject(params: {
65
82
  const { id, ...data } = params;
66
83
  return makeRequest(
67
84
  "PATCH",
68
- `/api/projects/${encodeURIComponent(id)}`,
85
+ `/api/v1/projects/${encodeURIComponent(id)}`,
69
86
  data,
70
87
  ) as Promise<ProjectSummary>;
71
88
  }
@@ -75,8 +92,9 @@ export async function archiveProject(id: string): Promise<{
75
92
  name: string;
76
93
  archivedAt: string;
77
94
  }> {
78
- return makeRequest(
79
- "DELETE",
80
- `/api/projects/${encodeURIComponent(id)}`,
81
- ) as Promise<{ id: string; name: string; archivedAt: string }>;
95
+ return makeRequest("DELETE", `/api/v1/projects/${encodeURIComponent(id)}`) as Promise<{
96
+ id: string;
97
+ name: string;
98
+ archivedAt: string;
99
+ }>;
82
100
  }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * The query family: the analytics SQL door and the reference describing both query languages.
3
+ * Fetched, replacing a hand-copied field list that drifted, so this server cannot describe a
4
+ * missing field.
5
+ * @see specs/mcp-server/schema-discovery.feature
6
+ */
7
+
8
+ import { makeRequest } from "./langwatch-api.ts";
9
+
10
+ /** One column of a query result. */
11
+ export interface QueryResultColumn {
12
+ name: string;
13
+ type: string;
14
+ }
15
+
16
+ /** What `POST /api/v1/query` answers with. */
17
+ export interface QueryRunResponse {
18
+ columns: QueryResultColumn[];
19
+ rows: Record<string, unknown>[];
20
+ statistics: {
21
+ elapsedMs: number;
22
+ rowsRead: number;
23
+ bytesRead: number;
24
+ rowsReturned: number;
25
+ };
26
+ truncated: boolean;
27
+ diagnostics: { code: string; message: string }[];
28
+ }
29
+
30
+ /** One published dataset. */
31
+ export interface QueryReferenceView {
32
+ name: string;
33
+ description: string;
34
+ grain: string;
35
+ joinKeys: string[];
36
+ timeColumn: string;
37
+ freshness: string;
38
+ columns: {
39
+ name: string;
40
+ type: string;
41
+ description: string;
42
+ unit: string | null;
43
+ gates: string[];
44
+ available: boolean;
45
+ }[];
46
+ exampleSql: string;
47
+ }
48
+
49
+ /** One worked query, in either language. */
50
+ export interface QueryReferenceExample {
51
+ id: string;
52
+ title: string;
53
+ intent: string;
54
+ language: "lwql" | "trace-filter";
55
+ tags: string[];
56
+ text: string;
57
+ parameters: { name: string; type: string; description: string }[];
58
+ requires: { gates: string[]; functions: string[] };
59
+ available: boolean;
60
+ notes?: string;
61
+ }
62
+
63
+ /** What `GET /api/v1/query/reference` answers with. */
64
+ export interface QueryReferenceResponse {
65
+ version: string;
66
+ lwql: {
67
+ enabled: boolean;
68
+ schema: { database: string; views: QueryReferenceView[] };
69
+ limits: {
70
+ maxStatementLength: number;
71
+ maxRowsReturned: number;
72
+ maxResultBytes: number;
73
+ maxExecutionTimeSeconds: number;
74
+ pagination: string;
75
+ };
76
+ endpoints: { method: string; path: string; description: string }[];
77
+ };
78
+ traceFilter: {
79
+ syntax: string;
80
+ fields: {
81
+ name: string;
82
+ label: string;
83
+ valueType: string;
84
+ group: string | null;
85
+ facetable: boolean;
86
+ knownValues: string[];
87
+ }[];
88
+ dynamicPrefixes: {
89
+ prefix: string;
90
+ label: string;
91
+ description: string;
92
+ aliases: string[];
93
+ }[];
94
+ endpoints: { method: string; path: string; description: string }[];
95
+ };
96
+ examples: QueryReferenceExample[];
97
+ decisionTable: { when: string; use: string; why: string }[];
98
+ }
99
+
100
+ /** Runs one read-only LangWatchQL statement, as written. */
101
+ export async function runQuery(params: {
102
+ sql: string;
103
+ parameters?: Record<string, string | number | boolean | null>;
104
+ }): Promise<QueryRunResponse> {
105
+ return makeRequest("POST", "/api/v1/query", {
106
+ sql: params.sql,
107
+ ...(params.parameters ? { parameters: params.parameters } : {}),
108
+ }) as Promise<QueryRunResponse>;
109
+ }
110
+
111
+ /** Reads the query reference: both languages, their fields and worked examples. */
112
+ export async function getQueryReference(): Promise<QueryReferenceResponse> {
113
+ return makeRequest("GET", "/api/v1/query/reference") as Promise<QueryReferenceResponse>;
114
+ }