From 08f9959105da32b66fc25f7190fe4d68463264e1 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jun 2026 15:03:24 -0400 Subject: [PATCH 1/4] refactor(@angular/cli): promote experimental MCP tools to stable Promote `run_target` and `devserver` tools (which includes `devserver.start`, `devserver.stop`, and `devserver.wait_for_build`) from experimental to stable so they are registered and available by default on the MCP server. (cherry picked from commit 3d3179d55980d6aa95dc945fbae8768a2a02ff82) --- packages/angular/cli/src/commands/mcp/cli.ts | 4 ---- packages/angular/cli/src/commands/mcp/mcp-server.ts | 10 ++++++---- tests/e2e/tests/mcp/run-target.ts | 10 +++------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/packages/angular/cli/src/commands/mcp/cli.ts b/packages/angular/cli/src/commands/mcp/cli.ts index 091a9064ca7f..f72c3ea57fd3 100644 --- a/packages/angular/cli/src/commands/mcp/cli.ts +++ b/packages/angular/cli/src/commands/mcp/cli.ts @@ -54,10 +54,6 @@ export default class McpCommandModule extends CommandModule implements CommandMo alias: 'E', array: true, describe: 'Enable an experimental tool.', - choices: [ - ...EXPERIMENTAL_TOOLS.map(({ name }) => name), - ...Object.keys(EXPERIMENTAL_TOOL_GROUPS), - ], hidden: true, }); } diff --git a/packages/angular/cli/src/commands/mcp/mcp-server.ts b/packages/angular/cli/src/commands/mcp/mcp-server.ts index 43320217db6d..58328eed24f2 100644 --- a/packages/angular/cli/src/commands/mcp/mcp-server.ts +++ b/packages/angular/cli/src/commands/mcp/mcp-server.ts @@ -41,22 +41,24 @@ const STABLE_TOOLS = [ DOC_SEARCH_TOOL, LIST_PROJECTS_TOOL, ZONELESS_MIGRATION_TOOL, + RUN_TARGET_TOOL, + ...DEVSERVER_TOOLS, ] as const; /** * The set of tools that are available but not enabled by default. * These tools are considered experimental and may have limitations. */ -export const EXPERIMENTAL_TOOLS = [RUN_TARGET_TOOL, ...DEVSERVER_TOOLS] as const; +export const EXPERIMENTAL_TOOLS: readonly AnyMcpToolDeclaration[] = [] as const; /** * Experimental tools that are grouped together under a single name. * * Used for enabling them as a group. */ -export const EXPERIMENTAL_TOOL_GROUPS = { +export const EXPERIMENTAL_TOOL_GROUPS: Record = { 'all': EXPERIMENTAL_TOOLS, - 'devserver': DEVSERVER_TOOLS, + 'devserver': [], }; export async function createMcpServer( @@ -205,7 +207,7 @@ export function assembleToolDeclarations( const tool = experimentalToolsMap.get(toolName); if (tool) { toolDeclarations.push(tool); - } else { + } else if (!stableDeclarations.some((t) => t.name === toolName)) { options.logger.warn(`Unknown experimental tool: ${toolName}`); } } diff --git a/tests/e2e/tests/mcp/run-target.ts b/tests/e2e/tests/mcp/run-target.ts index 936f3a9fc7f6..16548fc4f3ca 100644 --- a/tests/e2e/tests/mcp/run-target.ts +++ b/tests/e2e/tests/mcp/run-target.ts @@ -29,11 +29,11 @@ export default async function () { ); try { - // 1. Ensure `run_target` is NOT registered by default (stable-only tools registered) + // 1. Ensure `run_target` is registered by default (now stable) const { stdout: stdoutDefault } = await runInspector('--method', 'tools/list'); - assert.doesNotMatch(stdoutDefault, /"run_target"/); + assert.match(stdoutDefault, /"run_target"/); - // 2. Ensure `run_target` is registered when explicitly enabled via experimental-tool flag + // 2. Ensure `run_target` is also registered when using the deprecated experimental-tool flag const { stdout: stdoutEnabled } = await runInspector( '-E', 'run_target', @@ -44,8 +44,6 @@ export default async function () { // 3. Call run_target with build target const { stdout: stdoutCall } = await runInspector( - '-E', - 'run_target', '--method', 'tools/call', '--tool-name', @@ -66,8 +64,6 @@ export default async function () { // 4. Call run_target with test target (only for esbuild/Vite test runner, as webpack-based Karma fails on this bazel CI headless runner) if (esbuild) { const { stdout: stdoutTestCall } = await runInspector( - '-E', - 'run_target', '--method', 'tools/call', '--tool-name', From 0eddea898d3bf4da8c9c5c27ec2ee79916e8be87 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:48:45 -0400 Subject: [PATCH 2/4] fix(@schematics/angular): remove default workspace vscode mcp.json configuration The workspace schematic previously generated a default `.vscode/mcp.json` file when initializing a new workspace. However, this configuration is now managed and optionally generated via the `ai-config` schematic (either during `ng new` tool setup or through direct schematic invocation). (cherry picked from commit 01008f1c69321d0a8b5b8344672b594a68fe83b6) --- .../workspace/files/__dot__vscode/mcp.json.template | 9 --------- packages/schematics/angular/workspace/index_spec.ts | 2 -- 2 files changed, 11 deletions(-) delete mode 100644 packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template diff --git a/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template b/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template deleted file mode 100644 index 956af8c62ce6..000000000000 --- a/packages/schematics/angular/workspace/files/__dot__vscode/mcp.json.template +++ /dev/null @@ -1,9 +0,0 @@ -{ - // For more information, visit: https://angular.dev/ai/mcp - "servers": { - "angular-cli": { - "command": "npx", - "args": ["-y", "@angular/cli", "mcp"] - } - } -} diff --git a/packages/schematics/angular/workspace/index_spec.ts b/packages/schematics/angular/workspace/index_spec.ts index 7f726fde8f1f..a13a7d3e1bb7 100644 --- a/packages/schematics/angular/workspace/index_spec.ts +++ b/packages/schematics/angular/workspace/index_spec.ts @@ -29,7 +29,6 @@ describe('Workspace Schematic', () => { jasmine.arrayContaining([ '/.vscode/extensions.json', '/.vscode/launch.json', - '/.vscode/mcp.json', '/.vscode/tasks.json', '/.editorconfig', '/angular.json', @@ -71,7 +70,6 @@ describe('Workspace Schematic', () => { jasmine.arrayContaining([ '/.vscode/extensions.json', '/.vscode/launch.json', - '/.vscode/mcp.json', '/.vscode/tasks.json', '/angular.json', '/.gitignore', From bc97bb3541c3187ce4c0507b9b75271c77285139 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 18 Jun 2026 08:29:15 +0000 Subject: [PATCH 3/4] build: update dependency vite to v7.3.5 See associated pull request for more information. --- packages/angular/build/package.json | 2 +- pnpm-lock.yaml | 68 ++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/packages/angular/build/package.json b/packages/angular/build/package.json index 8b7d429e6f52..f735e197dfa7 100644 --- a/packages/angular/build/package.json +++ b/packages/angular/build/package.json @@ -41,7 +41,7 @@ "semver": "7.7.4", "source-map-support": "0.5.21", "tinyglobby": "0.2.16", - "vite": "7.3.2", + "vite": "7.3.5", "watchpack": "2.5.1" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f11a10dc22f2..0b9b0430252e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -357,7 +357,7 @@ importers: version: 6.0.12(@types/node@24.13.2) '@vitejs/plugin-basic-ssl': specifier: 2.3.0 - version: 2.3.0(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0)) + version: 2.3.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0)) beasties: specifier: 0.4.2 version: 0.4.2 @@ -407,8 +407,8 @@ importers: specifier: 0.2.16 version: 0.2.16 vite: - specifier: 7.3.2 - version: 7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0) + specifier: 7.3.5 + version: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0) watchpack: specifier: 2.5.1 version: 2.5.1 @@ -8337,6 +8337,46 @@ packages: yaml: optional: true + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@4.1.5: resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -12126,9 +12166,9 @@ snapshots: lodash: 4.18.1 minimatch: 7.4.9 - '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0))': dependencies: - vite: 7.3.2(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0) + vite: 7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0) '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: @@ -17323,6 +17363,24 @@ snapshots: tsx: 4.22.4 yaml: 2.9.0 + vite@7.3.5(@types/node@24.13.2)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0): + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.14 + rollup: 4.60.2 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.13.2 + fsevents: 2.3.3 + jiti: 2.7.0 + less: 4.6.4 + sass: 1.99.0 + terser: 5.46.2 + tsx: 4.22.4 + yaml: 2.9.0 + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(@vitest/coverage-v8@4.1.5)(jiti@2.7.0)(jsdom@29.1.1)(less@4.6.4)(sass@1.99.0)(terser@5.46.2)(tsx@4.22.4)(yaml@2.9.0): dependencies: '@vitest/expect': 4.1.5 From b30b9d3d2e7537f567fcb9567eab88093cf423d1 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 18 Jun 2026 09:17:26 -0400 Subject: [PATCH 4/4] release: cut the v22.0.3 release --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c0fc0e01068..6f927f327ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ + + +# 22.0.3 (2026-06-18) + +### @schematics/angular + +| Commit | Type | Description | +| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------ | +| [0eddea898](https://github.com/angular/angular-cli/commit/0eddea898d3bf4da8c9c5c27ec2ee79916e8be87) | fix | remove default workspace vscode mcp.json configuration | + + + # 22.0.2 (2026-06-17) diff --git a/package.json b/package.json index 9ac004ee01b6..a40e5767f493 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@angular/devkit-repo", - "version": "22.0.2", + "version": "22.0.3", "private": true, "description": "Software Development Kit for Angular", "keywords": [