@ui5/mcp-server 0.2.0 → 0.2.1

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,27 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.1](https://github.com/UI5/mcp-server/compare/v0.2.0...v0.2.1) (2026-01-02)
4
+
5
+
6
+ ### Features
7
+
8
+ * Add manifest validation tool ([#93](https://github.com/UI5/mcp-server/issues/93)) ([01fc0b4](https://github.com/UI5/mcp-server/commit/01fc0b4dcad81accf991b190eba99cdefdabc149))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * Bump @modelcontextprotocol/sdk from 1.24.3 to 1.25.0 ([10250cf](https://github.com/UI5/mcp-server/commit/10250cf2c43e1e93cc3f1afeec6c3a7de7873cb7))
14
+ * Bump @modelcontextprotocol/sdk from 1.25.0 to 1.25.1 ([d7f8fea](https://github.com/UI5/mcp-server/commit/d7f8fea9c3ede27d2379222c3b5cea87766d2aaf))
15
+ * Bump @ui5/linter from 1.20.5 to 1.20.6 ([24de07d](https://github.com/UI5/mcp-server/commit/24de07d4eb4d27669fcc74213dd667269b2a3ab3))
16
+ * Bump @ui5/linter from 1.20.6 to 1.20.7 ([ed52e26](https://github.com/UI5/mcp-server/commit/ed52e2636c2d69e0900e3c5e6041d5b5978759e9))
17
+ * Bump fast-xml-parser from 5.3.2 to 5.3.3 ([709b96b](https://github.com/UI5/mcp-server/commit/709b96bee4a2f6b8bc70c9fd7967f6720d44dea6))
18
+ * Bump globby from 16.0.0 to 16.1.0 ([af274e0](https://github.com/UI5/mcp-server/commit/af274e05c4d6c1ac47950e3abb4b445f835db404))
19
+ * Bump qs from 6.14.0 to 6.14.1 ([cb2871f](https://github.com/UI5/mcp-server/commit/cb2871f985d4086a825cefdf80f596656b5bb43d))
20
+ * Bump zod from 4.1.13 to 4.2.0 ([5888a2b](https://github.com/UI5/mcp-server/commit/5888a2b57efa38da01adea45c51615d8c7114da5))
21
+ * Bump zod from 4.2.0 to 4.2.1 ([d2e746a](https://github.com/UI5/mcp-server/commit/d2e746a1f60c58fe2e74ee08832bc7f578a2980d))
22
+ * Bump zod from 4.2.1 to 4.3.2 ([d34c2ef](https://github.com/UI5/mcp-server/commit/d34c2efa743064f99041eda5943efb9444516e66))
23
+ * Bump zod from 4.3.2 to 4.3.4 ([2e61f66](https://github.com/UI5/mcp-server/commit/2e61f666a2b86369678c984e8a5524ad919aecb4))
24
+
3
25
  ## [0.2.0](https://github.com/UI5/mcp-server/compare/v0.1.6...v0.2.0) (2025-12-12)
4
26
 
5
27
 
package/README.md CHANGED
@@ -32,6 +32,7 @@ The UI5 [Model Context Protocol](https://modelcontextprotocol.io/) server offers
32
32
  - `get_typescript_conversion_guidelines`: Provides guidelines for converting UI5 applications and controls from JavaScript to TypeScript.
33
33
  - `get_integration_cards_guidelines`: Provides access to UI Integration Cards development best practices.
34
34
  - `create_integration_card`: Scaffolds a new UI Integration Card.
35
+ - `run_manifest_validation`: Validates the manifest against the UI5 Manifest schema.
35
36
 
36
37
  ## Requirements
37
38
 
@@ -64,6 +64,7 @@ export declare function _processResponse({ content, structuredContent }: CallToo
64
64
  src: string;
65
65
  mimeType?: string | undefined;
66
66
  sizes?: string[] | undefined;
67
+ theme?: "light" | "dark" | undefined;
67
68
  }[] | undefined;
68
69
  title?: string | undefined;
69
70
  } | {
@@ -146,6 +147,7 @@ export declare function _processResponse({ content, structuredContent }: CallToo
146
147
  src: string;
147
148
  mimeType?: string | undefined;
148
149
  sizes?: string[] | undefined;
150
+ theme?: "light" | "dark" | undefined;
149
151
  }[] | undefined;
150
152
  title?: string | undefined;
151
153
  } | {
@@ -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 registerRunManifestValidationTool from "./tools/run_manifest_validation/index.js";
10
11
  import registerGetTypescriptConversionGuidelinesTool from "./tools/get_typescript_conversion_guidelines/index.js";
11
12
  export default function (server, context, options) {
12
13
  const registerTool = (name, config, callback) => {
@@ -37,6 +38,7 @@ export default function (server, context, options) {
37
38
  registerGetVersionInfoTool(registerTool, context);
38
39
  registerGetIntegrationCardsGuidelinesTool(registerTool, context);
39
40
  registerCreateIntegrationCardTool(registerTool, context);
41
+ registerRunManifestValidationTool(registerTool, context);
40
42
  registerGetTypescriptConversionGuidelinesTool(registerTool, context);
41
43
  }
42
44
  export function _processResponse({ content, structuredContent }, options) {
@@ -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,30 @@
1
+ import runValidation from "./runValidation.js";
2
+ import { inputSchema, outputSchema } from "./schema.js";
3
+ import { getLogger } from "@ui5/logger";
4
+ const log = getLogger("tools:run_manifest_validation");
5
+ export default function registerTool(registerTool, context) {
6
+ registerTool("run_manifest_validation", {
7
+ title: "Manifest Validation",
8
+ description: "Validates UI5 manifest file. " +
9
+ "After making changes, you should always run the validation again " +
10
+ "to verify that no new problems have been introduced.",
11
+ annotations: {
12
+ title: "Manifest Validation",
13
+ readOnlyHint: true,
14
+ },
15
+ inputSchema,
16
+ outputSchema,
17
+ }, async ({ manifestPath }) => {
18
+ log.info(`Running manifest validation on ${manifestPath}...`);
19
+ const normalizedManifestPath = await context.normalizePath(manifestPath);
20
+ const result = await runValidation(normalizedManifestPath);
21
+ return {
22
+ content: [{
23
+ type: "text",
24
+ text: JSON.stringify(result),
25
+ }],
26
+ structuredContent: result,
27
+ };
28
+ });
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/run_manifest_validation/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AACtD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAItC,MAAM,GAAG,GAAG,SAAS,CAAC,+BAA+B,CAAC,CAAC;AAEvD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,YAA0B,EAAE,OAAgB;IAChF,YAAY,CAAC,yBAAyB,EAAE;QACvC,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACV,+BAA+B;YAC/B,mEAAmE;YACnE,sDAAsD;QACvD,WAAW,EAAE;YACZ,KAAK,EAAE,qBAAqB;YAC5B,YAAY,EAAE,IAAI;SAClB;QACD,WAAW;QACX,YAAY;KACZ,EAAE,KAAK,EAAE,EAAC,YAAY,EAAC,EAAE,EAAE;QAC3B,GAAG,CAAC,IAAI,CAAC,kCAAkC,YAAY,KAAK,CAAC,CAAC;QAE9D,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAE3D,OAAO;YACN,OAAO,EAAE,CAAC;oBACT,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;iBAC5B,CAAC;YACF,iBAAiB,EAAE,MAAM;SACzB,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { RunSchemaValidationResult } from "./schema.js";
2
+ export default function runValidation(manifestPath: string): Promise<RunSchemaValidationResult>;
@@ -0,0 +1,130 @@
1
+ import { fetchCdn } from "../../utils/cdnHelper.js";
2
+ import Ajv2020 from "ajv/dist/2020.js";
3
+ import addFormats from "ajv-formats";
4
+ import { readFile } from "fs/promises";
5
+ import { getLogger } from "@ui5/logger";
6
+ import { InvalidInputError } from "../../utils.js";
7
+ import { getManifestSchema, getManifestVersion } from "../../utils/ui5Manifest.js";
8
+ import { Mutex } from "async-mutex";
9
+ import { fileURLToPath } from "url";
10
+ import { isAbsolute } from "path";
11
+ const log = getLogger("tools:run_manifest_validation:runValidation");
12
+ const schemaCache = new Map();
13
+ const fetchSchemaMutex = new Mutex();
14
+ const AJV_SCHEMA_PATHS = {
15
+ draft06: fileURLToPath(import.meta.resolve("ajv/dist/refs/json-schema-draft-06.json")),
16
+ draft07: fileURLToPath(import.meta.resolve("ajv/dist/refs/json-schema-draft-07.json")),
17
+ };
18
+ async function createUI5ManifestValidateFunction(ui5Schema) {
19
+ try {
20
+ const ajv = new Ajv2020.default({
21
+ // Collect all errors, not just the first one
22
+ allErrors: true,
23
+ // Allow additional properties that are not in schema such as "i18n",
24
+ // otherwise compilation fails
25
+ strict: false,
26
+ // Don't use Unicode-aware regular expressions,
27
+ // otherwise compilation fails with "Invalid escape" errors
28
+ unicodeRegExp: false,
29
+ loadSchema: async (uri) => {
30
+ const release = await fetchSchemaMutex.acquire();
31
+ try {
32
+ if (schemaCache.has(uri)) {
33
+ log.info(`Loading cached schema: ${uri}`);
34
+ return schemaCache.get(uri);
35
+ }
36
+ log.info(`Loading external schema: ${uri}`);
37
+ const schema = await fetchCdn(uri);
38
+ // Special handling for Adaptive Card schema to fix unsupported "id" property
39
+ // According to the JSON Schema spec Draft 06 (used by Adaptive Card schema),
40
+ // "$id" should be used instead of "id"
41
+ // See https://github.com/microsoft/AdaptiveCards/issues/9274
42
+ if (uri.includes("adaptive-card.json") && typeof schema.id === "string") {
43
+ schema.$id = schema.id;
44
+ delete schema.id;
45
+ }
46
+ schemaCache.set(uri, schema);
47
+ return schema;
48
+ }
49
+ catch (error) {
50
+ log.warn(`Failed to load external schema ${uri}:` +
51
+ `${error instanceof Error ? error.message : String(error)}`);
52
+ throw error;
53
+ }
54
+ finally {
55
+ release();
56
+ }
57
+ },
58
+ });
59
+ addFormats.default(ajv);
60
+ const draft06MetaSchema = JSON.parse(await readFile(AJV_SCHEMA_PATHS.draft06, "utf-8"));
61
+ const draft07MetaSchema = JSON.parse(await readFile(AJV_SCHEMA_PATHS.draft07, "utf-8"));
62
+ // Add meta-schemas for draft-06 and draft-07.
63
+ // These are required to support schemas that reference these drafts,
64
+ // for example the Adaptive Card schema and some sap.bpa.task properties.
65
+ ajv.addMetaSchema(draft06MetaSchema, "http://json-schema.org/draft-06/schema#");
66
+ ajv.addMetaSchema(draft07MetaSchema, "http://json-schema.org/draft-07/schema#");
67
+ const validate = await ajv.compileAsync(ui5Schema);
68
+ return validate;
69
+ }
70
+ catch (error) {
71
+ throw new Error(`Failed to create UI5 manifest validate function: ` +
72
+ `${error instanceof Error ? error.message : String(error)}`);
73
+ }
74
+ }
75
+ async function readManifest(path) {
76
+ let content;
77
+ let json;
78
+ if (!isAbsolute(path)) {
79
+ throw new InvalidInputError(`The manifest path must be absolute: '${path}'`);
80
+ }
81
+ try {
82
+ content = await readFile(path, "utf-8");
83
+ }
84
+ catch (error) {
85
+ throw new InvalidInputError(`Failed to read manifest file at ${path}: ` +
86
+ `${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ try {
89
+ json = JSON.parse(content);
90
+ }
91
+ catch (error) {
92
+ throw new InvalidInputError(`Failed to parse manifest file at ${path} as JSON: ` +
93
+ `${error instanceof Error ? error.message : String(error)}`);
94
+ }
95
+ return json;
96
+ }
97
+ export default async function runValidation(manifestPath) {
98
+ log.info(`Starting manifest validation for file: ${manifestPath}`);
99
+ const manifest = await readManifest(manifestPath);
100
+ const manifestVersion = await getManifestVersion(manifest);
101
+ log.info(`Using manifest version: ${manifestVersion}`);
102
+ const ui5ManifestSchema = await getManifestSchema(manifestVersion);
103
+ const validate = await createUI5ManifestValidateFunction(ui5ManifestSchema);
104
+ const isValid = validate(manifest);
105
+ if (isValid) {
106
+ log.info("Manifest validation successful");
107
+ return {
108
+ isValid: true,
109
+ errors: [],
110
+ };
111
+ }
112
+ // Map AJV errors to our schema format
113
+ const validationErrors = validate.errors ?? [];
114
+ const errors = validationErrors.map((error) => {
115
+ return {
116
+ keyword: error.keyword ?? "",
117
+ instancePath: error.instancePath ?? "",
118
+ schemaPath: error.schemaPath ?? "",
119
+ params: error.params ?? {},
120
+ propertyName: error.propertyName,
121
+ message: error.message,
122
+ };
123
+ });
124
+ log.info(`Manifest validation failed with ${errors.length} error(s)`);
125
+ return {
126
+ isValid: false,
127
+ errors: errors,
128
+ };
129
+ }
130
+ //# sourceMappingURL=runValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runValidation.js","sourceRoot":"","sources":["../../../src/tools/run_manifest_validation/runValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ export declare const inputSchema: {
3
+ manifestPath: z.ZodString;
4
+ };
5
+ export declare const outputSchema: {
6
+ isValid: z.ZodBoolean;
7
+ errors: z.ZodArray<z.ZodObject<{
8
+ keyword: z.ZodString;
9
+ instancePath: z.ZodString;
10
+ schemaPath: z.ZodString;
11
+ params: z.ZodRecord<z.ZodAny, z.ZodAny>;
12
+ propertyName: z.ZodOptional<z.ZodString>;
13
+ message: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>>;
15
+ };
16
+ declare const _outputSchemaObject: z.ZodObject<{
17
+ isValid: z.ZodBoolean;
18
+ errors: z.ZodArray<z.ZodObject<{
19
+ keyword: z.ZodString;
20
+ instancePath: z.ZodString;
21
+ schemaPath: z.ZodString;
22
+ params: z.ZodRecord<z.ZodAny, z.ZodAny>;
23
+ propertyName: z.ZodOptional<z.ZodString>;
24
+ message: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>>;
26
+ }, z.core.$strip>;
27
+ export type RunSchemaValidationResult = z.infer<typeof _outputSchemaObject>;
28
+ export {};
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export const inputSchema = {
3
+ manifestPath: z.string()
4
+ .describe("Absolute path to the manifest file to validate."),
5
+ };
6
+ export const outputSchema = {
7
+ isValid: z.boolean()
8
+ .describe("Whether the manifest is valid according to the UI5 Manifest schema."),
9
+ errors: z.array(z.object({
10
+ keyword: z.string()
11
+ .describe("Validation keyword."),
12
+ instancePath: z.string()
13
+ .describe("JSON Pointer to the location in the data instance (e.g., `/prop/1/subProp`)."),
14
+ schemaPath: z.string()
15
+ .describe("JSON Pointer to the location of the failing keyword in the schema."),
16
+ params: z.record(z.any(), z.any())
17
+ .describe("An object with additional information about the error."),
18
+ propertyName: z.string()
19
+ .optional()
20
+ .describe("Set for errors in `propertyNames` keyword schema."),
21
+ message: z.string()
22
+ .optional()
23
+ .describe("The error message."),
24
+ })).describe("Array of validation error objects as returned by Ajv."),
25
+ };
26
+ const _outputSchemaObject = z.object(outputSchema);
27
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/tools/run_manifest_validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;SACtB,QAAQ,CAAC,iDAAiD,CAAC;CAC7D,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;SAClB,QAAQ,CAAC,qEAAqE,CAAC;IACjF,MAAM,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,QAAQ,CAAC,qBAAqB,CAAC;QACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;aACtB,QAAQ,CAAC,8EAA8E,CAAC;QAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;aACpB,QAAQ,CAAC,oEAAoE,CAAC;QAChF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;aAChC,QAAQ,CAAC,wDAAwD,CAAC;QACpE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;aACtB,QAAQ,EAAE;aACV,QAAQ,CAAC,mDAAmD,CAAC;QAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,oBAAoB,CAAC;KAChC,CAAC,CACF,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CACnE,CAAC;AACF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC"}
@@ -1 +1,18 @@
1
+ /**
2
+ * Get the manifest schema for a specific manifest version.
3
+ * @param manifestVersion The manifest version
4
+ * @returns The manifest schema
5
+ * @throws Error if the manifest version is unsupported
6
+ */
7
+ export declare function getManifestSchema(manifestVersion: string): Promise<object>;
8
+ /**
9
+ * Get the manifest version from the manifest object.
10
+ * @param manifest The manifest object
11
+ * @returns The manifest version
12
+ * @throws Error if the manifest version is missing or invalid
13
+ */
14
+ export declare function getManifestVersion(manifest: object): Promise<string>;
15
+ /**
16
+ * @returns The latest manifest version
17
+ */
1
18
  export declare function getLatestManifestVersion(): Promise<string>;
@@ -1,11 +1,111 @@
1
+ import { getLogger } from "@ui5/logger";
1
2
  import { fetchCdn } from "./cdnHelper.js";
2
- const MAPPING_URL = "https://raw.githubusercontent.com/SAP/ui5-manifest/main/mapping.json";
3
- async function getUI5toManifestVersionMap() {
4
- const mapping = await fetchCdn(MAPPING_URL);
5
- return mapping;
3
+ import { Mutex } from "async-mutex";
4
+ import semver from "semver";
5
+ const log = getLogger("utils:ui5Manifest");
6
+ const schemaCache = new Map();
7
+ const fetchSchemaMutex = new Mutex();
8
+ let UI5ToManifestVersionMapping = null;
9
+ const MAPPING_URL = "https://raw.githubusercontent.com/UI5/manifest/main/mapping.json";
10
+ const ui5ToManifestVersionMappingMutex = new Mutex();
11
+ // Manifests prior to 1.68.0 use older meta-schema, which is not supported by the current implementation
12
+ const LOWEST_SUPPORTED_MANIFEST_VERSION = "1.68.0";
13
+ function getSchemaURL(manifestVersion) {
14
+ return `https://raw.githubusercontent.com/UI5/manifest/v${manifestVersion}/schema.json`;
6
15
  }
16
+ async function getUI5toManifestVersionMapping() {
17
+ const release = await ui5ToManifestVersionMappingMutex.acquire();
18
+ try {
19
+ if (UI5ToManifestVersionMapping) {
20
+ log.info("Loading cached UI5 to manifest version mapping");
21
+ return UI5ToManifestVersionMapping;
22
+ }
23
+ log.info("Fetching UI5 to manifest version mapping");
24
+ const mapping = await fetchCdn(MAPPING_URL);
25
+ log.info(`Fetched UI5 to manifest version mapping from ${MAPPING_URL}`);
26
+ UI5ToManifestVersionMapping = mapping;
27
+ return UI5ToManifestVersionMapping;
28
+ }
29
+ finally {
30
+ release();
31
+ }
32
+ }
33
+ async function fetchSchema(manifestVersion) {
34
+ const release = await fetchSchemaMutex.acquire();
35
+ try {
36
+ if (schemaCache.has(manifestVersion)) {
37
+ log.info(`Loading cached schema for manifest version: ${manifestVersion}`);
38
+ return schemaCache.get(manifestVersion);
39
+ }
40
+ log.info(`Fetching schema for manifest version: ${manifestVersion}`);
41
+ const schemaURL = getSchemaURL(manifestVersion);
42
+ const schema = await fetchCdn(schemaURL);
43
+ log.info(`Fetched UI5 manifest schema from ${schemaURL}`);
44
+ schemaCache.set(manifestVersion, schema);
45
+ return schema;
46
+ }
47
+ finally {
48
+ release();
49
+ }
50
+ }
51
+ async function failWithSupportedVersionsHint(errorMessage) {
52
+ let supportedVersions;
53
+ try {
54
+ const versionMap = await getUI5toManifestVersionMapping();
55
+ supportedVersions = [
56
+ ...new Set(Object.values(versionMap).filter((version) => semver.gte(version, LOWEST_SUPPORTED_MANIFEST_VERSION))),
57
+ ];
58
+ }
59
+ catch (_) {
60
+ supportedVersions = null;
61
+ }
62
+ ;
63
+ throw new Error(errorMessage +
64
+ (supportedVersions ?
65
+ `\nSupported versions are: ${supportedVersions.join(", ")}.` :
66
+ ""));
67
+ }
68
+ /**
69
+ * Get the manifest schema for a specific manifest version.
70
+ * @param manifestVersion The manifest version
71
+ * @returns The manifest schema
72
+ * @throws Error if the manifest version is unsupported
73
+ */
74
+ export async function getManifestSchema(manifestVersion) {
75
+ if (semver.lt(manifestVersion, LOWEST_SUPPORTED_MANIFEST_VERSION)) {
76
+ return failWithSupportedVersionsHint(`Manifest version '${manifestVersion}' is not supported. Please upgrade to a newer one.`);
77
+ }
78
+ try {
79
+ return await fetchSchema(manifestVersion);
80
+ }
81
+ catch (error) {
82
+ return failWithSupportedVersionsHint(`Failed to fetch schema for manifest version '${manifestVersion}': ` +
83
+ `${error instanceof Error ? error.message : String(error)}`);
84
+ }
85
+ }
86
+ /**
87
+ * Get the manifest version from the manifest object.
88
+ * @param manifest The manifest object
89
+ * @returns The manifest version
90
+ * @throws Error if the manifest version is missing or invalid
91
+ */
92
+ export async function getManifestVersion(manifest) {
93
+ if (!("_version" in manifest)) {
94
+ return failWithSupportedVersionsHint("Manifest does not contain a '_version' property.");
95
+ }
96
+ if (typeof manifest._version !== "string") {
97
+ return failWithSupportedVersionsHint("Manifest '_version' property is not a string.");
98
+ }
99
+ if (!semver.valid(manifest._version)) {
100
+ return failWithSupportedVersionsHint("Manifest '_version' property is not a valid semantic version.");
101
+ }
102
+ return manifest._version;
103
+ }
104
+ /**
105
+ * @returns The latest manifest version
106
+ */
7
107
  export async function getLatestManifestVersion() {
8
- const versionMap = await getUI5toManifestVersionMap();
108
+ const versionMap = await getUI5toManifestVersionMapping();
9
109
  if (!versionMap.latest) {
10
110
  throw new Error("Could not determine latest manifest version.");
11
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ui5Manifest.js","sourceRoot":"","sources":["../../src/utils/ui5Manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAExC,MAAM,WAAW,GAAG,sEAAsE,CAAC;AAE3F,KAAK,UAAU,0BAA0B;IACxC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE5C,OAAO,OAAiC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC7C,MAAM,UAAU,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAEtD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"ui5Manifest.js","sourceRoot":"","sources":["../../src/utils/ui5Manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAC;AAClC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,GAAG,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;AAE3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC9C,MAAM,gBAAgB,GAAG,IAAI,KAAK,EAAE,CAAC;AAErC,IAAI,2BAA2B,GAAkC,IAAI,CAAC;AACtE,MAAM,WAAW,GAAG,kEAAkE,CAAC;AACvF,MAAM,gCAAgC,GAAG,IAAI,KAAK,EAAE,CAAC;AAErD,wGAAwG;AACxG,MAAM,iCAAiC,GAAG,QAAQ,CAAC;AAEnD,SAAS,YAAY,CAAC,eAAuB;IAC5C,OAAO,mDAAmD,eAAe,cAAc,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,8BAA8B;IAC5C,MAAM,OAAO,GAAG,MAAM,gCAAgC,CAAC,OAAO,EAAE,CAAC;IAEjE,IAAI,CAAC;QACJ,IAAI,2BAA2B,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC3D,OAAO,2BAA2B,CAAC;QACpC,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,gDAAgD,WAAW,EAAE,CAAC,CAAC;QAExE,2BAA2B,GAAG,OAAiC,CAAC;QAEhE,OAAO,2BAA2B,CAAC;IACpC,CAAC;YAAS,CAAC;QACV,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,eAAuB;IACjD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC;IAEjD,IAAI,CAAC;QACJ,IAAI,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,+CAA+C,eAAe,EAAE,CAAC,CAAC;YAC3E,OAAO,WAAW,CAAC,GAAG,CAAC,eAAe,CAAE,CAAC;QAC1C,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,yCAAyC,eAAe,EAAE,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QAE1D,WAAW,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IACf,CAAC;YAAS,CAAC;QACV,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,KAAK,UAAU,6BAA6B,CAAC,YAAoB;IAChE,IAAI,iBAAiB,CAAC;IAEtB,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,MAAM,8BAA8B,EAAE,CAAC;QAC1D,iBAAiB,GAAG;YACnB,GAAG,IAAI,GAAG,CACT,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAC/B,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,iCAAiC,CAAC,CACnE,CACD;SACD,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,iBAAiB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAAA,CAAC;IAEF,MAAM,IAAI,KAAK,CACd,YAAY;QACZ,CAAC,iBAAiB,CAAC,CAAC;YACnB,6BAA6B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,EAAE,CAAC,CACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,eAAuB;IAC9D,IAAI,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,iCAAiC,CAAC,EAAE,CAAC;QACnE,OAAO,6BAA6B,CACnC,qBAAqB,eAAe,oDAAoD,CACxF,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,6BAA6B,CACnC,gDAAgD,eAAe,KAAK;YACpE,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3D,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACxD,IAAI,CAAC,CAAC,UAAU,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,6BAA6B,CAAC,kDAAkD,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,6BAA6B,CAAC,+CAA+C,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,6BAA6B,CAAC,+DAA+D,CAAC,CAAC;IACvG,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC7C,MAAM,UAAU,GAAG,MAAM,8BAA8B,EAAE,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC;AAC1B,CAAC"}
@@ -1,27 +1,29 @@
1
1
  {
2
2
  "name": "@ui5/mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@ui5/mcp-server",
9
- "version": "0.2.0",
9
+ "version": "0.2.1",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
- "@modelcontextprotocol/sdk": "^1.24.3",
13
- "@ui5/linter": "^1.20.5",
12
+ "@modelcontextprotocol/sdk": "^1.25.1",
13
+ "@ui5/linter": "^1.20.7",
14
14
  "@ui5/logger": "^4.0.2",
15
15
  "@ui5/project": "^4.0.9",
16
+ "ajv": "^8.17.1",
17
+ "ajv-formats": "^3.0.1",
16
18
  "async-mutex": "^0.5.0",
17
19
  "ejs": "^3.1.10",
18
20
  "execa": "^9.6.1",
19
- "fast-xml-parser": "^5.3.2",
20
- "globby": "^16.0.0",
21
+ "fast-xml-parser": "^5.3.3",
22
+ "globby": "^16.1.0",
21
23
  "lockfile": "^1.0.4",
22
24
  "make-fetch-happen": "^15.0.3",
23
25
  "semver": "^7.7.3",
24
- "zod": "^4.1.13"
26
+ "zod": "^4.3.4"
25
27
  },
26
28
  "bin": {
27
29
  "ui5mcp": "bin/ui5mcp.js"
@@ -55,6 +57,18 @@
55
57
  "node": ">=6.9.0"
56
58
  }
57
59
  },
60
+ "node_modules/@hono/node-server": {
61
+ "version": "1.19.7",
62
+ "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.7.tgz",
63
+ "integrity": "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==",
64
+ "license": "MIT",
65
+ "engines": {
66
+ "node": ">=18.14.1"
67
+ },
68
+ "peerDependencies": {
69
+ "hono": "^4"
70
+ }
71
+ },
58
72
  "node_modules/@isaacs/balanced-match": {
59
73
  "version": "4.0.1",
60
74
  "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
@@ -129,11 +143,12 @@
129
143
  }
130
144
  },
131
145
  "node_modules/@modelcontextprotocol/sdk": {
132
- "version": "1.24.3",
133
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz",
134
- "integrity": "sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw==",
146
+ "version": "1.25.1",
147
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.1.tgz",
148
+ "integrity": "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==",
135
149
  "license": "MIT",
136
150
  "dependencies": {
151
+ "@hono/node-server": "^1.19.7",
137
152
  "ajv": "^8.17.1",
138
153
  "ajv-formats": "^3.0.1",
139
154
  "content-type": "^1.0.5",
@@ -144,6 +159,7 @@
144
159
  "express": "^5.0.1",
145
160
  "express-rate-limit": "^7.5.0",
146
161
  "jose": "^6.1.1",
162
+ "json-schema-typed": "^8.0.2",
147
163
  "pkce-challenge": "^5.0.0",
148
164
  "raw-body": "^3.0.0",
149
165
  "zod": "^3.25 || ^4.0",
@@ -667,28 +683,28 @@
667
683
  }
668
684
  },
669
685
  "node_modules/@ui5/linter": {
670
- "version": "1.20.5",
671
- "resolved": "https://registry.npmjs.org/@ui5/linter/-/linter-1.20.5.tgz",
672
- "integrity": "sha512-ZAG44rRs+u8dH2iNmCB1DUfK40kfg309rknngvp4fXJ9N4SJI1ZyVWw+AC001O1m6MwN0NoYO3EmIiqyY3Rckg==",
686
+ "version": "1.20.7",
687
+ "resolved": "https://registry.npmjs.org/@ui5/linter/-/linter-1.20.7.tgz",
688
+ "integrity": "sha512-jH5jI0kt5nw4w0IwSTHemXW/j+lGMNPp6giBsFePDsrOQ054Ye3lUZY2t/MOajhPI38XYeyVlW74D+NrLLfmcQ==",
673
689
  "hasShrinkwrap": true,
674
690
  "license": "Apache-2.0",
675
691
  "dependencies": {
676
692
  "@jridgewell/sourcemap-codec": "^1.5.5",
677
693
  "@jridgewell/trace-mapping": "^0.3.31",
678
- "@sapui5/types": "1.136.11",
694
+ "@sapui5/types": "1.136.13",
679
695
  "@ui5/fs": "^4.0.3",
680
696
  "@ui5/logger": "^4.0.2",
681
- "@ui5/project": "^4.0.8",
697
+ "@ui5/project": "^4.0.9",
682
698
  "chalk": "^5.6.2",
683
699
  "data-with-position": "^0.5.0",
684
- "fast-xml-parser": "^5.3.2",
700
+ "fast-xml-parser": "^5.3.3",
685
701
  "figures": "^6.1.0",
686
702
  "globals": "^16.5.0",
687
703
  "he": "^1.2.0",
688
704
  "json-source-map": "^0.6.1",
689
705
  "magic-string": "^0.30.21",
690
706
  "minimatch": "^10.1.1",
691
- "sax-wasm": "^3.1.2",
707
+ "sax-wasm": "^3.1.3",
692
708
  "semver": "^7.7.3",
693
709
  "typescript": "^5.9.3",
694
710
  "update-notifier": "^7.3.1",
@@ -1003,9 +1019,10 @@
1003
1019
  }
1004
1020
  },
1005
1021
  "node_modules/@ui5/linter/node_modules/@sapui5/types": {
1006
- "version": "1.136.11",
1007
- "resolved": "https://registry.npmjs.org/@sapui5/types/-/types-1.136.11.tgz",
1008
- "integrity": "sha512-9DDMFHzsBJAVTeZ7YXtzlNSoBKncpk+3buBfi2Dm+CZPPHBy7PZByOqF77cejARInKgDhh9d7vXW8Y4dknVsoQ==",
1022
+ "version": "1.136.13",
1023
+ "resolved": "https://registry.npmjs.org/@sapui5/types/-/types-1.136.13.tgz",
1024
+ "integrity": "sha512-ON2uquBCjVDDINwoKhNgLoJBVatocqLmweLbgf6iS5ePstKEs2yH8Sj6ADTCLpp93XcAz2kjt4ix08wbxW2Qig==",
1025
+ "license": "SEE LICENSE IN LICENSE.txt",
1009
1026
  "dependencies": {
1010
1027
  "@types/jquery": "3.5.13",
1011
1028
  "@types/offscreencanvas": "2019.6.4",
@@ -1202,9 +1219,9 @@
1202
1219
  }
1203
1220
  },
1204
1221
  "node_modules/@ui5/linter/node_modules/@ui5/project": {
1205
- "version": "4.0.8",
1206
- "resolved": "https://registry.npmjs.org/@ui5/project/-/project-4.0.8.tgz",
1207
- "integrity": "sha512-kv8tKiiwT175BvAfYdJJ8Fw038p5fNRqJNCDchipeTHMnVsvOdcyw8YVXGk8btngYEVfaX6v936RJAa2hlgf2g==",
1222
+ "version": "4.0.9",
1223
+ "resolved": "https://registry.npmjs.org/@ui5/project/-/project-4.0.9.tgz",
1224
+ "integrity": "sha512-H/dp1kBWPNGnvwbr5s/B+v/orv8Y/fFN/99RpGNZm9GYDpX+vmuZJueIRDA1s5MAmXjkudfYdCkrm86CifThrg==",
1208
1225
  "dependencies": {
1209
1226
  "@npmcli/config": "^9.0.0",
1210
1227
  "@ui5/fs": "^4.0.3",
@@ -1215,7 +1232,7 @@
1215
1232
  "escape-string-regexp": "^5.0.0",
1216
1233
  "globby": "^14.1.0",
1217
1234
  "graceful-fs": "^4.2.11",
1218
- "js-yaml": "^4.1.0",
1235
+ "js-yaml": "^4.1.1",
1219
1236
  "lockfile": "^1.0.4",
1220
1237
  "make-fetch-happen": "^14.0.3",
1221
1238
  "node-stream-zip": "^1.15.0",
@@ -1233,7 +1250,7 @@
1233
1250
  "npm": ">= 8"
1234
1251
  },
1235
1252
  "peerDependencies": {
1236
- "@ui5/builder": "^4.1.0"
1253
+ "@ui5/builder": "^4.1.3"
1237
1254
  },
1238
1255
  "peerDependenciesMeta": {
1239
1256
  "@ui5/builder": {
@@ -1868,9 +1885,9 @@
1868
1885
  ]
1869
1886
  },
1870
1887
  "node_modules/@ui5/linter/node_modules/fast-xml-parser": {
1871
- "version": "5.3.2",
1872
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.2.tgz",
1873
- "integrity": "sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==",
1888
+ "version": "5.3.3",
1889
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.3.tgz",
1890
+ "integrity": "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==",
1874
1891
  "funding": [
1875
1892
  {
1876
1893
  "type": "github",
@@ -2415,9 +2432,9 @@
2415
2432
  ]
2416
2433
  },
2417
2434
  "node_modules/@ui5/linter/node_modules/ky": {
2418
- "version": "1.14.0",
2419
- "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.0.tgz",
2420
- "integrity": "sha512-Rczb6FMM6JT0lvrOlP5WUOCB7s9XKxzwgErzhKlKde1bEV90FXplV1o87fpt4PU/asJFiqjYJxAJyzJhcrxOsQ==",
2435
+ "version": "1.14.1",
2436
+ "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.1.tgz",
2437
+ "integrity": "sha512-hYje4L9JCmpEQBtudo+v52X5X8tgWXUYyPcxKSuxQNboqufecl9VMWjGiucAFH060AwPXHZuH+WB2rrqfkmafw==",
2421
2438
  "engines": {
2422
2439
  "node": ">=18"
2423
2440
  },
@@ -3624,9 +3641,9 @@
3624
3641
  "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="
3625
3642
  },
3626
3643
  "node_modules/@ui5/linter/node_modules/sax-wasm": {
3627
- "version": "3.1.2",
3628
- "resolved": "https://registry.npmjs.org/sax-wasm/-/sax-wasm-3.1.2.tgz",
3629
- "integrity": "sha512-ej7g6cgUQAsxaN2/6P3i9Xb+fxtOaEfdNEXaR7cgap/3V+8NTgETbMBivUVFeGPwFyFqk2YI0A7T30QK10KtAQ==",
3644
+ "version": "3.1.3",
3645
+ "resolved": "https://registry.npmjs.org/sax-wasm/-/sax-wasm-3.1.3.tgz",
3646
+ "integrity": "sha512-4uMe+n/2oKbfAwrNP3s5xQKZue5qQ/zXjJ2XtmrsKD+DUb4y1OClVomJMiCiBAzyiw5U1JHggyltH8/6jb/3/A==",
3630
3647
  "engines": {
3631
3648
  "node": ">=18.20.5"
3632
3649
  }
@@ -3859,9 +3876,9 @@
3859
3876
  }
3860
3877
  },
3861
3878
  "node_modules/@ui5/linter/node_modules/strnum": {
3862
- "version": "2.1.1",
3863
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz",
3864
- "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==",
3879
+ "version": "2.1.2",
3880
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz",
3881
+ "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==",
3865
3882
  "funding": [
3866
3883
  {
3867
3884
  "type": "github",
@@ -5332,9 +5349,9 @@
5332
5349
  "license": "BSD-3-Clause"
5333
5350
  },
5334
5351
  "node_modules/fast-xml-parser": {
5335
- "version": "5.3.2",
5336
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.2.tgz",
5337
- "integrity": "sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==",
5352
+ "version": "5.3.3",
5353
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.3.tgz",
5354
+ "integrity": "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==",
5338
5355
  "funding": [
5339
5356
  {
5340
5357
  "type": "github",
@@ -5581,9 +5598,9 @@
5581
5598
  }
5582
5599
  },
5583
5600
  "node_modules/globby": {
5584
- "version": "16.0.0",
5585
- "resolved": "https://registry.npmjs.org/globby/-/globby-16.0.0.tgz",
5586
- "integrity": "sha512-ejy4TJFga99yW6Q0uhM3pFawKWZmtZzZD/v/GwI5+9bCV5Ew+D2pSND6W7fUes5UykqSsJkUfxFVdRh7Q1+P3Q==",
5601
+ "version": "16.1.0",
5602
+ "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz",
5603
+ "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==",
5587
5604
  "license": "MIT",
5588
5605
  "dependencies": {
5589
5606
  "@sindresorhus/merge-streams": "^4.0.0",
@@ -5663,6 +5680,16 @@
5663
5680
  "node": ">= 0.4"
5664
5681
  }
5665
5682
  },
5683
+ "node_modules/hono": {
5684
+ "version": "4.11.1",
5685
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.1.tgz",
5686
+ "integrity": "sha512-KsFcH0xxHes0J4zaQgWbYwmz3UPOOskdqZmItstUG93+Wk1ePBLkLGwbP9zlmh1BFUiL8Qp+Xfu9P7feJWpGNg==",
5687
+ "license": "MIT",
5688
+ "peer": true,
5689
+ "engines": {
5690
+ "node": ">=16.9.0"
5691
+ }
5692
+ },
5666
5693
  "node_modules/hosted-git-info": {
5667
5694
  "version": "8.1.0",
5668
5695
  "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz",
@@ -5991,6 +6018,12 @@
5991
6018
  "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
5992
6019
  "license": "MIT"
5993
6020
  },
6021
+ "node_modules/json-schema-typed": {
6022
+ "version": "8.0.2",
6023
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
6024
+ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
6025
+ "license": "BSD-2-Clause"
6026
+ },
5994
6027
  "node_modules/jsonparse": {
5995
6028
  "version": "1.3.1",
5996
6029
  "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
@@ -7298,9 +7331,9 @@
7298
7331
  }
7299
7332
  },
7300
7333
  "node_modules/qs": {
7301
- "version": "6.14.0",
7302
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
7303
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
7334
+ "version": "6.14.1",
7335
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
7336
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
7304
7337
  "license": "BSD-3-Clause",
7305
7338
  "dependencies": {
7306
7339
  "side-channel": "^1.1.0"
@@ -8443,9 +8476,9 @@
8443
8476
  }
8444
8477
  },
8445
8478
  "node_modules/zod": {
8446
- "version": "4.1.13",
8447
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
8448
- "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
8479
+ "version": "4.3.4",
8480
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.4.tgz",
8481
+ "integrity": "sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==",
8449
8482
  "license": "MIT",
8450
8483
  "peer": true,
8451
8484
  "funding": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ui5/mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "MCP server for UI5 application development",
5
5
  "author": {
6
6
  "name": "SAP SE",
@@ -75,27 +75,29 @@
75
75
  }
76
76
  },
77
77
  "dependencies": {
78
- "@modelcontextprotocol/sdk": "^1.24.3",
79
- "@ui5/linter": "^1.20.5",
78
+ "@modelcontextprotocol/sdk": "^1.25.1",
79
+ "@ui5/linter": "^1.20.7",
80
80
  "@ui5/logger": "^4.0.2",
81
81
  "@ui5/project": "^4.0.9",
82
+ "ajv": "^8.17.1",
83
+ "ajv-formats": "^3.0.1",
82
84
  "async-mutex": "^0.5.0",
83
85
  "ejs": "^3.1.10",
84
86
  "execa": "^9.6.1",
85
- "fast-xml-parser": "^5.3.2",
86
- "globby": "^16.0.0",
87
+ "fast-xml-parser": "^5.3.3",
88
+ "globby": "^16.1.0",
87
89
  "lockfile": "^1.0.4",
88
90
  "make-fetch-happen": "^15.0.3",
89
91
  "semver": "^7.7.3",
90
- "zod": "^4.1.13"
92
+ "zod": "^4.3.4"
91
93
  },
92
94
  "devDependencies": {
93
- "@commitlint/cli": "^20.2.0",
94
- "@commitlint/config-conventional": "^20.2.0",
95
- "@eslint/js": "^9.39.1",
95
+ "@commitlint/cli": "^20.3.0",
96
+ "@commitlint/config-conventional": "^20.3.0",
97
+ "@eslint/js": "^9.39.2",
96
98
  "@istanbuljs/esm-loader-hook": "^0.3.0",
97
99
  "@istanbuljs/nyc-config-typescript": "^1.0.2",
98
- "@modelcontextprotocol/inspector": "^0.17.5",
100
+ "@modelcontextprotocol/inspector": "^0.18.0",
99
101
  "@stylistic/eslint-plugin": "^5.6.1",
100
102
  "@types/ejs": "^3.1.5",
101
103
  "@types/make-fetch-happen": "^10.0.4",
@@ -106,17 +108,17 @@
106
108
  "@ui5-language-assistant/semantic-model-types": "^3.3.1",
107
109
  "ava": "^6.3.0",
108
110
  "depcheck": "^1.4.7",
109
- "eslint": "^9.39.1",
111
+ "eslint": "^9.39.2",
110
112
  "eslint-plugin-ava": "^15.0.1",
111
113
  "esmock": "^2.7.3",
112
114
  "husky": "^9.1.7",
113
115
  "licensee": "^11.1.1",
114
116
  "nyc": "^17.1.0",
115
117
  "rimraf": "^6.1.2",
116
- "sinon": "^21.0.0",
118
+ "sinon": "^21.0.1",
117
119
  "tsx": "^4.21.0",
118
120
  "typescript": "^5.9.3",
119
- "typescript-eslint": "^8.49.0",
121
+ "typescript-eslint": "^8.51.0",
120
122
  "yauzl-promise": "^4.0.0"
121
123
  }
122
124
  }
@@ -42,6 +42,7 @@
42
42
  ## 2. Validation
43
43
  - **ALWAYS** ensure that `manifest.json` file is valid JSON.
44
44
  - **ALWAYS** ensure that in `manifest.json` file the property `sap.app/type` is set to `"card"`.
45
+ - **ALWAYS** validate the `manifest.json` against the UI5 Manifest schema. Use the `run_manifest_validation` tool to do this.
45
46
  - **ALWAYS** avoid using deprecated properties in `manifest.json` and elsewhere.
46
47
  - **NEVER** treat Integration Cards' project as UI5 project, except for cards of type "Component".
47
48