@sassoftware/mcp-serverjs
Version:
A mcp server for SAS Viya
97 lines (84 loc) • 2.68 kB
JavaScript
/*
* Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
// An initial pass at using catalog search
// not sure of its usefulness yet since the search string
// syntax is designed for nerdy users.
// Maybe one can instruct LLM to format a user friend search into
// required syntax
// But then I am an expert on SAS Catalog
import restaf from '@sassoftware/restaf';
import getLogonPayload from '../toolhelpers/getLogonPayload.js';
import _itemsData from '../toolhelpers/_itemsData.js';
import debug from 'debug';
async function _catalogSearch(params, rel) {
let { searchstring, start, limit } = params;
const log = debug('catalogsearch');
log(params);
let splitsearchstring = searchstring.trimStart().split(' ');
let assetType = ' ';
if (!splitsearchstring[0].includes(':')) {
if (['dataflows',
'datasets',
'dataplans',
'models',
'modelprojects',
'modelstudioprojects',
'report',
'rulesets',
'referencedatadomains',
'codefiles',
'decisions',
'riskdataprojects',
'riskmodels'
].includes(splitsearchstring[0])) {
assetType = `${splitsearchstring[0]}`;
splitsearchstring[0] = 'AssetType:' + splitsearchstring[0];
searchstring = splitsearchstring.join(' ');
} else {
assetType = `${splitsearchstring[0]}`;
}
}
limit = (limit) ? limit : 10;
start = (start) ? start : 0;
// https://go.documentation.sas.com/doc/en/infocatcdc/v_034/infocatug/n09x2n3z9t2izln1vtx68oho8t8x.htm?requestorId=84052456-0342-4389-a344-5cc71cbec5cc
try {
let store = restaf.initStore({
casProxy: true,
options: {
proxyServer: null,
httpOptions: null
}
});
let logonPayload = await getLogonPayload();
let msg = await store.logon(logonPayload);
if (rel == null) {
rel = 'search';
}
log('---', searchstring);
let { catalog } = await store.addServices('catalog');
let payload = {
qs: { q: searchstring, limit: limit, start: start },
};
log('payload', payload);
let r = await store.apiCall(catalog.links(rel), payload);
let rx = _itemsData(r);
return {
content: [
{
type: 'text', text: JSON.stringify(rx)
}
],
structuredContent: rx,
}
} catch (err) {
console.error('Error in searchAssets:', JSON.stringify(err, null, 4));
return {
content:[{
type: 'text', text: JSON.stringify(err)
}]
}
}
}
export default _catalogSearch;