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": [
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/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/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',
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
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',