@sassoftware/sas-score-mcp-serverjs 1.0.1-9 → 1.1.2

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.
Files changed (118) hide show
  1. package/.skills/.claude-plugin/plugin.json +59 -0
  2. package/.skills/agents/sas-score-mcp-serverjs-agent.md +26 -0
  3. package/.skills/copilot-instructions.md +62 -0
  4. package/.skills/skills/README.md +204 -0
  5. package/.skills/skills/detail-strategy/SKILL.md +316 -0
  6. package/.skills/skills/find-library-server/SKILL.md +62 -0
  7. package/.skills/skills/find-resources/SKILL.md +66 -0
  8. package/.skills/skills/list-library/SKILL.md +30 -0
  9. package/.skills/skills/list-mas-job-jobdef/SKILL.md +31 -0
  10. package/.skills/skills/list-tables/SKILL.md +30 -0
  11. package/.skills/skills/read-strategy/SKILL.md +87 -0
  12. package/.skills/skills/request-routing/SKILL.md +112 -0
  13. package/.skills/skills/score-cas/SKILL.md +95 -0
  14. package/.skills/skills/score-job-jobdef/SKILL.md +58 -0
  15. package/.skills/skills/score-mas-scr/SKILL.md +58 -0
  16. package/.skills/skills/score-program/SKILL.md +59 -0
  17. package/.skills/skills/score-strategy/SKILL.md +39 -0
  18. package/README.md +96 -54
  19. package/cli.js +11 -13
  20. package/openApi.yaml +121 -121
  21. package/package.json +16 -14
  22. package/scripts/docs/SCORE_SKILL_REFERENCE.md +17 -16
  23. package/scripts/docs/TOOL_DESCRIPTION_TEMPLATE.md +3 -3
  24. package/scripts/docs/TOOL_UPDATES_SUMMARY.md +65 -63
  25. package/scripts/docs/oauth-http-transport.md +2 -2
  26. package/scripts/docs/sas-mcp-tools-reference.md +43 -32
  27. package/scripts/plot_msrp_usa.py +49 -0
  28. package/scripts/refreshtoken.js +58 -0
  29. package/scripts/runListScr.mjs +16 -0
  30. package/src/createMcpServer.js +4 -1
  31. package/src/expressMcpServer.js +47 -49
  32. package/src/oauthHandlers/authorize.js +4 -1
  33. package/src/oauthHandlers/baseUrl.js +4 -0
  34. package/src/oauthHandlers/callback.js +4 -0
  35. package/src/oauthHandlers/getMetadata.js +4 -0
  36. package/src/oauthHandlers/index.js +4 -0
  37. package/src/oauthHandlers/token.js +4 -0
  38. package/src/openApi.yaml +121 -121
  39. package/src/processHeaders.js +10 -7
  40. package/src/setupSkills.js +1 -18
  41. package/src/toolHelpers/_casScore.js +32 -0
  42. package/src/toolHelpers/_desc.js +14 -0
  43. package/src/toolHelpers/_findJob.js +12 -0
  44. package/src/toolHelpers/_findJobdef.js +10 -0
  45. package/src/toolHelpers/_findLibrary.js +11 -0
  46. package/src/toolHelpers/_findMas.js +13 -0
  47. package/src/toolHelpers/_findScr.js +36 -0
  48. package/src/toolHelpers/_findTable.js +11 -0
  49. package/src/toolHelpers/_listJobdefs.js +12 -2
  50. package/src/toolHelpers/_listJobs.js +19 -8
  51. package/src/toolHelpers/{_listModels.js → _listMas.js} +4 -4
  52. package/src/toolHelpers/_listScr.js +13 -0
  53. package/src/toolHelpers/{_scrInfo.js → _scrDescribe.js} +4 -4
  54. package/src/toolHelpers/_scrScore.js +2 -2
  55. package/src/toolHelpers/_submitCasl.js +19 -17
  56. package/src/toolHelpers/{_tableInfo.js → _tableDescribe.js} +2 -2
  57. package/src/toolHelpers/getLogonPayload.js +2 -2
  58. package/src/toolSet/casModelScore.js +93 -0
  59. package/src/toolSet/casProgramScore.js +105 -0
  60. package/src/toolSet/devaScore.js +66 -61
  61. package/src/toolSet/findJob.js +24 -9
  62. package/src/toolSet/findJobdef.js +22 -19
  63. package/src/toolSet/findLibrary.js +73 -68
  64. package/src/toolSet/findMas.js +72 -0
  65. package/src/toolSet/findScr.js +69 -0
  66. package/src/toolSet/findTable.js +34 -27
  67. package/src/toolSet/getEnv.js +6 -6
  68. package/src/toolSet/jobDescribe.js +65 -0
  69. package/src/toolSet/jobScore.js +90 -0
  70. package/src/toolSet/jobdefDescribe.js +67 -0
  71. package/src/toolSet/jobdefScore.js +85 -0
  72. package/src/toolSet/listJobdefs.js +70 -61
  73. package/src/toolSet/listJobs.js +68 -61
  74. package/src/toolSet/listLibraries.js +84 -78
  75. package/src/toolSet/listMas.js +71 -0
  76. package/src/toolSet/listScr.js +62 -0
  77. package/src/toolSet/listTables.js +78 -66
  78. package/src/toolSet/{runMacro.js → macroScore.js} +86 -82
  79. package/src/toolSet/makeTools.js +39 -25
  80. package/src/toolSet/masDescribe.js +67 -0
  81. package/src/toolSet/masScore.js +95 -0
  82. package/src/toolSet/{runProgram.js → programScore.js} +21 -18
  83. package/src/toolSet/readTable.js +80 -63
  84. package/src/toolSet/sasQuery.js +83 -77
  85. package/src/toolSet/scrDescribe.js +55 -0
  86. package/src/toolSet/scrScore.js +63 -70
  87. package/src/toolSet/searchAssets.js +1 -1
  88. package/src/toolSet/setContext.js +70 -65
  89. package/src/toolSet/superstat.js +61 -61
  90. package/src/toolSet/tableDescribe.js +65 -0
  91. package/.agents/sas-score-mcp-serverjs-agent.md +0 -58
  92. package/.instructions/copilot-instructions.md +0 -201
  93. package/.instructions/enforce-find-resource-strategy.md +0 -35
  94. package/.skills/sas-find-library-smart/SKILL.md +0 -155
  95. package/.skills/sas-find-resource-strategy/SKILL.md +0 -105
  96. package/.skills/sas-list-resource-strategy/SKILL.md +0 -124
  97. package/.skills/sas-list-tables-smart/SKILL.md +0 -128
  98. package/.skills/sas-read-and-score-strategy/SKILL.md +0 -113
  99. package/.skills/sas-read-strategy/SKILL.md +0 -154
  100. package/.skills/sas-request-classifier/SKILL.md +0 -74
  101. package/.skills/sas-score-workflow-strategy/SKILL.md +0 -314
  102. package/scripts/optimize_final.py +0 -140
  103. package/scripts/optimize_tools.py +0 -99
  104. package/scripts/setup-skills.js +0 -34
  105. package/scripts/update_descriptions.py +0 -46
  106. package/src/authpkce.js +0 -219
  107. package/src/handleGetDelete.js +0 -34
  108. package/src/handleRequest.js +0 -112
  109. package/src/hapiMcpServer.js +0 -241
  110. package/src/toolSet/findModel.js +0 -60
  111. package/src/toolSet/listModels.js +0 -56
  112. package/src/toolSet/modelInfo.js +0 -55
  113. package/src/toolSet/modelScore.js +0 -89
  114. package/src/toolSet/runCasProgram.js +0 -98
  115. package/src/toolSet/runJob.js +0 -81
  116. package/src/toolSet/runJobdef.js +0 -82
  117. package/src/toolSet/scrInfo.js +0 -52
  118. package/src/toolSet/tableInfo.js +0 -58
@@ -1,61 +1,68 @@
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
+ 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
+ ` : `
14
+ list-jobs — enumerate SAS Viya job assets.
15
+
16
+ USE when: list jobs, show jobs, browse jobs, list available jobs, next page
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)
18
+
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.
21
+ - limit: number (default: 10) number of jobs per page
22
+ - start: number (default: 1) 1-based page offset
23
+ - where: string (default: '') optional filter expression
24
+
25
+ ROUTING RULES
26
+ - list jobs → { start: 1, limit: 10 }
27
+ - show me 25 jobs → { start: 1, limit: 25 }
28
+ - next jobs → { start: previousStart + previousLimit, limit: previousLimit }
29
+
30
+ EXAMPLES
31
+ - list jobs { start: 1, limit: 10 }
32
+ - list 25 jobs { start: 1, limit: 25 }
33
+ - next jobs { start: 11, limit: 10 }
34
+
35
+ NEGATIVE EXAMPLES (do not route here)
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)
40
+
41
+ PAGINATION
42
+ If returned length === limit, hint: next start = start + limit. Empty result with start > 1 means paged past end.
43
+
44
+ ERRORS
45
+ Surface backend error directly; never fabricate job names.
46
+ `;
47
+
48
+ let spec = {
49
+ name: 'list-jobs',
50
+ description: description,
51
+ inputSchema: z.object({
52
+ intent: z.literal('list'),
53
+ limit: z.number().optional(),
54
+ start: z.number().optional(),
55
+ where: z.string().optional()
56
+ }),
57
+ // No 'server' required; backend context is implicit in helper
58
+ handler: async (params) => {
59
+ // _listJob handles all validation and defaults
60
+ const { intent, ...rest } = params;
61
+ const result = await _listJobs(rest);
62
+ return result;
63
+ }
64
+ }
65
+ return spec;
66
+ }
67
+ export default listJobs;
68
+
@@ -1,78 +1,84 @@
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 contextassume { 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
+ 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
+ ` : `
14
+ list-libraries — enumerate CAS or SAS libraries.
15
+
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.
18
+
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.
21
+ - server: 'cas' | 'sas' | 'all' (default: 'all')
22
+ - limit: integer > 0 (default: 10)
23
+ - start: 1-based offset (default: 1)
24
+ - where: optional filter expression (default: '')
25
+
26
+ ROUTING RULES
27
+ - "cas libs / cas libraries / in cas" → { server: 'cas' }
28
+ - "sas libs / sas libraries / in sas" → { server: 'sas' }
29
+ - "all libs / all libraries" → { server: 'all' }
30
+ - "list tables in <libname>" → route to list-tables, NOT here
31
+ - server unspecified default { server: 'all' }
32
+ - "all cas libs" with no limit specified → { server: 'cas', limit: 50 } + paging note
33
+ - "next" after prior call (start:S, limit:L) → { start: S + L, limit: L }
34
+ - ambiguous "list" or "libs" with no context assume { server: 'cas' }
35
+
36
+ EXAMPLES
37
+ - "list libraries" → { server: 'all', start: 1, limit: 10 }
38
+ - "list libs " { server: 'all', start: 1, limit: 10 }
39
+
40
+ - "list all libs" → { server: 'all', start: 1, limit: 10 }
41
+ - "list cas libraries" { server: 'cas', start: 1, limit: 10 }
42
+ - "show me 25 sas libs" { server: 'sas', limit: 25, start: 1 }
43
+ - "next" (prev: start:1,limit:10) { server: <same>, start: 11, limit: 10 }
44
+ - "filter cas libs" (no filter given) → ask: "What filter expression should I apply?"
45
+
46
+ NEGATIVE EXAMPLES (do not route here)
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
50
+
51
+ PAGINATION
52
+ If returned item count === limit, hint: next start = start + limit.
53
+ If start > 1 and result is empty, note paging may have exceeded available items.
54
+
55
+ ERRORS
56
+ Return structured error with a message field. Never hallucinate library names.
57
+ `;
58
+
59
+
60
+ // Canonical kebab-case tool name; legacy aliases preserved for compatibility
61
+
62
+
63
+ let spec = {
64
+ name: 'list-libraries',
65
+ description: description,
66
+ inputSchema: z.object({
67
+ intent: z.literal('list'),
68
+ server: z.string().optional(),
69
+ limit: z.number().optional(),
70
+ start: z.number().optional(),
71
+ where: z.string().optional()
72
+ }),
73
+ // 'server' has a default so we don't mark it required
74
+ handler: async (params) => {
75
+ const { intent, ...rest } = params;
76
+ rest.server = (rest.server || 'all').toLowerCase();
77
+ let r = await _listLibrary(rest);
78
+ return r;
79
+ }
80
+ };
81
+ return spec;
82
+ }
83
+ export default listLibraries;
84
+
@@ -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 © 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 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
+