@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 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.11.x, v22.0.0, or higher
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
 
@@ -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) {
@@ -1 +1 @@
1
- {"version":3,"file":"registerTools.js","sourceRoot":"","sources":["../src/registerTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registerTools.js","sourceRoot":"","sources":["../src/registerTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import Context from "../../Context.js";
2
+ import { RegisterTool } from "../../registerTools.js";
3
+ export default function registerTool(registerTool: RegisterTool, _context: Context): void;
@@ -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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"}