@sassoftware/sas-score-mcp-serverjs 1.0.1-30 → 1.0.1-32
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-score-mcp-serverjs-agent.md +1 -1
- package/.skills/copilot-instructions.md +57 -26
- package/.skills/skills/detail-strategy/SKILL.md +95 -49
- package/.skills/skills/find-resources/SKILL.md +38 -31
- package/.skills/skills/list-resource/SKILL.md +93 -33
- package/.skills/skills/request-routing/SKILL.md +9 -4
- package/.skills/skills/score-strategy/SKILL.md +21 -3
- package/README.md +62 -43
- package/openApi.yaml +121 -121
- package/package.json +7 -5
- package/scripts/docs/oauth-http-transport.md +2 -2
- package/scripts/plot_msrp_usa.py +49 -0
- package/scripts/refreshtoken.js +57 -57
- package/src/createMcpServer.js +0 -1
- package/src/openApi.yaml +121 -121
- package/src/toolHelpers/_findJob.js +12 -0
- package/src/toolHelpers/_findJobdef.js +10 -0
- package/src/toolHelpers/_findLibrary.js +10 -0
- package/src/toolHelpers/_findMas.js +12 -0
- package/src/toolHelpers/_findTable.js +10 -0
- package/src/toolHelpers/_listJobs.js +2 -2
- package/src/toolHelpers/{_listModels.js → _listMas.js} +4 -4
- package/src/toolSet/devaScore.js +61 -61
- package/src/toolSet/findJob.js +2 -1
- package/src/toolSet/findJobdef.js +2 -2
- package/src/toolSet/findLibrary.js +68 -68
- package/src/toolSet/findMas.js +59 -0
- package/src/toolSet/findTable.js +2 -2
- package/src/toolSet/jobInfo.js +59 -0
- package/src/toolSet/jobdefInfo.js +59 -0
- package/src/toolSet/listJobdefs.js +61 -61
- package/src/toolSet/listJobs.js +61 -61
- package/src/toolSet/listLibraries.js +78 -78
- package/src/toolSet/{listModels.js → listMas.js} +61 -56
- package/src/toolSet/listTables.js +66 -66
- package/src/toolSet/makeTools.js +21 -12
- package/src/toolSet/{modelInfo.js → masInfo.js} +12 -12
- package/src/toolSet/{modelScore.js → masScore.js} +3 -3
- package/src/toolSet/readTable.js +63 -63
- package/src/toolSet/runMacro.js +82 -82
- package/src/toolSet/sasQuery.js +77 -77
- package/src/toolSet/setContext.js +65 -65
- package/src/toolSet/superstat.js +61 -61
- package/src/toolSet/tableInfo.js +58 -58
- package/scripts/optimize_final.py +0 -140
- package/scripts/optimize_tools.py +0 -99
- package/scripts/setup-skills.js +0 -34
- package/scripts/token.txt +0 -1
- package/scripts/update_descriptions.py +0 -46
- package/src/toolSet/findModel.js +0 -60
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import _findmas from '../toolHelpers/_findmas.js';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
function findMas(_appContext) {
|
|
11
|
+
let description = `
|
|
12
|
+
find-mas — locate a specific MAS mas deployed to MAS server
|
|
13
|
+
|
|
14
|
+
USE when: find mas, does mas exist, is mas deployed, lookup mas, verify mas exists
|
|
15
|
+
DO NOT USE for: list mass (use list-mass), mas info/variables (use mas-info), score mas (use mas-score), find table/job/lib (use respective tools), scr mass (use scr-info/scr-score)
|
|
16
|
+
|
|
17
|
+
PARAMETERS
|
|
18
|
+
- name: string (required) — mas name to locate; if multiple supplied, use first
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- "find mas <name>" → { name: "<name>" }
|
|
22
|
+
- "does mas <name> exist" → { name: "<name>" }
|
|
23
|
+
- "is mas <name> deployed" → { name: "<name>" }
|
|
24
|
+
- "lookup/verify mas <name>" → { name: "<name>" }
|
|
25
|
+
- "find mas" with no name → ask "Which mas name would you like to find?"
|
|
26
|
+
- "find all mass / list mass" → use list-mass instead
|
|
27
|
+
- "describe mas / mas info" → use mas-info instead
|
|
28
|
+
|
|
29
|
+
EXAMPLES
|
|
30
|
+
- "find mas mymas" → { name: "mymas" }
|
|
31
|
+
- "does mas churn_score exist" → { name: "churn_score" }
|
|
32
|
+
- "is mas riskmas deployed" → { name: "riskmas" }
|
|
33
|
+
- "lookup mas claims_fraud_v1" → { name: "claims_fraud_v1" }
|
|
34
|
+
|
|
35
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
36
|
+
- "list mass" (use list-mass)
|
|
37
|
+
- "score mas mymas" (use mas-score)
|
|
38
|
+
- "mas info for churnRisk" (use mas-info)
|
|
39
|
+
|
|
40
|
+
ERRORS
|
|
41
|
+
Returns { mass: [] } if not found; { mass: [name, ...] } if found. Never hallucinate mas names.
|
|
42
|
+
`;
|
|
43
|
+
|
|
44
|
+
let spec = {
|
|
45
|
+
name: 'find-mas',
|
|
46
|
+
description: description,
|
|
47
|
+
inputSchema: z.object({
|
|
48
|
+
name: z.string()
|
|
49
|
+
}),
|
|
50
|
+
handler: async (params) => {
|
|
51
|
+
let r = await _findmas(params);
|
|
52
|
+
return r;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return spec;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default findMas;
|
|
59
|
+
|
package/src/toolSet/findTable.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
//import debug from 'debug';
|
|
8
|
-
import
|
|
8
|
+
import _findTable from '../toolHelpers/_findTable.js';
|
|
9
9
|
|
|
10
10
|
function findTable(_appContext) {
|
|
11
11
|
let description = `
|
|
@@ -54,7 +54,7 @@ Returns { tables: [] } if not found; { tables: [name, ...] } if found. Never hal
|
|
|
54
54
|
|
|
55
55
|
handler: async (params) => {
|
|
56
56
|
// Check if the params.scenario is a string and parse it
|
|
57
|
-
let r = await
|
|
57
|
+
let r = await _findTable(params);
|
|
58
58
|
return r;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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 _listJobs from '../toolHelpers/_listJobs.js';
|
|
7
|
+
function jobInfo(_appContext) {
|
|
8
|
+
|
|
9
|
+
let description = `
|
|
10
|
+
job-info — return information about a specific SAS Viya job.
|
|
11
|
+
|
|
12
|
+
USE when: find job, does job exist, is there a job named, lookup job, verify job exists
|
|
13
|
+
DO NOT USE for: list jobs (use list-jobs), run job (use run-job), execute jobdef (use run-jobdef), find lib/table/model (use respective tools)
|
|
14
|
+
|
|
15
|
+
PARAMETERS
|
|
16
|
+
- name: string (required) — name of job whose details are being requested. Should be exact match to job name.
|
|
17
|
+
|
|
18
|
+
ROUTING RULES
|
|
19
|
+
- "describe job <name>" → { name: "<name>" }
|
|
20
|
+
- "describe model <name.job>"
|
|
21
|
+
- "info for job <name>" → { name: "<name>" }
|
|
22
|
+
|
|
23
|
+
EXAMPLES
|
|
24
|
+
- "describe job cars_job_v4" → { name: "cars_job_v4" }
|
|
25
|
+
|
|
26
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
27
|
+
- "list jobs" (use list-jobs)
|
|
28
|
+
- "run job cars_job_v4" (use run-job)
|
|
29
|
+
- "execute jobdef cars_job_v4" (use run-jobdef)
|
|
30
|
+
|
|
31
|
+
ERRORS
|
|
32
|
+
Returns job metadata
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
let spec = {
|
|
36
|
+
name: 'job-info',
|
|
37
|
+
description: description,
|
|
38
|
+
inputSchema: z.object({
|
|
39
|
+
name: z.string()
|
|
40
|
+
}),
|
|
41
|
+
handler: async (params) => {
|
|
42
|
+
if (params.name != null) {
|
|
43
|
+
if (params.name.endsWith('.job')) {
|
|
44
|
+
params.name = params.name.slice(0, -4);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// _listJobs can handle job lookup by name and will return an appropriate error message if not found, so we can rely on that for error handling here.
|
|
48
|
+
let r = await _listJobs(params);
|
|
49
|
+
return r;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/* correct spec for registerTool with inputSchema */
|
|
55
|
+
|
|
56
|
+
return spec;
|
|
57
|
+
}
|
|
58
|
+
export default jobInfo;
|
|
59
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
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 jobdefInfo(_appContext) {
|
|
8
|
+
|
|
9
|
+
let description = `
|
|
10
|
+
jobdef -info — return information about a specific SAS Viya jobdef.
|
|
11
|
+
|
|
12
|
+
USE when: find jobdef, does jobdef exist, is there a jobdef named, lookup jobdef, verify jobdef exists
|
|
13
|
+
DO NOT USE for: list jobdefs (use list-jobdefs), run jobdef (use run-jobdef), find lib/table/model (use respective tools)
|
|
14
|
+
|
|
15
|
+
PARAMETERS
|
|
16
|
+
- name: string (required) — name of jobdef whose details are being requested. Should be exact match to jobdef name.
|
|
17
|
+
|
|
18
|
+
ROUTING RULES
|
|
19
|
+
- "describe jobdef <name>" → { name: "<name>" }
|
|
20
|
+
- "describe model <name.jobdef>"
|
|
21
|
+
- "info for jobdef <name>" → { name: "<name>" }
|
|
22
|
+
|
|
23
|
+
EXAMPLES
|
|
24
|
+
- "describe jobdef cars_job_v4" → { name: "cars_job_v4" }
|
|
25
|
+
|
|
26
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
27
|
+
- "list jobdefs" (use list-jobdefs)
|
|
28
|
+
- "run jobdef cars_job_v4" (use run-jobdef)
|
|
29
|
+
- "execute jobdef cars_job_v4" (use run-jobdef)
|
|
30
|
+
|
|
31
|
+
ERRORS
|
|
32
|
+
Returns job metadata
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
let spec = {
|
|
36
|
+
name: 'jobdef-info',
|
|
37
|
+
description: description,
|
|
38
|
+
inputSchema: z.object({
|
|
39
|
+
name: z.string()
|
|
40
|
+
}),
|
|
41
|
+
handler: async (params) => {
|
|
42
|
+
if (params.name != null) {
|
|
43
|
+
if (params.name.endsWith('.jobdef')) {
|
|
44
|
+
params.name = params.name.slice(0, -7);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// _listJobs can handle job lookup by name and will return an appropriate error message if not found, so we can rely on that for error handling here.
|
|
48
|
+
let r = await _listJobdefs(params);
|
|
49
|
+
return r;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/* correct spec for registerTool with inputSchema */
|
|
55
|
+
|
|
56
|
+
return spec;
|
|
57
|
+
}
|
|
58
|
+
export default jobdefInfo;
|
|
59
|
+
|
|
@@ -1,61 +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
|
-
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
|
-
|
|
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
|
+
|
package/src/toolSet/listJobs.js
CHANGED
|
@@ -1,61 +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 _listJobs from '../toolHelpers/_listJobs.js';
|
|
7
|
-
function listJobs(_appContext) {
|
|
8
|
-
|
|
9
|
-
let description = `
|
|
10
|
-
list-jobs — enumerate SAS Viya job assets.
|
|
11
|
-
|
|
12
|
-
USE when: list jobs, show jobs, browse jobs, list available jobs, next page
|
|
13
|
-
DO NOT USE for: find single job (use find-job), execute job (use run-job), run job def (use run-jobdef), sas code (use run-sas-program)
|
|
14
|
-
|
|
15
|
-
PARAMETERS
|
|
16
|
-
- limit: number (default: 10) — number of jobs per page
|
|
17
|
-
- start: number (default: 1) — 1-based page offset
|
|
18
|
-
- where: string (default: '') — optional filter expression
|
|
19
|
-
|
|
20
|
-
ROUTING RULES
|
|
21
|
-
- list jobs → { start: 1, limit: 10 }
|
|
22
|
-
- show me 25 jobs → { start: 1, limit: 25 }
|
|
23
|
-
- next jobs → { start: previousStart + previousLimit, limit: previousLimit }
|
|
24
|
-
|
|
25
|
-
EXAMPLES
|
|
26
|
-
- list jobs → { start: 1, limit: 10 }
|
|
27
|
-
- list 25 jobs → { start: 1, limit: 25 }
|
|
28
|
-
- next jobs → { start: 11, limit: 10 }
|
|
29
|
-
|
|
30
|
-
NEGATIVE EXAMPLES (do not route here)
|
|
31
|
-
- find job abc (use find-job)
|
|
32
|
-
- run job abc (use run-job)
|
|
33
|
-
- list models (use list-models)
|
|
34
|
-
- list tables in lib xyz (use list-tables)
|
|
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 job names.
|
|
41
|
-
`;
|
|
42
|
-
|
|
43
|
-
let spec = {
|
|
44
|
-
name: 'list-jobs',
|
|
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
|
-
// _listJob handles all validation and defaults
|
|
54
|
-
const result = await _listJobs(params);
|
|
55
|
-
return result;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return spec;
|
|
59
|
-
}
|
|
60
|
-
export default listJobs;
|
|
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 _listJobs from '../toolHelpers/_listJobs.js';
|
|
7
|
+
function listJobs(_appContext) {
|
|
8
|
+
|
|
9
|
+
let description = `
|
|
10
|
+
list-jobs — enumerate SAS Viya job assets.
|
|
11
|
+
|
|
12
|
+
USE when: list jobs, show jobs, browse jobs, list available jobs, next page
|
|
13
|
+
DO NOT USE for: find single job (use find-job), execute job (use run-job), run job def (use run-jobdef), sas code (use run-sas-program)
|
|
14
|
+
|
|
15
|
+
PARAMETERS
|
|
16
|
+
- limit: number (default: 10) — number of jobs per page
|
|
17
|
+
- start: number (default: 1) — 1-based page offset
|
|
18
|
+
- where: string (default: '') — optional filter expression
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- list jobs → { start: 1, limit: 10 }
|
|
22
|
+
- show me 25 jobs → { start: 1, limit: 25 }
|
|
23
|
+
- next jobs → { start: previousStart + previousLimit, limit: previousLimit }
|
|
24
|
+
|
|
25
|
+
EXAMPLES
|
|
26
|
+
- list jobs → { start: 1, limit: 10 }
|
|
27
|
+
- list 25 jobs → { start: 1, limit: 25 }
|
|
28
|
+
- next jobs → { start: 11, limit: 10 }
|
|
29
|
+
|
|
30
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
31
|
+
- find job abc (use find-job)
|
|
32
|
+
- run job abc (use run-job)
|
|
33
|
+
- list models (use list-models)
|
|
34
|
+
- list tables in lib xyz (use list-tables)
|
|
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 job names.
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
let spec = {
|
|
44
|
+
name: 'list-jobs',
|
|
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
|
+
// _listJob handles all validation and defaults
|
|
54
|
+
const result = await _listJobs(params);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return spec;
|
|
59
|
+
}
|
|
60
|
+
export default listJobs;
|
|
61
|
+
|
|
@@ -1,78 +1,78 @@
|
|
|
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 _listLibrary from '../toolHelpers/_listLibrary.js';
|
|
7
|
-
function listLibraries(_appContext) {
|
|
8
|
-
let description = `
|
|
9
|
-
list-libraries — enumerate CAS or SAS libraries.
|
|
10
|
-
|
|
11
|
-
USE when user asks to: list/show/enumerate libraries, caslibs, sas libs, or available libraries.
|
|
12
|
-
DO NOT USE for: listing tables in a library (→ list-tables), column/table metadata, job execution, models, scoring.
|
|
13
|
-
|
|
14
|
-
PARAMETERS
|
|
15
|
-
- server: 'cas' | 'sas' | 'all' (default: 'all')
|
|
16
|
-
- limit: integer > 0 (default: 10)
|
|
17
|
-
- start: 1-based offset (default: 1)
|
|
18
|
-
- where: optional filter expression (default: '')
|
|
19
|
-
|
|
20
|
-
ROUTING RULES
|
|
21
|
-
- "cas libs / cas libraries / in cas" → { server: 'cas' }
|
|
22
|
-
- "sas libs / sas libraries / in sas" → { server: 'sas' }
|
|
23
|
-
- "all libs / all libraries" → { server: 'all' }
|
|
24
|
-
- "list tables in <libname>" → route to list-tables, NOT here
|
|
25
|
-
- server unspecified → default { server: 'all' }
|
|
26
|
-
- "all cas libs" with no limit specified → { server: 'cas', limit: 50 } + paging note
|
|
27
|
-
- "next" after prior call (start:S, limit:L) → { start: S + L, limit: L }
|
|
28
|
-
- ambiguous "list" or "libs" with no context → assume { server: 'cas' }
|
|
29
|
-
|
|
30
|
-
EXAMPLES
|
|
31
|
-
- "list libraries" → { server: 'all', start: 1, limit: 10 }
|
|
32
|
-
- "list libs " → { server: 'all', start: 1, limit: 10 }
|
|
33
|
-
|
|
34
|
-
- "list all libs" → { server: 'all', start: 1, limit: 10 }
|
|
35
|
-
- "list cas libraries" → { server: 'cas', start: 1, limit: 10 }
|
|
36
|
-
- "show me 25 sas libs" → { server: 'sas', limit: 25, start: 1 }
|
|
37
|
-
- "next" (prev: start:1,limit:10) → { server: <same>, start: 11, limit: 10 }
|
|
38
|
-
- "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
|
|
39
|
-
|
|
40
|
-
NEGATIVE EXAMPLES (do not route here)
|
|
41
|
-
- "list tables in SASHELP" → list-tables
|
|
42
|
-
- "list models / jobs / jobdefs"→ respective tools
|
|
43
|
-
- "run a program to create a lib" → run-sas-program
|
|
44
|
-
|
|
45
|
-
PAGINATION
|
|
46
|
-
If returned item count === limit, hint: next start = start + limit.
|
|
47
|
-
If start > 1 and result is empty, note paging may have exceeded available items.
|
|
48
|
-
|
|
49
|
-
ERRORS
|
|
50
|
-
Return structured error with a message field. Never hallucinate library names.
|
|
51
|
-
`;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Canonical kebab-case tool name; legacy aliases preserved for compatibility
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
let spec = {
|
|
58
|
-
name: 'list-libraries',
|
|
59
|
-
description: description,
|
|
60
|
-
inputSchema: z.object({
|
|
61
|
-
server: z.string().optional(),
|
|
62
|
-
limit: z.number().optional(),
|
|
63
|
-
start: z.number().optional(),
|
|
64
|
-
where: z.string().optional()
|
|
65
|
-
}),
|
|
66
|
-
// 'server' has a default so we don't mark it required
|
|
67
|
-
handler: async (params) => {
|
|
68
|
-
// normalize server just in case caller sends 'CAS'/'SAS'
|
|
69
|
-
params.server = (params.server || 'all').toLowerCase();
|
|
70
|
-
|
|
71
|
-
let r = await _listLibrary(params);
|
|
72
|
-
return r;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
return spec;
|
|
76
|
-
}
|
|
77
|
-
export default listLibraries;
|
|
78
|
-
|
|
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 _listLibrary from '../toolHelpers/_listLibrary.js';
|
|
7
|
+
function listLibraries(_appContext) {
|
|
8
|
+
let description = `
|
|
9
|
+
list-libraries — enumerate CAS or SAS libraries.
|
|
10
|
+
|
|
11
|
+
USE when user asks to: list/show/enumerate libraries, caslibs, sas libs, or available libraries.
|
|
12
|
+
DO NOT USE for: listing tables in a library (→ list-tables), column/table metadata, job execution, models, scoring.
|
|
13
|
+
|
|
14
|
+
PARAMETERS
|
|
15
|
+
- server: 'cas' | 'sas' | 'all' (default: 'all')
|
|
16
|
+
- limit: integer > 0 (default: 10)
|
|
17
|
+
- start: 1-based offset (default: 1)
|
|
18
|
+
- where: optional filter expression (default: '')
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- "cas libs / cas libraries / in cas" → { server: 'cas' }
|
|
22
|
+
- "sas libs / sas libraries / in sas" → { server: 'sas' }
|
|
23
|
+
- "all libs / all libraries" → { server: 'all' }
|
|
24
|
+
- "list tables in <libname>" → route to list-tables, NOT here
|
|
25
|
+
- server unspecified → default { server: 'all' }
|
|
26
|
+
- "all cas libs" with no limit specified → { server: 'cas', limit: 50 } + paging note
|
|
27
|
+
- "next" after prior call (start:S, limit:L) → { start: S + L, limit: L }
|
|
28
|
+
- ambiguous "list" or "libs" with no context → assume { server: 'cas' }
|
|
29
|
+
|
|
30
|
+
EXAMPLES
|
|
31
|
+
- "list libraries" → { server: 'all', start: 1, limit: 10 }
|
|
32
|
+
- "list libs " → { server: 'all', start: 1, limit: 10 }
|
|
33
|
+
|
|
34
|
+
- "list all libs" → { server: 'all', start: 1, limit: 10 }
|
|
35
|
+
- "list cas libraries" → { server: 'cas', start: 1, limit: 10 }
|
|
36
|
+
- "show me 25 sas libs" → { server: 'sas', limit: 25, start: 1 }
|
|
37
|
+
- "next" (prev: start:1,limit:10) → { server: <same>, start: 11, limit: 10 }
|
|
38
|
+
- "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
|
|
39
|
+
|
|
40
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
41
|
+
- "list tables in SASHELP" → list-tables
|
|
42
|
+
- "list models / jobs / jobdefs"→ respective tools
|
|
43
|
+
- "run a program to create a lib" → run-sas-program
|
|
44
|
+
|
|
45
|
+
PAGINATION
|
|
46
|
+
If returned item count === limit, hint: next start = start + limit.
|
|
47
|
+
If start > 1 and result is empty, note paging may have exceeded available items.
|
|
48
|
+
|
|
49
|
+
ERRORS
|
|
50
|
+
Return structured error with a message field. Never hallucinate library names.
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
// Canonical kebab-case tool name; legacy aliases preserved for compatibility
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
let spec = {
|
|
58
|
+
name: 'list-libraries',
|
|
59
|
+
description: description,
|
|
60
|
+
inputSchema: z.object({
|
|
61
|
+
server: z.string().optional(),
|
|
62
|
+
limit: z.number().optional(),
|
|
63
|
+
start: z.number().optional(),
|
|
64
|
+
where: z.string().optional()
|
|
65
|
+
}),
|
|
66
|
+
// 'server' has a default so we don't mark it required
|
|
67
|
+
handler: async (params) => {
|
|
68
|
+
// normalize server just in case caller sends 'CAS'/'SAS'
|
|
69
|
+
params.server = (params.server || 'all').toLowerCase();
|
|
70
|
+
|
|
71
|
+
let r = await _listLibrary(params);
|
|
72
|
+
return r;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
return spec;
|
|
76
|
+
}
|
|
77
|
+
export default listLibraries;
|
|
78
|
+
|