winutil-cn-mcp 0.2.0 → 0.3.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.
Files changed (3) hide show
  1. package/README.md +2 -0
  2. package/index.js +21 -11
  3. package/package.json +10 -2
package/README.md CHANGED
@@ -16,6 +16,8 @@
16
16
  | `set_dns` | 把已连接网卡的 DNS 设为指定提供商 ⚠️ 改系统,需管理员 |
17
17
 
18
18
  > ⚠️ `apply_tweaks` / `set_dns` / 部分 `install_apps` 会修改系统,需管理员权限——在**管理员终端**里启动 Claude / MCP 宿主。
19
+ >
20
+ > 🛡️ **安全预览**:这三个改系统的工具**默认只预览**(返回「将要做什么」,不执行)。AI 展示给你确认后,加 `confirm: true` 再调一次才真执行——防止 AI 误操作。
19
21
 
20
22
  **用法示例**(对 Claude 说):
21
23
  > 「帮我把这台机器配成国内开发环境」→ AI 调 `list_bundles` 找到「国际·开发环境」+ 国货,`install_apps` 装 VSCode/Git/Node/Python/微信/WPS,再 `switch_mirror` 把 pip/npm 换国内源。
package/index.js CHANGED
@@ -101,7 +101,7 @@ async function runPwsh(script) {
101
101
  }
102
102
  }
103
103
 
104
- const server = new McpServer({ name: 'winutil-cn-mcp', version: '0.2.0' });
104
+ const server = new McpServer({ name: 'winutil-cn-mcp', version: '0.3.0' });
105
105
 
106
106
  // ── 软件 ──────────────────────────────────────────────────────────────
107
107
  server.registerTool('search_apps', {
@@ -127,9 +127,13 @@ server.registerTool('list_bundles', {
127
127
 
128
128
  server.registerTool('install_apps', {
129
129
  title: '安装软件',
130
- description: '用 winget 静默安装软件。传入 winget 包 ID 或组合里的 app key(自动解析)。部分软件需管理员权限。',
131
- inputSchema: { ids: z.array(z.string()) },
132
- }, async ({ ids }) => {
130
+ description: '用 winget 静默安装软件。传入 winget 包 ID 或组合里的 app key(自动解析)。⚠️ 会改动系统:默认只预览将装什么,确认无误后加 confirm:true 再调一次才真装。部分软件需管理员权限。',
131
+ inputSchema: { ids: z.array(z.string()), confirm: z.boolean().optional().describe('true=执行安装;省略或 false=只预览,不安装') },
132
+ }, async ({ ids, confirm }) => {
133
+ if (!confirm) {
134
+ const willInstall = ids.map(raw => { const app = APP_BY_KEY.get(raw.toLowerCase()); return app?.winget || raw; });
135
+ return ok({ preview: true, willInstall, note: '这是预览,尚未安装任何东西。确认无误后,用相同参数加 confirm:true 再调一次即可安装。' });
136
+ }
133
137
  const results = [];
134
138
  for (const raw of ids) {
135
139
  let wingetId = raw;
@@ -176,9 +180,13 @@ server.registerTool('list_tweaks', {
176
180
 
177
181
  server.registerTool('apply_tweaks', {
178
182
  title: '应用优化项',
179
- description: '应用一个或多个优化项(执行其注册表改动 + 服务设置 + 内置脚本)。⚠️ 会修改系统,需管理员权限(在管理员终端启动 MCP 宿主)。传入 apply_tweaks 的 key。',
180
- inputSchema: { keys: z.array(z.string()).describe('优化项 key,如 WPFTweaksTelemetry') },
181
- }, async ({ keys }) => {
183
+ description: '应用一个或多个优化项(执行其注册表改动 + 服务设置 + 内置脚本)。⚠️ 会修改系统:默认只预览将改什么,确认后加 confirm:true 再调一次才真改。需管理员权限(在管理员终端启动 MCP 宿主)。',
184
+ inputSchema: { keys: z.array(z.string()).describe('优化项 key,如 WPFTweaksTelemetry'), confirm: z.boolean().optional().describe('true=执行;省略或 false=只预览') },
185
+ }, async ({ keys, confirm }) => {
186
+ if (!confirm) {
187
+ const plan = keys.map(k => { const t = TWEAKS[k]; return t ? { key: k, name: t.Content, 注册表改动: (t.registry || []).length, 服务设置: (t.service || []).length, 脚本: (t.InvokeScript || []).length } : { key: k, status: '未找到' }; });
188
+ return ok({ preview: true, willApply: plan, note: '这是预览,尚未改动系统。确认后用相同 keys 加 confirm:true 再调一次即可应用。需管理员权限。' });
189
+ }
182
190
  const results = [];
183
191
  for (const key of keys) {
184
192
  const t = TWEAKS[key];
@@ -210,15 +218,17 @@ server.registerTool('list_dns', {
210
218
 
211
219
  server.registerTool('set_dns', {
212
220
  title: '设置 DNS',
213
- description: '把所有「已连接」网卡的 DNS 设为指定提供商(用 list_dns 里的名称;Default=恢复默认)。⚠️ 修改系统网络设置,需管理员权限。',
214
- inputSchema: { provider: z.string().describe('DNS 提供商名称,如 AliDNS / Cloudflare / Default') },
215
- }, async ({ provider }) => {
221
+ description: '把所有「已连接」网卡的 DNS 设为指定提供商(用 list_dns 里的名称;Default=恢复默认)。⚠️ 修改系统网络设置:默认只预览,确认后加 confirm:true 才真改。需管理员权限。',
222
+ inputSchema: { provider: z.string().describe('DNS 提供商名称,如 AliDNS / Cloudflare / Default'), confirm: z.boolean().optional().describe('true=执行;省略或 false=只预览') },
223
+ }, async ({ provider, confirm }) => {
216
224
  let script;
217
225
  if (provider === 'Default' || provider === 'DHCP') {
226
+ if (!confirm) return ok({ preview: true, willSet: '恢复系统默认 / DHCP', note: '预览,尚未修改网络。确认后加 confirm:true 再调。需管理员权限。' });
218
227
  script = `Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} | ForEach-Object { Set-DnsClientServerAddress -InterfaceIndex $_.ifIndex -ResetServerAddresses }; Write-Output 'DNS 已恢复默认'`;
219
228
  } else {
220
229
  const d = DNS[provider];
221
230
  if (!d) return ok({ status: 'not_found', reason: `未知 DNS 提供商: ${provider}`, hint: '用 list_dns 查看可用名称' });
231
+ if (!confirm) return ok({ preview: true, willSet: provider, addresses: { ipv4: [d.Primary, d.Secondary], ipv6: d.Primary6 ? [d.Primary6, d.Secondary6] : '无' }, note: '预览,尚未修改网络。确认后加 confirm:true 再调。需管理员权限。' });
222
232
  const v4 = `'${q1(d.Primary)}','${q1(d.Secondary)}'`;
223
233
  const v6line = d.Primary6 ? `Set-DnsClientServerAddress -InterfaceIndex $_.ifIndex -ServerAddresses '${q1(d.Primary6)}','${q1(d.Secondary6)}';` : '';
224
234
  script = `Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} | ForEach-Object { Set-DnsClientServerAddress -InterfaceIndex $_.ifIndex -ServerAddresses ${v4}; ${v6line} }; Write-Output 'DNS 已设为 ${q1(provider)}'`;
@@ -229,4 +239,4 @@ server.registerTool('set_dns', {
229
239
 
230
240
  const transport = new StdioServerTransport();
231
241
  await server.connect(transport);
232
- console.error(`[winutil-cn-mcp v0.2] 已启动(${DATA.source}) · 软件 ${ALL_APPS.length} · 组合 ${Object.keys(BUNDLES).filter(k => k !== '_meta').length} · 优化项 ${Object.keys(TWEAKS).length} · DNS ${Object.keys(DNS).length}`);
242
+ console.error(`[winutil-cn-mcp v0.3] 已启动(${DATA.source}) · 软件 ${ALL_APPS.length} · 组合 ${Object.keys(BUNDLES).filter(k => k !== '_meta').length} · 优化项 ${Object.keys(TWEAKS).length} · DNS ${Object.keys(DNS).length}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "winutil-cn-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP 服务器:让 AI 智能体按意图驱动 WinUtil 中文汉化版 —— 搜索/安装软件、套用组合、一键换源、查询/应用优化项、配置 DNS。让 Claude 帮你按意图配 Windows。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,7 +15,15 @@
15
15
  "build": "node build-data.js",
16
16
  "prepublishOnly": "node build-data.js"
17
17
  },
18
- "keywords": ["mcp", "winutil", "windows", "ai", "claude", "chinese", "winget"],
18
+ "keywords": [
19
+ "mcp",
20
+ "winutil",
21
+ "windows",
22
+ "ai",
23
+ "claude",
24
+ "chinese",
25
+ "winget"
26
+ ],
19
27
  "engines": {
20
28
  "node": ">=18"
21
29
  },