@langwatch/mcp-server 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +280 -200
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +82 -52
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/archive-run-plan-65QN3XRX.js +16 -0
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/archive-test-suite-NKZDZY3D.js +16 -0
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/chunk-6YZUOD34.js +55 -0
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
  34. package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/chunk-O7EMWEVJ.js +44 -0
  38. package/dist/chunk-PTDR56Z3.js +37 -0
  39. package/dist/chunk-RABYBFX5.js +43 -0
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/chunk-U24EACC4.js +67 -0
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/chunk-VMWJD732.js +57 -0
  47. package/dist/chunk-XUIJYNRJ.js +15 -0
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -5
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
  77. package/dist/create-test-suite-4IPXVSFQ.js +37 -0
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/get-agent-OTIYUFZA.js +70 -0
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/get-prompt-OWXJZHQQ.js +95 -0
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/get-run-plan-BE3M2AUX.js +59 -0
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
  123. package/dist/get-test-suite-GC2O7YH6.js +49 -0
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
  131. package/dist/index.js +60221 -38077
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/list-agents-HVYWEQMI.js +43 -0
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/list-run-plans-PX2XI6EK.js +46 -0
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/list-scenarios-QZRPVHS4.js +46 -0
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/list-test-suites-N4WVLBKK.js +35 -0
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/rename-test-suite-4J7UX5S2.js +21 -0
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/report-issue-DCZFLGDO.js +899 -0
  188. package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/run-plan-PAARQSI4.js +39 -0
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/run-test-suite-SQJELEZX.js +26 -0
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/update-prompt-MY263DYF.js +141 -0
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
  222. package/package.json +39 -44
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +1021 -596
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +202 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +140 -0
  244. package/src/langwatch-api-scenarios.ts +17 -10
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +10 -7
  247. package/src/langwatch-api-test-suites.ts +116 -0
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +143 -109
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +76 -0
  255. package/src/schemas/suite-fields.ts +132 -0
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +10 -0
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +10 -0
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +11 -5
  274. package/src/tools/create-test-suite.ts +38 -0
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +86 -12
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +54 -0
  292. package/src/tools/format-scenario.ts +12 -0
  293. package/src/tools/format-suite-details.ts +90 -0
  294. package/src/tools/get-agent.ts +54 -3
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +100 -37
  302. package/src/tools/get-run-plan.ts +60 -0
  303. package/src/tools/get-scenario.ts +6 -5
  304. package/src/tools/get-simulation-run.ts +32 -20
  305. package/src/tools/get-test-suite.ts +46 -0
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +20 -3
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +47 -0
  323. package/src/tools/list-scenarios.ts +26 -17
  324. package/src/tools/list-simulation-runs.ts +13 -5
  325. package/src/tools/list-test-suites.ts +35 -0
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +15 -0
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +18 -0
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +65 -14
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +46 -0
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +27 -0
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +18 -0
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +185 -15
  350. package/src/tools/update-scenario.ts +11 -5
  351. package/src/tools/update-test-suite.ts +40 -0
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +19 -12
  359. package/uv.lock +416 -296
  360. package/vitest.integration.config.js +10 -0
  361. package/vitest.scenario.config.js +9 -0
  362. package/.eslintrc.cjs +0 -36
  363. package/dist/archive-suite-4T6BSRS7.js +0 -16
  364. package/dist/chunk-77BNWQ3U.js +0 -86
  365. package/dist/chunk-A2LEVYQ5.js +0 -217
  366. package/dist/chunk-TJCXFNDT.js +0 -24
  367. package/dist/chunk-YZLYHLLI.js +0 -48
  368. package/dist/config.d.ts +0 -17
  369. package/dist/create-mcp-server.d.ts +0 -10
  370. package/dist/create-suite-LZS6QIAF.js +0 -39
  371. package/dist/delete-evaluator-33SP2JFX.js +0 -16
  372. package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
  373. package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
  374. package/dist/get-agent-Y7MWZ65F.js +0 -29
  375. package/dist/get-analytics-TETCSOK6.js +0 -73
  376. package/dist/get-dataset-RCMU5VAH.js +0 -49
  377. package/dist/get-prompt-OY5B7TRI.js +0 -46
  378. package/dist/get-suite-J7JVWO6O.js +0 -45
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
  381. package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
  382. package/dist/list-agents-KFHKGPXV.js +0 -33
  383. package/dist/list-scenarios-F2WYNRIE.js +0 -41
  384. package/dist/list-suites-CRY4VWW6.js +0 -43
  385. package/dist/report-issue-XYVAPAYJ.js +0 -412
  386. package/dist/run-suite-NKZCJ2IN.js +0 -30
  387. package/dist/search-traces-A6HFKPLJ.js +0 -79
  388. package/dist/update-prompt-ODCRQRN6.js +0 -25
  389. package/dist/update-suite-SNO3GS7T.js +0 -40
  390. package/src/__tests__/all-tools.integration.test.ts +0 -1626
  391. package/src/__tests__/config.unit.test.ts +0 -202
  392. package/src/__tests__/datasets.integration.test.ts +0 -620
  393. package/src/__tests__/datasets.unit.test.ts +0 -244
  394. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  395. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  396. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  397. package/src/__tests__/docker.integration.test.ts +0 -318
  398. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  399. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  400. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  401. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  402. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  403. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  404. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  405. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  406. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  407. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  408. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  409. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  410. package/src/__tests__/http-transport.integration.test.ts +0 -395
  411. package/src/__tests__/integration.integration.test.ts +0 -288
  412. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  413. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  414. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  415. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  416. package/src/__tests__/report-issue.integration.test.ts +0 -147
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -188
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/support/http-server-harness.ts +0 -138
  421. package/src/__tests__/tools.unit.test.ts +0 -924
  422. package/src/langwatch-api-suites.ts +0 -118
  423. package/src/schemas/filter-fields.ts +0 -119
  424. package/src/schemas/index.ts +0 -4
  425. package/src/tools/archive-suite.ts +0 -12
  426. package/src/tools/create-suite.ts +0 -42
  427. package/src/tools/get-suite.ts +0 -47
  428. package/src/tools/list-suites.ts +0 -43
  429. package/src/tools/run-suite.ts +0 -28
  430. package/src/tools/update-suite.ts +0 -44
@@ -0,0 +1,140 @@
1
+ import {
2
+ getPrompt,
3
+ getPromptVersions,
4
+ updatePrompt
5
+ } from "./chunk-UWLE5T2F.js";
6
+ import "./chunk-H6WGMG2T.js";
7
+
8
+ // src/tools/update-prompt.ts
9
+ async function handleUpdatePrompt(params) {
10
+ const { idOrHandle, ...data } = params;
11
+ let updated;
12
+ try {
13
+ updated = await updatePrompt(idOrHandle, data);
14
+ } catch (err) {
15
+ if (params.tags && params.tags.length > 0) {
16
+ return renderTagFailure({ idOrHandle, params });
17
+ }
18
+ throw err;
19
+ }
20
+ return renderUpdateSuccess({ idOrHandle, params, updated });
21
+ }
22
+ async function identifyNewVersion({
23
+ idOrHandle,
24
+ prompt,
25
+ commitMessage
26
+ }) {
27
+ if (prompt.commitMessage === commitMessage) {
28
+ return { version: prompt.version, versionId: prompt.versionId };
29
+ }
30
+ try {
31
+ const versions = await getPromptVersions(idOrHandle);
32
+ const match = (Array.isArray(versions) ? versions : []).find(
33
+ (v) => v.commitMessage === commitMessage
34
+ );
35
+ if (match) return { version: match.version, versionId: match.versionId };
36
+ } catch {
37
+ }
38
+ return void 0;
39
+ }
40
+ function deploymentTagsOf(prompt) {
41
+ return (prompt.tags ?? []).filter((tag) => tag?.name !== "latest");
42
+ }
43
+ function deploymentLines({
44
+ prompt,
45
+ newVersion
46
+ }) {
47
+ const allDeployments = deploymentTagsOf(prompt);
48
+ const newTags = allDeployments.filter((tag) => newVersion.versionId != null && tag.versionId === newVersion.versionId).map((tag) => tag.name);
49
+ if (newTags.length > 0) {
50
+ return [`**Deployed to**: ${newTags.join(", ")}`];
51
+ }
52
+ const lines = [`**Deployment**: not deployed`];
53
+ const otherTags = Array.from(
54
+ new Set(
55
+ allDeployments.filter((tag) => tag.versionId !== newVersion.versionId).map((tag) => tag.name)
56
+ )
57
+ );
58
+ if (otherTags.length > 0) {
59
+ lines.push(`**Existing deployments (untouched)**: ${otherTags.join(", ")}`);
60
+ }
61
+ return lines;
62
+ }
63
+ async function renderUpdateSuccess({
64
+ idOrHandle,
65
+ params,
66
+ updated
67
+ }) {
68
+ let prompt;
69
+ try {
70
+ prompt = await getPrompt(idOrHandle, {
71
+ version: void 0,
72
+ tag: void 0
73
+ });
74
+ } catch {
75
+ const lines2 = [];
76
+ lines2.push("Prompt updated successfully!\n");
77
+ if (updated?.id) lines2.push(`**ID**: ${updated.id}`);
78
+ if (updated?.handle) lines2.push(`**Handle**: ${updated.handle}`);
79
+ lines2.push(`**Commit**: ${params.commitMessage}`);
80
+ lines2.push(
81
+ `**Note**: the update succeeded, but version and deployment details are unavailable (confirmation read failed). Run platform_get_prompt to inspect the current state. Do not retry the update.`
82
+ );
83
+ return lines2.join("\n");
84
+ }
85
+ const newVersion = await identifyNewVersion({
86
+ idOrHandle,
87
+ prompt,
88
+ commitMessage: params.commitMessage
89
+ });
90
+ const lines = [];
91
+ lines.push("Prompt updated successfully!\n");
92
+ if (prompt.id) lines.push(`**ID**: ${prompt.id}`);
93
+ if (prompt.handle) lines.push(`**Handle**: ${prompt.handle}`);
94
+ if (newVersion?.version != null) lines.push(`**Version**: v${newVersion.version}`);
95
+ if (newVersion?.versionId) lines.push(`**Version ID**: ${newVersion.versionId}`);
96
+ lines.push(`**Commit**: ${params.commitMessage}`);
97
+ if (!newVersion) {
98
+ lines.push(
99
+ `**Note**: update succeeded, but the new version could not be identified in the re-fetched prompt \u2014 version and deployment details are unavailable. Run platform_get_prompt to inspect the current state.`
100
+ );
101
+ }
102
+ if (newVersion) {
103
+ lines.push(...deploymentLines({ prompt, newVersion }));
104
+ }
105
+ return lines.join("\n");
106
+ }
107
+ async function renderTagFailure({
108
+ idOrHandle,
109
+ params
110
+ }) {
111
+ const failedTags = params.tags?.join(", ") ?? "";
112
+ let prompt;
113
+ try {
114
+ prompt = await getPrompt(idOrHandle, {
115
+ version: void 0,
116
+ tag: void 0
117
+ });
118
+ } catch {
119
+ return `Prompt update failed: could not assign tag(s) ${failedTags} to "${idOrHandle}". Whether a new version was created could not be confirmed (confirmation read failed) \u2014 run platform_get_prompt before retrying.`;
120
+ }
121
+ const matched = await identifyNewVersion({
122
+ idOrHandle,
123
+ prompt,
124
+ commitMessage: params.commitMessage
125
+ });
126
+ if (matched) {
127
+ const lines = [];
128
+ lines.push("Prompt update partially failed.\n");
129
+ lines.push("A new version was created, but assigning the requested tag(s) failed.");
130
+ if (matched.versionId) lines.push(`**Version ID**: ${matched.versionId}`);
131
+ lines.push(`**Status**: created, untagged`);
132
+ lines.push(`**Failed tag(s)**: ${failedTags}`);
133
+ return lines.join("\n");
134
+ }
135
+ return `Prompt update failed: could not assign tag(s) ${failedTags} to "${idOrHandle}".`;
136
+ }
137
+ export {
138
+ handleUpdatePrompt
139
+ };
140
+ //# sourceMappingURL=update-prompt-GDKRYJI3.js.map
@@ -0,0 +1,141 @@
1
+ import {
2
+ getPrompt,
3
+ getPromptVersions,
4
+ updatePrompt
5
+ } from "./chunk-UWLE5T2F.js";
6
+ import "./chunk-H6WGMG2T.js";
7
+ import "./chunk-SAS5OB7F.js";
8
+
9
+ // src/tools/update-prompt.ts
10
+ async function handleUpdatePrompt(params) {
11
+ const { idOrHandle, ...data } = params;
12
+ let updated;
13
+ try {
14
+ updated = await updatePrompt(idOrHandle, data);
15
+ } catch (err) {
16
+ if (params.tags && params.tags.length > 0) {
17
+ return renderTagFailure({ idOrHandle, params });
18
+ }
19
+ throw err;
20
+ }
21
+ return renderUpdateSuccess({ idOrHandle, params, updated });
22
+ }
23
+ async function identifyNewVersion({
24
+ idOrHandle,
25
+ prompt,
26
+ commitMessage
27
+ }) {
28
+ if (prompt.commitMessage === commitMessage) {
29
+ return { version: prompt.version, versionId: prompt.versionId };
30
+ }
31
+ try {
32
+ const versions = await getPromptVersions(idOrHandle);
33
+ const match = (Array.isArray(versions) ? versions : []).find(
34
+ (v) => v.commitMessage === commitMessage
35
+ );
36
+ if (match) return { version: match.version, versionId: match.versionId };
37
+ } catch {
38
+ }
39
+ return void 0;
40
+ }
41
+ function deploymentTagsOf(prompt) {
42
+ return (prompt.tags ?? []).filter((tag) => tag?.name !== "latest");
43
+ }
44
+ function deploymentLines({
45
+ prompt,
46
+ newVersion
47
+ }) {
48
+ const allDeployments = deploymentTagsOf(prompt);
49
+ const newTags = allDeployments.filter((tag) => newVersion.versionId != null && tag.versionId === newVersion.versionId).map((tag) => tag.name);
50
+ if (newTags.length > 0) {
51
+ return [`**Deployed to**: ${newTags.join(", ")}`];
52
+ }
53
+ const lines = [`**Deployment**: not deployed`];
54
+ const otherTags = Array.from(
55
+ new Set(
56
+ allDeployments.filter((tag) => tag.versionId !== newVersion.versionId).map((tag) => tag.name)
57
+ )
58
+ );
59
+ if (otherTags.length > 0) {
60
+ lines.push(`**Existing deployments (untouched)**: ${otherTags.join(", ")}`);
61
+ }
62
+ return lines;
63
+ }
64
+ async function renderUpdateSuccess({
65
+ idOrHandle,
66
+ params,
67
+ updated
68
+ }) {
69
+ let prompt;
70
+ try {
71
+ prompt = await getPrompt(idOrHandle, {
72
+ version: void 0,
73
+ tag: void 0
74
+ });
75
+ } catch {
76
+ const lines2 = [];
77
+ lines2.push("Prompt updated successfully!\n");
78
+ if (updated?.id) lines2.push(`**ID**: ${updated.id}`);
79
+ if (updated?.handle) lines2.push(`**Handle**: ${updated.handle}`);
80
+ lines2.push(`**Commit**: ${params.commitMessage}`);
81
+ lines2.push(
82
+ `**Note**: the update succeeded, but version and deployment details are unavailable (confirmation read failed). Run platform_get_prompt to inspect the current state. Do not retry the update.`
83
+ );
84
+ return lines2.join("\n");
85
+ }
86
+ const newVersion = await identifyNewVersion({
87
+ idOrHandle,
88
+ prompt,
89
+ commitMessage: params.commitMessage
90
+ });
91
+ const lines = [];
92
+ lines.push("Prompt updated successfully!\n");
93
+ if (prompt.id) lines.push(`**ID**: ${prompt.id}`);
94
+ if (prompt.handle) lines.push(`**Handle**: ${prompt.handle}`);
95
+ if (newVersion?.version != null) lines.push(`**Version**: v${newVersion.version}`);
96
+ if (newVersion?.versionId) lines.push(`**Version ID**: ${newVersion.versionId}`);
97
+ lines.push(`**Commit**: ${params.commitMessage}`);
98
+ if (!newVersion) {
99
+ lines.push(
100
+ `**Note**: update succeeded, but the new version could not be identified in the re-fetched prompt \u2014 version and deployment details are unavailable. Run platform_get_prompt to inspect the current state.`
101
+ );
102
+ }
103
+ if (newVersion) {
104
+ lines.push(...deploymentLines({ prompt, newVersion }));
105
+ }
106
+ return lines.join("\n");
107
+ }
108
+ async function renderTagFailure({
109
+ idOrHandle,
110
+ params
111
+ }) {
112
+ const failedTags = params.tags?.join(", ") ?? "";
113
+ let prompt;
114
+ try {
115
+ prompt = await getPrompt(idOrHandle, {
116
+ version: void 0,
117
+ tag: void 0
118
+ });
119
+ } catch {
120
+ return `Prompt update failed: could not assign tag(s) ${failedTags} to "${idOrHandle}". Whether a new version was created could not be confirmed (confirmation read failed) \u2014 run platform_get_prompt before retrying.`;
121
+ }
122
+ const matched = await identifyNewVersion({
123
+ idOrHandle,
124
+ prompt,
125
+ commitMessage: params.commitMessage
126
+ });
127
+ if (matched) {
128
+ const lines = [];
129
+ lines.push("Prompt update partially failed.\n");
130
+ lines.push("A new version was created, but assigning the requested tag(s) failed.");
131
+ if (matched.versionId) lines.push(`**Version ID**: ${matched.versionId}`);
132
+ lines.push(`**Status**: created, untagged`);
133
+ lines.push(`**Failed tag(s)**: ${failedTags}`);
134
+ return lines.join("\n");
135
+ }
136
+ return `Prompt update failed: could not assign tag(s) ${failedTags} to "${idOrHandle}".`;
137
+ }
138
+ export {
139
+ handleUpdatePrompt
140
+ };
141
+ //# sourceMappingURL=update-prompt-MY263DYF.js.map
@@ -0,0 +1,34 @@
1
+ import {
2
+ formatScenarioFields
3
+ } from "./chunk-XUIJYNRJ.js";
4
+ import {
5
+ updateScenario
6
+ } from "./chunk-I7ATIZED.js";
7
+ import "./chunk-UWLE5T2F.js";
8
+ import "./chunk-H6WGMG2T.js";
9
+
10
+ // src/tools/update-scenario.ts
11
+ async function handleUpdateScenario(params) {
12
+ const { scenarioId, ...data } = params;
13
+ const result = await updateScenario({ id: scenarioId, ...data });
14
+ const lines = [];
15
+ lines.push("Scenario updated successfully!\n");
16
+ lines.push(`**ID**: ${result.id}`);
17
+ lines.push(`**Name**: ${result.name}`);
18
+ if (result.situation) lines.push(`**Situation**: ${result.situation}`);
19
+ if (Array.isArray(result.criteria) && result.criteria.length > 0) {
20
+ lines.push(`**Criteria**: ${result.criteria.length} criteria`);
21
+ }
22
+ if (Array.isArray(result.labels) && result.labels.length > 0) {
23
+ lines.push(`**Labels**: ${result.labels.join(", ")}`);
24
+ }
25
+ if (result.testSuiteId) {
26
+ lines.push(`**Test suite**: ${result.testSuiteId}`);
27
+ }
28
+ lines.push(...formatScenarioFields(result.fields));
29
+ return lines.join("\n");
30
+ }
31
+ export {
32
+ handleUpdateScenario
33
+ };
34
+ //# sourceMappingURL=update-scenario-7KA3JDXA.js.map
@@ -1,8 +1,11 @@
1
+ import {
2
+ formatScenarioFields
3
+ } from "./chunk-XUIJYNRJ.js";
1
4
  import {
2
5
  updateScenario
3
- } from "./chunk-J42FWRJ2.js";
4
- import "./chunk-A2LEVYQ5.js";
5
- import "./chunk-WT4PO4A3.js";
6
+ } from "./chunk-I7ATIZED.js";
7
+ import "./chunk-UWLE5T2F.js";
8
+ import "./chunk-H6WGMG2T.js";
6
9
  import "./chunk-SAS5OB7F.js";
7
10
 
8
11
  // src/tools/update-scenario.ts
@@ -20,9 +23,13 @@ async function handleUpdateScenario(params) {
20
23
  if (Array.isArray(result.labels) && result.labels.length > 0) {
21
24
  lines.push(`**Labels**: ${result.labels.join(", ")}`);
22
25
  }
26
+ if (result.testSuiteId) {
27
+ lines.push(`**Test suite**: ${result.testSuiteId}`);
28
+ }
29
+ lines.push(...formatScenarioFields(result.fields));
23
30
  return lines.join("\n");
24
31
  }
25
32
  export {
26
33
  handleUpdateScenario
27
34
  };
28
- //# sourceMappingURL=update-scenario-NEXCAQI7.js.map
35
+ //# sourceMappingURL=update-scenario-MOHRQKAQ.js.map
package/package.json CHANGED
@@ -1,81 +1,76 @@
1
1
  {
2
2
  "name": "@langwatch/mcp-server",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "An MCP server for Langwatch.",
5
+ "license": "MIT",
6
+ "author": "",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/langwatch/langwatch.git",
10
+ "directory": "mcp-server"
11
+ },
12
+ "bin": {
13
+ "langwatch-mcp-server": "./dist/index.js"
14
+ },
5
15
  "type": "module",
6
16
  "main": "./dist/index.js",
7
17
  "module": "./dist/index.js",
8
18
  "types": "./dist/index.d.ts",
9
19
  "exports": {
10
20
  ".": {
11
- "import": "./dist/index.js",
12
- "require": "./dist/index.js"
21
+ "import": "./dist/index.js"
13
22
  },
14
23
  "./create-mcp-server": {
15
24
  "types": "./src/create-mcp-server.d.ts",
16
25
  "import": "./dist/create-mcp-server.js",
17
- "require": "./dist/create-mcp-server.js",
26
+ "require": "./dist/create-mcp-server.cjs",
18
27
  "default": "./dist/create-mcp-server.js"
19
28
  },
20
29
  "./config": {
21
30
  "types": "./src/config.d.ts",
22
31
  "import": "./dist/config.js",
23
- "require": "./dist/config.js",
32
+ "require": "./dist/config.cjs",
24
33
  "default": "./dist/config.js"
25
34
  }
26
35
  },
27
- "repository": {
28
- "type": "git",
29
- "url": "https://github.com/langwatch/langwatch.git",
30
- "directory": "mcp-server"
31
- },
32
- "author": "",
33
- "license": "MIT",
34
- "engines": {
35
- "node": ">=18.0.0"
36
+ "dependencies": {
37
+ "@langwatch/evaluator-contract": "0.1.0",
38
+ "@modelcontextprotocol/sdk": "1.29.0",
39
+ "zod": "^4.6.7"
36
40
  },
37
41
  "devDependencies": {
38
42
  "@ai-sdk/anthropic": "^3.0.44",
39
- "@anthropic-ai/claude-code": "2.1.202",
40
- "@eslint/js": "^10.0.1",
41
- "@langwatch/scenario": "^0.4.6",
42
- "@opentelemetry/context-async-hooks": "^2.1.0",
43
- "@opentelemetry/sdk-node": "^0.219.0",
43
+ "@anthropic-ai/claude-code": "2.1.228",
44
+ "@langwatch/egress": "0.0.1",
45
+ "@langwatch/handled-error": "0.1.0",
46
+ "@langwatch/redaction": "0.0.1",
47
+ "@langwatch/scenario": "1.7.0-dev.voice10",
44
48
  "@types/debug": "^4.1.13",
45
49
  "@types/express": "^5.0.6",
46
- "@types/node": "^25.6.0",
50
+ "@types/node": "^26.2.0",
47
51
  "@types/yargs": "^17.0.33",
48
- "@typescript/native-preview": "7.0.0-dev.20260705.1",
49
- "ai": "^6.0.161",
50
- "chalk": "^5.6.2",
51
- "date-fns": "^4.1.0",
52
- "dotenv": "^17.2.2",
53
- "esbuild": "^0.28.1",
54
- "eslint": "^10.2.1",
52
+ "ai": "^6.0.217",
53
+ "chalk": "^6.0.0",
54
+ "dotenv": "^17.4.2",
55
+ "esbuild": "^0.28.2",
55
56
  "express": "^5.2.1",
56
57
  "node-pty": "^1.0.0",
57
- "tsup": "^8.1.0",
58
- "tsx": "^4.20.5",
59
- "typescript": "^5.0.0",
60
- "typescript-eslint": "^8.55.0",
61
- "vitest": "^4.1.8",
58
+ "tsup": "^8.5.0",
59
+ "typescript": "^6.0.3",
60
+ "vitest": "^5.0.1",
62
61
  "yargs": "^18.0.0",
63
- "zod-validation-error": "^5.0.0",
64
- "@langwatch/redaction": "0.0.1",
65
- "@langwatch/ssrf": "0.0.1",
66
- "@langwatch/handled-error": "0.1.0"
67
- },
68
- "dependencies": {
69
- "@modelcontextprotocol/sdk": "^1.29.0",
70
- "zod": "^4.3.6"
62
+ "zod-validation-error": "^5.0.0"
71
63
  },
72
- "bin": {
73
- "langwatch-mcp-server": "./dist/index.js"
64
+ "engines": {
65
+ "node": "^22.23.4 || ^24.22.1 || >=26.12.1"
74
66
  },
75
67
  "scripts": {
76
- "start": "tsx src/index.ts",
68
+ "start": "node --experimental-transform-types src/index.ts",
77
69
  "build": "tsup && node build.js",
70
+ "typecheck": "GOMAXPROCS=2 GOMEMLIMIT=2GiB pnpm -w exec tsc -b mcp/typescript",
78
71
  "prepublish": "pnpm run build",
79
- "test": "vitest"
72
+ "test": "vitest run",
73
+ "test:integration": "vitest run --config vitest.integration.config.js",
74
+ "test:scenario": "vitest run --config vitest.scenario.config.js"
80
75
  }
81
76
  }
package/pyproject.toml CHANGED
@@ -5,12 +5,12 @@ description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  dependencies = [
8
- "ipykernel>=6.30.1",
9
- "langwatch",
10
- "litellm>=1.84.0",
11
- "mcp[cli]>=1.13.1",
12
- "pandas>=2.3.2",
13
- "tenacity>=9.1.2",
8
+ "ipykernel>=7.3.0",
9
+ "langwatch",
10
+ "litellm>=1.96.0",
11
+ "mcp[cli]>=2.0.0",
12
+ "pandas>=2.3.2",
13
+ "tenacity>=9.1.4",
14
14
  ]
15
15
 
16
16
  [tool.uv]
@@ -20,8 +20,8 @@ exclude-newer = "7 days"
20
20
  # package isn't a direct dependency, so a future re-resolution can't silently
21
21
  # pull a vulnerable version back in.
22
22
  constraint-dependencies = [
23
- "python-dotenv>=1.2.2", # security: python-dotenv advisory (#934)
24
- "python-liquid>=2.2.1", # security: python-liquid advisory (#1528)
23
+ "python-dotenv>=1.2.2", # security: python-dotenv advisory (#934)
24
+ "python-liquid>=2.2.1", # security: python-liquid advisory (#1528)
25
25
  ]
26
26
 
27
27
  [tool.uv.sources]
package/src/config.d.ts CHANGED
@@ -1,13 +1,17 @@
1
1
  export interface McpConfig {
2
2
  apiKey: string | undefined;
3
3
  endpoint: string;
4
+ projectId?: string;
4
5
  }
5
6
 
6
7
  export declare function initConfig(args: {
7
8
  apiKey?: string;
8
9
  endpoint?: string;
10
+ projectId?: string;
9
11
  }): void;
10
12
 
13
+ export declare function tryGetConfig(): McpConfig | undefined;
14
+
11
15
  export declare function getConfig(): McpConfig;
12
16
 
13
17
  export declare function requireApiKey(): string;
package/src/config.ts CHANGED
@@ -6,19 +6,7 @@ export interface McpConfig {
6
6
  projectId?: string;
7
7
  }
8
8
 
9
- // ---------------------------------------------------------------------------
10
- // Singleton storage on globalThis
11
- //
12
- // When the langwatch app (CJS, no "type": "module") imports this module,
13
- // tsx creates a CJS-cached copy. When mcp-server's own ESM dist chunks
14
- // do `await import("./search-traces-*.js")`, Node creates a separate
15
- // ESM-cached copy. Module-level variables are NOT shared between them.
16
- //
17
- // By storing config on globalThis, both CJS and ESM instances read/write
18
- // the same object, fixing the "Config not initialized" error that occurs
19
- // when initConfig() runs on the CJS side but tool handlers execute on
20
- // the ESM side.
21
- // ---------------------------------------------------------------------------
9
+ // Store on globalThis to share config between CJS and ESM module instances.
22
10
 
23
11
  const GLOBAL_KEY = "__langwatch_mcp_config" as const;
24
12
  const STORAGE_KEY = "__langwatch_mcp_config_storage" as const;
@@ -49,13 +37,10 @@ function getGlobalState(): McpGlobalState {
49
37
  };
50
38
  }
51
39
 
40
+ /** Trim surrounding whitespace and drop any trailing slashes. */
52
41
  /**
53
- * Trim surrounding whitespace and drop any trailing slashes.
54
- *
55
- * Request URLs are built as `${endpoint}/api/...`, so an endpoint written as
56
- * `https://app.langwatch.ai/` would produce a double slash the router does not
57
- * match, and the caller gets an opaque 404 with nothing pointing at the
58
- * endpoint as the cause.
42
+ * Request URLs are built as `${endpoint}/api/...`; a trailing slash would
43
+ * double up and 404 with nothing pointing at the endpoint as the cause.
59
44
  */
60
45
  function normalizeEndpoint(endpoint: string): string {
61
46
  const trimmed = endpoint.trim();
@@ -64,7 +49,7 @@ function normalizeEndpoint(endpoint: string): string {
64
49
  return trimmed.slice(0, end);
65
50
  }
66
51
 
67
- export function initConfig(args: { apiKey?: string; endpoint?: string }): void {
52
+ export function initConfig(args: { apiKey?: string; endpoint?: string; projectId?: string }): void {
68
53
  const state = getGlobalState();
69
54
  state.globalConfig = {
70
55
  apiKey: args.apiKey || process.env.LANGWATCH_API_KEY,
@@ -72,19 +57,25 @@ export function initConfig(args: { apiKey?: string; endpoint?: string }): void {
72
57
  normalizeEndpoint(args.endpoint ?? "") ||
73
58
  normalizeEndpoint(process.env.LANGWATCH_ENDPOINT ?? "") ||
74
59
  "https://app.langwatch.ai",
75
- projectId: process.env.LANGWATCH_PROJECT_ID,
60
+ projectId: args.projectId ?? process.env.LANGWATCH_PROJECT_ID,
76
61
  };
77
62
  }
78
63
 
64
+ // Current config: per-request scoped if inside runWithConfig(), otherwise global.
65
+ // Returns undefined rather than throwing so callers don't need try/catch.
66
+ export function tryGetConfig(): McpConfig | undefined {
67
+ const state = getGlobalState();
68
+ return state.configStorage.getStore() ?? state.globalConfig;
69
+ }
70
+
71
+ /** The current config: per-request scoped inside runWithConfig(), else global. */
79
72
  /**
80
- * Returns the current config: the per-request scoped config if inside
81
- * a `runWithConfig()` callback, otherwise the global config.
73
+ * Throws when there is none — every caller here needs it to proceed. A
74
+ * caller that can carry on without it asks `tryGetConfig()` instead.
82
75
  */
83
76
  export function getConfig(): McpConfig {
84
- const state = getGlobalState();
85
- const scoped = state.configStorage.getStore();
86
- if (scoped) return scoped;
87
- if (!state.globalConfig) {
77
+ const config = tryGetConfig();
78
+ if (!config) {
88
79
  console.error(
89
80
  "[MCP config] getConfig() failed: globalConfig is null, no scoped config active. " +
90
81
  "Was initConfig() called? Stack:",
@@ -92,7 +83,7 @@ export function getConfig(): McpConfig {
92
83
  );
93
84
  throw new Error("Config not initialized");
94
85
  }
95
- return state.globalConfig;
86
+ return config;
96
87
  }
97
88
 
98
89
  export function requireApiKey(): string {
@@ -107,7 +98,7 @@ export function requireApiKey(): string {
107
98
  new Error().stack,
108
99
  );
109
100
  throw new Error(
110
- "LANGWATCH_API_KEY is required. Set it via --apiKey flag or LANGWATCH_API_KEY environment variable."
101
+ "LANGWATCH_API_KEY is required. Set it via --apiKey flag or LANGWATCH_API_KEY environment variable.",
111
102
  );
112
103
  }
113
104
  return config.apiKey;