scorecard-ai-mcp 2.0.0 → 2.1.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/README.md +39 -0
- package/code-tool-paths.cjs +6 -0
- package/code-tool-paths.cjs.map +1 -0
- package/code-tool-paths.d.cts +2 -0
- package/code-tool-paths.d.cts.map +1 -0
- package/code-tool-types.d.mts +14 -0
- package/code-tool-types.d.mts.map +1 -0
- package/code-tool-types.d.ts +14 -0
- package/code-tool-types.d.ts.map +1 -0
- package/code-tool-types.js +4 -0
- package/code-tool-types.js.map +1 -0
- package/code-tool-types.mjs +3 -0
- package/code-tool-types.mjs.map +1 -0
- package/code-tool-worker.d.mts +5 -0
- package/code-tool-worker.d.mts.map +1 -0
- package/code-tool-worker.d.ts +5 -0
- package/code-tool-worker.d.ts.map +1 -0
- package/code-tool-worker.js +45 -0
- package/code-tool-worker.js.map +1 -0
- package/code-tool-worker.mjs +40 -0
- package/code-tool-worker.mjs.map +1 -0
- package/code-tool.d.mts +12 -0
- package/code-tool.d.mts.map +1 -0
- package/code-tool.d.ts +12 -0
- package/code-tool.d.ts.map +1 -0
- package/code-tool.js +157 -0
- package/code-tool.js.map +1 -0
- package/code-tool.mjs +121 -0
- package/code-tool.mjs.map +1 -0
- package/compat.d.mts +4 -2
- package/compat.d.mts.map +1 -1
- package/compat.d.ts +4 -2
- package/compat.d.ts.map +1 -1
- package/compat.js +8 -3
- package/compat.js.map +1 -1
- package/compat.mjs +7 -2
- package/compat.mjs.map +1 -1
- package/filtering.d.mts +2 -0
- package/filtering.d.mts.map +1 -0
- package/filtering.d.ts +2 -0
- package/filtering.d.ts.map +1 -0
- package/filtering.js +20 -0
- package/filtering.js.map +1 -0
- package/filtering.mjs +13 -0
- package/filtering.mjs.map +1 -0
- package/headers.d.mts +4 -0
- package/headers.d.mts.map +1 -0
- package/headers.d.ts +4 -0
- package/headers.d.ts.map +1 -0
- package/headers.js +22 -0
- package/headers.js.map +1 -0
- package/headers.mjs +18 -0
- package/headers.mjs.map +1 -0
- package/http.d.mts +9 -0
- package/http.d.mts.map +1 -0
- package/http.d.ts +9 -0
- package/http.d.ts.map +1 -0
- package/http.js +108 -0
- package/http.js.map +1 -0
- package/http.mjs +100 -0
- package/http.mjs.map +1 -0
- package/index.js +15 -10
- package/index.js.map +1 -1
- package/index.mjs +17 -12
- package/index.mjs.map +1 -1
- package/options.d.mts +11 -6
- package/options.d.mts.map +1 -1
- package/options.d.ts +11 -6
- package/options.d.ts.map +1 -1
- package/options.js +136 -15
- package/options.js.map +1 -1
- package/options.mjs +135 -15
- package/options.mjs.map +1 -1
- package/package.json +89 -4
- package/server.d.mts +4 -16
- package/server.d.mts.map +1 -1
- package/server.d.ts +4 -16
- package/server.d.ts.map +1 -1
- package/server.js +86 -33
- package/server.js.map +1 -1
- package/server.mjs +84 -32
- package/server.mjs.map +1 -1
- package/src/code-tool-paths.cts +3 -0
- package/src/code-tool-types.ts +14 -0
- package/src/code-tool-worker.ts +46 -0
- package/src/code-tool.ts +146 -0
- package/src/compat.ts +9 -4
- package/src/filtering.ts +14 -0
- package/src/headers.ts +23 -0
- package/src/http.ts +127 -0
- package/src/index.ts +18 -14
- package/src/options.ts +158 -21
- package/src/server.ts +103 -48
- package/src/stdio.ts +13 -0
- package/src/tools/metrics/create-metrics.ts +8 -2
- package/src/tools/metrics/update-metrics.ts +8 -2
- package/src/tools/projects/create-projects.ts +14 -5
- package/src/tools/projects/list-projects.ts +16 -5
- package/src/tools/records/create-records.ts +17 -5
- package/src/tools/runs/create-runs.ts +14 -5
- package/src/tools/scores/upsert-scores.ts +16 -5
- package/src/tools/systems/delete-systems.ts +16 -5
- package/src/tools/systems/get-systems.ts +16 -5
- package/src/tools/systems/list-systems.ts +17 -5
- package/src/tools/systems/update-systems.ts +13 -5
- package/src/tools/systems/upsert-systems.ts +15 -5
- package/src/tools/systems/versions/get-systems-versions.ts +18 -5
- package/src/tools/systems/versions/upsert-systems-versions.ts +16 -5
- package/src/tools/testcases/create-testcases.ts +15 -5
- package/src/tools/testcases/delete-testcases.ts +14 -5
- package/src/tools/testcases/get-testcases.ts +16 -5
- package/src/tools/testcases/list-testcases.ts +17 -5
- package/src/tools/testcases/update-testcases.ts +17 -5
- package/src/tools/testsets/create-testsets.ts +14 -5
- package/src/tools/testsets/delete-testsets.ts +16 -5
- package/src/tools/testsets/get-testsets.ts +16 -5
- package/src/tools/testsets/list-testsets.ts +17 -5
- package/src/tools/testsets/update-testsets.ts +14 -5
- package/src/tools/types.ts +1 -1
- package/stdio.d.mts +3 -0
- package/stdio.d.mts.map +1 -0
- package/stdio.d.ts +3 -0
- package/stdio.d.ts.map +1 -0
- package/stdio.js +14 -0
- package/stdio.js.map +1 -0
- package/stdio.mjs +10 -0
- package/stdio.mjs.map +1 -0
- package/tools/metrics/create-metrics.d.mts +1 -1
- package/tools/metrics/create-metrics.d.mts.map +1 -1
- package/tools/metrics/create-metrics.d.ts +1 -1
- package/tools/metrics/create-metrics.d.ts.map +1 -1
- package/tools/metrics/create-metrics.js +7 -0
- package/tools/metrics/create-metrics.js.map +1 -1
- package/tools/metrics/create-metrics.mjs +7 -0
- package/tools/metrics/create-metrics.mjs.map +1 -1
- package/tools/metrics/update-metrics.d.mts +1 -1
- package/tools/metrics/update-metrics.d.mts.map +1 -1
- package/tools/metrics/update-metrics.d.ts +1 -1
- package/tools/metrics/update-metrics.d.ts.map +1 -1
- package/tools/metrics/update-metrics.js +7 -0
- package/tools/metrics/update-metrics.js.map +1 -1
- package/tools/metrics/update-metrics.mjs +7 -0
- package/tools/metrics/update-metrics.mjs.map +1 -1
- package/tools/projects/create-projects.d.mts +1 -1
- package/tools/projects/create-projects.d.mts.map +1 -1
- package/tools/projects/create-projects.d.ts +1 -1
- package/tools/projects/create-projects.d.ts.map +1 -1
- package/tools/projects/create-projects.js +11 -3
- package/tools/projects/create-projects.js.map +1 -1
- package/tools/projects/create-projects.mjs +11 -3
- package/tools/projects/create-projects.mjs.map +1 -1
- package/tools/projects/list-projects.d.mts +1 -1
- package/tools/projects/list-projects.d.mts.map +1 -1
- package/tools/projects/list-projects.d.ts +1 -1
- package/tools/projects/list-projects.d.ts.map +1 -1
- package/tools/projects/list-projects.js +14 -3
- package/tools/projects/list-projects.js.map +1 -1
- package/tools/projects/list-projects.mjs +14 -3
- package/tools/projects/list-projects.mjs.map +1 -1
- package/tools/records/create-records.d.mts +1 -1
- package/tools/records/create-records.d.mts.map +1 -1
- package/tools/records/create-records.d.ts +1 -1
- package/tools/records/create-records.d.ts.map +1 -1
- package/tools/records/create-records.js +14 -3
- package/tools/records/create-records.js.map +1 -1
- package/tools/records/create-records.mjs +14 -3
- package/tools/records/create-records.mjs.map +1 -1
- package/tools/runs/create-runs.d.mts +1 -1
- package/tools/runs/create-runs.d.mts.map +1 -1
- package/tools/runs/create-runs.d.ts +1 -1
- package/tools/runs/create-runs.d.ts.map +1 -1
- package/tools/runs/create-runs.js +11 -3
- package/tools/runs/create-runs.js.map +1 -1
- package/tools/runs/create-runs.mjs +11 -3
- package/tools/runs/create-runs.mjs.map +1 -1
- package/tools/scores/upsert-scores.d.mts +1 -1
- package/tools/scores/upsert-scores.d.mts.map +1 -1
- package/tools/scores/upsert-scores.d.ts +1 -1
- package/tools/scores/upsert-scores.d.ts.map +1 -1
- package/tools/scores/upsert-scores.js +14 -3
- package/tools/scores/upsert-scores.js.map +1 -1
- package/tools/scores/upsert-scores.mjs +14 -3
- package/tools/scores/upsert-scores.mjs.map +1 -1
- package/tools/systems/delete-systems.d.mts +1 -1
- package/tools/systems/delete-systems.d.mts.map +1 -1
- package/tools/systems/delete-systems.d.ts +1 -1
- package/tools/systems/delete-systems.d.ts.map +1 -1
- package/tools/systems/delete-systems.js +13 -3
- package/tools/systems/delete-systems.js.map +1 -1
- package/tools/systems/delete-systems.mjs +13 -3
- package/tools/systems/delete-systems.mjs.map +1 -1
- package/tools/systems/get-systems.d.mts +1 -1
- package/tools/systems/get-systems.d.mts.map +1 -1
- package/tools/systems/get-systems.d.ts +1 -1
- package/tools/systems/get-systems.d.ts.map +1 -1
- package/tools/systems/get-systems.js +13 -3
- package/tools/systems/get-systems.js.map +1 -1
- package/tools/systems/get-systems.mjs +13 -3
- package/tools/systems/get-systems.mjs.map +1 -1
- package/tools/systems/list-systems.d.mts +1 -1
- package/tools/systems/list-systems.d.mts.map +1 -1
- package/tools/systems/list-systems.d.ts +1 -1
- package/tools/systems/list-systems.d.ts.map +1 -1
- package/tools/systems/list-systems.js +14 -3
- package/tools/systems/list-systems.js.map +1 -1
- package/tools/systems/list-systems.mjs +14 -3
- package/tools/systems/list-systems.mjs.map +1 -1
- package/tools/systems/update-systems.d.mts +1 -1
- package/tools/systems/update-systems.d.mts.map +1 -1
- package/tools/systems/update-systems.d.ts +1 -1
- package/tools/systems/update-systems.d.ts.map +1 -1
- package/tools/systems/update-systems.js +11 -3
- package/tools/systems/update-systems.js.map +1 -1
- package/tools/systems/update-systems.mjs +11 -3
- package/tools/systems/update-systems.mjs.map +1 -1
- package/tools/systems/upsert-systems.d.mts +1 -1
- package/tools/systems/upsert-systems.d.mts.map +1 -1
- package/tools/systems/upsert-systems.d.ts +1 -1
- package/tools/systems/upsert-systems.d.ts.map +1 -1
- package/tools/systems/upsert-systems.js +12 -3
- package/tools/systems/upsert-systems.js.map +1 -1
- package/tools/systems/upsert-systems.mjs +12 -3
- package/tools/systems/upsert-systems.mjs.map +1 -1
- package/tools/systems/versions/get-systems-versions.d.mts +1 -1
- package/tools/systems/versions/get-systems-versions.d.mts.map +1 -1
- package/tools/systems/versions/get-systems-versions.d.ts +1 -1
- package/tools/systems/versions/get-systems-versions.d.ts.map +1 -1
- package/tools/systems/versions/get-systems-versions.js +13 -3
- package/tools/systems/versions/get-systems-versions.js.map +1 -1
- package/tools/systems/versions/get-systems-versions.mjs +13 -3
- package/tools/systems/versions/get-systems-versions.mjs.map +1 -1
- package/tools/systems/versions/upsert-systems-versions.d.mts +1 -1
- package/tools/systems/versions/upsert-systems-versions.d.mts.map +1 -1
- package/tools/systems/versions/upsert-systems-versions.d.ts +1 -1
- package/tools/systems/versions/upsert-systems-versions.d.ts.map +1 -1
- package/tools/systems/versions/upsert-systems-versions.js +12 -3
- package/tools/systems/versions/upsert-systems-versions.js.map +1 -1
- package/tools/systems/versions/upsert-systems-versions.mjs +12 -3
- package/tools/systems/versions/upsert-systems-versions.mjs.map +1 -1
- package/tools/testcases/create-testcases.d.mts +1 -1
- package/tools/testcases/create-testcases.d.mts.map +1 -1
- package/tools/testcases/create-testcases.d.ts +1 -1
- package/tools/testcases/create-testcases.d.ts.map +1 -1
- package/tools/testcases/create-testcases.js +12 -3
- package/tools/testcases/create-testcases.js.map +1 -1
- package/tools/testcases/create-testcases.mjs +12 -3
- package/tools/testcases/create-testcases.mjs.map +1 -1
- package/tools/testcases/delete-testcases.d.mts +1 -1
- package/tools/testcases/delete-testcases.d.mts.map +1 -1
- package/tools/testcases/delete-testcases.d.ts +1 -1
- package/tools/testcases/delete-testcases.d.ts.map +1 -1
- package/tools/testcases/delete-testcases.js +11 -3
- package/tools/testcases/delete-testcases.js.map +1 -1
- package/tools/testcases/delete-testcases.mjs +11 -3
- package/tools/testcases/delete-testcases.mjs.map +1 -1
- package/tools/testcases/get-testcases.d.mts +1 -1
- package/tools/testcases/get-testcases.d.mts.map +1 -1
- package/tools/testcases/get-testcases.d.ts +1 -1
- package/tools/testcases/get-testcases.d.ts.map +1 -1
- package/tools/testcases/get-testcases.js +13 -3
- package/tools/testcases/get-testcases.js.map +1 -1
- package/tools/testcases/get-testcases.mjs +13 -3
- package/tools/testcases/get-testcases.mjs.map +1 -1
- package/tools/testcases/list-testcases.d.mts +1 -1
- package/tools/testcases/list-testcases.d.mts.map +1 -1
- package/tools/testcases/list-testcases.d.ts +1 -1
- package/tools/testcases/list-testcases.d.ts.map +1 -1
- package/tools/testcases/list-testcases.js +14 -3
- package/tools/testcases/list-testcases.js.map +1 -1
- package/tools/testcases/list-testcases.mjs +14 -3
- package/tools/testcases/list-testcases.mjs.map +1 -1
- package/tools/testcases/update-testcases.d.mts +1 -1
- package/tools/testcases/update-testcases.d.mts.map +1 -1
- package/tools/testcases/update-testcases.d.ts +1 -1
- package/tools/testcases/update-testcases.d.ts.map +1 -1
- package/tools/testcases/update-testcases.js +14 -3
- package/tools/testcases/update-testcases.js.map +1 -1
- package/tools/testcases/update-testcases.mjs +14 -3
- package/tools/testcases/update-testcases.mjs.map +1 -1
- package/tools/testsets/create-testsets.d.mts +1 -1
- package/tools/testsets/create-testsets.d.mts.map +1 -1
- package/tools/testsets/create-testsets.d.ts +1 -1
- package/tools/testsets/create-testsets.d.ts.map +1 -1
- package/tools/testsets/create-testsets.js +12 -3
- package/tools/testsets/create-testsets.js.map +1 -1
- package/tools/testsets/create-testsets.mjs +12 -3
- package/tools/testsets/create-testsets.mjs.map +1 -1
- package/tools/testsets/delete-testsets.d.mts +1 -1
- package/tools/testsets/delete-testsets.d.mts.map +1 -1
- package/tools/testsets/delete-testsets.d.ts +1 -1
- package/tools/testsets/delete-testsets.d.ts.map +1 -1
- package/tools/testsets/delete-testsets.js +13 -3
- package/tools/testsets/delete-testsets.js.map +1 -1
- package/tools/testsets/delete-testsets.mjs +13 -3
- package/tools/testsets/delete-testsets.mjs.map +1 -1
- package/tools/testsets/get-testsets.d.mts +1 -1
- package/tools/testsets/get-testsets.d.mts.map +1 -1
- package/tools/testsets/get-testsets.d.ts +1 -1
- package/tools/testsets/get-testsets.d.ts.map +1 -1
- package/tools/testsets/get-testsets.js +13 -3
- package/tools/testsets/get-testsets.js.map +1 -1
- package/tools/testsets/get-testsets.mjs +13 -3
- package/tools/testsets/get-testsets.mjs.map +1 -1
- package/tools/testsets/list-testsets.d.mts +1 -1
- package/tools/testsets/list-testsets.d.mts.map +1 -1
- package/tools/testsets/list-testsets.d.ts +1 -1
- package/tools/testsets/list-testsets.d.ts.map +1 -1
- package/tools/testsets/list-testsets.js +14 -3
- package/tools/testsets/list-testsets.js.map +1 -1
- package/tools/testsets/list-testsets.mjs +14 -3
- package/tools/testsets/list-testsets.mjs.map +1 -1
- package/tools/testsets/update-testsets.d.mts +1 -1
- package/tools/testsets/update-testsets.d.mts.map +1 -1
- package/tools/testsets/update-testsets.d.ts +1 -1
- package/tools/testsets/update-testsets.d.ts.map +1 -1
- package/tools/testsets/update-testsets.js +12 -3
- package/tools/testsets/update-testsets.js.map +1 -1
- package/tools/testsets/update-testsets.mjs +12 -3
- package/tools/testsets/update-testsets.mjs.map +1 -1
- package/tools/types.d.mts +1 -1
- package/tools/types.d.mts.map +1 -1
- package/tools/types.d.ts +1 -1
- package/tools/types.d.ts.map +1 -1
- package/tools/types.js.map +1 -1
- package/tools/types.mjs.map +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,7 +17,8 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'create_testcases',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nCreate multiple Testcases in the specified Testset.\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n items: {\n type: 'array',\n items: {\n $ref: '#/$defs/testcase'\n }\n }\n },\n required: [ 'items'\n ],\n $defs: {\n testcase: {\n type: 'object',\n description: 'A test case in the Scorecard system. Contains JSON data that is validated against the schema defined by its Testset.\\nThe `inputs` and `expected` fields are derived from the `data` field based on the Testset\\'s `fieldMapping`, and include all mapped fields, including those with validation errors.\\nTestcases are stored regardless of validation results, with any validation errors included in the `validationErrors` field.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testcase.'\n },\n expected: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as expected outputs, including those with validation errors.',\n additionalProperties: true\n },\n inputs: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as inputs, including those with validation errors.',\n additionalProperties: true\n },\n jsonData: {\n type: 'object',\n description: 'The JSON data of the Testcase, which is validated against the Testset\\'s schema.',\n additionalProperties: true\n },\n testsetId: {\n type: 'string',\n description: 'The ID of the Testset this Testcase belongs to.'\n },\n validationErrors: {\n type: 'array',\n description: 'Validation errors found in the Testcase data. If present, the Testcase doesn\\'t fully conform to its Testset\\'s schema.',\n items: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Human-readable error description.'\n },\n path: {\n type: 'string',\n description: 'JSON Pointer to the field with the validation error.'\n }\n },\n required: [ 'message',\n 'path'\n ]\n }\n }\n },\n required: [ 'id',\n 'expected',\n 'inputs',\n 'jsonData',\n 'testsetId'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
@@ -33,18 +34,27 @@ export const tool: Tool = {
|
|
|
33
34
|
jsonData: {
|
|
34
35
|
type: 'object',
|
|
35
36
|
description: "The JSON data of the Testcase, which is validated against the Testset's schema.",
|
|
37
|
+
additionalProperties: true,
|
|
36
38
|
},
|
|
37
39
|
},
|
|
38
40
|
required: ['jsonData'],
|
|
39
41
|
},
|
|
40
42
|
},
|
|
43
|
+
jq_filter: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
title: 'jq Filter',
|
|
46
|
+
description:
|
|
47
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
48
|
+
},
|
|
41
49
|
},
|
|
50
|
+
required: ['testsetId', 'items'],
|
|
42
51
|
},
|
|
52
|
+
annotations: {},
|
|
43
53
|
};
|
|
44
54
|
|
|
45
55
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
46
|
-
const { testsetId, ...body } = args as any;
|
|
47
|
-
return asTextContentResult(await client.testcases.create(testsetId, body));
|
|
56
|
+
const { testsetId, jq_filter, ...body } = args as any;
|
|
57
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testcases.create(testsetId, body)));
|
|
48
58
|
};
|
|
49
59
|
|
|
50
60
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,7 +17,8 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'delete_testcases',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nDelete multiple Testcases by their IDs.\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n success: {\n type: 'boolean',\n description: 'Whether the deletion was successful.'\n }\n },\n required: [ 'success'\n ]\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
@@ -28,13 +29,21 @@ export const tool: Tool = {
|
|
|
28
29
|
type: 'string',
|
|
29
30
|
},
|
|
30
31
|
},
|
|
32
|
+
jq_filter: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
title: 'jq Filter',
|
|
35
|
+
description:
|
|
36
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
37
|
+
},
|
|
31
38
|
},
|
|
39
|
+
required: ['ids'],
|
|
32
40
|
},
|
|
41
|
+
annotations: {},
|
|
33
42
|
};
|
|
34
43
|
|
|
35
44
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
36
|
-
const body = args as any;
|
|
37
|
-
return asTextContentResult(await client.testcases.delete(body));
|
|
45
|
+
const { jq_filter, ...body } = args as any;
|
|
46
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testcases.delete(body)));
|
|
38
47
|
};
|
|
39
48
|
|
|
40
49
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,20 +17,31 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'get_testcases',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nRetrieve a specific Testcase by ID.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/testcase',\n $defs: {\n testcase: {\n type: 'object',\n description: 'A test case in the Scorecard system. Contains JSON data that is validated against the schema defined by its Testset.\\nThe `inputs` and `expected` fields are derived from the `data` field based on the Testset\\'s `fieldMapping`, and include all mapped fields, including those with validation errors.\\nTestcases are stored regardless of validation results, with any validation errors included in the `validationErrors` field.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testcase.'\n },\n expected: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as expected outputs, including those with validation errors.',\n additionalProperties: true\n },\n inputs: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as inputs, including those with validation errors.',\n additionalProperties: true\n },\n jsonData: {\n type: 'object',\n description: 'The JSON data of the Testcase, which is validated against the Testset\\'s schema.',\n additionalProperties: true\n },\n testsetId: {\n type: 'string',\n description: 'The ID of the Testset this Testcase belongs to.'\n },\n validationErrors: {\n type: 'array',\n description: 'Validation errors found in the Testcase data. If present, the Testcase doesn\\'t fully conform to its Testset\\'s schema.',\n items: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Human-readable error description.'\n },\n path: {\n type: 'string',\n description: 'JSON Pointer to the field with the validation error.'\n }\n },\n required: [ 'message',\n 'path'\n ]\n }\n }\n },\n required: [ 'id',\n 'expected',\n 'inputs',\n 'jsonData',\n 'testsetId'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
24
25
|
testcaseId: {
|
|
25
26
|
type: 'string',
|
|
26
27
|
},
|
|
28
|
+
jq_filter: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
title: 'jq Filter',
|
|
31
|
+
description:
|
|
32
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
33
|
+
},
|
|
27
34
|
},
|
|
35
|
+
required: ['testcaseId'],
|
|
36
|
+
},
|
|
37
|
+
annotations: {
|
|
38
|
+
readOnlyHint: true,
|
|
28
39
|
},
|
|
29
40
|
};
|
|
30
41
|
|
|
31
42
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
32
|
-
const { testcaseId, ...body } = args as any;
|
|
33
|
-
return asTextContentResult(await client.testcases.get(testcaseId));
|
|
43
|
+
const { testcaseId, jq_filter, ...body } = args as any;
|
|
44
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testcases.get(testcaseId)));
|
|
34
45
|
};
|
|
35
46
|
|
|
36
47
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,7 +17,8 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'list_testcases',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nRetrieve a paginated list of Testcases belonging to a Testset.\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: '#/$defs/testcase'\n }\n },\n hasMore: {\n type: 'boolean'\n },\n nextCursor: {\n type: 'string'\n },\n total: {\n type: 'integer'\n }\n },\n required: [ 'data',\n 'hasMore',\n 'nextCursor'\n ],\n $defs: {\n testcase: {\n type: 'object',\n description: 'A test case in the Scorecard system. Contains JSON data that is validated against the schema defined by its Testset.\\nThe `inputs` and `expected` fields are derived from the `data` field based on the Testset\\'s `fieldMapping`, and include all mapped fields, including those with validation errors.\\nTestcases are stored regardless of validation results, with any validation errors included in the `validationErrors` field.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testcase.'\n },\n expected: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as expected outputs, including those with validation errors.',\n additionalProperties: true\n },\n inputs: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as inputs, including those with validation errors.',\n additionalProperties: true\n },\n jsonData: {\n type: 'object',\n description: 'The JSON data of the Testcase, which is validated against the Testset\\'s schema.',\n additionalProperties: true\n },\n testsetId: {\n type: 'string',\n description: 'The ID of the Testset this Testcase belongs to.'\n },\n validationErrors: {\n type: 'array',\n description: 'Validation errors found in the Testcase data. If present, the Testcase doesn\\'t fully conform to its Testset\\'s schema.',\n items: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Human-readable error description.'\n },\n path: {\n type: 'string',\n description: 'JSON Pointer to the field with the validation error.'\n }\n },\n required: [ 'message',\n 'path'\n ]\n }\n }\n },\n required: [ 'id',\n 'expected',\n 'inputs',\n 'jsonData',\n 'testsetId'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
@@ -34,13 +35,24 @@ export const tool: Tool = {
|
|
|
34
35
|
description:
|
|
35
36
|
'Maximum number of items to return (1-100). Use with `cursor` for pagination through large sets.',
|
|
36
37
|
},
|
|
38
|
+
jq_filter: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
title: 'jq Filter',
|
|
41
|
+
description:
|
|
42
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
43
|
+
},
|
|
37
44
|
},
|
|
45
|
+
required: ['testsetId'],
|
|
46
|
+
},
|
|
47
|
+
annotations: {
|
|
48
|
+
readOnlyHint: true,
|
|
38
49
|
},
|
|
39
50
|
};
|
|
40
51
|
|
|
41
52
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
42
|
-
const { testsetId, ...body } = args as any;
|
|
43
|
-
|
|
53
|
+
const { testsetId, jq_filter, ...body } = args as any;
|
|
54
|
+
const response = await client.testcases.list(testsetId, body).asResponse();
|
|
55
|
+
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
|
|
44
56
|
};
|
|
45
57
|
|
|
46
58
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,7 +17,8 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'update_testcases',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nReplace the data of an existing Testcase while keeping its ID.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/testcase',\n $defs: {\n testcase: {\n type: 'object',\n description: 'A test case in the Scorecard system. Contains JSON data that is validated against the schema defined by its Testset.\\nThe `inputs` and `expected` fields are derived from the `data` field based on the Testset\\'s `fieldMapping`, and include all mapped fields, including those with validation errors.\\nTestcases are stored regardless of validation results, with any validation errors included in the `validationErrors` field.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testcase.'\n },\n expected: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as expected outputs, including those with validation errors.',\n additionalProperties: true\n },\n inputs: {\n type: 'object',\n description: 'Derived from data based on the Testset\\'s fieldMapping. Contains all fields marked as inputs, including those with validation errors.',\n additionalProperties: true\n },\n jsonData: {\n type: 'object',\n description: 'The JSON data of the Testcase, which is validated against the Testset\\'s schema.',\n additionalProperties: true\n },\n testsetId: {\n type: 'string',\n description: 'The ID of the Testset this Testcase belongs to.'\n },\n validationErrors: {\n type: 'array',\n description: 'Validation errors found in the Testcase data. If present, the Testcase doesn\\'t fully conform to its Testset\\'s schema.',\n items: {\n type: 'object',\n properties: {\n message: {\n type: 'string',\n description: 'Human-readable error description.'\n },\n path: {\n type: 'string',\n description: 'JSON Pointer to the field with the validation error.'\n }\n },\n required: [ 'message',\n 'path'\n ]\n }\n }\n },\n required: [ 'id',\n 'expected',\n 'inputs',\n 'jsonData',\n 'testsetId'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
@@ -27,14 +28,25 @@ export const tool: Tool = {
|
|
|
27
28
|
jsonData: {
|
|
28
29
|
type: 'object',
|
|
29
30
|
description: "The JSON data of the Testcase, which is validated against the Testset's schema.",
|
|
31
|
+
additionalProperties: true,
|
|
32
|
+
},
|
|
33
|
+
jq_filter: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
title: 'jq Filter',
|
|
36
|
+
description:
|
|
37
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
30
38
|
},
|
|
31
39
|
},
|
|
40
|
+
required: ['testcaseId', 'jsonData'],
|
|
41
|
+
},
|
|
42
|
+
annotations: {
|
|
43
|
+
idempotentHint: true,
|
|
32
44
|
},
|
|
33
45
|
};
|
|
34
46
|
|
|
35
47
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
36
|
-
const { testcaseId, ...body } = args as any;
|
|
37
|
-
return asTextContentResult(await client.testcases.update(testcaseId, body));
|
|
48
|
+
const { testcaseId, jq_filter, ...body } = args as any;
|
|
49
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testcases.update(testcaseId, body)));
|
|
38
50
|
};
|
|
39
51
|
|
|
40
52
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'create_testsets',
|
|
20
20
|
description:
|
|
21
|
-
'
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nCreate a new Testset for a Project. The Testset will be created in the Project specified in the path.\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/testset',\n $defs: {\n testset: {\n type: 'object',\n description: 'A collection of Testcases that share the same schema.\\nEach Testset defines the structure of its Testcases through a JSON schema.\\nThe `fieldMapping` object maps top-level keys of the Testcase schema to their roles (input/expected output).\\nFields not mentioned in the `fieldMapping` during creation or update are treated as metadata.\\n\\n## JSON Schema validation constraints supported:\\n\\n- **Required fields** - Fields listed in the schema\\'s `required` array must be present in Testcases.\\n- **Type validation** - Values must match the specified type (string, number, boolean, null, integer, object, array).\\n- **Enum validation** - Values must be one of the options specified in the `enum` array.\\n- **Object property validation** - Properties of objects must conform to their defined schemas.\\n- **Array item validation** - Items in arrays must conform to the `items` schema.\\n- **Logical composition** - Values must conform to at least one schema in the `anyOf` array.\\n\\nTestcases that fail validation will still be stored, but will include `validationErrors` detailing the issues.\\nExtra fields in the Testcase data that are not in the schema will be stored but are ignored during validation.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testset.'\n },\n description: {\n type: 'string',\n description: 'The description of the Testset.'\n },\n fieldMapping: {\n type: 'object',\n description: 'Maps top-level keys of the Testcase schema to their roles (input/expected output). Unmapped fields are treated as metadata.',\n properties: {\n expected: {\n type: 'array',\n description: 'Fields that represent expected outputs.',\n items: {\n type: 'string'\n }\n },\n inputs: {\n type: 'array',\n description: 'Fields that represent inputs to the AI system.',\n items: {\n type: 'string'\n }\n },\n metadata: {\n type: 'array',\n description: 'Fields that are not inputs or expected outputs.',\n items: {\n type: 'string'\n }\n }\n },\n required: [ 'expected',\n 'inputs',\n 'metadata'\n ]\n },\n jsonSchema: {\n type: 'object',\n description: 'The JSON schema for each Testcase in the Testset.',\n additionalProperties: true\n },\n name: {\n type: 'string',\n description: 'The name of the Testset.'\n }\n },\n required: [ 'id',\n 'description',\n 'fieldMapping',\n 'jsonSchema',\n 'name'\n ]\n }\n }\n}\n```",
|
|
22
22
|
inputSchema: {
|
|
23
23
|
type: 'object',
|
|
24
24
|
properties: {
|
|
@@ -61,18 +61,27 @@ export const tool: Tool = {
|
|
|
61
61
|
jsonSchema: {
|
|
62
62
|
type: 'object',
|
|
63
63
|
description: 'The JSON schema for each Testcase in the Testset.',
|
|
64
|
+
additionalProperties: true,
|
|
64
65
|
},
|
|
65
66
|
name: {
|
|
66
67
|
type: 'string',
|
|
67
68
|
description: 'The name of the Testset.',
|
|
68
69
|
},
|
|
70
|
+
jq_filter: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
title: 'jq Filter',
|
|
73
|
+
description:
|
|
74
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
75
|
+
},
|
|
69
76
|
},
|
|
77
|
+
required: ['projectId', 'description', 'fieldMapping', 'jsonSchema', 'name'],
|
|
70
78
|
},
|
|
79
|
+
annotations: {},
|
|
71
80
|
};
|
|
72
81
|
|
|
73
82
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
74
|
-
const { projectId, ...body } = args as any;
|
|
75
|
-
return asTextContentResult(await client.testsets.create(projectId, body));
|
|
83
|
+
const { projectId, jq_filter, ...body } = args as any;
|
|
84
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testsets.create(projectId, body)));
|
|
76
85
|
};
|
|
77
86
|
|
|
78
87
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,20 +17,31 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'delete_testsets',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nDelete Testset\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n success: {\n type: 'boolean',\n description: 'Whether the deletion was successful.'\n }\n },\n required: [ 'success'\n ]\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
24
25
|
testsetId: {
|
|
25
26
|
type: 'string',
|
|
26
27
|
},
|
|
28
|
+
jq_filter: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
title: 'jq Filter',
|
|
31
|
+
description:
|
|
32
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
33
|
+
},
|
|
27
34
|
},
|
|
35
|
+
required: ['testsetId'],
|
|
36
|
+
},
|
|
37
|
+
annotations: {
|
|
38
|
+
idempotentHint: true,
|
|
28
39
|
},
|
|
29
40
|
};
|
|
30
41
|
|
|
31
42
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
32
|
-
const { testsetId, ...body } = args as any;
|
|
33
|
-
return asTextContentResult(await client.testsets.delete(testsetId));
|
|
43
|
+
const { testsetId, jq_filter, ...body } = args as any;
|
|
44
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testsets.delete(testsetId)));
|
|
34
45
|
};
|
|
35
46
|
|
|
36
47
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,20 +17,31 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'get_testsets',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nGet Testset\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/testset',\n $defs: {\n testset: {\n type: 'object',\n description: 'A collection of Testcases that share the same schema.\\nEach Testset defines the structure of its Testcases through a JSON schema.\\nThe `fieldMapping` object maps top-level keys of the Testcase schema to their roles (input/expected output).\\nFields not mentioned in the `fieldMapping` during creation or update are treated as metadata.\\n\\n## JSON Schema validation constraints supported:\\n\\n- **Required fields** - Fields listed in the schema\\'s `required` array must be present in Testcases.\\n- **Type validation** - Values must match the specified type (string, number, boolean, null, integer, object, array).\\n- **Enum validation** - Values must be one of the options specified in the `enum` array.\\n- **Object property validation** - Properties of objects must conform to their defined schemas.\\n- **Array item validation** - Items in arrays must conform to the `items` schema.\\n- **Logical composition** - Values must conform to at least one schema in the `anyOf` array.\\n\\nTestcases that fail validation will still be stored, but will include `validationErrors` detailing the issues.\\nExtra fields in the Testcase data that are not in the schema will be stored but are ignored during validation.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testset.'\n },\n description: {\n type: 'string',\n description: 'The description of the Testset.'\n },\n fieldMapping: {\n type: 'object',\n description: 'Maps top-level keys of the Testcase schema to their roles (input/expected output). Unmapped fields are treated as metadata.',\n properties: {\n expected: {\n type: 'array',\n description: 'Fields that represent expected outputs.',\n items: {\n type: 'string'\n }\n },\n inputs: {\n type: 'array',\n description: 'Fields that represent inputs to the AI system.',\n items: {\n type: 'string'\n }\n },\n metadata: {\n type: 'array',\n description: 'Fields that are not inputs or expected outputs.',\n items: {\n type: 'string'\n }\n }\n },\n required: [ 'expected',\n 'inputs',\n 'metadata'\n ]\n },\n jsonSchema: {\n type: 'object',\n description: 'The JSON schema for each Testcase in the Testset.',\n additionalProperties: true\n },\n name: {\n type: 'string',\n description: 'The name of the Testset.'\n }\n },\n required: [ 'id',\n 'description',\n 'fieldMapping',\n 'jsonSchema',\n 'name'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
24
25
|
testsetId: {
|
|
25
26
|
type: 'string',
|
|
26
27
|
},
|
|
28
|
+
jq_filter: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
title: 'jq Filter',
|
|
31
|
+
description:
|
|
32
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
33
|
+
},
|
|
27
34
|
},
|
|
35
|
+
required: ['testsetId'],
|
|
36
|
+
},
|
|
37
|
+
annotations: {
|
|
38
|
+
readOnlyHint: true,
|
|
28
39
|
},
|
|
29
40
|
};
|
|
30
41
|
|
|
31
42
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
32
|
-
const { testsetId, ...body } = args as any;
|
|
33
|
-
return asTextContentResult(await client.testsets.get(testsetId));
|
|
43
|
+
const { testsetId, jq_filter, ...body } = args as any;
|
|
44
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testsets.get(testsetId)));
|
|
34
45
|
};
|
|
35
46
|
|
|
36
47
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -17,7 +17,8 @@ export const metadata: Metadata = {
|
|
|
17
17
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'list_testsets',
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nRetrieve a paginated list of Testsets belonging to a Project.\n\n# Response Schema\n```json\n{\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: '#/$defs/testset'\n }\n },\n hasMore: {\n type: 'boolean'\n },\n nextCursor: {\n type: 'string'\n },\n total: {\n type: 'integer'\n }\n },\n required: [ 'data',\n 'hasMore',\n 'nextCursor'\n ],\n $defs: {\n testset: {\n type: 'object',\n description: 'A collection of Testcases that share the same schema.\\nEach Testset defines the structure of its Testcases through a JSON schema.\\nThe `fieldMapping` object maps top-level keys of the Testcase schema to their roles (input/expected output).\\nFields not mentioned in the `fieldMapping` during creation or update are treated as metadata.\\n\\n## JSON Schema validation constraints supported:\\n\\n- **Required fields** - Fields listed in the schema\\'s `required` array must be present in Testcases.\\n- **Type validation** - Values must match the specified type (string, number, boolean, null, integer, object, array).\\n- **Enum validation** - Values must be one of the options specified in the `enum` array.\\n- **Object property validation** - Properties of objects must conform to their defined schemas.\\n- **Array item validation** - Items in arrays must conform to the `items` schema.\\n- **Logical composition** - Values must conform to at least one schema in the `anyOf` array.\\n\\nTestcases that fail validation will still be stored, but will include `validationErrors` detailing the issues.\\nExtra fields in the Testcase data that are not in the schema will be stored but are ignored during validation.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testset.'\n },\n description: {\n type: 'string',\n description: 'The description of the Testset.'\n },\n fieldMapping: {\n type: 'object',\n description: 'Maps top-level keys of the Testcase schema to their roles (input/expected output). Unmapped fields are treated as metadata.',\n properties: {\n expected: {\n type: 'array',\n description: 'Fields that represent expected outputs.',\n items: {\n type: 'string'\n }\n },\n inputs: {\n type: 'array',\n description: 'Fields that represent inputs to the AI system.',\n items: {\n type: 'string'\n }\n },\n metadata: {\n type: 'array',\n description: 'Fields that are not inputs or expected outputs.',\n items: {\n type: 'string'\n }\n }\n },\n required: [ 'expected',\n 'inputs',\n 'metadata'\n ]\n },\n jsonSchema: {\n type: 'object',\n description: 'The JSON schema for each Testcase in the Testset.',\n additionalProperties: true\n },\n name: {\n type: 'string',\n description: 'The name of the Testset.'\n }\n },\n required: [ 'id',\n 'description',\n 'fieldMapping',\n 'jsonSchema',\n 'name'\n ]\n }\n }\n}\n```",
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: {
|
|
@@ -34,13 +35,24 @@ export const tool: Tool = {
|
|
|
34
35
|
description:
|
|
35
36
|
'Maximum number of items to return (1-100). Use with `cursor` for pagination through large sets.',
|
|
36
37
|
},
|
|
38
|
+
jq_filter: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
title: 'jq Filter',
|
|
41
|
+
description:
|
|
42
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
43
|
+
},
|
|
37
44
|
},
|
|
45
|
+
required: ['projectId'],
|
|
46
|
+
},
|
|
47
|
+
annotations: {
|
|
48
|
+
readOnlyHint: true,
|
|
38
49
|
},
|
|
39
50
|
};
|
|
40
51
|
|
|
41
52
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
42
|
-
const { projectId, ...body } = args as any;
|
|
43
|
-
|
|
53
|
+
const { projectId, jq_filter, ...body } = args as any;
|
|
54
|
+
const response = await client.testsets.list(projectId, body).asResponse();
|
|
55
|
+
return asTextContentResult(await maybeFilter(jq_filter, await response.json()));
|
|
44
56
|
};
|
|
45
57
|
|
|
46
58
|
export default { metadata, tool, handler };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { maybeFilter } from 'scorecard-ai-mcp/filtering';
|
|
4
|
+
import { Metadata, asTextContentResult } from 'scorecard-ai-mcp/tools/types';
|
|
4
5
|
|
|
5
6
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { Metadata } from '../';
|
|
7
7
|
import Scorecard from 'scorecard-ai';
|
|
8
8
|
|
|
9
9
|
export const metadata: Metadata = {
|
|
@@ -18,7 +18,7 @@ export const metadata: Metadata = {
|
|
|
18
18
|
export const tool: Tool = {
|
|
19
19
|
name: 'update_testsets',
|
|
20
20
|
description:
|
|
21
|
-
'
|
|
21
|
+
"When using this tool, always use the `jq_filter` parameter to reduce the response size and improve performance.\n\nOnly omit if you're sure you don't need the data.\n\nUpdate a Testset. Only the fields provided in the request body will be updated.\nIf a field is provided, the new content will replace the existing content.\nIf a field is not provided, the existing content will remain unchanged.\n\nWhen updating the schema:\n- If field mappings are not provided and existing mappings reference fields that no longer exist, those mappings will be automatically removed\n- To preserve all existing mappings, ensure all referenced fields remain in the updated schema\n- For complete control, provide both schema and fieldMapping when updating the schema\n\n# Response Schema\n```json\n{\n $ref: '#/$defs/testset',\n $defs: {\n testset: {\n type: 'object',\n description: 'A collection of Testcases that share the same schema.\\nEach Testset defines the structure of its Testcases through a JSON schema.\\nThe `fieldMapping` object maps top-level keys of the Testcase schema to their roles (input/expected output).\\nFields not mentioned in the `fieldMapping` during creation or update are treated as metadata.\\n\\n## JSON Schema validation constraints supported:\\n\\n- **Required fields** - Fields listed in the schema\\'s `required` array must be present in Testcases.\\n- **Type validation** - Values must match the specified type (string, number, boolean, null, integer, object, array).\\n- **Enum validation** - Values must be one of the options specified in the `enum` array.\\n- **Object property validation** - Properties of objects must conform to their defined schemas.\\n- **Array item validation** - Items in arrays must conform to the `items` schema.\\n- **Logical composition** - Values must conform to at least one schema in the `anyOf` array.\\n\\nTestcases that fail validation will still be stored, but will include `validationErrors` detailing the issues.\\nExtra fields in the Testcase data that are not in the schema will be stored but are ignored during validation.',\n properties: {\n id: {\n type: 'string',\n description: 'The ID of the Testset.'\n },\n description: {\n type: 'string',\n description: 'The description of the Testset.'\n },\n fieldMapping: {\n type: 'object',\n description: 'Maps top-level keys of the Testcase schema to their roles (input/expected output). Unmapped fields are treated as metadata.',\n properties: {\n expected: {\n type: 'array',\n description: 'Fields that represent expected outputs.',\n items: {\n type: 'string'\n }\n },\n inputs: {\n type: 'array',\n description: 'Fields that represent inputs to the AI system.',\n items: {\n type: 'string'\n }\n },\n metadata: {\n type: 'array',\n description: 'Fields that are not inputs or expected outputs.',\n items: {\n type: 'string'\n }\n }\n },\n required: [ 'expected',\n 'inputs',\n 'metadata'\n ]\n },\n jsonSchema: {\n type: 'object',\n description: 'The JSON schema for each Testcase in the Testset.',\n additionalProperties: true\n },\n name: {\n type: 'string',\n description: 'The name of the Testset.'\n }\n },\n required: [ 'id',\n 'description',\n 'fieldMapping',\n 'jsonSchema',\n 'name'\n ]\n }\n }\n}\n```",
|
|
22
22
|
inputSchema: {
|
|
23
23
|
type: 'object',
|
|
24
24
|
properties: {
|
|
@@ -61,18 +61,27 @@ export const tool: Tool = {
|
|
|
61
61
|
jsonSchema: {
|
|
62
62
|
type: 'object',
|
|
63
63
|
description: 'The JSON schema for each Testcase in the Testset.',
|
|
64
|
+
additionalProperties: true,
|
|
64
65
|
},
|
|
65
66
|
name: {
|
|
66
67
|
type: 'string',
|
|
67
68
|
description: 'The name of the Testset.',
|
|
68
69
|
},
|
|
70
|
+
jq_filter: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
title: 'jq Filter',
|
|
73
|
+
description:
|
|
74
|
+
'A jq filter to apply to the response to include certain fields. Consult the output schema in the tool description to see the fields that are available.\n\nFor example: to include only the `name` field in every object of a results array, you can provide ".results[].name".\n\nFor more information, see the [jq documentation](https://jqlang.org/manual/).',
|
|
75
|
+
},
|
|
69
76
|
},
|
|
77
|
+
required: ['testsetId'],
|
|
70
78
|
},
|
|
79
|
+
annotations: {},
|
|
71
80
|
};
|
|
72
81
|
|
|
73
82
|
export const handler = async (client: Scorecard, args: Record<string, unknown> | undefined) => {
|
|
74
|
-
const { testsetId, ...body } = args as any;
|
|
75
|
-
return asTextContentResult(await client.testsets.update(testsetId, body));
|
|
83
|
+
const { testsetId, jq_filter, ...body } = args as any;
|
|
84
|
+
return asTextContentResult(await maybeFilter(jq_filter, await client.testsets.update(testsetId, body)));
|
|
76
85
|
};
|
|
77
86
|
|
|
78
87
|
export default { metadata, tool, handler };
|
package/src/tools/types.ts
CHANGED
|
@@ -47,7 +47,7 @@ export type HandlerFunction = (
|
|
|
47
47
|
args: Record<string, unknown> | undefined,
|
|
48
48
|
) => Promise<ToolCallResult>;
|
|
49
49
|
|
|
50
|
-
export function asTextContentResult(result:
|
|
50
|
+
export function asTextContentResult(result: unknown): ToolCallResult {
|
|
51
51
|
return {
|
|
52
52
|
content: [
|
|
53
53
|
{
|
package/stdio.d.mts
ADDED
package/stdio.d.mts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.mts","sourceRoot":"","sources":["src/stdio.ts"],"names":[],"mappings":"OAEO,EAAE,UAAU,EAAE;AAErB,eAAO,MAAM,iBAAiB,GAAU,SAAS,UAAU,kBAQ1D,CAAC"}
|
package/stdio.d.ts
ADDED
package/stdio.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["src/stdio.ts"],"names":[],"mappings":"OAEO,EAAE,UAAU,EAAE;AAErB,eAAO,MAAM,iBAAiB,GAAU,SAAS,UAAU,kBAQ1D,CAAC"}
|
package/stdio.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.launchStdioServer = void 0;
|
|
4
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
5
|
+
const server_1 = require("./server.js");
|
|
6
|
+
const launchStdioServer = async (options) => {
|
|
7
|
+
const server = (0, server_1.newMcpServer)();
|
|
8
|
+
(0, server_1.initMcpServer)({ server, mcpOptions: options });
|
|
9
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
10
|
+
await server.connect(transport);
|
|
11
|
+
console.error('MCP Server running on stdio');
|
|
12
|
+
};
|
|
13
|
+
exports.launchStdioServer = launchStdioServer;
|
|
14
|
+
//# sourceMappingURL=stdio.js.map
|
package/stdio.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["src/stdio.ts"],"names":[],"mappings":";;;AAAA,wEAAiF;AACjF,wCAAuD;AAGhD,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;IAE9B,IAAA,sBAAa,EAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAC/C,CAAC,CAAC;AARW,QAAA,iBAAiB,qBAQ5B"}
|
package/stdio.mjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import { initMcpServer, newMcpServer } from "./server.mjs";
|
|
3
|
+
export const launchStdioServer = async (options) => {
|
|
4
|
+
const server = newMcpServer();
|
|
5
|
+
initMcpServer({ server, mcpOptions: options });
|
|
6
|
+
const transport = new StdioServerTransport();
|
|
7
|
+
await server.connect(transport);
|
|
8
|
+
console.error('MCP Server running on stdio');
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=stdio.mjs.map
|
package/stdio.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.mjs","sourceRoot":"","sources":["src/stdio.ts"],"names":[],"mappings":"OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C;OACzE,EAAE,aAAa,EAAE,YAAY,EAAE;AAGtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAC/C,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Metadata } from 'scorecard-ai-mcp/tools/types';
|
|
1
2
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { Metadata } from "..//index.mjs";
|
|
3
3
|
import Scorecard from 'scorecard-ai';
|
|
4
4
|
export declare const metadata: Metadata;
|
|
5
5
|
export declare const tool: Tool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-metrics.d.mts","sourceRoot":"","sources":["../../src/tools/metrics/create-metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-metrics.d.mts","sourceRoot":"","sources":["../../src/tools/metrics/create-metrics.ts"],"names":[],"mappings":"OAEO,EAAE,QAAQ,EAAuB,MAAM,8BAA8B;OAErE,EAAE,IAAI,EAAE,MAAM,oCAAoC;OAClD,SAAS,MAAM,cAAc;AAEpC,eAAO,MAAM,QAAQ,EAAE,QAOtB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,IA0OlB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,QAAQ,SAAS,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,mEAGzF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAHoC,SAAS,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;AAK1F,wBAA2C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Metadata } from 'scorecard-ai-mcp/tools/types';
|
|
1
2
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
import type { Metadata } from "..//index.js";
|
|
3
3
|
import Scorecard from 'scorecard-ai';
|
|
4
4
|
export declare const metadata: Metadata;
|
|
5
5
|
export declare const tool: Tool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-metrics.d.ts","sourceRoot":"","sources":["../../src/tools/metrics/create-metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-metrics.d.ts","sourceRoot":"","sources":["../../src/tools/metrics/create-metrics.ts"],"names":[],"mappings":"OAEO,EAAE,QAAQ,EAAuB,MAAM,8BAA8B;OAErE,EAAE,IAAI,EAAE,MAAM,oCAAoC;OAClD,SAAS,MAAM,cAAc;AAEpC,eAAO,MAAM,QAAQ,EAAE,QAOtB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,IA0OlB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,QAAQ,SAAS,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,mEAGzF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAHoC,SAAS,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;AAK1F,wBAA2C"}
|