@sassoftware/sas-score-mcp-serverjs 1.0.1-3 → 1.0.1-31
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 +190 -0
- package/.skills/copilot-instructions.md +241 -0
- package/.skills/skills/README.md +125 -0
- package/.skills/skills/detail-strategy/SKILL.md +272 -0
- package/.skills/skills/find-resources/SKILL.md +155 -0
- package/.skills/skills/list-resource/SKILL.md +258 -0
- package/.skills/skills/read-strategy/SKILL.md +137 -0
- package/.skills/skills/request-routing/SKILL.md +107 -0
- package/.skills/skills/score-strategy/SKILL.md +231 -0
- package/README.md +96 -54
- package/cli.js +37 -27
- package/openApi.yaml +121 -121
- package/package.json +14 -14
- package/scripts/docs/oauth-http-transport.md +2 -2
- package/scripts/refreshtoken.js +58 -0
- package/src/createMcpServer.js +0 -1
- package/src/expressMcpServer.js +47 -49
- package/src/oauthHandlers/authorize.js +4 -1
- package/src/oauthHandlers/baseUrl.js +4 -0
- package/src/oauthHandlers/callback.js +5 -1
- package/src/oauthHandlers/getMetadata.js +4 -0
- package/src/oauthHandlers/index.js +4 -0
- package/src/oauthHandlers/token.js +4 -0
- package/src/openApi.yaml +121 -121
- package/src/processHeaders.js +10 -7
- package/src/setupSkills.js +12 -7
- package/src/toolHelpers/_findJob.js +12 -0
- package/src/toolHelpers/_findJobdef.js +10 -0
- package/src/toolHelpers/_findLibrary.js +10 -0
- package/src/toolHelpers/_findModel.js +12 -0
- package/src/toolHelpers/_findTable.js +10 -0
- package/src/toolHelpers/_listJobs.js +2 -1
- package/src/toolHelpers/_listLibrary.js +1 -1
- package/src/toolHelpers/_listTables.js +1 -1
- package/src/toolHelpers/getLogonPayload.js +2 -2
- package/src/toolSet/devaScore.js +61 -61
- package/src/toolSet/findJob.js +2 -1
- package/src/toolSet/findJobdef.js +7 -7
- package/src/toolSet/findLibrary.js +68 -68
- package/src/toolSet/findModel.js +2 -2
- 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 +56 -56
- package/src/toolSet/listTables.js +66 -66
- package/src/toolSet/makeTools.js +3 -0
- package/src/toolSet/modelInfo.js +1 -1
- package/src/toolSet/modelScore.js +23 -25
- package/src/toolSet/readTable.js +63 -63
- package/src/toolSet/runCasProgram.js +21 -10
- package/src/toolSet/runJob.js +15 -19
- package/src/toolSet/runJobdef.js +15 -19
- package/src/toolSet/runMacro.js +82 -82
- package/src/toolSet/sasQuery.js +77 -77
- package/src/toolSet/scrScore.js +60 -69
- package/src/toolSet/setContext.js +65 -65
- package/src/toolSet/superstat.js +61 -61
- package/src/toolSet/tableInfo.js +58 -58
- package/.skills_claude/README.md +0 -303
- package/.skills_claude/TESTING_GUIDE.md +0 -252
- package/.skills_claude/agents/sas-viya-scoring-expert.md +0 -58
- package/.skills_claude/claude-desktop-config.json +0 -16
- package/.skills_claude/claude-desktop-system-prompt.md +0 -127
- package/.skills_claude/copilot-instructions.md +0 -155
- package/.skills_claude/instructions.md +0 -184
- package/.skills_claude/skills/sas-find-library-smart/SKILL.md +0 -157
- package/.skills_claude/skills/sas-find-resource-strategy/SKILL.md +0 -105
- package/.skills_claude/skills/sas-list-resource-strategy/SKILL.md +0 -124
- package/.skills_claude/skills/sas-list-tables-smart/SKILL.md +0 -126
- package/.skills_claude/skills/sas-read-and-score/SKILL.md +0 -112
- package/.skills_claude/skills/sas-read-strategy/SKILL.md +0 -154
- package/.skills_claude/skills/sas-request-classifier/SKILL.md +0 -69
- package/.skills_claude/skills/sas-score-workflow/SKILL.md +0 -200
- package/.skills_claude/skills-index.md +0 -345
- package/.skills_github/agents/sas-viya-scoring-expert.md +0 -58
- package/.skills_github/copilot-instructions.md +0 -177
- package/.skills_github/skills/sas-find-library-smart/SKILL.md +0 -155
- package/.skills_github/skills/sas-find-resource-strategy/SKILL.md +0 -105
- package/.skills_github/skills/sas-list-resource-strategy/SKILL.md +0 -124
- package/.skills_github/skills/sas-list-tables-smart/SKILL.md +0 -128
- package/.skills_github/skills/sas-read-and-score/SKILL.md +0 -113
- package/.skills_github/skills/sas-read-strategy/SKILL.md +0 -154
- package/.skills_github/skills/sas-request-classifier/SKILL.md +0 -74
- package/.skills_github/skills/sas-score-workflow/SKILL.md +0 -314
- package/scripts/optimize_final.py +0 -140
- package/scripts/optimize_tools.py +0 -99
- package/scripts/setup-skills.js +0 -34
- package/scripts/update_descriptions.py +0 -46
- package/src/authpkce.js +0 -219
- package/src/handleGetDelete.js +0 -34
- package/src/handleRequest.js +0 -112
- package/src/hapiMcpServer.js +0 -241
- package/src/toolSet/.claude/settings.local.json +0 -13
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
|
+
|
|
@@ -1,56 +1,56 @@
|
|
|
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 _listModels from '../toolHelpers/_listModels.js';
|
|
8
|
-
|
|
9
|
-
function listModels(_appContext) {
|
|
10
|
-
let description = `
|
|
11
|
-
list-models — enumerate models published to MAS.
|
|
12
|
-
|
|
13
|
-
USE when: list models, show models, browse models, next page
|
|
14
|
-
DO NOT USE for: find model, model metadata, score model, list jobs/tables/libraries
|
|
15
|
-
|
|
16
|
-
PARAMETERS
|
|
17
|
-
- limit: number (default: 10) — page size
|
|
18
|
-
- start: number (default: 1) — 1-based offset
|
|
19
|
-
|
|
20
|
-
ROUTING RULES
|
|
21
|
-
- "list models" → { start:1, limit:10 }
|
|
22
|
-
- "list 25 models" → { start:1, limit:25 }
|
|
23
|
-
- "next models" → { start: start+limit, limit:10 }
|
|
24
|
-
|
|
25
|
-
EXAMPLES
|
|
26
|
-
- "list models" → { start:1, limit:10 }
|
|
27
|
-
- "list 25 models" → { start:1, limit:25 }
|
|
28
|
-
|
|
29
|
-
NEGATIVE EXAMPLES (do not route here)
|
|
30
|
-
- "find model X" (use find-model)
|
|
31
|
-
- "describe model X" (use model-info)
|
|
32
|
-
- "score model X" (use model-score)
|
|
33
|
-
- "list jobs" (use list-jobs)
|
|
34
|
-
|
|
35
|
-
ERRORS
|
|
36
|
-
Returns empty array if no models found.
|
|
37
|
-
`;
|
|
38
|
-
|
|
39
|
-
let spec = {
|
|
40
|
-
name: 'list-models',
|
|
41
|
-
description: description,
|
|
42
|
-
inputSchema: z.object({
|
|
43
|
-
limit: z.number().optional(),
|
|
44
|
-
start: z.number().optional()
|
|
45
|
-
}),
|
|
46
|
-
handler: async (params) => {
|
|
47
|
-
let r = await _listModels(params);
|
|
48
|
-
return r;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return spec;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export default listModels;
|
|
56
|
-
|
|
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 _listModels from '../toolHelpers/_listModels.js';
|
|
8
|
+
|
|
9
|
+
function listModels(_appContext) {
|
|
10
|
+
let description = `
|
|
11
|
+
list-models — enumerate models published to MAS.
|
|
12
|
+
|
|
13
|
+
USE when: list models, show models, browse models, next page
|
|
14
|
+
DO NOT USE for: find model, model metadata, score model, list jobs/tables/libraries
|
|
15
|
+
|
|
16
|
+
PARAMETERS
|
|
17
|
+
- limit: number (default: 10) — page size
|
|
18
|
+
- start: number (default: 1) — 1-based offset
|
|
19
|
+
|
|
20
|
+
ROUTING RULES
|
|
21
|
+
- "list models" → { start:1, limit:10 }
|
|
22
|
+
- "list 25 models" → { start:1, limit:25 }
|
|
23
|
+
- "next models" → { start: start+limit, limit:10 }
|
|
24
|
+
|
|
25
|
+
EXAMPLES
|
|
26
|
+
- "list models" → { start:1, limit:10 }
|
|
27
|
+
- "list 25 models" → { start:1, limit:25 }
|
|
28
|
+
|
|
29
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
30
|
+
- "find model X" (use find-model)
|
|
31
|
+
- "describe model X" (use model-info)
|
|
32
|
+
- "score model X" (use model-score)
|
|
33
|
+
- "list jobs" (use list-jobs)
|
|
34
|
+
|
|
35
|
+
ERRORS
|
|
36
|
+
Returns empty array if no models found.
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
let spec = {
|
|
40
|
+
name: 'list-models',
|
|
41
|
+
description: description,
|
|
42
|
+
inputSchema: z.object({
|
|
43
|
+
limit: z.number().optional(),
|
|
44
|
+
start: z.number().optional()
|
|
45
|
+
}),
|
|
46
|
+
handler: async (params) => {
|
|
47
|
+
let r = await _listModels(params);
|
|
48
|
+
return r;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return spec;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export default listModels;
|
|
56
|
+
|
|
@@ -1,66 +1,66 @@
|
|
|
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 debug from 'debug';
|
|
8
|
-
import _listTables from '../toolHelpers/_listTables.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function listTables(_appContext) {
|
|
12
|
-
const log = debug('tools');
|
|
13
|
-
|
|
14
|
-
let description = `
|
|
15
|
-
list-tables — enumerate tables within a library.
|
|
16
|
-
|
|
17
|
-
USE when: list tables in <lib>, show tables in <lib>, next page
|
|
18
|
-
DO NOT USE for: find table, list libraries, get table structure (use table-info), read data (use read-table)
|
|
19
|
-
|
|
20
|
-
PARAMETERS
|
|
21
|
-
- lib: string — library to inspect (required)
|
|
22
|
-
- server: string (default: 'cas') — 'cas' or 'sas'
|
|
23
|
-
- limit: number (default: 10) — page size
|
|
24
|
-
- start: number (default: 1) — 1-based offset
|
|
25
|
-
- where: string — optional filter expression
|
|
26
|
-
|
|
27
|
-
ROUTING RULES
|
|
28
|
-
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
29
|
-
- "list 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
30
|
-
- "list cas tables in Public" → { lib: "Public", server: "cas", start: 1, limit: 10 }
|
|
31
|
-
|
|
32
|
-
EXAMPLES
|
|
33
|
-
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
34
|
-
- "show 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
35
|
-
|
|
36
|
-
NEGATIVE EXAMPLES (do not route here)
|
|
37
|
-
- "list libs" (use list-libraries)
|
|
38
|
-
- "find lib Public" (use find-library)
|
|
39
|
-
- "describe table cars" (use table-info)
|
|
40
|
-
- "read table cars" (use read-table)
|
|
41
|
-
|
|
42
|
-
ERRORS
|
|
43
|
-
Returns empty array if no tables found.
|
|
44
|
-
`;
|
|
45
|
-
|
|
46
|
-
let spec = {
|
|
47
|
-
name: 'list-tables',
|
|
48
|
-
description: description,
|
|
49
|
-
|
|
50
|
-
inputSchema: z.object({
|
|
51
|
-
lib: z.string(),
|
|
52
|
-
server: z.string().optional(),
|
|
53
|
-
limit: z.number().optional(),
|
|
54
|
-
start: z.number().optional(),
|
|
55
|
-
where: z.string().optional()
|
|
56
|
-
}),
|
|
57
|
-
handler: async (params) => {
|
|
58
|
-
let r = await _listTables(params);
|
|
59
|
-
return r;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return spec;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export default listTables;
|
|
66
|
-
|
|
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 debug from 'debug';
|
|
8
|
+
import _listTables from '../toolHelpers/_listTables.js';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
function listTables(_appContext) {
|
|
12
|
+
const log = debug('tools');
|
|
13
|
+
|
|
14
|
+
let description = `
|
|
15
|
+
list-tables — enumerate tables within a library.
|
|
16
|
+
|
|
17
|
+
USE when: list tables in <lib>, show tables in <lib>, next page
|
|
18
|
+
DO NOT USE for: find table, list libraries, get table structure (use table-info), read data (use read-table)
|
|
19
|
+
|
|
20
|
+
PARAMETERS
|
|
21
|
+
- lib: string — library to inspect (required)
|
|
22
|
+
- server: string (default: 'cas') — 'cas' or 'sas'
|
|
23
|
+
- limit: number (default: 10) — page size
|
|
24
|
+
- start: number (default: 1) — 1-based offset
|
|
25
|
+
- where: string — optional filter expression
|
|
26
|
+
|
|
27
|
+
ROUTING RULES
|
|
28
|
+
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
29
|
+
- "list 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
30
|
+
- "list cas tables in Public" → { lib: "Public", server: "cas", start: 1, limit: 10 }
|
|
31
|
+
|
|
32
|
+
EXAMPLES
|
|
33
|
+
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
34
|
+
- "show 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
35
|
+
|
|
36
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
37
|
+
- "list libs" (use list-libraries)
|
|
38
|
+
- "find lib Public" (use find-library)
|
|
39
|
+
- "describe table cars" (use table-info)
|
|
40
|
+
- "read table cars" (use read-table)
|
|
41
|
+
|
|
42
|
+
ERRORS
|
|
43
|
+
Returns empty array if no tables found.
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
let spec = {
|
|
47
|
+
name: 'list-tables',
|
|
48
|
+
description: description,
|
|
49
|
+
|
|
50
|
+
inputSchema: z.object({
|
|
51
|
+
lib: z.string(),
|
|
52
|
+
server: z.string().optional(),
|
|
53
|
+
limit: z.number().optional(),
|
|
54
|
+
start: z.number().optional(),
|
|
55
|
+
where: z.string().optional()
|
|
56
|
+
}),
|
|
57
|
+
handler: async (params) => {
|
|
58
|
+
let r = await _listTables(params);
|
|
59
|
+
return r;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return spec;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default listTables;
|
|
66
|
+
|
package/src/toolSet/makeTools.js
CHANGED
|
@@ -27,6 +27,8 @@ import runJobdef from './runJobdef.js';
|
|
|
27
27
|
import findJob from './findJob.js';
|
|
28
28
|
import listJobdefs from './listJobdefs.js';
|
|
29
29
|
import findJobdef from './findJobdef.js';
|
|
30
|
+
import jobInfo from './jobInfo.js';
|
|
31
|
+
import jobdefInfo from './jobdefInfo.js';
|
|
30
32
|
|
|
31
33
|
import sasQuery from './sasQuery.js';
|
|
32
34
|
import setContext from './setContext.js';
|
|
@@ -63,6 +65,7 @@ function makeTools(_appContext) {
|
|
|
63
65
|
runJob(_appContext),
|
|
64
66
|
listJobdefs(_appContext),
|
|
65
67
|
findJobdef(_appContext),
|
|
68
|
+
jobdefInfo(_appContext),
|
|
66
69
|
runJobdef(_appContext),
|
|
67
70
|
|
|
68
71
|
devaScore(_appContext),
|
package/src/toolSet/modelInfo.js
CHANGED
|
@@ -10,7 +10,7 @@ const log = debug('tools');
|
|
|
10
10
|
|
|
11
11
|
function modelInfo(_appContext) {
|
|
12
12
|
let description = `
|
|
13
|
-
model-info —
|
|
13
|
+
model-info — return detailed information about a specific MAS model, including its inputs, outputs, and metadata.
|
|
14
14
|
|
|
15
15
|
USE when: what inputs does model need, describe model, show variables for model, model inputs/outputs
|
|
16
16
|
DO NOT USE for: find model, list models, score model, table/job operations
|
|
@@ -17,16 +17,16 @@ DO NOT USE for: find model, model metadata, list models, run programs/jobs, quer
|
|
|
17
17
|
|
|
18
18
|
PARAMETERS
|
|
19
19
|
- model: string — model name (required, exact match)
|
|
20
|
-
- scenario:
|
|
21
|
-
|
|
20
|
+
- scenario: object — input data as JSON (optional, defaults to {}). Example: {age:45, income:60000}
|
|
21
|
+
|
|
22
22
|
|
|
23
23
|
ROUTING RULES
|
|
24
|
-
- "score with model X using a=1, b=2" → { model: "X", scenario: {a:1, b:2}
|
|
25
|
-
- "predict using model Y with age=45, income=60000" → { model: "Y", scenario: {age:45, income:60000}
|
|
24
|
+
- "score with model X using a=1, b=2" → { model: "X", scenario: {a:1, b:2} }
|
|
25
|
+
- "predict using model Y with age=45, income=60000" → { model: "Y", scenario: {age:45, income:60000} }
|
|
26
26
|
|
|
27
27
|
EXAMPLES
|
|
28
|
-
- "score with model churn using age=45, income=60000" → { model: "churn", scenario: {age:45, income:60000}
|
|
29
|
-
- "predict creditScore for credit=700, debt=20000" → { model: "creditScore", scenario: {credit:700, debt:20000}
|
|
28
|
+
- "score with model churn using age=45, income=60000" → { model: "churn", scenario: {age:45, income:60000} }
|
|
29
|
+
- "predict creditScore for credit=700, debt=20000" → { model: "creditScore", scenario: {credit:700, debt:20000} }
|
|
30
30
|
|
|
31
31
|
NEGATIVE EXAMPLES (do not route here)
|
|
32
32
|
- "find model X" (use find-model)
|
|
@@ -42,40 +42,38 @@ Returns predictions, probabilities, scores merged with input data. Returns error
|
|
|
42
42
|
let spec = {
|
|
43
43
|
name: 'mas-score',
|
|
44
44
|
description: description,
|
|
45
|
-
inputSchema:z.object({
|
|
45
|
+
inputSchema: z.object({
|
|
46
46
|
model: z.string(),
|
|
47
|
-
scenario: z.
|
|
48
|
-
uflag: z.boolean().optional()
|
|
47
|
+
scenario: z.any()
|
|
49
48
|
}),
|
|
50
49
|
|
|
51
50
|
handler: async (iparams) => {
|
|
52
|
-
let params = {...iparams};
|
|
51
|
+
let params = {...iparams};
|
|
53
52
|
let scenario = params.scenario;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
let scenarioObj ={};
|
|
58
|
-
|
|
53
|
+
|
|
54
|
+
// Convert the scenario string to an object
|
|
55
|
+
// Example: "x=1, y=2, z=3" to { x: 1, y: 2, z: 3 }
|
|
56
|
+
let scenarioObj = {};
|
|
57
|
+
let count = 0;
|
|
59
58
|
if (typeof scenario === 'object') {
|
|
60
59
|
scenarioObj = scenario;
|
|
61
|
-
} else if (Array.isArray(scenario)) {
|
|
60
|
+
} else if (Array.isArray(scenario)) {
|
|
62
61
|
scenarioObj = scenario[0];
|
|
63
62
|
} else {
|
|
64
63
|
//console.error('Incoming scenario', scenario);
|
|
65
64
|
scenarioObj = scenario.split(',').reduce((acc, pair) => {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
params.scenario= scenarioObj;
|
|
73
|
-
|
|
65
|
+
let [key, value] = pair.split('=');
|
|
66
|
+
acc[key.trim()] = value;
|
|
67
|
+
count++;
|
|
68
|
+
return acc;
|
|
69
|
+
}, {});
|
|
70
|
+
}
|
|
71
|
+
params.scenario = scenarioObj;
|
|
74
72
|
// Drop model extension (e.g., .job, .model)
|
|
75
73
|
if (params.model && params.model.includes('.')) {
|
|
76
74
|
params.model = params.model.substring(0, params.model.lastIndexOf('.'));
|
|
77
75
|
}
|
|
78
|
-
|
|
76
|
+
|
|
79
77
|
log('modelScore params', params);
|
|
80
78
|
// Check if the params.scenario is a string and parse it
|
|
81
79
|
let r = await _masScoring(params)
|