@sassoftware/sas-score-mcp-serverjs 0.4.1 → 1.0.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/.skills/agents/sas-viya-scoring-expert.md +58 -0
- package/.skills/copilot-instructions.md +155 -0
- package/.skills/skills/sas-find-library-smart/SKILL.md +154 -0
- package/.skills/skills/sas-list-tables-smart/SKILL.md +127 -0
- package/.skills/skills/sas-read-and-score/SKILL.md +111 -0
- package/.skills/skills/sas-read-strategy/SKILL.md +156 -0
- package/.skills/skills/sas-request-classifier/SKILL.md +69 -0
- package/.skills/skills/sas-score-workflow/SKILL.md +314 -0
- package/cli.js +311 -70
- package/package.json +7 -7
- package/scripts/docs/SCORE_SKILL_REFERENCE.md +142 -0
- package/scripts/docs/TOOL_DESCRIPTION_TEMPLATE.md +157 -0
- package/scripts/docs/TOOL_UPDATES_SUMMARY.md +208 -0
- package/scripts/docs/mcp-localhost-config-guide.md +184 -0
- package/scripts/docs/oauth-http-transport.md +96 -0
- package/scripts/docs/sas-mcp-tools-reference.md +600 -0
- package/scripts/getViyaca.sh +1 -0
- package/scripts/optimize_final.py +140 -0
- package/scripts/optimize_tools.py +99 -0
- package/scripts/setup-skills.js +34 -0
- package/scripts/update_descriptions.py +46 -0
- package/scripts/viyatls.sh +3 -0
- package/src/authpkce.js +219 -0
- package/src/createMcpServer.js +16 -5
- package/src/expressMcpServer.js +350 -308
- package/src/handleGetDelete.js +6 -3
- package/src/hapiMcpServer.js +10 -18
- package/src/oauthHandlers/authorize.js +46 -0
- package/src/oauthHandlers/baseUrl.js +8 -0
- package/src/oauthHandlers/callback.js +96 -0
- package/src/oauthHandlers/getMetadata.js +27 -0
- package/src/oauthHandlers/index.js +7 -0
- package/src/oauthHandlers/token.js +37 -0
- package/src/processHeaders.js +88 -0
- package/src/setupSkills.js +46 -0
- package/src/toolHelpers/_jobSubmit.js +2 -0
- package/src/toolHelpers/_listLibrary.js +55 -39
- package/src/toolHelpers/getLogonPayload.js +7 -1
- package/src/toolHelpers/readCerts.js +4 -4
- package/src/toolHelpers/refreshToken.js +3 -2
- package/src/toolHelpers/refreshTokenOauth.js +3 -3
- package/src/toolSet/.claude/settings.local.json +13 -0
- package/src/toolSet/devaScore.js +61 -69
- package/src/toolSet/findJob.js +38 -71
- package/src/toolSet/findJobdef.js +28 -59
- package/src/toolSet/findLibrary.js +68 -100
- package/src/toolSet/findModel.js +35 -58
- package/src/toolSet/findTable.js +31 -60
- package/src/toolSet/getEnv.js +30 -45
- package/src/toolSet/listJobdefs.js +61 -96
- package/src/toolSet/listJobs.js +61 -110
- package/src/toolSet/listLibraries.js +78 -90
- package/src/toolSet/listModels.js +56 -83
- package/src/toolSet/listTables.js +66 -95
- package/src/toolSet/makeTools.js +1 -0
- package/src/toolSet/modelInfo.js +22 -54
- package/src/toolSet/modelScore.js +35 -77
- package/src/toolSet/readTable.js +63 -104
- package/src/toolSet/runCasProgram.js +32 -52
- package/src/toolSet/runJob.js +24 -24
- package/src/toolSet/runJobdef.js +26 -29
- package/src/toolSet/runMacro.js +82 -82
- package/src/toolSet/runProgram.js +32 -84
- package/src/toolSet/sasQuery.js +77 -126
- package/src/toolSet/sasQueryTemplate.js +4 -5
- package/src/toolSet/sasQueryTemplate2.js +4 -5
- package/src/toolSet/scrInfo.js +4 -7
- package/src/toolSet/scrScore.js +69 -70
- package/src/toolSet/searchAssets.js +5 -6
- package/src/toolSet/setContext.js +65 -92
- package/src/toolSet/superstat.js +61 -60
- package/src/toolSet/tableInfo.js +58 -102
package/src/toolSet/findModel.js
CHANGED
|
@@ -9,69 +9,45 @@ import _listModels from '../toolHelpers/_listModels.js';
|
|
|
9
9
|
|
|
10
10
|
function findModel(_appContext) {
|
|
11
11
|
let description = `
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
- Never return prose when invoked programmatically; only the JSON structure.
|
|
44
|
-
- On error: surface backend error object directly (no rewriting) so the caller can display/log it.
|
|
45
|
-
|
|
46
|
-
Disambiguation & Clarification
|
|
47
|
-
- Missing name (e.g., "find model") → ask: "Which model name would you like to find?"
|
|
48
|
-
- Plural intent (e.g., "find models" / "list models") → use list-models instead.
|
|
49
|
-
- If user requests scoring ("score model X") → route to model-score not find-model.
|
|
50
|
-
|
|
51
|
-
Examples (→ mapped params)
|
|
52
|
-
- "find model myModel" → { name: "myModel" }
|
|
53
|
-
- "does model churn_score exist" → { name: "churn_score" }
|
|
54
|
-
- "is model riskModel deployed" → { name: "riskModel" }
|
|
55
|
-
- "lookup model claims_fraud_v1" → { name: "claims_fraud_v1" }
|
|
56
|
-
|
|
57
|
-
Negative Examples (should NOT call find-model)
|
|
58
|
-
- "list models" (list-models)
|
|
59
|
-
- "score model myModel" (model-score)
|
|
60
|
-
- "describe model myModel" (model-info)
|
|
61
|
-
|
|
62
|
-
Notes
|
|
63
|
-
- Chain usage: find-model → model-info → model-score.
|
|
64
|
-
- For batch existence checks iterate over a list and call find-model per entry.
|
|
12
|
+
find-model — locate a specific MAS model deployed to MAS server
|
|
13
|
+
|
|
14
|
+
USE when: find model, does model exist, is model deployed, lookup model, verify model exists
|
|
15
|
+
DO NOT USE for: list models (use list-models), model info/variables (use model-info), score model (use model-score), find table/job/lib (use respective tools), scr models (use scr-info/scr-score)
|
|
16
|
+
|
|
17
|
+
PARAMETERS
|
|
18
|
+
- name: string (required) — model name to locate; if multiple supplied, use first
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- "find model <name>" → { name: "<name>" }
|
|
22
|
+
- "does model <name> exist" → { name: "<name>" }
|
|
23
|
+
- "is model <name> deployed" → { name: "<name>" }
|
|
24
|
+
- "lookup/verify model <name>" → { name: "<name>" }
|
|
25
|
+
- "find model" with no name → ask "Which model name would you like to find?"
|
|
26
|
+
- "find all models / list models" → use list-models instead
|
|
27
|
+
- "score model <name>" → use model-score instead
|
|
28
|
+
- "describe model / model info" → use model-info instead
|
|
29
|
+
|
|
30
|
+
EXAMPLES
|
|
31
|
+
- "find model myModel" → { name: "myModel" }
|
|
32
|
+
- "does model churn_score exist" → { name: "churn_score" }
|
|
33
|
+
- "is model riskModel deployed" → { name: "riskModel" }
|
|
34
|
+
- "lookup model claims_fraud_v1" → { name: "claims_fraud_v1" }
|
|
35
|
+
|
|
36
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
37
|
+
- "list models" (use list-models)
|
|
38
|
+
- "score model myModel" (use model-score)
|
|
39
|
+
- "model info for churnRisk" (use model-info)
|
|
40
|
+
|
|
41
|
+
ERRORS
|
|
42
|
+
Returns { models: [] } if not found; { models: [name, ...] } if found. Never hallucinate model names.
|
|
65
43
|
`;
|
|
66
44
|
|
|
67
45
|
let spec = {
|
|
68
46
|
name: 'find-model',
|
|
69
|
-
aliases: ['findModel','find model','find_model'],
|
|
70
47
|
description: description,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
},
|
|
74
|
-
required: ['name'],
|
|
48
|
+
inputSchema: z.object({
|
|
49
|
+
name: z.string()
|
|
50
|
+
}),
|
|
75
51
|
handler: async (params) => {
|
|
76
52
|
let r = await _listModels(params);
|
|
77
53
|
return r;
|
|
@@ -81,3 +57,4 @@ function findModel(_appContext) {
|
|
|
81
57
|
}
|
|
82
58
|
|
|
83
59
|
export default findModel;
|
|
60
|
+
|
package/src/toolSet/findTable.js
CHANGED
|
@@ -9,79 +9,49 @@ import _listTables from '../toolHelpers/_listTables.js';
|
|
|
9
9
|
|
|
10
10
|
function findTable(_appContext) {
|
|
11
11
|
let description = `
|
|
12
|
-
|
|
12
|
+
find-table — locate a specific table in a CAS or SAS library.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- "find table iris in Public library in cas"
|
|
17
|
-
- "find table cars in sashelp in sas server"
|
|
18
|
-
- "does table customers exist in mylib?"
|
|
19
|
-
- "is there a table named sales in the Samples library?"
|
|
20
|
-
- "verify table orders exists in Public"
|
|
14
|
+
USE when: find table, does table exist, is table in library, verify table exists, locate table
|
|
15
|
+
DO NOT USE for: list tables (use list-tables), table schema/columns (use table-info), read table data (use read-table), find lib/job/model (use respective tools)
|
|
21
16
|
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
- find jobdef -> use find-jobdef
|
|
27
|
-
- Columns or schema of a table (use table-info)
|
|
28
|
-
- Reading data from a table (use read-table)
|
|
29
|
-
- Listing all tables in a library (use list-tables)
|
|
17
|
+
PARAMETERS
|
|
18
|
+
- lib: string (required) — library name (e.g., 'Public', 'sashelp')
|
|
19
|
+
- name: string (required) — table name to locate
|
|
20
|
+
- server: 'cas' | 'sas' . If not specified set it to 'cas' — target environment
|
|
30
21
|
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
ROUTING RULES
|
|
23
|
+
- "find table <name> in <lib>" → { lib: "<lib>", name: "<name>", server: "cas" }
|
|
24
|
+
- "find table <name> in <lib> in sas" → { lib: "<lib>", name: "<name>", server: "sas" }
|
|
25
|
+
- "does table <name> exist in <lib>" → { lib: "<lib>", name: "<name>", server: "cas" }
|
|
26
|
+
- "find table" with missing lib → ask "Which library contains the table?"
|
|
27
|
+
- "find table" with missing name → ask "Which table name would you like to find?"
|
|
28
|
+
- "list tables in <lib>" → use list-tables instead
|
|
33
29
|
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
- server (string, default 'cas'): Either 'cas' or 'sas'. Defaults to 'cas' when omitted.
|
|
38
|
-
|
|
39
|
-
Response Contract
|
|
40
|
-
Returns a JSON object with:
|
|
41
|
-
- tables: Array of matching table names (strings)
|
|
42
|
-
- Empty array { tables: [] } when no matches found
|
|
43
|
-
- Do not fabricate table names; only return actual matches
|
|
44
|
-
|
|
45
|
-
Disambiguation & Clarification
|
|
46
|
-
- Missing library: ask "Which library do you want to search in?"
|
|
47
|
-
- Missing table name: ask "Which table name would you like to find?"
|
|
48
|
-
- Server ambiguous: ask "Do you mean CAS or SAS?"
|
|
49
|
-
- If user wants multiple tables: suggest "Use list-tables to see all tables in a library"
|
|
50
|
-
|
|
51
|
-
Examples (→ mapped params)
|
|
52
|
-
- "find table iris in Public library in cas" → { lib: "Public", name: "iris", server: "cas" }
|
|
53
|
-
- "find table cars in sashelp in sas server" → { lib: "sashelp", name: "cars", server: "sas" }
|
|
30
|
+
EXAMPLES
|
|
31
|
+
- "find table iris in Public" → { lib: "Public", name: "iris", server: "cas" }
|
|
32
|
+
- "find table cars in sashelp in sas" → { lib: "sashelp", name: "cars", server: "sas" }
|
|
54
33
|
- "does customers exist in mylib" → { lib: "mylib", name: "customers", server: "cas" }
|
|
55
34
|
- "verify table orders in Samples" → { lib: "Samples", name: "orders", server: "cas" }
|
|
56
35
|
|
|
57
|
-
|
|
58
|
-
- "list tables in Public" (use list-tables
|
|
59
|
-
- "find library Public" (use find-library
|
|
60
|
-
- "what columns in cars
|
|
61
|
-
- "read data from customers" (use read-table
|
|
36
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
37
|
+
- "list tables in Public" (use list-tables)
|
|
38
|
+
- "find library Public" (use find-library)
|
|
39
|
+
- "what columns in cars?" (use table-info)
|
|
40
|
+
- "read data from customers" (use read-table)
|
|
62
41
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- After finding a table, use table-info for schema or read-table for data
|
|
67
|
-
|
|
68
|
-
Related Tools
|
|
69
|
-
- find-table → table-info → read-table (typical workflow)
|
|
70
|
-
- list-tables — to discover all tables in a library
|
|
71
|
-
- find-library — to verify library exists
|
|
72
|
-
- table-info — to inspect table structure after finding it
|
|
73
|
-
`;
|
|
42
|
+
ERRORS
|
|
43
|
+
Returns { tables: [] } if not found; { tables: [name, ...] } if found. Never hallucinate table names.
|
|
44
|
+
`;
|
|
74
45
|
|
|
75
46
|
let spec = {
|
|
76
47
|
name: 'find-table',
|
|
77
|
-
aliases: ['findTable','find table','find_table'],
|
|
78
48
|
description: description,
|
|
79
|
-
|
|
80
|
-
|
|
49
|
+
inputSchema: z.object({
|
|
50
|
+
lib: z.string(),
|
|
81
51
|
name: z.string(),
|
|
82
|
-
|
|
83
|
-
},
|
|
84
|
-
|
|
52
|
+
server: z.string()
|
|
53
|
+
}),
|
|
54
|
+
|
|
85
55
|
handler: async (params) => {
|
|
86
56
|
// Check if the params.scenario is a string and parse it
|
|
87
57
|
let r = await _listTables(params);
|
|
@@ -92,3 +62,4 @@ Related Tools
|
|
|
92
62
|
}
|
|
93
63
|
|
|
94
64
|
export default findTable;
|
|
65
|
+
|
package/src/toolSet/getEnv.js
CHANGED
|
@@ -7,66 +7,51 @@ import {z} from 'zod';
|
|
|
7
7
|
import _getEnv from '../toolHelpers/_getEnv.js';
|
|
8
8
|
function getEnv(_appContext) {
|
|
9
9
|
let description = `
|
|
10
|
-
|
|
10
|
+
get-env — retrieve a variable value from the runtime environment.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- The user wants to access a specific environment variable or context value
|
|
15
|
-
- "What is the value of [variable name]?"
|
|
16
|
-
- "Get me the [variable] value"
|
|
17
|
-
- "Show the current [variable]"
|
|
12
|
+
USE when: what is the value of, get me, show current, what's the, retrieve environment variable
|
|
13
|
+
DO NOT USE for: read table data (use read-table), model info (use model-info), find/run job (use find-job/run-job), set context (use set-context)
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
- Getting model information (use model-info)
|
|
22
|
-
- Looking up job status (use find-job or run-job)
|
|
23
|
-
- Setting environment variables (use set-context to set CAS/SAS contexts)
|
|
15
|
+
PARAMETERS
|
|
16
|
+
- name: string (required) — variable name to retrieve (case-sensitive)
|
|
24
17
|
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
ROUTING RULES
|
|
19
|
+
- "what is the value of <var>" → { name: "<var>" }
|
|
20
|
+
- "get me <var>" → { name: "<var>" }
|
|
21
|
+
- "show <var>" → { name: "<var>" }
|
|
22
|
+
- "get" with no variable → ask "Which variable would you like to retrieve?"
|
|
23
|
+
- "what context am I using" → use set-context instead (no params)
|
|
24
|
+
- "set <var> to <value>" → use set-context or run-sas-program instead
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
- name (string, required): The name of the variable to retrieve. Variable names are case-sensitive.
|
|
30
|
-
|
|
31
|
-
Response Contract
|
|
32
|
-
Returns a JSON object containing:
|
|
33
|
-
- The requested variable name as a key
|
|
34
|
-
- The current value of that variable
|
|
35
|
-
- If the variable does not exist, returns null or an error message
|
|
36
|
-
|
|
37
|
-
Disambiguation & Clarification
|
|
38
|
-
- If variable name is missing: ask "Which variable would you like to retrieve?"
|
|
39
|
-
- If user says "context" without specifying which variable: clarify "Do you mean the CAS context, SAS context, or a specific variable?"
|
|
40
|
-
- Multiple variable request: handle one at a time or ask for clarification
|
|
41
|
-
|
|
42
|
-
Examples (→ mapped params)
|
|
26
|
+
EXAMPLES
|
|
43
27
|
- "What's the value of myVar" → { name: "myVar" }
|
|
44
28
|
- "Get me the configuration variable" → { name: "configuration" }
|
|
45
29
|
- "Show the current server setting" → { name: "server" }
|
|
46
30
|
|
|
47
|
-
|
|
48
|
-
- "Read
|
|
49
|
-
- "Get model details for myModel" (use model-info
|
|
50
|
-
- "Set the CAS server to finance-prod" (use set-context
|
|
31
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
32
|
+
- "Read rows from customers" (use read-table)
|
|
33
|
+
- "Get model details for myModel" (use model-info)
|
|
34
|
+
- "Set the CAS server to finance-prod" (use set-context)
|
|
51
35
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- modelInfo — to retrieve model metadata
|
|
56
|
-
`;
|
|
36
|
+
ERRORS
|
|
37
|
+
Returns variable name with current value, or null if not found. Return structured error with message field.
|
|
38
|
+
`;
|
|
57
39
|
|
|
58
40
|
let spec = {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
41
|
+
name: 'get-env',
|
|
42
|
+
description: description,
|
|
43
|
+
inputSchema: {
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: {
|
|
46
|
+
name: { type: 'string' }
|
|
47
|
+
},
|
|
48
|
+
required: ['name']
|
|
64
49
|
},
|
|
65
|
-
|
|
66
|
-
handler: async (params) => {
|
|
50
|
+
handler: async (params) => {
|
|
67
51
|
return await _getEnv(params);
|
|
68
52
|
}
|
|
69
53
|
}
|
|
70
54
|
return spec;
|
|
71
55
|
}
|
|
72
56
|
export default getEnv;
|
|
57
|
+
|
|
@@ -1,96 +1,61 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
import { z } from 'zod';
|
|
6
|
-
import _listJobdefs from '../toolHelpers/_listJobdefs.js';
|
|
7
|
-
function listJobdefs(_appContext) {
|
|
8
|
-
|
|
9
|
-
let description = `
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
Error Handling
|
|
64
|
-
- On backend error: surface structured error payload (do not fabricate job names).
|
|
65
|
-
- Empty page (items.length === 0) with start > 1 may mean caller paged past end.
|
|
66
|
-
|
|
67
|
-
Usage Tips
|
|
68
|
-
- Increase limit for fewer round trips; keep reasonable to avoid large payloads.
|
|
69
|
-
- Combine with findJobdeffor confirmation before execution.
|
|
70
|
-
|
|
71
|
-
Examples (→ mapped params)
|
|
72
|
-
- "list jobdefs" → { start:1, limit:10 }
|
|
73
|
-
- "list 25 jobdefs" → { start:1, limit:25 }
|
|
74
|
-
- "next jobdefs" (after prior {start:1,limit:10}) → { start:11, limit:10 }
|
|
75
|
-
`;
|
|
76
|
-
|
|
77
|
-
let spec = {
|
|
78
|
-
name: 'list-jobdefs',
|
|
79
|
-
aliases: ['listJobdefs','list jobdefs','list_jobdefs'],
|
|
80
|
-
description: description,
|
|
81
|
-
schema: {
|
|
82
|
-
limit: z.number().default(10),
|
|
83
|
-
start: z.number().default(1),
|
|
84
|
-
where: z.string().default('')
|
|
85
|
-
},
|
|
86
|
-
// No 'server' required; backend context is implicit in helper
|
|
87
|
-
required: [],
|
|
88
|
-
handler: async (params) => {
|
|
89
|
-
// _listJobdefs handles all validation and defaults
|
|
90
|
-
const result = await _listJobdefs(params);
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return spec;
|
|
95
|
-
}
|
|
96
|
-
export default listJobdefs;
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import _listJobdefs from '../toolHelpers/_listJobdefs.js';
|
|
7
|
+
function listJobdefs(_appContext) {
|
|
8
|
+
|
|
9
|
+
let description = `
|
|
10
|
+
list-jobdefs — enumerate SAS Viya job definitions (jobdefs) assets.
|
|
11
|
+
|
|
12
|
+
USE when: list jobdefs, show jobdefs, browse jobdefs, list available jobdefs, next page
|
|
13
|
+
DO NOT USE for: find single jobdef (use find-jobdef), execute jobdef (use run-jobdef), find job (use find-job), sas code (use run-sas-program)
|
|
14
|
+
|
|
15
|
+
PARAMETERS
|
|
16
|
+
- limit: number (default: 10) — number of jobdefs per page
|
|
17
|
+
- start: number (default: 1) — 1-based page offset
|
|
18
|
+
- where: string (default: '') — optional filter expression
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- list jobdefs → { start: 1, limit: 10 }
|
|
22
|
+
- show me 25 jobdefs → { start: 1, limit: 25 }
|
|
23
|
+
- next jobdefs → { start: previousStart + previousLimit, limit: previousLimit }
|
|
24
|
+
|
|
25
|
+
EXAMPLES
|
|
26
|
+
- list jobdefs → { start: 1, limit: 10 }
|
|
27
|
+
- list 25 jobdefs → { start: 1, limit: 25 }
|
|
28
|
+
- next jobdefs → { start: 11, limit: 10 }
|
|
29
|
+
|
|
30
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
31
|
+
- find jobdef abc (use find-jobdef)
|
|
32
|
+
- list jobs (use list-jobs)
|
|
33
|
+
- run jobdef abc (use run-jobdef)
|
|
34
|
+
- list models (use list-models)
|
|
35
|
+
|
|
36
|
+
PAGINATION
|
|
37
|
+
If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
|
|
38
|
+
|
|
39
|
+
ERRORS
|
|
40
|
+
Surface backend error directly; never fabricate jobdef names.
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
let spec = {
|
|
44
|
+
name: 'list-jobdefs',
|
|
45
|
+
description: description,
|
|
46
|
+
inputSchema: z.object({
|
|
47
|
+
limit: z.number().optional(),
|
|
48
|
+
start: z.number().optional(),
|
|
49
|
+
where: z.string().optional()
|
|
50
|
+
}),
|
|
51
|
+
// No 'server' required; backend context is implicit in helper
|
|
52
|
+
handler: async (params) => {
|
|
53
|
+
// _listJobdefs handles all validation and defaults
|
|
54
|
+
const result = await _listJobdefs(params);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return spec;
|
|
59
|
+
}
|
|
60
|
+
export default listJobdefs;
|
|
61
|
+
|