@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.
- package/.gitignore +7 -0
- package/.npmignore +41 -0
- package/CHANGELOG.md +280 -200
- package/CONTRIBUTING.md +10 -0
- package/README.md +82 -52
- package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
- package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
- package/dist/archive-project-KWFM3I5Z.js +19 -0
- package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
- package/dist/archive-run-plan-65QN3XRX.js +16 -0
- package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
- package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
- package/dist/archive-scenario-FXEYQNEH.js +19 -0
- package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
- package/dist/archive-test-suite-NKZDZY3D.js +16 -0
- package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
- package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
- package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
- package/dist/chunk-3YLN3ATJ.js +241 -0
- package/dist/chunk-5FNCQRCX.js +91 -0
- package/dist/chunk-6YZUOD34.js +55 -0
- package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
- package/dist/chunk-7VNSRCXO.js +129 -0
- package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
- package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
- package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
- package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
- package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
- package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
- package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
- package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
- package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
- package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
- package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
- package/dist/chunk-K2I7Z3LZ.js +28 -0
- package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
- package/dist/chunk-O7EMWEVJ.js +44 -0
- package/dist/chunk-PTDR56Z3.js +37 -0
- package/dist/chunk-RABYBFX5.js +43 -0
- package/dist/chunk-SUPUUC4W.js +64 -0
- package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
- package/dist/chunk-U24EACC4.js +67 -0
- package/dist/chunk-UNJM3BIL.js +21 -0
- package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
- package/dist/chunk-UWLE5T2F.js +312 -0
- package/dist/chunk-VMWJD732.js +57 -0
- package/dist/chunk-XUIJYNRJ.js +15 -0
- package/dist/chunk-Y34DHR5K.js +67 -0
- package/dist/chunk-YCARO42Z.js +516 -0
- package/dist/config-EAKW6F26.js +16 -0
- package/dist/config.cjs +109 -0
- package/dist/config.js +5 -4
- package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
- package/dist/create-agent-S5ZBCEFT.js +23 -0
- package/dist/create-annotation-LHNCLHYP.js +29 -0
- package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
- package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
- package/dist/create-api-key-T4KSNPKB.js +24 -0
- package/dist/create-dashboard-DHVFMEU4.js +18 -0
- package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
- package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
- package/dist/create-dataset-LUP5PVDM.js +22 -0
- package/dist/create-dataset-records-NSKBZP3G.js +20 -0
- package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
- package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
- package/dist/create-evaluator-HMTYO5SS.js +27 -0
- package/dist/create-mcp-server.cjs +9513 -0
- package/dist/create-mcp-server.js +2647 -5
- package/dist/create-project-6N7PIYRY.js +44 -0
- package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
- package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
- package/dist/create-prompt-PKJ7EDRR.js +37 -0
- package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
- package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
- package/dist/create-scenario-5PJBMAXO.js +33 -0
- package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
- package/dist/create-test-suite-4IPXVSFQ.js +37 -0
- package/dist/create-test-suite-SZEPVXSE.js +36 -0
- package/dist/create-trigger-5HZSCRAN.js +49 -0
- package/dist/create-trigger-PRELMT6J.js +48 -0
- package/dist/delete-agent-JUIZWAXG.js +18 -0
- package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
- package/dist/delete-annotation-HY3O2OGR.js +17 -0
- package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
- package/dist/delete-dashboard-76N66XXL.js +18 -0
- package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
- package/dist/delete-dataset-HQCR66MG.js +18 -0
- package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
- package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
- package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
- package/dist/delete-evaluator-4SNSCLEE.js +16 -0
- package/dist/delete-evaluator-QP3QHTLN.js +15 -0
- package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
- package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
- package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
- package/dist/delete-workflow-JSWABL5F.js +17 -0
- package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
- package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
- package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
- package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
- package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
- package/dist/discover-schema-A33SLMXW.js +442 -0
- package/dist/get-agent-LJQX7OF4.js +69 -0
- package/dist/get-agent-OTIYUFZA.js +70 -0
- package/dist/get-analytics-DCS72353.js +80 -0
- package/dist/get-analytics-IQZKJHLW.js +79 -0
- package/dist/get-dashboard-5NYJEIX2.js +29 -0
- package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
- package/dist/get-dataset-ALSP7RTX.js +64 -0
- package/dist/get-dataset-X4B5JDG2.js +63 -0
- package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
- package/dist/get-evaluator-XEUZGZCH.js +47 -0
- package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
- package/dist/get-project-RM6FRCBK.js +26 -0
- package/dist/get-prompt-OWXJZHQQ.js +95 -0
- package/dist/get-prompt-W52DY36E.js +94 -0
- package/dist/get-run-plan-BE3M2AUX.js +59 -0
- package/dist/get-run-plan-RUXQ6PAX.js +58 -0
- package/dist/get-scenario-RNM7BAX2.js +37 -0
- package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
- package/dist/get-simulation-run-6GIATQE5.js +69 -0
- package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
- package/dist/get-test-suite-GC2O7YH6.js +49 -0
- package/dist/get-test-suite-P5LJ6VLF.js +48 -0
- package/dist/get-trace-KBRVV4NN.js +45 -0
- package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
- package/dist/get-workflow-7PVED7JE.js +25 -0
- package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
- package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
- package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
- package/dist/index.js +60221 -38077
- package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
- package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
- package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
- package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
- package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
- package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
- package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
- package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
- package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
- package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
- package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
- package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
- package/dist/list-agents-HVYWEQMI.js +43 -0
- package/dist/list-agents-RBAOCF53.js +42 -0
- package/dist/list-annotations-HJH4NBLD.js +38 -0
- package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
- package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
- package/dist/list-api-keys-A2PMV435.js +42 -0
- package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
- package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
- package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
- package/dist/list-dashboards-RQ635ZU7.js +32 -0
- package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
- package/dist/list-dataset-records-WFM7F33C.js +43 -0
- package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
- package/dist/list-datasets-THUKQHPX.js +56 -0
- package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
- package/dist/list-evaluators-NLVWF6K7.js +32 -0
- package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
- package/dist/list-model-providers-H3XKORFO.js +35 -0
- package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
- package/dist/list-projects-YNNSRMLC.js +40 -0
- package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
- package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
- package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
- package/dist/list-prompts-IRI6AIXO.js +30 -0
- package/dist/list-run-plans-PX2XI6EK.js +46 -0
- package/dist/list-run-plans-QALLCN2K.js +45 -0
- package/dist/list-scenarios-QZRPVHS4.js +46 -0
- package/dist/list-scenarios-SSJQEMJP.js +45 -0
- package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
- package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
- package/dist/list-test-suites-ANAQBLDG.js +34 -0
- package/dist/list-test-suites-N4WVLBKK.js +35 -0
- package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
- package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
- package/dist/list-triggers-SQNIG35Q.js +45 -0
- package/dist/list-triggers-V4Y356AK.js +46 -0
- package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
- package/dist/list-workflows-ZHTX5LCL.js +33 -0
- package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
- package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
- package/dist/rename-test-suite-4J7UX5S2.js +21 -0
- package/dist/rename-test-suite-NNVLMLKY.js +20 -0
- package/dist/report-issue-AS34ZMJF.js +898 -0
- package/dist/report-issue-DCZFLGDO.js +899 -0
- package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
- package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
- package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
- package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
- package/dist/run-agent-W4VJP72Z.js +75 -0
- package/dist/run-agent-YNV6ZHW4.js +74 -0
- package/dist/run-plan-6C77GWG4.js +38 -0
- package/dist/run-plan-PAARQSI4.js +39 -0
- package/dist/run-query-KJDH544C.js +47 -0
- package/dist/run-query-T4QW2Z5O.js +46 -0
- package/dist/run-test-suite-SQJELEZX.js +26 -0
- package/dist/run-test-suite-STB6NUJM.js +25 -0
- package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
- package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
- package/dist/search-traces-HCBGOG6R.js +170 -0
- package/dist/search-traces-HSTQ6WTQ.js +171 -0
- package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
- package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
- package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
- package/dist/update-agent-MXNOBS4H.js +20 -0
- package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
- package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
- package/dist/update-dataset-DQH3OHOU.js +22 -0
- package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
- package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
- package/dist/update-dataset-record-7PLDGTMR.js +19 -0
- package/dist/update-evaluator-4LFTKFPT.js +24 -0
- package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
- package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
- package/dist/update-project-QVHSJRUP.js +24 -0
- package/dist/update-prompt-GDKRYJI3.js +140 -0
- package/dist/update-prompt-MY263DYF.js +141 -0
- package/dist/update-scenario-7KA3JDXA.js +34 -0
- package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
- package/package.json +39 -44
- package/pyproject.toml +8 -8
- package/src/config.d.ts +4 -0
- package/src/config.ts +20 -29
- package/src/create-mcp-server.ts +1021 -596
- package/src/documentation-fetch.ts +21 -20
- package/src/http-security.ts +166 -135
- package/src/http-server.ts +189 -224
- package/src/index.ts +14 -16
- package/src/langwatch-api-agents.ts +202 -21
- package/src/langwatch-api-annotations.ts +11 -12
- package/src/langwatch-api-api-keys.ts +8 -9
- package/src/langwatch-api-boards.ts +46 -0
- package/src/langwatch-api-dashboard-widgets.ts +112 -0
- package/src/langwatch-api-dashboards.ts +13 -10
- package/src/langwatch-api-datasets.ts +98 -32
- package/src/langwatch-api-evaluators.ts +13 -19
- package/src/langwatch-api-model-providers.ts +4 -4
- package/src/langwatch-api-monitors.ts +14 -18
- package/src/langwatch-api-projects.ts +27 -9
- package/src/langwatch-api-query.ts +114 -0
- package/src/langwatch-api-run-plans.ts +140 -0
- package/src/langwatch-api-scenarios.ts +17 -10
- package/src/langwatch-api-secrets.ts +31 -24
- package/src/langwatch-api-simulation-runs.ts +10 -7
- package/src/langwatch-api-test-suites.ts +116 -0
- package/src/langwatch-api-triggers.ts +96 -34
- package/src/langwatch-api-workflows.ts +9 -9
- package/src/langwatch-api.ts +143 -109
- package/src/public-http-request.ts +21 -12
- package/src/schemas/analytics-metrics.ts +3 -15
- package/src/schemas/create-dataset.ts +3 -4
- package/src/schemas/run-plan.ts +76 -0
- package/src/schemas/suite-fields.ts +132 -0
- package/src/schemas/triggers.ts +365 -0
- package/src/tools/add-dashboard-widget.ts +63 -0
- package/src/tools/archive-project.ts +2 -4
- package/src/tools/archive-run-plan.ts +10 -0
- package/src/tools/archive-scenario.ts +2 -4
- package/src/tools/archive-test-suite.ts +10 -0
- package/src/tools/assign-prompt-tag.ts +6 -2
- package/src/tools/create-agent.ts +1 -1
- package/src/tools/create-annotation.ts +7 -2
- package/src/tools/create-api-key.ts +4 -6
- package/src/tools/create-dashboard.ts +1 -1
- package/src/tools/create-dataset-records.ts +4 -8
- package/src/tools/create-dataset.ts +5 -7
- package/src/tools/create-evaluator.ts +3 -5
- package/src/tools/create-project.ts +2 -2
- package/src/tools/create-prompt-tag.ts +2 -4
- package/src/tools/create-prompt.ts +9 -18
- package/src/tools/create-scenario.ts +11 -5
- package/src/tools/create-test-suite.ts +38 -0
- package/src/tools/create-trigger.ts +55 -0
- package/src/tools/dashboard-exists.ts +25 -0
- package/src/tools/dashboard-widget-queries.ts +32 -0
- package/src/tools/delete-agent.ts +1 -1
- package/src/tools/delete-annotation.ts +1 -1
- package/src/tools/delete-dashboard.ts +1 -1
- package/src/tools/delete-dataset-records.ts +4 -8
- package/src/tools/delete-dataset.ts +3 -7
- package/src/tools/delete-evaluator.ts +4 -6
- package/src/tools/delete-prompt-tag.ts +2 -4
- package/src/tools/delete-workflow.ts +1 -1
- package/src/tools/discover-evaluator-schema.ts +34 -25
- package/src/tools/discover-scenario-schema.ts +86 -12
- package/src/tools/discover-schema.ts +149 -27
- package/src/tools/experiment-run-status.ts +2 -8
- package/src/tools/format-dataset-mutation.ts +5 -10
- package/src/tools/format-run-plan.ts +54 -0
- package/src/tools/format-scenario.ts +12 -0
- package/src/tools/format-suite-details.ts +90 -0
- package/src/tools/get-agent.ts +54 -3
- package/src/tools/get-analytics.ts +52 -46
- package/src/tools/get-dashboard.ts +1 -1
- package/src/tools/get-dataset.ts +34 -16
- package/src/tools/get-evaluator.ts +4 -11
- package/src/tools/get-experiment-results.ts +219 -186
- package/src/tools/get-project.ts +2 -4
- package/src/tools/get-prompt.ts +100 -37
- package/src/tools/get-run-plan.ts +60 -0
- package/src/tools/get-scenario.ts +6 -5
- package/src/tools/get-simulation-run.ts +32 -20
- package/src/tools/get-test-suite.ts +46 -0
- package/src/tools/get-trace.ts +16 -17
- package/src/tools/get-workflow.ts +1 -1
- package/src/tools/list-agents.ts +20 -3
- package/src/tools/list-annotations.ts +8 -5
- package/src/tools/list-api-keys.ts +7 -2
- package/src/tools/list-dashboard-boards.ts +28 -0
- package/src/tools/list-dashboards.ts +1 -1
- package/src/tools/list-dataset-records.ts +8 -6
- package/src/tools/list-datasets.ts +12 -23
- package/src/tools/list-evaluators.ts +4 -8
- package/src/tools/list-experiment-runs.ts +5 -9
- package/src/tools/list-experiments.ts +5 -11
- package/src/tools/list-model-providers.ts +3 -5
- package/src/tools/list-projects.ts +2 -4
- package/src/tools/list-prompt-tags.ts +3 -3
- package/src/tools/list-prompts.ts +4 -8
- package/src/tools/list-run-plans.ts +47 -0
- package/src/tools/list-scenarios.ts +26 -17
- package/src/tools/list-simulation-runs.ts +13 -5
- package/src/tools/list-test-suites.ts +35 -0
- package/src/tools/list-trigger-fires.ts +17 -0
- package/src/tools/list-triggers.ts +39 -0
- package/src/tools/list-workflows.ts +2 -4
- package/src/tools/rename-prompt-tag.ts +1 -1
- package/src/tools/rename-test-suite.ts +15 -0
- package/src/tools/report-issue.ts +5 -9
- package/src/tools/rerun-run-plan.ts +18 -0
- package/src/tools/revoke-api-key.ts +2 -4
- package/src/tools/run-agent.ts +65 -14
- package/src/tools/run-experiment.ts +36 -37
- package/src/tools/run-plan.ts +46 -0
- package/src/tools/run-query.ts +47 -0
- package/src/tools/run-test-suite.ts +27 -0
- package/src/tools/run-workflow.ts +2 -5
- package/src/tools/search-traces.ts +161 -47
- package/src/tools/set-model-provider.ts +4 -6
- package/src/tools/test-agent.ts +18 -0
- package/src/tools/update-agent.ts +1 -1
- package/src/tools/update-dashboard-widget.ts +97 -0
- package/src/tools/update-dataset-record.ts +1 -1
- package/src/tools/update-dataset.ts +5 -7
- package/src/tools/update-evaluator.ts +3 -5
- package/src/tools/update-project.ts +1 -1
- package/src/tools/update-prompt.ts +185 -15
- package/src/tools/update-scenario.ts +11 -5
- package/src/tools/update-test-suite.ts +40 -0
- package/src/utils/date-parsing.ts +1 -1
- package/src/utils/escape-markdown.ts +3 -8
- package/src/utils/format-evaluations.ts +6 -6
- package/src/utils/markdown-table.ts +58 -0
- package/src/utils/trace-id-shape.ts +20 -0
- package/tsconfig.app.json +24 -0
- package/tsconfig.json +19 -12
- package/uv.lock +416 -296
- package/vitest.integration.config.js +10 -0
- package/vitest.scenario.config.js +9 -0
- package/.eslintrc.cjs +0 -36
- package/dist/archive-suite-4T6BSRS7.js +0 -16
- package/dist/chunk-77BNWQ3U.js +0 -86
- package/dist/chunk-A2LEVYQ5.js +0 -217
- package/dist/chunk-TJCXFNDT.js +0 -24
- package/dist/chunk-YZLYHLLI.js +0 -48
- package/dist/config.d.ts +0 -17
- package/dist/create-mcp-server.d.ts +0 -10
- package/dist/create-suite-LZS6QIAF.js +0 -39
- package/dist/delete-evaluator-33SP2JFX.js +0 -16
- package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
- package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
- package/dist/get-agent-Y7MWZ65F.js +0 -29
- package/dist/get-analytics-TETCSOK6.js +0 -73
- package/dist/get-dataset-RCMU5VAH.js +0 -49
- package/dist/get-prompt-OY5B7TRI.js +0 -46
- package/dist/get-suite-J7JVWO6O.js +0 -45
- package/dist/index.d.ts +0 -2
- package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
- package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
- package/dist/list-agents-KFHKGPXV.js +0 -33
- package/dist/list-scenarios-F2WYNRIE.js +0 -41
- package/dist/list-suites-CRY4VWW6.js +0 -43
- package/dist/report-issue-XYVAPAYJ.js +0 -412
- package/dist/run-suite-NKZCJ2IN.js +0 -30
- package/dist/search-traces-A6HFKPLJ.js +0 -79
- package/dist/update-prompt-ODCRQRN6.js +0 -25
- package/dist/update-suite-SNO3GS7T.js +0 -40
- package/src/__tests__/all-tools.integration.test.ts +0 -1626
- package/src/__tests__/config.unit.test.ts +0 -202
- package/src/__tests__/datasets.integration.test.ts +0 -620
- package/src/__tests__/datasets.unit.test.ts +0 -244
- package/src/__tests__/date-parsing.unit.test.ts +0 -78
- package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
- package/src/__tests__/discover-schema.unit.test.ts +0 -118
- package/src/__tests__/docker.integration.test.ts +0 -318
- package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
- package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
- package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
- package/src/__tests__/experiment-status.unit.test.ts +0 -194
- package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
- package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
- package/src/__tests__/http-security-origin.unit.test.ts +0 -97
- package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
- package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
- package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
- package/src/__tests__/http-server-origin.integration.test.ts +0 -169
- package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
- package/src/__tests__/http-transport.integration.test.ts +0 -395
- package/src/__tests__/integration.integration.test.ts +0 -288
- package/src/__tests__/langwatch-api.unit.test.ts +0 -661
- package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
- package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
- package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
- package/src/__tests__/report-issue.integration.test.ts +0 -147
- package/src/__tests__/scenario-tools.integration.test.ts +0 -286
- package/src/__tests__/scenario-tools.unit.test.ts +0 -188
- package/src/__tests__/schemas.unit.test.ts +0 -85
- package/src/__tests__/support/http-server-harness.ts +0 -138
- package/src/__tests__/tools.unit.test.ts +0 -924
- package/src/langwatch-api-suites.ts +0 -118
- package/src/schemas/filter-fields.ts +0 -119
- package/src/schemas/index.ts +0 -4
- package/src/tools/archive-suite.ts +0 -12
- package/src/tools/create-suite.ts +0 -42
- package/src/tools/get-suite.ts +0 -47
- package/src/tools/list-suites.ts +0 -43
- package/src/tools/run-suite.ts +0 -28
- package/src/tools/update-suite.ts +0 -44
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles the `run_query` MCP tool: one LangWatchQL statement rendered as a markdown table. Rows
|
|
3
|
+
* are capped, and the cap is announced, so an unaggregated query cannot flood the conversation.
|
|
4
|
+
* @see specs/mcp-server/schema-discovery.feature
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { runQuery } from "../langwatch-api-query.ts";
|
|
8
|
+
import { markdownTable } from "../utils/markdown-table.ts";
|
|
9
|
+
|
|
10
|
+
/** Rows the table prints. Beyond this, aggregate or export through the CLI. */
|
|
11
|
+
export const RUN_QUERY_ROW_CAP = 50;
|
|
12
|
+
|
|
13
|
+
export async function handleRunQuery(params: {
|
|
14
|
+
sql: string;
|
|
15
|
+
parameters?: Record<string, string | number | boolean | null>;
|
|
16
|
+
}): Promise<string> {
|
|
17
|
+
const result = await runQuery(params);
|
|
18
|
+
const headers = result.columns.map((column) => column.name);
|
|
19
|
+
const shown = result.rows.slice(0, RUN_QUERY_ROW_CAP);
|
|
20
|
+
|
|
21
|
+
const lines: string[] = [];
|
|
22
|
+
lines.push(
|
|
23
|
+
markdownTable({
|
|
24
|
+
headers,
|
|
25
|
+
rows: shown,
|
|
26
|
+
emptyMessage: "The statement ran and returned no rows.",
|
|
27
|
+
}),
|
|
28
|
+
);
|
|
29
|
+
lines.push("");
|
|
30
|
+
lines.push(
|
|
31
|
+
`Returned ${result.rows.length} row${result.rows.length === 1 ? "" : "s"} in ${result.statistics.elapsedMs}ms.`,
|
|
32
|
+
);
|
|
33
|
+
if (result.rows.length > shown.length) {
|
|
34
|
+
lines.push(
|
|
35
|
+
`Showing the first ${shown.length}. Aggregate further, or export every row with \`langwatch query "<statement>" --format jsonl\`.`,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
if (result.truncated) {
|
|
39
|
+
lines.push(
|
|
40
|
+
"The result hit a response ceiling and was cut short, so this is not the whole answer.",
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
for (const diagnostic of result.diagnostics) {
|
|
44
|
+
lines.push(`${diagnostic.code}: ${diagnostic.message}`);
|
|
45
|
+
}
|
|
46
|
+
return lines.join("\n");
|
|
47
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RunParameters, RunPlanTarget } from "../langwatch-api-run-plans.ts";
|
|
2
|
+
import { runTestSuite as apiRunTestSuite } from "../langwatch-api-test-suites.ts";
|
|
3
|
+
import { toWireTargets } from "../schemas/run-plan.ts";
|
|
4
|
+
import { formatRunPlanRun } from "./format-run-plan.ts";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Handles the platform_run_test_suite MCP tool invocation.
|
|
8
|
+
*/
|
|
9
|
+
export async function handleRunTestSuite(params: {
|
|
10
|
+
id: string;
|
|
11
|
+
targets: RunPlanTarget[];
|
|
12
|
+
name?: string;
|
|
13
|
+
repeatCount?: number;
|
|
14
|
+
simulatorModel?: string;
|
|
15
|
+
judgeModel?: string;
|
|
16
|
+
parameters?: RunParameters;
|
|
17
|
+
note?: string;
|
|
18
|
+
idempotencyKey?: string;
|
|
19
|
+
}): Promise<string> {
|
|
20
|
+
const { targets, ...rest } = params;
|
|
21
|
+
const result = await apiRunTestSuite({
|
|
22
|
+
...rest,
|
|
23
|
+
targets: toWireTargets(targets),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return formatRunPlanRun(result);
|
|
27
|
+
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { runWorkflow as apiRunWorkflow } from "../langwatch-api-workflows.
|
|
1
|
+
import { runWorkflow as apiRunWorkflow } from "../langwatch-api-workflows.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Handles the platform_run_workflow MCP tool invocation.
|
|
5
5
|
*/
|
|
6
|
-
export async function handleRunWorkflow(params: {
|
|
7
|
-
id: string;
|
|
8
|
-
input?: string;
|
|
9
|
-
}): Promise<string> {
|
|
6
|
+
export async function handleRunWorkflow(params: { id: string; input?: string }): Promise<string> {
|
|
10
7
|
let parsedInput: Record<string, unknown> = {};
|
|
11
8
|
if (params.input) {
|
|
12
9
|
try {
|
|
@@ -1,17 +1,142 @@
|
|
|
1
|
-
import { searchTraces as apiSearchTraces } from "../langwatch-api.
|
|
2
|
-
import { parseRelativeDate } from "../utils/date-parsing.
|
|
3
|
-
import { formatEvaluationLines } from "../utils/format-evaluations.
|
|
1
|
+
import { searchTraces as apiSearchTraces, type TraceSearchResult } from "../langwatch-api.ts";
|
|
2
|
+
import { parseRelativeDate } from "../utils/date-parsing.ts";
|
|
3
|
+
import { formatEvaluationLines } from "../utils/format-evaluations.ts";
|
|
4
|
+
import { looksLikeTraceId } from "../utils/trace-id-shape.ts";
|
|
5
|
+
|
|
6
|
+
const HOUR_MS = 3600000;
|
|
7
|
+
const DAY_MS = 86400000;
|
|
8
|
+
|
|
9
|
+
/** Default window for a text search. */
|
|
10
|
+
const TEXT_SEARCH_WINDOW_MS = DAY_MS;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Default window when trace ids are named: an exact-match intent must not be
|
|
14
|
+
* answered against yesterday alone. Mirrors the platform's 90-day id lookup
|
|
15
|
+
* bound (ADR-164).
|
|
16
|
+
*/
|
|
17
|
+
const ID_LOOKUP_WINDOW_MS = 90 * DAY_MS;
|
|
18
|
+
|
|
19
|
+
function previewLine({
|
|
20
|
+
label,
|
|
21
|
+
text,
|
|
22
|
+
}: {
|
|
23
|
+
label: string;
|
|
24
|
+
text: { value: string } | undefined;
|
|
25
|
+
}): string {
|
|
26
|
+
const value = text?.value ? String(text.value) : "N/A";
|
|
27
|
+
return `- **${label}**: ${value.slice(0, 100)}${value.length > 100 ? "..." : ""}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function traceLines(trace: TraceSearchResult): string[] {
|
|
31
|
+
const lines = [`### Trace: ${trace.trace_id}`];
|
|
32
|
+
|
|
33
|
+
if (trace.formatted_trace) {
|
|
34
|
+
lines.push(trace.formatted_trace);
|
|
35
|
+
} else {
|
|
36
|
+
lines.push(previewLine({ label: "Input", text: trace.input }));
|
|
37
|
+
lines.push(previewLine({ label: "Output", text: trace.output }));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (trace.timestamps) {
|
|
41
|
+
lines.push(`- **Time**: ${trace.timestamps.started_at || "N/A"}`);
|
|
42
|
+
}
|
|
43
|
+
if (trace.error) {
|
|
44
|
+
lines.push(`- **Error**: ${JSON.stringify(trace.error)}`);
|
|
45
|
+
}
|
|
46
|
+
if (trace.evaluations && trace.evaluations.length > 0) {
|
|
47
|
+
lines.push(...formatEvaluationLines(trace.evaluations));
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function describeSpan({ ms }: { ms: number }): string {
|
|
54
|
+
if (ms % DAY_MS === 0) {
|
|
55
|
+
const days = ms / DAY_MS;
|
|
56
|
+
return days === 1 ? "24 hours" : `${days} days`;
|
|
57
|
+
}
|
|
58
|
+
const hours = Math.round(ms / HOUR_MS);
|
|
59
|
+
return hours === 1 ? "1 hour" : `${hours} hours`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The next sensible window to offer, or undefined once the span is already wide. */
|
|
63
|
+
function suggestWiderWindow({ spanMs }: { spanMs: number }): string | undefined {
|
|
64
|
+
if (spanMs < 7 * DAY_MS) return "7d";
|
|
65
|
+
if (spanMs < 30 * DAY_MS) return "30d";
|
|
66
|
+
if (spanMs < 90 * DAY_MS) return "90d";
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** An empty result states the searched window and names the tool that looks an id up. */
|
|
71
|
+
function buildEmptyResult({
|
|
72
|
+
query,
|
|
73
|
+
traceIds,
|
|
74
|
+
spanMs,
|
|
75
|
+
windowWasDefaulted,
|
|
76
|
+
startDate,
|
|
77
|
+
endDate,
|
|
78
|
+
}: {
|
|
79
|
+
query?: string;
|
|
80
|
+
traceIds?: string[];
|
|
81
|
+
spanMs: number;
|
|
82
|
+
windowWasDefaulted: boolean;
|
|
83
|
+
startDate: number;
|
|
84
|
+
endDate: number;
|
|
85
|
+
}): string {
|
|
86
|
+
const hasTraceIds = (traceIds?.length ?? 0) > 0;
|
|
87
|
+
const lines = [
|
|
88
|
+
hasTraceIds
|
|
89
|
+
? "No traces matched the requested trace ids in the searched window."
|
|
90
|
+
: "No traces found matching your query.",
|
|
91
|
+
"",
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
const range = `${new Date(startDate).toISOString()} to ${new Date(endDate).toISOString()}`;
|
|
95
|
+
lines.push(
|
|
96
|
+
windowWasDefaulted
|
|
97
|
+
? `Searched the last ${describeSpan({ ms: spanMs })} (the default): ${range}.`
|
|
98
|
+
: `Searched ${range}.`,
|
|
99
|
+
);
|
|
100
|
+
lines.push("", "Tips:");
|
|
101
|
+
|
|
102
|
+
if (query && looksLikeTraceId(query)) {
|
|
103
|
+
lines.push(
|
|
104
|
+
`- "${query}" looks like a trace id. Free text never matches trace ids — use \`get_trace\` with traceId: "${query}".`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const wider = suggestWiderWindow({ spanMs });
|
|
109
|
+
if (wider) {
|
|
110
|
+
lines.push(
|
|
111
|
+
`- Widen the window with startDate, e.g. startDate: "${wider}". Accepts h (hours), d (days), w (weeks), m (30-day months), or an ISO date.`,
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (hasTraceIds) {
|
|
116
|
+
lines.push(
|
|
117
|
+
"- Retry with an earlier startDate, or relax the query and filters if you supplied them.",
|
|
118
|
+
"- Looking up one full id? `get_trace` has no time window. A unique 8–31 character hex prefix searches the last 90 days.",
|
|
119
|
+
);
|
|
120
|
+
} else {
|
|
121
|
+
lines.push(
|
|
122
|
+
"- Looking up a known trace id? `get_trace` takes a traceId. A full id has no time window; a unique 8–31 character hex prefix searches the last 90 days.",
|
|
123
|
+
"- To fetch several known trace ids at once, pass `traceIds` instead of `query`.",
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return lines.join("\n");
|
|
128
|
+
}
|
|
4
129
|
|
|
5
130
|
/**
|
|
6
|
-
* Handles the search_traces MCP tool
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* In digest mode (default), returns AI-readable formatted digests per trace.
|
|
10
|
-
* In json mode, returns the full raw JSON.
|
|
131
|
+
* Handles the search_traces MCP tool: searches with optional filters, text
|
|
132
|
+
* query, trace ids and date range. Digest mode (default) returns AI-readable
|
|
133
|
+
* digests per trace; json mode returns the full raw JSON.
|
|
11
134
|
*/
|
|
12
135
|
export async function handleSearchTraces(params: {
|
|
13
136
|
query?: string;
|
|
137
|
+
traceIds?: string[];
|
|
14
138
|
filters?: Record<string, string[]>;
|
|
139
|
+
filter?: string;
|
|
15
140
|
startDate?: string;
|
|
16
141
|
endDate?: string;
|
|
17
142
|
pageSize?: number;
|
|
@@ -19,15 +144,27 @@ export async function handleSearchTraces(params: {
|
|
|
19
144
|
format?: "digest" | "json";
|
|
20
145
|
}): Promise<string> {
|
|
21
146
|
const now = Date.now();
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;
|
|
147
|
+
const hasTraceIds = (params.traceIds?.length ?? 0) > 0;
|
|
148
|
+
const defaultSpanMs = hasTraceIds ? ID_LOOKUP_WINDOW_MS : TEXT_SEARCH_WINDOW_MS;
|
|
149
|
+
|
|
150
|
+
const endDate = params.endDate !== undefined ? parseRelativeDate(params.endDate) : now;
|
|
151
|
+
const startDate =
|
|
152
|
+
params.startDate !== undefined ? parseRelativeDate(params.startDate) : endDate - defaultSpanMs;
|
|
153
|
+
|
|
154
|
+
if (startDate >= endDate) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`Invalid trace search window: startDate (${new Date(startDate).toISOString()}) must be before endDate (${new Date(endDate).toISOString()}).`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
26
159
|
const format = params.format ?? "digest";
|
|
27
160
|
|
|
28
161
|
const result = await apiSearchTraces({
|
|
29
162
|
query: params.query,
|
|
163
|
+
traceIds: params.traceIds,
|
|
30
164
|
filters: params.filters,
|
|
165
|
+
// Forwarded as itself: the filter language and the free-text query are two
|
|
166
|
+
// different searches, and the server combines them.
|
|
167
|
+
...(params.filter ? { filter: params.filter } : {}),
|
|
31
168
|
startDate,
|
|
32
169
|
endDate,
|
|
33
170
|
pageSize: params.pageSize ?? 25,
|
|
@@ -37,7 +174,14 @@ export async function handleSearchTraces(params: {
|
|
|
37
174
|
|
|
38
175
|
const traces = result.traces ?? [];
|
|
39
176
|
if (traces.length === 0) {
|
|
40
|
-
return
|
|
177
|
+
return buildEmptyResult({
|
|
178
|
+
query: params.query,
|
|
179
|
+
traceIds: params.traceIds,
|
|
180
|
+
spanMs: endDate - startDate,
|
|
181
|
+
windowWasDefaulted: params.startDate === undefined,
|
|
182
|
+
startDate,
|
|
183
|
+
endDate,
|
|
184
|
+
});
|
|
41
185
|
}
|
|
42
186
|
|
|
43
187
|
if (format === "json") {
|
|
@@ -45,50 +189,20 @@ export async function handleSearchTraces(params: {
|
|
|
45
189
|
}
|
|
46
190
|
|
|
47
191
|
const lines: string[] = [];
|
|
48
|
-
lines.push(
|
|
49
|
-
`Found ${result.pagination?.totalHits ?? traces.length} traces:\n`
|
|
50
|
-
);
|
|
192
|
+
lines.push(`Found ${result.pagination?.totalHits ?? traces.length} traces:\n`);
|
|
51
193
|
|
|
52
194
|
for (const trace of traces) {
|
|
53
|
-
lines.push(
|
|
54
|
-
|
|
55
|
-
if (trace.formatted_trace) {
|
|
56
|
-
lines.push(trace.formatted_trace);
|
|
57
|
-
} else {
|
|
58
|
-
const inputStr = trace.input?.value
|
|
59
|
-
? String(trace.input.value)
|
|
60
|
-
: "N/A";
|
|
61
|
-
const outputStr = trace.output?.value
|
|
62
|
-
? String(trace.output.value)
|
|
63
|
-
: "N/A";
|
|
64
|
-
lines.push(
|
|
65
|
-
`- **Input**: ${inputStr.slice(0, 100)}${inputStr.length > 100 ? "..." : ""}`
|
|
66
|
-
);
|
|
67
|
-
lines.push(
|
|
68
|
-
`- **Output**: ${outputStr.slice(0, 100)}${outputStr.length > 100 ? "..." : ""}`
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (trace.timestamps) {
|
|
73
|
-
lines.push(`- **Time**: ${trace.timestamps.started_at || "N/A"}`);
|
|
74
|
-
}
|
|
75
|
-
if (trace.error) {
|
|
76
|
-
lines.push(`- **Error**: ${JSON.stringify(trace.error)}`);
|
|
77
|
-
}
|
|
78
|
-
if (trace.evaluations && trace.evaluations.length > 0) {
|
|
79
|
-
lines.push(...formatEvaluationLines(trace.evaluations));
|
|
80
|
-
}
|
|
81
|
-
lines.push("");
|
|
195
|
+
lines.push(...traceLines(trace));
|
|
82
196
|
}
|
|
83
197
|
|
|
84
198
|
if (result.pagination?.scrollId) {
|
|
85
199
|
lines.push(
|
|
86
|
-
`\n**More results available.** Use scrollId: "${result.pagination.scrollId}" to get next page
|
|
200
|
+
`\n**More results available.** Use scrollId: "${result.pagination.scrollId}" to get next page.`,
|
|
87
201
|
);
|
|
88
202
|
}
|
|
89
203
|
|
|
90
204
|
lines.push(
|
|
91
|
-
'\n> Tip: Use `get_trace` with a
|
|
205
|
+
'\n> Tip: Use `get_trace` with a traceId for full details. Use `search_traces` with `format: "json"` for raw data. Use `discover_schema` to see available filter fields.',
|
|
92
206
|
);
|
|
93
207
|
|
|
94
208
|
return lines.join("\n");
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { setModelProvider as apiSetModelProvider } from "../langwatch-api-model-providers.
|
|
1
|
+
import { setModelProvider as apiSetModelProvider } from "../langwatch-api-model-providers.ts";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Handles the platform_set_model_provider MCP tool
|
|
5
|
-
*
|
|
6
|
-
* Creates or updates a model provider configuration, including API keys.
|
|
7
|
-
* Returns confirmation with the updated provider status.
|
|
4
|
+
* Handles the platform_set_model_provider MCP tool: creates or updates
|
|
5
|
+
* a provider config (including API keys) and returns its status.
|
|
8
6
|
*/
|
|
9
7
|
export async function handleSetModelProvider(params: {
|
|
10
8
|
provider: string;
|
|
@@ -18,7 +16,7 @@ export async function handleSetModelProvider(params: {
|
|
|
18
16
|
|
|
19
17
|
if (!updated) {
|
|
20
18
|
throw new Error(
|
|
21
|
-
`Model provider "${params.provider}" was not found in the response. The provider name may be invalid
|
|
19
|
+
`Model provider "${params.provider}" was not found in the response. The provider name may be invalid.`,
|
|
22
20
|
);
|
|
23
21
|
}
|
|
24
22
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { testAgent as apiTestAgent } from "../langwatch-api-agents.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Handles the platform_test_agent MCP tool invocation.
|
|
5
|
+
*
|
|
6
|
+
* @see specs/agents/agent-test-run.feature
|
|
7
|
+
*/
|
|
8
|
+
export async function handleTestAgent(params: { id: string }): Promise<string> {
|
|
9
|
+
const run = await apiTestAgent(params.id);
|
|
10
|
+
return [
|
|
11
|
+
'Test run scheduled. The user sends "ping"; the run succeeds when the agent answers.',
|
|
12
|
+
"",
|
|
13
|
+
`**Scenario run ID:** ${run.scenarioRunId}`,
|
|
14
|
+
`**Batch run ID:** ${run.batchRunId}`,
|
|
15
|
+
"",
|
|
16
|
+
`Follow it with platform_get_simulation_run using scenarioRunId "${run.scenarioRunId}".`,
|
|
17
|
+
].join("\n");
|
|
18
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `update_dashboard_widget` MCP tool over the widget PATCH: a field left out keeps its
|
|
3
|
+
* stored value. The widget must sit on the named dashboard, so an agent never edits one it
|
|
4
|
+
* found somewhere else by mistake. Spec: modules/dashboard/specs/dashboard-widget-mcp.feature
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
type DashboardWidget,
|
|
9
|
+
getDashboardWidget,
|
|
10
|
+
updateDashboardWidget,
|
|
11
|
+
} from "../langwatch-api-dashboard-widgets.js";
|
|
12
|
+
import { getCurrentProject } from "../langwatch-api-projects.js";
|
|
13
|
+
import { LangWatchApiError } from "../langwatch-api.js";
|
|
14
|
+
import { assertDashboardExists } from "./dashboard-exists.js";
|
|
15
|
+
import {
|
|
16
|
+
type DashboardWidgetQueriesInput,
|
|
17
|
+
normalizeDashboardWidgetQueries,
|
|
18
|
+
} from "./dashboard-widget-queries.js";
|
|
19
|
+
|
|
20
|
+
export interface UpdateDashboardWidgetParams {
|
|
21
|
+
dashboardId: string;
|
|
22
|
+
widgetId: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
code?: string;
|
|
25
|
+
queries?: DashboardWidgetQueriesInput;
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function handleUpdateDashboardWidget(
|
|
30
|
+
params: UpdateDashboardWidgetParams,
|
|
31
|
+
): Promise<string> {
|
|
32
|
+
const { dashboardId, widgetId, name, code, description } = params;
|
|
33
|
+
if (
|
|
34
|
+
name === undefined &&
|
|
35
|
+
code === undefined &&
|
|
36
|
+
params.queries === undefined &&
|
|
37
|
+
description === undefined
|
|
38
|
+
) {
|
|
39
|
+
throw new Error("Provide at least one of name, code, queries or description to change.");
|
|
40
|
+
}
|
|
41
|
+
const queries =
|
|
42
|
+
params.queries === undefined
|
|
43
|
+
? undefined
|
|
44
|
+
: normalizeDashboardWidgetQueries({ queries: params.queries });
|
|
45
|
+
|
|
46
|
+
const project = await getCurrentProject();
|
|
47
|
+
await assertDashboardExists({ projectId: project.id, dashboardId });
|
|
48
|
+
const current = await getWidgetOnDashboard({ projectId: project.id, widgetId, dashboardId });
|
|
49
|
+
|
|
50
|
+
const widget = await updateDashboardWidget({
|
|
51
|
+
projectId: project.id,
|
|
52
|
+
widgetId: current.id,
|
|
53
|
+
...(name === undefined ? {} : { name }),
|
|
54
|
+
...(code === undefined ? {} : { code }),
|
|
55
|
+
...(queries === undefined ? {} : { queries }),
|
|
56
|
+
...(description === undefined ? {} : { description }),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return [
|
|
60
|
+
`Widget "${widget.name}" updated on dashboard "${dashboardId}".`,
|
|
61
|
+
`**Widget ID**: ${widget.id}`,
|
|
62
|
+
`**Queries**: ${widget.definition.queries.map((query) => query.name).join(", ") || "(none)"}`,
|
|
63
|
+
"",
|
|
64
|
+
"```json",
|
|
65
|
+
JSON.stringify(widget, null, 2),
|
|
66
|
+
"```",
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The widget, refused by id when it is not in this project or not on this dashboard. */
|
|
71
|
+
async function getWidgetOnDashboard({
|
|
72
|
+
projectId,
|
|
73
|
+
widgetId,
|
|
74
|
+
dashboardId,
|
|
75
|
+
}: {
|
|
76
|
+
projectId: string;
|
|
77
|
+
widgetId: string;
|
|
78
|
+
dashboardId: string;
|
|
79
|
+
}): Promise<DashboardWidget> {
|
|
80
|
+
let widget: DashboardWidget;
|
|
81
|
+
try {
|
|
82
|
+
widget = await getDashboardWidget({ projectId, widgetId });
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error instanceof LangWatchApiError && error.status === 404) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`No widget with ID "${widgetId}" was found in this project. Use the widget ID add_dashboard_widget returned.`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
if (widget.dashboardId !== dashboardId) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Widget "${widgetId}" is not on dashboard "${dashboardId}". Pass the dashboard the widget was added to.`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return widget;
|
|
97
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { updateDataset as apiUpdateDataset } from "../langwatch-api-datasets.
|
|
2
|
-
import type { DatasetColumnType } from "../langwatch-api-datasets.
|
|
3
|
-
import { formatDatasetMutationDetails } from "./format-dataset-mutation.
|
|
1
|
+
import { updateDataset as apiUpdateDataset } from "../langwatch-api-datasets.ts";
|
|
2
|
+
import type { DatasetColumnType } from "../langwatch-api-datasets.ts";
|
|
3
|
+
import { formatDatasetMutationDetails } from "./format-dataset-mutation.ts";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Handles the platform_update_dataset MCP tool
|
|
7
|
-
*
|
|
8
|
-
* Updates an existing dataset and returns a confirmation
|
|
9
|
-
* with the updated details.
|
|
6
|
+
* Handles the platform_update_dataset MCP tool: updates a dataset and
|
|
7
|
+
* returns a confirmation with the updated details.
|
|
10
8
|
*/
|
|
11
9
|
export async function handleUpdateDataset(params: {
|
|
12
10
|
slugOrId: string;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
updateEvaluator as apiUpdateEvaluator,
|
|
3
3
|
getEvaluatorType,
|
|
4
|
-
} from "../langwatch-api-evaluators.
|
|
4
|
+
} from "../langwatch-api-evaluators.ts";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Handles the platform_update_evaluator MCP tool
|
|
8
|
-
*
|
|
9
|
-
* Updates an existing evaluator and returns a confirmation
|
|
10
|
-
* with the updated details.
|
|
7
|
+
* Handles the platform_update_evaluator MCP tool: updates an evaluator
|
|
8
|
+
* and returns a confirmation with the updated details.
|
|
11
9
|
*/
|
|
12
10
|
export async function handleUpdateEvaluator(params: {
|
|
13
11
|
evaluatorId: string;
|