@langwatch/mcp-server 0.5.0 → 0.6.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/CHANGELOG.md +25 -0
- package/dist/{archive-scenario-GAE4XVFM.js → archive-scenario-YFD5THOR.js} +3 -3
- package/dist/archive-scenario-YFD5THOR.js.map +1 -0
- package/dist/chunk-5UOPNRXW.js +37 -0
- package/dist/chunk-5UOPNRXW.js.map +1 -0
- package/dist/{chunk-K2YFPOSD.js → chunk-6U4TCGFC.js} +2 -2
- package/dist/chunk-IX6QJKAD.js +22 -0
- package/dist/chunk-IX6QJKAD.js.map +1 -0
- package/dist/{chunk-JVWDWL3J.js → chunk-LLRQIF52.js} +3 -11
- package/dist/chunk-LLRQIF52.js.map +1 -0
- package/dist/create-evaluator-E5X5ZP3B.js +27 -0
- package/dist/create-evaluator-E5X5ZP3B.js.map +1 -0
- package/dist/create-prompt-7Z35MIL6.js +36 -0
- package/dist/create-prompt-7Z35MIL6.js.map +1 -0
- package/dist/{create-scenario-3YRZVDYF.js → create-scenario-DIMPJRPY.js} +3 -3
- package/dist/create-scenario-DIMPJRPY.js.map +1 -0
- package/dist/discover-evaluator-schema-H23XCLNE.js +1402 -0
- package/dist/discover-evaluator-schema-H23XCLNE.js.map +1 -0
- package/dist/{get-analytics-BAVXTAPB.js → get-analytics-4YJW4S5L.js} +2 -2
- package/dist/get-evaluator-WDEH2F7M.js +47 -0
- package/dist/get-evaluator-WDEH2F7M.js.map +1 -0
- package/dist/{get-prompt-LKCPT26O.js → get-prompt-F6PDVC76.js} +2 -5
- package/dist/get-prompt-F6PDVC76.js.map +1 -0
- package/dist/{get-scenario-3SCDW4Z6.js → get-scenario-H24ZYNT5.js} +3 -3
- package/dist/{get-trace-QFDWJ5D4.js → get-trace-27USKGO7.js} +2 -2
- package/dist/index.js +13310 -2410
- package/dist/index.js.map +1 -1
- package/dist/list-evaluators-KRGI72EH.js +34 -0
- package/dist/list-evaluators-KRGI72EH.js.map +1 -0
- package/dist/list-model-providers-A5YCFTPI.js +35 -0
- package/dist/list-model-providers-A5YCFTPI.js.map +1 -0
- package/dist/{list-prompts-UQPBCUYA.js → list-prompts-LKJSE7XN.js} +6 -7
- package/dist/list-prompts-LKJSE7XN.js.map +1 -0
- package/dist/{list-scenarios-573YOUKC.js → list-scenarios-ZK5CMGC4.js} +5 -5
- package/dist/list-scenarios-ZK5CMGC4.js.map +1 -0
- package/dist/{search-traces-RSMYCAN7.js → search-traces-SOKAAMAR.js} +2 -2
- package/dist/set-model-provider-7MGULZDH.js +33 -0
- package/dist/set-model-provider-7MGULZDH.js.map +1 -0
- package/dist/update-evaluator-A3XINFLJ.js +24 -0
- package/dist/update-evaluator-A3XINFLJ.js.map +1 -0
- package/dist/update-prompt-IW7X2UQM.js +22 -0
- package/dist/update-prompt-IW7X2UQM.js.map +1 -0
- package/dist/{update-scenario-SSGVOBJO.js → update-scenario-ZT7TOBFR.js} +3 -3
- package/dist/update-scenario-ZT7TOBFR.js.map +1 -0
- package/package.json +10 -10
- package/src/__tests__/all-tools.integration.test.ts +1337 -0
- package/src/__tests__/discover-evaluator-schema.unit.test.ts +89 -0
- package/src/__tests__/evaluator-tools.unit.test.ts +262 -0
- package/src/__tests__/integration.integration.test.ts +9 -34
- package/src/__tests__/langwatch-api.unit.test.ts +4 -32
- package/src/__tests__/model-provider-tools.unit.test.ts +190 -0
- package/src/__tests__/scenario-tools.integration.test.ts +5 -5
- package/src/__tests__/scenario-tools.unit.test.ts +2 -2
- package/src/__tests__/tools.unit.test.ts +59 -65
- package/src/index.ts +249 -88
- package/src/langwatch-api-evaluators.ts +70 -0
- package/src/langwatch-api-model-providers.ts +41 -0
- package/src/langwatch-api.ts +3 -28
- package/src/tools/archive-scenario.ts +1 -1
- package/src/tools/create-evaluator.ts +33 -0
- package/src/tools/create-prompt.ts +30 -5
- package/src/tools/create-scenario.ts +1 -1
- package/src/tools/discover-evaluator-schema.ts +143 -0
- package/src/tools/get-evaluator.ts +53 -0
- package/src/tools/get-prompt.ts +1 -4
- package/src/tools/list-evaluators.ts +37 -0
- package/src/tools/list-model-providers.ts +40 -0
- package/src/tools/list-prompts.ts +5 -6
- package/src/tools/list-scenarios.ts +3 -3
- package/src/tools/set-model-provider.ts +46 -0
- package/src/tools/update-evaluator.ts +30 -0
- package/src/tools/update-prompt.ts +9 -25
- package/src/tools/update-scenario.ts +1 -1
- package/dist/archive-scenario-GAE4XVFM.js.map +0 -1
- package/dist/chunk-JVWDWL3J.js.map +0 -1
- package/dist/create-prompt-P35POKBW.js +0 -22
- package/dist/create-prompt-P35POKBW.js.map +0 -1
- package/dist/create-scenario-3YRZVDYF.js.map +0 -1
- package/dist/get-prompt-LKCPT26O.js.map +0 -1
- package/dist/list-prompts-UQPBCUYA.js.map +0 -1
- package/dist/list-scenarios-573YOUKC.js.map +0 -1
- package/dist/update-prompt-G2Y5EBQY.js +0 -31
- package/dist/update-prompt-G2Y5EBQY.js.map +0 -1
- package/dist/update-scenario-SSGVOBJO.js.map +0 -1
- /package/dist/{chunk-K2YFPOSD.js.map → chunk-6U4TCGFC.js.map} +0 -0
- /package/dist/{get-analytics-BAVXTAPB.js.map → get-analytics-4YJW4S5L.js.map} +0 -0
- /package/dist/{get-scenario-3SCDW4Z6.js.map → get-scenario-H24ZYNT5.js.map} +0 -0
- /package/dist/{get-trace-QFDWJ5D4.js.map → get-trace-27USKGO7.js.map} +0 -0
- /package/dist/{search-traces-RSMYCAN7.js.map → search-traces-SOKAAMAR.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.6.0](https://github.com/langwatch/langwatch/compare/mcp-server@v0.5.0...mcp-server@v0.6.0) (2026-03-13)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add platform MCP tools for evaluators and model providers ([#1762](https://github.com/langwatch/langwatch/issues/1762)) ([6339001](https://github.com/langwatch/langwatch/commit/6339001ffae3c83f7c3ea0cdadf480f4ec47f3cc))
|
|
9
|
+
* prefix platform MCP tools with `platform_` and add disambiguation notes ([#1760](https://github.com/langwatch/langwatch/issues/1760)) ([91851ee](https://github.com/langwatch/langwatch/commit/91851ee28aff1b3b75d92ce46aec6ae5072ff625))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **deps:** pin transitive npm deps for Dependabot high-severity alerts ([#2220](https://github.com/langwatch/langwatch/issues/2220)) ([a179da1](https://github.com/langwatch/langwatch/commit/a179da1d55859b8c9a476a6443dbfaf6bf632af3))
|
|
15
|
+
* **mcp:** align prompt tool schemas with backend API ([#2326](https://github.com/langwatch/langwatch/issues/2326)) ([65279f3](https://github.com/langwatch/langwatch/commit/65279f38687bae5c7dc7a13db33dcb2f7d135397))
|
|
16
|
+
* **mcp:** resolve get_trace 404 and search_traces metadata filter bugs ([#2214](https://github.com/langwatch/langwatch/issues/2214)) ([a0362e6](https://github.com/langwatch/langwatch/commit/a0362e60aa54e7c6e5dac9f241b206f4f4cd0b5f))
|
|
17
|
+
* normalize defaultModel with provider prefix for litellm routing ([cc7798e](https://github.com/langwatch/langwatch/commit/cc7798ecb229654f371912e7863ca20364ceb7fa))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Miscellaneous
|
|
21
|
+
|
|
22
|
+
* **deps:** batch safe JS dependency bumps (Tier 1a) ([#2169](https://github.com/langwatch/langwatch/issues/2169)) ([8b5b891](https://github.com/langwatch/langwatch/commit/8b5b8915941f19ca07019b330e276f01ae3bface))
|
|
23
|
+
* **deps:** bump mcp-server zod to v4 ([#1977](https://github.com/langwatch/langwatch/issues/1977)) ([eb89188](https://github.com/langwatch/langwatch/commit/eb891883eb47db01bfee4d184b1c9b19e3cc60d7))
|
|
24
|
+
* **deps:** bump Node.js dependencies - batch 2 ([#1947](https://github.com/langwatch/langwatch/issues/1947)) ([98d9f5c](https://github.com/langwatch/langwatch/commit/98d9f5cb53dc13051c500359def11b35762fd5e5))
|
|
25
|
+
* **deps:** bump safe npm dependencies (19 dependabot PRs) ([#1931](https://github.com/langwatch/langwatch/issues/1931)) ([4d7607e](https://github.com/langwatch/langwatch/commit/4d7607e5d467749e2e47fc3b0b2b58c212bc8721))
|
|
26
|
+
* **deps:** bump the npm_and_yarn group across 1 directory with 5 updates ([#1948](https://github.com/langwatch/langwatch/issues/1948)) ([9227fb4](https://github.com/langwatch/langwatch/commit/9227fb4b96184a82c87ab95f00fb985491df7224))
|
|
27
|
+
|
|
3
28
|
## [0.5.0](https://github.com/langwatch/langwatch/compare/mcp-server@v0.4.0...mcp-server@v0.5.0) (2026-02-20)
|
|
4
29
|
|
|
5
30
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
archiveScenario
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-6U4TCGFC.js";
|
|
4
|
+
import "./chunk-LLRQIF52.js";
|
|
5
5
|
import "./chunk-AAQNA53E.js";
|
|
6
6
|
|
|
7
7
|
// src/tools/archive-scenario.ts
|
|
@@ -16,4 +16,4 @@ async function handleArchiveScenario(params) {
|
|
|
16
16
|
export {
|
|
17
17
|
handleArchiveScenario
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=archive-scenario-
|
|
19
|
+
//# sourceMappingURL=archive-scenario-YFD5THOR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/archive-scenario.ts"],"sourcesContent":["import { archiveScenario as apiArchiveScenario } from \"../langwatch-api-scenarios.js\";\n\n/**\n * Handles the platform_archive_scenario MCP tool invocation.\n *\n * Archives (soft-deletes) a scenario and returns confirmation.\n */\nexport async function handleArchiveScenario(params: {\n scenarioId: string;\n}): Promise<string> {\n const result = await apiArchiveScenario(params.scenarioId);\n\n const lines: string[] = [];\n lines.push(\"Scenario archived successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n lines.push(`**Status**: ${result.archived ? \"archived\" : \"active\"}`);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAOA,eAAsB,sBAAsB,QAExB;AAClB,QAAM,SAAS,MAAM,gBAAmB,OAAO,UAAU;AAEzD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,QAAM,KAAK,eAAe,OAAO,WAAW,aAAa,QAAQ,EAAE;AAEnE,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
makeRequest
|
|
3
|
+
} from "./chunk-LLRQIF52.js";
|
|
4
|
+
|
|
5
|
+
// src/langwatch-api-evaluators.ts
|
|
6
|
+
function getEvaluatorType(evaluator) {
|
|
7
|
+
return evaluator.config?.evaluatorType;
|
|
8
|
+
}
|
|
9
|
+
async function listEvaluators() {
|
|
10
|
+
return makeRequest("GET", "/api/evaluators");
|
|
11
|
+
}
|
|
12
|
+
async function getEvaluator(idOrSlug) {
|
|
13
|
+
return makeRequest(
|
|
14
|
+
"GET",
|
|
15
|
+
`/api/evaluators/${encodeURIComponent(idOrSlug)}`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
async function createEvaluator(data) {
|
|
19
|
+
return makeRequest("POST", "/api/evaluators", data);
|
|
20
|
+
}
|
|
21
|
+
async function updateEvaluator(params) {
|
|
22
|
+
const { id, ...data } = params;
|
|
23
|
+
return makeRequest(
|
|
24
|
+
"PUT",
|
|
25
|
+
`/api/evaluators/${encodeURIComponent(id)}`,
|
|
26
|
+
data
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
getEvaluatorType,
|
|
32
|
+
listEvaluators,
|
|
33
|
+
getEvaluator,
|
|
34
|
+
createEvaluator,
|
|
35
|
+
updateEvaluator
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=chunk-5UOPNRXW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/langwatch-api-evaluators.ts"],"sourcesContent":["import { makeRequest } from \"./langwatch-api.js\";\n\n// --- Evaluator types ---\n\nexport interface EvaluatorSummary {\n id: string;\n projectId: string;\n name: string;\n slug: string | null;\n type: string;\n config: Record<string, unknown> | null;\n workflowId: string | null;\n copiedFromEvaluatorId: string | null;\n createdAt: string;\n updatedAt: string;\n fields: Array<{ identifier: string; type: string; optional?: boolean }>;\n outputFields: Array<{ identifier: string; type: string; optional?: boolean }>;\n workflowName?: string;\n workflowIcon?: string;\n}\n\n// --- Helpers ---\n\n/**\n * Extracts the evaluatorType from an evaluator's config.\n * Centralises the cast so callers don't repeat it.\n */\nexport function getEvaluatorType(\n evaluator: Pick<EvaluatorSummary, \"config\">,\n): string | undefined {\n return (evaluator.config as Record<string, unknown> | null)\n ?.evaluatorType as string | undefined;\n}\n\n// --- Evaluator API functions ---\n\n/** Lists all evaluators in the project. */\nexport async function listEvaluators(): Promise<EvaluatorSummary[]> {\n return makeRequest(\"GET\", \"/api/evaluators\") as Promise<EvaluatorSummary[]>;\n}\n\n/** Retrieves a single evaluator by ID or slug. */\nexport async function getEvaluator(idOrSlug: string): Promise<EvaluatorSummary> {\n return makeRequest(\n \"GET\",\n `/api/evaluators/${encodeURIComponent(idOrSlug)}`,\n ) as Promise<EvaluatorSummary>;\n}\n\n/** Creates a new evaluator. */\nexport async function createEvaluator(data: {\n name: string;\n config: Record<string, unknown>;\n}): Promise<EvaluatorSummary> {\n return makeRequest(\"POST\", \"/api/evaluators\", data) as Promise<EvaluatorSummary>;\n}\n\n/** Updates an existing evaluator. */\nexport async function updateEvaluator(params: {\n id: string;\n name?: string;\n config?: Record<string, unknown>;\n}): Promise<EvaluatorSummary> {\n const { id, ...data } = params;\n return makeRequest(\n \"PUT\",\n `/api/evaluators/${encodeURIComponent(id)}`,\n data,\n ) as Promise<EvaluatorSummary>;\n}\n"],"mappings":";;;;;AA2BO,SAAS,iBACd,WACoB;AACpB,SAAQ,UAAU,QACd;AACN;AAKA,eAAsB,iBAA8C;AAClE,SAAO,YAAY,OAAO,iBAAiB;AAC7C;AAGA,eAAsB,aAAa,UAA6C;AAC9E,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,mBAAmB,QAAQ,CAAC;AAAA,EACjD;AACF;AAGA,eAAsB,gBAAgB,MAGR;AAC5B,SAAO,YAAY,QAAQ,mBAAmB,IAAI;AACpD;AAGA,eAAsB,gBAAgB,QAIR;AAC5B,QAAM,EAAE,IAAI,GAAG,KAAK,IAAI;AACxB,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,mBAAmB,EAAE,CAAC;AAAA,IACzC;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeRequest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LLRQIF52.js";
|
|
4
4
|
|
|
5
5
|
// src/langwatch-api-scenarios.ts
|
|
6
6
|
async function listScenarios() {
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
updateScenario,
|
|
38
38
|
archiveScenario
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-6U4TCGFC.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
makeRequest
|
|
3
|
+
} from "./chunk-LLRQIF52.js";
|
|
4
|
+
|
|
5
|
+
// src/langwatch-api-model-providers.ts
|
|
6
|
+
async function listModelProviders() {
|
|
7
|
+
return makeRequest("GET", "/api/model-providers");
|
|
8
|
+
}
|
|
9
|
+
async function setModelProvider(params) {
|
|
10
|
+
const { provider, ...data } = params;
|
|
11
|
+
return makeRequest(
|
|
12
|
+
"PUT",
|
|
13
|
+
`/api/model-providers/${encodeURIComponent(provider)}`,
|
|
14
|
+
data
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
listModelProviders,
|
|
20
|
+
setModelProvider
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=chunk-IX6QJKAD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/langwatch-api-model-providers.ts"],"sourcesContent":["import { makeRequest } from \"./langwatch-api.js\";\n\n// --- Model Provider types ---\n\nexport interface ModelProviderEntry {\n id?: string;\n provider: string;\n enabled: boolean;\n customKeys: Record<string, unknown> | null;\n models?: string[] | null;\n embeddingsModels?: string[] | null;\n customModels?: unknown[] | null;\n customEmbeddingsModels?: unknown[] | null;\n disabledByDefault?: boolean;\n deploymentMapping?: unknown;\n extraHeaders?: Array<{ key: string; value: string }> | null;\n}\n\n// --- Model Provider API functions ---\n\n/** Lists all model providers for the project, with masked API keys. */\nexport async function listModelProviders(): Promise<Record<string, ModelProviderEntry>> {\n return makeRequest(\"GET\", \"/api/model-providers\") as Promise<\n Record<string, ModelProviderEntry>\n >;\n}\n\n/** Creates or updates a model provider. */\nexport async function setModelProvider(params: {\n provider: string;\n enabled: boolean;\n customKeys?: Record<string, unknown>;\n defaultModel?: string;\n}): Promise<Record<string, ModelProviderEntry>> {\n const { provider, ...data } = params;\n return makeRequest(\n \"PUT\",\n `/api/model-providers/${encodeURIComponent(provider)}`,\n data,\n ) as Promise<Record<string, ModelProviderEntry>>;\n}\n"],"mappings":";;;;;AAqBA,eAAsB,qBAAkE;AACtF,SAAO,YAAY,OAAO,sBAAsB;AAGlD;AAGA,eAAsB,iBAAiB,QAKS;AAC9C,QAAM,EAAE,UAAU,GAAG,KAAK,IAAI;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,wBAAwB,mBAAmB,QAAQ,CAAC;AAAA,IACpD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -64,18 +64,11 @@ async function createPrompt(data) {
|
|
|
64
64
|
}
|
|
65
65
|
async function updatePrompt(idOrHandle, data) {
|
|
66
66
|
return makeRequest(
|
|
67
|
-
"
|
|
67
|
+
"PUT",
|
|
68
68
|
`/api/prompts/${encodeURIComponent(idOrHandle)}`,
|
|
69
69
|
data
|
|
70
70
|
);
|
|
71
71
|
}
|
|
72
|
-
async function createPromptVersion(idOrHandle, data) {
|
|
73
|
-
return makeRequest(
|
|
74
|
-
"POST",
|
|
75
|
-
`/api/prompts/${encodeURIComponent(idOrHandle)}/versions`,
|
|
76
|
-
data
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
72
|
|
|
80
73
|
export {
|
|
81
74
|
makeRequest,
|
|
@@ -85,7 +78,6 @@ export {
|
|
|
85
78
|
listPrompts,
|
|
86
79
|
getPrompt,
|
|
87
80
|
createPrompt,
|
|
88
|
-
updatePrompt
|
|
89
|
-
createPromptVersion
|
|
81
|
+
updatePrompt
|
|
90
82
|
};
|
|
91
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-LLRQIF52.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/langwatch-api.ts"],"sourcesContent":["import { getConfig, requireApiKey } from \"./config.js\";\n\n// --- Response types ---\n\nexport interface TraceSearchResult {\n trace_id: string;\n formatted_trace?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: { started_at?: string | number };\n metadata?: Record<string, unknown>;\n error?: Record<string, unknown>;\n}\n\nexport interface SearchTracesResponse {\n traces: TraceSearchResult[];\n pagination?: {\n totalHits?: number;\n scrollId?: string;\n };\n}\n\nexport interface TraceDetailResponse {\n trace_id: string;\n formatted_trace?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: {\n started_at?: string | number;\n updated_at?: string | number;\n inserted_at?: string | number;\n };\n metadata?: {\n user_id?: string;\n thread_id?: string;\n customer_id?: string;\n labels?: string[];\n [key: string]: unknown;\n };\n error?: Record<string, unknown>;\n ascii_tree?: string;\n evaluations?: Array<{\n evaluator_id?: string;\n name?: string;\n score?: number;\n passed?: boolean;\n label?: string;\n }>;\n spans?: Array<{\n span_id: string;\n name?: string;\n type?: string;\n model?: string;\n input?: { value: string };\n output?: { value: string };\n timestamps?: { started_at?: number; finished_at?: number };\n metrics?: {\n completion_time_ms?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n tokens_estimated?: boolean;\n cost?: number;\n };\n }>;\n}\n\nexport interface AnalyticsBucket {\n date: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsTimeseriesResponse {\n currentPeriod: AnalyticsBucket[];\n previousPeriod: AnalyticsBucket[];\n}\n\nexport interface PromptSummary {\n id?: string;\n handle?: string;\n name?: string;\n latestVersionNumber?: number;\n version?: number;\n}\n\nexport interface PromptVersion {\n version?: number;\n commitMessage?: string;\n model?: string;\n messages?: Array<{ role: string; content: string }>;\n}\n\nexport interface PromptDetailResponse extends PromptSummary {\n versions?: PromptVersion[];\n model?: string;\n messages?: Array<{ role: string; content: string }>;\n prompt?: Array<{ role: string; content: string }>;\n}\n\nexport interface PromptMutationResponse {\n id?: string;\n handle?: string;\n name?: string;\n latestVersionNumber?: number;\n}\n\n// --- HTTP client ---\n\n/**\n * Sends an HTTP request to the LangWatch API.\n *\n * Builds the full URL from the configured endpoint, adds authentication,\n * and handles JSON serialization/deserialization.\n *\n * @throws Error with status code and response body when the response is not OK\n */\nexport async function makeRequest(\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown\n): Promise<unknown> {\n const url = getConfig().endpoint + path;\n const headers: Record<string, string> = {\n \"X-Auth-Token\": requireApiKey(),\n };\n\n if (body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const response = await fetch(url, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!response.ok) {\n const responseBody = await response.text();\n throw new Error(\n `LangWatch API error ${response.status}: ${responseBody}`\n );\n }\n\n return response.json();\n}\n\n/** Searches traces with optional filters and pagination. */\nexport async function searchTraces(params: {\n query?: string;\n filters?: Record<string, string[]>;\n startDate: number;\n endDate: number;\n pageSize?: number;\n pageOffset?: number;\n scrollId?: string;\n format?: \"digest\" | \"json\";\n}): Promise<SearchTracesResponse> {\n const { format = \"digest\", ...rest } = params;\n return makeRequest(\"POST\", \"/api/traces/search\", {\n ...rest,\n format,\n }) as Promise<SearchTracesResponse>;\n}\n\n/** Retrieves a single trace by its ID. */\nexport async function getTraceById(\n traceId: string,\n format: \"digest\" | \"json\" = \"digest\"\n): Promise<TraceDetailResponse> {\n return makeRequest(\n \"GET\",\n `/api/traces/${encodeURIComponent(traceId)}?format=${format}`\n ) as Promise<TraceDetailResponse>;\n}\n\n/** Fetches analytics timeseries data for the given metrics and date range. */\nexport async function getAnalyticsTimeseries(params: {\n series: Array<{\n metric: string;\n aggregation: string;\n key?: string;\n subkey?: string;\n }>;\n startDate: number;\n endDate: number;\n timeZone?: string;\n groupBy?: string;\n groupByKey?: string;\n filters?: Record<string, string[]>;\n}): Promise<AnalyticsTimeseriesResponse> {\n return makeRequest(\n \"POST\",\n \"/api/analytics/timeseries\",\n params\n ) as Promise<AnalyticsTimeseriesResponse>;\n}\n\n/** Lists all prompts in the project. */\nexport async function listPrompts(): Promise<PromptSummary[]> {\n return makeRequest(\"GET\", \"/api/prompts\") as Promise<PromptSummary[]>;\n}\n\n/** Retrieves a single prompt by ID or handle. */\nexport async function getPrompt(\n idOrHandle: string,\n version?: number\n): Promise<PromptDetailResponse> {\n const query = version != null ? `?version=${version}` : \"\";\n return makeRequest(\n \"GET\",\n `/api/prompts/${encodeURIComponent(idOrHandle)}${query}`\n ) as Promise<PromptDetailResponse>;\n}\n\n/** Creates a new prompt. */\nexport async function createPrompt(data: {\n handle: string;\n messages: Array<{ role: string; content: string }>;\n model: string;\n}): Promise<PromptMutationResponse> {\n return makeRequest(\n \"POST\",\n \"/api/prompts\",\n data\n ) as Promise<PromptMutationResponse>;\n}\n\n/** Updates an existing prompt by ID or handle. */\nexport async function updatePrompt(\n idOrHandle: string,\n data: {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n commitMessage: string;\n }\n): Promise<PromptMutationResponse> {\n return makeRequest(\n \"PUT\",\n `/api/prompts/${encodeURIComponent(idOrHandle)}`,\n data\n ) as Promise<PromptMutationResponse>;\n}\n"],"mappings":";;;;;;AAmHA,eAAsB,YACpB,QACA,MACA,MACkB;AAClB,QAAM,MAAM,UAAU,EAAE,WAAW;AACnC,QAAM,UAAkC;AAAA,IACtC,gBAAgB,cAAc;AAAA,EAChC;AAEA,MAAI,SAAS,QAAW;AACtB,YAAQ,cAAc,IAAI;AAAA,EAC5B;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC;AAAA,IACA;AAAA,IACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,EAC7D,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,eAAe,MAAM,SAAS,KAAK;AACzC,UAAM,IAAI;AAAA,MACR,uBAAuB,SAAS,MAAM,KAAK,YAAY;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,SAAS,KAAK;AACvB;AAGA,eAAsB,aAAa,QASD;AAChC,QAAM,EAAE,SAAS,UAAU,GAAG,KAAK,IAAI;AACvC,SAAO,YAAY,QAAQ,sBAAsB;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAGA,eAAsB,aACpB,SACA,SAA4B,UACE;AAC9B,SAAO;AAAA,IACL;AAAA,IACA,eAAe,mBAAmB,OAAO,CAAC,WAAW,MAAM;AAAA,EAC7D;AACF;AAGA,eAAsB,uBAAuB,QAaJ;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,cAAwC;AAC5D,SAAO,YAAY,OAAO,cAAc;AAC1C;AAGA,eAAsB,UACpB,YACA,SAC+B;AAC/B,QAAM,QAAQ,WAAW,OAAO,YAAY,OAAO,KAAK;AACxD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,mBAAmB,UAAU,CAAC,GAAG,KAAK;AAAA,EACxD;AACF;AAGA,eAAsB,aAAa,MAIC;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,aACpB,YACA,MAKiC;AACjC,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,mBAAmB,UAAU,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createEvaluator,
|
|
3
|
+
getEvaluatorType
|
|
4
|
+
} from "./chunk-5UOPNRXW.js";
|
|
5
|
+
import "./chunk-LLRQIF52.js";
|
|
6
|
+
import "./chunk-AAQNA53E.js";
|
|
7
|
+
|
|
8
|
+
// src/tools/create-evaluator.ts
|
|
9
|
+
async function handleCreateEvaluator(params) {
|
|
10
|
+
const result = await createEvaluator(params);
|
|
11
|
+
const evaluatorType = getEvaluatorType(result);
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push("Evaluator created successfully!\n");
|
|
14
|
+
lines.push(`**ID**: ${result.id}`);
|
|
15
|
+
if (result.slug) lines.push(`**Slug**: ${result.slug}`);
|
|
16
|
+
lines.push(`**Name**: ${result.name}`);
|
|
17
|
+
if (evaluatorType) lines.push(`**Evaluator Type**: ${evaluatorType}`);
|
|
18
|
+
lines.push(`**Kind**: ${result.type}`);
|
|
19
|
+
if (Array.isArray(result.fields) && result.fields.length > 0) {
|
|
20
|
+
lines.push(`**Input Fields**: ${result.fields.map((f) => f.identifier).join(", ")}`);
|
|
21
|
+
}
|
|
22
|
+
return lines.join("\n");
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
handleCreateEvaluator
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=create-evaluator-E5X5ZP3B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/create-evaluator.ts"],"sourcesContent":["import {\n createEvaluator as apiCreateEvaluator,\n getEvaluatorType,\n} from \"../langwatch-api-evaluators.js\";\n\n/**\n * Handles the platform_create_evaluator MCP tool invocation.\n *\n * Creates a new evaluator in the LangWatch project and returns a\n * confirmation with the created evaluator's details.\n */\nexport async function handleCreateEvaluator(params: {\n name: string;\n config: Record<string, unknown>;\n}): Promise<string> {\n const result = await apiCreateEvaluator(params);\n\n const evaluatorType = getEvaluatorType(result);\n\n const lines: string[] = [];\n lines.push(\"Evaluator created successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n if (result.slug) lines.push(`**Slug**: ${result.slug}`);\n lines.push(`**Name**: ${result.name}`);\n if (evaluatorType) lines.push(`**Evaluator Type**: ${evaluatorType}`);\n lines.push(`**Kind**: ${result.type}`);\n\n if (Array.isArray(result.fields) && result.fields.length > 0) {\n lines.push(`**Input Fields**: ${result.fields.map((f) => f.identifier).join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,sBAAsB,QAGxB;AAClB,QAAM,SAAS,MAAM,gBAAmB,MAAM;AAE9C,QAAM,gBAAgB,iBAAiB,MAAM;AAE7C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,MAAI,OAAO,KAAM,OAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACtD,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACrC,MAAI,cAAe,OAAM,KAAK,uBAAuB,aAAa,EAAE;AACpE,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AAErC,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,UAAM,KAAK,qBAAqB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACrF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createPrompt
|
|
3
|
+
} from "./chunk-LLRQIF52.js";
|
|
4
|
+
import "./chunk-AAQNA53E.js";
|
|
5
|
+
|
|
6
|
+
// src/tools/create-prompt.ts
|
|
7
|
+
var HANDLE_PATTERN = /^[a-z0-9_-]+(?:\/[a-z0-9_-]+)?$/;
|
|
8
|
+
function toHandle(name) {
|
|
9
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
10
|
+
}
|
|
11
|
+
async function handleCreatePrompt(params) {
|
|
12
|
+
const handle = params.handle?.trim() || toHandle(params.name);
|
|
13
|
+
if (!handle || !HANDLE_PATTERN.test(handle)) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
`Invalid prompt handle "${handle || ""}". Handle must match ${HANDLE_PATTERN}. Provide a valid \`handle\` explicitly.`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
const result = await createPrompt({
|
|
19
|
+
handle,
|
|
20
|
+
messages: params.messages,
|
|
21
|
+
model: params.model
|
|
22
|
+
});
|
|
23
|
+
const lines = [];
|
|
24
|
+
lines.push("Prompt created successfully!\n");
|
|
25
|
+
if (result.id) lines.push(`**ID**: ${result.id}`);
|
|
26
|
+
if (result.handle) lines.push(`**Handle**: ${result.handle}`);
|
|
27
|
+
lines.push(`**Name**: ${result.name || params.name}`);
|
|
28
|
+
lines.push(`**Model**: ${params.model}`);
|
|
29
|
+
if (result.latestVersionNumber != null)
|
|
30
|
+
lines.push(`**Version**: v${result.latestVersionNumber}`);
|
|
31
|
+
return lines.join("\n");
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
handleCreatePrompt
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=create-prompt-7Z35MIL6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/create-prompt.ts"],"sourcesContent":["import { createPrompt as apiCreatePrompt } from \"../langwatch-api.js\";\n\nconst HANDLE_PATTERN = /^[a-z0-9_-]+(?:\\/[a-z0-9_-]+)?$/;\n\n/**\n * Converts a human-readable name into a URL-friendly handle.\n *\n * Lowercases the input, replaces non-alphanumeric runs with hyphens,\n * and strips leading/trailing hyphens. May return an empty string\n * for inputs with no alphanumeric characters — callers must validate.\n */\nfunction toHandle(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Handles the platform_create_prompt MCP tool invocation.\n *\n * Creates a new prompt in the LangWatch project and returns a\n * confirmation with the created prompt's details.\n */\nexport async function handleCreatePrompt(params: {\n name: string;\n handle?: string;\n messages: Array<{ role: string; content: string }>;\n model: string;\n}): Promise<string> {\n const handle = params.handle?.trim() || toHandle(params.name);\n if (!handle || !HANDLE_PATTERN.test(handle)) {\n throw new Error(\n `Invalid prompt handle \"${handle || \"\"}\". Handle must match ${HANDLE_PATTERN}. Provide a valid \\`handle\\` explicitly.`\n );\n }\n\n const result = await apiCreatePrompt({\n handle,\n messages: params.messages,\n model: params.model,\n });\n\n const lines: string[] = [];\n lines.push(\"Prompt created successfully!\\n\");\n if (result.id) lines.push(`**ID**: ${result.id}`);\n if (result.handle) lines.push(`**Handle**: ${result.handle}`);\n lines.push(`**Name**: ${result.name || params.name}`);\n lines.push(`**Model**: ${params.model}`);\n if (result.latestVersionNumber != null)\n lines.push(`**Version**: v${result.latestVersionNumber}`);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;AAEA,IAAM,iBAAiB;AASvB,SAAS,SAAS,MAAsB;AACtC,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAQA,eAAsB,mBAAmB,QAKrB;AAClB,QAAM,SAAS,OAAO,QAAQ,KAAK,KAAK,SAAS,OAAO,IAAI;AAC5D,MAAI,CAAC,UAAU,CAAC,eAAe,KAAK,MAAM,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,UAAU,EAAE,wBAAwB,cAAc;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,aAAgB;AAAA,IACnC;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,EAChB,CAAC;AAED,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gCAAgC;AAC3C,MAAI,OAAO,GAAI,OAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AAChD,MAAI,OAAO,OAAQ,OAAM,KAAK,eAAe,OAAO,MAAM,EAAE;AAC5D,QAAM,KAAK,aAAa,OAAO,QAAQ,OAAO,IAAI,EAAE;AACpD,QAAM,KAAK,cAAc,OAAO,KAAK,EAAE;AACvC,MAAI,OAAO,uBAAuB;AAChC,UAAM,KAAK,iBAAiB,OAAO,mBAAmB,EAAE;AAE1D,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createScenario
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-6U4TCGFC.js";
|
|
4
|
+
import "./chunk-LLRQIF52.js";
|
|
5
5
|
import "./chunk-AAQNA53E.js";
|
|
6
6
|
|
|
7
7
|
// src/tools/create-scenario.ts
|
|
@@ -23,4 +23,4 @@ async function handleCreateScenario(params) {
|
|
|
23
23
|
export {
|
|
24
24
|
handleCreateScenario
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=create-scenario-
|
|
26
|
+
//# sourceMappingURL=create-scenario-DIMPJRPY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/create-scenario.ts"],"sourcesContent":["import { createScenario as apiCreateScenario } from \"../langwatch-api-scenarios.js\";\n\n/**\n * Handles the platform_create_scenario MCP tool invocation.\n *\n * Creates a new scenario in the LangWatch project and returns a\n * confirmation with the created scenario's details.\n */\nexport async function handleCreateScenario(params: {\n name: string;\n situation: string;\n criteria?: string[];\n labels?: string[];\n}): Promise<string> {\n const result = await apiCreateScenario(params);\n\n const lines: string[] = [];\n lines.push(\"Scenario created successfully!\\n\");\n lines.push(`**ID**: ${result.id}`);\n lines.push(`**Name**: ${result.name}`);\n lines.push(`**Situation**: ${result.situation}`);\n if (Array.isArray(result.criteria) && result.criteria.length > 0) {\n lines.push(`**Criteria**: ${result.criteria.length} criteria`);\n }\n if (Array.isArray(result.labels) && result.labels.length > 0) {\n lines.push(`**Labels**: ${result.labels.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;AAQA,eAAsB,qBAAqB,QAKvB;AAClB,QAAM,SAAS,MAAM,eAAkB,MAAM;AAE7C,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,WAAW,OAAO,EAAE,EAAE;AACjC,QAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACrC,QAAM,KAAK,kBAAkB,OAAO,SAAS,EAAE;AAC/C,MAAI,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,GAAG;AAChE,UAAM,KAAK,iBAAiB,OAAO,SAAS,MAAM,WAAW;AAAA,EAC/D;AACA,MAAI,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAC5D,UAAM,KAAK,eAAe,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|