@adaptabletools/adaptable-mcp 0.0.0-stage → 0.1.0-canary.0
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/README.md +95 -2
- package/dist/adaptable/loadEntry.js +94 -0
- package/dist/adaptable/loadEntry.js.map +1 -0
- package/dist/adaptable/types.js +13 -0
- package/dist/adaptable/types.js.map +1 -0
- package/dist/cache.js +11 -0
- package/dist/cache.js.map +1 -0
- package/dist/checks/stateRules.js +389 -0
- package/dist/checks/stateRules.js.map +1 -0
- package/dist/checks/stateTypes.js +142 -0
- package/dist/checks/stateTypes.js.map +1 -0
- package/dist/context.js +39 -0
- package/dist/context.js.map +1 -0
- package/dist/docs/corpus.js +114 -0
- package/dist/docs/corpus.js.map +1 -0
- package/dist/docs/search.js +92 -0
- package/dist/docs/search.js.map +1 -0
- package/dist/docs/source.js +151 -0
- package/dist/docs/source.js.map +1 -0
- package/dist/environment.js +181 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.js +84 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.js +59 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/checks.js +250 -0
- package/dist/tools/checks.js.map +1 -0
- package/dist/tools/docs.js +173 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/environment.js +52 -0
- package/dist/tools/environment.js.map +1 -0
- package/package.json +35 -4
- package/skills/adaptable-dev/SKILL.md +42 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
const FRAMEWORK_PACKAGES = {
|
|
4
|
+
'@adaptabletools/adaptable-react-aggrid': 'react',
|
|
5
|
+
'@adaptabletools/adaptable-angular-aggrid': 'angular',
|
|
6
|
+
'@adaptabletools/adaptable-vue3-aggrid': 'vue',
|
|
7
|
+
};
|
|
8
|
+
function readJson(path) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function findInstalledPackageJson(projectPath, name) {
|
|
17
|
+
let dir = projectPath;
|
|
18
|
+
for (;;) {
|
|
19
|
+
const candidate = join(dir, 'node_modules', name, 'package.json');
|
|
20
|
+
if (existsSync(candidate)) {
|
|
21
|
+
return readJson(candidate);
|
|
22
|
+
}
|
|
23
|
+
const parent = dirname(dir);
|
|
24
|
+
if (parent === dir) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
dir = parent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Nearest folder with a package.json, starting at `start` */
|
|
31
|
+
export function findProjectRoot(start) {
|
|
32
|
+
let dir = resolve(start);
|
|
33
|
+
for (;;) {
|
|
34
|
+
if (existsSync(join(dir, 'package.json'))) {
|
|
35
|
+
return dir;
|
|
36
|
+
}
|
|
37
|
+
const parent = dirname(dir);
|
|
38
|
+
if (parent === dir) {
|
|
39
|
+
return resolve(start);
|
|
40
|
+
}
|
|
41
|
+
dir = parent;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function detectEnvironment(start) {
|
|
45
|
+
const projectPath = findProjectRoot(start);
|
|
46
|
+
const pkg = readJson(join(projectPath, 'package.json'));
|
|
47
|
+
const declared = {
|
|
48
|
+
...(pkg?.peerDependencies ?? {}),
|
|
49
|
+
...(pkg?.devDependencies ?? {}),
|
|
50
|
+
...(pkg?.dependencies ?? {}),
|
|
51
|
+
};
|
|
52
|
+
const names = Object.keys(declared);
|
|
53
|
+
const info = (name) => ({
|
|
54
|
+
name,
|
|
55
|
+
declared: declared[name],
|
|
56
|
+
installed: findInstalledPackageJson(projectPath, name)?.version,
|
|
57
|
+
});
|
|
58
|
+
const adaptablePackages = names
|
|
59
|
+
.filter((n) => n.startsWith('@adaptabletools/') && n !== '@adaptabletools/adaptable-mcp')
|
|
60
|
+
.map(info);
|
|
61
|
+
const agGridPackages = names
|
|
62
|
+
.filter((n) => n === 'ag-stack' || n.startsWith('ag-grid-') || n.startsWith('@ag-grid-'))
|
|
63
|
+
.map(info);
|
|
64
|
+
const adaptable = adaptablePackages.find((p) => p.name === '@adaptabletools/adaptable') ??
|
|
65
|
+
(findInstalledPackageJson(projectPath, '@adaptabletools/adaptable')
|
|
66
|
+
? info('@adaptabletools/adaptable')
|
|
67
|
+
: adaptablePackages.find((p) => FRAMEWORK_PACKAGES[p.name]));
|
|
68
|
+
const version = adaptable?.installed ?? adaptable?.declared?.match(/\d+\.\d+\.\d+[^\s]*/)?.[0];
|
|
69
|
+
const adaptableMajor = version ? Number(version.split('.')[0]) : undefined;
|
|
70
|
+
const framework = names.map((n) => FRAMEWORK_PACKAGES[n]).find(Boolean) ?? (adaptable ? 'vanilla' : undefined);
|
|
71
|
+
const agGridPeer = findInstalledPackageJson(projectPath, '@adaptabletools/adaptable')
|
|
72
|
+
?.peerDependencies?.['ag-grid-enterprise'];
|
|
73
|
+
return {
|
|
74
|
+
projectPath,
|
|
75
|
+
hasPackageJson: !!pkg,
|
|
76
|
+
framework,
|
|
77
|
+
adaptable,
|
|
78
|
+
adaptableMajor: Number.isFinite(adaptableMajor) ? adaptableMajor : undefined,
|
|
79
|
+
adaptablePackages,
|
|
80
|
+
agGridPackages,
|
|
81
|
+
agGridPeer,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function parseVersion(version) {
|
|
85
|
+
const match = version.match(/(\d+)\.(\d+)\.(\d+)/);
|
|
86
|
+
return match ? match.slice(1).map(Number) : undefined;
|
|
87
|
+
}
|
|
88
|
+
function compare(a, b) {
|
|
89
|
+
for (let i = 0; i < 3; i++) {
|
|
90
|
+
if (a[i] !== b[i]) {
|
|
91
|
+
return a[i] - b[i];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Enough of semver for AdapTable's peer ranges (`>=36.2.0`, `^36.2.0`,
|
|
98
|
+
* `~36.2.0`, exact, space-separated AND, `||`). Returns undefined when the
|
|
99
|
+
* range has a form this does not understand.
|
|
100
|
+
*/
|
|
101
|
+
export function satisfies(version, range) {
|
|
102
|
+
const v = parseVersion(version);
|
|
103
|
+
if (!v) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const alternatives = range.split('||').map((alt) => alt.trim().split(/\s+/).filter(Boolean));
|
|
107
|
+
let understood = true;
|
|
108
|
+
const result = alternatives.some((comparators) => comparators.every((comparator) => {
|
|
109
|
+
const match = comparator.match(/^(>=|<=|>|<|\^|~|=)?v?(\d+\.\d+\.\d+)/);
|
|
110
|
+
if (!match) {
|
|
111
|
+
understood = false;
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const target = parseVersion(match[2]);
|
|
115
|
+
const c = compare(v, target);
|
|
116
|
+
switch (match[1]) {
|
|
117
|
+
case '>=':
|
|
118
|
+
return c >= 0;
|
|
119
|
+
case '<=':
|
|
120
|
+
return c <= 0;
|
|
121
|
+
case '>':
|
|
122
|
+
return c > 0;
|
|
123
|
+
case '<':
|
|
124
|
+
return c < 0;
|
|
125
|
+
case '^':
|
|
126
|
+
return c >= 0 && v[0] === target[0];
|
|
127
|
+
case '~':
|
|
128
|
+
return c >= 0 && v[0] === target[0] && v[1] === target[1];
|
|
129
|
+
default:
|
|
130
|
+
return c === 0;
|
|
131
|
+
}
|
|
132
|
+
}));
|
|
133
|
+
return understood ? result : undefined;
|
|
134
|
+
}
|
|
135
|
+
export function getEnvironmentWarnings(env, pairings = []) {
|
|
136
|
+
const warnings = [];
|
|
137
|
+
if (!env.hasPackageJson) {
|
|
138
|
+
warnings.push(`No package.json found at or above ${env.projectPath}.`);
|
|
139
|
+
return warnings;
|
|
140
|
+
}
|
|
141
|
+
if (!env.adaptable) {
|
|
142
|
+
warnings.push('AdapTable is not installed in this project.');
|
|
143
|
+
return warnings;
|
|
144
|
+
}
|
|
145
|
+
if (!env.adaptable.installed) {
|
|
146
|
+
warnings.push('@adaptabletools/adaptable is declared but not installed; run your package manager install so checks can use the installed version.');
|
|
147
|
+
}
|
|
148
|
+
const enterprise = env.agGridPackages.find((p) => p.name === 'ag-grid-enterprise');
|
|
149
|
+
const community = env.agGridPackages.find((p) => p.name === 'ag-grid-community');
|
|
150
|
+
if (!enterprise) {
|
|
151
|
+
warnings.push(community
|
|
152
|
+
? 'AdapTable requires ag-grid-enterprise; only ag-grid-community is declared.'
|
|
153
|
+
: 'AdapTable requires ag-grid-enterprise, which is not declared in package.json.');
|
|
154
|
+
}
|
|
155
|
+
const enterpriseVersion = enterprise?.installed;
|
|
156
|
+
if (enterpriseVersion && env.agGridPeer) {
|
|
157
|
+
const ok = satisfies(enterpriseVersion, env.agGridPeer);
|
|
158
|
+
if (ok === false) {
|
|
159
|
+
warnings.push(`ag-grid-enterprise ${enterpriseVersion} does not satisfy AdapTable's peer range ${env.agGridPeer}.`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const agGridVersions = new Set(env.agGridPackages
|
|
163
|
+
.filter((p) => p.name !== 'ag-stack' && p.installed)
|
|
164
|
+
.map((p) => p.installed));
|
|
165
|
+
if (agGridVersions.size > 1) {
|
|
166
|
+
warnings.push(`AG Grid packages are on different versions (${[...agGridVersions].join(', ')}); keep them identical.`);
|
|
167
|
+
}
|
|
168
|
+
if (enterpriseVersion && env.adaptableMajor !== undefined) {
|
|
169
|
+
const pairing = pairings.find((p) => Number(p.adaptableVersion.split('.')[0]) === env.adaptableMajor);
|
|
170
|
+
const agGridMajor = Number(enterpriseVersion.split('.')[0]);
|
|
171
|
+
if (pairing && pairing.agGridMajor !== agGridMajor) {
|
|
172
|
+
warnings.push(`AdapTable ${env.adaptableMajor} is documented with AG Grid ${pairing.agGridMajor}; this project has AG Grid ${agGridMajor}.`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const adaptableVersions = new Set(env.adaptablePackages.filter((p) => p.installed).map((p) => p.installed));
|
|
176
|
+
if (adaptableVersions.size > 1) {
|
|
177
|
+
warnings.push(`@adaptabletools/* packages are on different versions (${[...adaptableVersions].join(', ')}); keep them identical.`);
|
|
178
|
+
}
|
|
179
|
+
return warnings;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { createServer } from './server.js';
|
|
5
|
+
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
6
|
+
await createServer(version).connect(new StdioServerTransport());
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC3C,CAAC;AAEzB,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { resolveEnvironment } from './context.js';
|
|
3
|
+
import { loadCorpus } from './docs/source.js';
|
|
4
|
+
const INSTALL_PAGES = {
|
|
5
|
+
vanilla: 'getting-started-installation',
|
|
6
|
+
react: 'react-installation',
|
|
7
|
+
angular: 'angular-installation',
|
|
8
|
+
vue: 'vue-installation',
|
|
9
|
+
};
|
|
10
|
+
const INTEGRATION_PAGES = {
|
|
11
|
+
vanilla: 'getting-started-integration',
|
|
12
|
+
react: 'react-integration',
|
|
13
|
+
angular: 'angular-integration',
|
|
14
|
+
vue: 'vue-integration',
|
|
15
|
+
};
|
|
16
|
+
const PLACEMENT = `Put each setting in the right place:
|
|
17
|
+
- Adaptable Options: design-time configuration the user cannot change (primaryKey, licenseKey, adaptableId, module options such as layoutOptions, custom functions).
|
|
18
|
+
- Initial State (\`initialState\` in Adaptable Options): objects the user can edit and that are persisted (Layouts, Calculated Columns, Format Columns, Alerts, Named Queries, ...). There is no PredefinedConfig.
|
|
19
|
+
- Adaptable API: runtime changes from application code, after AdapTable is ready.`;
|
|
20
|
+
const userMessage = (text) => ({
|
|
21
|
+
messages: [{ role: 'user', content: { type: 'text', text } }],
|
|
22
|
+
});
|
|
23
|
+
/** `version-240-release-note` is 24, `version-17-release-note` is 17 */
|
|
24
|
+
const releaseNoteMajor = (routePath) => {
|
|
25
|
+
const match = routePath.match(/\/version-(\d+)-release-note$/);
|
|
26
|
+
if (!match) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const n = Number(match[1]);
|
|
30
|
+
return n >= 100 ? Math.floor(n / 10) : n;
|
|
31
|
+
};
|
|
32
|
+
export function registerPrompts(server) {
|
|
33
|
+
server.registerPrompt('setup-adaptable', {
|
|
34
|
+
title: 'Set up AdapTable',
|
|
35
|
+
description: 'Add AdapTable to an AG Grid project: packages, CSS, AG Grid modules, minimal Adaptable Options and one Layout',
|
|
36
|
+
argsSchema: {
|
|
37
|
+
framework: z.string().optional().describe('vanilla, react, angular or vue; defaults to the detected framework'),
|
|
38
|
+
},
|
|
39
|
+
}, async ({ framework: requested }) => {
|
|
40
|
+
const env = await resolveEnvironment(server);
|
|
41
|
+
const framework = requested && INSTALL_PAGES[requested] ? requested : (env.framework ?? 'vanilla');
|
|
42
|
+
return userMessage(`Set up AdapTable (${framework}) in this project.
|
|
43
|
+
|
|
44
|
+
1. Call detect_environment and fix any warnings it reports (AdapTable needs ag-grid-enterprise, at the documented AG Grid version).
|
|
45
|
+
2. Read get_doc("${INSTALL_PAGES[framework]}") and get_doc("${INTEGRATION_PAGES[framework]}"), then get_doc("getting-started-aggrid-modules") and get_doc("getting-started-license-key"). Follow them exactly for packages, CSS imports and AG Grid modules; do not rely on memory, older versions differ.
|
|
46
|
+
3. Write minimal Adaptable Options: primaryKey (a unique column), adaptableId, licenseKey, and an initialState with one Table Layout listing the grid's columns in TableColumns.
|
|
47
|
+
4. ${PLACEMENT}
|
|
48
|
+
5. Run check_state on the initialState, passing the columns from columnDefs, and fix every error.
|
|
49
|
+
6. For AG Grid itself (columnDefs, AG Grid modules, row models, grid options) use the ag-mcp server.
|
|
50
|
+
|
|
51
|
+
Cite the docs URLs you used.`);
|
|
52
|
+
});
|
|
53
|
+
server.registerPrompt('upgrade-adaptable', {
|
|
54
|
+
title: 'Upgrade AdapTable',
|
|
55
|
+
description: 'Upgrade a project to a newer AdapTable major version: release-note breaking changes, state and expression migration',
|
|
56
|
+
argsSchema: {
|
|
57
|
+
from: z.string().describe('Current AdapTable major version, e.g. 22'),
|
|
58
|
+
to: z.string().optional().describe('Target major version; defaults to the latest documented one'),
|
|
59
|
+
},
|
|
60
|
+
}, async ({ from, to }) => {
|
|
61
|
+
const env = await resolveEnvironment(server);
|
|
62
|
+
const corpus = await loadCorpus(undefined);
|
|
63
|
+
const fromMajor = Number.parseInt(from, 10);
|
|
64
|
+
const toMajor = to ? Number.parseInt(to, 10) : corpus.manifest.major;
|
|
65
|
+
const notes = [...corpus.pages.keys()]
|
|
66
|
+
.map((routePath) => ({ routePath, major: releaseNoteMajor(routePath) }))
|
|
67
|
+
.filter(({ major }) => major !== undefined && major > fromMajor && major <= toMajor)
|
|
68
|
+
.sort((a, b) => a.routePath.localeCompare(b.routePath, 'en', { numeric: true }))
|
|
69
|
+
.map(({ routePath }) => `- get_doc("${routePath.replace('/support/', '')}")`);
|
|
70
|
+
const installed = env.adaptableMajor;
|
|
71
|
+
return userMessage(`Upgrade AdapTable in this project from version ${fromMajor} to ${toMajor}.
|
|
72
|
+
|
|
73
|
+
1. Call detect_environment. ${installed === toMajor ? `AdapTable ${toMajor} is installed.` : `Then update every @adaptabletools/* package to ${toMajor} (all to the same version), and AG Grid to the version get_doc("release-schedule") pairs with AdapTable ${toMajor}; install, and call detect_environment again.`}
|
|
74
|
+
2. Read the release note of every version in between and apply each breaking change that affects this code (renamed or removed options, API changes, state shape changes):
|
|
75
|
+
${notes.length ? notes.join('\n') : '- (no release notes found in the docs for this range)'}
|
|
76
|
+
3. Find every Initial State object (\`initialState\`) in the code. For each, call migrate_state with fromVersion ${fromMajor}, replace it with the migrated result (keep code that cannot be JSON, such as functions, by hand), then run check_state with the grid's columns and fix every error.
|
|
77
|
+
4. Find every AdapTableQL expression outside state (e.g. strings passed to the Adaptable API) and run migrate_expression, then check_expression.
|
|
78
|
+
5. Search the code for options the release notes rename or remove; use search_docs to find their current place.
|
|
79
|
+
6. Build and type-check the project; fix what the compiler reports.
|
|
80
|
+
|
|
81
|
+
Summarise the changes, with the release-note URLs that required them.`);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { loadEntry } from './adaptable/loadEntry.js';
|
|
3
|
+
import { resolveEnvironment, resolveProjectPath } from './context.js';
|
|
4
|
+
import { filterFramework } from './docs/corpus.js';
|
|
5
|
+
import { loadCorpus } from './docs/source.js';
|
|
6
|
+
import { findPage } from './tools/docs.js';
|
|
7
|
+
const single = (value) => (Array.isArray(value) ? value[0] : value);
|
|
8
|
+
export function registerResources(server) {
|
|
9
|
+
const readPage = async (uri, major, routePath) => {
|
|
10
|
+
const corpus = await loadCorpus(Number(major) || undefined);
|
|
11
|
+
if (corpus.manifest.major !== Number(major)) {
|
|
12
|
+
throw new Error(`Docs for AdapTable ${major} are not available (found ${corpus.manifest.major} at ${corpus.origin}).`);
|
|
13
|
+
}
|
|
14
|
+
const page = findPage(corpus, routePath);
|
|
15
|
+
if (!page) {
|
|
16
|
+
throw new Error(`No docs page ${routePath}`);
|
|
17
|
+
}
|
|
18
|
+
const env = await resolveEnvironment(server);
|
|
19
|
+
return {
|
|
20
|
+
contents: [
|
|
21
|
+
{
|
|
22
|
+
uri: uri.href,
|
|
23
|
+
mimeType: 'text/markdown',
|
|
24
|
+
text: filterFramework(page.markdown, env.framework),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
server.registerResource('docs-page', new ResourceTemplate('adaptable://docs/{major}/{slug}', { list: undefined }), {
|
|
30
|
+
title: 'AdapTable docs page',
|
|
31
|
+
description: 'Markdown of a docs page, e.g. adaptable://docs/24/handbook-layouts; sections for other frameworks are removed',
|
|
32
|
+
mimeType: 'text/markdown',
|
|
33
|
+
}, (uri, { major, slug }) => readPage(uri, single(major), `/docs/${single(slug)}`));
|
|
34
|
+
server.registerResource('api-reference', new ResourceTemplate('adaptable://api/{major}/{typeName}', { list: undefined }), {
|
|
35
|
+
title: 'AdapTable API reference',
|
|
36
|
+
description: 'Reference page of an AdapTable type, e.g. adaptable://api/24/LayoutApi',
|
|
37
|
+
mimeType: 'text/markdown',
|
|
38
|
+
}, (uri, { major, typeName }) => readPage(uri, single(major), `/docs/reference/${single(typeName).toLowerCase()}`));
|
|
39
|
+
server.registerResource('aql-functions', 'adaptable://aql/functions', {
|
|
40
|
+
title: 'AdapTableQL functions',
|
|
41
|
+
description: 'Every built-in AdapTableQL function, aggregation, observable function and clause of the installed AdapTable version (JSON)',
|
|
42
|
+
mimeType: 'application/json',
|
|
43
|
+
}, async (uri) => {
|
|
44
|
+
const loaded = await loadEntry(await resolveProjectPath(server), 'aql');
|
|
45
|
+
if (!loaded.ok) {
|
|
46
|
+
throw new Error(loaded.reason);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
contents: [
|
|
50
|
+
{
|
|
51
|
+
uri: uri.href,
|
|
52
|
+
mimeType: 'application/json',
|
|
53
|
+
text: JSON.stringify(loaded.module.getExpressionFunctionCatalogue(), null, 2),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { registerPrompts } from './prompts.js';
|
|
3
|
+
import { registerResources } from './resources.js';
|
|
4
|
+
import { registerCheckTools } from './tools/checks.js';
|
|
5
|
+
import { registerDocsTools } from './tools/docs.js';
|
|
6
|
+
import { registerEnvironmentTools } from './tools/environment.js';
|
|
7
|
+
export const SERVER_INSTRUCTIONS = `AdapTable is an AG Grid Enterprise extension. Its APIs, state shapes and AdapTableQL syntax change between major versions, and older material (including your training data) is often wrong for the version a project uses.
|
|
8
|
+
|
|
9
|
+
- Call detect_environment first; every other tool uses the version and framework it finds.
|
|
10
|
+
- Look things up with search_docs / get_doc before writing AdapTable config; cite the URLs.
|
|
11
|
+
- Run check_expression (passing the module the expression is used in) on every AdapTableQL expression and check_state on Initial State before presenting them; fix every error.
|
|
12
|
+
- For upgrades, use migrate_state and migrate_expression rather than rewriting by hand.
|
|
13
|
+
- AdapTable questions belong here; AG Grid questions (columnDefs, AG Grid modules, row models, grid API) belong to AG Grid's ag-mcp.`;
|
|
14
|
+
export function createServer(version) {
|
|
15
|
+
const server = new McpServer({ name: 'adaptable-mcp', version }, { instructions: SERVER_INSTRUCTIONS });
|
|
16
|
+
registerEnvironmentTools(server);
|
|
17
|
+
registerDocsTools(server);
|
|
18
|
+
registerCheckTools(server);
|
|
19
|
+
registerResources(server);
|
|
20
|
+
registerPrompts(server);
|
|
21
|
+
return server;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;qIAMkG,CAAC;AAEtI,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAClC,EAAE,YAAY,EAAE,mBAAmB,EAAE,CACtC,CAAC;IACF,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { loadEntry } from '../adaptable/loadEntry.js';
|
|
3
|
+
import { EXPRESSION_MODULES, } from '../adaptable/types.js';
|
|
4
|
+
import { checkStateRules, collectExpressions, getStateColumnIds, } from '../checks/stateRules.js';
|
|
5
|
+
import { typeCheckState, unexplainedTypeIssues } from '../checks/stateTypes.js';
|
|
6
|
+
import { resolveProjectPath } from '../context.js';
|
|
7
|
+
const KIND = z
|
|
8
|
+
.enum(['boolean', 'scalar', 'aggregatedScalar', 'aggregatedBoolean'])
|
|
9
|
+
.describe('boolean: filters, rules, boolean Named Queries, Relative Change (ANY_CHANGE()) and boolean Observable rules (CHANGE_COUNT{...} >= n); scalar: Calculated Columns and Named Queries returning a value, Observable values (MAX{[x], WITHIN(1d)}); aggregatedScalar: Calculated Columns with SUM{...}, Cumulative, Quantile or Window (LAG, RANK) expressions; aggregatedBoolean: Alert rules with aggregation (SUM{[x]} > n)');
|
|
10
|
+
const MODULE = z
|
|
11
|
+
.enum(EXPRESSION_MODULES)
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Module the expression is used in. Pass it: Observable functions, Relative Change functions, Cumulative / Window functions and aggregations are only available in some Modules");
|
|
14
|
+
const COLUMNS = z
|
|
15
|
+
.array(z.object({ id: z.string(), dataType: z.string().optional() }))
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Grid columns from columnDefs (colId or field), with AdapTable data types (text, number, boolean, date, textArray, numberArray, ...); enables column checks");
|
|
18
|
+
const STATE = z
|
|
19
|
+
.union([z.string(), z.record(z.string(), z.unknown())])
|
|
20
|
+
.describe('Initial State as a JSON object or JSON string (convert TypeScript object literals to JSON)');
|
|
21
|
+
const CUSTOM_NOTE = 'Custom expression functions, custom aggregations and Named Queries from AdaptableOptions / state are not known to this check; issues about those names can be ignored.';
|
|
22
|
+
const text = (value) => ({ content: [{ type: 'text', text: value }] });
|
|
23
|
+
const failure = (value) => ({ ...text(value), isError: true });
|
|
24
|
+
function formatIssue(expression, issue) {
|
|
25
|
+
let line = `- ${issue.severity}${issue.code ? ` ${issue.code}` : ''}: ${issue.message}`;
|
|
26
|
+
if (issue.range) {
|
|
27
|
+
line += ` (at ${issue.range[0]}-${issue.range[1]}: \`${expression.slice(issue.range[0], issue.range[1])}\`)`;
|
|
28
|
+
}
|
|
29
|
+
if (issue.quickFix) {
|
|
30
|
+
line += `\n fix: ${issue.quickFix.label} -> \`${issue.quickFix.replacement}\``;
|
|
31
|
+
}
|
|
32
|
+
return line;
|
|
33
|
+
}
|
|
34
|
+
function summarize(lines, clean) {
|
|
35
|
+
const count = (severity) => lines.filter((l) => new RegExp(`^\\s*- ${severity}\\b`).test(l)).length;
|
|
36
|
+
const errors = count('error');
|
|
37
|
+
const warnings = count('warning');
|
|
38
|
+
if (!errors && !warnings) {
|
|
39
|
+
return clean;
|
|
40
|
+
}
|
|
41
|
+
return `${errors} error(s), ${warnings} warning(s)${errors ? '; fix the errors' : ''}:`;
|
|
42
|
+
}
|
|
43
|
+
const toColumnTypes = (columns) => columns ? Object.fromEntries(columns.map((c) => [c.id, c.dataType])) : undefined;
|
|
44
|
+
function parseState(state) {
|
|
45
|
+
if (typeof state !== 'string') {
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(state);
|
|
50
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
51
|
+
? parsed
|
|
52
|
+
: 'State must be a JSON object.';
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return `State is not valid JSON (${error instanceof Error ? error.message : String(error)}). Convert the TypeScript object literal to JSON: quote keys, no comments, no trailing commas, no functions.`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function getAql(projectPath) {
|
|
59
|
+
return loadEntry(await projectPath, 'aql');
|
|
60
|
+
}
|
|
61
|
+
function checkOne(aql, expression, kind, module, columns) {
|
|
62
|
+
const result = aql.validateExpression(expression, { kind, module, columns });
|
|
63
|
+
const lines = result.issues.map((issue) => formatIssue(expression, issue));
|
|
64
|
+
if (!result.isValid) {
|
|
65
|
+
const migrated = aql.migrateExpression(expression, { kind });
|
|
66
|
+
if (!migrated.error && migrated.changed) {
|
|
67
|
+
const recheck = aql.validateExpression(migrated.expression, { kind, module, columns });
|
|
68
|
+
const errorCount = (issues) => issues.filter((issue) => issue.severity === 'error').length;
|
|
69
|
+
if (errorCount(recheck.issues) < errorCount(result.issues)) {
|
|
70
|
+
lines.push(` This is pre-v24 syntax. v24 form: \`${migrated.expression}\`${recheck.isValid ? ' (valid)' : ' (still has issues)'}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return lines;
|
|
75
|
+
}
|
|
76
|
+
export function registerCheckTools(server) {
|
|
77
|
+
server.registerTool('check_expression', {
|
|
78
|
+
title: 'Check an AdapTableQL expression',
|
|
79
|
+
description: "Validates an AdapTableQL expression with the AdapTable version installed in the project: syntax, known functions, argument types, aggregation rules, (with module) the functions that Module offers, and (with columns) column references and data types. Returns issues with positions and quick fixes; pre-v24 syntax gets the v24 rewrite. Run it on every expression before presenting config.",
|
|
80
|
+
inputSchema: {
|
|
81
|
+
expression: z.string(),
|
|
82
|
+
kind: KIND,
|
|
83
|
+
module: MODULE,
|
|
84
|
+
columns: COLUMNS,
|
|
85
|
+
projectPath: z.string().optional(),
|
|
86
|
+
},
|
|
87
|
+
annotations: { readOnlyHint: true },
|
|
88
|
+
}, async ({ expression, kind, module, columns, projectPath }) => {
|
|
89
|
+
const loaded = await getAql(resolveProjectPath(server, projectPath));
|
|
90
|
+
if (!loaded.ok) {
|
|
91
|
+
return failure(loaded.reason);
|
|
92
|
+
}
|
|
93
|
+
const lines = checkOne(loaded.module, expression, kind, module, toColumnTypes(columns));
|
|
94
|
+
return text([
|
|
95
|
+
summarize(lines, 'Expression is valid.'),
|
|
96
|
+
...lines,
|
|
97
|
+
'',
|
|
98
|
+
CUSTOM_NOTE,
|
|
99
|
+
].join('\n'));
|
|
100
|
+
});
|
|
101
|
+
server.registerTool('migrate_expression', {
|
|
102
|
+
title: 'Migrate an AdapTableQL expression to v24',
|
|
103
|
+
description: 'Rewrites a pre-v24 AdapTableQL expression (legacy function spellings, paren-form aggregations such as SUM([x]), old clauses) into v24 syntax, using the installed AdapTable version.',
|
|
104
|
+
inputSchema: { expression: z.string(), kind: KIND.optional(), projectPath: z.string().optional() },
|
|
105
|
+
annotations: { readOnlyHint: true },
|
|
106
|
+
}, async ({ expression, kind, projectPath }) => {
|
|
107
|
+
const loaded = await getAql(resolveProjectPath(server, projectPath));
|
|
108
|
+
if (!loaded.ok) {
|
|
109
|
+
return failure(loaded.reason);
|
|
110
|
+
}
|
|
111
|
+
const result = loaded.module.migrateExpression(expression, { kind });
|
|
112
|
+
if (result.error) {
|
|
113
|
+
return failure(`Could not migrate: ${result.error}`);
|
|
114
|
+
}
|
|
115
|
+
const notes = result.notes?.length
|
|
116
|
+
? `\n\nThe rewrite changes behaviour; tell the user:\n${result.notes.map((n) => `- ${n}`).join('\n')}`
|
|
117
|
+
: '';
|
|
118
|
+
return text(result.changed
|
|
119
|
+
? `v24 form:\n${result.expression}${notes}`
|
|
120
|
+
: `Already v24 syntax; no changes:\n${result.expression}`);
|
|
121
|
+
});
|
|
122
|
+
server.registerTool('list_expression_functions', {
|
|
123
|
+
title: 'List AdapTableQL functions',
|
|
124
|
+
description: 'Built-in AdapTableQL functions, aggregations, observable functions and clauses of the installed AdapTable version, with signatures and examples. Filter by group or by text.',
|
|
125
|
+
inputSchema: {
|
|
126
|
+
group: z.enum(['scalar', 'aggregation', 'observable', 'clause']).optional(),
|
|
127
|
+
query: z.string().optional().describe('Case-insensitive match on name, description or category'),
|
|
128
|
+
projectPath: z.string().optional(),
|
|
129
|
+
},
|
|
130
|
+
annotations: { readOnlyHint: true },
|
|
131
|
+
}, async ({ group, query, projectPath }) => {
|
|
132
|
+
const loaded = await getAql(resolveProjectPath(server, projectPath));
|
|
133
|
+
if (!loaded.ok) {
|
|
134
|
+
return failure(loaded.reason);
|
|
135
|
+
}
|
|
136
|
+
const needle = query?.toLowerCase();
|
|
137
|
+
const entries = loaded.module
|
|
138
|
+
.getExpressionFunctionCatalogue()
|
|
139
|
+
.filter((f) => !group || f.group === group)
|
|
140
|
+
.filter((f) => !needle ||
|
|
141
|
+
[f.name, f.description, f.category].some((v) => v?.toLowerCase().includes(needle)));
|
|
142
|
+
if (!entries.length) {
|
|
143
|
+
return text('No matching functions.');
|
|
144
|
+
}
|
|
145
|
+
return text(entries
|
|
146
|
+
.map((f) => [
|
|
147
|
+
`## ${f.name} (${f.group}${f.category ? `, ${f.category}` : ''}${f.returnType ? ` -> ${f.returnType}` : ''})`,
|
|
148
|
+
f.description,
|
|
149
|
+
...f.signatures.map((s) => `- \`${s}\``),
|
|
150
|
+
...f.examples.slice(0, 2).map((e) => `- e.g. \`${e}\``),
|
|
151
|
+
]
|
|
152
|
+
.filter(Boolean)
|
|
153
|
+
.join('\n'))
|
|
154
|
+
.join('\n\n'));
|
|
155
|
+
});
|
|
156
|
+
server.registerTool('check_state', {
|
|
157
|
+
title: 'Check AdapTable Initial State',
|
|
158
|
+
description: "Checks an Initial State object: type-checks it against InitialState from the installed AdapTable (wrong or missing properties, pre-v24 shapes), plus semantic checks TypeScript cannot catch: unknown sections (e.g. PredefinedConfig), unique Layout names, CurrentLayout present, Table vs Pivot Layout properties, Width xor Flex, column references (with columns), and every embedded AdapTableQL expression validated as check_expression would.",
|
|
159
|
+
inputSchema: { state: STATE, columns: COLUMNS, projectPath: z.string().optional() },
|
|
160
|
+
annotations: { readOnlyHint: true },
|
|
161
|
+
}, async ({ state, columns, projectPath }) => {
|
|
162
|
+
const parsed = parseState(state);
|
|
163
|
+
if (typeof parsed === 'string') {
|
|
164
|
+
return failure(parsed);
|
|
165
|
+
}
|
|
166
|
+
const loaded = await getAql(resolveProjectPath(server, projectPath));
|
|
167
|
+
const aggregations = new Map(loaded.ok
|
|
168
|
+
? loaded.module
|
|
169
|
+
.getExpressionFunctionCatalogue()
|
|
170
|
+
.filter((f) => f.group === 'aggregation')
|
|
171
|
+
.map((f) => [f.name.toUpperCase(), f.callForm])
|
|
172
|
+
: []);
|
|
173
|
+
const ruleIssues = checkStateRules(parsed, { columnIds: columns?.map((c) => c.id) });
|
|
174
|
+
const typed = await typeCheckState(await resolveProjectPath(server, projectPath), parsed);
|
|
175
|
+
const typeIssues = typed.ok ? unexplainedTypeIssues(typed.issues, ruleIssues) : [];
|
|
176
|
+
const lines = [
|
|
177
|
+
...ruleIssues.map((issue) => `- ${issue.severity} at ${issue.path || '(root)'}: ${issue.message}`),
|
|
178
|
+
...typeIssues.map((issue) => `- ${issue.severity} at ${issue.path || '(root)'}: (types) ${issue.message}`),
|
|
179
|
+
];
|
|
180
|
+
if (!typed.ok) {
|
|
181
|
+
lines.push(`- warning: types not checked: ${typed.reason}`);
|
|
182
|
+
}
|
|
183
|
+
const expressions = collectExpressions(parsed, aggregations);
|
|
184
|
+
if (loaded.ok) {
|
|
185
|
+
const columnTypes = columns
|
|
186
|
+
? { ...Object.fromEntries(getStateColumnIds(parsed)), ...toColumnTypes(columns) }
|
|
187
|
+
: undefined;
|
|
188
|
+
for (const { path, expression, kind, module } of expressions) {
|
|
189
|
+
const issues = checkOne(loaded.module, expression, kind, module, columnTypes);
|
|
190
|
+
if (issues.length) {
|
|
191
|
+
lines.push(`- expression at ${path} (${module}, ${kind}): \`${expression}\``, ...issues.map((l) => ` ${l}`));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
lines.push(`- warning: expressions not checked: ${loaded.reason}`);
|
|
197
|
+
}
|
|
198
|
+
return text([
|
|
199
|
+
summarize(lines, 'No problems found.'),
|
|
200
|
+
...lines,
|
|
201
|
+
'',
|
|
202
|
+
`Checked ${expressions.length} expression(s)${typed.ok ? ` and the state's types (against ${typed.source})` : ''}. ${CUSTOM_NOTE}`,
|
|
203
|
+
].join('\n'));
|
|
204
|
+
});
|
|
205
|
+
server.registerTool('migrate_state', {
|
|
206
|
+
title: 'Migrate AdapTable state to the installed version',
|
|
207
|
+
description: "Upgrades an Initial State (or persisted state) object from an older AdapTable major version using AdaptableUpgradeHelper.migrateAdaptableState from the installed package — the same migration AdapTable runs at startup. Install the target AdapTable version first. Returns the migrated JSON and the migration log; run check_state on the result.",
|
|
208
|
+
inputSchema: {
|
|
209
|
+
state: STATE,
|
|
210
|
+
fromVersion: z.number().int().describe('AdapTable major version the state was written for, e.g. 22'),
|
|
211
|
+
toVersion: z.number().int().optional().describe('Defaults to the installed major version'),
|
|
212
|
+
projectPath: z.string().optional(),
|
|
213
|
+
},
|
|
214
|
+
annotations: { readOnlyHint: true },
|
|
215
|
+
}, async ({ state, fromVersion, toVersion, projectPath }) => {
|
|
216
|
+
const parsed = parseState(state);
|
|
217
|
+
if (typeof parsed === 'string') {
|
|
218
|
+
return failure(parsed);
|
|
219
|
+
}
|
|
220
|
+
const loaded = await loadEntry(await resolveProjectPath(server, projectPath), 'upgrade');
|
|
221
|
+
if (!loaded.ok) {
|
|
222
|
+
return failure(loaded.reason);
|
|
223
|
+
}
|
|
224
|
+
const helper = loaded.module.AdaptableUpgradeHelper;
|
|
225
|
+
const target = toVersion ?? helper.getCurrentMajorVersion();
|
|
226
|
+
if (fromVersion >= target) {
|
|
227
|
+
return failure(`fromVersion (${fromVersion}) must be lower than the target version (${target}).`);
|
|
228
|
+
}
|
|
229
|
+
const log = [];
|
|
230
|
+
const record = (level) => (message) => log.push(`- ${level}: ${message}`);
|
|
231
|
+
const logger = {
|
|
232
|
+
success: record('success'),
|
|
233
|
+
info: record('info'),
|
|
234
|
+
warn: record('warning'),
|
|
235
|
+
error: record('error'),
|
|
236
|
+
};
|
|
237
|
+
const migrated = helper.migrateAdaptableState(parsed, { fromVersion, toVersion: target, logger });
|
|
238
|
+
return text([
|
|
239
|
+
`Migrated from ${fromVersion} to ${target}.`,
|
|
240
|
+
'',
|
|
241
|
+
'Migration log:',
|
|
242
|
+
...(log.length ? log : ['- (no messages)']),
|
|
243
|
+
'',
|
|
244
|
+
'```json',
|
|
245
|
+
JSON.stringify(migrated, null, 2),
|
|
246
|
+
'```',
|
|
247
|
+
].join('\n'));
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=checks.js.map
|