@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,516 @@
1
+ import {
2
+ makeRequest
3
+ } from "./chunk-UWLE5T2F.js";
4
+
5
+ // src/langwatch-api-agents.ts
6
+ import { z } from "zod";
7
+
8
+ // src/public-http-request.ts
9
+ import { lookup as dnsLookup } from "dns/promises";
10
+ import { request as httpRequest } from "http";
11
+ import { request as httpsRequest } from "https";
12
+ import { isIP } from "net";
13
+
14
+ // ../../packages/egress/src/ssrf/address.ts
15
+ function ipv4ToBytes(input) {
16
+ const parts = input.split(".");
17
+ if (parts.length !== 4) return null;
18
+ const bytes = new Uint8Array(4);
19
+ for (let i = 0; i < 4; i++) {
20
+ if (!/^\d{1,3}$/.test(parts[i])) return null;
21
+ const n = Number(parts[i]);
22
+ if (n > 255) return null;
23
+ bytes[i] = n;
24
+ }
25
+ return bytes;
26
+ }
27
+ function parseIpv6Groups(part) {
28
+ if (part === "") return [];
29
+ const out = [];
30
+ for (const group of part.split(":")) {
31
+ if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;
32
+ out.push(parseInt(group, 16));
33
+ }
34
+ return out;
35
+ }
36
+ function expandIpv6Groups(halves) {
37
+ const head = parseIpv6Groups(halves[0]);
38
+ if (head === null) return null;
39
+ if (halves.length !== 2) return head;
40
+ const tail = parseIpv6Groups(halves[1]);
41
+ if (tail === null) return null;
42
+ const missing = 8 - head.length - tail.length;
43
+ if (missing < 0) return null;
44
+ return [...head, ...Array.from({ length: missing }, () => 0), ...tail];
45
+ }
46
+ function ipv6ToBytes(input) {
47
+ let s = input;
48
+ const zone = s.indexOf("%");
49
+ if (zone !== -1) s = s.slice(0, zone);
50
+ if (s.includes(".")) {
51
+ const lastColon = s.lastIndexOf(":");
52
+ if (lastColon === -1) return null;
53
+ const v4 = ipv4ToBytes(s.slice(lastColon + 1));
54
+ if (!v4) return null;
55
+ const hi = (v4[0] << 8 | v4[1]).toString(16);
56
+ const lo = (v4[2] << 8 | v4[3]).toString(16);
57
+ s = `${s.slice(0, lastColon + 1)}${hi}:${lo}`;
58
+ }
59
+ const halves = s.split("::");
60
+ if (halves.length > 2) return null;
61
+ const groups = expandIpv6Groups(halves);
62
+ if (groups === null) return null;
63
+ if (groups.length !== 8) return null;
64
+ const bytes = new Uint8Array(16);
65
+ for (let i = 0; i < 8; i++) {
66
+ bytes[i * 2] = groups[i] >> 8 & 255;
67
+ bytes[i * 2 + 1] = groups[i] & 255;
68
+ }
69
+ return bytes;
70
+ }
71
+ function ipToBytes(ip) {
72
+ return ip.includes(":") ? ipv6ToBytes(ip) : ipv4ToBytes(ip);
73
+ }
74
+ function zeroBetween({
75
+ bytes,
76
+ from,
77
+ to
78
+ }) {
79
+ for (let i = from; i < to; i++) {
80
+ if (bytes[i] !== 0) return false;
81
+ }
82
+ return true;
83
+ }
84
+ function unmap(bytes) {
85
+ if (bytes.length !== 16) return bytes;
86
+ if (!zeroBetween({ bytes, from: 0, to: 8 })) return bytes;
87
+ const mapped = zeroBetween({ bytes, from: 8, to: 10 }) && bytes[10] === 255 && bytes[11] === 255;
88
+ const compatible = zeroBetween({ bytes, from: 8, to: 12 });
89
+ const translated = bytes[8] === 255 && bytes[9] === 255 && zeroBetween({ bytes, from: 10, to: 12 });
90
+ return mapped || compatible || translated ? bytes.slice(12, 16) : bytes;
91
+ }
92
+ function parsePrefix({ cidr, rfc }) {
93
+ const slash = cidr.lastIndexOf("/");
94
+ const bytes = ipToBytes(cidr.slice(0, slash));
95
+ if (!bytes) throw new Error(`ssrf: bad prefix ${cidr}`);
96
+ return { bytes, bits: Number(cidr.slice(slash + 1)), rfc };
97
+ }
98
+ function prefixContains({ prefix, addr }) {
99
+ if (prefix.bytes.length !== addr.length) return false;
100
+ let bits = prefix.bits;
101
+ let i = 0;
102
+ while (bits >= 8) {
103
+ if (prefix.bytes[i] !== addr[i]) return false;
104
+ i++;
105
+ bits -= 8;
106
+ }
107
+ if (bits > 0) {
108
+ const mask = 255 << 8 - bits & 255;
109
+ if ((prefix.bytes[i] & mask) !== (addr[i] & mask)) return false;
110
+ }
111
+ return true;
112
+ }
113
+ var METADATA_ADDRESSES = [
114
+ "169.254.169.254",
115
+ // AWS/GCP/Azure/Oracle IMDS
116
+ "169.254.170.2",
117
+ // AWS ECS/Fargate task metadata
118
+ "168.63.129.16",
119
+ // Azure WireServer / host DNS
120
+ "100.100.100.200",
121
+ // Alibaba Cloud ECS metadata
122
+ "192.0.0.192",
123
+ // Oracle Cloud metadata
124
+ "fd00:ec2::254"
125
+ // AWS EC2 IMDS over IPv6
126
+ ].map((ip) => {
127
+ const bytes = unmap(ipToBytes(ip));
128
+ return bytes;
129
+ });
130
+ var SPECIAL_PREFIXES = [
131
+ // IPv4
132
+ parsePrefix({ cidr: "0.0.0.0/8", rfc: "RFC1122 this network / unspecified" }),
133
+ parsePrefix({ cidr: "10.0.0.0/8", rfc: "RFC1918 private" }),
134
+ parsePrefix({
135
+ cidr: "100.64.0.0/10",
136
+ rfc: "RFC6598 CGNAT / shared address space"
137
+ }),
138
+ parsePrefix({ cidr: "127.0.0.0/8", rfc: "RFC1122 loopback" }),
139
+ parsePrefix({ cidr: "169.254.0.0/16", rfc: "RFC3927 link-local" }),
140
+ parsePrefix({ cidr: "172.16.0.0/12", rfc: "RFC1918 private" }),
141
+ parsePrefix({
142
+ cidr: "192.0.0.0/24",
143
+ rfc: "RFC6890 IETF protocol assignments"
144
+ }),
145
+ parsePrefix({
146
+ cidr: "192.0.2.0/24",
147
+ rfc: "RFC5737 TEST-NET-1 documentation"
148
+ }),
149
+ parsePrefix({
150
+ cidr: "192.88.99.0/24",
151
+ rfc: "RFC7526 6to4 relay anycast, deprecated"
152
+ }),
153
+ parsePrefix({ cidr: "192.168.0.0/16", rfc: "RFC1918 private" }),
154
+ parsePrefix({ cidr: "198.18.0.0/15", rfc: "RFC2544 benchmarking" }),
155
+ parsePrefix({
156
+ cidr: "198.51.100.0/24",
157
+ rfc: "RFC5737 TEST-NET-2 documentation"
158
+ }),
159
+ parsePrefix({
160
+ cidr: "203.0.113.0/24",
161
+ rfc: "RFC5737 TEST-NET-3 documentation"
162
+ }),
163
+ parsePrefix({ cidr: "224.0.0.0/4", rfc: "RFC5771 multicast" }),
164
+ parsePrefix({
165
+ cidr: "240.0.0.0/4",
166
+ rfc: "RFC1112 reserved incl. 255.255.255.255 broadcast"
167
+ }),
168
+ // IPv6
169
+ parsePrefix({ cidr: "::/128", rfc: "RFC4291 unspecified" }),
170
+ parsePrefix({ cidr: "::1/128", rfc: "RFC4291 loopback" }),
171
+ parsePrefix({ cidr: "64:ff9b::/96", rfc: "RFC6052 well-known NAT64" }),
172
+ parsePrefix({ cidr: "64:ff9b:1::/48", rfc: "RFC8215 local-use NAT64" }),
173
+ parsePrefix({ cidr: "100::/64", rfc: "RFC6666 discard-only" }),
174
+ parsePrefix({ cidr: "2001::/32", rfc: "RFC4380 Teredo" }),
175
+ parsePrefix({ cidr: "2001:db8::/32", rfc: "RFC3849 documentation" }),
176
+ parsePrefix({ cidr: "2002::/16", rfc: "RFC3056 6to4" }),
177
+ parsePrefix({ cidr: "3fff::/20", rfc: "RFC9637 documentation" }),
178
+ parsePrefix({ cidr: "fc00::/7", rfc: "RFC4193 unique-local" }),
179
+ parsePrefix({ cidr: "fe80::/10", rfc: "RFC4291 link-local unicast" }),
180
+ parsePrefix({ cidr: "ff00::/8", rfc: "RFC4291 multicast" })
181
+ ];
182
+ function bytesEqual({ a, b }) {
183
+ if (a.length !== b.length) return false;
184
+ for (let i = 0; i < a.length; i++) {
185
+ if (a[i] !== b[i]) return false;
186
+ }
187
+ return true;
188
+ }
189
+ function isMetadataAddress(addr) {
190
+ return METADATA_ADDRESSES.some((m) => bytesEqual({ a: m, b: addr }));
191
+ }
192
+ function classify(ip) {
193
+ const raw = ipToBytes(ip);
194
+ if (!raw) return "special";
195
+ const addr = unmap(raw);
196
+ if (isMetadataAddress(addr)) return "metadata";
197
+ for (const prefix of SPECIAL_PREFIXES) {
198
+ if (prefixContains({ prefix, addr })) return "special";
199
+ }
200
+ return "global";
201
+ }
202
+
203
+ // src/public-http-request.ts
204
+ var MAX_REDIRECTS = 5;
205
+ var MAX_RESPONSE_BYTES = 5 * 1024 * 1024;
206
+ var REQUEST_TIMEOUT_MS = 3e4;
207
+ var REDIRECT_STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
208
+ var SENSITIVE_REDIRECT_HEADERS = /* @__PURE__ */ new Set([
209
+ "authorization",
210
+ "cookie",
211
+ "cookie2",
212
+ "proxy-authorization",
213
+ "x-api-key",
214
+ "api-key",
215
+ "x-auth-token",
216
+ "x-access-token"
217
+ ]);
218
+ function unsafeDestinationError() {
219
+ return new Error(
220
+ "HTTP agent destinations must resolve only to globally routable public addresses"
221
+ );
222
+ }
223
+ function hostnameWithoutBrackets(hostname) {
224
+ return hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
225
+ }
226
+ function assertPublicAddress(address) {
227
+ if (classify(address) !== "global") {
228
+ throw unsafeDestinationError();
229
+ }
230
+ }
231
+ async function withTimeout(promise, timeoutMs) {
232
+ let timeout;
233
+ try {
234
+ return await Promise.race([
235
+ promise,
236
+ new Promise((_resolve, reject) => {
237
+ timeout = setTimeout(() => reject(new Error("request timed out")), timeoutMs);
238
+ timeout.unref();
239
+ })
240
+ ]);
241
+ } finally {
242
+ if (timeout) {
243
+ clearTimeout(timeout);
244
+ }
245
+ }
246
+ }
247
+ function headersForRedirect(headers, crossOrigin) {
248
+ if (!headers || !crossOrigin) {
249
+ return headers;
250
+ }
251
+ const safeHeaders = Object.fromEntries(
252
+ Object.entries(headers).filter(([name]) => !SENSITIVE_REDIRECT_HEADERS.has(name.toLowerCase()))
253
+ );
254
+ return Object.keys(safeHeaders).length > 0 ? safeHeaders : void 0;
255
+ }
256
+ async function resolvePublicDestination(input, resolver = dnsLookup) {
257
+ let url;
258
+ try {
259
+ url = new URL(input);
260
+ } catch {
261
+ throw new Error("HTTP agent URL is invalid");
262
+ }
263
+ if (url.protocol !== "http:" && url.protocol !== "https:" || url.username !== "" || url.password !== "") {
264
+ throw unsafeDestinationError();
265
+ }
266
+ const hostname = hostnameWithoutBrackets(url.hostname);
267
+ const literalFamily = isIP(hostname);
268
+ if (literalFamily !== 0) {
269
+ assertPublicAddress(hostname);
270
+ return { address: hostname, family: literalFamily, url };
271
+ }
272
+ let addresses;
273
+ try {
274
+ addresses = await withTimeout(
275
+ resolver(hostname, { all: true, verbatim: true }),
276
+ REQUEST_TIMEOUT_MS
277
+ );
278
+ } catch {
279
+ throw new Error("HTTP agent destination could not be resolved");
280
+ }
281
+ if (addresses.length === 0) {
282
+ throw new Error("HTTP agent destination could not be resolved");
283
+ }
284
+ for (const { address } of addresses) {
285
+ assertPublicAddress(address);
286
+ }
287
+ const selected = addresses.find(({ family }) => family === 4) ?? addresses[0];
288
+ return {
289
+ address: selected.address,
290
+ family: selected.family,
291
+ url
292
+ };
293
+ }
294
+ function requestBody(destination, options) {
295
+ return new Promise((resolve, reject) => {
296
+ const hostname = hostnameWithoutBrackets(destination.url.hostname);
297
+ const requestOptions = {
298
+ protocol: destination.url.protocol,
299
+ hostname,
300
+ port: destination.url.port || void 0,
301
+ path: `${destination.url.pathname}${destination.url.search}`,
302
+ method: options.method ?? "GET",
303
+ headers: options.headers,
304
+ family: destination.family,
305
+ signal: options.signal,
306
+ lookup: (_hostname, _options, callback) => {
307
+ callback(null, destination.address, destination.family);
308
+ }
309
+ };
310
+ const transport = destination.url.protocol === "https:" ? httpsRequest : httpRequest;
311
+ const request = transport(requestOptions, (response) => {
312
+ const chunks = [];
313
+ let receivedBytes = 0;
314
+ response.once("aborted", () => {
315
+ reject(new Error("HTTP agent response was interrupted"));
316
+ });
317
+ response.once("error", reject);
318
+ const contentLength = Number(response.headers["content-length"]);
319
+ if (Number.isFinite(contentLength) && contentLength > MAX_RESPONSE_BYTES) {
320
+ response.destroy(new Error("HTTP agent response is too large"));
321
+ return;
322
+ }
323
+ response.on("data", (chunk) => {
324
+ receivedBytes += chunk.length;
325
+ if (receivedBytes > MAX_RESPONSE_BYTES) {
326
+ response.destroy(new Error("HTTP agent response is too large"));
327
+ return;
328
+ }
329
+ chunks.push(chunk);
330
+ });
331
+ response.once("end", () => {
332
+ resolve({
333
+ body: Buffer.concat(chunks).toString("utf8"),
334
+ location: response.headers.location,
335
+ statusCode: response.statusCode ?? 0
336
+ });
337
+ });
338
+ });
339
+ request.once("error", reject);
340
+ request.setTimeout(REQUEST_TIMEOUT_MS, () => {
341
+ request.destroy(new Error("HTTP agent request timed out"));
342
+ });
343
+ if (options.body !== void 0) {
344
+ request.write(options.body);
345
+ }
346
+ request.end();
347
+ });
348
+ }
349
+ async function requestPublicJson(input, options = {}, redirectCount = 0) {
350
+ const destination = await resolvePublicDestination(input);
351
+ const response = await requestBody(destination, options);
352
+ if (REDIRECT_STATUSES.has(response.statusCode) && response.location) {
353
+ if (redirectCount >= MAX_REDIRECTS) {
354
+ throw new Error(`HTTP agent returned too many redirects`);
355
+ }
356
+ const redirectUrl = new URL(response.location, destination.url);
357
+ const redirectHeaders = headersForRedirect(
358
+ options.headers,
359
+ redirectUrl.origin !== destination.url.origin
360
+ );
361
+ const preserveBody = response.statusCode === 307 || response.statusCode === 308;
362
+ return requestPublicJson(
363
+ redirectUrl.toString(),
364
+ preserveBody ? { ...options, headers: redirectHeaders } : {
365
+ ...options,
366
+ body: void 0,
367
+ headers: redirectHeaders,
368
+ method: "GET"
369
+ },
370
+ redirectCount + 1
371
+ );
372
+ }
373
+ if (response.statusCode < 200 || response.statusCode >= 300) {
374
+ throw new Error(`HTTP agent returned an unsuccessful status: ${response.statusCode}`);
375
+ }
376
+ let parsed;
377
+ try {
378
+ parsed = JSON.parse(response.body);
379
+ } catch {
380
+ throw new Error("HTTP agent returned invalid JSON");
381
+ }
382
+ return parsed;
383
+ }
384
+
385
+ // src/langwatch-api-agents.ts
386
+ var agentCallParamsSchema = z.record(
387
+ z.string(),
388
+ z.union([z.string(), z.number(), z.boolean()])
389
+ );
390
+ async function listAgents(params) {
391
+ const query = new URLSearchParams();
392
+ if (params?.page) query.set("page", String(params.page));
393
+ if (params?.limit) query.set("limit", String(params.limit));
394
+ const qs = query.toString() ? `?${query}` : "";
395
+ return makeRequest("GET", `/api/v1/agents${qs}`);
396
+ }
397
+ async function getAgent(id) {
398
+ return makeRequest("GET", `/api/v1/agents/${encodeURIComponent(id)}`);
399
+ }
400
+ async function createAgent(data) {
401
+ return makeRequest("POST", "/api/v1/agents", data);
402
+ }
403
+ async function updateAgent(params) {
404
+ const { id, ...data } = params;
405
+ return makeRequest(
406
+ "PATCH",
407
+ `/api/v1/agents/${encodeURIComponent(id)}`,
408
+ data
409
+ );
410
+ }
411
+ async function callAgent({
412
+ id,
413
+ body
414
+ }) {
415
+ return makeRequest(
416
+ "POST",
417
+ `/api/v1/agents/${encodeURIComponent(id)}/call`,
418
+ body
419
+ );
420
+ }
421
+ async function testAgent(id) {
422
+ return makeRequest(
423
+ "POST",
424
+ `/api/v1/agents/${encodeURIComponent(id)}/test`,
425
+ {}
426
+ );
427
+ }
428
+ var isMessageList = (value) => Array.isArray(value) && value.every(
429
+ (item) => typeof item === "object" && item !== null && typeof item.role === "string"
430
+ );
431
+ function buildRelayBody({
432
+ input,
433
+ message,
434
+ parameters,
435
+ threadId
436
+ }) {
437
+ let messages;
438
+ if (message !== void 0) {
439
+ messages = [{ role: "user", content: message }];
440
+ } else if (isMessageList(input.messages)) {
441
+ messages = input.messages;
442
+ } else {
443
+ return "a connected agent takes a conversation: give `message`, or `input` with a `messages` list.";
444
+ }
445
+ const body = { messages };
446
+ const thread = threadId ?? (typeof input.threadId === "string" ? input.threadId : void 0);
447
+ if (thread) body.threadId = thread;
448
+ if (isMessageList(input.newMessages)) body.newMessages = input.newMessages;
449
+ if (input.session !== void 0) body.session = input.session;
450
+ let inputParams;
451
+ if (input.params !== void 0) {
452
+ const parsed = agentCallParamsSchema.safeParse(input.params);
453
+ if (!parsed.success) {
454
+ return "`params` takes one flat object of string, number or boolean values. Nested objects and arrays are not run parameters.";
455
+ }
456
+ inputParams = parsed.data;
457
+ }
458
+ if (inputParams || parameters) body.params = { ...inputParams, ...parameters };
459
+ return body;
460
+ }
461
+ async function runAgent({
462
+ id,
463
+ input,
464
+ message,
465
+ parameters,
466
+ threadId
467
+ }) {
468
+ const agent = await getAgent(id);
469
+ const config = agent.config ?? {};
470
+ if (agent.type === "connected") {
471
+ const body = buildRelayBody({ input: input ?? {}, message, parameters, threadId });
472
+ if (typeof body === "string") throw new Error(body);
473
+ if (agent.status === "offline") {
474
+ throw new Error(
475
+ `Agent "${agent.name}" is offline. Start the process that calls connectAgent (or connect_agent) and try again.`
476
+ );
477
+ }
478
+ const result2 = await callAgent({ id: agent.id, body });
479
+ return { agentType: "connected", result: result2 };
480
+ }
481
+ if (agent.type === "http") {
482
+ const url = config.url;
483
+ if (!url) {
484
+ throw new Error("HTTP agent has no URL configured");
485
+ }
486
+ const result2 = await requestPublicJson(url, {
487
+ method: "POST",
488
+ headers: { "Content-Type": "application/json" },
489
+ body: JSON.stringify(input ?? {})
490
+ });
491
+ return { agentType: "http", result: result2 };
492
+ }
493
+ const workflowId = config.workflowId;
494
+ if (!workflowId) {
495
+ throw new Error(
496
+ `Agent "${agent.name}" (type: ${agent.type}) cannot be executed directly. Only connected agents, HTTP agents and workflow-linked agents can be run.`
497
+ );
498
+ }
499
+ const { runWorkflow } = await import("./langwatch-api-workflows-XGJE6SR5.js");
500
+ const result = await runWorkflow(workflowId, input);
501
+ return { agentType: agent.type, result };
502
+ }
503
+ async function deleteAgent(id) {
504
+ return makeRequest("DELETE", `/api/v1/agents/${encodeURIComponent(id)}`);
505
+ }
506
+
507
+ export {
508
+ listAgents,
509
+ getAgent,
510
+ createAgent,
511
+ updateAgent,
512
+ testAgent,
513
+ runAgent,
514
+ deleteAgent
515
+ };
516
+ //# sourceMappingURL=chunk-YCARO42Z.js.map
@@ -0,0 +1,16 @@
1
+ import {
2
+ getConfig,
3
+ initConfig,
4
+ requireApiKey,
5
+ runWithConfig,
6
+ tryGetConfig
7
+ } from "./chunk-H6WGMG2T.js";
8
+ import "./chunk-SAS5OB7F.js";
9
+ export {
10
+ getConfig,
11
+ initConfig,
12
+ requireApiKey,
13
+ runWithConfig,
14
+ tryGetConfig
15
+ };
16
+ //# sourceMappingURL=config-EAKW6F26.js.map
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/config.ts
21
+ var config_exports = {};
22
+ __export(config_exports, {
23
+ getConfig: () => getConfig,
24
+ initConfig: () => initConfig,
25
+ requireApiKey: () => requireApiKey,
26
+ runWithConfig: () => runWithConfig,
27
+ tryGetConfig: () => tryGetConfig
28
+ });
29
+ module.exports = __toCommonJS(config_exports);
30
+ var import_node_async_hooks = require("async_hooks");
31
+ var GLOBAL_KEY = "__langwatch_mcp_config";
32
+ var STORAGE_KEY = "__langwatch_mcp_config_storage";
33
+ function getGlobalState() {
34
+ const g = globalThis;
35
+ if (!g[GLOBAL_KEY]) {
36
+ g[GLOBAL_KEY] = void 0;
37
+ }
38
+ if (!g[STORAGE_KEY]) {
39
+ g[STORAGE_KEY] = new import_node_async_hooks.AsyncLocalStorage();
40
+ }
41
+ return {
42
+ get globalConfig() {
43
+ return g[GLOBAL_KEY];
44
+ },
45
+ set globalConfig(val) {
46
+ g[GLOBAL_KEY] = val;
47
+ },
48
+ get configStorage() {
49
+ return g[STORAGE_KEY];
50
+ }
51
+ };
52
+ }
53
+ function normalizeEndpoint(endpoint) {
54
+ const trimmed = endpoint.trim();
55
+ let end = trimmed.length;
56
+ while (end > 0 && trimmed[end - 1] === "/") end--;
57
+ return trimmed.slice(0, end);
58
+ }
59
+ function initConfig(args) {
60
+ const state = getGlobalState();
61
+ state.globalConfig = {
62
+ apiKey: args.apiKey || process.env.LANGWATCH_API_KEY,
63
+ endpoint: normalizeEndpoint(args.endpoint ?? "") || normalizeEndpoint(process.env.LANGWATCH_ENDPOINT ?? "") || "https://app.langwatch.ai",
64
+ projectId: args.projectId ?? process.env.LANGWATCH_PROJECT_ID
65
+ };
66
+ }
67
+ function tryGetConfig() {
68
+ const state = getGlobalState();
69
+ return state.configStorage.getStore() ?? state.globalConfig;
70
+ }
71
+ function getConfig() {
72
+ const config = tryGetConfig();
73
+ if (!config) {
74
+ console.error(
75
+ "[MCP config] getConfig() failed: globalConfig is null, no scoped config active. Was initConfig() called? Stack:",
76
+ new Error().stack
77
+ );
78
+ throw new Error("Config not initialized");
79
+ }
80
+ return config;
81
+ }
82
+ function requireApiKey() {
83
+ const config = getConfig();
84
+ if (!config.apiKey) {
85
+ const state = getGlobalState();
86
+ const hasScoped = !!state.configStorage.getStore();
87
+ console.error(
88
+ `[MCP config] requireApiKey() failed: apiKey is undefined. scopedConfig=${hasScoped}, endpoint=${config.endpoint}. In HTTP mode, the API key should be set per-session via runWithConfig(). Stack:`,
89
+ new Error().stack
90
+ );
91
+ throw new Error(
92
+ "LANGWATCH_API_KEY is required. Set it via --apiKey flag or LANGWATCH_API_KEY environment variable."
93
+ );
94
+ }
95
+ return config.apiKey;
96
+ }
97
+ function runWithConfig(config, fn) {
98
+ const state = getGlobalState();
99
+ return state.configStorage.run(config, fn);
100
+ }
101
+ // Annotate the CommonJS export names for ESM import in node:
102
+ 0 && (module.exports = {
103
+ getConfig,
104
+ initConfig,
105
+ requireApiKey,
106
+ runWithConfig,
107
+ tryGetConfig
108
+ });
109
+ //# sourceMappingURL=config.cjs.map
package/dist/config.js CHANGED
@@ -2,13 +2,14 @@ import {
2
2
  getConfig,
3
3
  initConfig,
4
4
  requireApiKey,
5
- runWithConfig
6
- } from "./chunk-WT4PO4A3.js";
7
- import "./chunk-SAS5OB7F.js";
5
+ runWithConfig,
6
+ tryGetConfig
7
+ } from "./chunk-H6WGMG2T.js";
8
8
  export {
9
9
  getConfig,
10
10
  initConfig,
11
11
  requireApiKey,
12
- runWithConfig
12
+ runWithConfig,
13
+ tryGetConfig
13
14
  };
14
15
  //# sourceMappingURL=config.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createAgent
3
- } from "./chunk-TOXJQDIZ.js";
4
- import "./chunk-A2LEVYQ5.js";
5
- import "./chunk-WT4PO4A3.js";
3
+ } from "./chunk-HGELNIVY.js";
4
+ import "./chunk-UWLE5T2F.js";
5
+ import "./chunk-H6WGMG2T.js";
6
6
  import "./chunk-SAS5OB7F.js";
7
7
 
8
8
  // src/tools/create-agent.ts
@@ -21,4 +21,4 @@ async function handleCreateAgent(params) {
21
21
  export {
22
22
  handleCreateAgent
23
23
  };
24
- //# sourceMappingURL=create-agent-7XHO6UIS.js.map
24
+ //# sourceMappingURL=create-agent-AYZ3LB3V.js.map
@@ -0,0 +1,23 @@
1
+ import {
2
+ createAgent
3
+ } from "./chunk-YCARO42Z.js";
4
+ import "./chunk-UWLE5T2F.js";
5
+ import "./chunk-H6WGMG2T.js";
6
+
7
+ // src/tools/create-agent.ts
8
+ async function handleCreateAgent(params) {
9
+ const agent = await createAgent({
10
+ name: params.name,
11
+ type: params.type,
12
+ config: params.config ?? {}
13
+ });
14
+ return `Agent created successfully!
15
+
16
+ **Name**: ${agent.name}
17
+ **ID**: ${agent.id}
18
+ **Type**: ${agent.type}`;
19
+ }
20
+ export {
21
+ handleCreateAgent
22
+ };
23
+ //# sourceMappingURL=create-agent-S5ZBCEFT.js.map