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.
- package/README.md +2 -0
- package/index.js +21 -11
- 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.
|
|
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: '应用一个或多个优化项(执行其注册表改动 + 服务设置 + 内置脚本)。⚠️
|
|
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.
|
|
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.
|
|
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": [
|
|
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
|
},
|