@sassoftware/sas-score-mcp-serverjs 1.0.1-8 → 1.1.1
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/.claude-plugin/plugin.json +59 -0
- package/.skills/agents/sas-score-mcp-serverjs-agent.md +26 -0
- package/.skills/copilot-instructions.md +62 -0
- package/.skills/skills/README.md +204 -0
- package/.skills/skills/detail-strategy/SKILL.md +316 -0
- package/.skills/skills/find-library-server/SKILL.md +62 -0
- package/.skills/skills/find-resources/SKILL.md +66 -0
- package/.skills/skills/list-library/SKILL.md +30 -0
- package/.skills/skills/list-mas-job-jobdef/SKILL.md +31 -0
- package/.skills/skills/list-tables/SKILL.md +30 -0
- package/.skills/skills/read-strategy/SKILL.md +87 -0
- package/.skills/skills/request-routing/SKILL.md +112 -0
- package/.skills/skills/score-cas/SKILL.md +95 -0
- package/.skills/skills/score-job-jobdef/SKILL.md +58 -0
- package/.skills/skills/score-mas-scr/SKILL.md +58 -0
- package/.skills/skills/score-program/SKILL.md +59 -0
- package/.skills/skills/score-strategy/SKILL.md +39 -0
- package/README.md +96 -54
- package/cli.js +29 -38
- package/openApi.yaml +121 -121
- package/package.json +15 -13
- package/scripts/docs/SCORE_SKILL_REFERENCE.md +17 -16
- package/scripts/docs/TOOL_DESCRIPTION_TEMPLATE.md +3 -3
- package/scripts/docs/TOOL_UPDATES_SUMMARY.md +65 -63
- package/scripts/docs/oauth-http-transport.md +2 -2
- package/scripts/docs/sas-mcp-tools-reference.md +43 -32
- package/scripts/plot_msrp_usa.py +49 -0
- package/scripts/refreshtoken.js +58 -0
- package/scripts/runListScr.mjs +16 -0
- package/src/createMcpServer.js +4 -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 +4 -0
- 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 +6 -9
- package/src/toolHelpers/_casScore.js +32 -0
- package/src/toolHelpers/_desc.js +14 -0
- package/src/toolHelpers/_findJob.js +12 -0
- package/src/toolHelpers/_findJobdef.js +10 -0
- package/src/toolHelpers/_findLibrary.js +11 -0
- package/src/toolHelpers/_findMas.js +13 -0
- package/src/toolHelpers/_findScr.js +36 -0
- package/src/toolHelpers/_findTable.js +11 -0
- package/src/toolHelpers/_listJobdefs.js +12 -2
- package/src/toolHelpers/_listJobs.js +19 -8
- package/src/toolHelpers/{_listModels.js → _listMas.js} +4 -4
- package/src/toolHelpers/_listScr.js +13 -0
- package/src/toolHelpers/{_scrInfo.js → _scrDescribe.js} +4 -4
- package/src/toolHelpers/_scrScore.js +2 -2
- package/src/toolHelpers/_submitCasl.js +19 -17
- package/src/toolHelpers/{_tableInfo.js → _tableDescribe.js} +2 -2
- package/src/toolHelpers/getLogonPayload.js +2 -2
- package/src/toolSet/casModelScore.js +93 -0
- package/src/toolSet/casProgramScore.js +105 -0
- package/src/toolSet/devaScore.js +11 -6
- package/src/toolSet/findJob.js +74 -59
- package/src/toolSet/findJobdef.js +67 -64
- package/src/toolSet/findLibrary.js +28 -23
- package/src/toolSet/findMas.js +72 -0
- package/src/toolSet/findScr.js +69 -0
- package/src/toolSet/findTable.js +34 -27
- package/src/toolSet/getEnv.js +57 -57
- package/src/toolSet/jobDescribe.js +65 -0
- package/src/toolSet/jobScore.js +90 -0
- package/src/toolSet/jobdefDescribe.js +67 -0
- package/src/toolSet/jobdefScore.js +85 -0
- package/src/toolSet/listJobdefs.js +17 -8
- package/src/toolSet/listJobs.js +15 -8
- package/src/toolSet/listLibraries.js +16 -10
- package/src/toolSet/listMas.js +71 -0
- package/src/toolSet/listScr.js +62 -0
- package/src/toolSet/listTables.js +78 -66
- package/src/toolSet/{runMacro.js → macroScore.js} +86 -82
- package/src/toolSet/makeTools.js +39 -25
- package/src/toolSet/masDescribe.js +67 -0
- package/src/toolSet/masScore.js +95 -0
- package/src/toolSet/{runProgram.js → programScore.js} +96 -93
- package/src/toolSet/readTable.js +43 -26
- package/src/toolSet/sasQuery.js +24 -18
- package/src/toolSet/scrDescribe.js +55 -0
- package/src/toolSet/scrScore.js +63 -70
- package/src/toolSet/searchAssets.js +1 -1
- package/src/toolSet/setContext.js +8 -3
- package/src/toolSet/superstat.js +61 -61
- package/src/toolSet/tableDescribe.js +65 -0
- package/.skills/sas-find-library-smart/SKILL.md +0 -155
- package/.skills/sas-find-resource-strategy/SKILL.md +0 -105
- package/.skills/sas-list-resource-strategy/SKILL.md +0 -124
- package/.skills/sas-list-tables-smart/SKILL.md +0 -128
- package/.skills/sas-read-and-score-strategy/SKILL.md +0 -113
- package/.skills/sas-read-strategy/SKILL.md +0 -154
- package/.skills/sas-request-classifier/SKILL.md +0 -74
- package/.skills/sas-score-workflow-strategy/SKILL.md +0 -314
- package/.skills_claude/CLAUDE.md +0 -201
- package/.skills_claude/agents/sas-score-mcp-serverjs-agent.md +0 -58
- package/.skills_claude/enforce-find-resource-strategy.md +0 -35
- package/.skills_github/agents/sas-score-mcp-serverjs-agent.md +0 -58
- package/.skills_github/copilot-instructions.md +0 -201
- package/.skills_github/enforce-find-resource-strategy.md +0 -35
- 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/findModel.js +0 -60
- package/src/toolSet/listModels.js +0 -56
- package/src/toolSet/modelInfo.js +0 -55
- package/src/toolSet/modelScore.js +0 -89
- package/src/toolSet/runCasProgram.js +0 -98
- package/src/toolSet/runJob.js +0 -81
- package/src/toolSet/runJobdef.js +0 -82
- package/src/toolSet/scrInfo.js +0 -52
- package/src/toolSet/tableInfo.js +0 -58
|
@@ -0,0 +1,85 @@
|
|
|
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 _jobSubmit from '../toolHelpers/_jobSubmit.js';
|
|
8
|
+
|
|
9
|
+
function jobdefScore(_appContext) {
|
|
10
|
+
// JSON object for LLM/tooling
|
|
11
|
+
const isAgent = _appContext && _appContext.agent;
|
|
12
|
+
let description = isAgent ? `
|
|
13
|
+
jobdef-score — score by executing a SAS Viya JobDef model.
|
|
14
|
+
PARAMS: name (string, required), scenario (object, optional)
|
|
15
|
+
RETURNS: jobdef log, ODS output, and any result tables
|
|
16
|
+
` : `
|
|
17
|
+
jobdef-score — score with a deployed SAS Viya job definition model.
|
|
18
|
+
|
|
19
|
+
USE when: score with jobdef, run jobdef, execute jobdef model
|
|
20
|
+
DO NOT USE for: arbitrary SAS code (use program-score), macros (use macro-score), list/find jobdefs
|
|
21
|
+
|
|
22
|
+
PARAMETERS
|
|
23
|
+
- name: string — jobdef name (required)
|
|
24
|
+
- scenario: object — input parameters as JSON (optional, defaults to {}). Example: {month:10, year:2025}
|
|
25
|
+
|
|
26
|
+
ROUTING RULES
|
|
27
|
+
- "score jobdef xyz" → { name: "xyz" }
|
|
28
|
+
- "score jobdef xyz with param1=10, param2=val2" → { name: "xyz", scenario: {param1:10, param2:"val2"} }
|
|
29
|
+
|
|
30
|
+
EXAMPLES
|
|
31
|
+
- "score jobdef xyz" → { name: "xyz" }
|
|
32
|
+
- "score jobdef monthly_report with month=10, year=2025" → { name: "monthly_report", scenario: {month:10, year:2025} }
|
|
33
|
+
|
|
34
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
35
|
+
- "run SAS code" (use program-score)
|
|
36
|
+
- "score macro X" (use macro-score)
|
|
37
|
+
- "list jobdefs" (use list-jobdefs)
|
|
38
|
+
- "find jobdef X" (use find-jobdef)
|
|
39
|
+
|
|
40
|
+
ERRORS
|
|
41
|
+
Returns log output, listings, tables from jobdef. Error if jobdef not found.
|
|
42
|
+
`;
|
|
43
|
+
|
|
44
|
+
let spec = {
|
|
45
|
+
name: 'jobdef-score',
|
|
46
|
+
description: description,
|
|
47
|
+
inputSchema: z.object({
|
|
48
|
+
name: z.string(),
|
|
49
|
+
scenario: z.any()
|
|
50
|
+
}),
|
|
51
|
+
handler: async (params) => {
|
|
52
|
+
let {scenario, name} = params;
|
|
53
|
+
|
|
54
|
+
if (name.endsWith('.job')) {
|
|
55
|
+
params.name = name.slice(0, -4);
|
|
56
|
+
}
|
|
57
|
+
// Convert the scenario string to an object
|
|
58
|
+
// Example: "x=1, y=2, z=3" to { x: 1, y: 2, z: 3 }
|
|
59
|
+
let scenarioObj = {};
|
|
60
|
+
let count = 0;
|
|
61
|
+
if (typeof scenario === 'object') {
|
|
62
|
+
scenarioObj = scenario;
|
|
63
|
+
} else if (Array.isArray(scenario)) {
|
|
64
|
+
scenarioObj = scenario[0];
|
|
65
|
+
} else {
|
|
66
|
+
//console.error('Incoming scenario', scenario);
|
|
67
|
+
scenarioObj = scenario.split(',').reduce((acc, pair) => {
|
|
68
|
+
let [key, value] = pair.split('=');
|
|
69
|
+
acc[key.trim()] = value;
|
|
70
|
+
count++;
|
|
71
|
+
return acc;
|
|
72
|
+
}, {});
|
|
73
|
+
}
|
|
74
|
+
params.scenario = scenarioObj;
|
|
75
|
+
params.type = 'def';
|
|
76
|
+
// Provide runtime context for auth and server settings
|
|
77
|
+
let r = await _jobSubmit(params);
|
|
78
|
+
return r;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return spec;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default jobdefScore;
|
|
85
|
+
|
|
@@ -5,14 +5,19 @@
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import _listJobdefs from '../toolHelpers/_listJobdefs.js';
|
|
7
7
|
function listJobdefs(_appContext) {
|
|
8
|
-
|
|
9
|
-
let description = `
|
|
8
|
+
const isAgent = _appContext && _appContext.agent;
|
|
9
|
+
let description = isAgent ? `
|
|
10
|
+
list-jobdefs — list available JobDef models.
|
|
11
|
+
PARAMS: intent ('list', required), start (number, default 1), limit (number, default 10)
|
|
12
|
+
RETURNS: array of jobdef names and metadata
|
|
13
|
+
` : `
|
|
10
14
|
list-jobdefs — enumerate SAS Viya job definitions (jobdefs) assets.
|
|
11
15
|
|
|
12
16
|
USE when: list jobdefs, show jobdefs, browse jobdefs, list available jobdefs, next page
|
|
13
|
-
DO NOT USE for: find single jobdef (use find-jobdef),
|
|
17
|
+
DO NOT USE for: find single jobdef (use ${_appContext.brand}-find-jobdef), score jobdef (use ${_appContext.brand}-jobdef-score), find job (use ${_appContext.brand}-find-job), sas code (use ${_appContext.brand}-program-score)
|
|
14
18
|
|
|
15
19
|
PARAMETERS
|
|
20
|
+
- intent: must be 'list' — only pass if user explicitly asked to list/enumerate jobdefs. Do NOT use for find, verify, or execute.
|
|
16
21
|
- limit: number (default: 10) — number of jobdefs per page
|
|
17
22
|
- start: number (default: 1) — 1-based page offset
|
|
18
23
|
- where: string (default: '') — optional filter expression
|
|
@@ -28,10 +33,12 @@ EXAMPLES
|
|
|
28
33
|
- next jobdefs → { start: 11, limit: 10 }
|
|
29
34
|
|
|
30
35
|
NEGATIVE EXAMPLES (do not route here)
|
|
31
|
-
- find jobdef abc (use find-jobdef)
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
- list
|
|
36
|
+
- find jobdef abc (use ${_appContext.brand}-find-jobdef)
|
|
37
|
+
- does jobdef X exist (use ${_appContext.brand}-find-jobdef)
|
|
38
|
+
- is jobdef X available (use ${_appContext.brand}-find-jobdef)
|
|
39
|
+
- list jobs (use ${_appContext.brand}-list-jobs)
|
|
40
|
+
- score jobdef abc (use ${_appContext.brand}-jobdef-score)
|
|
41
|
+
- list models (use ${_appContext.brand}-list-models)
|
|
35
42
|
|
|
36
43
|
PAGINATION
|
|
37
44
|
If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
|
|
@@ -44,6 +51,7 @@ Surface backend error directly; never fabricate jobdef names.
|
|
|
44
51
|
name: 'list-jobdefs',
|
|
45
52
|
description: description,
|
|
46
53
|
inputSchema: z.object({
|
|
54
|
+
intent: z.literal('list'),
|
|
47
55
|
limit: z.number().optional(),
|
|
48
56
|
start: z.number().optional(),
|
|
49
57
|
where: z.string().optional()
|
|
@@ -51,7 +59,8 @@ Surface backend error directly; never fabricate jobdef names.
|
|
|
51
59
|
// No 'server' required; backend context is implicit in helper
|
|
52
60
|
handler: async (params) => {
|
|
53
61
|
// _listJobdefs handles all validation and defaults
|
|
54
|
-
const
|
|
62
|
+
const { intent, ...rest } = params;
|
|
63
|
+
const result = await _listJobdefs(rest);
|
|
55
64
|
return result;
|
|
56
65
|
}
|
|
57
66
|
}
|
package/src/toolSet/listJobs.js
CHANGED
|
@@ -5,14 +5,19 @@
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import _listJobs from '../toolHelpers/_listJobs.js';
|
|
7
7
|
function listJobs(_appContext) {
|
|
8
|
-
|
|
9
|
-
let description = `
|
|
8
|
+
const isAgent = _appContext && _appContext.agent;
|
|
9
|
+
let description = isAgent ? `
|
|
10
|
+
list-jobs — list available Job models.
|
|
11
|
+
PARAMS: intent ('list', required), start (number, default 1), limit (number, default 10)
|
|
12
|
+
RETURNS: array of job names and metadata
|
|
13
|
+
` : `
|
|
10
14
|
list-jobs — enumerate SAS Viya job assets.
|
|
11
15
|
|
|
12
16
|
USE when: list jobs, show jobs, browse jobs, list available jobs, next page
|
|
13
|
-
DO NOT USE for: find single job (use find-job),
|
|
17
|
+
DO NOT USE for: find single job (use ${_appContext.brand}-find-job), score job (use ${_appContext.brand}-job-score), score jobdef (use ${_appContext.brand}-jobdef-score), sas code (use ${_appContext.brand}-program-score)
|
|
14
18
|
|
|
15
19
|
PARAMETERS
|
|
20
|
+
- intent: must be 'list' — only pass if user explicitly asked to list/enumerate jobs. Do NOT use for find, verify, or execute.
|
|
16
21
|
- limit: number (default: 10) — number of jobs per page
|
|
17
22
|
- start: number (default: 1) — 1-based page offset
|
|
18
23
|
- where: string (default: '') — optional filter expression
|
|
@@ -28,10 +33,10 @@ EXAMPLES
|
|
|
28
33
|
- next jobs → { start: 11, limit: 10 }
|
|
29
34
|
|
|
30
35
|
NEGATIVE EXAMPLES (do not route here)
|
|
31
|
-
- find job abc (use find-job)
|
|
32
|
-
-
|
|
33
|
-
- list models (use list-models)
|
|
34
|
-
- list tables in lib xyz (use list-tables)
|
|
36
|
+
- find job abc (use ${_appContext.brand}-find-job)
|
|
37
|
+
- score job abc (use ${_appContext.brand}-job-score)
|
|
38
|
+
- list models (use ${_appContext.brand}-list-models)
|
|
39
|
+
- list tables in lib xyz (use ${_appContext.brand}-list-tables)
|
|
35
40
|
|
|
36
41
|
PAGINATION
|
|
37
42
|
If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
|
|
@@ -44,6 +49,7 @@ Surface backend error directly; never fabricate job names.
|
|
|
44
49
|
name: 'list-jobs',
|
|
45
50
|
description: description,
|
|
46
51
|
inputSchema: z.object({
|
|
52
|
+
intent: z.literal('list'),
|
|
47
53
|
limit: z.number().optional(),
|
|
48
54
|
start: z.number().optional(),
|
|
49
55
|
where: z.string().optional()
|
|
@@ -51,7 +57,8 @@ Surface backend error directly; never fabricate job names.
|
|
|
51
57
|
// No 'server' required; backend context is implicit in helper
|
|
52
58
|
handler: async (params) => {
|
|
53
59
|
// _listJob handles all validation and defaults
|
|
54
|
-
const
|
|
60
|
+
const { intent, ...rest } = params;
|
|
61
|
+
const result = await _listJobs(rest);
|
|
55
62
|
return result;
|
|
56
63
|
}
|
|
57
64
|
}
|
|
@@ -5,13 +5,19 @@
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import _listLibrary from '../toolHelpers/_listLibrary.js';
|
|
7
7
|
function listLibraries(_appContext) {
|
|
8
|
-
|
|
8
|
+
const isAgent = _appContext && _appContext.agent;
|
|
9
|
+
let description = isAgent ? `
|
|
10
|
+
list-libraries — list available libraries.
|
|
11
|
+
PARAMS: intent ('list', required), server ('cas'|'sas'|'all', optional), start (number, default 1), limit (number, default 10)
|
|
12
|
+
RETURNS: array of library names and server assignments
|
|
13
|
+
` : `
|
|
9
14
|
list-libraries — enumerate CAS or SAS libraries.
|
|
10
15
|
|
|
11
|
-
USE when user asks to
|
|
12
|
-
DO NOT USE for: listing tables in a library (→ list-tables), column/table metadata, job execution, models, scoring.
|
|
16
|
+
USE ONLY when: user explicitly asks to list, browse, or enumerate libraries — "list libraries", "show all libs", "browse libraries", "what libraries are available", "next page". Never use to verify if a specific library exists.
|
|
17
|
+
DO NOT USE for: verify or check if a specific library exists (use ${_appContext.brand}-find-library instead), listing tables in a library (→ ${_appContext.brand}-list-tables), column/table metadata, job execution, models, scoring.
|
|
13
18
|
|
|
14
19
|
PARAMETERS
|
|
20
|
+
- intent: must be 'list' — only pass if user explicitly asked to list/enumerate libraries. Do NOT use for read, find, or verify.
|
|
15
21
|
- server: 'cas' | 'sas' | 'all' (default: 'all')
|
|
16
22
|
- limit: integer > 0 (default: 10)
|
|
17
23
|
- start: 1-based offset (default: 1)
|
|
@@ -38,9 +44,9 @@ EXAMPLES
|
|
|
38
44
|
- "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
|
|
39
45
|
|
|
40
46
|
NEGATIVE EXAMPLES (do not route here)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
-- "list tables in SASHELP" → ${_appContext.brand}-list-tables
|
|
48
|
+
-- "list models / jobs / jobdefs"→ respective tools
|
|
49
|
+
-- "score a program to create a lib" → ${_appContext.brand}-program-score
|
|
44
50
|
|
|
45
51
|
PAGINATION
|
|
46
52
|
If returned item count === limit, hint: next start = start + limit.
|
|
@@ -58,6 +64,7 @@ Return structured error with a message field. Never hallucinate library names.
|
|
|
58
64
|
name: 'list-libraries',
|
|
59
65
|
description: description,
|
|
60
66
|
inputSchema: z.object({
|
|
67
|
+
intent: z.literal('list'),
|
|
61
68
|
server: z.string().optional(),
|
|
62
69
|
limit: z.number().optional(),
|
|
63
70
|
start: z.number().optional(),
|
|
@@ -65,10 +72,9 @@ Return structured error with a message field. Never hallucinate library names.
|
|
|
65
72
|
}),
|
|
66
73
|
// 'server' has a default so we don't mark it required
|
|
67
74
|
handler: async (params) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
let r = await _listLibrary(params);
|
|
75
|
+
const { intent, ...rest } = params;
|
|
76
|
+
rest.server = (rest.server || 'all').toLowerCase();
|
|
77
|
+
let r = await _listLibrary(rest);
|
|
72
78
|
return r;
|
|
73
79
|
}
|
|
74
80
|
};
|
|
@@ -0,0 +1,71 @@
|
|
|
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 _listMas from '../toolHelpers/_listMas.js';
|
|
8
|
+
|
|
9
|
+
function listMas(_appContext) {
|
|
10
|
+
const isAgent = _appContext && _appContext.agent;
|
|
11
|
+
let description = isAgent ? `
|
|
12
|
+
list-mas — list available MAS models.
|
|
13
|
+
PARAMS: intent ('list', required), start (number, default 1), limit (number, default 10)
|
|
14
|
+
RETURNS: array of MAS model names and metadata
|
|
15
|
+
` : `
|
|
16
|
+
list-mas — enumerate models published to MAS.
|
|
17
|
+
|
|
18
|
+
USE ONLY when: user explicitly asks to browse or enumerate models — "list models", "show all models", "list mas", "next page". Never use to verify if a specific model exists.
|
|
19
|
+
DO NOT USE for: verify or check if a specific model exists (use ${_appContext.brand}-find-mas or ${_appContext.brand}-find-model instead), find model, find mas, model metadata, score model, list jobs/tables/libraries
|
|
20
|
+
|
|
21
|
+
PARAMETERS
|
|
22
|
+
- intent: must be 'list' — only pass if user explicitly asked to list/enumerate MAS models. Do NOT use for read, find, or verify.
|
|
23
|
+
- limit: number (default: 10) — page size
|
|
24
|
+
- start: number (default: 1) — 1-based offset
|
|
25
|
+
|
|
26
|
+
ROUTING RULES
|
|
27
|
+
- "list models" → { start:1, limit:10 }
|
|
28
|
+
- "list 25 models" → { start:1, limit:25 }
|
|
29
|
+
- "next models" → { start: start+limit, limit:10 }
|
|
30
|
+
- "list mas" → { start:1, limit:10 }
|
|
31
|
+
- "list 25 mas" → { start:1, limit:25 }
|
|
32
|
+
- "next mas" → { start: start+limit, limit:10 }
|
|
33
|
+
|
|
34
|
+
EXAMPLES
|
|
35
|
+
- "list models" → { start:1, limit:10 }
|
|
36
|
+
- "list 25 models" → { start:1, limit:25 }
|
|
37
|
+
- "list mas" → { start:1, limit:10 }
|
|
38
|
+
- "list 25 mas" → { start:1, limit:25 }
|
|
39
|
+
|
|
40
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
41
|
+
- "find model X" (use ${_appContext.brand}-find-mas)
|
|
42
|
+
- "does model churn_predictor exist" (use ${_appContext.brand}-find-mas)
|
|
43
|
+
- "is model X published to MAS" (use ${_appContext.brand}-find-mas)
|
|
44
|
+
- "describe model X" (use ${_appContext.brand}-model-info)
|
|
45
|
+
- "score model X" (use ${_appContext.brand}-model-score)
|
|
46
|
+
- "list jobs" (use ${_appContext.brand}-list-jobs)
|
|
47
|
+
|
|
48
|
+
ERRORS
|
|
49
|
+
Returns empty array if no models found.
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
let spec = {
|
|
53
|
+
name: 'list-mas',
|
|
54
|
+
description: description,
|
|
55
|
+
inputSchema: z.object({
|
|
56
|
+
intent: z.literal('list'),
|
|
57
|
+
limit: z.number().optional(),
|
|
58
|
+
start: z.number().optional()
|
|
59
|
+
}),
|
|
60
|
+
handler: async (params) => {
|
|
61
|
+
const { intent, ...rest } = params;
|
|
62
|
+
let r = await _listMas(rest);
|
|
63
|
+
return r;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return spec;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export default listMas;
|
|
71
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
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 _listScr from '../toolHelpers/_listScr.js';
|
|
8
|
+
|
|
9
|
+
function listScr(_appContext) {
|
|
10
|
+
const isAgent = _appContext && _appContext.agent;
|
|
11
|
+
let description = isAgent ? `
|
|
12
|
+
list-scr — list available SCR models.
|
|
13
|
+
PARAMS: start (number, default 1), limit (number, default 10)
|
|
14
|
+
RETURNS: array of SCR model names and metadata
|
|
15
|
+
` : `
|
|
16
|
+
list-scr — enumerate models published to scr.
|
|
17
|
+
|
|
18
|
+
USE when: list scr, show scr next page
|
|
19
|
+
DO NOT USE for: ${_appContext.brand}-find model, ${_appContext.brand}-find scr, ${_appContext.brand}-model metadata, ${_appContext.brand}-score model, ${_appContext.brand}-list jobs/tables/libraries
|
|
20
|
+
|
|
21
|
+
PARAMETERS
|
|
22
|
+
- limit: number (default: 10) — page size
|
|
23
|
+
- start: number (default: 1) — 1-based offset
|
|
24
|
+
|
|
25
|
+
ROUTING RULES
|
|
26
|
+
- "list scr" → { start:1, limit:10 }
|
|
27
|
+
- "list 25 scr" → { start:1, limit:25 }
|
|
28
|
+
- "next scr" → { start: start+limit, limit:10 }
|
|
29
|
+
|
|
30
|
+
EXAMPLES
|
|
31
|
+
- "list scr" → { start:1, limit:10 }
|
|
32
|
+
- "list 25 scr" → { start:1, limit:25 }
|
|
33
|
+
|
|
34
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
35
|
+
- "find scr X" (use ${_appContext.brand}-find-scr)
|
|
36
|
+
- "describe scr X" (use ${_appContext.brand}-scr-describe)
|
|
37
|
+
- "score scr X" (use ${_appContext.brand}-scr-score)
|
|
38
|
+
- "list jobs" (use ${_appContext.brand}-list-jobs)
|
|
39
|
+
|
|
40
|
+
ERRORS
|
|
41
|
+
Returns empty array if no scrs found.
|
|
42
|
+
`;
|
|
43
|
+
|
|
44
|
+
let spec = {
|
|
45
|
+
name: 'list-scr',
|
|
46
|
+
description: description,
|
|
47
|
+
inputSchema: z.object({
|
|
48
|
+
limit: z.number().optional(),
|
|
49
|
+
start: z.number().optional()
|
|
50
|
+
}),
|
|
51
|
+
handler: async (params) => {
|
|
52
|
+
let r = await _listScr(params);
|
|
53
|
+
return r;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return spec;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default listScr;
|
|
61
|
+
|
|
62
|
+
|
|
@@ -1,66 +1,78 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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 isAgent = _appContext && _appContext.agent;
|
|
13
|
+
const log = debug('tools');
|
|
14
|
+
|
|
15
|
+
let description = isAgent ? `
|
|
16
|
+
list-tables — list tables in a library.
|
|
17
|
+
PARAMS: intent ('list', required), lib (string, required), server ('cas'|'sas', optional), start (number, default 1), limit (number, default 10)
|
|
18
|
+
RETURNS: array of table names and metadata
|
|
19
|
+
` : `
|
|
20
|
+
list-tables — enumerate tables within a library.
|
|
21
|
+
|
|
22
|
+
USE when: list tables in <lib>, show tables in <lib>, next page
|
|
23
|
+
DO NOT USE for: find table, list libraries, get table structure (use ${_appContext.brand}-table-describe), read data (use ${_appContext.brand}-read-table)
|
|
24
|
+
|
|
25
|
+
PARAMETERS
|
|
26
|
+
- intent: must be 'list' — only pass if user explicitly asked to list/enumerate tables. Do NOT use for read, find, or verify.
|
|
27
|
+
- lib: string — library to inspect (required)
|
|
28
|
+
- server: string (default: 'cas') — 'cas' or 'sas'
|
|
29
|
+
- limit: number (default: 10) — page size
|
|
30
|
+
- start: number (default: 1) — 1-based offset
|
|
31
|
+
- where: string — optional filter expression
|
|
32
|
+
|
|
33
|
+
ROUTING RULES
|
|
34
|
+
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
35
|
+
- "list 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
36
|
+
- "list cas tables in Public" → { lib: "Public", server: "cas", start: 1, limit: 10 }
|
|
37
|
+
|
|
38
|
+
EXAMPLES
|
|
39
|
+
- "list tables in Samples" → { lib: "Samples", start: 1, limit: 10 }
|
|
40
|
+
- "show 25 tables in sashelp" → { lib: "sashelp", limit: 25, start: 1 }
|
|
41
|
+
|
|
42
|
+
NEGATIVE EXAMPLES (do not route here)
|
|
43
|
+
-- "list libs" (use ${_appContext.brand}-list-libraries)
|
|
44
|
+
-- "find lib Public" (use ${_appContext.brand}-find-library)
|
|
45
|
+
-- "describe table cars" (use ${_appContext.brand}-table-describe)
|
|
46
|
+
-- "read table cars" (use ${_appContext.brand}-read-table)
|
|
47
|
+
-- "does table cars exist in Samples" (use ${_appContext.brand}-find-table)
|
|
48
|
+
-- "is table iris in Public" (use ${_appContext.brand}-find-table)
|
|
49
|
+
-- "verify table orders in mylib" (use ${_appContext.brand}-find-table)
|
|
50
|
+
|
|
51
|
+
ERRORS
|
|
52
|
+
Returns empty array if no tables found.
|
|
53
|
+
`;
|
|
54
|
+
|
|
55
|
+
let spec = {
|
|
56
|
+
name: 'list-tables',
|
|
57
|
+
description: description,
|
|
58
|
+
|
|
59
|
+
inputSchema: z.object({
|
|
60
|
+
intent: z.literal('list'),
|
|
61
|
+
lib: z.string(),
|
|
62
|
+
server: z.string().optional(),
|
|
63
|
+
limit: z.number().optional(),
|
|
64
|
+
start: z.number().optional(),
|
|
65
|
+
where: z.string().optional()
|
|
66
|
+
}),
|
|
67
|
+
handler: async (params) => {
|
|
68
|
+
const { intent, ...rest } = params;
|
|
69
|
+
let r = await _listTables(rest);
|
|
70
|
+
return r;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return spec;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default listTables;
|
|
77
|
+
|
|
78
|
+
|