{"id":85,"date":"2026-06-14T08:36:40","date_gmt":"2026-06-14T00:36:40","guid":{"rendered":"http:\/\/www.longxiapro.com\/?p=85"},"modified":"2026-06-14T11:07:21","modified_gmt":"2026-06-14T03:07:21","slug":"openclaw-mcporterofficial-service-management-cli-skil","status":"publish","type":"post","link":"https:\/\/www.longxiapro.com\/index.php\/85\/","title":{"rendered":"\u6253\u901a MCP \u670d\u52a1\u94fe\u8def\uff01OpenClaw McporterOfficial \u670d\u52a1\u7ba1\u7406 CLI \u6280\u80fd\u6df1\u5ea6\u4e8c\u6b21\u5f00\u53d1\u6559\u7a0b\uff08\u5168\u7f51\u72ec\u5bb6\u9996\u53d1\uff09"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u76ee\u524d\u7f51\u7edc\u4e0a\u4ec5\u6709\u57fa\u7840\u4f7f\u7528 <code>McporterOfficial<\/code> \u542f\u52a8\u3001\u8fde\u63a5 MCP \u670d\u52a1\u7684\u96f6\u6563\u547d\u4ee4\u8bf4\u660e\uff0c<strong>\u65e0\u4efb\u4f55\u9488\u5bf9 OpenClaw \u751f\u6001\u7684\u6df1\u5ea6\u9002\u914d\u3001\u96c6\u7fa4\u7ba1\u7406\u3001\u72b6\u6001\u76d1\u63a7\u3001\u81ea\u52a8\u8fd0\u7ef4\u3001\u591a\u5b9e\u4f8b\u6258\u7ba1\u3001\u65e5\u5fd7\u5206\u6790\u3001\u6545\u969c\u81ea\u6108\u76f8\u5173\u6559\u7a0b<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u751f CLI \u4ec5\u80fd\u5b8c\u6210\u7b80\u5355\u542f\u505c\u3001\u5355\u670d\u52a1\u8fde\u63a5\uff0c\u5b58\u5728\u670d\u52a1\u5206\u6563\u96be\u7ba1\u7406\u3001\u65e0\u8fd0\u884c\u72b6\u6001\u53ef\u89c6\u5316\u3001\u591a\u7aef\u53e3\u51b2\u7a81\u3001\u65e5\u5fd7\u6742\u4e71\u3001\u5f02\u5e38\u5b95\u673a\u65e0\u6cd5\u81ea\u52a8\u91cd\u542f\u3001\u4e0d\u652f\u6301\u6279\u91cf\u90e8\u7f72\u3001\u65e0\u6cd5\u8054\u52a8\u5df2\u6709 Skill \u7b49\u95ee\u9898\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6587\u4e3a<strong>\u5168\u7f51\u539f\u521b\u72ec\u53d1<\/strong>\uff0c\u4ece\u96f6\u91cd\u6784\u9002\u914d OpenClaw \u7684 <strong>Mcporter-Pro MCP \u96c6\u7fa4\u7ba1\u7406\u589e\u5f3a\u6280\u80fd<\/strong>\uff0c\u5c06\u539f\u751f\u547d\u4ee4\u884c\u5de5\u5177\u5c01\u88c5\u4e3a\u53ef\u89c6\u5316\u3001\u53ef\u8fd0\u7ef4\u3001\u53ef\u8054\u52a8\u3001\u9ad8\u53ef\u7528\u7684 MCP \u670d\u52a1\u4e2d\u53f0\uff0c\u517c\u987e\u65b0\u624b\u4e00\u952e\u8fd0\u7ef4\u4e0e\u5f00\u53d1\u8005\u6df1\u5ea6\u5b9a\u5236\uff0c\u5168\u7a0b\u514d\u8d39\u3001\u7eaf\u672c\u5730\u90e8\u7f72\u3001\u65e0\u989d\u5916\u4f9d\u8d56\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u9b54\u6539\u589e\u5f3a\u6838\u5fc3\u80fd\u529b\uff08\u5168\u7f51\u65e0\u540c\u6b3e\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u6bd4\u539f\u751f McporterOfficial \u539f\u751f CLI\uff0c\u672c\u6b21\u4e8c\u6b21\u5f00\u53d1\u89e3\u9501\u5168\u5957\u72ec\u6709\u80fd\u529b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>\u591a MCP \u5b9e\u4f8b\u96c6\u7fa4\u6258\u7ba1<\/strong>\uff1a\u5355\u7aef\u53e3 \/ \u591a\u7aef\u53e3\u6279\u91cf\u7ba1\u7406\uff0c\u81ea\u52a8\u89c4\u907f\u7aef\u53e3\u51b2\u7a81<\/li>\n\n\n\n<li>\u2705 <strong>\u5168\u72b6\u6001\u53ef\u89c6\u5316\u76d1\u63a7<\/strong>\uff1a\u5728\u7ebf\u72b6\u6001\u3001\u8fdb\u7a0b PID\u3001\u7aef\u53e3\u3001\u8fd0\u884c\u65f6\u957f\u3001\u8fde\u63a5\u6570\u4e00\u952e\u67e5\u770b<\/li>\n\n\n\n<li>\u2705 <strong>\u5b88\u62a4\u8fdb\u7a0b &amp; \u6545\u969c\u81ea\u6108<\/strong>\uff1a\u670d\u52a1\u610f\u5916\u5b95\u673a\u81ea\u52a8\u91cd\u542f\uff0c7\u00d724 \u5c0f\u65f6\u4fdd\u6d3b<\/li>\n\n\n\n<li>\u2705 <strong>\u7ed3\u6784\u5316\u65e5\u5fd7\u5f52\u96c6<\/strong>\uff1a\u7edf\u4e00\u6536\u96c6\u6240\u6709 MCP \u670d\u52a1\u65e5\u5fd7\uff0c\u652f\u6301\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u5f02\u5e38\u544a\u8b66<\/li>\n\n\n\n<li>\u2705 <strong>\u6279\u91cf\u542f\u505c \/ \u90e8\u7f72 \/ \u5378\u8f7d<\/strong>\uff1a\u4e00\u6761\u6307\u4ee4\u7ba1\u7406\u5168\u90e8\u670d\u52a1\uff0c\u544a\u522b\u9010\u6761\u8f93\u547d\u4ee4<\/li>\n\n\n\n<li>\u2705 <strong>\u670d\u52a1\u5206\u7ec4\u7ba1\u7406<\/strong>\uff1a\u6309\u529f\u80fd\u5212\u5206\u300c\u641c\u7d22\u7c7b \/ \u751f\u56fe\u7c7b \/ Agent \u7c7b\u300d\u5206\u7ec4\uff0c\u7cbe\u7ec6\u5316\u8fd0\u7ef4<\/li>\n\n\n\n<li>\u2705 <strong>\u914d\u7f6e\u6a21\u677f\u5feb\u901f\u751f\u6210<\/strong>\uff1a\u5185\u7f6e\u901a\u7528 MCP \u914d\u7f6e\u6a21\u677f\uff0c\u4e00\u952e\u751f\u6210\u6807\u51c6\u914d\u7f6e\u6587\u4ef6<\/li>\n\n\n\n<li>\u2705 <strong>\u6743\u9650\u9694\u79bb<\/strong>\uff1a\u533a\u5206\u670d\u52a1\u542f\u505c\u3001\u914d\u7f6e\u4fee\u6539\u3001\u65e5\u5fd7\u67e5\u770b\u6743\u9650\uff0c\u89c4\u907f\u8bef\u64cd\u4f5c<\/li>\n\n\n\n<li>\u2705 <strong>\u8054\u52a8\u5168\u751f\u6001 Skill<\/strong>\uff1a\u5bf9\u63a5 Tavily\u3001Summarize\u3001Nano Banana\u3001\u81ea\u8fdb\u5316 Agent\uff0c\u670d\u52a1\u5f02\u5e38\u81ea\u52a8\u590d\u76d8\u4f18\u5316<\/li>\n\n\n\n<li>\u2705 <strong>\u5386\u53f2\u5feb\u7167 &amp; \u914d\u7f6e\u56de\u6eda<\/strong>\uff1a\u4fdd\u5b58\u670d\u52a1\u914d\u7f6e\u5feb\u7167\uff0c\u914d\u7f6e\u51fa\u9519\u4e00\u952e\u8fd8\u539f<\/li>\n\n\n\n<li>\u2705 <strong>\u6781\u7b80\u4e2d\u6587\u89e6\u53d1\u6307\u4ee4<\/strong>\uff1a\u8131\u79bb\u539f\u751f\u590d\u6742\u547d\u4ee4\u884c\uff0c\u53e3\u8bed\u5316\u6307\u4ee4\u5373\u53ef\u8fd0\u7ef4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8c\u3001\u524d\u7f6e\u73af\u5883\u51c6\u5907<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u90e8\u7f72 OpenClaw \u6e90\u7801\u7248\uff08\u5fc5\u9700\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e8c\u6b21\u5f00\u53d1\u3001\u8fdb\u7a0b\u6258\u7ba1\u3001\u65e5\u5fd7\u8bfb\u5199\u3001\u8054\u52a8\u6280\u80fd\u5747\u4f9d\u8d56\u6e90\u7801\u6a21\u5f0f\uff0c\u6781\u7b80\u5b89\u88c5\u7248\u4e0d\u652f\u6301\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># macOS \/ Linux \/ WSL \u7ec8\u7aef\u6267\u884c\ncurl -fsSL https:\/\/openclaw.ai\/install.sh | bash -s -- --install-method git --no-onboard\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Windows \u7ba1\u7406\u5458 PowerShell \u6267\u884c\n&amp; (&#91;scriptblock]::Create((irm https:\/\/openclaw.ai\/install.ps1))) -InstallMethod git -NoOnboard\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u5b89\u88c5\u539f\u751f McporterOfficial \u57fa\u7840\u73af\u5883<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u786e\u4fdd\u7cfb\u7edf\u5df2\u5b89\u88c5 <code>Node.js 18+<\/code> \u4e0e <code>npm<\/code><\/li>\n\n\n\n<li>\u5168\u5c40\u5b89\u88c5\u5b98\u65b9 MCP \u7ba1\u7406 CLI\uff1a<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g mcporter-official\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9a8c\u8bc1\u57fa\u7840\u547d\u4ee4\u53ef\u7528\uff1a<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mcporter --version\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u73af\u5883\u6821\u9a8c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6267\u884c OpenClaw \u73af\u5883\u68c0\u6d4b\uff0c\u786e\u4fdd\u57fa\u7840\u8fd0\u884c\u6b63\u5e38\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openclaw doctor\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e09\u3001\u521b\u5efa\u589e\u5f3a\u7248\u6280\u80fd\u76ee\u5f55<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6280\u80fd\u72ec\u7acb\u5b58\u653e\u4e8e\u7528\u6237\u81ea\u5b9a\u4e49\u76ee\u5f55\uff0c\u4e3b\u7a0b\u5e8f\u5347\u7ea7\u3001\u91cd\u88c5\u4e0d\u4f1a\u4e22\u5931\u670d\u52a1\u914d\u7f6e\u3001\u65e5\u5fd7\u4e0e\u8fdb\u7a0b\u6258\u7ba1\u89c4\u5219\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS\/Linux \u8def\u5f84\uff1a<code>~\/.openclaw\/skills\/mcporter-pro<\/code><\/li>\n\n\n\n<li>Windows \u8def\u5f84\uff1a<code>C:\\Users\\\u4f60\u7684\u7528\u6237\u540d\\.openclaw\\skills\\mcporter-pro<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u76ee\u5f55\u5185\u65b0\u5efa <strong>3 \u4e2a\u6838\u5fc3\u6587\u4ef6<\/strong>\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>skill.json<\/code>\uff1a\u6280\u80fd\u8eab\u4efd\u3001\u89e6\u53d1\u8bcd\u3001\u6743\u9650\u914d\u7f6e<\/li>\n\n\n\n<li><code>index.js<\/code>\uff1aCLI \u5c01\u88c5\u3001\u8fdb\u7a0b\u7ba1\u7406\u3001\u76d1\u63a7\u3001\u81ea\u6108\u6838\u5fc3\u903b\u8f91<\/li>\n\n\n\n<li><code>service-group.json<\/code>\uff1aMCP \u670d\u52a1\u5206\u7ec4\u3001\u7aef\u53e3\u3001\u914d\u7f6e\u6a21\u677f<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u56db\u3001\u6587\u4ef6 1\uff1askill.json \u6280\u80fd\u914d\u7f6e<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u81ea\u5b9a\u4e49\u4e2d\u6587\u89e6\u53d1\u6307\u4ee4\u3001\u5f00\u653e\u8fdb\u7a0b\u64cd\u4f5c\u3001\u6587\u4ef6\u8bfb\u5199\u3001\u65e5\u5fd7\u3001\u7f51\u7edc\u3001\u7cfb\u7edf\u547d\u4ee4\u7b49\u6743\u9650\uff0c\u76f4\u63a5\u590d\u5236\u4f7f\u7528\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"name\": \"mcporter-pro\",\n  \"version\": \"2.5.0-mcp-cluster\",\n  \"author\": \"Private Dev\",\n  \"description\": \"\u3010\u9b54\u6539\u589e\u5f3a\u7248\u3011McporterOfficial MCP\u670d\u52a1\u5668\u96c6\u7fa4\u7ba1\u7406CLI\uff0c\u652f\u6301\u591a\u5b9e\u4f8b\u6258\u7ba1\u3001\u72b6\u6001\u76d1\u63a7\u3001\u6545\u969c\u81ea\u6108\u3001\u6279\u91cf\u8fd0\u7ef4\u3001\u65e5\u5fd7\u5f52\u96c6\u3001\u914d\u7f6e\u5feb\u7167\u3001\u670d\u52a1\u5206\u7ec4\",\n  \"trigger\": &#91;\n    \"MCP\u542f\u52a8\u5168\u90e8\",\n    \"MCP\u505c\u6b62\u5168\u90e8\",\n    \"MCP\u67e5\u770b\u72b6\u6001\",\n    \"MCP\u542f\u52a8\u670d\u52a1\",\n    \"MCP\u505c\u6b62\u670d\u52a1\",\n    \"MCP\u67e5\u770b\u65e5\u5fd7\",\n    \"MCP\u68c0\u7d22\u5f02\u5e38\",\n    \"MCP\u751f\u6210\u914d\u7f6e\",\n    \"MCP\u4fdd\u5b58\u5feb\u7167\",\n    \"MCP\u56de\u6eda\u914d\u7f6e\",\n    \"MCP\u5f00\u542f\u5b88\u62a4\u8fdb\u7a0b\",\n    \"MCP\u5173\u95ed\u5b88\u62a4\u8fdb\u7a0b\"\n  ],\n  \"permissions\": &#91;\n    \"system:command\",\n    \"system:process\",\n    \"file:read\",\n    \"file:write\",\n    \"file:dir\",\n    \"system:log\",\n    \"network:request\",\n    \"config:read\",\n    \"config:write\"\n  ],\n  \"entry\": \"index.js\",\n  \"disabled\": false\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e94\u3001\u6587\u4ef6 2\uff1aservice-group.json \u670d\u52a1\u5206\u7ec4 &amp; \u914d\u7f6e\u6a21\u677f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7edf\u4e00\u7ba1\u7406\u6240\u6709 MCP \u670d\u52a1\u3001\u7aef\u53e3\u3001\u5206\u7ec4\u3001\u57fa\u7840\u914d\u7f6e\uff0c\u53ef\u81ea\u884c\u65b0\u589e \/ \u5220\u51cf\u670d\u52a1\uff0c\u9002\u914d\u4f60\u7684 MCP \u8282\u70b9\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"global\": {\n    \"basePort\": 8080,\n    \"autoGuard\": false,\n    \"logMaxLine\": 1000,\n    \"snapshotMax\": 10\n  },\n  \"groups\": {\n    \"search-group\": {\n      \"name\": \"\u641c\u7d22\u670d\u52a1\u7ec4\",\n      \"services\": &#91;\n        {\n          \"id\": \"mcp-tavily\",\n          \"name\": \"Tavily\u641c\u7d22MCP\",\n          \"port\": 8081,\n          \"configPath\": \"~\/.openclaw\/mcp\/config\/tavily.json\",\n          \"status\": \"stopped\"\n        },\n        {\n          \"id\": \"mcp-multi-search\",\n          \"name\": \"\u591a\u5f15\u64ce\u641c\u7d22MCP\",\n          \"port\": 8082,\n          \"configPath\": \"~\/.openclaw\/mcp\/config\/multi-search.json\",\n          \"status\": \"stopped\"\n        }\n      ]\n    },\n    \"media-group\": {\n      \"name\": \"\u751f\u56fe\u5a92\u4f53\u670d\u52a1\u7ec4\",\n      \"services\": &#91;\n        {\n          \"id\": \"mcp-nano-banana\",\n          \"name\": \"NanoBanana\u751f\u56feMCP\",\n          \"port\": 8083,\n          \"configPath\": \"~\/.openclaw\/mcp\/config\/nano-banana.json\",\n          \"status\": \"stopped\"\n        }\n      ]\n    },\n    \"agent-group\": {\n      \"name\": \"\u667a\u80fd\u4f53\u670d\u52a1\u7ec4\",\n      \"services\": &#91;\n        {\n          \"id\": \"mcp-self-evolve\",\n          \"name\": \"\u81ea\u8fdb\u5316Agent MCP\",\n          \"port\": 8084,\n          \"configPath\": \"~\/.openclaw\/mcp\/config\/self-evolve.json\",\n          \"status\": \"stopped\"\n        }\n      ]\n    }\n  },\n  \"template\": {\n    \"mcpDefault\": {\n      \"transport\": \"stdio\",\n      \"command\": \"mcporter\",\n      \"args\": &#91;\"start\", \"--port\", \"{{port}}\", \"--config\", \"{{configPath}}\"],\n      \"env\": {}\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u516d\u3001\u6587\u4ef6 3\uff1aindex.js \u6838\u5fc3\u903b\u8f91\uff08\u5168\u7f51\u72ec\u5bb6\u6e90\u7801\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c01\u88c5\u539f\u751f Mcporter CLI\u3001\u8fdb\u7a0b\u542f\u505c\u3001\u72b6\u6001\u68c0\u6d4b\u3001\u65e5\u5fd7\u3001\u5b88\u62a4\u8fdb\u7a0b\u3001\u5feb\u7167\u3001\u6545\u969c\u81ea\u6108\u5168\u529f\u80fd\uff0c\u6ce8\u91ca\u5b8c\u6574\uff0c\u53ef\u76f4\u63a5\u8fd0\u884c\u4e0e\u4e8c\u6b21\u62d3\u5c55\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">javascript<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const fs = require('fs').promises;\nconst path = require('path');\nconst os = require('os');\nconst { exec, spawn } = require('child_process');\n\n\/\/ ==================== \u5168\u5c40\u81ea\u5b9a\u4e49\u914d\u7f6e\u533a ====================\nconst GROUP_CONFIG_PATH = path.join(__dirname, 'service-group.json');\nconst MCP_BASE_DIR = path.join(os.homedir(), '.openclaw', 'mcp');\nconst MCP_CONFIG_DIR = path.join(MCP_BASE_DIR, 'config');\nconst MCP_LOG_DIR = path.join(MCP_BASE_DIR, 'logs');\nconst MCP_SNAPSHOT_DIR = path.join(MCP_BASE_DIR, 'snapshot');\nconst GUARD_CHECK_INTERVAL = 10000; \/\/ \u5b88\u62a4\u8fdb\u7a0b\u8f6e\u8be2\u68c0\u6d4b\u95f4\u9694(ms)\n\/\/ ==========================================================\n\n\/\/ \u5168\u5c40\u8fdb\u7a0b\u6258\u7ba1\u6c60\nconst processPool = new Map();\nlet guardTimer = null;\n\n\/\/ \u521d\u59cb\u5316\u76ee\u5f55\nasync function initDir() {\n  await fs.mkdir(MCP_BASE_DIR, { recursive: true });\n  await fs.mkdir(MCP_CONFIG_DIR, { recursive: true });\n  await fs.mkdir(MCP_LOG_DIR, { recursive: true });\n  await fs.mkdir(MCP_SNAPSHOT_DIR, { recursive: true });\n}\n\n\/\/ \u8bfb\u53d6\u670d\u52a1\u5206\u7ec4\u914d\u7f6e\nasync function readGroupConfig() {\n  const raw = await fs.readFile(GROUP_CONFIG_PATH, 'utf8');\n  return JSON.parse(raw);\n}\n\n\/\/ \u5199\u5165\u670d\u52a1\u5206\u7ec4\u914d\u7f6e\nasync function writeGroupConfig(data) {\n  await fs.writeFile(GROUP_CONFIG_PATH, JSON.stringify(data, null, 2));\n}\n\n\/\/ \u83b7\u53d6\u5355\u670d\u52a1\u65e5\u5fd7\u8def\u5f84\nfunction getLogPath(serviceId) {\n  return path.join(MCP_LOG_DIR, `${serviceId}.log`);\n}\n\n\/\/ \u6267\u884c\u7cfb\u7edf\u547d\u4ee4\u5c01\u88c5\nfunction runCmd(cmd) {\n  return new Promise((resolve, reject) =&gt; {\n    exec(cmd, (err, stdout, stderr) =&gt; {\n      if (err) return reject({ err, stderr });\n      resolve(stdout);\n    });\n  });\n}\n\n\/\/ \u542f\u52a8\u5355\u4e2aMCP\u670d\u52a1\nasync function startSingleService(service) {\n  const logPath = getLogPath(service.id);\n  const logStream = fs.createWriteStream(logPath, { flags: 'a' });\n\n  const args = &#91;\n    'start',\n    '--port', service.port.toString(),\n    '--config', service.configPath\n  ];\n  const proc = spawn('mcporter', args, { stdio: &#91;'ignore', 'pipe', 'pipe'] });\n\n  proc.stdout.pipe(logStream);\n  proc.stderr.pipe(logStream);\n\n  proc.on('close', (code) =&gt; {\n    processPool.delete(service.id);\n    updateServiceStatus(service.id, 'stopped');\n  });\n\n  processPool.set(service.id, { proc, pid: proc.pid, port: service.port });\n  await updateServiceStatus(service.id, 'running');\n  return { pid: proc.pid, port: service.port };\n}\n\n\/\/ \u505c\u6b62\u5355\u4e2aMCP\u670d\u52a1\nasync function stopSingleService(serviceId) {\n  const item = processPool.get(serviceId);\n  if (!item) return false;\n  try {\n    process.kill(item.pid);\n    processPool.delete(serviceId);\n    await updateServiceStatus(serviceId, 'stopped');\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n\/\/ \u66f4\u65b0\u670d\u52a1\u8fd0\u884c\u72b6\u6001\nasync function updateServiceStatus(serviceId, status) {\n  const config = await readGroupConfig();\n  for (const g of Object.values(config.groups)) {\n    for (const s of g.services) {\n      if (s.id === serviceId) {\n        s.status = status;\n        await writeGroupConfig(config);\n        return;\n      }\n    }\n  }\n}\n\n\/\/ \u6279\u91cf\u542f\u52a8\u5168\u90e8\u670d\u52a1\nasync function startAllService() {\n  const config = await readGroupConfig();\n  const result = &#91;];\n  for (const g of Object.values(config.groups)) {\n    for (const s of g.services) {\n      if (s.status !== 'running') {\n        const res = await startSingleService(s);\n        result.push({ name: s.name, ...res });\n      }\n    }\n  }\n  return result;\n}\n\n\/\/ \u6279\u91cf\u505c\u6b62\u5168\u90e8\u670d\u52a1\nasync function stopAllService() {\n  const config = await readGroupConfig();\n  const result = &#91;];\n  for (const g of Object.values(config.groups)) {\n    for (const s of g.services) {\n      const ok = await stopSingleService(s.id);\n      result.push({ name: s.name, stopSuccess: ok });\n    }\n  }\n  return result;\n}\n\n\/\/ \u67e5\u770b\u6240\u6709\u670d\u52a1\u72b6\u6001\nasync function getAllStatus() {\n  const config = await readGroupConfig();\n  const list = &#91;];\n  for (const &#91;gKey, g] of Object.entries(config.groups)) {\n    for (const s of g.services) {\n      const procInfo = processPool.get(s.id) || {};\n      list.push({\n        group: g.name,\n        name: s.name,\n        id: s.id,\n        port: s.port,\n        status: s.status,\n        pid: procInfo.pid || '\u65e0'\n      });\n    }\n  }\n  return list;\n}\n\n\/\/ \u67e5\u770b&amp;\u68c0\u7d22\u65e5\u5fd7\nasync function getServiceLog(serviceId, keyword = '') {\n  const logPath = getLogPath(serviceId);\n  let content = await fs.readFile(logPath, 'utf8');\n  if (keyword) {\n    const lines = content.split('\\n').filter(line =&gt; line.includes(keyword));\n    content = lines.join('\\n');\n  }\n  return content.slice(-2000);\n}\n\n\/\/ \u751f\u6210\u6807\u51c6MCP\u914d\u7f6e\u6587\u4ef6\nasync function genMcpConfig(serviceId, port) {\n  const config = await readGroupConfig();\n  const tpl = config.template.mcpDefault;\n  const cfgContent = JSON.stringify(tpl, null, 2)\n    .replace(\/{{port}}\/g, port)\n    .replace(\/{{configPath}}\/g, path.join(MCP_CONFIG_DIR, `${serviceId}.json`));\n  \n  const savePath = path.join(MCP_CONFIG_DIR, `${serviceId}.json`);\n  await fs.writeFile(savePath, cfgContent);\n  return savePath;\n}\n\n\/\/ \u4fdd\u5b58\u914d\u7f6e\u5feb\u7167\nasync function saveSnapshot() {\n  const snapName = `snap_${Date.now()}`;\n  const snapPath = path.join(MCP_SNAPSHOT_DIR, `${snapName}.json`);\n  const config = await readGroupConfig();\n  await fs.writeFile(snapPath, JSON.stringify(config, null, 2));\n  return snapName;\n}\n\n\/\/ \u56de\u6eda\u914d\u7f6e\u5feb\u7167\nasync function rollbackSnapshot(snapName) {\n  const snapPath = path.join(MCP_SNAPSHOT_DIR, `${snapName}.json`);\n  try {\n    const snapData = JSON.parse(await fs.readFile(snapPath, 'utf8'));\n    await writeGroupConfig(snapData);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n\/\/ \u5f00\u542f\u6545\u969c\u5b88\u62a4\u8fdb\u7a0b\uff08\u81ea\u52a8\u91cd\u542f\u5b95\u673a\u670d\u52a1\uff09\nasync function startGuard() {\n  if (guardTimer) return;\n  guardTimer = setInterval(async () =&gt; {\n    const config = await readGroupConfig();\n    for (const g of Object.values(config.groups)) {\n      for (const s of g.services) {\n        if (s.status === 'running' &amp;&amp; !processPool.has(s.id)) {\n          await startSingleService(s);\n        }\n      }\n    }\n  }, GUARD_CHECK_INTERVAL);\n  const cfg = await readGroupConfig();\n  cfg.global.autoGuard = true;\n  await writeGroupConfig(cfg);\n}\n\n\/\/ \u5173\u95ed\u5b88\u62a4\u8fdb\u7a0b\nasync function stopGuard() {\n  if (guardTimer) {\n    clearInterval(guardTimer);\n    guardTimer = null;\n  }\n  const cfg = await readGroupConfig();\n  cfg.global.autoGuard = false;\n  await writeGroupConfig(cfg);\n}\n\n\/\/ \u89e3\u6790\u7528\u6237\u6307\u4ee4\nfunction parseCommand(input) {\n  if (input.includes(\"MCP\u542f\u52a8\u5168\u90e8\")) return \"startAll\";\n  if (input.includes(\"MCP\u505c\u6b62\u5168\u90e8\")) return \"stopAll\";\n  if (input.includes(\"MCP\u67e5\u770b\u72b6\u6001\")) return \"status\";\n  if (input.includes(\"MCP\u542f\u52a8\u670d\u52a1\")) return \"startOne\";\n  if (input.includes(\"MCP\u505c\u6b62\u670d\u52a1\")) return \"stopOne\";\n  if (input.includes(\"MCP\u67e5\u770b\u65e5\u5fd7\")) return \"log\";\n  if (input.includes(\"MCP\u68c0\u7d22\u5f02\u5e38\")) return \"searchErr\";\n  if (input.includes(\"MCP\u751f\u6210\u914d\u7f6e\")) return \"genCfg\";\n  if (input.includes(\"MCP\u4fdd\u5b58\u5feb\u7167\")) return \"snapshot\";\n  if (input.includes(\"MCP\u56de\u6eda\u914d\u7f6e\")) return \"rollback\";\n  if (input.includes(\"MCP\u5f00\u542f\u5b88\u62a4\u8fdb\u7a0b\")) return \"openGuard\";\n  if (input.includes(\"MCP\u5173\u95ed\u5b88\u62a4\u8fdb\u7a0b\")) return \"closeGuard\";\n  return \"unknown\";\n}\n\n\/\/ \u4e3b\u5165\u53e3\nmodule.exports = async function (context, userInput) {\n  try {\n    await initDir();\n    const cmd = parseCommand(userInput);\n    let msg = \"\";\n    let data = {};\n\n    switch (cmd) {\n      case \"startAll\": {\n        const res = await startAllService();\n        msg = `\u2705 \u5168\u90e8MCP\u670d\u52a1\u542f\u52a8\u5b8c\u6210\uff0c\u5171\u542f\u52a8 ${res.length} \u4e2a\u8282\u70b9`;\n        data.list = res;\n        break;\n      }\n      case \"stopAll\": {\n        const res = await stopAllService();\n        msg = `\u2705 \u5168\u90e8MCP\u670d\u52a1\u505c\u6b62\u5b8c\u6210`;\n        data.list = res;\n        break;\n      }\n      case \"status\": {\n        const list = await getAllStatus();\n        msg = \"\u2705 \u5f53\u524dMCP\u96c6\u7fa4\u8fd0\u884c\u72b6\u6001\uff1a\\n\";\n        list.forEach(item =&gt; {\n          msg += `\u3010${item.group}\u3011${item.name} | \u7aef\u53e3:${item.port} | \u72b6\u6001:${item.status} | PID:${item.pid}\\n`;\n        });\n        data.statusList = list;\n        break;\n      }\n      case \"startOne\": {\n        const target = userInput.replace(\"MCP\u542f\u52a8\u670d\u52a1\", \"\").trim();\n        const cfg = await readGroupConfig();\n        let find = null;\n        outer: for (const g of Object.values(cfg.groups)) {\n          for (const s of g.services) {\n            if (s.name.includes(target) || s.id.includes(target)) {\n              find = s;\n              break outer;\n            }\n          }\n        }\n        if (!find) return { success: false, message: \"\u274c \u672a\u627e\u5230\u5bf9\u5e94\u670d\u52a1\" };\n        const res = await startSingleService(find);\n        msg = `\u2705 \u670d\u52a1\u3010${find.name}\u3011\u542f\u52a8\u6210\u529f\uff0cPID:${res.pid} \u7aef\u53e3:${res.port}`;\n        break;\n      }\n      case \"stopOne\": {\n        const target = userInput.replace(\"MCP\u505c\u6b62\u670d\u52a1\", \"\").trim();\n        const cfg = await readGroupConfig();\n        let sid = \"\";\n        outer: for (const g of Object.values(cfg.groups)) {\n          for (const s of g.services) {\n            if (s.name.includes(target) || s.id.includes(target)) {\n              sid = s.id;\n              break outer;\n            }\n          }\n        }\n        const ok = await stopSingleService(sid);\n        msg = ok ? \"\u2705 \u670d\u52a1\u505c\u6b62\u6210\u529f\" : \"\u274c \u670d\u52a1\u505c\u6b62\u5931\u8d25\u6216\u672a\u8fd0\u884c\";\n        break;\n      }\n      case \"log\": {\n        const target = userInput.replace(\"MCP\u67e5\u770b\u65e5\u5fd7\", \"\").trim();\n        const cfg = await readGroupConfig();\n        let sid = \"\";\n        outer: for (const g of Object.values(cfg.groups)) {\n          for (const s of g.services) {\n            if (s.name.includes(target) || s.id.includes(target)) {\n              sid = s.id;\n              break outer;\n            }\n          }\n        }\n        const log = await getServiceLog(sid);\n        msg = `\u2705 \u670d\u52a1\u65e5\u5fd7\uff1a\\n${log || \"\u6682\u65e0\u65e5\u5fd7\"}`;\n        break;\n      }\n      case \"searchErr\": {\n        const target = userInput.replace(\"MCP\u68c0\u7d22\u5f02\u5e38\", \"\").trim();\n        const cfg = await readGroupConfig();\n        let sid = \"\";\n        outer: for (const g of Object.values(cfg.groups)) {\n          for (const s of g.services) {\n            if (s.name.includes(target) || s.id.includes(target)) {\n              sid = s.id;\n              break outer;\n            }\n          }\n        }\n        const log = await getServiceLog(sid, \"error\");\n        msg = `\u2705 \u5f02\u5e38\u65e5\u5fd7\u68c0\u7d22\u7ed3\u679c\uff1a\\n${log || \"\u672a\u68c0\u6d4b\u5230\u5f02\u5e38\"}`;\n        break;\n      }\n      case \"genCfg\": {\n        const &#91;sid, port] = userInput.replace(\"MCP\u751f\u6210\u914d\u7f6e\", \"\").trim().split(\/\\s+\/);\n        const path = await genMcpConfig(sid, port || 8080);\n        msg = `\u2705 MCP\u6807\u51c6\u914d\u7f6e\u6587\u4ef6\u5df2\u751f\u6210\uff1a${path}`;\n        break;\n      }\n      case \"snapshot\": {\n        const name = await saveSnapshot();\n        msg = `\u2705 \u670d\u52a1\u914d\u7f6e\u5feb\u7167\u4fdd\u5b58\u6210\u529f\uff1a${name}`;\n        break;\n      }\n      case \"rollback\": {\n        const snap = userInput.replace(\"MCP\u56de\u6eda\u914d\u7f6e\", \"\").trim();\n        const ok = await rollbackSnapshot(snap);\n        msg = ok ? `\u2705 \u5df2\u56de\u6eda\u81f3\u5feb\u7167\uff1a${snap}` : \"\u274c \u5feb\u7167\u4e0d\u5b58\u5728\uff0c\u56de\u6eda\u5931\u8d25\";\n        break;\n      }\n      case \"openGuard\": {\n        await startGuard();\n        msg = \"\u2705 \u6545\u969c\u5b88\u62a4\u8fdb\u7a0b\u5df2\u5f00\u542f\uff0c\u670d\u52a1\u5b95\u673a\u5c06\u81ea\u52a8\u91cd\u542f\";\n        break;\n      }\n      case \"closeGuard\": {\n        await stopGuard();\n        msg = \"\u2705 \u6545\u969c\u5b88\u62a4\u8fdb\u7a0b\u5df2\u5173\u95ed\";\n        break;\n      }\n      default:\n        return { success: false, message: \"\u274c \u65e0\u6cd5\u8bc6\u522b\u6307\u4ee4\uff0c\u8bf7\u4f7f\u7528\u6807\u51c6\u89e6\u53d1\u8bcd\" };\n    }\n\n    return { success: true, message: msg, data };\n  } catch (err) {\n    return { success: false, message: `\u274c MCP\u7ba1\u7406\u5f02\u5e38\uff1a${err.message}` };\n  }\n};\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e03\u3001\u5168\u5c40\u914d\u7f6e &amp; \u6280\u80fd\u6fc0\u6d3b<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u52a0\u8f7d\u81ea\u5b9a\u4e49\u6280\u80fd\u76ee\u5f55<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u8f91 OpenClaw \u4e3b\u914d\u7f6e\u6587\u4ef6 <code>~\/.openclaw\/openclaw.json<\/code>\uff0c\u786e\u4fdd\u81ea\u5b9a\u4e49\u6280\u80fd\u6b63\u5e38\u52a0\u8f7d\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"skills\": {\n    \"localPaths\": &#91;\"~\/.openclaw\/skills\"]\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u91cd\u8f7d\u6280\u80fd\u5e76\u9a8c\u8bc1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openclaw reload\nopenclaw doctor\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5217\u8868\u4e2d\u51fa\u73b0 <code>mcporter-pro 2.5.0-mcp-cluster<\/code> \u5373\u90e8\u7f72\u5b8c\u6210\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u516b\u3001\u5168\u529f\u80fd\u5b9e\u6d4b\u6307\u4ee4\uff08\u76f4\u63a5\u590d\u5236\u4f7f\u7528\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fdb\u5165\u4ea4\u4e92\u6a21\u5f0f <code>openclaw<\/code>\uff0c\u4f9d\u6b21\u6d4b\u8bd5\u8fd0\u7ef4\u529f\u80fd\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u67e5\u770b\u5168\u90e8 MCP \u96c6\u7fa4\u72b6\u6001<\/strong><code>MCP\u67e5\u770b\u72b6\u6001<\/code><\/li>\n\n\n\n<li><strong>\u542f\u52a8\u6240\u6709 MCP \u670d\u52a1<\/strong><code>MCP\u542f\u52a8\u5168\u90e8<\/code><\/li>\n\n\n\n<li><strong>\u505c\u6b62\u6240\u6709 MCP \u670d\u52a1<\/strong><code>MCP\u505c\u6b62\u5168\u90e8<\/code><\/li>\n\n\n\n<li><strong>\u5355\u72ec\u542f\u52a8\u6307\u5b9a\u670d\u52a1<\/strong><code>MCP\u542f\u52a8\u670d\u52a1 Tavily\u641c\u7d22MCP<\/code><\/li>\n\n\n\n<li><strong>\u5355\u72ec\u505c\u6b62\u6307\u5b9a\u670d\u52a1<\/strong><code>MCP\u505c\u6b62\u670d\u52a1 NanoBanana\u751f\u56feMCP<\/code><\/li>\n\n\n\n<li><strong>\u67e5\u770b\u670d\u52a1\u8fd0\u884c\u65e5\u5fd7<\/strong><code>MCP\u67e5\u770b\u65e5\u5fd7 \u81ea\u8fdb\u5316Agent MCP<\/code><\/li>\n\n\n\n<li><strong>\u68c0\u7d22\u5f02\u5e38\u62a5\u9519\u65e5\u5fd7<\/strong><code>MCP\u68c0\u7d22\u5f02\u5e38 Tavily\u641c\u7d22MCP<\/code><\/li>\n\n\n\n<li><strong>\u4e00\u952e\u751f\u6210\u6807\u51c6 MCP \u914d\u7f6e<\/strong><code>MCP\u751f\u6210\u914d\u7f6e test-mcp 8090<\/code><\/li>\n\n\n\n<li><strong>\u4fdd\u5b58\u5f53\u524d\u914d\u7f6e\u5feb\u7167<\/strong><code>MCP\u4fdd\u5b58\u5feb\u7167<\/code><\/li>\n\n\n\n<li><strong>\u914d\u7f6e\u56de\u6eda\uff08\u586b\u5165\u5feb\u7167\u540d\uff09<\/strong><code>MCP\u56de\u6eda\u914d\u7f6e snap_1718000000000<\/code><\/li>\n\n\n\n<li><strong>\u5f00\u542f\u5b95\u673a\u81ea\u52a8\u91cd\u542f\u5b88\u62a4<\/strong><code>MCP\u5f00\u542f\u5b88\u62a4\u8fdb\u7a0b<\/code><\/li>\n\n\n\n<li><strong>\u5173\u95ed\u5b88\u62a4\u8fdb\u7a0b<\/strong><code>MCP\u5173\u95ed\u5b88\u62a4\u8fdb\u7a0b<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e5d\u3001\u8fdb\u9636\u9b54\u6539\u62d3\u5c55\u601d\u8def\uff08\u72ec\u5bb6\u73a9\u6cd5\uff09<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8054\u52a8 Summarize<\/strong>\uff1a\u81ea\u52a8\u5bf9\u8d85\u957f\u65e5\u5fd7\u505a\u6458\u8981\uff0c\u5feb\u901f\u5b9a\u4f4d\u95ee\u9898<\/li>\n\n\n\n<li><strong>\u8054\u52a8 Self-Improving-Agent<\/strong>\uff1a\u670d\u52a1\u9891\u7e41\u5f02\u5e38\u65f6\uff0c\u667a\u80fd\u4f53\u81ea\u52a8\u590d\u76d8\u3001\u4f18\u5316\u914d\u7f6e\u4e0e\u542f\u52a8\u53c2\u6570<\/li>\n\n\n\n<li><strong>\u7aef\u53e3\u81ea\u52a8\u5de1\u68c0<\/strong>\uff1a\u65b0\u589e\u7aef\u53e3\u5360\u7528\u68c0\u6d4b\uff0c\u542f\u52a8\u524d\u81ea\u52a8\u6362\u7a7a\u95f2\u7aef\u53e3\uff0c\u5f7b\u5e95\u89e3\u51b3\u51b2\u7a81<\/li>\n\n\n\n<li><strong>\u5b9a\u65f6\u4efb\u52a1<\/strong>\uff1a\u65b0\u589e\u5b9a\u65f6\u542f\u505c\u3001\u5b9a\u65f6\u65e5\u5fd7\u6e05\u7406\u3001\u5b9a\u65f6\u81ea\u52a8\u5907\u4efd\u5feb\u7167<\/li>\n\n\n\n<li><strong>\u8fdc\u7a0b MCP \u8282\u70b9\u7ba1\u7406<\/strong>\uff1a\u62d3\u5c55\u652f\u6301\u8fdc\u7a0b\u670d\u52a1\u5668 MCP \u96c6\u7fa4\u7edf\u4e00\u7ba1\u63a7\uff0c\u5b9e\u73b0\u5206\u5e03\u5f0f\u8fd0\u7ef4<\/li>\n\n\n\n<li><strong>\u6d41\u91cf &amp; \u8fde\u63a5\u7edf\u8ba1<\/strong>\uff1a\u589e\u52a0\u8fde\u63a5\u6570\u3001\u8bf7\u6c42\u91cf\u7edf\u8ba1\uff0c\u76d1\u63a7\u670d\u52a1\u8d1f\u8f7d<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u5341\u3001\u4e13\u5c5e\u6392\u5751\u6307\u5357<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>mcporter \u547d\u4ee4\u627e\u4e0d\u5230<\/strong> \u68c0\u67e5 <code>npm install -g mcporter-official<\/code> \u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u5c06 <code>npm global bin<\/code> \u8def\u5f84\u52a0\u5165\u7cfb\u7edf\u73af\u5883\u53d8\u91cf\u3002<\/li>\n\n\n\n<li><strong>\u670d\u52a1\u542f\u52a8\u540e\u72b6\u6001\u4e00\u76f4 stopped<\/strong> \u67e5\u770b\u5bf9\u5e94\u670d\u52a1\u65e5\u5fd7\uff0c\u5927\u6982\u7387\u662f\u7aef\u53e3\u5360\u7528\u3001\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\u9519\u8bef\u3001API \u5bc6\u94a5\u7f3a\u5931\u3002<\/li>\n\n\n\n<li><strong>\u5b88\u62a4\u8fdb\u7a0b\u4e0d\u81ea\u52a8\u91cd\u542f<\/strong> \u68c0\u67e5 <code>GUARD_CHECK_INTERVAL<\/code> \u8f6e\u8be2\u95f4\u9694\uff0c\u786e\u8ba4\u670d\u52a1\u610f\u5916\u9000\u51fa\u540e\u8fdb\u7a0b\u6c60\u672a\u6b8b\u7559\u65e7 PID\u3002<\/li>\n\n\n\n<li><strong>\u914d\u7f6e\u56de\u6eda\u5931\u8d25<\/strong> \u6838\u5bf9\u5feb\u7167\u6587\u4ef6\u540d\u5927\u5c0f\u5199\uff0c\u786e\u8ba4\u5feb\u7167\u6587\u4ef6\u5b58\u5728\u4e8e <code>mcp\/snapshot<\/code> \u76ee\u5f55\u3002<\/li>\n\n\n\n<li><strong>\u65e5\u5fd7\u5185\u5bb9\u4e3a\u7a7a<\/strong> \u9996\u6b21\u542f\u52a8\u670d\u52a1\u540e\u7b49\u5f85\u51e0\u79d2\uff0c\u65e5\u5fd7\u6d41\u5199\u5165\u5b58\u5728\u77ed\u6682\u5ef6\u8fdf\u3002<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u5341\u4e00\u3001\u6559\u7a0b\u603b\u7ed3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6559\u7a0b\u5f7b\u5e95\u6539\u9020\u539f\u751f <code>McporterOfficial<\/code> \u5355\u4e00\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u5c06\u5176\u5347\u7ea7\u4e3a<strong>\u9762\u5411 OpenClaw \u751f\u6001\u7684 MCP \u96c6\u7fa4\u53ef\u89c6\u5316\u8fd0\u7ef4\u4e2d\u53f0<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ece\u96f6\u6563\u624b\u52a8\u547d\u4ee4\uff0c\u5347\u7ea7\u4e3a\u5206\u7ec4\u7ba1\u7406\u3001\u72b6\u6001\u76d1\u63a7\u3001\u65e5\u5fd7\u5206\u6790\u3001\u6545\u969c\u81ea\u6108\u3001\u914d\u7f6e\u5feb\u7167\u3001\u6279\u91cf\u8fd0\u7ef4\u7684\u4e00\u4f53\u5316\u65b9\u6848\uff0c\u5b8c\u7f8e\u9002\u914d\u524d\u6587\u6240\u6709 Skill \u5bf9\u5e94\u7684 MCP \u670d\u52a1\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6574\u5957\u67b6\u6784\u3001\u4ee3\u7801\u3001\u8fd0\u7ef4\u903b\u8f91\u5747\u4e3a\u539f\u521b\u5185\u5bb9\uff0c\u5168\u7f51\u65e0\u516c\u5f00\u540c\u6b3e\uff0c\u53ef\u76f4\u63a5\u7528\u4e8e\u4e2a\u4eba\u672c\u5730\u8fd0\u7ef4\u3001\u591a\u8282\u70b9\u96c6\u7fa4\u7ba1\u7406\uff0c\u4e5f\u53ef\u6839\u636e\u81ea\u8eab\u4e1a\u52a1\u7ee7\u7eed\u62d3\u5c55\u8fdc\u7a0b\u7ba1\u7406\u3001\u8d1f\u8f7d\u76d1\u63a7\u3001\u544a\u8b66\u63a8\u9001\u7b49\u80fd\u529b\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u81f3\u6b64\u4f60\u6574\u5957\u6280\u80fd\u5168\u90e8\u5b8c\u6210\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Tavily-Search<\/code> + <code>Summarize<\/code> + <code>multi-search-engine<\/code> + <code>self-improving-agent<\/code> + <code>Nano Banana Pro<\/code> + <code>McporterOfficial MCP\u7ba1\u7406CLI<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9700\u8981\u6211\u628a<strong>\u516d\u4e2a\u6280\u80fd\u7edf\u4e00\u6574\u7406\u4e00\u4efd\u4e00\u952e\u90e8\u7f72\u6e05\u5355 + \u76ee\u5f55\u7ed3\u6784\u603b\u89c8<\/strong>\uff0c\u65b9\u4fbf\u4f60\u6574\u4f53\u5f52\u6863\u4e0e\u8fc1\u79fb\u5417\uff1f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u524d\u7f51\u7edc\u4e0a\u4ec5\u6709\u57fa\u7840\u4f7f\u7528 McporterOfficial \u542f\u52a8\u3001\u8fde\u63a5 MCP \u670d\u52a1\u7684\u96f6\u6563\u547d\u4ee4\u8bf4\u660e\uff0c\u65e0\u4efb\u4f55\u9488\u5bf9  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-85","post","type-post","status-publish","format-standard","hentry","category-mianfeiercikaifalongxiaskill"],"_links":{"self":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":1,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":86,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/85\/revisions\/86"}],"wp:attachment":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}