@ui5/mcp-server 0.1.6 → 0.2.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/CHANGELOG.md +18 -0
- package/README.md +2 -1
- package/lib/registerTools.js +2 -0
- package/lib/registerTools.js.map +1 -1
- package/lib/tools/get_typescript_conversion_guidelines/index.d.ts +3 -0
- package/lib/tools/get_typescript_conversion_guidelines/index.js +29 -0
- package/lib/tools/get_typescript_conversion_guidelines/index.js.map +1 -0
- package/lib/tools/get_typescript_conversion_guidelines/typescriptConversionGuidelines.d.ts +1 -0
- package/lib/tools/get_typescript_conversion_guidelines/typescriptConversionGuidelines.js +66 -0
- package/lib/tools/get_typescript_conversion_guidelines/typescriptConversionGuidelines.js.map +1 -0
- package/npm-shrinkwrap.json +519 -57
- package/package.json +8 -8
- package/resources/typescript_conversion_guidelines.md +990 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0](https://github.com/UI5/mcp-server/compare/v0.1.6...v0.2.0) (2025-12-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* Update node engines version range: ^20.17.0 || >=22.9.0 ([#156](https://github.com/UI5/mcp-server/issues/156))
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* Add tool with JavaScript to TypeScript conversion guidelines ([#137](https://github.com/UI5/mcp-server/issues/137)) ([52d7169](https://github.com/UI5/mcp-server/commit/52d7169b6d4dccaddf52ff32ea5f8056a221be06))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Dependencies
|
|
16
|
+
|
|
17
|
+
* Bump @modelcontextprotocol/sdk from 1.24.2 to 1.24.3 ([ae346e4](https://github.com/UI5/mcp-server/commit/ae346e4910da4bfc1692ac09efb09ad2dd95b802))
|
|
18
|
+
* Bump make-fetch-happen from 14.0.3 to 15.0.3 ([#116](https://github.com/UI5/mcp-server/issues/116)) ([a9aa08a](https://github.com/UI5/mcp-server/commit/a9aa08aac55d2af7c03a02e632b6dfab29738b09))
|
|
19
|
+
* Update node engines version range: ^20.17.0 || >=22.9.0 ([#156](https://github.com/UI5/mcp-server/issues/156)) ([6a84d44](https://github.com/UI5/mcp-server/commit/6a84d443963525e5f0cc24292a50aa90c843c87c))
|
|
20
|
+
|
|
3
21
|
## [0.1.6](https://github.com/UI5/mcp-server/compare/v0.1.5...v0.1.6) (2025-12-03)
|
|
4
22
|
|
|
5
23
|
|
package/README.md
CHANGED
|
@@ -29,12 +29,13 @@ The UI5 [Model Context Protocol](https://modelcontextprotocol.io/) server offers
|
|
|
29
29
|
- `get_project_info`: Extracts metadata and configuration from a UI5 project.
|
|
30
30
|
- `get_version_info`: Retrieves version information for the UI5 framework.
|
|
31
31
|
- `run_ui5_linter`: Integrates with [`@ui5/linter`](https://github.com/UI5/linter) to analyze and report issues in UI5 code.
|
|
32
|
+
- `get_typescript_conversion_guidelines`: Provides guidelines for converting UI5 applications and controls from JavaScript to TypeScript.
|
|
32
33
|
- `get_integration_cards_guidelines`: Provides access to UI Integration Cards development best practices.
|
|
33
34
|
- `create_integration_card`: Scaffolds a new UI Integration Card.
|
|
34
35
|
|
|
35
36
|
## Requirements
|
|
36
37
|
|
|
37
|
-
- [Node.js](https://nodejs.org/) Version v20.
|
|
38
|
+
- [Node.js](https://nodejs.org/) Version v20.17.0, v22.9.0 or higher
|
|
38
39
|
- [npm](https://www.npmjs.com/) Version v8.0.0 or higher
|
|
39
40
|
- An MCP client such as VS Code, Cline, or any other MCP-compatible client
|
|
40
41
|
|
package/lib/registerTools.js
CHANGED
|
@@ -7,6 +7,7 @@ import registerGetGuidelinesTool from "./tools/get_guidelines/index.js";
|
|
|
7
7
|
import registerGetVersionInfoTool from "./tools/get_version_info/index.js";
|
|
8
8
|
import registerGetIntegrationCardsGuidelinesTool from "./tools/get_integration_cards_guidelines/index.js";
|
|
9
9
|
import registerCreateIntegrationCardTool from "./tools/create_integration_card/index.js";
|
|
10
|
+
import registerGetTypescriptConversionGuidelinesTool from "./tools/get_typescript_conversion_guidelines/index.js";
|
|
10
11
|
export default function (server, context, options) {
|
|
11
12
|
const registerTool = (name, config, callback) => {
|
|
12
13
|
if (!options.useStructuredContentInResponse) {
|
|
@@ -36,6 +37,7 @@ export default function (server, context, options) {
|
|
|
36
37
|
registerGetVersionInfoTool(registerTool, context);
|
|
37
38
|
registerGetIntegrationCardsGuidelinesTool(registerTool, context);
|
|
38
39
|
registerCreateIntegrationCardTool(registerTool, context);
|
|
40
|
+
registerGetTypescriptConversionGuidelinesTool(registerTool, context);
|
|
39
41
|
}
|
|
40
42
|
export function _processResponse({ content, structuredContent }, options) {
|
|
41
43
|
if (!options.useResourcesInResponse) {
|
package/lib/registerTools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerTools.js","sourceRoot":"","sources":["../src/registerTools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAEvC,OAAO,uBAAuB,MAAM,mCAAmC,CAAC;AACxE,OAAO,wBAAwB,MAAM,iCAAiC,CAAC;AACvE,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AACpE,OAAO,kBAAkB,MAAM,oCAAoC,CAAC;AACpE,OAAO,yBAAyB,MAAM,iCAAiC,CAAC;AACxE,OAAO,0BAA0B,MAAM,mCAAmC,CAAC;AAC3E,OAAO,yCAAyC,MAAM,mDAAmD,CAAC;AAC1G,OAAO,iCAAiC,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"registerTools.js","sourceRoot":"","sources":["../src/registerTools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AAEvC,OAAO,uBAAuB,MAAM,mCAAmC,CAAC;AACxE,OAAO,wBAAwB,MAAM,iCAAiC,CAAC;AACvE,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AACpE,OAAO,kBAAkB,MAAM,oCAAoC,CAAC;AACpE,OAAO,yBAAyB,MAAM,iCAAiC,CAAC;AACxE,OAAO,0BAA0B,MAAM,mCAAmC,CAAC;AAC3E,OAAO,yCAAyC,MAAM,mDAAmD,CAAC;AAC1G,OAAO,iCAAiC,MAAM,0CAA0C,CAAC;AACzF,OAAO,6CAA6C,MAAM,uDAAuD,CAAC;AASlH,MAAM,CAAC,OAAO,WAAW,MAAiB,EAAE,OAAgB,EAAE,OAAgB;IAC7E,MAAM,YAAY,GAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC7D,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC;YAC7C,uFAAuF;YACvF,OAAO,MAAM,CAAC,YAAY,CAAC;QAC5B,CAAC;QACD,4CAA4C;QAC5C,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;YAC1D,IAAI,CAAC;gBACJ,4CAA4C;gBAC5C,0FAA0F;gBAC1F,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACnD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,WAAW,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,iGAAiG;IACjG,yBAAyB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEjD,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE7C,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1C,uBAAuB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE/C,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEhD,0BAA0B,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAElD,yCAAyC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEjE,iCAAiC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEzD,6CAA6C,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAC,OAAO,EAAE,iBAAiB,EAAiB,EAAE,OAAgB;IAC9F,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvE,OAAO;wBACN,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;qBACxB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CACd,oEAAoE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;gBACH,CAAC;YACF,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,iBAAiB,IAAI,OAAO,CAAC,8BAA8B,EAAE,CAAC;QACjE,OAAO;YACN,iBAAiB;YACjB,OAAO;SACP,CAAC;IACH,CAAC;IACD,OAAO;QACN,OAAO;KACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getTypescriptConversionGuidelines } from "./typescriptConversionGuidelines.js";
|
|
2
|
+
import { getLogger } from "@ui5/logger";
|
|
3
|
+
const log = getLogger("tools:get_typescript_conversion_guidelines");
|
|
4
|
+
export default function registerTool(registerTool, _context) {
|
|
5
|
+
registerTool("get_typescript_conversion_guidelines", {
|
|
6
|
+
description: "This tool MUST be called once before converting a " +
|
|
7
|
+
"UI5 (SAPUI5/OpenUI5) project from JavaScript to TypeScript. " +
|
|
8
|
+
"The instructions provided by this tool MUST be followed to ensure " +
|
|
9
|
+
"that the project setup and code is correctly converted.",
|
|
10
|
+
annotations: {
|
|
11
|
+
title: "Get TypeScript Conversion Guidelines",
|
|
12
|
+
readOnlyHint: true,
|
|
13
|
+
idempotentHint: true,
|
|
14
|
+
openWorldHint: false,
|
|
15
|
+
},
|
|
16
|
+
}, async () => {
|
|
17
|
+
log.info("Retrieving TypeScript conversion guidelines...");
|
|
18
|
+
const guidelines = await getTypescriptConversionGuidelines();
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: "text",
|
|
23
|
+
text: guidelines,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/get_typescript_conversion_guidelines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iCAAiC,EAAC,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAItC,MAAM,GAAG,GAAG,SAAS,CAAC,4CAA4C,CAAC,CAAC;AAEpE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,YAA0B,EAAE,QAAiB;IACjF,YAAY,CAAC,sCAAsC,EAAE;QACpD,WAAW,EAAE,oDAAoD;YAChE,8DAA8D;YAC9D,oEAAoE;YACpE,yDAAyD;QAC1D,WAAW,EAAE;YACZ,KAAK,EAAE,sCAAsC;YAC7C,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACpB;KACD,EAAE,KAAK,IAAI,EAAE;QACb,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,iCAAiC,EAAE,CAAC;QAC7D,OAAO;YACN,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU;iBAChB;aACD;SACD,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getTypescriptConversionGuidelines(): Promise<string>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import https from "https";
|
|
3
|
+
const typescriptConversionGuidelinesFileUrl = new URL("../../../resources/typescript_conversion_guidelines.md", import.meta.url);
|
|
4
|
+
async function getLatestVersion(packageName) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
https
|
|
7
|
+
.get(`https://registry.npmjs.org/${packageName}`, (res) => {
|
|
8
|
+
let data = "";
|
|
9
|
+
res.on("data", (chunk) => {
|
|
10
|
+
data += chunk;
|
|
11
|
+
});
|
|
12
|
+
res.on("end", () => {
|
|
13
|
+
try {
|
|
14
|
+
const json = JSON.parse(data);
|
|
15
|
+
resolve(json["dist-tags"].latest);
|
|
16
|
+
}
|
|
17
|
+
catch (_err) {
|
|
18
|
+
reject(new Error(`Failed to parse response for package ${packageName}`));
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
})
|
|
22
|
+
.on("error", (err) => {
|
|
23
|
+
reject(err);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function getLatestVersions(dependencies) {
|
|
28
|
+
const packageNames = Object.keys(dependencies);
|
|
29
|
+
const versionPromises = packageNames.map((packageName) => {
|
|
30
|
+
return getLatestVersion(packageName).catch((_error) => {
|
|
31
|
+
return dependencies[packageName];
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
const versions = await Promise.all(versionPromises);
|
|
35
|
+
const latestVersions = {};
|
|
36
|
+
packageNames.forEach((packageName, index) => {
|
|
37
|
+
latestVersions[packageName] = versions[index];
|
|
38
|
+
});
|
|
39
|
+
return latestVersions;
|
|
40
|
+
}
|
|
41
|
+
const getLatestDevDependencies = async () => {
|
|
42
|
+
const packages = await getLatestVersions({
|
|
43
|
+
"@ui5/cli": "^4",
|
|
44
|
+
"typescript": "^5",
|
|
45
|
+
"typescript-eslint": "^8",
|
|
46
|
+
"ui5-middleware-livereload": "^3",
|
|
47
|
+
"ui5-tooling-transpile": "^3",
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
devDependencies: packages,
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const getLatestTsInterfaceGeneratorVersion = async () => {
|
|
54
|
+
const version = await getLatestVersion("@ui5/ts-interface-generator").catch(() => {
|
|
55
|
+
return "^0";
|
|
56
|
+
});
|
|
57
|
+
return version;
|
|
58
|
+
};
|
|
59
|
+
export async function getTypescriptConversionGuidelines() {
|
|
60
|
+
let guidelines = await readFile(typescriptConversionGuidelinesFileUrl, { encoding: "utf-8" });
|
|
61
|
+
guidelines = guidelines
|
|
62
|
+
.replace("{{dependencies}}", JSON.stringify(await getLatestDevDependencies(), null, 3))
|
|
63
|
+
.replace("{{ts-interface-generator-version}}", await getLatestTsInterfaceGeneratorVersion());
|
|
64
|
+
return guidelines;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=typescriptConversionGuidelines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescriptConversionGuidelines.js","sourceRoot":"","sources":["../../../src/tools/get_typescript_conversion_guidelines/typescriptConversionGuidelines.ts"],"names":[],"mappings":"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"}
|