{"id":93860,"date":"2026-08-13T10:41:11","date_gmt":"2026-08-13T02:41:11","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/93860.html"},"modified":"2026-08-13T10:41:11","modified_gmt":"2026-08-13T02:41:11","slug":"mcp-%e5%8d%8f%e8%ae%ae%e5%bc%80%e5%8f%91%e5%ae%9e%e6%88%98%ef%bc%9a%e4%bb%8e%e9%9b%b6%e6%90%ad%e5%bb%ba%e6%97%a0%e7%8a%b6%e6%80%81-ai-agent-%e6%9c%8d%e5%8a%a1%e5%99%a8","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/93860.html","title":{"rendered":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668"},"content":{"rendered":"<hr \/>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260813024108-6a7d2ec409627.jpg\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<hr \/>\n<h2>MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218&#xff1a;\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668<\/h2>\n<hr \/>\n<h3>\u6458\u8981<\/h3>\n<p>Model Context Protocol&#xff08;MCP&#xff09;\u662f\u7531 Anthropic \u4e8e 2024 \u5e74 11 \u6708\u63a8\u51fa\u7684\u5f00\u653e\u6807\u51c6\u534f\u8bae&#xff0c;\u65e8\u5728\u7edf\u4e00\u5927\u8bed\u8a00\u6a21\u578b&#xff08;LLM&#xff09;\u4e0e\u5916\u90e8\u6570\u636e\u6e90\u3001\u5de5\u5177\u4e4b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f\u30022026 \u5e74 7 \u6708 28 \u65e5&#xff0c;MCP \u53d1\u5e03\u4e86\u5177\u6709\u91cc\u7a0b\u7891\u610f\u4e49\u7684 v2 \u89c4\u8303&#xff08;\u534f\u8bae\u7248\u672c\u53f7 2026-07-28&#xff09;&#xff0c;\u6838\u5fc3\u67b6\u6784\u4ece\u6709\u72b6\u6001\u3001\u4f1a\u8bdd\u7ed1\u5b9a\u5168\u9762\u8f6c\u5411\u65e0\u72b6\u6001\u3001\u8bf7\u6c42\u81ea\u5305\u542b\u7684\u5206\u5e03\u5f0f\u53cb\u597d\u6a21\u578b\u3002\u8fd9\u4e00\u53d8\u9769\u4f7f\u5f97 MCP \u670d\u52a1\u5668\u53ef\u4ee5\u50cf\u666e\u901a\u5fae\u670d\u52a1\u4e00\u6837\u90e8\u7f72\u3001\u6269\u5c55\u548c\u8fd0\u7ef4\u3002<\/p>\n<p>\u672c\u6587\u662f\u4e00\u7bc7\u9762\u5411\u96f6\u57fa\u7840\u5f00\u53d1\u8005\u7684\u5b8c\u6574\u5b9e\u6218\u6559\u7a0b&#xff0c;\u5c06\u4ece MCP \u6838\u5fc3\u6982\u5ff5\u8bb2\u8d77&#xff0c;\u624b\u628a\u624b\u5e26\u4f60\u5b8c\u6210\u4e00\u4e2a\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668\u7684\u5168\u6d41\u7a0b\u5f00\u53d1&#xff1a;\u73af\u5883\u642d\u5efa\u3001\u4ee3\u7801\u7f16\u5199\u3001\u5de5\u5177\u5b9a\u4e49\u3001\u8d44\u6e90\u6620\u5c04\u3001\u672c\u5730\u8c03\u8bd5\u3001\u751f\u4ea7\u90e8\u7f72\u3001\u6027\u80fd\u4f18\u5316\u3001\u5b89\u5168\u63a7\u5236&#xff0c;\u76f4\u81f3\u6784\u5efa\u591a\u5de5\u5177\u534f\u540c\u7684 Agent \u94fe\u3002\u5168\u6587\u4ee5 Python SDK&#xff08;FastMCP \u6846\u67b6&#xff09;\u4e3a\u4e3b\u7ebf&#xff0c;\u8f85\u4ee5 TypeScript \u5b9e\u73b0\u5bf9\u7167&#xff0c;\u6240\u6709\u4ee3\u7801\u5747\u53ef\u76f4\u63a5\u590d\u5236\u8fd0\u884c\u3002<\/p>\n<p>\u9002\u7528\u8bfb\u8005&#xff1a;\u6709\u57fa\u672c Python\/TypeScript \u7f16\u7a0b\u80fd\u529b&#xff0c;\u5e0c\u671b\u5feb\u901f\u63a5\u5165 AI Agent \u751f\u6001\u7684\u540e\u7aef\u5f00\u53d1\u8005\u3001\u5168\u6808\u5de5\u7a0b\u5e08\u3001AI \u5e94\u7528\u67b6\u6784\u5e08\u3002<\/p>\n<p>\u524d\u7f6e\u8981\u6c42&#xff1a;Python 3.10&#043; \u6216 Node.js 18&#043;&#xff0c;\u57fa\u672c\u7684 HTTP\/REST \u6982\u5ff5&#xff0c;\u4e86\u89e3 JSON \u6570\u636e\u683c\u5f0f\u3002<\/p>\n<p>\u9884\u8ba1\u9605\u8bfb\u4e0e\u5b9e\u64cd\u65f6\u95f4&#xff1a;3-4 \u5c0f\u65f6&#xff08;\u542b\u4ee3\u7801\u5b9e\u64cd&#xff09;<\/p>\n<hr \/>\n<h3>\u76ee\u5f55<\/h3>\n<ul>\n<li>\n<p>\u4e00\u3001MCP \u6838\u5fc3\u6982\u5ff5\u89e3\u6790\u4e0e\u65e0\u72b6\u6001\u67b6\u6784\u4f18\u52bf<\/p>\n<ul>\n<li>1.1 \u4ec0\u4e48\u662f MCP&#xff1f;\u89e3\u51b3\u4ec0\u4e48\u95ee\u9898&#xff1f;<\/li>\n<li>1.2 MCP \u534f\u8bae\u67b6\u6784\u5168\u666f<\/li>\n<li>1.3 \u4e09\u5927\u6838\u5fc3\u539f\u8bed&#xff1a;Tools\u3001Resources\u3001Prompts<\/li>\n<li>1.4 \u4f20\u8f93\u5c42\u6f14\u8fdb&#xff1a;\u4ece stdio \u5230 Streamable HTTP<\/li>\n<li>1.5 \u65e0\u72b6\u6001\u67b6\u6784\u7684\u6838\u5fc3\u4f18\u52bf<\/li>\n<li>1.6 MCP v2 \u89c4\u8303\u5173\u952e\u53d8\u66f4\u603b\u7ed3<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u4e8c\u3001\u5f00\u53d1\u73af\u5883\u642d\u5efa\u4e0e\u4f9d\u8d56\u5e93\u5feb\u901f\u5b89\u88c5<\/p>\n<ul>\n<li>2.1 Python \u73af\u5883\u51c6\u5907<\/li>\n<li>2.2 TypeScript\/Node.js \u73af\u5883\u51c6\u5907<\/li>\n<li>2.3 MCP SDK \u5b89\u88c5\u4e0e\u7248\u672c\u786e\u8ba4<\/li>\n<li>2.4 \u5f00\u53d1\u5de5\u5177\u94fe\u914d\u7f6e&#xff08;IDE\u3001\u8c03\u8bd5\u5668\u3001Inspector&#xff09;<\/li>\n<li>2.5 \u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u89c4\u5212<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u4e09\u3001\u521d\u59cb\u5316\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668\u57fa\u7840\u4ee3\u7801<\/p>\n<ul>\n<li>3.1 FastMCP \u6846\u67b6\u5feb\u901f\u5165\u95e8<\/li>\n<li>3.2 \u6700\u5c0f\u53ef\u8fd0\u884c\u670d\u52a1\u5668&#xff08;Python \u7248&#xff09;<\/li>\n<li>3.3 \u6700\u5c0f\u53ef\u8fd0\u884c\u670d\u52a1\u5668&#xff08;TypeScript \u7248&#xff09;<\/li>\n<li>3.4 \u65e0\u72b6\u6001\u6a21\u5f0f\u914d\u7f6e\u8be6\u89e3<\/li>\n<li>3.5 \u670d\u52a1\u5668\u751f\u547d\u5468\u671f\u4e0e\u542f\u52a8\u6d41\u7a0b<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u56db\u3001\u5b9a\u4e49\u5de5\u5177\u63a5\u53e3\u4e0e\u5b9e\u73b0\u4e1a\u52a1\u903b\u8f91\u51fd\u6570<\/p>\n<ul>\n<li>4.1 Tool \u7684\u5b9a\u4e49\u89c4\u8303\u4e0e JSON Schema<\/li>\n<li>4.2 \u4f7f\u7528\u88c5\u9970\u5668\u6ce8\u518c\u5de5\u5177&#xff08;Python&#xff09;<\/li>\n<li>4.3 \u5de5\u5177\u53c2\u6570\u6821\u9a8c\u4e0e\u7c7b\u578b\u5b89\u5168<\/li>\n<li>4.4 \u5f02\u6b65\u5de5\u5177\u4e0e\u5e76\u53d1\u5904\u7406<\/li>\n<li>4.5 \u5de5\u5177\u8fd4\u56de\u503c\u683c\u5f0f\u5316<\/li>\n<li>4.6 \u5b9e\u6218&#xff1a;\u6784\u5efa\u5929\u6c14\u67e5\u8be2 &#043; \u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177\u96c6<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u4e94\u3001\u914d\u7f6e\u8d44\u6e90\u6620\u5c04\u4e0e\u63d0\u793a\u8bcd\u6a21\u677f\u6ce8\u5165<\/p>\n<ul>\n<li>5.1 Resource \u7684\u6982\u5ff5\u4e0e URI \u89c4\u8303<\/li>\n<li>5.2 \u9759\u6001\u8d44\u6e90\u4e0e\u52a8\u6001\u8d44\u6e90\u6ce8\u518c<\/li>\n<li>5.3 \u8d44\u6e90\u6a21\u677f&#xff08;Resource Templates&#xff09;<\/li>\n<li>5.4 Prompt \u6a21\u677f\u5b9a\u4e49\u4e0e\u53c2\u6570\u5316<\/li>\n<li>5.5 \u5b9e\u6218&#xff1a;\u6784\u5efa\u77e5\u8bc6\u5e93\u8d44\u6e90 &#043; \u4ee3\u7801\u5ba1\u67e5\u63d0\u793a\u8bcd<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u516d\u3001\u672c\u5730\u8c03\u8bd5\u8fd0\u884c\u4e0e\u5ba2\u6237\u7aef\u8fde\u63a5\u9a8c\u8bc1<\/p>\n<ul>\n<li>6.1 \u4f7f\u7528 MCP Inspector \u8fdb\u884c\u53ef\u89c6\u5316\u8c03\u8bd5<\/li>\n<li>6.2 \u547d\u4ee4\u884c\u624b\u52a8\u6d4b\u8bd5&#xff08;curl \/ httpie&#xff09;<\/li>\n<li>6.3 Python \u5ba2\u6237\u7aef\u8fde\u63a5\u6d4b\u8bd5<\/li>\n<li>6.4 \u96c6\u6210 Claude Desktop \/ Cursor \u7b49 AI \u5ba2\u6237\u7aef<\/li>\n<li>6.5 \u65e5\u5fd7\u7cfb\u7edf\u4e0e\u8bf7\u6c42\u8ffd\u8e2a<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u4e03\u3001\u5178\u578b\u62a5\u9519\u573a\u666f\u5206\u6790\u4e0e\u65ad\u70b9\u6392\u67e5\u6280\u5de7<\/p>\n<ul>\n<li>7.1 \u8fde\u63a5\u5c42\u9519\u8bef\u6392\u67e5<\/li>\n<li>7.2 \u5de5\u5177\u8c03\u7528\u5931\u8d25\u7684\u5e38\u89c1\u539f\u56e0<\/li>\n<li>7.3 Schema \u6821\u9a8c\u4e0d\u901a\u8fc7\u7684\u5904\u7406<\/li>\n<li>7.4 \u8d85\u65f6\u4e0e\u5e76\u53d1\u51b2\u7a81<\/li>\n<li>7.5 \u65ad\u70b9\u8c03\u8bd5\u5b9e\u6218&#xff08;VS Code \/ PyCharm&#xff09;<\/li>\n<li>7.6 \u9519\u8bef\u7801\u901f\u67e5\u8868<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u516b\u3001\u751f\u4ea7\u73af\u5883\u90e8\u7f72\u4e0e\u5bb9\u5668\u5316\u5c01\u88c5\u7b56\u7565<\/p>\n<ul>\n<li>8.1 \u90e8\u7f72\u67b6\u6784\u9009\u578b<\/li>\n<li>8.2 Dockerfile \u7f16\u5199\u4e0e\u955c\u50cf\u6784\u5efa<\/li>\n<li>8.3 Docker Compose \u591a\u670d\u52a1\u7f16\u6392<\/li>\n<li>8.4 Kubernetes \u90e8\u7f72\u6e05\u5355<\/li>\n<li>8.5 Nginx \/ Traefik \u53cd\u5411\u4ee3\u7406\u914d\u7f6e<\/li>\n<li>8.6 CI\/CD \u6d41\u6c34\u7ebf\u96c6\u6210<\/li>\n<li>8.7 \u5065\u5eb7\u68c0\u67e5\u4e0e\u4f18\u96c5\u505c\u673a<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u4e5d\u3001\u6027\u80fd\u4f18\u5316\u8981\u70b9\u4e0e\u5b89\u5168\u8bbf\u95ee\u63a7\u5236\u673a\u5236<\/p>\n<ul>\n<li>9.1 \u8fde\u63a5\u6c60\u4e0e\u8d44\u6e90\u590d\u7528<\/li>\n<li>9.2 \u8bf7\u6c42\u9650\u6d41\u4e0e\u7194\u65ad<\/li>\n<li>9.3 OAuth 2.0 \/ API Key \u8ba4\u8bc1<\/li>\n<li>9.4 CORS \u4e0e\u8bf7\u6c42\u6765\u6e90\u63a7\u5236<\/li>\n<li>9.5 \u8f93\u5165\u6d88\u6bd2\u4e0e\u6ce8\u5165\u9632\u62a4<\/li>\n<li>9.6 \u5ba1\u8ba1\u65e5\u5fd7\u4e0e\u654f\u611f\u6570\u636e\u8131\u654f<\/li>\n<li>9.7 TLS\/mTLS \u52a0\u5bc6\u901a\u4fe1<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u5341\u3001\u6269\u5c55\u5b9e\u6218&#xff1a;\u6784\u5efa\u591a\u5de5\u5177\u534f\u540c\u7684 Agent \u94fe<\/p>\n<ul>\n<li>10.1 Agent \u94fe\u7684\u8bbe\u8ba1\u601d\u60f3<\/li>\n<li>10.2 \u5de5\u5177\u7f16\u6392\u4e0e\u4f9d\u8d56\u7ba1\u7406<\/li>\n<li>10.3 \u5b9e\u6218&#xff1a;\u6784\u5efa&#034;\u667a\u80fd\u8fd0\u7ef4 Agent&#034;<\/li>\n<li>10.4 \u5b9e\u6218&#xff1a;\u6784\u5efa&#034;\u6570\u636e\u5206\u6790 Agent&#034;<\/li>\n<li>10.5 \u591a MCP Server \u8054\u90a6\u8c03\u7528<\/li>\n<li>10.6 \u9519\u8bef\u6062\u590d\u4e0e\u91cd\u8bd5\u7b56\u7565<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u5341\u4e00\u3001\u5e38\u89c1\u9677\u9631\u4e0e\u95ee\u9898\u6392\u9664<\/p>\n<\/li>\n<li>\n<p>\u5341\u4e8c\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/p>\n<\/li>\n<li>\n<p>\u5341\u4e09\u3001\u8be6\u7ec6\u53c2\u8003\u8d44\u6599<\/p>\n<\/li>\n<li>\n<p>\u9644\u5f55<\/p>\n<ul>\n<li>\u9644\u5f55 A&#xff1a;MCP \u534f\u8bae\u5b8c\u6574\u6d88\u606f\u683c\u5f0f\u53c2\u8003<\/li>\n<li>\u9644\u5f55 B&#xff1a;FastMCP API \u901f\u67e5\u8868<\/li>\n<li>\u9644\u5f55 C&#xff1a;\u5b8c\u6574\u9879\u76ee\u6e90\u7801\u6e05\u5355<\/li>\n<li>\u9644\u5f55 D&#xff1a;\u672f\u8bed\u8868<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u4e00\u3001MCP \u6838\u5fc3\u6982\u5ff5\u89e3\u6790\u4e0e\u65e0\u72b6\u6001\u67b6\u6784\u4f18\u52bf<\/h3>\n<h4>1.1 \u4ec0\u4e48\u662f MCP&#xff1f;\u89e3\u51b3\u4ec0\u4e48\u95ee\u9898&#xff1f;<\/h4>\n<p>Model Context Protocol&#xff08;MCP&#xff0c;\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae&#xff09; \u662f\u4e00\u4e2a\u5f00\u653e\u6807\u51c6&#xff0c;\u5b9a\u4e49\u4e86 AI \u5e94\u7528\u7a0b\u5e8f&#xff08;\u7279\u522b\u662f\u5927\u8bed\u8a00\u6a21\u578b&#xff09;\u4e0e\u5916\u90e8\u6570\u636e\u6e90\u3001\u5de5\u5177\u4e4b\u95f4\u7684\u6807\u51c6\u5316\u901a\u4fe1\u65b9\u5f0f\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u4e3a AI \u4e16\u754c\u7684 USB-C \u63a5\u53e3\u2014\u2014\u4e00\u4e2a\u7edf\u4e00\u7684\u3001\u5373\u63d2\u5373\u7528\u7684\u8fde\u63a5\u6807\u51c6\u3002<\/p>\n<p>\u5728 MCP \u51fa\u73b0\u4e4b\u524d\u7684\u75db\u70b9&#xff1a;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u4f20\u7edf\u6a21\u5f0f&#xff1a;M\u00d7N \u95ee\u9898                                      \u2502<br \/>\n\u2502                                                         \u2502<br \/>\n\u2502  M \u4e2a AI \u6a21\u578b \u00d7 N \u4e2a\u5916\u90e8\u5de5\u5177 &#061; M\u00d7N \u4e2a\u9002\u914d\u5668             \u2502<br \/>\n\u2502                                                         \u2502<br \/>\n\u2502  Claude \u2500\u2500\u2192 [\u9002\u914d\u56681] \u2500\u2500\u2192 GitHub API                    \u2502<br \/>\n\u2502  Claude \u2500\u2500\u2192 [\u9002\u914d\u56682] \u2500\u2500\u2192 Database                      \u2502<br \/>\n\u2502  GPT   \u2500\u2500\u2192 [\u9002\u914d\u56683] \u2500\u2500\u2192 GitHub API  &#xff08;\u91cd\u590d\u5f00\u53d1&#xff01;&#xff09;      \u2502<br \/>\n\u2502  GPT   \u2500\u2500\u2192 [\u9002\u914d\u56684] \u2500\u2500\u2192 Database    &#xff08;\u91cd\u590d\u5f00\u53d1&#xff01;&#xff09;      \u2502<br \/>\n\u2502  &#8230;                                                    \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>MCP \u51fa\u73b0\u4e4b\u540e&#xff1a;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  MCP \u6a21\u5f0f&#xff1a;M&#043;N \u95ee\u9898                                      \u2502<br \/>\n\u2502                                                         \u2502<br \/>\n\u2502  Claude \u2500\u2510                                              \u2502<br \/>\n\u2502  GPT    \u2500\u253c\u2500\u2500\u2192 [MCP \u534f\u8bae] \u2500\u2500\u2192 GitHub MCP Server         \u2502<br \/>\n\u2502  Gemini \u2500\u2524                  \u2500\u2500\u2192 Database MCP Server     \u2502<br \/>\n\u2502  \u672c\u5730\u6a21\u578b\u2500\u2518                  \u2500\u2500\u2192 FileSystem MCP Server   \u2502<br \/>\n\u2502                                                         \u2502<br \/>\n\u2502  \u6bcf\u4e2a\u6a21\u578b\u53ea\u9700\u5b9e\u73b0\u4e00\u6b21 MCP Client                         \u2502<br \/>\n\u2502  \u6bcf\u4e2a\u5de5\u5177\u53ea\u9700\u5b9e\u73b0\u4e00\u6b21 MCP Server                         \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u622a\u81f3 2026 \u5e74 7 \u6708&#xff0c;MCP \u751f\u6001\u7684\u5173\u952e\u6570\u636e&#xff1a;<\/p>\n<ul>\n<li>\u6708\u5ea6 SDK \u4e0b\u8f7d\u91cf&#xff1a;4 \u4ebf&#043;<\/li>\n<li>\u516c\u5f00 MCP \u670d\u52a1\u5668\u6570\u91cf&#xff1a;13,870&#043;<\/li>\n<li>\u91c7\u7eb3\u5382\u5546&#xff1a;Anthropic\u3001OpenAI\u3001Google\u3001Microsoft\u3001Amazon \u7b49<\/li>\n<li>\u6cbb\u7406\u7ec4\u7ec7&#xff1a;Linux \u57fa\u91d1\u4f1a\u4e0b\u5c5e Agentic AI Foundation&#xff08;AAIF&#xff09;<\/li>\n<\/ul>\n<h4>1.2 MCP \u534f\u8bae\u67b6\u6784\u5168\u666f<\/h4>\n<p>MCP \u91c7\u7528\u7ecf\u5178\u7684 Client-Server \u67b6\u6784&#xff0c;\u6838\u5fc3\u89d2\u8272\u5982\u4e0b&#xff1a;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502                        MCP \u67b6\u6784\u5168\u666f\u56fe                              \u2502<br \/>\n\u2502                                                                  \u2502<br \/>\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502<br \/>\n\u2502  \u2502  Host App   \u2502     \u2502  MCP Client \u2502     \u2502   MCP Server    \u2502    \u2502<br \/>\n\u2502  \u2502(Claude App, \u2502\u2500\u2500\u2500\u2500\u2192\u2502(\u534f\u8bae\u5ba2\u6237\u7aef,  \u2502\u2500\u2500\u2500\u2500\u2192\u2502(\u5de5\u5177\/\u6570\u636e\u63d0\u4f9b\u65b9, \u2502    \u2502<br \/>\n\u2502  \u2502 IDE, Agent) \u2502     \u2502 1:1\u7ed1\u5b9aServer)\u2502    \u2502 \u66b4\u9732\u80fd\u529b)       \u2502    \u2502<br \/>\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502<br \/>\n\u2502                                                   \u2502              \u2502<br \/>\n\u2502                                                   \u25bc              \u2502<br \/>\n\u2502                                          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502<br \/>\n\u2502                                          \u2502  External Data  \u2502    \u2502<br \/>\n\u2502                                          \u2502  (DB, API, FS)  \u2502    \u2502<br \/>\n\u2502                                          \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502<br \/>\n\u2502                                                                  \u2502<br \/>\n\u2502  \u4f20\u8f93\u5c42: stdio | Streamable HTTP (\u65e0\u72b6\u6001) | SSE (\u65e7\u7248\u517c\u5bb9)        \u2502<br \/>\n\u2502  \u534f\u8bae\u5c42: JSON-RPC 2.0                                            \u2502<br \/>\n\u2502  \u80fd\u529b\u5c42: Tools | Resources | Prompts                              \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u5173\u952e\u6982\u5ff5\u89e3\u91ca&#xff1a;<\/p>\n<table>\n<tr>\u89d2\u8272\u8bf4\u660e\u4e3e\u4f8b<\/tr>\n<tbody>\n<tr>\n<td>Host<\/td>\n<td>\u53d1\u8d77 AI \u4ea4\u4e92\u7684\u5e94\u7528\u7a0b\u5e8f<\/td>\n<td>Claude Desktop\u3001Cursor IDE\u3001\u81ea\u7814 Agent<\/td>\n<\/tr>\n<tr>\n<td>Client<\/td>\n<td>\u5d4c\u5165\u5728 Host \u4e2d&#xff0c;\u4e0e\u5355\u4e2a Server \u4fdd\u6301 1:1 \u8fde\u63a5<\/td>\n<td>SDK \u63d0\u4f9b\u7684 Client \u7c7b<\/td>\n<\/tr>\n<tr>\n<td>Server<\/td>\n<td>\u66b4\u9732\u5177\u4f53\u80fd\u529b\u7684\u8f7b\u91cf\u670d\u52a1<\/td>\n<td>\u5929\u6c14\u67e5\u8be2\u670d\u52a1\u3001\u6570\u636e\u5e93\u8bbf\u95ee\u670d\u52a1<\/td>\n<\/tr>\n<tr>\n<td>Transport<\/td>\n<td>\u901a\u4fe1\u7ba1\u9053<\/td>\n<td>stdio&#xff08;\u672c\u5730\u8fdb\u7a0b&#xff09;\u3001Streamable HTTP&#xff08;\u7f51\u7edc&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>1.3 \u4e09\u5927\u6838\u5fc3\u539f\u8bed&#xff1a;Tools\u3001Resources\u3001Prompts<\/h4>\n<p>MCP Server \u901a\u8fc7\u4e09\u79cd\u539f\u8bed&#xff08;Primitives&#xff09;\u5411 AI \u66b4\u9732\u80fd\u529b&#xff1a;<\/p>\n<h5>1.3.1 Tools&#xff08;\u5de5\u5177&#xff09;<\/h5>\n<p>\u5b9a\u4e49&#xff1a;\u6a21\u578b\u53ef\u4ee5\u4e3b\u52a8\u8c03\u7528\u7684\u51fd\u6570\/\u64cd\u4f5c\u3002\u7c7b\u4f3c\u4e8e REST API \u7684 POST \u7aef\u70b9\u3002<\/p>\n<p>\u7279\u5f81&#xff1a;<\/p>\n<ul>\n<li>\u7531\u6a21\u578b\u51b3\u5b9a\u4f55\u65f6\u8c03\u7528<\/li>\n<li>\u53ef\u4ee5\u4ea7\u751f\u526f\u4f5c\u7528&#xff08;\u5199\u6570\u636e\u5e93\u3001\u53d1\u90ae\u4ef6\u7b49&#xff09;<\/li>\n<li>\u9700\u8981\u7528\u6237\u6279\u51c6&#xff08;\u5b89\u5168\u8003\u8651&#xff09;<\/li>\n<li>\u8f93\u5165\u8f93\u51fa\u901a\u8fc7 JSON Schema \u63cf\u8ff0<\/li>\n<\/ul>\n<p><span class=\"token comment\"># \u793a\u4f8b&#xff1a;\u4e00\u4e2a\u5178\u578b\u7684 Tool \u5b9a\u4e49<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;server<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">search_database<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> table<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;users&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5728\u6307\u5b9a\u6570\u636e\u5e93\u8868\u4e2d\u641c\u7d22\u5339\u914d\u7684\u8bb0\u5f55\u3002<\/p>\n<p>    Args:<br \/>\n        query: \u641c\u7d22\u5173\u952e\u8bcd<br \/>\n        table: \u76ee\u6807\u8868\u540d&#xff0c;\u9ed8\u8ba4\u4e3a users<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u5b9e\u9645\u4e1a\u52a1\u903b\u8f91<\/span><br \/>\n    results <span class=\"token operator\">&#061;<\/span> db<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;SELECT * FROM <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> WHERE name LIKE &#039;%<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>query<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">%&#039;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">)<\/span><\/p>\n<h5>1.3.2 Resources&#xff08;\u8d44\u6e90&#xff09;<\/h5>\n<p>\u5b9a\u4e49&#xff1a;\u670d\u52a1\u5668\u66b4\u9732\u7684\u53ef\u8bfb\u6570\u636e&#xff0c;\u7531\u5e94\u7528\u7a0b\u5e8f&#xff08;\u800c\u975e\u6a21\u578b&#xff09;\u51b3\u5b9a\u4f55\u65f6\u52a0\u8f7d\u3002\u7c7b\u4f3c\u4e8e REST API \u7684 GET \u7aef\u70b9\u3002<\/p>\n<p>\u7279\u5f81&#xff1a;<\/p>\n<ul>\n<li>\u53ea\u8bfb&#xff0c;\u4e0d\u4ea7\u751f\u526f\u4f5c\u7528<\/li>\n<li>\u7531\u5e94\u7528\u7aef\u63a7\u5236\u52a0\u8f7d\u65f6\u673a<\/li>\n<li>\u901a\u8fc7 URI \u6807\u8bc6&#xff08;\u5982 file:\/\/\/path\/to\/doc\u3001db:\/\/users\/schema&#xff09;<\/li>\n<li>\u652f\u6301 MIME \u7c7b\u578b\u58f0\u660e<\/li>\n<\/ul>\n<h5>1.3.3 Prompts&#xff08;\u63d0\u793a\u8bcd\u6a21\u677f&#xff09;<\/h5>\n<p>\u5b9a\u4e49&#xff1a;\u9884\u5b9a\u4e49\u7684\u63d0\u793a\u8bcd\u6a21\u677f&#xff0c;\u53ef\u5e26\u53c2\u6570&#xff0c;\u7528\u4e8e\u5f15\u5bfc\u6a21\u578b\u884c\u4e3a\u3002<\/p>\n<p>\u7279\u5f81&#xff1a;<\/p>\n<ul>\n<li>\u7531\u7528\u6237\/\u5e94\u7528\u4e3b\u52a8\u9009\u62e9\u4f7f\u7528<\/li>\n<li>\u652f\u6301\u53c2\u6570\u5316\u6a21\u677f<\/li>\n<li>\u53ef\u5305\u542b\u591a\u8f6e\u6d88\u606f\u5e8f\u5217<\/li>\n<li>\u9002\u5408\u5c01\u88c5\u6700\u4f73\u5b9e\u8df5<\/li>\n<\/ul>\n<h4>1.4 \u4f20\u8f93\u5c42\u6f14\u8fdb&#xff1a;\u4ece stdio \u5230 Streamable HTTP<\/h4>\n<p>MCP \u7684\u4f20\u8f93\u5c42\u7ecf\u5386\u4e86\u91cd\u8981\u6f14\u8fdb&#xff1a;<\/p>\n<table>\n<tr>\u7248\u672c\u4f20\u8f93\u65b9\u5f0f\u7279\u70b9\u9002\u7528\u573a\u666f<\/tr>\n<tbody>\n<tr>\n<td>v1 (2024.11)<\/td>\n<td>stdio<\/td>\n<td>\u672c\u5730\u8fdb\u7a0b\u901a\u4fe1&#xff0c;\u6709\u72b6\u6001<\/td>\n<td>\u672c\u5730\u5f00\u53d1\u3001CLI \u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>v1.1 (2025.03)<\/td>\n<td>HTTP &#043; SSE<\/td>\n<td>\u670d\u52a1\u7aef\u63a8\u9001&#xff0c;\u6709\u72b6\u6001\u4f1a\u8bdd<\/td>\n<td>\u65e9\u671f\u8fdc\u7a0b\u90e8\u7f72<\/td>\n<\/tr>\n<tr>\n<td>v2 (2026.07)<\/td>\n<td>Streamable HTTP<\/td>\n<td>\u65e0\u72b6\u6001&#xff0c;\u8bf7\u6c42\u81ea\u5305\u542b<\/td>\n<td>\u751f\u4ea7\u73af\u5883\u3001\u5fae\u670d\u52a1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Streamable HTTP \u7684\u6838\u5fc3\u8bbe\u8ba1&#xff1a;<\/p>\n<p>Client                          Server<br \/>\n  \u2502                               \u2502<br \/>\n  \u2502\u2500\u2500 POST \/mcp \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2192  \u2502  &#xff08;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb&#xff0c;\u65e0\u9700 session&#xff09;<br \/>\n  \u2502   Content-Type: application\/json<br \/>\n  \u2502   Body: JSON-RPC Request      \u2502<br \/>\n  \u2502                               \u2502<br \/>\n  \u2502\u2190\u2500 200 OK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502  &#xff08;\u540c\u6b65\u54cd\u5e94&#xff09;<br \/>\n  \u2502   Body: JSON-RPC Response     \u2502<br \/>\n  \u2502                               \u2502<br \/>\n  \u2502\u2500\u2500 POST \/mcp \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2192  \u2502  &#xff08;\u6d41\u5f0f\u54cd\u5e94\u573a\u666f&#xff09;<br \/>\n  \u2502   Accept: text\/event-stream   \u2502<br \/>\n  \u2502                               \u2502<br \/>\n  \u2502\u2190\u2500 200 OK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502<br \/>\n  \u2502   Content-Type: text\/event-stream<br \/>\n  \u2502   data: {&#8230;}                 \u2502  &#xff08;SSE \u6d41\u5f0f\u63a8\u9001&#xff09;<br \/>\n  \u2502   data: {&#8230;}                 \u2502<br \/>\n  \u2502                               \u2502<\/p>\n<h4>1.5 \u65e0\u72b6\u6001\u67b6\u6784\u7684\u6838\u5fc3\u4f18\u52bf<\/h4>\n<p>MCP v2 \u7684\u65e0\u72b6\u6001\u5316\u662f\u672c\u6b21\u66f4\u65b0\u6700\u6838\u5fc3\u7684\u53d8\u5316\u3002\u4ee5\u4e0b\u662f\u6709\u72b6\u6001 vs \u65e0\u72b6\u6001\u7684\u5bf9\u6bd4&#xff1a;<\/p>\n<table>\n<tr>\u7ef4\u5ea6\u6709\u72b6\u6001&#xff08;v1&#xff09;\u65e0\u72b6\u6001&#xff08;v2&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>\u4f1a\u8bdd\u7ba1\u7406<\/td>\n<td>\u670d\u52a1\u7aef\u7ef4\u62a4 session \u751f\u547d\u5468\u671f<\/td>\n<td>\u65e0\u9700 session&#xff0c;\u6bcf\u4e2a\u8bf7\u6c42\u81ea\u5305\u542b<\/td>\n<\/tr>\n<tr>\n<td>\u6c34\u5e73\u6269\u5c55<\/td>\n<td>\u9700\u8981 sticky session \u6216 session \u5171\u4eab<\/td>\n<td>\u4efb\u610f\u5b9e\u4f8b\u53ef\u5904\u7406\u4efb\u610f\u8bf7\u6c42<\/td>\n<\/tr>\n<tr>\n<td>\u8d1f\u8f7d\u5747\u8861<\/td>\n<td>\u590d\u6742&#xff08;\u9700\u4fdd\u6301\u8fde\u63a5\u4eb2\u548c\u6027&#xff09;<\/td>\n<td>\u7b80\u5355&#xff08;\u6807\u51c6 round-robin \u5373\u53ef&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u5bb9\u9519\u6062\u590d<\/td>\n<td>\u8fde\u63a5\u65ad\u5f00\u9700\u91cd\u65b0\u63e1\u624b<\/td>\n<td>\u8bf7\u6c42\u5931\u8d25\u76f4\u63a5\u91cd\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u90e8\u7f72\u590d\u6742\u5ea6<\/td>\n<td>\u9ad8&#xff08;\u957f\u8fde\u63a5\u7ba1\u7406\u3001\u8d85\u65f6\u3001\u5fc3\u8df3&#xff09;<\/td>\n<td>\u4f4e&#xff08;\u6807\u51c6 HTTP \u670d\u52a1&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>Serverless \u517c\u5bb9<\/td>\n<td>\u274c \u4e0d\u517c\u5bb9<\/td>\n<td>\u2705 \u5b8c\u7f8e\u517c\u5bb9<\/td>\n<\/tr>\n<tr>\n<td>\u591a\u79df\u6237\u9694\u79bb<\/td>\n<td>\u590d\u6742&#xff08;session \u9694\u79bb&#xff09;<\/td>\n<td>\u5929\u7136\u9694\u79bb&#xff08;\u8bf7\u6c42\u7ea7\u522b&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u65e0\u72b6\u6001\u7684\u6838\u5fc3\u539f\u5219&#xff1a;<\/p>\n<p>\u6bcf\u4e2a HTTP \u8bf7\u6c42\u5fc5\u987b\u5305\u542b\u5904\u7406\u8be5\u8bf7\u6c42\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002\u670d\u52a1\u5668\u4e0d\u4f9d\u8d56\u4efb\u4f55\u5148\u524d\u8bf7\u6c42\u7684\u4e0a\u4e0b\u6587\u3002<\/p>\n<p>\u8fd9\u610f\u5473\u7740&#xff1a;<\/p>\n<li>\u521d\u59cb\u5316&#xff08;initialize&#xff09;\u4e0d\u518d\u662f\u6709\u72b6\u6001\u63e1\u624b&#xff0c;\u800c\u662f\u6bcf\u4e2a\u8bf7\u6c42\u53ef\u72ec\u7acb\u643a\u5e26\u80fd\u529b\u58f0\u660e<\/li>\n<li>\u5de5\u5177\u5217\u8868&#xff08;tools\/list&#xff09;\u6bcf\u6b21\u8bf7\u6c42\u72ec\u7acb\u8fd4\u56de&#xff0c;\u4e0d\u4f9d\u8d56\u4e4b\u524d\u7684 initialize<\/li>\n<li>\u670d\u52a1\u5668\u53ef\u4ee5\u968f\u610f\u91cd\u542f\u3001\u6269\u7f29\u5bb9&#xff0c;\u4e0d\u5f71\u54cd\u4efb\u4f55\u8fdb\u884c\u4e2d\u7684\u4ea4\u4e92<\/li>\n<h4>1.6 MCP v2 \u89c4\u8303\u5173\u952e\u53d8\u66f4\u603b\u7ed3<\/h4>\n<p>2026-07-28 \u89c4\u8303\u7684\u4e3b\u8981\u53d8\u66f4\u70b9&#xff1a;<\/p>\n<li>\u65e0\u72b6\u6001\u5316&#xff1a;\u79fb\u9664\u5f3a\u5236 session \u7ed1\u5b9a&#xff0c;\u652f\u6301\u8bf7\u6c42\u81ea\u5305\u542b\u6a21\u5f0f<\/li>\n<li>Streamable HTTP \u6210\u4e3a\u63a8\u8350\u4f20\u8f93&#xff1a;\u53d6\u4ee3 SSE&#xff0c;\u652f\u6301\u53cc\u5411\u901a\u4fe1<\/li>\n<li>MRTR&#xff08;Multi-Resource Transfer Response&#xff09;&#xff1a;\u652f\u6301\u5355\u6b21\u8bf7\u6c42\u8fd4\u56de\u591a\u8d44\u6e90<\/li>\n<li>\u6269\u5c55\u6846\u67b6\u6807\u51c6\u5316&#xff1a;Tools\u3001Resources\u3001Prompts \u7684\u6269\u5c55\u673a\u5236\u6b63\u5f0f\u89c4\u8303\u5316<\/li>\n<li>\u5b89\u5168\u589e\u5f3a&#xff1a;OAuth 2.1 \u8ba4\u8bc1\u6210\u4e3a\u6807\u51c6&#xff0c;\u589e\u52a0\u8bf7\u6c42\u7b7e\u540d\u673a\u5236<\/li>\n<li>\u80fd\u529b\u534f\u5546\u7b80\u5316&#xff1a;\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u80fd\u529b\u58f0\u660e\u968f\u8bf7\u6c42\u643a\u5e26<\/li>\n<li>\u9519\u8bef\u5904\u7406\u6807\u51c6\u5316&#xff1a;\u7edf\u4e00\u9519\u8bef\u7801\u4f53\u7cfb\u548c\u91cd\u8bd5\u8bed\u4e49<\/li>\n<hr \/>\n<h3>\u4e8c\u3001\u5f00\u53d1\u73af\u5883\u642d\u5efa\u4e0e\u4f9d\u8d56\u5e93\u5feb\u901f\u5b89\u88c5<\/h3>\n<h4>2.1 Python \u73af\u5883\u51c6\u5907<\/h4>\n<p>\u7cfb\u7edf\u8981\u6c42&#xff1a;<\/p>\n<ul>\n<li>\u64cd\u4f5c\u7cfb\u7edf&#xff1a;Linux \/ macOS \/ Windows 10&#043;<\/li>\n<li>Python \u7248\u672c&#xff1a;3.10 \u6216\u66f4\u9ad8&#xff08;\u63a8\u8350 3.11&#043;&#xff09;<\/li>\n<li>\u5185\u5b58&#xff1a;\u81f3\u5c11 2GB \u53ef\u7528 RAM<\/li>\n<li>\u78c1\u76d8&#xff1a;500MB \u53ef\u7528\u7a7a\u95f4<\/li>\n<\/ul>\n<p>\u6b65\u9aa4\u4e00&#xff1a;\u786e\u8ba4 Python \u7248\u672c<\/p>\n<p><span class=\"token comment\"># \u68c0\u67e5 Python \u7248\u672c<\/span><br \/>\npython3 <span class=\"token parameter variable\">&#8211;version<\/span><br \/>\n<span class=\"token comment\"># \u671f\u671b\u8f93\u51fa: Python 3.10.x \u6216\u66f4\u9ad8<\/span><\/p>\n<p><span class=\"token comment\"># \u5982\u679c\u7248\u672c\u8fc7\u4f4e&#xff0c;\u4f7f\u7528 pyenv \u5b89\u88c5\u65b0\u7248\u672c<\/span><br \/>\n<span class=\"token function\">curl<\/span> https:\/\/pyenv.run <span class=\"token operator\">|<\/span> <span class=\"token function\">bash<\/span><br \/>\npyenv <span class=\"token function\">install<\/span> <span class=\"token number\">3.11<\/span>.9<br \/>\npyenv global <span class=\"token number\">3.11<\/span>.9<\/p>\n<p>\u6b65\u9aa4\u4e8c&#xff1a;\u521b\u5efa\u9879\u76ee\u4e0e\u865a\u62df\u73af\u5883<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u9879\u76ee\u76ee\u5f55<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> mcp-agent-server <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">cd<\/span> mcp-agent-server<\/p>\n<p><span class=\"token comment\"># \u521b\u5efa Python \u865a\u62df\u73af\u5883<\/span><br \/>\npython3 <span class=\"token parameter variable\">-m<\/span> venv .venv<\/p>\n<p><span class=\"token comment\"># \u6fc0\u6d3b\u865a\u62df\u73af\u5883<\/span><br \/>\n<span class=\"token comment\"># Linux\/macOS:<\/span><br \/>\n<span class=\"token builtin class-name\">source<\/span> .venv\/bin\/activate<br \/>\n<span class=\"token comment\"># Windows (PowerShell):<\/span><br \/>\n<span class=\"token comment\"># .venv\\\\Scripts\\\\Activate.ps1<\/span><\/p>\n<p><span class=\"token comment\"># \u786e\u8ba4\u6fc0\u6d3b\u6210\u529f<\/span><br \/>\n<span class=\"token function\">which<\/span> python<br \/>\n<span class=\"token comment\"># \u5e94\u8f93\u51fa: \/path\/to\/mcp-agent-server\/.venv\/bin\/python<\/span><\/p>\n<p>\u6b65\u9aa4\u4e09&#xff1a;\u5347\u7ea7 pip \u5e76\u5b89\u88c5\u57fa\u7840\u5de5\u5177<\/p>\n<p>pip <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">&#8211;upgrade<\/span> pip setuptools wheel<\/p>\n<h4>2.2 TypeScript\/Node.js \u73af\u5883\u51c6\u5907<\/h4>\n<p><span class=\"token comment\"># \u786e\u8ba4 Node.js \u7248\u672c&#xff08;\u9700\u8981 18&#043;&#xff09;<\/span><br \/>\n<span class=\"token function\">node<\/span> <span class=\"token parameter variable\">&#8211;version<\/span><br \/>\n<span class=\"token comment\"># \u671f\u671b\u8f93\u51fa: v18.x.x \u6216\u66f4\u9ad8<\/span><\/p>\n<p><span class=\"token comment\"># \u786e\u8ba4 npm<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token parameter variable\">&#8211;version<\/span><\/p>\n<p><span class=\"token comment\"># \u521b\u5efa\u9879\u76ee<\/span><br \/>\n<span class=\"token function\">mkdir<\/span> mcp-agent-server-ts <span class=\"token operator\">&amp;&amp;<\/span> <span class=\"token builtin class-name\">cd<\/span> mcp-agent-server-ts<br \/>\n<span class=\"token function\">npm<\/span> init <span class=\"token parameter variable\">-y<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5 TypeScript \u76f8\u5173\u4f9d\u8d56<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-D<\/span> typescript &#064;types\/node tsx<br \/>\nnpx tsc <span class=\"token parameter variable\">&#8211;init<\/span><\/p>\n<h4>2.3 MCP SDK \u5b89\u88c5\u4e0e\u7248\u672c\u786e\u8ba4<\/h4>\n<p>Python SDK \u5b89\u88c5&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5 MCP Python SDK&#xff08;\u5305\u542b FastMCP \u6846\u67b6&#xff09;<\/span><br \/>\npip <span class=\"token function\">install<\/span> <span class=\"token string\">&#034;mcp[cli]&gt;&#061;1.0.0&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u5b89\u88c5<\/span><br \/>\npython <span class=\"token parameter variable\">-c<\/span> <span class=\"token string\">&#034;import mcp; print(f&#039;MCP SDK version: {mcp.__version__}&#039;)&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5\u989d\u5916\u5e38\u7528\u4f9d\u8d56<\/span><br \/>\npip <span class=\"token function\">install<\/span> httpx uvicorn pydantic python-dotenv<\/p>\n<p>TypeScript SDK \u5b89\u88c5&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5 MCP TypeScript SDK<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> &#064;modelcontextprotocol\/sdk<\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5\u8fd0\u884c\u65f6\u4f9d\u8d56<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> zod express<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1<\/span><br \/>\nnpx tsx <span class=\"token parameter variable\">-e<\/span> <span class=\"token string\">&#034;import { Server } from &#039;&#064;modelcontextprotocol\/sdk\/server\/index.js&#039;; console.log(&#039;MCP SDK OK&#039;)&#034;<\/span><\/p>\n<p>\u7248\u672c\u517c\u5bb9\u6027\u8bf4\u660e&#xff1a;<\/p>\n<table>\n<tr>SDK\u6700\u4f4e\u7248\u672c\u63a8\u8350\u7248\u672c\u652f\u6301\u534f\u8bae\u7248\u672c<\/tr>\n<tbody>\n<tr>\n<td>Python mcp<\/td>\n<td>1.0.0<\/td>\n<td>1.2&#043;<\/td>\n<td>2024-11-05 ~ 2026-07-28<\/td>\n<\/tr>\n<tr>\n<td>TypeScript &#064;modelcontextprotocol\/sdk<\/td>\n<td>1.0.0<\/td>\n<td>1.3&#043;<\/td>\n<td>2024-11-05 ~ 2026-07-28<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>2.4 \u5f00\u53d1\u5de5\u5177\u94fe\u914d\u7f6e<\/h4>\n<p>IDE \u63a8\u8350\u914d\u7f6e&#xff08;VS Code&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ .vscode\/settings.json<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;python.defaultInterpreterPath&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}\/.venv\/bin\/python&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;python.analysis.typeCheckingMode&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;strict&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;editor.formatOnSave&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;python.linting.enabled&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;python.linting.pylintEnabled&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">true<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ .vscode\/launch.json &#8211; \u8c03\u8bd5\u914d\u7f6e<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;version&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;0.2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;configurations&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;MCP Server Debug&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;debugpy&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;request&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;launch&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;module&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;uvicorn&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;args&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;server:app&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;host&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;port&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;8000&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;reload&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;cwd&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;env&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;MCP_STATELESS&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;true&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string-property property\">&#034;LOG_LEVEL&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;DEBUG&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;console&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;integratedTerminal&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>MCP Inspector \u5b89\u88c5&#xff08;\u5b98\u65b9\u8c03\u8bd5\u5de5\u5177&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u5168\u5c40\u5b89\u88c5 MCP Inspector<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-g<\/span> &#064;modelcontextprotocol\/inspector<\/p>\n<p><span class=\"token comment\"># \u542f\u52a8 Inspector<\/span><br \/>\nnpx &#064;modelcontextprotocol\/inspector<br \/>\n<span class=\"token comment\"># \u6d4f\u89c8\u5668\u81ea\u52a8\u6253\u5f00 http:\/\/localhost:6274<\/span><\/p>\n<h4>2.5 \u9879\u76ee\u76ee\u5f55\u7ed3\u6784\u89c4\u5212<\/h4>\n<p>mcp-agent-server\/<br \/>\n\u251c\u2500\u2500 .venv\/                      # Python \u865a\u62df\u73af\u5883<br \/>\n\u251c\u2500\u2500 .vscode\/                    # IDE \u914d\u7f6e<br \/>\n\u2502   \u251c\u2500\u2500 settings.json<br \/>\n\u2502   \u2514\u2500\u2500 launch.json<br \/>\n\u251c\u2500\u2500 src\/                        # \u6e90\u4ee3\u7801\u76ee\u5f55<br \/>\n\u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u251c\u2500\u2500 server.py              # MCP \u670d\u52a1\u5668\u4e3b\u5165\u53e3<br \/>\n\u2502   \u251c\u2500\u2500 tools\/                 # \u5de5\u5177\u5b9a\u4e49\u6a21\u5757<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 weather.py         # \u5929\u6c14\u67e5\u8be2\u5de5\u5177<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 database.py        # \u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 calculator.py      # \u8ba1\u7b97\u5de5\u5177<br \/>\n\u2502   \u251c\u2500\u2500 resources\/             # \u8d44\u6e90\u5b9a\u4e49\u6a21\u5757<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 knowledge_base.py  # \u77e5\u8bc6\u5e93\u8d44\u6e90<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 file_system.py     # \u6587\u4ef6\u7cfb\u7edf\u8d44\u6e90<br \/>\n\u2502   \u251c\u2500\u2500 prompts\/               # \u63d0\u793a\u8bcd\u6a21\u677f\u6a21\u5757<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 templates.py       # \u63d0\u793a\u8bcd\u6a21\u677f\u5b9a\u4e49<br \/>\n\u2502   \u251c\u2500\u2500 middleware\/            # \u4e2d\u95f4\u4ef6<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 auth.py            # \u8ba4\u8bc1\u4e2d\u95f4\u4ef6<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 rate_limit.py      # \u9650\u6d41\u4e2d\u95f4\u4ef6<br \/>\n\u2502   \u2514\u2500\u2500 config.py              # \u914d\u7f6e\u7ba1\u7406<br \/>\n\u251c\u2500\u2500 tests\/                      # \u6d4b\u8bd5\u76ee\u5f55<br \/>\n\u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u251c\u2500\u2500 test_tools.py<br \/>\n\u2502   \u251c\u2500\u2500 test_resources.py<br \/>\n\u2502   \u2514\u2500\u2500 test_integration.py<br \/>\n\u251c\u2500\u2500 deploy\/                     # \u90e8\u7f72\u914d\u7f6e<br \/>\n\u2502   \u251c\u2500\u2500 Dockerfile<br \/>\n\u2502   \u251c\u2500\u2500 docker-compose.yml<br \/>\n\u2502   \u2514\u2500\u2500 k8s\/<br \/>\n\u2502       \u251c\u2500\u2500 deployment.yaml<br \/>\n\u2502       \u2514\u2500\u2500 service.yaml<br \/>\n\u251c\u2500\u2500 .env.example               # \u73af\u5883\u53d8\u91cf\u6a21\u677f<br \/>\n\u251c\u2500\u2500 .gitignore<br \/>\n\u251c\u2500\u2500 pyproject.toml             # \u9879\u76ee\u914d\u7f6e<br \/>\n\u251c\u2500\u2500 requirements.txt           # \u4f9d\u8d56\u6e05\u5355<br \/>\n\u2514\u2500\u2500 README.md                  # \u9879\u76ee\u8bf4\u660e<\/p>\n<p>pyproject.toml \u914d\u7f6e&#xff1a;<\/p>\n<p>[project]<br \/>\nname &#061; &#034;mcp-agent-server&#034;<br \/>\nversion &#061; &#034;1.0.0&#034;<br \/>\ndescription &#061; &#034;\u65e0\u72b6\u6001 MCP AI Agent \u670d\u52a1\u5668&#034;<br \/>\nrequires-python &#061; &#034;&gt;&#061;3.10&#034;<br \/>\ndependencies &#061; [<br \/>\n    &#034;mcp[cli]&gt;&#061;1.2.0&#034;,<br \/>\n    &#034;uvicorn&gt;&#061;0.30.0&#034;,<br \/>\n    &#034;httpx&gt;&#061;0.27.0&#034;,<br \/>\n    &#034;pydantic&gt;&#061;2.0.0&#034;,<br \/>\n    &#034;python-dotenv&gt;&#061;1.0.0&#034;,<br \/>\n]<\/p>\n<p>[project.optional-dependencies]<br \/>\ndev &#061; [<br \/>\n    &#034;pytest&gt;&#061;8.0.0&#034;,<br \/>\n    &#034;pytest-asyncio&gt;&#061;0.23.0&#034;,<br \/>\n    &#034;ruff&gt;&#061;0.4.0&#034;,<br \/>\n    &#034;mypy&gt;&#061;1.10.0&#034;,<br \/>\n]<\/p>\n<p>[build-system]<br \/>\nrequires &#061; [&#034;hatchling&#034;]<br \/>\nbuild-backend &#061; &#034;hatchling.build&#034;<\/p>\n<hr \/>\n<h3>\u4e09\u3001\u521d\u59cb\u5316\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668\u57fa\u7840\u4ee3\u7801<\/h3>\n<h4>3.1 FastMCP \u6846\u67b6\u5feb\u901f\u5165\u95e8<\/h4>\n<p>FastMCP \u662f MCP Python SDK \u5185\u7f6e\u7684\u9ad8\u5c42\u6846\u67b6&#xff0c;\u63d0\u4f9b\u4e86\u58f0\u660e\u5f0f\u7684 API \u6765\u5feb\u901f\u6784\u5efa MCP \u670d\u52a1\u5668\u3002\u5b83\u7684\u6838\u5fc3\u8bbe\u8ba1\u7406\u5ff5\u662f \u201c\u7ea6\u5b9a\u4f18\u4e8e\u914d\u7f6e\u201d\u2014\u2014\u901a\u8fc7 Python \u88c5\u9970\u5668\u548c\u7c7b\u578b\u6ce8\u89e3&#xff0c;\u81ea\u52a8\u751f\u6210\u7b26\u5408 MCP \u534f\u8bae\u7684\u5de5\u5177\u63cf\u8ff0\u3002<\/p>\n<p>FastMCP \u6838\u5fc3\u7279\u6027&#xff1a;<\/p>\n<ul>\n<li>\u81ea\u52a8\u4ece\u51fd\u6570\u7b7e\u540d\u548c docstring \u751f\u6210 JSON Schema<\/li>\n<li>\u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u51fd\u6570<\/li>\n<li>\u5185\u7f6e\u53c2\u6570\u6821\u9a8c&#xff08;\u57fa\u4e8e Pydantic&#xff09;<\/li>\n<li>\u652f\u6301\u65e0\u72b6\u6001\u548c\u6709\u72b6\u6001\u4e24\u79cd\u8fd0\u884c\u6a21\u5f0f<\/li>\n<li>\u5185\u7f6e Streamable HTTP \u548c stdio \u4f20\u8f93\u652f\u6301<\/li>\n<\/ul>\n<h4>3.2 \u6700\u5c0f\u53ef\u8fd0\u884c\u670d\u52a1\u5668&#xff08;Python \u7248&#xff09;<\/h4>\n<p>\u521b\u5efa\u6587\u4ef6 src\/server.py&#xff1a;<\/p>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nMCP \u65e0\u72b6\u6001\u670d\u52a1\u5668 &#8211; \u6700\u5c0f\u53ef\u8fd0\u884c\u793a\u4f8b<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u672c\u6587\u4ef6\u6f14\u793a\u5982\u4f55\u7528\u6700\u5c11\u7684\u4ee3\u7801\u542f\u52a8\u4e00\u4e2a\u7b26\u5408 MCP v2 \u89c4\u8303\u7684\u65e0\u72b6\u6001\u670d\u52a1\u5668\u3002<\/p>\n<p>\u8fd0\u884c\u65b9\u5f0f:<br \/>\n    python src\/server.py                    # stdio \u6a21\u5f0f&#xff08;\u672c\u5730\u8c03\u8bd5&#xff09;<br \/>\n    python src\/server.py &#8211;transport http   # HTTP \u6a21\u5f0f&#xff08;\u65e0\u72b6\u6001&#xff0c;\u751f\u4ea7\u63a8\u8350&#xff09;<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">import<\/span> sys<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> mcp<span class=\"token punctuation\">.<\/span>server<span class=\"token punctuation\">.<\/span>fastmcp <span class=\"token keyword\">import<\/span> FastMCP<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u4e00\u6b65&#xff1a;\u521b\u5efa FastMCP \u670d\u52a1\u5668\u5b9e\u4f8b<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># name: \u670d\u52a1\u5668\u540d\u79f0&#xff0c;\u4f1a\u5728\u5ba2\u6237\u7aef\u663e\u793a<\/span><br \/>\n<span class=\"token comment\"># version: \u670d\u52a1\u5668\u7248\u672c\u53f7<\/span><br \/>\n<span class=\"token comment\"># stateless: \u5173\u952e\u53c2\u6570&#xff01;\u8bbe\u4e3a True \u542f\u7528\u65e0\u72b6\u6001\u6a21\u5f0f<\/span><br \/>\n<span class=\"token comment\">#            \u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b&#xff0c;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb\u5904\u7406&#xff0c;\u4e0d\u7ef4\u62a4\u4f1a\u8bdd<\/span><br \/>\nmcp <span class=\"token operator\">&#061;<\/span> FastMCP<span class=\"token punctuation\">(<\/span><br \/>\n    name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;my-first-agent-server&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    version<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;1.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f\u914d\u7f6e&#xff08;MCP v2 \u6838\u5fc3&#xff09;<\/span><br \/>\n    stateless<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u542f\u7528\u65e0\u72b6\u6001\u6a21\u5f0f<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u4e8c\u6b65&#xff1a;\u914d\u7f6e\u65e5\u5fd7&#xff08;\u5f00\u53d1\u9636\u6bb5\u5efa\u8bae DEBUG \u7ea7\u522b&#xff09;<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nlogging<span class=\"token punctuation\">.<\/span>basicConfig<span class=\"token punctuation\">(<\/span><br \/>\n    level<span class=\"token operator\">&#061;<\/span>logging<span class=\"token punctuation\">.<\/span>DEBUG<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token builtin\">format<\/span><span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;%(asctime)s [%(levelname)s] %(name)s: %(message)s&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    handlers<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><br \/>\n        logging<span class=\"token punctuation\">.<\/span>StreamHandler<span class=\"token punctuation\">(<\/span>sys<span class=\"token punctuation\">.<\/span>stderr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># MCP \u534f\u8bae\u4f7f\u7528 stdout&#xff0c;\u65e5\u5fd7\u8d70 stderr<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><br \/>\nlogger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp-server&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u4e09\u6b65&#xff1a;\u5b9a\u4e49\u7b2c\u4e00\u4e2a\u5de5\u5177&#xff08;Tool&#xff09;<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">hello_world<\/span><span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;World&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5411\u6307\u5b9a\u7528\u6237\u53d1\u9001\u95ee\u5019\u3002<\/p>\n<p>    \u8fd9\u662f\u6700\u7b80\u5355\u7684 MCP \u5de5\u5177\u793a\u4f8b&#xff0c;\u7528\u4e8e\u9a8c\u8bc1\u670d\u52a1\u5668\u662f\u5426\u6b63\u5e38\u8fd0\u884c\u3002<\/p>\n<p>    Args:<br \/>\n        name: \u8981\u95ee\u5019\u7684\u7528\u6237\u540d\u79f0&#xff0c;\u9ed8\u8ba4\u4e3a &#034;World&#034;<\/p>\n<p>    Returns:<br \/>\n        \u683c\u5f0f\u5316\u7684\u95ee\u5019\u5b57\u7b26\u4e32<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;hello_world \u88ab\u8c03\u7528&#xff0c;\u53c2\u6570: name&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Hello, <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">! \u6b22\u8fce\u4f7f\u7528 MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668\u3002&#034;<\/span><\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">add_numbers<\/span><span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> b<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8ba1\u7b97\u4e24\u4e2a\u6570\u5b57\u7684\u548c\u3002<\/p>\n<p>    Args:<br \/>\n        a: \u7b2c\u4e00\u4e2a\u52a0\u6570<br \/>\n        b: \u7b2c\u4e8c\u4e2a\u52a0\u6570<\/p>\n<p>    Returns:<br \/>\n        \u4e24\u6570\u4e4b\u548c<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    result <span class=\"token operator\">&#061;<\/span> a <span class=\"token operator\">&#043;<\/span> b<br \/>\n    logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;add_numbers: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#043; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>b<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> &#061; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>result<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> result<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u56db\u6b65&#xff1a;\u5b9a\u4e49\u8d44\u6e90&#xff08;Resource&#xff09;<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;config:\/\/server-info&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_server_info<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8fd4\u56de\u670d\u52a1\u5668\u57fa\u672c\u4fe1\u606f\u3002<\/p>\n<p>    \u8fd9\u662f\u4e00\u4e2a\u9759\u6001\u8d44\u6e90\u793a\u4f8b&#xff0c;\u5ba2\u6237\u7aef\u53ef\u4ee5\u8bfb\u53d6\u6b64\u8d44\u6e90<br \/>\n    \u83b7\u53d6\u670d\u52a1\u5668\u7684\u5143\u6570\u636e\u4fe1\u606f\u3002<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u670d\u52a1\u5668\u540d\u79f0: my-first-agent-server<br \/>\n    \u7248\u672c: 1.0.0<br \/>\n    \u534f\u8bae\u7248\u672c: 2026-07-28 (MCP v2)<br \/>\n    \u8fd0\u884c\u6a21\u5f0f: \u65e0\u72b6\u6001 (Stateless)<br \/>\n    \u4f20\u8f93\u534f\u8bae: Streamable HTTP<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u4e94\u6b65&#xff1a;\u5b9a\u4e49\u63d0\u793a\u8bcd\u6a21\u677f&#xff08;Prompt&#xff09;<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>prompt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">greeting_prompt<\/span><span class=\"token punctuation\">(<\/span>user_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u751f\u6210\u4e2a\u6027\u5316\u7684\u95ee\u5019\u63d0\u793a\u8bcd\u3002<\/p>\n<p>    Args:<br \/>\n        user_name: \u7528\u6237\u540d\u79f0<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#034;&#034;\u8bf7\u4f60\u4ee5\u53cb\u597d\u3001\u4e13\u4e1a\u7684\u8bed\u6c14\u5411 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>user_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6253\u62db\u547c\u3002<br \/>\n\u4ecb\u7ecd\u4f60\u80fd\u63d0\u4f9b\u7684\u670d\u52a1&#xff0c;\u5e76\u8be2\u95ee\u4ed6\u4eec\u9700\u8981\u4ec0\u4e48\u5e2e\u52a9\u3002<br \/>\n\u4fdd\u6301\u7b80\u6d01&#xff0c;\u4e0d\u8d85\u8fc73\u53e5\u8bdd\u3002&#034;&#034;&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u7b2c\u516d\u6b65&#xff1a;\u542f\u52a8\u670d\u52a1\u5668<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># \u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570<\/span><br \/>\n    transport <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;stdio&#034;<\/span>  <span class=\"token comment\"># \u9ed8\u8ba4\u4f7f\u7528 stdio<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;&#8211;transport&#034;<\/span> <span class=\"token keyword\">in<\/span> sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">:<\/span><br \/>\n        idx <span class=\"token operator\">&#061;<\/span> sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">.<\/span>index<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;transport&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> idx <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            transport <span class=\"token operator\">&#061;<\/span> sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">[<\/span>idx <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u542f\u52a8 MCP \u670d\u52a1\u5668&#xff0c;\u4f20\u8f93\u6a21\u5f0f: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>transport<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">, \u65e0\u72b6\u6001: True&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> transport <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;http&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u65e0\u72b6\u6001 HTTP \u6a21\u5f0f&#xff08;\u751f\u4ea7\u73af\u5883\u63a8\u8350&#xff09;<\/span><br \/>\n        <span class=\"token comment\"># \u4f7f\u7528 Streamable HTTP \u4f20\u8f93<\/span><br \/>\n        mcp<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><br \/>\n            transport<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;streamable-http&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            host<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            port<span class=\"token operator\">&#061;<\/span><span class=\"token number\">8000<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u7684\u5173\u952e\u914d\u7f6e<\/span><br \/>\n            stateless<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u4e0d\u7ef4\u62a4 session<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># stdio \u6a21\u5f0f&#xff08;\u672c\u5730\u5f00\u53d1\/\u8c03\u8bd5&#xff09;<\/span><br \/>\n        mcp<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>transport<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stdio&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8fd0\u884c\u6d4b\u8bd5&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u65b9\u5f0f\u4e00&#xff1a;stdio \u6a21\u5f0f&#xff08;\u914d\u5408 MCP Inspector \u4f7f\u7528&#xff09;<\/span><br \/>\npython src\/server.py<\/p>\n<p><span class=\"token comment\"># \u65b9\u5f0f\u4e8c&#xff1a;HTTP \u65e0\u72b6\u6001\u6a21\u5f0f<\/span><br \/>\npython src\/server.py <span class=\"token parameter variable\">&#8211;transport<\/span> http<br \/>\n<span class=\"token comment\"># \u8f93\u51fa: INFO: \u542f\u52a8 MCP \u670d\u52a1\u5668&#xff0c;\u4f20\u8f93\u6a21\u5f0f: http, \u65e0\u72b6\u6001: True<\/span><br \/>\n<span class=\"token comment\"># \u8f93\u51fa: INFO: Uvicorn running on http:\/\/0.0.0.0:8000<\/span><\/p>\n<h4>3.3 \u6700\u5c0f\u53ef\u8fd0\u884c\u670d\u52a1\u5668&#xff08;TypeScript \u7248&#xff09;<\/h4>\n<p>\u521b\u5efa\u6587\u4ef6 src\/server.ts&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668 &#8211; TypeScript \u6700\u5c0f\u53ef\u8fd0\u884c\u793a\u4f8b<br \/>\n *<br \/>\n * \u8fd0\u884c\u65b9\u5f0f:<br \/>\n *   npx tsx src\/server.ts              # stdio \u6a21\u5f0f<br \/>\n *   npx tsx src\/server.ts &#8211;http       # HTTP \u65e0\u72b6\u6001\u6a21\u5f0f<br \/>\n *\/<\/span><\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> McpServer <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#034;&#064;modelcontextprotocol\/sdk\/server\/mcp.js&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> StreamableHTTPServerTransport <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#034;&#064;modelcontextprotocol\/sdk\/server\/streamableHttp.js&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> StdioServerTransport <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#034;&#064;modelcontextprotocol\/sdk\/server\/stdio.js&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> z <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#034;zod&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> express <span class=\"token keyword\">from<\/span> <span class=\"token string\">&#034;express&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u521b\u5efa MCP \u670d\u52a1\u5668\u5b9e\u4f8b<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">const<\/span> server <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">McpServer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n    name<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;my-first-agent-server&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    version<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;1.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u65e0\u72b6\u6001\u6a21\u5f0f&#xff1a;\u4e0d\u9700\u8981 session \u7ba1\u7406<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    capabilities<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        tools<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        resources<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        prompts<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6ce8\u518c\u5de5\u5177<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5de5\u51771: hello_world<\/span><br \/>\nserver<span class=\"token punctuation\">.<\/span><span class=\"token function\">tool<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">&#034;hello_world&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;\u5411\u6307\u5b9a\u7528\u6237\u53d1\u9001\u95ee\u5019&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        name<span class=\"token operator\">:<\/span> z<span class=\"token punctuation\">.<\/span><span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">default<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;World&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">describe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8981\u95ee\u5019\u7684\u7528\u6237\u540d\u79f0&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> name <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            content<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    type<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    text<span class=\"token operator\">:<\/span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">Hello, <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>name<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">! \u6b22\u8fce\u4f7f\u7528 MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668\u3002<\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5de5\u51772: add_numbers<\/span><br \/>\nserver<span class=\"token punctuation\">.<\/span><span class=\"token function\">tool<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">&#034;add_numbers&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;\u8ba1\u7b97\u4e24\u4e2a\u6570\u5b57\u7684\u548c&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        a<span class=\"token operator\">:<\/span> z<span class=\"token punctuation\">.<\/span><span class=\"token function\">number<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">describe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7b2c\u4e00\u4e2a\u52a0\u6570&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        b<span class=\"token operator\">:<\/span> z<span class=\"token punctuation\">.<\/span><span class=\"token function\">number<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">describe<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7b2c\u4e8c\u4e2a\u52a0\u6570&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span> a<span class=\"token punctuation\">,<\/span> b <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            content<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    type<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    text<span class=\"token operator\">:<\/span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>a<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\"> &#043; <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>b<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\"> &#061; <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>a <span class=\"token operator\">&#043;<\/span> b<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6ce8\u518c\u8d44\u6e90<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nserver<span class=\"token punctuation\">.<\/span><span class=\"token function\">resource<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">&#034;server-info&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;config:\/\/server-info&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        contents<span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                uri<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;config:\/\/server-info&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                mimeType<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text\/plain&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                text<span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u670d\u52a1\u5668: my-first-agent-server v1.0.0 | \u6a21\u5f0f: \u65e0\u72b6\u6001&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u542f\u52a8\u670d\u52a1\u5668<\/span><br \/>\n<span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">function<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> args <span class=\"token operator\">&#061;<\/span> process<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">.<\/span><span class=\"token function\">slice<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>args<span class=\"token punctuation\">.<\/span><span class=\"token function\">includes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8211;http&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ HTTP \u65e0\u72b6\u6001\u6a21\u5f0f<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> app <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">express<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        app<span class=\"token punctuation\">.<\/span><span class=\"token function\">use<\/span><span class=\"token punctuation\">(<\/span>express<span class=\"token punctuation\">.<\/span><span class=\"token function\">json<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ \u65e0\u72b6\u6001\u6a21\u5f0f&#xff1a;\u6bcf\u4e2a\u8bf7\u6c42\u521b\u5efa\u65b0\u7684 transport \u5b9e\u4f8b<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8fd9\u662f\u65e0\u72b6\u6001\u7684\u5173\u952e \u2014\u2014 \u4e0d\u590d\u7528 transport\/session<\/span><br \/>\n        app<span class=\"token punctuation\">.<\/span><span class=\"token function\">post<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/mcp&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">async<\/span> <span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> res<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> transport <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">StreamableHTTPServerTransport<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                sessionIdGenerator<span class=\"token operator\">:<\/span> <span class=\"token keyword\">undefined<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ \u65e0\u72b6\u6001&#xff1a;\u4e0d\u751f\u6210 session ID<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">await<\/span> server<span class=\"token punctuation\">.<\/span><span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span>transport<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> transport<span class=\"token punctuation\">.<\/span><span class=\"token function\">handleRequest<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token punctuation\">,<\/span> res<span class=\"token punctuation\">,<\/span> req<span class=\"token punctuation\">.<\/span>body<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">const<\/span> <span class=\"token constant\">PORT<\/span> <span class=\"token operator\">&#061;<\/span> process<span class=\"token punctuation\">.<\/span>env<span class=\"token punctuation\">.<\/span><span class=\"token constant\">PORT<\/span> <span class=\"token operator\">||<\/span> <span class=\"token number\">8000<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        app<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">PORT<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&gt;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token builtin\">console<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">&#096;<\/span><span class=\"token string\">MCP Server (stateless) running on http:\/\/0.0.0.0:<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span><span class=\"token constant\">PORT<\/span><span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\/mcp<\/span><span class=\"token template-punctuation string\">&#096;<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ stdio \u6a21\u5f0f<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> transport <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">StdioServerTransport<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">await<\/span> server<span class=\"token punctuation\">.<\/span><span class=\"token function\">connect<\/span><span class=\"token punctuation\">(<\/span>transport<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token builtin\">console<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;MCP Server running on stdio&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">catch<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">console<\/span><span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>3.4 \u65e0\u72b6\u6001\u6a21\u5f0f\u914d\u7f6e\u8be6\u89e3<\/h4>\n<p>\u65e0\u72b6\u6001\u6a21\u5f0f\u662f MCP v2 \u7684\u6838\u5fc3\u7279\u6027\u3002\u4ee5\u4e0b\u662f\u8be6\u7ec6\u7684\u914d\u7f6e\u8bf4\u660e&#xff1a;<\/p>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u65e0\u72b6\u6001\u6a21\u5f0f\u914d\u7f6e\u8be6\u89e3<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> mcp<span class=\"token punctuation\">.<\/span>server<span class=\"token punctuation\">.<\/span>fastmcp <span class=\"token keyword\">import<\/span> FastMCP<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f\u7684\u6838\u5fc3\u914d\u7f6e\u9879<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nmcp <span class=\"token operator\">&#061;<\/span> FastMCP<span class=\"token punctuation\">(<\/span><br \/>\n    name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;stateless-server&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    version<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;1.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p>    <span class=\"token comment\"># \u3010\u6838\u5fc3\u3011\u542f\u7528\u65e0\u72b6\u6001\u6a21\u5f0f<\/span><br \/>\n    <span class=\"token comment\"># \u6548\u679c&#xff1a;<\/span><br \/>\n    <span class=\"token comment\"># 1. \u670d\u52a1\u5668\u4e0d\u7ef4\u62a4\u4efb\u4f55 session \u72b6\u6001<\/span><br \/>\n    <span class=\"token comment\"># 2. \u6bcf\u4e2a HTTP \u8bf7\u6c42\u72ec\u7acb\u5904\u7406<\/span><br \/>\n    <span class=\"token comment\"># 3. initialize \u4e0d\u518d\u662f\u5fc5\u9700\u7684\u63e1\u624b\u6b65\u9aa4<\/span><br \/>\n    <span class=\"token comment\"># 4. \u652f\u6301\u6807\u51c6\u8d1f\u8f7d\u5747\u8861&#xff08;\u65e0\u9700 sticky session&#xff09;<\/span><br \/>\n    stateless<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p>    <span class=\"token comment\"># \u3010\u53ef\u9009\u3011\u670d\u52a1\u5668\u63cf\u8ff0\u4fe1\u606f<\/span><br \/>\n    <span class=\"token comment\"># \u4f1a\u5305\u542b\u5728 tools\/list \u7b49\u54cd\u5e94\u4e2d<\/span><br \/>\n    description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u8fd9\u662f\u4e00\u4e2a\u65e0\u72b6\u6001\u7684 AI Agent MCP \u670d\u52a1\u5668&#034;<\/span><span class=\"token punctuation\">,<\/span><\/p>\n<p>    <span class=\"token comment\"># \u3010\u53ef\u9009\u3011\u6307\u4ee4&#xff08;Instructions&#xff09;<\/span><br \/>\n    <span class=\"token comment\"># \u544a\u8bc9 AI \u6a21\u578b\u5982\u4f55\u4f7f\u7528\u6b64\u670d\u52a1\u5668<\/span><br \/>\n    instructions<span class=\"token operator\">&#061;<\/span><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u672c\u670d\u52a1\u5668\u63d0\u4f9b\u4ee5\u4e0b\u80fd\u529b&#xff1a;<br \/>\n    1. \u5929\u6c14\u67e5\u8be2 &#8211; \u83b7\u53d6\u5168\u7403\u57ce\u5e02\u5b9e\u65f6\u5929\u6c14<br \/>\n    2. \u6570\u636e\u8ba1\u7b97 &#8211; \u6267\u884c\u6570\u5b66\u8fd0\u7b97<br \/>\n    3. \u77e5\u8bc6\u68c0\u7d22 &#8211; \u67e5\u8be2\u5185\u90e8\u77e5\u8bc6\u5e93<\/p>\n<p>    \u4f7f\u7528\u5efa\u8bae&#xff1a;\u5148\u8c03\u7528 get_capabilities \u4e86\u89e3\u53ef\u7528\u5de5\u5177&#xff0c;<br \/>\n    \u518d\u6839\u636e\u7528\u6237\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u5de5\u5177\u3002<br \/>\n    &#034;&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u65e0\u72b6\u6001 vs \u6709\u72b6\u6001\u7684\u884c\u4e3a\u5dee\u5f02<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u6709\u72b6\u6001\u6a21\u5f0f&#xff08;v1&#xff0c;\u4e0d\u63a8\u8350\u7528\u4e8e\u751f\u4ea7&#xff09;&#xff1a;<br \/>\n  Client \u2192 initialize \u2192 [session \u5efa\u7acb] \u2192 tools\/list \u2192 tools\/call \u2192 &#8230;<br \/>\n  \u670d\u52a1\u5668\u7ef4\u62a4 session \u5bf9\u8c61&#xff0c;\u8bb0\u5f55\u5ba2\u6237\u7aef\u80fd\u529b\u3001\u534f\u5546\u7ed3\u679c\u7b49<\/p>\n<p>\u65e0\u72b6\u6001\u6a21\u5f0f&#xff08;v2&#xff0c;\u63a8\u8350&#xff09;&#xff1a;<br \/>\n  Client \u2192 POST \/mcp {method: &#034;tools\/list&#034;} \u2192 Response<br \/>\n  Client \u2192 POST \/mcp {method: &#034;tools\/call&#034;, params: {&#8230;}} \u2192 Response<br \/>\n  \u6bcf\u4e2a\u8bf7\u6c42\u5b8c\u5168\u72ec\u7acb&#xff0c;\u670d\u52a1\u5668\u65e0\u9700\u8bb0\u4f4f\u4efb\u4f55\u5148\u524d\u4ea4\u4e92<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<h4>3.5 \u670d\u52a1\u5668\u751f\u547d\u5468\u671f\u4e0e\u542f\u52a8\u6d41\u7a0b<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u670d\u52a1\u5668\u542f\u52a8\u6d41\u7a0b&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f&#xff09;<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u542f\u52a8\u9636\u6bb5                                                \u2502<br \/>\n\u2502  1. \u52a0\u8f7d\u914d\u7f6e&#xff08;\u73af\u5883\u53d8\u91cf\u3001\u914d\u7f6e\u6587\u4ef6&#xff09;                        \u2502<br \/>\n\u2502  2. \u521d\u59cb\u5316 FastMCP \u5b9e\u4f8b                                 \u2502<br \/>\n\u2502  3. \u6ce8\u518c\u6240\u6709 Tools \/ Resources \/ Prompts                \u2502<br \/>\n\u2502  4. \u914d\u7f6e\u4e2d\u95f4\u4ef6&#xff08;\u8ba4\u8bc1\u3001\u9650\u6d41\u3001\u65e5\u5fd7&#xff09;                       \u2502<br \/>\n\u2502  5. \u542f\u52a8 HTTP \u670d\u52a1\u5668&#xff08;Uvicorn&#xff09;                         \u2502<br \/>\n\u2502  6. \u5c31\u7eea&#xff0c;\u7b49\u5f85\u8bf7\u6c42                                      \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u8bf7\u6c42\u5904\u7406\u9636\u6bb5&#xff08;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb&#xff09;                             \u2502<br \/>\n\u2502  1. \u63a5\u6536 HTTP POST \u8bf7\u6c42                                 \u2502<br \/>\n\u2502  2. \u89e3\u6790 JSON-RPC \u6d88\u606f                                  \u2502<br \/>\n\u2502  3. \u8def\u7531\u5230\u5bf9\u5e94\u5904\u7406\u5668                                    \u2502<br \/>\n\u2502     &#8211; initialize \u2192 \u8fd4\u56de\u670d\u52a1\u5668\u80fd\u529b                       \u2502<br \/>\n\u2502     &#8211; tools\/list \u2192 \u8fd4\u56de\u5de5\u5177\u5217\u8868                         \u2502<br \/>\n\u2502     &#8211; tools\/call \u2192 \u6267\u884c\u5de5\u5177\u51fd\u6570                         \u2502<br \/>\n\u2502     &#8211; resources\/list \u2192 \u8fd4\u56de\u8d44\u6e90\u5217\u8868                     \u2502<br \/>\n\u2502     &#8211; resources\/read \u2192 \u8bfb\u53d6\u8d44\u6e90\u5185\u5bb9                     \u2502<br \/>\n\u2502     &#8211; prompts\/list \u2192 \u8fd4\u56de\u63d0\u793a\u8bcd\u5217\u8868                     \u2502<br \/>\n\u2502     &#8211; prompts\/get \u2192 \u83b7\u53d6\u63d0\u793a\u8bcd\u5185\u5bb9                      \u2502<br \/>\n\u2502  4. \u683c\u5f0f\u5316\u54cd\u5e94                                          \u2502<br \/>\n\u2502  5. \u8fd4\u56de HTTP \u54cd\u5e94                                      \u2502<br \/>\n\u2502  6. \u6e05\u7406&#xff08;\u65e0\u72b6\u6001&#xff1a;\u65e0\u9700\u6e05\u7406 session&#xff09;                     \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u5173\u95ed\u9636\u6bb5                                                \u2502<br \/>\n\u2502  1. \u63a5\u6536 SIGTERM\/SIGINT \u4fe1\u53f7                            \u2502<br \/>\n\u2502  2. \u505c\u6b62\u63a5\u53d7\u65b0\u8bf7\u6c42                                      \u2502<br \/>\n\u2502  3. \u7b49\u5f85\u8fdb\u884c\u4e2d\u7684\u8bf7\u6c42\u5b8c\u6210&#xff08;graceful shutdown&#xff09;            \u2502<br \/>\n\u2502  4. \u5173\u95ed\u8fde\u63a5\u6c60\u3001\u91ca\u653e\u8d44\u6e90                                \u2502<br \/>\n\u2502  5. \u8fdb\u7a0b\u9000\u51fa                                            \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<hr \/>\n<h3>\u56db\u3001\u5b9a\u4e49\u5de5\u5177\u63a5\u53e3\u4e0e\u5b9e\u73b0\u4e1a\u52a1\u903b\u8f91\u51fd\u6570<\/h3>\n<h4>4.1 Tool \u7684\u5b9a\u4e49\u89c4\u8303\u4e0e JSON Schema<\/h4>\n<p>\u6bcf\u4e2a MCP Tool \u5728\u534f\u8bae\u5c42\u901a\u8fc7 JSON Schema \u63cf\u8ff0\u5176\u8f93\u5165\u8f93\u51fa\u3002FastMCP \u4f1a\u81ea\u52a8\u4ece Python \u7c7b\u578b\u6ce8\u89e3\u751f\u6210 Schema&#xff0c;\u4f46\u4f60\u4e5f\u53ef\u4ee5\u624b\u52a8\u6307\u5b9a&#xff1a;<\/p>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5de5\u5177\u5b9a\u4e49\u7684 JSON Schema \u7ed3\u6784&#xff08;\u534f\u8bae\u5c42&#xff09;<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token comment\"># \u5f53\u4f60\u5b9a\u4e49\u5982\u4e0b\u5de5\u5177\u65f6&#xff1a;<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">search_users<\/span><span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> limit<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> active_only<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u641c\u7d22\u7528\u6237\u3002&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p><span class=\"token comment\"># FastMCP \u81ea\u52a8\u751f\u6210\u7684 JSON Schema \u7b49\u4ef7\u4e8e&#xff1a;<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n{<br \/>\n    &#034;name&#034;: &#034;search_users&#034;,<br \/>\n    &#034;description&#034;: &#034;\u641c\u7d22\u7528\u6237\u3002&#034;,<br \/>\n    &#034;inputSchema&#034;: {<br \/>\n        &#034;type&#034;: &#034;object&#034;,<br \/>\n        &#034;properties&#034;: {<br \/>\n            &#034;query&#034;: {<br \/>\n                &#034;type&#034;: &#034;string&#034;,<br \/>\n                &#034;description&#034;: &#034;\u641c\u7d22\u5173\u952e\u8bcd&#034;<br \/>\n            },<br \/>\n            &#034;limit&#034;: {<br \/>\n                &#034;type&#034;: &#034;integer&#034;,<br \/>\n                &#034;default&#034;: 10,<br \/>\n                &#034;description&#034;: &#034;\u8fd4\u56de\u7ed3\u679c\u6570\u91cf\u4e0a\u9650&#034;<br \/>\n            },<br \/>\n            &#034;active_only&#034;: {<br \/>\n                &#034;type&#034;: &#034;boolean&#034;,<br \/>\n                &#034;default&#034;: true,<br \/>\n                &#034;description&#034;: &#034;\u662f\u5426\u53ea\u8fd4\u56de\u6d3b\u8dc3\u7528\u6237&#034;<br \/>\n            }<br \/>\n        },<br \/>\n        &#034;required&#034;: [&#034;query&#034;]<br \/>\n    }<br \/>\n}<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<h4>4.2 \u4f7f\u7528\u88c5\u9970\u5668\u6ce8\u518c\u5de5\u5177&#xff08;Python&#xff09;<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/tools\/weather.py &#8211; \u5929\u6c14\u67e5\u8be2\u5de5\u5177\u96c6<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u6f14\u793a\u591a\u79cd\u5de5\u5177\u5b9a\u4e49\u6a21\u5f0f<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">import<\/span> httpx<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Optional<br \/>\n<span class=\"token keyword\">from<\/span> datetime <span class=\"token keyword\">import<\/span> datetime<br \/>\n<span class=\"token keyword\">from<\/span> mcp<span class=\"token punctuation\">.<\/span>server<span class=\"token punctuation\">.<\/span>fastmcp <span class=\"token keyword\">import<\/span> FastMCP<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span>__name__<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u5047\u8bbe mcp \u5b9e\u4f8b\u4ece\u4e3b\u6a21\u5757\u5bfc\u5165<\/span><br \/>\n<span class=\"token comment\"># from src.server import mcp<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">register_weather_tools<\/span><span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">:<\/span> FastMCP<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c\u6240\u6709\u5929\u6c14\u76f8\u5173\u5de5\u5177\u5230 MCP \u670d\u52a1\u5668&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u5de5\u51771&#xff1a;\u83b7\u53d6\u5b9e\u65f6\u5929\u6c14&#xff08;\u540c\u6b65\u7248\u672c&#xff09;<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_current_weather<\/span><span class=\"token punctuation\">(<\/span>city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> unit<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6307\u5b9a\u57ce\u5e02\u7684\u5f53\u524d\u5929\u6c14\u4fe1\u606f\u3002<\/p>\n<p>        \u5305\u62ec\u6e29\u5ea6\u3001\u6e7f\u5ea6\u3001\u98ce\u901f\u3001\u5929\u6c14\u72b6\u51b5\u7b49\u5b9e\u65f6\u6570\u636e\u3002<br \/>\n        \u6570\u636e\u6765\u6e90&#xff1a;OpenWeatherMap API\u3002<\/p>\n<p>        Args:<br \/>\n            city: \u57ce\u5e02\u540d\u79f0&#xff08;\u652f\u6301\u4e2d\u6587\u548c\u82f1\u6587&#xff09;&#xff0c;\u5982 &#034;\u5317\u4eac&#034;\u3001&#034;Tokyo&#034;\u3001&#034;London&#034;<br \/>\n            unit: \u6e29\u5ea6\u5355\u4f4d&#xff0c;\u53ef\u9009 &#034;celsius&#034;&#xff08;\u6444\u6c0f\u5ea6&#xff09;\u6216 &#034;fahrenheit&#034;&#xff08;\u534e\u6c0f\u5ea6&#xff09;<\/p>\n<p>        Returns:<br \/>\n            JSON \u683c\u5f0f\u7684\u5929\u6c14\u4fe1\u606f\u5b57\u7b26\u4e32<\/p>\n<p>        Raises:<br \/>\n            ValueError: \u5f53\u57ce\u5e02\u540d\u79f0\u4e3a\u7a7a\u65f6<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u53c2\u6570\u6821\u9a8c<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> city <span class=\"token keyword\">or<\/span> <span class=\"token keyword\">not<\/span> city<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u57ce\u5e02\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6a21\u62df API \u8c03\u7528&#xff08;\u5b9e\u9645\u9879\u76ee\u4e2d\u66ff\u6362\u4e3a\u771f\u5b9e API&#xff09;<\/span><br \/>\n        <span class=\"token comment\"># \u8fd9\u91cc\u4f7f\u7528\u6a21\u62df\u6570\u636e\u6f14\u793a<\/span><br \/>\n        weather_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;timestamp&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;temperature&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">26.5<\/span> <span class=\"token keyword\">if<\/span> unit <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token number\">79.7<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> unit<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;humidity&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">65<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;wind_speed&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">12.3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;wind_direction&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e1c\u5357&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;condition&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u591a\u4e91&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;description&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>city<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u5f53\u524d\u5929\u6c14\u591a\u4e91&#xff0c;\u6c14\u6e29\u9002\u5b9c&#xff0c;\u9002\u5408\u5916\u51fa\u6d3b\u52a8\u3002&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;forecast_hint&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u672a\u67652\u5c0f\u65f6\u53ef\u80fd\u6709\u5c0f\u96e8&#xff0c;\u5efa\u8bae\u643a\u5e26\u96e8\u5177\u3002&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u83b7\u53d6\u5929\u6c14: city&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>city<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">, unit&#061;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>unit<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>weather_data<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u5de5\u51772&#xff1a;\u83b7\u53d6\u5929\u6c14\u9884\u62a5&#xff08;\u5f02\u6b65\u7248\u672c&#xff09;<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_weather_forecast<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        days<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        include_hourly<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6307\u5b9a\u57ce\u5e02\u672a\u6765\u51e0\u5929\u7684\u5929\u6c14\u9884\u62a5\u3002<\/p>\n<p>        \u652f\u6301\u83b7\u53d61-7\u5929\u7684\u5929\u6c14\u9884\u62a5&#xff0c;\u53ef\u9009\u62e9\u662f\u5426\u5305\u542b\u9010\u5c0f\u65f6\u9884\u62a5\u3002<\/p>\n<p>        Args:<br \/>\n            city: \u57ce\u5e02\u540d\u79f0<br \/>\n            days: \u9884\u62a5\u5929\u6570&#xff08;1-7&#xff09;&#xff0c;\u9ed8\u8ba43\u5929<br \/>\n            include_hourly: \u662f\u5426\u5305\u542b\u9010\u5c0f\u65f6\u9884\u62a5&#xff0c;\u9ed8\u8ba4\u5426<\/p>\n<p>        Returns:<br \/>\n            JSON \u683c\u5f0f\u7684\u5929\u6c14\u9884\u62a5\u6570\u636e<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u53c2\u6570\u6821\u9a8c<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> days <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">or<\/span> days <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">7<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u9884\u62a5\u5929\u6570\u5fc5\u987b\u5728 1-7 \u4e4b\u95f4&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6a21\u62df\u5f02\u6b65 API \u8c03\u7528<\/span><br \/>\n        <span class=\"token comment\"># \u5b9e\u9645\u9879\u76ee\u4e2d\u4f7f\u7528 httpx.AsyncClient<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">10.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> client<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u5b9e\u9645\u8c03\u7528\u793a\u4f8b&#xff08;\u9700\u8981 API Key&#xff09;&#xff1a;<\/span><br \/>\n            <span class=\"token comment\"># response &#061; await client.get(<\/span><br \/>\n            <span class=\"token comment\">#     f&#034;https:\/\/api.openweathermap.org\/data\/2.5\/forecast&#034;,<\/span><br \/>\n            <span class=\"token comment\">#     params&#061;{&#034;q&#034;: city, &#034;cnt&#034;: days * 8, &#034;appid&#034;: API_KEY}<\/span><br \/>\n            <span class=\"token comment\"># )<\/span><br \/>\n            <span class=\"token keyword\">pass<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6a21\u62df\u8fd4\u56de\u6570\u636e<\/span><br \/>\n        forecast <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;days&#034;<\/span><span class=\"token punctuation\">:<\/span> days<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;generated_at&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;daily_forecast&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;date&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;2026-08-<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token number\">5<\/span><span class=\"token operator\">&#043;<\/span>i<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">02d<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;high&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">32<\/span> <span class=\"token operator\">&#8211;<\/span> i<span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;low&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">24<\/span> <span class=\"token operator\">&#8211;<\/span> i<span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;condition&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\u6674&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u591a\u4e91&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\u5c0f\u96e8&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>i <span class=\"token operator\">%<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;precipitation&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">70<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>i <span class=\"token operator\">%<\/span> <span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> i <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>days<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> include_hourly<span class=\"token punctuation\">:<\/span><br \/>\n            forecast<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;hourly&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;hour&#034;<\/span><span class=\"token punctuation\">:<\/span> h<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;temp&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">25<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">%<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;condition&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6674&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> h <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">24<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">]<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>forecast<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u5de5\u51773&#xff1a;\u5929\u6c14\u9884\u8b66\u67e5\u8be2&#xff08;\u5e26\u9519\u8bef\u5904\u7406&#xff09;<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_weather_alerts<\/span><span class=\"token punctuation\">(<\/span>city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> province<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u67e5\u8be2\u6307\u5b9a\u57ce\u5e02\u7684\u6c14\u8c61\u9884\u8b66\u4fe1\u606f\u3002<\/p>\n<p>        \u8fd4\u56de\u5f53\u524d\u751f\u6548\u7684\u6c14\u8c61\u9884\u8b66&#xff0c;\u5305\u62ec\u66b4\u96e8\u3001\u9ad8\u6e29\u3001\u53f0\u98ce\u7b49\u9884\u8b66\u3002<\/p>\n<p>        Args:<br \/>\n            city: \u57ce\u5e02\u540d\u79f0<br \/>\n            province: \u7701\u4efd\u540d\u79f0&#xff08;\u53ef\u9009&#xff0c;\u7528\u4e8e\u6d88\u6b67\u4e49&#xff09;<\/p>\n<p>        Returns:<br \/>\n            JSON \u683c\u5f0f\u7684\u9884\u8b66\u4fe1\u606f\u5217\u8868<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u6a21\u62df\u67e5\u8be2\u903b\u8f91<\/span><br \/>\n            alerts <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token comment\"># \u6a21\u62df&#xff1a;\u5317\u4eac\u6709\u9ad8\u6e29\u9884\u8b66<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;\u5317\u4eac&#034;<\/span> <span class=\"token keyword\">in<\/span> city <span class=\"token keyword\">or<\/span> <span class=\"token string\">&#034;beijing&#034;<\/span> <span class=\"token keyword\">in<\/span> city<span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                alerts<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u9ad8\u6e29\u6a59\u8272\u9884\u8b66&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;level&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;orange&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;issued_at&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2026-08-05T06:00:00&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;expires_at&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2026-08-05T20:00:00&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;description&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u9884\u8ba1\u4eca\u5929\u6700\u9ad8\u6c14\u6e29\u5c06\u8fbe37\u2103\u4ee5\u4e0a&#xff0c;\u8bf7\u6ce8\u610f\u9632\u6691\u964d\u6e29\u3002&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;suggestions&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                        <span class=\"token string\">&#034;\u51cf\u5c11\u6237\u5916\u6d3b\u52a8&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token string\">&#034;\u591a\u996e\u6c34&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token string\">&#034;\u5173\u6ce8\u8001\u4eba\u548c\u513f\u7ae5&#034;<\/span><br \/>\n                    <span class=\"token punctuation\">]<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            result <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;province&#034;<\/span><span class=\"token punctuation\">:<\/span> province<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;alert_count&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>alerts<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;alerts&#034;<\/span><span class=\"token punctuation\">:<\/span> alerts<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;query_time&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            logger<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u67e5\u8be2\u5929\u6c14\u9884\u8b66\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u67e5\u8be2\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;suggestion&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u7a0d\u540e\u91cd\u8bd5\u6216\u68c0\u67e5\u57ce\u5e02\u540d\u79f0\u662f\u5426\u6b63\u786e&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u6a21\u5757\u7ea7\u6ce8\u518c\u51fd\u6570&#xff08;\u4f9b server.py \u8c03\u7528&#xff09;<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">setup<\/span><span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">:<\/span> FastMCP<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    register_weather_tools<span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">)<\/span><\/p>\n<h4>4.3 \u5de5\u5177\u53c2\u6570\u6821\u9a8c\u4e0e\u7c7b\u578b\u5b89\u5168<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u53c2\u6570\u6821\u9a8c\u6700\u4f73\u5b9e\u8df5<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> pydantic <span class=\"token keyword\">import<\/span> BaseModel<span class=\"token punctuation\">,<\/span> Field<span class=\"token punctuation\">,<\/span> field_validator<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> List<span class=\"token punctuation\">,<\/span> Optional<br \/>\n<span class=\"token keyword\">from<\/span> enum <span class=\"token keyword\">import<\/span> Enum<\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u65b9\u5f0f\u4e00&#xff1a;\u4f7f\u7528 Pydantic \u6a21\u578b\u5b9a\u4e49\u590d\u6742\u8f93\u5165<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">SearchQuery<\/span><span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u641c\u7d22\u67e5\u8be2\u53c2\u6570\u6a21\u578b&#034;&#034;&#034;<\/span><\/p>\n<p>    keyword<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u5fc5\u586b<\/span><br \/>\n        min_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        max_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u641c\u7d22\u5173\u952e\u8bcd&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    category<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u641c\u7d22\u5206\u7c7b\u8fc7\u6ee4&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    page<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        ge<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u6700\u5c0f\u503c<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u9875\u7801&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    page_size<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        ge<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        le<span class=\"token operator\">&#061;<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u6700\u5927\u503c<\/span><br \/>\n        description<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;\u6bcf\u9875\u6570\u91cf&#034;<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;field_validator<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;keyword&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;classmethod<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">validate_keyword<\/span><span class=\"token punctuation\">(<\/span>cls<span class=\"token punctuation\">,<\/span> v<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6821\u9a8c\u5173\u952e\u8bcd\u4e0d\u5305\u542b\u5371\u9669\u5b57\u7b26&#034;&#034;&#034;<\/span><br \/>\n        dangerous_chars <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;&lt;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&gt;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#8211;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\/*&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;*\/&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> char <span class=\"token keyword\">in<\/span> dangerous_chars<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> char <span class=\"token keyword\">in<\/span> v<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u5173\u952e\u8bcd\u4e0d\u80fd\u5305\u542b\u7279\u6b8a\u5b57\u7b26: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>char<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> v<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5de5\u5177\u4e2d\u4f7f\u7528 Pydantic \u6a21\u578b<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">advanced_search<\/span><span class=\"token punctuation\">(<\/span>params<span class=\"token punctuation\">:<\/span> SearchQuery<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u9ad8\u7ea7\u641c\u7d22\u5de5\u5177&#xff0c;\u652f\u6301\u5206\u9875\u548c\u5206\u7c7b\u8fc7\u6ee4\u3002<\/p>\n<p>    Args:<br \/>\n        params: \u641c\u7d22\u53c2\u6570\u5bf9\u8c61<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># FastMCP \u4f1a\u81ea\u52a8\u8fdb\u884c\u53c2\u6570\u6821\u9a8c<\/span><br \/>\n    <span class=\"token comment\"># \u5982\u679c\u6821\u9a8c\u5931\u8d25&#xff0c;\u4f1a\u8fd4\u56de\u7ed3\u6784\u5316\u7684\u9519\u8bef\u4fe1\u606f\u7ed9\u5ba2\u6237\u7aef<\/span><br \/>\n    results <span class=\"token operator\">&#061;<\/span> perform_search<span class=\"token punctuation\">(<\/span><br \/>\n        keyword<span class=\"token operator\">&#061;<\/span>params<span class=\"token punctuation\">.<\/span>keyword<span class=\"token punctuation\">,<\/span><br \/>\n        category<span class=\"token operator\">&#061;<\/span>params<span class=\"token punctuation\">.<\/span>category<span class=\"token punctuation\">,<\/span><br \/>\n        page<span class=\"token operator\">&#061;<\/span>params<span class=\"token punctuation\">.<\/span>page<span class=\"token punctuation\">,<\/span><br \/>\n        page_size<span class=\"token operator\">&#061;<\/span>params<span class=\"token punctuation\">.<\/span>page_size<br \/>\n    <span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u65b9\u5f0f\u4e8c&#xff1a;\u4f7f\u7528\u679a\u4e3e\u7ea6\u675f\u53c2\u6570\u503c<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">SortOrder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6392\u5e8f\u65b9\u5f0f\u679a\u4e3e&#034;&#034;&#034;<\/span><br \/>\n    RELEVANCE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;relevance&#034;<\/span>    <span class=\"token comment\"># \u76f8\u5173\u5ea6<\/span><br \/>\n    DATE_DESC <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;date_desc&#034;<\/span>    <span class=\"token comment\"># \u65e5\u671f\u964d\u5e8f<\/span><br \/>\n    DATE_ASC <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;date_asc&#034;<\/span>      <span class=\"token comment\"># \u65e5\u671f\u5347\u5e8f<\/span><br \/>\n    POPULARITY <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;popularity&#034;<\/span>  <span class=\"token comment\"># \u70ed\u5ea6<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">search_articles<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    query<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    sort_by<span class=\"token punctuation\">:<\/span> SortOrder <span class=\"token operator\">&#061;<\/span> SortOrder<span class=\"token punctuation\">.<\/span>RELEVANCE<span class=\"token punctuation\">,<\/span><br \/>\n    limit<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u641c\u7d22\u6587\u7ae0&#xff0c;\u652f\u6301\u591a\u79cd\u6392\u5e8f\u65b9\u5f0f\u3002<\/p>\n<p>    Args:<br \/>\n        query: \u641c\u7d22\u5173\u952e\u8bcd<br \/>\n        sort_by: \u6392\u5e8f\u65b9\u5f0f (relevance\/date_desc\/date_asc\/popularity)<br \/>\n        limit: \u8fd4\u56de\u6570\u91cf\u4e0a\u9650<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># sort_by \u4f1a\u88ab\u81ea\u52a8\u6821\u9a8c\u4e3a\u6709\u6548\u7684\u679a\u4e3e\u503c<\/span><br \/>\n    <span class=\"token comment\"># \u5982\u679c\u4f20\u5165\u65e0\u6548\u503c&#xff0c;MCP \u4f1a\u8fd4\u56de\u6821\u9a8c\u9519\u8bef<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<h4>4.4 \u5f02\u6b65\u5de5\u5177\u4e0e\u5e76\u53d1\u5904\u7406<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5f02\u6b65\u5de5\u5177\u4e0e\u5e76\u53d1\u5904\u7406<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> httpx<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> List<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">batch_weather_query<\/span><span class=\"token punctuation\">(<\/span>cities<span class=\"token punctuation\">:<\/span> List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6279\u91cf\u67e5\u8be2\u591a\u4e2a\u57ce\u5e02\u7684\u5929\u6c14&#xff08;\u5e76\u53d1\u6267\u884c&#xff09;\u3002<\/p>\n<p>    \u4f7f\u7528 asyncio.gather \u5e76\u53d1\u8bf7\u6c42\u591a\u4e2a\u57ce\u5e02\u7684\u5929\u6c14\u6570\u636e&#xff0c;<br \/>\n    \u663e\u8457\u63d0\u5347\u591a\u57ce\u5e02\u67e5\u8be2\u7684\u54cd\u5e94\u901f\u5ea6\u3002<\/p>\n<p>    Args:<br \/>\n        cities: \u57ce\u5e02\u540d\u79f0\u5217\u8868&#xff0c;\u6700\u591a\u652f\u630110\u4e2a\u57ce\u5e02<\/p>\n<p>    Returns:<br \/>\n        JSON \u683c\u5f0f\u7684\u591a\u57ce\u5e02\u5929\u6c14\u6570\u636e<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>cities<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u5355\u6b21\u6700\u591a\u67e5\u8be210\u4e2a\u57ce\u5e02&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>cities<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u57ce\u5e02\u5217\u8868\u4e0d\u80fd\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u5e76\u53d1\u67e5\u8be2\u6240\u6709\u57ce\u5e02<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">fetch_city_weather<\/span><span class=\"token punctuation\">(<\/span>city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u5355\u4e2a\u57ce\u5e02\u5929\u6c14&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u6a21\u62df\u7f51\u7edc\u5ef6\u8fdf<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span><span class=\"token number\">0.1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;temperature&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">25<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token builtin\">hash<\/span><span class=\"token punctuation\">(<\/span>city<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;condition&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6674&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;success&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;failed&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\"># \u4f7f\u7528 asyncio.gather \u5e76\u53d1\u6267\u884c<\/span><br \/>\n    <span class=\"token comment\"># return_exceptions&#061;True \u786e\u4fdd\u5355\u4e2a\u5931\u8d25\u4e0d\u5f71\u54cd\u5176\u4ed6<\/span><br \/>\n    results <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span><br \/>\n        <span class=\"token operator\">*<\/span><span class=\"token punctuation\">[<\/span>fetch_city_weather<span class=\"token punctuation\">(<\/span>city<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> city <span class=\"token keyword\">in<\/span> cities<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        return_exceptions<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u5904\u7406\u7ed3\u679c<\/span><br \/>\n    weather_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> i<span class=\"token punctuation\">,<\/span> result <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            weather_data<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> cities<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;failed&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            weather_data<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;total_cities&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>cities<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;successful&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> r <span class=\"token keyword\">in<\/span> weather_data <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;success&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;failed&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> r <span class=\"token keyword\">in<\/span> weather_data <span class=\"token keyword\">if<\/span> r<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;failed&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;data&#034;<\/span><span class=\"token punctuation\">:<\/span> weather_data<br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">long_running_task<\/span><span class=\"token punctuation\">(<\/span>task_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> timeout_seconds<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6267\u884c\u8017\u65f6\u4efb\u52a1&#xff08;\u5e26\u8d85\u65f6\u63a7\u5236&#xff09;\u3002<\/p>\n<p>    \u9002\u7528\u4e8e\u9700\u8981\u8f83\u957f\u65f6\u95f4\u5904\u7406\u7684\u4efb\u52a1&#xff0c;\u5982\u6570\u636e\u5206\u6790\u3001\u62a5\u544a\u751f\u6210\u7b49\u3002<br \/>\n    \u5185\u7f6e\u8d85\u65f6\u673a\u5236\u9632\u6b62\u65e0\u9650\u7b49\u5f85\u3002<\/p>\n<p>    Args:<br \/>\n        task_id: \u4efb\u52a1\u6807\u8bc6\u7b26<br \/>\n        timeout_seconds: \u8d85\u65f6\u65f6\u95f4&#xff08;\u79d2&#xff09;&#xff0c;\u9ed8\u8ba430\u79d2<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u4f7f\u7528 asyncio.wait_for \u8bbe\u7f6e\u8d85\u65f6<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>wait_for<span class=\"token punctuation\">(<\/span><br \/>\n            _do_heavy_computation<span class=\"token punctuation\">(<\/span>task_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            timeout<span class=\"token operator\">&#061;<\/span>timeout_seconds<br \/>\n        <span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;task_id&#034;<\/span><span class=\"token punctuation\">:<\/span> task_id<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;result&#034;<\/span><span class=\"token punctuation\">:<\/span> result<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;completed&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> asyncio<span class=\"token punctuation\">.<\/span>TimeoutError<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;task_id&#034;<\/span><span class=\"token punctuation\">:<\/span> task_id<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4efb\u52a1\u8d85\u65f6&#xff08;\u8d85\u8fc7<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>timeout_seconds<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u79d2&#xff09;&#034;<\/span><\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_do_heavy_computation<\/span><span class=\"token punctuation\">(<\/span>task_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6a21\u62df\u8017\u65f6\u8ba1\u7b97&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u6a21\u62df\u8017\u65f6\u64cd\u4f5c<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;computed_value&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">42<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;task_id&#034;<\/span><span class=\"token punctuation\">:<\/span> task_id<span class=\"token punctuation\">}<\/span><\/p>\n<h4>4.5 \u5de5\u5177\u8fd4\u56de\u503c\u683c\u5f0f\u5316<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5de5\u5177\u8fd4\u56de\u503c\u6700\u4f73\u5b9e\u8df5<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> mcp<span class=\"token punctuation\">.<\/span>types <span class=\"token keyword\">import<\/span> TextContent<span class=\"token punctuation\">,<\/span> ImageContent<span class=\"token punctuation\">,<\/span> EmbeddedResource<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">generate_report<\/span><span class=\"token punctuation\">(<\/span>report_type<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> data_source<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u751f\u6210\u6570\u636e\u62a5\u544a\u3002<\/p>\n<p>    \u8fd4\u56de\u503c\u683c\u5f0f\u89c4\u8303&#xff1a;<br \/>\n    1. \u59cb\u7ec8\u8fd4\u56de JSON \u5b57\u7b26\u4e32<br \/>\n    2. \u5305\u542b status \u5b57\u6bb5\u8868\u793a\u6267\u884c\u72b6\u6001<br \/>\n    3. \u9519\u8bef\u65f6\u5305\u542b error \u548c suggestion \u5b57\u6bb5<br \/>\n    4. \u6210\u529f\u65f6\u5305\u542b data \u5b57\u6bb5<\/p>\n<p>    Args:<br \/>\n        report_type: \u62a5\u544a\u7c7b\u578b (summary\/detailed\/export)<br \/>\n        data_source: \u6570\u636e\u6e90\u6807\u8bc6<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u4e1a\u52a1\u903b\u8f91&#8230;<\/span><br \/>\n        report_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;title&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6708\u5ea6\u62a5\u544a&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;rows&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">150<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6210\u529f\u54cd\u5e94\u683c\u5f0f<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;success&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;data&#034;<\/span><span class=\"token punctuation\">:<\/span> report_data<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;metadata&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;generated_at&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;report_type&#034;<\/span><span class=\"token punctuation\">:<\/span> report_type<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;data_source&#034;<\/span><span class=\"token punctuation\">:<\/span> data_source<br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">except<\/span> PermissionError<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;PERMISSION_DENIED&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u65e0\u6743\u8bbf\u95ee\u6307\u5b9a\u6570\u636e\u6e90&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;suggestion&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458\u83b7\u53d6\u8bbf\u95ee\u6743\u9650&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>exception<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u751f\u6210\u62a5\u544a\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;INTERNAL_ERROR&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u62a5\u544a\u751f\u6210\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;suggestion&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u7a0d\u540e\u91cd\u8bd5&#xff0c;\u5982\u6301\u7eed\u51fa\u73b0\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>4.6 \u5b9e\u6218&#xff1a;\u6784\u5efa\u5929\u6c14\u67e5\u8be2 &#043; \u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177\u96c6<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/tools\/database.py &#8211; \u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177\u96c6<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u6f14\u793a\u5b89\u5168\u7684\u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">import<\/span> sqlite3<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Optional<span class=\"token punctuation\">,<\/span> List<span class=\"token punctuation\">,<\/span> Dict<span class=\"token punctuation\">,<\/span> Any<br \/>\n<span class=\"token keyword\">from<\/span> contextlib <span class=\"token keyword\">import<\/span> contextmanager<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span>__name__<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u6570\u636e\u5e93\u8fde\u63a5\u914d\u7f6e<\/span><br \/>\nDB_PATH <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;.\/data\/app.db&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;contextmanager<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_db_connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6570\u636e\u5e93\u8fde\u63a5\u7684\u4e0a\u4e0b\u6587\u7ba1\u7406\u5668&#034;&#034;&#034;<\/span><br \/>\n    conn <span class=\"token operator\">&#061;<\/span> sqlite3<span class=\"token punctuation\">.<\/span>connect<span class=\"token punctuation\">(<\/span>DB_PATH<span class=\"token punctuation\">)<\/span><br \/>\n    conn<span class=\"token punctuation\">.<\/span>row_factory <span class=\"token operator\">&#061;<\/span> sqlite3<span class=\"token punctuation\">.<\/span>Row  <span class=\"token comment\"># \u8fd4\u56de\u5b57\u5178\u683c\u5f0f<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">yield<\/span> conn<br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        conn<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">register_database_tools<\/span><span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c\u6570\u636e\u5e93\u64cd\u4f5c\u5de5\u5177&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">query_records<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        table<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        conditions<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        columns<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span>List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        order_by<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        limit<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">50<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u67e5\u8be2\u6570\u636e\u5e93\u8bb0\u5f55&#xff08;\u53ea\u8bfb\u64cd\u4f5c&#xff09;\u3002<\/p>\n<p>        \u5b89\u5168\u7684 SELECT \u67e5\u8be2\u5de5\u5177&#xff0c;\u81ea\u52a8\u9632\u6b62 SQL \u6ce8\u5165\u3002<br \/>\n        \u4ec5\u5141\u8bb8\u67e5\u8be2\u767d\u540d\u5355\u4e2d\u7684\u8868\u3002<\/p>\n<p>        Args:<br \/>\n            table: \u8868\u540d&#xff08;\u4ec5\u5141\u8bb8: users, orders, products&#xff09;<br \/>\n            conditions: WHERE \u6761\u4ef6&#xff08;\u7b80\u5355\u683c\u5f0f&#xff0c;\u5982 &#034;age &gt; 18&#034;&#xff09;<br \/>\n            columns: \u8981\u67e5\u8be2\u7684\u5217\u540d\u5217\u8868&#xff0c;\u9ed8\u8ba4\u6240\u6709\u5217<br \/>\n            order_by: \u6392\u5e8f\u5b57\u6bb5<br \/>\n            limit: \u8fd4\u56de\u8bb0\u5f55\u6570\u4e0a\u9650&#xff08;\u6700\u5927100&#xff09;<\/p>\n<p>        Returns:<br \/>\n            JSON \u683c\u5f0f\u7684\u67e5\u8be2\u7ed3\u679c<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u5b89\u5168\u6821\u9a8c&#xff1a;\u767d\u540d\u5355\u8868<\/span><br \/>\n        ALLOWED_TABLES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;users&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;orders&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;products&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> table <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> ALLOWED_TABLES<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4e0d\u5141\u8bb8\u67e5\u8be2\u8868 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039;&#xff0c;\u5141\u8bb8\u7684\u8868: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>ALLOWED_TABLES<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u5b89\u5168\u6821\u9a8c&#xff1a;limit \u8303\u56f4<\/span><br \/>\n        limit <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> limit<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6784\u5efa\u5b89\u5168\u7684 SQL \u67e5\u8be2<\/span><br \/>\n        select_cols <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;, &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>columns<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> columns <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;*&#034;<\/span><br \/>\n        sql <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;SELECT <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>select_cols<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> FROM <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>        params <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> conditions<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u6ce8\u610f&#xff1a;\u751f\u4ea7\u73af\u5883\u5e94\u4f7f\u7528\u53c2\u6570\u5316\u67e5\u8be2<\/span><br \/>\n            <span class=\"token comment\"># \u8fd9\u91cc\u7b80\u5316\u6f14\u793a&#xff0c;\u5b9e\u9645\u5e94\u89e3\u6790\u6761\u4ef6\u5e76\u4f7f\u7528\u5360\u4f4d\u7b26<\/span><br \/>\n            sql <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034; WHERE <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>conditions<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> order_by<span class=\"token punctuation\">:<\/span><br \/>\n            sql <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034; ORDER BY <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>order_by<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>        sql <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034; LIMIT <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>limit<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">with<\/span> get_db_connection<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> conn<span class=\"token punctuation\">:<\/span><br \/>\n                cursor <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">)<\/span><br \/>\n                rows <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">(<\/span>row<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> row <span class=\"token keyword\">in<\/span> cursor<span class=\"token punctuation\">.<\/span>fetchall<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;success&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;table&#034;<\/span><span class=\"token punctuation\">:<\/span> table<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;count&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>rows<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;data&#034;<\/span><span class=\"token punctuation\">:<\/span> rows<br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">except<\/span> sqlite3<span class=\"token punctuation\">.<\/span>Error <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            logger<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6570\u636e\u5e93\u67e5\u8be2\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u67e5\u8be2\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">insert_record<\/span><span class=\"token punctuation\">(<\/span>table<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">:<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Any<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5411\u6570\u636e\u5e93\u63d2\u5165\u4e00\u6761\u8bb0\u5f55\u3002<\/p>\n<p>        Args:<br \/>\n            table: \u76ee\u6807\u8868\u540d<br \/>\n            data: \u8981\u63d2\u5165\u7684\u6570\u636e&#xff08;\u952e\u503c\u5bf9&#xff09;<\/p>\n<p>        Returns:<br \/>\n            \u63d2\u5165\u7ed3\u679c&#xff0c;\u5305\u542b\u65b0\u8bb0\u5f55\u7684 ID<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        ALLOWED_TABLES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;users&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;orders&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;products&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> table <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> ALLOWED_TABLES<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e0d\u5141\u8bb8\u7684\u8868\u540d&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> data<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6570\u636e\u4e0d\u80fd\u4e3a\u7a7a&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        columns <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;, &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">.<\/span>keys<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        placeholders <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;, &#034;<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;?&#034;<\/span> <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        sql <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;INSERT INTO <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> (<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>columns<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">) VALUES (<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>placeholders<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">)&#034;<\/span><\/span><\/p>\n<p>        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">with<\/span> get_db_connection<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> conn<span class=\"token punctuation\">:<\/span><br \/>\n                cursor <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                conn<span class=\"token punctuation\">.<\/span>commit<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                new_id <span class=\"token operator\">&#061;<\/span> cursor<span class=\"token punctuation\">.<\/span>lastrowid<\/p>\n<p>            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;success&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6210\u529f\u63d2\u5165\u8bb0\u5f55&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;new_id&#034;<\/span><span class=\"token punctuation\">:<\/span> new_id<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;table&#034;<\/span><span class=\"token punctuation\">:<\/span> table<br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> sqlite3<span class=\"token punctuation\">.<\/span>Error <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_table_schema<\/span><span class=\"token punctuation\">(<\/span>table<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6570\u636e\u5e93\u8868\u7684\u7ed3\u6784\u4fe1\u606f\u3002<\/p>\n<p>        Args:<br \/>\n            table: \u8868\u540d<\/p>\n<p>        Returns:<br \/>\n            \u8868\u7684\u5217\u540d\u3001\u7c7b\u578b\u3001\u7ea6\u675f\u7b49\u4fe1\u606f<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">with<\/span> get_db_connection<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> conn<span class=\"token punctuation\">:<\/span><br \/>\n                cursor <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;PRAGMA table_info(<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">)&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                columns <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">(<\/span>row<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> row <span class=\"token keyword\">in<\/span> cursor<span class=\"token punctuation\">.<\/span>fetchall<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> columns<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u8868 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>table<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u4e0d\u5b58\u5728&#034;<\/span><\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;success&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;table&#034;<\/span><span class=\"token punctuation\">:<\/span> table<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;columns&#034;<\/span><span class=\"token punctuation\">:<\/span> columns<br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<hr \/>\n<h3>\u4e94\u3001\u914d\u7f6e\u8d44\u6e90\u6620\u5c04\u4e0e\u63d0\u793a\u8bcd\u6a21\u677f\u6ce8\u5165<\/h3>\n<h4>5.1 Resource \u7684\u6982\u5ff5\u4e0e URI \u89c4\u8303<\/h4>\n<p>MCP Resource \u4f7f\u7528 URI \u6765\u552f\u4e00\u6807\u8bc6\u8d44\u6e90\u3002URI \u683c\u5f0f\u9075\u5faa RFC 3986&#xff0c;\u5e38\u89c1\u7684 scheme \u5305\u62ec&#xff1a;<\/p>\n<table>\n<tr>URI Scheme\u7528\u9014\u793a\u4f8b<\/tr>\n<tbody>\n<tr>\n<td>file:\/\/<\/td>\n<td>\u6587\u4ef6\u7cfb\u7edf\u8d44\u6e90<\/td>\n<td>file:\/\/\/docs\/readme.md<\/td>\n<\/tr>\n<tr>\n<td>db:\/\/<\/td>\n<td>\u6570\u636e\u5e93\u8d44\u6e90<\/td>\n<td>db:\/\/users\/schema<\/td>\n<\/tr>\n<tr>\n<td>config:\/\/<\/td>\n<td>\u914d\u7f6e\u4fe1\u606f<\/td>\n<td>config:\/\/server-info<\/td>\n<\/tr>\n<tr>\n<td>api:\/\/<\/td>\n<td>API \u6587\u6863<\/td>\n<td>api:\/\/v2\/endpoints<\/td>\n<\/tr>\n<tr>\n<td>knowledge:\/\/<\/td>\n<td>\u77e5\u8bc6\u5e93<\/td>\n<td>knowledge:\/\/faq\/shipping<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>5.2 \u9759\u6001\u8d44\u6e90\u4e0e\u52a8\u6001\u8d44\u6e90\u6ce8\u518c<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/resources\/knowledge_base.py &#8211; \u77e5\u8bc6\u5e93\u8d44\u6e90<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> datetime <span class=\"token keyword\">import<\/span> datetime<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">register_resources<\/span><span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c\u6240\u6709\u8d44\u6e90&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u9759\u6001\u8d44\u6e90&#xff1a;\u670d\u52a1\u5668\u914d\u7f6e\u4fe1\u606f<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;config:\/\/server\/status&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">server_status<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u670d\u52a1\u5668\u8fd0\u884c\u72b6\u6001\u4fe1\u606f&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;server_name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;mcp-agent-server&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;version&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;protocol_version&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2026-07-28&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;mode&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;stateless&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;uptime_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3600<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;active_tools&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;active_resources&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;last_health_check&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u9759\u6001\u8d44\u6e90&#xff1a;API \u4f7f\u7528\u6587\u6863<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;docs:\/\/api\/usage-guide&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">api_usage_guide<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;API \u4f7f\u7528\u6307\u5357&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n# MCP Agent Server \u4f7f\u7528\u6307\u5357<\/p>\n<p>## \u53ef\u7528\u5de5\u5177<br \/>\n1. get_current_weather &#8211; \u83b7\u53d6\u5b9e\u65f6\u5929\u6c14<br \/>\n2. get_weather_forecast &#8211; \u83b7\u53d6\u5929\u6c14\u9884\u62a5<br \/>\n3. query_records &#8211; \u67e5\u8be2\u6570\u636e\u5e93<br \/>\n4. advanced_search &#8211; \u9ad8\u7ea7\u641c\u7d22<\/p>\n<p>## \u4f7f\u7528\u5efa\u8bae<br \/>\n&#8211; \u5148\u8c03\u7528 tools\/list \u4e86\u89e3\u6240\u6709\u53ef\u7528\u5de5\u5177<br \/>\n&#8211; \u5929\u6c14\u7c7b\u5de5\u5177\u652f\u6301\u4e2d\u6587\u57ce\u5e02\u540d<br \/>\n&#8211; \u6570\u636e\u5e93\u67e5\u8be2\u9650\u5236\u6bcf\u6b21\u6700\u591a\u8fd4\u56de100\u6761\u8bb0\u5f55<\/p>\n<p>## \u9519\u8bef\u5904\u7406<br \/>\n&#8211; \u6240\u6709\u5de5\u5177\u8fd4\u56de JSON \u683c\u5f0f<br \/>\n&#8211; \u68c0\u67e5 status \u5b57\u6bb5\u5224\u65ad\u662f\u5426\u6210\u529f<br \/>\n&#8211; \u9519\u8bef\u65f6\u53c2\u8003 suggestion \u5b57\u6bb5<br \/>\n        &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u52a8\u6001\u8d44\u6e90&#xff1a;\u6839\u636e\u53c2\u6570\u8fd4\u56de\u4e0d\u540c\u5185\u5bb9<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;knowledge:\/\/faq\/{topic}&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_faq<\/span><span class=\"token punctuation\">(<\/span>topic<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6307\u5b9a\u4e3b\u9898\u7684 FAQ \u5185\u5bb9\u3002<\/p>\n<p>        Args:<br \/>\n            topic: FAQ \u4e3b\u9898&#xff08;shipping\/returns\/payment\/account&#xff09;<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u6a21\u62df\u77e5\u8bc6\u5e93\u67e5\u8be2<\/span><br \/>\n        faq_data <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;shipping&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;title&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u7269\u6d41\u914d\u9001 FAQ&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;items&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u53d1\u8d27\u65f6\u95f4\u662f\u591a\u4e45&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e0b\u5355\u540e24\u5c0f\u65f6\u5185\u53d1\u8d27\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u652f\u6301\u54ea\u4e9b\u5feb\u9012&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u987a\u4e30\u3001\u4e2d\u901a\u3001\u5706\u901a\u3001\u97f5\u8fbe\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u53ef\u4ee5\u4fee\u6539\u6536\u8d27\u5730\u5740\u5417&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u53d1\u8d27\u524d\u53ef\u8054\u7cfb\u5ba2\u670d\u4fee\u6539\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;returns&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;title&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u9000\u6362\u8d27 FAQ&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;items&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u9000\u8d27\u671f\u9650\u662f\u591a\u4e45&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u7b7e\u6536\u540e7\u5929\u5185\u53ef\u7533\u8bf7\u9000\u8d27\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u9000\u8d27\u8fd0\u8d39\u8c01\u627f\u62c5&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8d28\u91cf\u95ee\u9898\u7531\u5546\u5bb6\u627f\u62c5&#xff0c;\u5176\u4ed6\u7531\u4e70\u5bb6\u627f\u62c5\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;payment&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;title&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u652f\u4ed8 FAQ&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;items&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u652f\u6301\u54ea\u4e9b\u652f\u4ed8\u65b9\u5f0f&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u652f\u4ed8\u5b9d\u3001\u5fae\u4fe1\u652f\u4ed8\u3001\u94f6\u884c\u5361\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;q&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u53ef\u4ee5\u5206\u671f\u4ed8\u6b3e\u5417&#xff1f;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6ee1500\u5143\u652f\u63013\/6\/12\u671f\u5206\u671f\u3002&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> topic <span class=\"token keyword\">in<\/span> faq_data<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>faq_data<span class=\"token punctuation\">[<\/span>topic<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u672a\u627e\u5230\u4e3b\u9898 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>topic<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u7684 FAQ&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;available_topics&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span>faq_data<span class=\"token punctuation\">.<\/span>keys<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>5.3 \u8d44\u6e90\u6a21\u677f&#xff08;Resource Templates&#xff09;<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8d44\u6e90\u6a21\u677f\u5141\u8bb8\u4f7f\u7528 URI \u53c2\u6570\u52a8\u6001\u751f\u6210\u8d44\u6e90<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;db:\/\/{database}\/{table}\/schema&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_table_schema_resource<\/span><span class=\"token punctuation\">(<\/span>database<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> table<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6307\u5b9a\u6570\u636e\u5e93\u8868\u7684\u7ed3\u6784\u5b9a\u4e49\u3002<\/p>\n<p>    URI \u6a21\u677f\u4e2d\u7684 {database} \u548c {table} \u4f1a\u88ab\u81ea\u52a8\u63d0\u53d6\u4e3a\u53c2\u6570\u3002<\/p>\n<p>    Args:<br \/>\n        database: \u6570\u636e\u5e93\u540d\u79f0<br \/>\n        table: \u8868\u540d<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u5b9e\u9645\u5b9e\u73b0&#xff1a;\u67e5\u8be2\u6570\u636e\u5e93\u5143\u6570\u636e<\/span><br \/>\n    schema_info <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;database&#034;<\/span><span class=\"token punctuation\">:<\/span> database<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;table&#034;<\/span><span class=\"token punctuation\">:<\/span> table<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;columns&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;INTEGER&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;primary_key&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;VARCHAR(100)&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;nullable&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">False<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;created_at&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;TIMESTAMP&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;default&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;CURRENT_TIMESTAMP&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>schema_info<span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>resource<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;file:\/\/logs\/{date}\/app.log&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_app_log<\/span><span class=\"token punctuation\">(<\/span>date<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6307\u5b9a\u65e5\u671f\u7684\u5e94\u7528\u65e5\u5fd7\u3002<\/p>\n<p>    Args:<br \/>\n        date: \u65e5\u671f&#xff0c;\u683c\u5f0f YYYY-MM-DD<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u5b9e\u9645\u5b9e\u73b0&#xff1a;\u8bfb\u53d6\u65e5\u5fd7\u6587\u4ef6<\/span><br \/>\n    <span class=\"token comment\"># \u6ce8\u610f&#xff1a;\u751f\u4ea7\u73af\u5883\u9700\u8981\u8def\u5f84\u5b89\u5168\u68c0\u67e5&#xff0c;\u9632\u6b62\u8def\u5f84\u904d\u5386\u653b\u51fb<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> os<br \/>\n    safe_date <span class=\"token operator\">&#061;<\/span> date<span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;..&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    log_path <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;.\/logs\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>safe_date<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/app.log&#034;<\/span><\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> os<span class=\"token punctuation\">.<\/span>path<span class=\"token punctuation\">.<\/span>exists<span class=\"token punctuation\">(<\/span>log_path<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>log_path<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;r&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> f<span class=\"token punctuation\">.<\/span>read<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u672a\u627e\u5230 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>date<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u7684\u65e5\u5fd7\u6587\u4ef6&#034;<\/span><\/span><\/p>\n<h4>5.4 Prompt \u6a21\u677f\u5b9a\u4e49\u4e0e\u53c2\u6570\u5316<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/prompts\/templates.py &#8211; \u63d0\u793a\u8bcd\u6a21\u677f<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">register_prompts<\/span><span class=\"token punctuation\">(<\/span>mcp<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c\u63d0\u793a\u8bcd\u6a21\u677f&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token comment\"># \u7b80\u5355\u63d0\u793a\u8bcd\u6a21\u677f<\/span><br \/>\n    <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n    <span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>prompt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">code_review<\/span><span class=\"token punctuation\">(<\/span>language<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> code_snippet<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4ee3\u7801\u5ba1\u67e5\u63d0\u793a\u8bcd\u6a21\u677f\u3002<\/p>\n<p>        \u5f15\u5bfc AI \u5bf9\u6307\u5b9a\u4ee3\u7801\u8fdb\u884c\u5168\u9762\u5ba1\u67e5\u3002<\/p>\n<p>        Args:<br \/>\n            language: \u7f16\u7a0b\u8bed\u8a00<br \/>\n            code_snippet: \u5f85\u5ba1\u67e5\u7684\u4ee3\u7801\u7247\u6bb5<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#034;<\/span><\/span>&#034;\u8bf7\u5bf9\u4ee5\u4e0b <span class=\"token punctuation\">{<\/span>language<span class=\"token punctuation\">}<\/span> \u4ee3\u7801\u8fdb\u884c\u5168\u9762\u5ba1\u67e5&#xff1a;<\/p>\n<p>&#096;&#096;&#096;<span class=\"token punctuation\">{<\/span>language<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">{<\/span>code_snippet<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8bf7\u4ece\u4ee5\u4e0b\u7ef4\u5ea6\u8fdb\u884c\u5206\u6790&#xff1a;<\/p>\n<li>\u6b63\u786e\u6027&#xff1a;\u903b\u8f91\u662f\u5426\u6b63\u786e&#xff0c;\u662f\u5426\u6709 bug<\/li>\n<li>\u6027\u80fd&#xff1a;\u662f\u5426\u6709\u6027\u80fd\u74f6\u9888\u6216\u4f18\u5316\u7a7a\u95f4<\/li>\n<li>\u5b89\u5168\u6027&#xff1a;\u662f\u5426\u6709\u5b89\u5168\u6f0f\u6d1e&#xff08;\u6ce8\u5165\u3001XSS\u7b49&#xff09;<\/li>\n<li>\u53ef\u8bfb\u6027&#xff1a;\u547d\u540d\u3001\u6ce8\u91ca\u3001\u4ee3\u7801\u7ed3\u6784<\/li>\n<li>\u6700\u4f73\u5b9e\u8df5&#xff1a;\u662f\u5426\u7b26\u5408\u8bed\u8a00\u60ef\u7528\u6cd5<\/li>\n<p>\u5bf9\u6bcf\u4e2a\u95ee\u9898\u7ed9\u51fa\u5177\u4f53\u7684\u4fee\u6539\u5efa\u8bae\u548c\u793a\u4f8b\u4ee3\u7801\u3002\u201c\u201d&#034;<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u591a\u8f6e\u5bf9\u8bdd\u63d0\u793a\u8bcd\u6a21\u677f<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#064;mcp.prompt()<br \/>\ndef data_analysis_workflow(data_description: str, analysis_goal: str) -&gt; str:<br \/>\n    &#034;&#034;&#034;\u6570\u636e\u5206\u6790\u5de5\u4f5c\u6d41\u63d0\u793a\u8bcd\u3002<\/p>\n<p>    \u5f15\u5bfc AI \u6309\u6b65\u9aa4\u5b8c\u6210\u6570\u636e\u5206\u6790\u4efb\u52a1\u3002<\/p>\n<p>    Args:<br \/>\n        data_description: \u6570\u636e\u63cf\u8ff0&#xff08;\u5b57\u6bb5\u3001\u7c7b\u578b\u3001\u89c4\u6a21&#xff09;<br \/>\n        analysis_goal: \u5206\u6790\u76ee\u6807<br \/>\n    &#034;&#034;&#034;<br \/>\n    return f&#034;&#034;&#034;\u4f60\u662f\u4e00\u4f4d\u8d44\u6df1\u6570\u636e\u5206\u6790\u5e08\u3002\u8bf7\u6309\u7167\u4ee5\u4e0b\u5de5\u4f5c\u6d41\u5b8c\u6210\u6570\u636e\u5206\u6790\u4efb\u52a1\u3002<\/p>\n<h3>\u6570\u636e\u63cf\u8ff0<\/h3>\n<p>{data_description}<\/p>\n<h3>\u5206\u6790\u76ee\u6807<\/h3>\n<p>{analysis_goal}<\/p>\n<h3>\u5de5\u4f5c\u6d41\u6b65\u9aa4<\/h3>\n<h4>\u7b2c\u4e00\u6b65&#xff1a;\u6570\u636e\u7406\u89e3<\/h4>\n<ul>\n<li>\u786e\u8ba4\u6570\u636e\u5b57\u6bb5\u542b\u4e49<\/li>\n<li>\u8bc6\u522b\u6f5c\u5728\u7684\u6570\u636e\u8d28\u91cf\u95ee\u9898<\/li>\n<li>\u63d0\u51fa\u9700\u8981\u786e\u8ba4\u7684\u5047\u8bbe<\/li>\n<\/ul>\n<h4>\u7b2c\u4e8c\u6b65&#xff1a;\u5206\u6790\u65b9\u6848\u8bbe\u8ba1<\/h4>\n<ul>\n<li>\u9009\u62e9\u5408\u9002\u7684\u5206\u6790\u65b9\u6cd5<\/li>\n<li>\u8bf4\u660e\u9009\u62e9\u7406\u7531<\/li>\n<li>\u5217\u51fa\u9700\u8981\u7684\u5de5\u5177\/\u51fd\u6570<\/li>\n<\/ul>\n<h4>\u7b2c\u4e09\u6b65&#xff1a;\u6267\u884c\u5206\u6790<\/h4>\n<ul>\n<li>\u8c03\u7528\u53ef\u7528\u7684\u6570\u636e\u67e5\u8be2\u5de5\u5177\u83b7\u53d6\u6570\u636e<\/li>\n<li>\u6267\u884c\u7edf\u8ba1\u8ba1\u7b97<\/li>\n<li>\u751f\u6210\u53ef\u89c6\u5316\u5efa\u8bae<\/li>\n<\/ul>\n<h4>\u7b2c\u56db\u6b65&#xff1a;\u7ed3\u8bba\u4e0e\u5efa\u8bae<\/h4>\n<ul>\n<li>\u603b\u7ed3\u5173\u952e\u53d1\u73b0<\/li>\n<li>\u7ed9\u51fa\u53ef\u64cd\u4f5c\u7684\u5efa\u8bae<\/li>\n<li>\u6307\u51fa\u5206\u6790\u7684\u5c40\u9650\u6027<\/li>\n<\/ul>\n<p>\u8bf7\u4ece\u7b2c\u4e00\u6b65\u5f00\u59cb\u3002\u201c\u201d&#034;<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# \u5e26\u7cfb\u7edf\u89d2\u8272\u7684\u63d0\u793a\u8bcd<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n&#064;mcp.prompt()<br \/>\ndef customer_support_agent(product_name: str, customer_issue: str) -&gt; str:<br \/>\n    &#034;&#034;&#034;\u5ba2\u670d Agent \u63d0\u793a\u8bcd\u6a21\u677f\u3002<\/p>\n<p>    Args:<br \/>\n        product_name: \u4ea7\u54c1\u540d\u79f0<br \/>\n        customer_issue: \u5ba2\u6237\u95ee\u9898\u63cf\u8ff0<br \/>\n    &#034;&#034;&#034;<br \/>\n    return f&#034;&#034;&#034;\u4f60\u662f\u4e00\u4f4d\u4e13\u4e1a\u3001\u8010\u5fc3\u7684 {product_name} \u5ba2\u670d\u4ee3\u8868\u3002<\/p>\n<p>\u5ba2\u6237\u95ee\u9898&#xff1a;{customer_issue}<\/p>\n<p>\u8bf7\u9075\u5faa\u4ee5\u4e0b\u539f\u5219&#xff1a;<\/p>\n<li>\u9996\u5148\u8868\u793a\u7406\u89e3\u548c\u540c\u7406\u5fc3<\/li>\n<li>\u786e\u8ba4\u95ee\u9898\u7684\u5177\u4f53\u7ec6\u8282<\/li>\n<li>\u63d0\u4f9b\u6e05\u6670\u7684\u89e3\u51b3\u6b65\u9aa4<\/li>\n<li>\u5982\u679c\u9700\u8981\u8c03\u7528\u5de5\u5177\u67e5\u8be2\u8ba2\u5355\/\u7269\u6d41\u4fe1\u606f&#xff0c;\u8bf7\u5148\u544a\u77e5\u5ba2\u6237<\/li>\n<li>\u7ed3\u675f\u65f6\u786e\u8ba4\u95ee\u9898\u662f\u5426\u89e3\u51b3<\/li>\n<p>\u8bed\u6c14\u8981\u6c42&#xff1a;\u53cb\u597d\u3001\u4e13\u4e1a\u3001\u4e0d\u5351\u4e0d\u4ea2\u3002<br \/>\n\u56de\u590d\u957f\u5ea6&#xff1a;\u63a7\u5236\u5728200\u5b57\u4ee5\u5185&#xff0c;\u9664\u975e\u9700\u8981\u8be6\u7ec6\u6b65\u9aa4\u8bf4\u660e\u3002\u201c\u201d&#034;<\/p>\n<p>### 5.5 \u5b9e\u6218&#xff1a;\u6784\u5efa\u77e5\u8bc6\u5e93\u8d44\u6e90 &#043; \u4ee3\u7801\u5ba1\u67e5\u63d0\u793a\u8bcd<\/p>\n<p>\u5c06\u4ee5\u4e0a\u6240\u6709\u7ec4\u4ef6\u6574\u5408\u5230\u4e3b\u670d\u52a1\u5668\u4e2d&#xff1a;<\/p>\n<p>&#096;&#096;&#096;python<br \/>\n&#034;&#034;&#034;<br \/>\nsrc\/server.py &#8211; \u5b8c\u6574\u7248\u670d\u52a1\u5668&#xff08;\u6574\u5408\u6240\u6709\u6a21\u5757&#xff09;<br \/>\n&#034;&#034;&#034;<br \/>\nimport sys<br \/>\nimport logging<br \/>\nfrom mcp.server.fastmcp import FastMCP<\/p>\n<p># \u5bfc\u5165\u5404\u6a21\u5757\u7684\u6ce8\u518c\u51fd\u6570<br \/>\nfrom src.tools.weather import register_weather_tools<br \/>\nfrom src.tools.database import register_database_tools<br \/>\nfrom src.resources.knowledge_base import register_resources<br \/>\nfrom src.prompts.templates import register_prompts<\/p>\n<p># \u914d\u7f6e\u65e5\u5fd7<br \/>\nlogging.basicConfig(level&#061;logging.INFO, format&#061;&#034;%(asctime)s [%(levelname)s] %(name)s: %(message)s&#034;)<br \/>\nlogger &#061; logging.getLogger(&#034;mcp-server&#034;)<\/p>\n<p># \u521b\u5efa\u670d\u52a1\u5668\u5b9e\u4f8b<br \/>\nmcp &#061; FastMCP(<br \/>\n    name&#061;&#034;full-agent-server&#034;,<br \/>\n    version&#061;&#034;1.0.0&#034;,<br \/>\n    stateless&#061;True,<br \/>\n    description&#061;&#034;\u5168\u529f\u80fd\u65e0\u72b6\u6001 AI Agent MCP \u670d\u52a1\u5668&#034;,<br \/>\n    instructions&#061;&#034;\u672c\u670d\u52a1\u5668\u63d0\u4f9b\u5929\u6c14\u67e5\u8be2\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u3001\u77e5\u8bc6\u68c0\u7d22\u7b49\u80fd\u529b\u3002&#034;<br \/>\n)<\/p>\n<p># \u6ce8\u518c\u6240\u6709\u7ec4\u4ef6<br \/>\nregister_weather_tools(mcp)<br \/>\nregister_database_tools(mcp)<br \/>\nregister_resources(mcp)<br \/>\nregister_prompts(mcp)<\/p>\n<p># \u542f\u52a8<br \/>\nif __name__ &#061;&#061; &#034;__main__&#034;:<br \/>\n    transport &#061; &#034;streamable-http&#034; if &#034;&#8211;http&#034; in sys.argv else &#034;stdio&#034;<br \/>\n    logger.info(f&#034;\u542f\u52a8\u670d\u52a1\u5668: transport&#061;{transport}, stateless&#061;True&#034;)<\/p>\n<p>    if transport &#061;&#061; &#034;streamable-http&#034;:<br \/>\n        mcp.run(transport&#061;&#034;streamable-http&#034;, host&#061;&#034;0.0.0.0&#034;, port&#061;8000)<br \/>\n    else:<br \/>\n        mcp.run(transport&#061;&#034;stdio&#034;)<\/p>\n<hr \/>\n<h3>\u516d\u3001\u672c\u5730\u8c03\u8bd5\u8fd0\u884c\u4e0e\u5ba2\u6237\u7aef\u8fde\u63a5\u9a8c\u8bc1<\/h3>\n<h4>6.1 \u4f7f\u7528 MCP Inspector \u8fdb\u884c\u53ef\u89c6\u5316\u8c03\u8bd5<\/h4>\n<p>MCP Inspector \u662f\u5b98\u65b9\u63d0\u4f9b\u7684\u56fe\u5f62\u5316\u8c03\u8bd5\u5de5\u5177&#xff0c;\u53ef\u4ee5\u53ef\u89c6\u5316\u5730\u6d4b\u8bd5 Tools\u3001Resources\u3001Prompts\u3002<\/p>\n<p><span class=\"token comment\"># \u5b89\u88c5 Inspector<\/span><br \/>\n<span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-g<\/span> &#064;modelcontextprotocol\/inspector<\/p>\n<p><span class=\"token comment\"># \u65b9\u5f0f\u4e00&#xff1a;\u8c03\u8bd5 stdio \u6a21\u5f0f\u7684\u670d\u52a1\u5668<\/span><br \/>\nnpx &#064;modelcontextprotocol\/inspector python src\/server.py<\/p>\n<p><span class=\"token comment\"># \u65b9\u5f0f\u4e8c&#xff1a;\u8c03\u8bd5 HTTP \u6a21\u5f0f\u7684\u670d\u52a1\u5668<\/span><br \/>\n<span class=\"token comment\"># \u5148\u542f\u52a8\u670d\u52a1\u5668<\/span><br \/>\npython src\/server.py <span class=\"token parameter variable\">&#8211;http<\/span> <span class=\"token operator\">&amp;<\/span><br \/>\n<span class=\"token comment\"># \u518d\u542f\u52a8 Inspector \u8fde\u63a5<\/span><br \/>\nnpx &#064;modelcontextprotocol\/inspector <span class=\"token parameter variable\">&#8211;url<\/span> http:\/\/localhost:8000\/mcp<\/p>\n<p>Inspector \u754c\u9762\u64cd\u4f5c&#xff1a;<\/p>\n<li>\u6253\u5f00\u6d4f\u89c8\u5668\u8bbf\u95ee http:\/\/localhost:6274<\/li>\n<li>\u5728\u5de6\u4fa7\u9009\u62e9\u8fde\u63a5\u65b9\u5f0f&#xff08;stdio \/ HTTP&#xff09;<\/li>\n<li>\u70b9\u51fb \u201cConnect\u201d \u5efa\u7acb\u8fde\u63a5<\/li>\n<li>\u5207\u6362\u5230 \u201cTools\u201d \u6807\u7b7e\u9875\u67e5\u770b\u6240\u6709\u6ce8\u518c\u7684\u5de5\u5177<\/li>\n<li>\u70b9\u51fb\u4efb\u610f\u5de5\u5177&#xff0c;\u586b\u5165\u53c2\u6570&#xff0c;\u70b9\u51fb \u201cRun\u201d \u6267\u884c<\/li>\n<li>\u67e5\u770b\u8fd4\u56de\u7ed3\u679c\u548c\u539f\u59cb JSON-RPC \u6d88\u606f<\/li>\n<h4>6.2 \u547d\u4ee4\u884c\u624b\u52a8\u6d4b\u8bd5&#xff08;curl&#xff09;<\/h4>\n<p><span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\"># \u6d4b\u8bd5\u65e0\u72b6\u6001 HTTP \u6a21\u5f0f<\/span><br \/>\n<span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><\/p>\n<p><span class=\"token comment\"># 1. \u521d\u59cb\u5316\u8bf7\u6c42&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u53ef\u9009&#xff09;<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:8000\/mcp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;jsonrpc&#034;: &#034;2.0&#034;,<br \/>\n    &#034;id&#034;: 1,<br \/>\n    &#034;method&#034;: &#034;initialize&#034;,<br \/>\n    &#034;params&#034;: {<br \/>\n      &#034;protocolVersion&#034;: &#034;2026-07-28&#034;,<br \/>\n      &#034;capabilities&#034;: {},<br \/>\n      &#034;clientInfo&#034;: {&#034;name&#034;: &#034;curl-client&#034;, &#034;version&#034;: &#034;1.0.0&#034;}<br \/>\n    }<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 2. \u83b7\u53d6\u5de5\u5177\u5217\u8868<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:8000\/mcp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;jsonrpc&#034;: &#034;2.0&#034;,<br \/>\n    &#034;id&#034;: 2,<br \/>\n    &#034;method&#034;: &#034;tools\/list&#034;,<br \/>\n    &#034;params&#034;: {}<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 3. \u8c03\u7528\u5de5\u5177<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:8000\/mcp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;jsonrpc&#034;: &#034;2.0&#034;,<br \/>\n    &#034;id&#034;: 3,<br \/>\n    &#034;method&#034;: &#034;tools\/call&#034;,<br \/>\n    &#034;params&#034;: {<br \/>\n      &#034;name&#034;: &#034;get_current_weather&#034;,<br \/>\n      &#034;arguments&#034;: {<br \/>\n        &#034;city&#034;: &#034;\u5317\u4eac&#034;,<br \/>\n        &#034;unit&#034;: &#034;celsius&#034;<br \/>\n      }<br \/>\n    }<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 4. \u83b7\u53d6\u8d44\u6e90\u5217\u8868<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:8000\/mcp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;jsonrpc&#034;: &#034;2.0&#034;,<br \/>\n    &#034;id&#034;: 4,<br \/>\n    &#034;method&#034;: &#034;resources\/list&#034;,<br \/>\n    &#034;params&#034;: {}<br \/>\n  }&#039;<\/span><\/p>\n<p><span class=\"token comment\"># 5. \u8bfb\u53d6\u8d44\u6e90<\/span><br \/>\n<span class=\"token function\">curl<\/span> <span class=\"token parameter variable\">-X<\/span> POST http:\/\/localhost:8000\/mcp <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-H<\/span> <span class=\"token string\">&#034;Content-Type: application\/json&#034;<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n  <span class=\"token parameter variable\">-d<\/span> <span class=\"token string\">&#039;{<br \/>\n    &#034;jsonrpc&#034;: &#034;2.0&#034;,<br \/>\n    &#034;id&#034;: 5,<br \/>\n    &#034;method&#034;: &#034;resources\/read&#034;,<br \/>\n    &#034;params&#034;: {<br \/>\n      &#034;uri&#034;: &#034;config:\/\/server\/status&#034;<br \/>\n    }<br \/>\n  }&#039;<\/span><\/p>\n<h4>6.3 Python \u5ba2\u6237\u7aef\u8fde\u63a5\u6d4b\u8bd5<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\ntests\/test_client.py &#8211; \u4f7f\u7528 MCP Python SDK \u5ba2\u6237\u7aef\u6d4b\u8bd5<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> mcp <span class=\"token keyword\">import<\/span> ClientSession<br \/>\n<span class=\"token keyword\">from<\/span> mcp<span class=\"token punctuation\">.<\/span>client<span class=\"token punctuation\">.<\/span>streamable_http <span class=\"token keyword\">import<\/span> streamablehttp_client<\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">test_stateless_connection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6d4b\u8bd5\u65e0\u72b6\u6001 HTTP \u8fde\u63a5&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u8fde\u63a5\u5230\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> streamablehttp_client<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> <span class=\"token punctuation\">(<\/span>read<span class=\"token punctuation\">,<\/span> write<span class=\"token punctuation\">,<\/span> _<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> ClientSession<span class=\"token punctuation\">(<\/span>read<span class=\"token punctuation\">,<\/span> write<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> session<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u521d\u59cb\u5316&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u4ecd\u7136\u63a8\u8350\u8c03\u7528&#xff09;<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>initialize<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u2705 \u8fde\u63a5\u6210\u529f&#xff01;&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u83b7\u53d6\u5de5\u5177\u5217\u8868<\/span><br \/>\n            tools <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>list_tools<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\\\\n&#x1f4cb; \u53ef\u7528\u5de5\u5177 (<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>tools<span class=\"token punctuation\">.<\/span>tools<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u4e2a):&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> tool <span class=\"token keyword\">in<\/span> tools<span class=\"token punctuation\">.<\/span>tools<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  &#8211; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>tool<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>tool<span class=\"token punctuation\">.<\/span>description<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">50]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u8c03\u7528\u5929\u6c14\u5de5\u5177<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#x1f324;\ufe0f \u8c03\u7528\u5929\u6c14\u67e5\u8be2\u5de5\u5177:&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>call_tool<span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token string\">&#034;get_current_weather&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                arguments<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4e0a\u6d77&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u7ed3\u679c: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>result<span class=\"token punctuation\">.<\/span>content<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">100]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u8bfb\u53d6\u8d44\u6e90<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#x1f4d6; \u8bfb\u53d6\u670d\u52a1\u5668\u72b6\u6001\u8d44\u6e90:&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            resource <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>read_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;config:\/\/server\/status&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u5185\u5bb9: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource<span class=\"token punctuation\">.<\/span>contents<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">100]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u83b7\u53d6\u63d0\u793a\u8bcd<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#x1f4ac; \u83b7\u53d6\u63d0\u793a\u8bcd\u6a21\u677f:&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            prompts <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>list_prompts<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> prompt <span class=\"token keyword\">in<\/span> prompts<span class=\"token punctuation\">.<\/span>prompts<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  &#8211; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>prompt<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>prompt<span class=\"token punctuation\">.<\/span>description<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">40]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">test_tool_error_handling<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6d4b\u8bd5\u5de5\u5177\u9519\u8bef\u5904\u7406&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> streamablehttp_client<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> <span class=\"token punctuation\">(<\/span>read<span class=\"token punctuation\">,<\/span> write<span class=\"token punctuation\">,<\/span> _<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> ClientSession<span class=\"token punctuation\">(<\/span>read<span class=\"token punctuation\">,<\/span> write<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> session<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>initialize<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u8c03\u7528\u4e0d\u5b58\u5728\u7684\u5de5\u5177<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>call_tool<span class=\"token punctuation\">(<\/span><br \/>\n                    <span class=\"token string\">&#034;nonexistent_tool&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    arguments<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u2705 \u6b63\u786e\u6355\u83b7\u9519\u8bef: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u4f20\u5165\u65e0\u6548\u53c2\u6570<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> session<span class=\"token punctuation\">.<\/span>call_tool<span class=\"token punctuation\">(<\/span><br \/>\n                    <span class=\"token string\">&#034;get_current_weather&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    arguments<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">}<\/span>  <span class=\"token comment\"># \u7a7a\u5b57\u7b26\u4e32\u5e94\u89e6\u53d1\u6821\u9a8c\u9519\u8bef<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7ed3\u679c: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>result<span class=\"token punctuation\">.<\/span>content<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u2705 \u53c2\u6570\u6821\u9a8c\u9519\u8bef: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#034;<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668 &#8211; \u5ba2\u6237\u7aef\u8fde\u63a5\u6d4b\u8bd5&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#034;<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>test_stateless_connection<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n&#034;<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token string\">&#034;&#061;&#034;<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">60<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>test_tool_error_handling<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>6.4 \u96c6\u6210 Claude Desktop \/ Cursor \u7b49 AI \u5ba2\u6237\u7aef<\/h4>\n<p>Claude Desktop \u914d\u7f6e&#xff1a;<\/p>\n<p>\u7f16\u8f91 Claude Desktop \u914d\u7f6e\u6587\u4ef6&#xff1a;<\/p>\n<ul>\n<li>macOS: ~\/Library\/Application Support\/Claude\/claude_desktop_config.json<\/li>\n<li>Windows: %APPDATA%\\\\Claude\\\\claude_desktop_config.json<\/li>\n<\/ul>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;mcpServers&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string-property property\">&#034;my-agent-server&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;command&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;args&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;\/path\/to\/mcp-agent-server\/src\/server.py&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;env&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;LOG_LEVEL&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;INFO&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string-property property\">&#034;my-agent-server-http&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;url&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;transport&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;streamable-http&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>Cursor IDE \u914d\u7f6e&#xff1a;<\/p>\n<p>\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efa .cursor\/mcp.json&#xff1a;<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;mcpServers&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string-property property\">&#034;agent-tools&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;url&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>6.5 \u65e5\u5fd7\u7cfb\u7edf\u4e0e\u8bf7\u6c42\u8ffd\u8e2a<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8bf7\u6c42\u8ffd\u8e2a\u4e2d\u95f4\u4ef6<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> uuid<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> functools <span class=\"token keyword\">import<\/span> wraps<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.requests&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RequestTracer<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bf7\u6c42\u8ffd\u8e2a\u5668 &#8211; \u4e3a\u6bcf\u4e2a\u8bf7\u6c42\u751f\u6210\u552f\u4e00 ID&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;staticmethod<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">middleware<\/span><span class=\"token punctuation\">(<\/span>handler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token decorator annotation punctuation\">&#064;wraps<\/span><span class=\"token punctuation\">(<\/span>handler<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">traced_handler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            request_id <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>uuid<span class=\"token punctuation\">.<\/span>uuid4<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">]<\/span><br \/>\n            start_time <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>request_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] \u2192 \u8bf7\u6c42\u5f00\u59cb: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>kwargs<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#039;method&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#039;unknown&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> handler<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><br \/>\n                elapsed <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start_time<br \/>\n                logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>request_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] \u2190 \u8bf7\u6c42\u5b8c\u6210: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>elapsed<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> result<br \/>\n            <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n                elapsed <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> start_time<br \/>\n                logger<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;[<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>request_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">] \u2717 \u8bf7\u6c42\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>elapsed<span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">.3f<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">s, \u9519\u8bef: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">raise<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> traced_handler<\/p>\n<hr \/>\n<h3>\u4e03\u3001\u5178\u578b\u62a5\u9519\u573a\u666f\u5206\u6790\u4e0e\u65ad\u70b9\u6392\u67e5\u6280\u5de7<\/h3>\n<h4>7.1 \u8fde\u63a5\u5c42\u9519\u8bef\u6392\u67e5<\/h4>\n<table>\n<tr>\u9519\u8bef\u73b0\u8c61\u53ef\u80fd\u539f\u56e0\u89e3\u51b3\u65b9\u6848<\/tr>\n<tbody>\n<tr>\n<td>Connection refused<\/td>\n<td>\u670d\u52a1\u5668\u672a\u542f\u52a8\u6216\u7aef\u53e3\u9519\u8bef<\/td>\n<td>\u786e\u8ba4\u670d\u52a1\u5668\u8fd0\u884c\u4e2d&#xff0c;\u68c0\u67e5\u7aef\u53e3<\/td>\n<\/tr>\n<tr>\n<td>Connection timeout<\/td>\n<td>\u9632\u706b\u5899\/\u7f51\u7edc\u95ee\u9898<\/td>\n<td>\u68c0\u67e5\u9632\u706b\u5899\u89c4\u5219&#xff0c;\u5c1d\u8bd5 ping<\/td>\n<\/tr>\n<tr>\n<td>404 Not Found<\/td>\n<td>URL \u8def\u5f84\u9519\u8bef<\/td>\n<td>\u786e\u8ba4\u7aef\u70b9\u662f \/mcp \u800c\u975e \/<\/td>\n<\/tr>\n<tr>\n<td>405 Method Not Allowed<\/td>\n<td>\u4f7f\u7528\u4e86 GET \u800c\u975e POST<\/td>\n<td>MCP \u4f7f\u7528 POST \u8bf7\u6c42<\/td>\n<\/tr>\n<tr>\n<td>415 Unsupported Media Type<\/td>\n<td>Content-Type \u9519\u8bef<\/td>\n<td>\u8bbe\u7f6e\u4e3a application\/json<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span class=\"token comment\"># \u8fde\u63a5\u8bca\u65ad\u811a\u672c<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\ntests\/diagnose.py &#8211; \u8fde\u63a5\u8bca\u65ad<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> httpx<br \/>\n<span class=\"token keyword\">import<\/span> sys<\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">diagnose<\/span><span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bca\u65ad MCP \u670d\u52a1\u5668\u8fde\u63a5&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#x1f50d; \u8bca\u65ad\u76ee\u6807: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># 1. \u57fa\u672c\u8fde\u901a\u6027<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> client<span class=\"token punctuation\">:<\/span><br \/>\n            resp <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;jsonrpc&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;method&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;initialize&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;protocolVersion&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2026-07-28&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;capabilities&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;clientInfo&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;diagnose&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;version&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1.0&#034;<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u2705 HTTP \u72b6\u6001\u7801: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resp<span class=\"token punctuation\">.<\/span>status_code<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u2705 \u54cd\u5e94: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resp<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> httpx<span class=\"token punctuation\">.<\/span>ConnectError<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  \u274c \u8fde\u63a5\u5931\u8d25&#xff1a;\u670d\u52a1\u5668\u672a\u8fd0\u884c\u6216\u7aef\u53e3\u4e0d\u53ef\u8fbe&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  &#x1f4a1; \u89e3\u51b3&#xff1a;\u786e\u8ba4\u670d\u52a1\u5668\u5df2\u542f\u52a8 (python src\/server.py &#8211;http)&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> httpx<span class=\"token punctuation\">.<\/span>TimeoutException<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  \u274c \u8fde\u63a5\u8d85\u65f6&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;  &#x1f4a1; \u89e3\u51b3&#xff1a;\u68c0\u67e5\u9632\u706b\u5899\u548c\u7f51\u7edc\u914d\u7f6e&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u274c \u672a\u77e5\u9519\u8bef: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> asyncio<br \/>\n    url <span class=\"token operator\">&#061;<\/span> sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>sys<span class=\"token punctuation\">.<\/span>argv<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;http:\/\/localhost:8000\/mcp&#034;<\/span><br \/>\n    asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>diagnose<span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>7.2 \u5de5\u5177\u8c03\u7528\u5931\u8d25\u7684\u5e38\u89c1\u539f\u56e0<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5e38\u89c1\u5de5\u5177\u8c03\u7528\u9519\u8bef\u53ca\u89e3\u51b3\u65b9\u6848<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef1&#xff1a;\u5de5\u5177\u540d\u79f0\u4e0d\u5339\u914d<\/span><br \/>\n<span class=\"token comment\"># \u75c7\u72b6: &#034;Tool not found: get_weather&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u6ce8\u518c\u7684\u5de5\u5177\u540d\u662f &#034;get_current_weather&#034;&#xff0c;\u8c03\u7528\u65f6\u7528\u4e86 &#034;get_weather&#034;<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u5148\u8c03\u7528 tools\/list \u786e\u8ba4\u51c6\u786e\u7684\u5de5\u5177\u540d<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef2&#xff1a;\u53c2\u6570\u7c7b\u578b\u4e0d\u5339\u914d<\/span><br \/>\n<span class=\"token comment\"># \u75c7\u72b6: &#034;Invalid params: expected number, got string&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: JSON \u4e2d &#034;limit&#034;: &#034;10&#034; \u5e94\u4e3a &#034;limit&#034;: 10<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u786e\u4fdd JSON \u7c7b\u578b\u4e0e Schema \u5b9a\u4e49\u4e00\u81f4<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef3&#xff1a;\u7f3a\u5c11\u5fc5\u586b\u53c2\u6570<\/span><br \/>\n<span class=\"token comment\"># \u75c7\u72b6: &#034;Missing required parameter: query&#034;<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u8c03\u7528\u65f6\u672a\u63d0\u4f9b\u5fc5\u586b\u53c2\u6570<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u67e5\u770b tools\/list \u8fd4\u56de\u7684 inputSchema.required \u5b57\u6bb5<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef4&#xff1a;\u5de5\u5177\u5185\u90e8\u5f02\u5e38<\/span><br \/>\n<span class=\"token comment\"># \u75c7\u72b6: &#034;Internal error&#034; \u6216\u81ea\u5b9a\u4e49\u9519\u8bef\u4fe1\u606f<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u5de5\u5177\u51fd\u6570\u629b\u51fa\u672a\u6355\u83b7\u7684\u5f02\u5e38<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u5728\u5de5\u5177\u51fd\u6570\u4e2d\u6dfb\u52a0 try-except&#xff0c;\u8fd4\u56de\u7ed3\u6784\u5316\u9519\u8bef<\/span><\/p>\n<p><span class=\"token comment\"># \u9519\u8bef5&#xff1a;\u8d85\u65f6<\/span><br \/>\n<span class=\"token comment\"># \u75c7\u72b6: \u8bf7\u6c42\u957f\u65f6\u95f4\u65e0\u54cd\u5e94<\/span><br \/>\n<span class=\"token comment\"># \u539f\u56e0: \u5de5\u5177\u6267\u884c\u65f6\u95f4\u8fc7\u957f<\/span><br \/>\n<span class=\"token comment\"># \u89e3\u51b3: \u6dfb\u52a0\u8d85\u65f6\u63a7\u5236&#xff0c;\u6216\u6539\u4e3a\u5f02\u6b65\u4efb\u52a1\u6a21\u5f0f<\/span><\/p>\n<h4>7.3 Schema \u6821\u9a8c\u4e0d\u901a\u8fc7\u7684\u5904\u7406<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nSchema \u6821\u9a8c\u9519\u8bef\u7684\u8c03\u8bd5\u65b9\u6cd5<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> pydantic <span class=\"token keyword\">import<\/span> ValidationError<\/p>\n<p><span class=\"token comment\"># \u5f00\u542f\u8be6\u7ec6\u6821\u9a8c\u65e5\u5fd7<\/span><br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\nlogging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.validation&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>setLevel<span class=\"token punctuation\">(<\/span>logging<span class=\"token punctuation\">.<\/span>DEBUG<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u624b\u52a8\u6d4b\u8bd5 Schema \u6821\u9a8c<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">debug_schema_validation<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u624b\u52a8\u9a8c\u8bc1\u5de5\u5177\u53c2\u6570\u662f\u5426\u7b26\u5408 Schema&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">from<\/span> pydantic <span class=\"token keyword\">import<\/span> BaseModel<span class=\"token punctuation\">,<\/span> Field<\/p>\n<p>    <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">WeatherParams<\/span><span class=\"token punctuation\">(<\/span>BaseModel<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">,<\/span> min_length<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        unit<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> Field<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">,<\/span> pattern<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;^(celsius|fahrenheit)$&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6d4b\u8bd5\u7528\u4f8b<\/span><br \/>\n    test_cases <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u5317\u4eac&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>       <span class=\"token comment\"># \u2705 \u6b63\u786e<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>           <span class=\"token comment\"># \u274c city \u4e3a\u7a7a<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u5317\u4eac&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;kelvin&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>        <span class=\"token comment\"># \u274c unit \u4e0d\u5728\u679a\u4e3e\u4e2d<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>                       <span class=\"token comment\"># \u274c \u7f3a\u5c11\u5fc5\u586b\u5b57\u6bb5 city<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u5317\u4eac&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;unit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;extra&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u26a0\ufe0f \u591a\u4f59\u5b57\u6bb5<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> i<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">case<\/span> <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">enumerate<\/span><span class=\"token punctuation\">(<\/span>test_cases<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            params <span class=\"token operator\">&#061;<\/span> WeatherParams<span class=\"token punctuation\">(<\/span><span class=\"token operator\">**<\/span><span class=\"token keyword\">case<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u7528\u4f8b<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u2705 \u901a\u8fc7: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>params<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> ValidationError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;  \u7528\u4f8b<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>i<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u274c \u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">.<\/span>errors<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>7.4 \u8d85\u65f6\u4e0e\u5e76\u53d1\u51b2\u7a81<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8d85\u65f6\u5904\u7406\u6700\u4f73\u5b9e\u8df5<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">from<\/span> functools <span class=\"token keyword\">import<\/span> wraps<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">with_timeout<\/span><span class=\"token punctuation\">(<\/span>default_timeout<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8d85\u65f6\u88c5\u9970\u5668&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">decorator<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token decorator annotation punctuation\">&#064;wraps<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">wrapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            timeout <span class=\"token operator\">&#061;<\/span> kwargs<span class=\"token punctuation\">.<\/span>pop<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span> default_timeout<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>wait_for<span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> timeout<span class=\"token operator\">&#061;<\/span>timeout<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> asyncio<span class=\"token punctuation\">.<\/span>TimeoutError<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;timeout&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u64cd\u4f5c\u8d85\u65f6&#xff08;&gt;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>timeout<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u79d2&#xff09;&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;suggestion&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u51cf\u5c11\u6570\u636e\u91cf\u6216\u589e\u52a0\u8d85\u65f6\u65f6\u95f4&#034;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> wrapper<br \/>\n    <span class=\"token keyword\">return<\/span> decorator<\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;with_timeout<\/span><span class=\"token punctuation\">(<\/span>default_timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15.0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">heavy_data_analysis<\/span><span class=\"token punctuation\">(<\/span>dataset_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6267\u884c\u5927\u6570\u636e\u5206\u6790&#xff08;15\u79d2\u8d85\u65f6&#xff09;&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u8017\u65f6\u64cd\u4f5c&#8230;<\/span><br \/>\n    <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u6a21\u62df\u8d85\u65f6<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string\">&#034;done&#034;<\/span><\/p>\n<h4>7.5 \u65ad\u70b9\u8c03\u8bd5\u5b9e\u6218&#xff08;VS Code&#xff09;<\/h4>\n<p><span class=\"token comment\">\/\/ .vscode\/launch.json &#8211; \u5b8c\u6574\u8c03\u8bd5\u914d\u7f6e<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;version&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;0.2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;configurations&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u8c03\u8bd5 MCP Server (HTTP)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;debugpy&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;request&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;launch&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;program&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}\/src\/server.py&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;args&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;&#8211;http&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;console&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;integratedTerminal&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;justMyCode&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\">\/\/ \u8bbe\u4e3a false \u53ef\u4ee5\u8fdb\u5165 SDK \u5185\u90e8<\/span><br \/>\n            <span class=\"token string-property property\">&#034;env&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;LOG_LEVEL&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;DEBUG&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string-property property\">&#034;PYTHONPATH&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u8c03\u8bd5 MCP Client \u6d4b\u8bd5&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;debugpy&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;request&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;launch&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;program&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}\/tests\/test_client.py&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;console&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;integratedTerminal&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;env&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;PYTHONPATH&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;${workspaceFolder}&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u9644\u52a0\u5230\u8fd0\u884c\u4e2d\u7684\u670d\u52a1\u5668&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;debugpy&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;request&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;attach&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;connect&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;host&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;localhost&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string-property property\">&#034;port&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">5678<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8c03\u8bd5\u6b65\u9aa4&#xff1a;<\/p>\n<li>\u5728\u5de5\u5177\u51fd\u6570\u4e2d\u8bbe\u7f6e\u65ad\u70b9&#xff08;\u70b9\u51fb\u884c\u53f7\u5de6\u4fa7&#xff09;<\/li>\n<li>\u6309 F5 \u542f\u52a8\u8c03\u8bd5<\/li>\n<li>\u4f7f\u7528 curl \u6216 Inspector \u53d1\u9001\u8bf7\u6c42<\/li>\n<li>\u7a0b\u5e8f\u4f1a\u5728\u65ad\u70b9\u5904\u6682\u505c<\/li>\n<li>\u4f7f\u7528\u8c03\u8bd5\u9762\u677f\u67e5\u770b\u53d8\u91cf\u503c\u3001\u8c03\u7528\u6808<\/li>\n<li>F10 \u5355\u6b65\u6267\u884c&#xff0c;F11 \u6b65\u5165\u51fd\u6570<\/li>\n<h4>7.6 \u9519\u8bef\u7801\u901f\u67e5\u8868<\/h4>\n<table>\n<tr>JSON-RPC \u9519\u8bef\u7801\u542b\u4e49\u5e38\u89c1\u539f\u56e0<\/tr>\n<tbody>\n<tr>\n<td>-32700<\/td>\n<td>Parse error<\/td>\n<td>JSON \u683c\u5f0f\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td>-32600<\/td>\n<td>Invalid Request<\/td>\n<td>\u8bf7\u6c42\u7ed3\u6784\u4e0d\u7b26\u5408 JSON-RPC 2.0<\/td>\n<\/tr>\n<tr>\n<td>-32601<\/td>\n<td>Method not found<\/td>\n<td>\u65b9\u6cd5\u540d\u4e0d\u5b58\u5728<\/td>\n<\/tr>\n<tr>\n<td>-32602<\/td>\n<td>Invalid params<\/td>\n<td>\u53c2\u6570\u6821\u9a8c\u5931\u8d25<\/td>\n<\/tr>\n<tr>\n<td>-32603<\/td>\n<td>Internal error<\/td>\n<td>\u670d\u52a1\u5668\u5185\u90e8\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td>-32000<\/td>\n<td>Server error (\u901a\u7528)<\/td>\n<td>\u81ea\u5b9a\u4e49\u670d\u52a1\u5668\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td>-32001<\/td>\n<td>Resource not found<\/td>\n<td>\u8bf7\u6c42\u7684\u8d44\u6e90\u4e0d\u5b58\u5728<\/td>\n<\/tr>\n<tr>\n<td>-32002<\/td>\n<td>Tool execution failed<\/td>\n<td>\u5de5\u5177\u6267\u884c\u5931\u8d25<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3>\u516b\u3001\u751f\u4ea7\u73af\u5883\u90e8\u7f72\u4e0e\u5bb9\u5668\u5316\u5c01\u88c5\u7b56\u7565<\/h3>\n<h4>8.1 \u90e8\u7f72\u67b6\u6784\u9009\u578b<\/h4>\n<p>\u5728\u5c06 MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668\u63a8\u5411\u751f\u4ea7\u73af\u5883\u4e4b\u524d&#xff0c;\u9700\u8981\u6839\u636e\u4e1a\u52a1\u89c4\u6a21\u9009\u62e9\u5408\u9002\u7684\u90e8\u7f72\u67b6\u6784\u3002MCP v2&#xff08;2026-07-28 \u89c4\u8303&#xff09;\u7684\u65e0\u72b6\u6001\u7279\u6027\u4f7f\u5f97\u90e8\u7f72\u65b9\u5f0f\u4e0e\u4f20\u7edf\u5fae\u670d\u52a1\u5b8c\u5168\u4e00\u81f4&#xff0c;\u65e0\u9700\u8003\u8651\u4f1a\u8bdd\u7c98\u6027\u95ee\u9898\u3002<\/p>\n<p>\u4e09\u79cd\u5178\u578b\u90e8\u7f72\u67b6\u6784\u5bf9\u6bd4&#xff1a;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u67b6\u6784\u4e00&#xff1a;\u5355\u673a\u90e8\u7f72&#xff08;\u9002\u5408\u5f00\u53d1\/\u5c0f\u6d41\u91cf&#xff09;                                  \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502  Client \u2500\u2500\u2192 [Nginx] \u2500\u2500\u2192 [MCP Server (\u5355\u8fdb\u7a0b)]                       \u2502<br \/>\n\u2502                         Port: 8000                                  \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502  \u9002\u7528\u573a\u666f&#xff1a;\u65e5\u8bf7\u6c42\u91cf &lt; 10,000                                         \u2502<br \/>\n\u2502  \u4f18\u70b9&#xff1a;\u90e8\u7f72\u7b80\u5355&#xff0c;\u8fd0\u7ef4\u6210\u672c\u4f4e                                           \u2502<br \/>\n\u2502  \u7f3a\u70b9&#xff1a;\u65e0\u9ad8\u53ef\u7528&#xff0c;\u5355\u70b9\u6545\u969c                                            \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u67b6\u6784\u4e8c&#xff1a;\u591a\u5b9e\u4f8b &#043; \u8d1f\u8f7d\u5747\u8861&#xff08;\u9002\u5408\u4e2d\u7b49\u6d41\u91cf&#xff09;                             \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502                    \u250c\u2500\u2500\u2192 [MCP Server \u5b9e\u4f8b1]                          \u2502<br \/>\n\u2502  Client \u2500\u2500\u2192 [LB] \u2500\u2500\u253c\u2500\u2500\u2192 [MCP Server \u5b9e\u4f8b2]                         \u2502<br \/>\n\u2502                    \u2514\u2500\u2500\u2192 [MCP Server \u5b9e\u4f8b3]                          \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502  \u9002\u7528\u573a\u666f&#xff1a;\u65e5\u8bf7\u6c42\u91cf 10,000 &#8211; 1,000,000                               \u2502<br \/>\n\u2502  \u4f18\u70b9&#xff1a;\u6c34\u5e73\u6269\u5c55&#xff0c;\u9ad8\u53ef\u7528                                              \u2502<br \/>\n\u2502  \u5173\u952e&#xff1a;\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b&#xff0c;LB \u65e0\u9700 sticky session                          \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  \u67b6\u6784\u4e09&#xff1a;Kubernetes \u96c6\u7fa4\u90e8\u7f72&#xff08;\u9002\u5408\u5927\u6d41\u91cf\/\u4f01\u4e1a\u7ea7&#xff09;                      \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502  Client \u2500\u2500\u2192 [Ingress] \u2500\u2500\u2192 [Service] \u2500\u2500\u2192 [Pod 1] [Pod 2] [Pod N]   \u2502<br \/>\n\u2502                                            \u2502                        \u2502<br \/>\n\u2502                                     [HPA \u81ea\u52a8\u6269\u7f29\u5bb9]                 \u2502<br \/>\n\u2502                                                                     \u2502<br \/>\n\u2502  \u9002\u7528\u573a\u666f&#xff1a;\u65e5\u8bf7\u6c42\u91cf &gt; 1,000,000&#xff0c;\u9700\u8981\u5f39\u6027\u4f38\u7f29                        \u2502<br \/>\n\u2502  \u4f18\u70b9&#xff1a;\u81ea\u52a8\u6269\u7f29\u5bb9\u3001\u6eda\u52a8\u66f4\u65b0\u3001\u81ea\u6108                                    \u2502<br \/>\n\u2502  \u5173\u952e&#xff1a;\u5229\u7528\u65e0\u72b6\u6001\u7279\u6027&#xff0c;Pod \u53ef\u968f\u610f\u8c03\u5ea6\u5230\u4efb\u610f\u8282\u70b9                        \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>\u9009\u578b\u51b3\u7b56\u8868&#xff1a;<\/p>\n<table>\n<tr>\u8003\u91cf\u56e0\u7d20\u5355\u673a\u90e8\u7f72\u591a\u5b9e\u4f8b&#043;LBKubernetes<\/tr>\n<tbody>\n<tr>\n<td>\u56e2\u961f\u89c4\u6a21<\/td>\n<td>1-2\u4eba<\/td>\n<td>3-5\u4eba<\/td>\n<td>5\u4eba&#043;<\/td>\n<\/tr>\n<tr>\n<td>\u65e5\u8bf7\u6c42\u91cf<\/td>\n<td>&lt;1\u4e07<\/td>\n<td>1\u4e07-100\u4e07<\/td>\n<td>&gt;100\u4e07<\/td>\n<\/tr>\n<tr>\n<td>\u53ef\u7528\u6027\u8981\u6c42<\/td>\n<td>99%<\/td>\n<td>99.9%<\/td>\n<td>99.99%<\/td>\n<\/tr>\n<tr>\n<td>\u8fd0\u7ef4\u590d\u6742\u5ea6<\/td>\n<td>\u4f4e<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8<\/td>\n<\/tr>\n<tr>\n<td>\u6210\u672c<\/td>\n<td>\u4f4e<\/td>\n<td>\u4e2d<\/td>\n<td>\u9ad8&#xff08;\u4f46\u5f39\u6027\u8282\u7701&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u6269\u7f29\u5bb9\u901f\u5ea6<\/td>\n<td>\u624b\u52a8&#xff08;\u5206\u949f\u7ea7&#xff09;<\/td>\n<td>\u534a\u81ea\u52a8&#xff08;\u5206\u949f\u7ea7&#xff09;<\/td>\n<td>\u81ea\u52a8&#xff08;\u79d2\u7ea7&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>8.2 Dockerfile \u7f16\u5199\u4e0e\u955c\u50cf\u6784\u5efa<\/h4>\n<p>Python \u7248 Dockerfile&#xff08;\u591a\u9636\u6bb5\u6784\u5efa&#xff0c;\u751f\u4ea7\u63a8\u8350&#xff09;&#xff1a;<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# deploy\/Dockerfile &#8211; MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668\u751f\u4ea7\u955c\u50cf<br \/>\n# \u591a\u9636\u6bb5\u6784\u5efa&#xff1a;\u51cf\u5c0f\u6700\u7ec8\u955c\u50cf\u4f53\u79ef<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; \u9636\u6bb5\u4e00&#xff1a;\u4f9d\u8d56\u5b89\u88c5 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nFROM python:3.11-slim AS dependency-builder<\/p>\n<p># \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55<br \/>\nWORKDIR \/build<\/p>\n<p># \u5148\u590d\u5236\u4f9d\u8d56\u6587\u4ef6&#xff08;\u5229\u7528 Docker \u7f13\u5b58\u5c42&#xff09;<br \/>\nCOPY requirements.txt .<\/p>\n<p># \u5b89\u88c5\u4f9d\u8d56\u5230\u72ec\u7acb\u76ee\u5f55<br \/>\nRUN pip install &#8211;no-cache-dir &#8211;prefix&#061;\/install \\\\<br \/>\n    -r requirements.txt<\/p>\n<p># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; \u9636\u6bb5\u4e8c&#xff1a;\u8fd0\u884c\u65f6\u955c\u50cf &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nFROM python:3.11-slim AS runtime<\/p>\n<p># \u5b89\u5168&#xff1a;\u521b\u5efa\u975e root \u7528\u6237<br \/>\nRUN groupadd -r mcpuser &amp;&amp; useradd -r -g mcpuser mcpuser<\/p>\n<p># \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf<br \/>\nENV PYTHONUNBUFFERED&#061;1 \\\\<br \/>\n    PYTHONDONTWRITEBYTECODE&#061;1 \\\\<br \/>\n    MCP_STATELESS&#061;true \\\\<br \/>\n    LOG_LEVEL&#061;INFO \\\\<br \/>\n    PORT&#061;8000<\/p>\n<p># \u4ece\u6784\u5efa\u9636\u6bb5\u590d\u5236\u5df2\u5b89\u88c5\u7684\u4f9d\u8d56<br \/>\nCOPY &#8211;from&#061;dependency-builder \/install \/usr\/local<\/p>\n<p># \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55<br \/>\nWORKDIR \/app<\/p>\n<p># \u590d\u5236\u5e94\u7528\u4ee3\u7801<br \/>\nCOPY src\/ .\/src\/<br \/>\nCOPY pyproject.toml .<\/p>\n<p># \u521b\u5efa\u5fc5\u8981\u76ee\u5f55<br \/>\nRUN mkdir -p \/app\/data \/app\/logs &amp;&amp; \\\\<br \/>\n    chown -R mcpuser:mcpuser \/app<\/p>\n<p># \u5207\u6362\u5230\u975e root \u7528\u6237<br \/>\nUSER mcpuser<\/p>\n<p># \u66b4\u9732\u7aef\u53e3<br \/>\nEXPOSE 8000<\/p>\n<p># \u5065\u5eb7\u68c0\u67e5&#xff08;\u65e0\u72b6\u6001\u670d\u52a1\u5668\u53ef\u4ee5\u76f4\u63a5\u68c0\u67e5 \/health \u7aef\u70b9&#xff09;<br \/>\nHEALTHCHECK &#8211;interval&#061;30s &#8211;timeout&#061;5s &#8211;start-period&#061;10s &#8211;retries&#061;3 \\\\<br \/>\n    CMD python -c &#034;import httpx; httpx.get(&#039;http:\/\/localhost:8000\/health&#039;).raise_for_status()&#034;<\/p>\n<p># \u542f\u52a8\u547d\u4ee4<br \/>\n# \u4f7f\u7528 uvicorn \u4f5c\u4e3a ASGI \u670d\u52a1\u5668<br \/>\nCMD [&#034;python&#034;, &#034;-m&#034;, &#034;uvicorn&#034;, \\\\<br \/>\n     &#034;src.server:app&#034;, \\\\<br \/>\n     &#034;&#8211;host&#034;, &#034;0.0.0.0&#034;, \\\\<br \/>\n     &#034;&#8211;port&#034;, &#034;8000&#034;, \\\\<br \/>\n     &#034;&#8211;workers&#034;, &#034;4&#034;, \\\\<br \/>\n     &#034;&#8211;access-log&#034;, \\\\<br \/>\n     &#034;&#8211;log-level&#034;, &#034;info&#034;]<\/p>\n<p>TypeScript \u7248 Dockerfile&#xff1a;<\/p>\n<p># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n# deploy\/Dockerfile.ts &#8211; TypeScript MCP \u670d\u52a1\u5668<br \/>\n# &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/p>\n<p># \u9636\u6bb5\u4e00&#xff1a;\u6784\u5efa<br \/>\nFROM node:20-alpine AS builder<br \/>\nWORKDIR \/build<br \/>\nCOPY package*.json .\/<br \/>\nRUN npm ci &#8211;only&#061;production<br \/>\nCOPY tsconfig.json .\/<br \/>\nCOPY src\/ .\/src\/<br \/>\nRUN npx tsc<\/p>\n<p># \u9636\u6bb5\u4e8c&#xff1a;\u8fd0\u884c<br \/>\nFROM node:20-alpine AS runtime<br \/>\nRUN addgroup -S mcpuser &amp;&amp; adduser -S mcpuser -G mcpuser<br \/>\nWORKDIR \/app<br \/>\nCOPY &#8211;from&#061;builder \/build\/node_modules .\/node_modules<br \/>\nCOPY &#8211;from&#061;builder \/build\/dist .\/dist<br \/>\nCOPY package.json .\/<br \/>\nUSER mcpuser<br \/>\nEXPOSE 8000<br \/>\nENV NODE_ENV&#061;production \\\\<br \/>\n    PORT&#061;8000 \\\\<br \/>\n    MCP_STATELESS&#061;true<br \/>\nHEALTHCHECK &#8211;interval&#061;30s &#8211;timeout&#061;5s \\\\<br \/>\n    CMD wget &#8211;no-verbose &#8211;tries&#061;1 &#8211;spider http:\/\/localhost:8000\/health || exit 1<br \/>\nCMD [&#034;node&#034;, &#034;dist\/server.js&#034;, &#034;&#8211;http&#034;]<\/p>\n<p>\u6784\u5efa\u4e0e\u8fd0\u884c&#xff1a;<\/p>\n<p><span class=\"token comment\"># \u6784\u5efa\u955c\u50cf<\/span><br \/>\n<span class=\"token function\">docker<\/span> build <span class=\"token parameter variable\">-f<\/span> deploy\/Dockerfile <span class=\"token parameter variable\">-t<\/span> mcp-agent-server:v1.0.0 <span class=\"token builtin class-name\">.<\/span><\/p>\n<p><span class=\"token comment\"># \u67e5\u770b\u955c\u50cf\u5927\u5c0f&#xff08;\u591a\u9636\u6bb5\u6784\u5efa\u901a\u5e38 &lt; 200MB&#xff09;<\/span><br \/>\n<span class=\"token function\">docker<\/span> images mcp-agent-server<\/p>\n<p><span class=\"token comment\"># \u8fd0\u884c\u5bb9\u5668<\/span><br \/>\n<span class=\"token function\">docker<\/span> run <span class=\"token parameter variable\">-d<\/span> <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">&#8211;name<\/span> mcp-server <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-p<\/span> <span class=\"token number\">8000<\/span>:8000 <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">LOG_LEVEL<\/span><span class=\"token operator\">&#061;<\/span>INFO <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">-e<\/span> <span class=\"token assign-left variable\">MCP_STATELESS<\/span><span class=\"token operator\">&#061;<\/span>true <span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token parameter variable\">&#8211;restart<\/span> unless-stopped <span class=\"token punctuation\">\\\\<\/span><br \/>\n    mcp-agent-server:v1.0.0<\/p>\n<p><span class=\"token comment\"># \u9a8c\u8bc1\u8fd0\u884c<\/span><br \/>\n<span class=\"token function\">curl<\/span> http:\/\/localhost:8000\/health<br \/>\n<span class=\"token comment\"># \u671f\u671b\u8f93\u51fa: {&#034;status&#034;: &#034;healthy&#034;, &#034;mode&#034;: &#034;stateless&#034;}<\/span><\/p>\n<h4>8.3 Docker Compose \u591a\u670d\u52a1\u7f16\u6392<\/h4>\n<p><span class=\"token comment\"># deploy\/docker-compose.yml<\/span><br \/>\n<span class=\"token comment\"># \u5b8c\u6574\u7684 MCP \u670d\u52a1\u5668 &#043; \u4f9d\u8d56\u670d\u52a1\u7f16\u6392<\/span><br \/>\n<span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;3.9&#034;<\/span><\/p>\n<p><span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668&#xff08;\u591a\u526f\u672c&#xff09;<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">mcp-server<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> ..<br \/>\n      <span class=\"token key atrule\">dockerfile<\/span><span class=\"token punctuation\">:<\/span> deploy\/Dockerfile<br \/>\n    <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">replicas<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span>  <span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f&#xff1a;\u76f4\u63a5\u591a\u526f\u672c&#xff0c;\u65e0\u9700 sticky session<\/span><br \/>\n      <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1.0&#034;<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 512M<br \/>\n        <span class=\"token key atrule\">reservations<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">cpus<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;0.25&#034;<\/span><br \/>\n          <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> 128M<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> MCP_STATELESS&#061;true<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> LOG_LEVEL&#061;INFO<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> DB_HOST&#061;postgres<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> DB_PORT&#061;5432<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> DB_NAME&#061;mcp_data<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> REDIS_URL&#061;redis<span class=\"token punctuation\">:<\/span>\/\/redis<span class=\"token punctuation\">:<\/span>6379\/0<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;8000:8000&#034;<\/span><br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">condition<\/span><span class=\"token punctuation\">:<\/span> service_healthy<br \/>\n      <span class=\"token key atrule\">redis<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">condition<\/span><span class=\"token punctuation\">:<\/span> service_healthy<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;python&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;-c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;import httpx; httpx.get(&#039;http:\/\/localhost:8000\/health&#039;)&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 30s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><br \/>\n    <span class=\"token key atrule\">restart<\/span><span class=\"token punctuation\">:<\/span> unless<span class=\"token punctuation\">&#8211;<\/span>stopped<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>network<\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># Nginx \u53cd\u5411\u4ee3\u7406 \/ \u8d1f\u8f7d\u5747\u8861<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">nginx<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> nginx<span class=\"token punctuation\">:<\/span>1.25<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;80:80&#034;<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;443:443&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/nginx\/nginx.conf<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/nginx.conf<span class=\"token punctuation\">:<\/span>ro<br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/nginx\/ssl<span class=\"token punctuation\">:<\/span>\/etc\/nginx\/ssl<span class=\"token punctuation\">:<\/span>ro<br \/>\n    <span class=\"token key atrule\">depends_on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>network<\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># PostgreSQL \u6570\u636e\u5e93<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">postgres<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> postgres<span class=\"token punctuation\">:<\/span>16<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">POSTGRES_DB<\/span><span class=\"token punctuation\">:<\/span> mcp_data<br \/>\n      <span class=\"token key atrule\">POSTGRES_USER<\/span><span class=\"token punctuation\">:<\/span> mcp_user<br \/>\n      <span class=\"token key atrule\">POSTGRES_PASSWORD<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>DB_PASSWORD<span class=\"token punctuation\">:<\/span><span class=\"token punctuation\">&#8211;<\/span>secure_password_here<span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> postgres_data<span class=\"token punctuation\">:<\/span>\/var\/lib\/postgresql\/data<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD-SHELL&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;pg_isready -U mcp_user -d mcp_data&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 5s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>network<\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># Redis \u7f13\u5b58&#xff08;\u7528\u4e8e\u9650\u6d41\u8ba1\u6570\u5668&#xff09;<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">redis<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> redis<span class=\"token punctuation\">:<\/span>7<span class=\"token punctuation\">&#8211;<\/span>alpine<br \/>\n    <span class=\"token key atrule\">command<\/span><span class=\"token punctuation\">:<\/span> redis<span class=\"token punctuation\">&#8211;<\/span>server <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>maxmemory 128mb <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>maxmemory<span class=\"token punctuation\">&#8211;<\/span>policy allkeys<span class=\"token punctuation\">&#8211;<\/span>lru<br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> redis_data<span class=\"token punctuation\">:<\/span>\/data<br \/>\n    <span class=\"token key atrule\">healthcheck<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;CMD&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;redis-cli&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ping&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n      <span class=\"token key atrule\">interval<\/span><span class=\"token punctuation\">:<\/span> 10s<br \/>\n      <span class=\"token key atrule\">timeout<\/span><span class=\"token punctuation\">:<\/span> 3s<br \/>\n      <span class=\"token key atrule\">retries<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>network<\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># Prometheus \u76d1\u63a7&#xff08;\u53ef\u9009&#xff09;<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">prometheus<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> prom\/prometheus<span class=\"token punctuation\">:<\/span>latest<br \/>\n    <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token string\">&#034;9090:9090&#034;<\/span><br \/>\n    <span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> .\/monitoring\/prometheus.yml<span class=\"token punctuation\">:<\/span>\/etc\/prometheus\/prometheus.yml<span class=\"token punctuation\">:<\/span>ro<br \/>\n    <span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>network<\/p>\n<p><span class=\"token key atrule\">volumes<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">postgres_data<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">redis_data<\/span><span class=\"token punctuation\">:<\/span><\/p>\n<p><span class=\"token key atrule\">networks<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">mcp-network<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">driver<\/span><span class=\"token punctuation\">:<\/span> bridge<\/p>\n<p>Nginx \u914d\u7f6e\u6587\u4ef6&#xff1a;<\/p>\n<p># deploy\/nginx\/nginx.conf<br \/>\n# MCP \u670d\u52a1\u5668\u53cd\u5411\u4ee3\u7406\u914d\u7f6e&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f&#xff1a;\u7b80\u5355 round-robin&#xff09;<\/p>\n<p>upstream mcp_backend {<br \/>\n    # \u65e0\u72b6\u6001\u6a21\u5f0f\u5173\u952e&#xff1a;\u65e0\u9700 ip_hash \u6216 sticky session<br \/>\n    # \u6807\u51c6 round-robin \u5373\u53ef<br \/>\n    server mcp-server:8000;<br \/>\n    # \u5982\u679c\u662f\u591a\u5bb9\u5668&#xff0c;Docker Compose \u4f1a\u81ea\u52a8\u89e3\u6790\u4e3a\u591a\u4e2a IP<\/p>\n<p>    # \u8fde\u63a5\u6c60\u914d\u7f6e<br \/>\n    keepalive 32;<br \/>\n}<\/p>\n<p>server {<br \/>\n    listen 80;<br \/>\n    server_name mcp.example.com;<\/p>\n<p>    # \u5f3a\u5236 HTTPS \u91cd\u5b9a\u5411<br \/>\n    return 301 https:\/\/$server_name$request_uri;<br \/>\n}<\/p>\n<p>server {<br \/>\n    listen 443 ssl http2;<br \/>\n    server_name mcp.example.com;<\/p>\n<p>    # SSL \u914d\u7f6e<br \/>\n    ssl_certificate \/etc\/nginx\/ssl\/cert.pem;<br \/>\n    ssl_certificate_key \/etc\/nginx\/ssl\/key.pem;<br \/>\n    ssl_protocols TLSv1.2 TLSv1.3;<br \/>\n    ssl_ciphers HIGH:!aNULL:!MD5;<\/p>\n<p>    # MCP \u7aef\u70b9<br \/>\n    location \/mcp {<br \/>\n        proxy_pass http:\/\/mcp_backend;<br \/>\n        proxy_http_version 1.1;<br \/>\n        proxy_set_header Connection &#034;&#034;;<br \/>\n        proxy_set_header Host $host;<br \/>\n        proxy_set_header X-Real-IP $remote_addr;<br \/>\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br \/>\n        proxy_set_header X-Forwarded-Proto $scheme;<\/p>\n<p>        # MCP \u8bf7\u6c42\u8d85\u65f6\u8bbe\u7f6e<br \/>\n        proxy_connect_timeout 10s;<br \/>\n        proxy_read_timeout 60s;   # \u5de5\u5177\u6267\u884c\u53ef\u80fd\u8017\u65f6\u8f83\u957f<br \/>\n        proxy_send_timeout 10s;<\/p>\n<p>        # \u652f\u6301 SSE \u6d41\u5f0f\u54cd\u5e94<br \/>\n        proxy_buffering off;<br \/>\n        proxy_cache off;<br \/>\n    }<\/p>\n<p>    # \u5065\u5eb7\u68c0\u67e5\u7aef\u70b9<br \/>\n    location \/health {<br \/>\n        proxy_pass http:\/\/mcp_backend;<br \/>\n        proxy_http_version 1.1;<br \/>\n    }<\/p>\n<p>    # \u7981\u6b62\u8bbf\u95ee\u5176\u4ed6\u8def\u5f84<br \/>\n    location \/ {<br \/>\n        return 404;<br \/>\n    }<br \/>\n}<\/p>\n<h4>8.4 Kubernetes \u90e8\u7f72\u6e05\u5355<\/h4>\n<p><span class=\"token comment\"># deploy\/k8s\/deployment.yaml<\/span><br \/>\n<span class=\"token comment\"># MCP \u65e0\u72b6\u6001\u670d\u52a1\u5668 Kubernetes \u90e8\u7f72<\/span><br \/>\n<span class=\"token key atrule\">apiVersion<\/span><span class=\"token punctuation\">:<\/span> apps\/v1<br \/>\n<span class=\"token key atrule\">kind<\/span><span class=\"token punctuation\">:<\/span> Deployment<br \/>\n<span class=\"token key atrule\">metadata<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n  <span class=\"token key atrule\">namespace<\/span><span class=\"token punctuation\">:<\/span> ai<span class=\"token punctuation\">&#8211;<\/span>services<br \/>\n  <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n    <span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> v1.0.0<br \/>\n    <span class=\"token key atrule\">protocol<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>v2<br \/>\n<span class=\"token key atrule\">spec<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f&#xff1a;\u526f\u672c\u6570\u53ef\u968f\u610f\u8c03\u6574&#xff0c;\u65e0\u9700\u62c5\u5fc3\u4f1a\u8bdd\u4e2d\u65ad<\/span><br \/>\n  <span class=\"token key atrule\">replicas<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><br \/>\n  <span class=\"token key atrule\">selector<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">matchLabels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n  <span class=\"token comment\"># \u6eda\u52a8\u66f4\u65b0\u7b56\u7565<\/span><br \/>\n  <span class=\"token key atrule\">strategy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> RollingUpdate<br \/>\n    <span class=\"token key atrule\">rollingUpdate<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">maxSurge<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span>        <span class=\"token comment\"># \u6700\u591a\u591a\u51fa1\u4e2aPod<\/span><br \/>\n      <span class=\"token key atrule\">maxUnavailable<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">0<\/span>  <span class=\"token comment\"># \u4e0d\u5141\u8bb8\u6709Pod\u4e0d\u53ef\u7528<\/span><br \/>\n  <span class=\"token key atrule\">template<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">metadata<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n        <span class=\"token key atrule\">version<\/span><span class=\"token punctuation\">:<\/span> v1.0.0<br \/>\n      <span class=\"token key atrule\">annotations<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">prometheus.io\/scrape<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;true&#034;<\/span><br \/>\n        <span class=\"token key atrule\">prometheus.io\/port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;8000&#034;<\/span><br \/>\n        <span class=\"token key atrule\">prometheus.io\/path<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\/metrics&#034;<\/span><br \/>\n    <span class=\"token key atrule\">spec<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token comment\"># \u5b89\u5168\u4e0a\u4e0b\u6587<\/span><br \/>\n      <span class=\"token key atrule\">securityContext<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">runAsNonRoot<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n        <span class=\"token key atrule\">runAsUser<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1000<\/span><br \/>\n        <span class=\"token key atrule\">fsGroup<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1000<\/span><\/p>\n<p>      <span class=\"token key atrule\">containers<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n          <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span> registry.example.com\/mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<span class=\"token punctuation\">:<\/span>v1.0.0<br \/>\n          <span class=\"token key atrule\">imagePullPolicy<\/span><span class=\"token punctuation\">:<\/span> IfNotPresent<br \/>\n          <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">containerPort<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8000<\/span><br \/>\n              <span class=\"token key atrule\">protocol<\/span><span class=\"token punctuation\">:<\/span> TCP<br \/>\n              <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> http<\/p>\n<p>          <span class=\"token comment\"># \u73af\u5883\u53d8\u91cf<\/span><br \/>\n          <span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> MCP_STATELESS<br \/>\n              <span class=\"token key atrule\">value<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;true&#034;<\/span><br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> LOG_LEVEL<br \/>\n              <span class=\"token key atrule\">value<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;INFO&#034;<\/span><br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> PORT<br \/>\n              <span class=\"token key atrule\">value<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;8000&#034;<\/span><br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> DB_HOST<br \/>\n              <span class=\"token key atrule\">valueFrom<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token key atrule\">secretKeyRef<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>db<span class=\"token punctuation\">&#8211;<\/span>secret<br \/>\n                  <span class=\"token key atrule\">key<\/span><span class=\"token punctuation\">:<\/span> host<br \/>\n            <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> DB_PASSWORD<br \/>\n              <span class=\"token key atrule\">valueFrom<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token key atrule\">secretKeyRef<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>db<span class=\"token punctuation\">&#8211;<\/span>secret<br \/>\n                  <span class=\"token key atrule\">key<\/span><span class=\"token punctuation\">:<\/span> password<\/p>\n<p>          <span class=\"token comment\"># \u8d44\u6e90\u9650\u5236<\/span><br \/>\n          <span class=\"token key atrule\">resources<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token key atrule\">requests<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">cpu<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;250m&#034;<\/span><br \/>\n              <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;256Mi&#034;<\/span><br \/>\n            <span class=\"token key atrule\">limits<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">cpu<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;1000m&#034;<\/span><br \/>\n              <span class=\"token key atrule\">memory<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;512Mi&#034;<\/span><\/p>\n<p>          <span class=\"token comment\"># \u5b58\u6d3b\u63a2\u9488<\/span><br \/>\n          <span class=\"token key atrule\">livenessProbe<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token key atrule\">httpGet<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/health<br \/>\n              <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8000<\/span><br \/>\n            <span class=\"token key atrule\">initialDelaySeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">10<\/span><br \/>\n            <span class=\"token key atrule\">periodSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">30<\/span><br \/>\n            <span class=\"token key atrule\">timeoutSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n            <span class=\"token key atrule\">failureThreshold<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><\/p>\n<p>          <span class=\"token comment\"># \u5c31\u7eea\u63a2\u9488<\/span><br \/>\n          <span class=\"token key atrule\">readinessProbe<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token key atrule\">httpGet<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/health<br \/>\n              <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8000<\/span><br \/>\n            <span class=\"token key atrule\">initialDelaySeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n            <span class=\"token key atrule\">periodSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">10<\/span><br \/>\n            <span class=\"token key atrule\">timeoutSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><br \/>\n            <span class=\"token key atrule\">failureThreshold<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><\/p>\n<p>          <span class=\"token comment\"># \u542f\u52a8\u63a2\u9488<\/span><br \/>\n          <span class=\"token key atrule\">startupProbe<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token key atrule\">httpGet<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/health<br \/>\n              <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8000<\/span><br \/>\n            <span class=\"token key atrule\">initialDelaySeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">3<\/span><br \/>\n            <span class=\"token key atrule\">periodSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">5<\/span><br \/>\n            <span class=\"token key atrule\">failureThreshold<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">10<\/span><\/p>\n<p><span class=\"token punctuation\">&#8212;<\/span><br \/>\n<span class=\"token comment\"># deploy\/k8s\/service.yaml<\/span><br \/>\n<span class=\"token key atrule\">apiVersion<\/span><span class=\"token punctuation\">:<\/span> v1<br \/>\n<span class=\"token key atrule\">kind<\/span><span class=\"token punctuation\">:<\/span> Service<br \/>\n<span class=\"token key atrule\">metadata<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n  <span class=\"token key atrule\">namespace<\/span><span class=\"token punctuation\">:<\/span> ai<span class=\"token punctuation\">&#8211;<\/span>services<br \/>\n  <span class=\"token key atrule\">labels<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n<span class=\"token key atrule\">spec<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> ClusterIP<br \/>\n  <span class=\"token key atrule\">selector<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">app<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n  <span class=\"token key atrule\">ports<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">80<\/span><br \/>\n      <span class=\"token key atrule\">targetPort<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">8000<\/span><br \/>\n      <span class=\"token key atrule\">protocol<\/span><span class=\"token punctuation\">:<\/span> TCP<br \/>\n      <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> http<\/p>\n<p><span class=\"token punctuation\">&#8212;<\/span><br \/>\n<span class=\"token comment\"># deploy\/k8s\/hpa.yaml<\/span><br \/>\n<span class=\"token comment\"># \u6c34\u5e73\u81ea\u52a8\u6269\u7f29\u5bb9&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f\u7684\u6838\u5fc3\u4f18\u52bf&#xff09;<\/span><br \/>\n<span class=\"token key atrule\">apiVersion<\/span><span class=\"token punctuation\">:<\/span> autoscaling\/v2<br \/>\n<span class=\"token key atrule\">kind<\/span><span class=\"token punctuation\">:<\/span> HorizontalPodAutoscaler<br \/>\n<span class=\"token key atrule\">metadata<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<span class=\"token punctuation\">&#8211;<\/span>hpa<br \/>\n  <span class=\"token key atrule\">namespace<\/span><span class=\"token punctuation\">:<\/span> ai<span class=\"token punctuation\">&#8211;<\/span>services<br \/>\n<span class=\"token key atrule\">spec<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">scaleTargetRef<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">apiVersion<\/span><span class=\"token punctuation\">:<\/span> apps\/v1<br \/>\n    <span class=\"token key atrule\">kind<\/span><span class=\"token punctuation\">:<\/span> Deployment<br \/>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n  <span class=\"token key atrule\">minReplicas<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">2<\/span><br \/>\n  <span class=\"token key atrule\">maxReplicas<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">20<\/span><br \/>\n  <span class=\"token key atrule\">metrics<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Resource<br \/>\n      <span class=\"token key atrule\">resource<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> cpu<br \/>\n        <span class=\"token key atrule\">target<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Utilization<br \/>\n          <span class=\"token key atrule\">averageUtilization<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">70<\/span><br \/>\n    <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Resource<br \/>\n      <span class=\"token key atrule\">resource<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> memory<br \/>\n        <span class=\"token key atrule\">target<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Utilization<br \/>\n          <span class=\"token key atrule\">averageUtilization<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">80<\/span><br \/>\n  <span class=\"token key atrule\">behavior<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">scaleUp<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">stabilizationWindowSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">30<\/span><br \/>\n      <span class=\"token key atrule\">policies<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Pods<br \/>\n          <span class=\"token key atrule\">value<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">2<\/span><br \/>\n          <span class=\"token key atrule\">periodSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">60<\/span><br \/>\n    <span class=\"token key atrule\">scaleDown<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">stabilizationWindowSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">300<\/span><br \/>\n      <span class=\"token key atrule\">policies<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">type<\/span><span class=\"token punctuation\">:<\/span> Pods<br \/>\n          <span class=\"token key atrule\">value<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><br \/>\n          <span class=\"token key atrule\">periodSeconds<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">120<\/span><\/p>\n<p><span class=\"token punctuation\">&#8212;<\/span><br \/>\n<span class=\"token comment\"># deploy\/k8s\/ingress.yaml<\/span><br \/>\n<span class=\"token key atrule\">apiVersion<\/span><span class=\"token punctuation\">:<\/span> networking.k8s.io\/v1<br \/>\n<span class=\"token key atrule\">kind<\/span><span class=\"token punctuation\">:<\/span> Ingress<br \/>\n<span class=\"token key atrule\">metadata<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<span class=\"token punctuation\">&#8211;<\/span>ingress<br \/>\n  <span class=\"token key atrule\">namespace<\/span><span class=\"token punctuation\">:<\/span> ai<span class=\"token punctuation\">&#8211;<\/span>services<br \/>\n  <span class=\"token key atrule\">annotations<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">nginx.ingress.kubernetes.io\/proxy-read-timeout<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;60&#034;<\/span><br \/>\n    <span class=\"token key atrule\">nginx.ingress.kubernetes.io\/proxy-send-timeout<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;60&#034;<\/span><br \/>\n    <span class=\"token key atrule\">nginx.ingress.kubernetes.io\/proxy-buffering<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;off&#034;<\/span><br \/>\n    <span class=\"token key atrule\">cert-manager.io\/cluster-issuer<\/span><span class=\"token punctuation\">:<\/span> letsencrypt<span class=\"token punctuation\">&#8211;<\/span>prod<br \/>\n<span class=\"token key atrule\">spec<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">ingressClassName<\/span><span class=\"token punctuation\">:<\/span> nginx<br \/>\n  <span class=\"token key atrule\">tls<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">hosts<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token punctuation\">&#8211;<\/span> mcp.example.com<br \/>\n      <span class=\"token key atrule\">secretName<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>tls<span class=\"token punctuation\">&#8211;<\/span>secret<br \/>\n  <span class=\"token key atrule\">rules<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">host<\/span><span class=\"token punctuation\">:<\/span> mcp.example.com<br \/>\n      <span class=\"token key atrule\">http<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token key atrule\">paths<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/mcp<br \/>\n            <span class=\"token key atrule\">pathType<\/span><span class=\"token punctuation\">:<\/span> Prefix<br \/>\n            <span class=\"token key atrule\">backend<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">service<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n                <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                  <span class=\"token key atrule\">number<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">80<\/span><br \/>\n          <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">path<\/span><span class=\"token punctuation\">:<\/span> \/health<br \/>\n            <span class=\"token key atrule\">pathType<\/span><span class=\"token punctuation\">:<\/span> Exact<br \/>\n            <span class=\"token key atrule\">backend<\/span><span class=\"token punctuation\">:<\/span><br \/>\n              <span class=\"token key atrule\">service<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<br \/>\n                <span class=\"token key atrule\">port<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                  <span class=\"token key atrule\">number<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">80<\/span><\/p>\n<h4>8.5 CI\/CD \u6d41\u6c34\u7ebf\u96c6\u6210<\/h4>\n<p><span class=\"token comment\"># .github\/workflows\/deploy.yml<\/span><br \/>\n<span class=\"token comment\"># GitHub Actions CI\/CD \u6d41\u6c34\u7ebf<\/span><br \/>\n<span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> MCP Server CI\/CD<\/p>\n<p><span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span><br \/>\n  <span class=\"token key atrule\">pull_request<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span><\/p>\n<p><span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token key atrule\">REGISTRY<\/span><span class=\"token punctuation\">:<\/span> ghcr.io<br \/>\n  <span class=\"token key atrule\">IMAGE_NAME<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> github.repository <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># \u9636\u6bb5\u4e00&#xff1a;\u6d4b\u8bd5<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span>latest<br \/>\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout&#064;v4<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Set up Python<br \/>\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/setup<span class=\"token punctuation\">&#8211;<\/span>python&#064;v5<br \/>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">python-version<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;3.11&#034;<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Install dependencies<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          pip install -e &#034;.[dev]&#034;<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Run linter<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> ruff check src\/<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Run type checker<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> mypy src\/<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Run unit tests<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> pytest tests\/ <span class=\"token punctuation\">&#8211;<\/span>v <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>tb&#061;short<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Run integration tests<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          # \u542f\u52a8\u670d\u52a1\u5668<br \/>\n          python src\/server.py &#8211;http &amp;<br \/>\n          SERVER_PID&#061;$!<br \/>\n          sleep 3<br \/>\n          # \u8fd0\u884c\u96c6\u6210\u6d4b\u8bd5<br \/>\n          pytest tests\/test_integration.py -v<br \/>\n          # \u6e05\u7406<br \/>\n          kill $SERVER_PID<\/span><\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># \u9636\u6bb5\u4e8c&#xff1a;\u6784\u5efa\u955c\u50cf<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">build<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">needs<\/span><span class=\"token punctuation\">:<\/span> test<br \/>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span>latest<br \/>\n    <span class=\"token key atrule\">if<\/span><span class=\"token punctuation\">:<\/span> github.event_name &#061;&#061; &#039;push&#039;<br \/>\n    <span class=\"token key atrule\">permissions<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token key atrule\">contents<\/span><span class=\"token punctuation\">:<\/span> read<br \/>\n      <span class=\"token key atrule\">packages<\/span><span class=\"token punctuation\">:<\/span> write<br \/>\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout&#064;v4<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Log in to Container Registry<br \/>\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> docker\/login<span class=\"token punctuation\">&#8211;<\/span>action&#064;v3<br \/>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> env.REGISTRY <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><br \/>\n          <span class=\"token key atrule\">username<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> github.actor <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><br \/>\n          <span class=\"token key atrule\">password<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.GITHUB_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Build and push Docker image<br \/>\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> docker\/build<span class=\"token punctuation\">&#8211;<\/span>push<span class=\"token punctuation\">&#8211;<\/span>action&#064;v5<br \/>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .<br \/>\n          <span class=\"token key atrule\">file<\/span><span class=\"token punctuation\">:<\/span> deploy\/Dockerfile<br \/>\n          <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span><br \/>\n          <span class=\"token key atrule\">tags<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n            ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}:${{ github.sha }}<br \/>\n            ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}:latest<\/span><br \/>\n          <span class=\"token key atrule\">cache-from<\/span><span class=\"token punctuation\">:<\/span> type&#061;gha<br \/>\n          <span class=\"token key atrule\">cache-to<\/span><span class=\"token punctuation\">:<\/span> type&#061;gha<span class=\"token punctuation\">,<\/span>mode&#061;max<\/p>\n<p>  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token comment\"># \u9636\u6bb5\u4e09&#xff1a;\u90e8\u7f72\u5230 Kubernetes<\/span><br \/>\n  <span class=\"token comment\"># &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n  <span class=\"token key atrule\">deploy<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token key atrule\">needs<\/span><span class=\"token punctuation\">:<\/span> build<br \/>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">&#8211;<\/span>latest<br \/>\n    <span class=\"token key atrule\">if<\/span><span class=\"token punctuation\">:<\/span> github.ref &#061;&#061; &#039;refs\/heads\/main&#039;<br \/>\n    <span class=\"token key atrule\">environment<\/span><span class=\"token punctuation\">:<\/span> production<br \/>\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span><br \/>\n      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout&#064;v4<\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Configure kubectl<br \/>\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> azure\/k8s<span class=\"token punctuation\">&#8211;<\/span>set<span class=\"token punctuation\">&#8211;<\/span>context&#064;v4<br \/>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span><br \/>\n          <span class=\"token key atrule\">kubeconfig<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.KUBE_CONFIG <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>      <span class=\"token punctuation\">&#8211;<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Deploy to Kubernetes<br \/>\n        <span class=\"token key atrule\">run<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\"><br \/>\n          # \u66f4\u65b0\u955c\u50cf\u6807\u7b7e<br \/>\n          kubectl set image deployment\/mcp-agent-server \\\\<br \/>\n            mcp-server&#061;${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}:${{ github.sha }} \\\\<br \/>\n            -n ai-services<\/span><\/p>\n<p>          <span class=\"token comment\"># \u7b49\u5f85\u6eda\u52a8\u66f4\u65b0\u5b8c\u6210<\/span><br \/>\n          kubectl rollout status deployment\/mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server \\\\<br \/>\n            <span class=\"token punctuation\">&#8211;<\/span>n ai<span class=\"token punctuation\">&#8211;<\/span>services <span class=\"token punctuation\">&#8211;<\/span><span class=\"token punctuation\">&#8211;<\/span>timeout&#061;300s<\/p>\n<p>          <span class=\"token comment\"># \u9a8c\u8bc1\u90e8\u7f72<\/span><br \/>\n          kubectl get pods <span class=\"token punctuation\">&#8211;<\/span>n ai<span class=\"token punctuation\">&#8211;<\/span>services <span class=\"token punctuation\">&#8211;<\/span>l app&#061;mcp<span class=\"token punctuation\">&#8211;<\/span>agent<span class=\"token punctuation\">&#8211;<\/span>server<\/p>\n<h4>8.6 \u5065\u5eb7\u68c0\u67e5\u4e0e\u4f18\u96c5\u505c\u673a<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/health.py &#8211; \u5065\u5eb7\u68c0\u67e5\u4e0e\u4f18\u96c5\u505c\u673a\u5b9e\u73b0<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> signal<br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> datetime <span class=\"token keyword\">import<\/span> datetime<br \/>\n<span class=\"token keyword\">from<\/span> contextlib <span class=\"token keyword\">import<\/span> asynccontextmanager<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.health&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u5168\u5c40\u72b6\u6001<\/span><br \/>\n_server_start_time <span class=\"token operator\">&#061;<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n_is_shutting_down <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">create_health_endpoint<\/span><span class=\"token punctuation\">(<\/span>app<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4e3a FastAPI\/Uvicorn \u5e94\u7528\u6dfb\u52a0\u5065\u5eb7\u68c0\u67e5\u7aef\u70b9&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;app<span class=\"token punctuation\">.<\/span>get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/health&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">health_check<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u5065\u5eb7\u68c0\u67e5\u7aef\u70b9<br \/>\n        &#8211; 200: \u670d\u52a1\u5065\u5eb7<br \/>\n        &#8211; 503: \u670d\u52a1\u6b63\u5728\u5173\u95ed&#xff08;\u4f18\u96c5\u505c\u673a\u671f\u95f4&#xff09;<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> _is_shutting_down<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;draining&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;Server is shutting down&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;timestamp&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">503<\/span><\/p>\n<p>        uptime <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> _server_start_time<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>total_seconds<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;healthy&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;mode&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;stateless&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;protocol_version&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2026-07-28&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;uptime_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>uptime<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;timestamp&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;app<span class=\"token punctuation\">.<\/span>get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/ready&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">readiness_check<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u5c31\u7eea\u68c0\u67e5\u7aef\u70b9&#xff08;Kubernetes readinessProbe \u4f7f\u7528&#xff09;<br \/>\n        \u68c0\u67e5\u6240\u6709\u4f9d\u8d56\u670d\u52a1\u662f\u5426\u53ef\u7528<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        checks <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;database&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token keyword\">await<\/span> _check_database<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;redis&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token keyword\">await<\/span> _check_redis<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        all_healthy <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">all<\/span><span class=\"token punctuation\">(<\/span>checks<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;ready&#034;<\/span> <span class=\"token keyword\">if<\/span> all_healthy <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;not_ready&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;checks&#034;<\/span><span class=\"token punctuation\">:<\/span> checks<br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_check_database<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u68c0\u67e5\u6570\u636e\u5e93\u8fde\u63a5&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u5b9e\u9645\u5b9e\u73b0&#xff1a;\u6267\u884c SELECT 1<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_check_redis<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u68c0\u67e5 Redis \u8fde\u63a5&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u5b9e\u9645\u5b9e\u73b0&#xff1a;\u6267\u884c PING<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">setup_graceful_shutdown<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u914d\u7f6e\u4f18\u96c5\u505c\u673a\u5904\u7406&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">signal_handler<\/span><span class=\"token punctuation\">(<\/span>signum<span class=\"token punctuation\">,<\/span> frame<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">global<\/span> _is_shutting_down<br \/>\n        _is_shutting_down <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6536\u5230\u4fe1\u53f7 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>signum<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#xff0c;\u5f00\u59cb\u4f18\u96c5\u505c\u673a&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;1. \u505c\u6b62\u63a5\u53d7\u65b0\u8bf7\u6c42&#xff08;\u5065\u5eb7\u68c0\u67e5\u8fd4\u56de 503&#xff09;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;2. \u7b49\u5f85\u8fdb\u884c\u4e2d\u7684\u8bf7\u6c42\u5b8c\u6210&#xff08;\u6700\u591a30\u79d2&#xff09;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;3. \u5173\u95ed\u8fde\u63a5\u6c60\u548c\u5916\u90e8\u8d44\u6e90&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;4. \u8fdb\u7a0b\u9000\u51fa&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token comment\"># Uvicorn \u4f1a\u81ea\u52a8\u5904\u7406 SIGTERM\/SIGINT<\/span><\/p>\n<p>    signal<span class=\"token punctuation\">.<\/span>signal<span class=\"token punctuation\">(<\/span>signal<span class=\"token punctuation\">.<\/span>SIGTERM<span class=\"token punctuation\">,<\/span> signal_handler<span class=\"token punctuation\">)<\/span><br \/>\n    signal<span class=\"token punctuation\">.<\/span>signal<span class=\"token punctuation\">(<\/span>signal<span class=\"token punctuation\">.<\/span>SIGINT<span class=\"token punctuation\">,<\/span> signal_handler<span class=\"token punctuation\">)<\/span><\/p>\n<hr \/>\n<h3>\u4e5d\u3001\u6027\u80fd\u4f18\u5316\u8981\u70b9\u4e0e\u5b89\u5168\u8bbf\u95ee\u63a7\u5236\u673a\u5236<\/h3>\n<h4>9.1 \u8fde\u63a5\u6c60\u4e0e\u8d44\u6e90\u590d\u7528<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/middleware\/connection_pool.py &#8211; \u8fde\u63a5\u6c60\u7ba1\u7406<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b&#xff0c;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb\u5904\u7406&#xff0c;\u4f46\u5e95\u5c42\u7684\u6570\u636e\u5e93\u8fde\u63a5\u3001<br \/>\nHTTP \u5ba2\u6237\u7aef\u7b49\u8d44\u6e90\u4ecd\u7136\u9700\u8981\u6c60\u5316\u590d\u7528&#xff0c;\u907f\u514d\u9891\u7e41\u521b\u5efa\/\u9500\u6bc1\u3002<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> httpx<br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">from<\/span> contextlib <span class=\"token keyword\">import<\/span> asynccontextmanager<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Optional<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ConnectionPoolManager<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8fde\u63a5\u6c60\u7ba1\u7406\u5668<\/p>\n<p>    \u5728\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668\u4e2d&#xff0c;\u867d\u7136\u6bcf\u4e2a HTTP \u8bf7\u6c42\u72ec\u7acb&#xff0c;<br \/>\n    \u4f46\u670d\u52a1\u5668\u8fdb\u7a0b\u5185\u90e8\u4ecd\u7136\u7ef4\u62a4\u957f\u751f\u547d\u5468\u671f\u7684\u8fde\u63a5\u6c60\u3002<br \/>\n    \u8fd9\u662f&#034;\u534f\u8bae\u5c42\u65e0\u72b6\u6001&#034;\u4e0e&#034;\u5b9e\u73b0\u5c42\u8d44\u6e90\u590d\u7528&#034;\u7684\u5206\u79bb\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_http_client<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span>httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_db_pool <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_lock <span class=\"token operator\">&#061;<\/span> asyncio<span class=\"token punctuation\">.<\/span>Lock<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">initialize<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u521d\u59cb\u5316\u6240\u6709\u8fde\u63a5\u6c60&#xff08;\u670d\u52a1\u5668\u542f\u52a8\u65f6\u8c03\u7528\u4e00\u6b21&#xff09;&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> self<span class=\"token punctuation\">.<\/span>_lock<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># HTTP \u8fde\u63a5\u6c60&#xff08;\u7528\u4e8e\u8c03\u7528\u5916\u90e8 API&#xff09;<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>_http_client <span class=\"token operator\">&#061;<\/span> httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span><br \/>\n                timeout<span class=\"token operator\">&#061;<\/span>httpx<span class=\"token punctuation\">.<\/span>Timeout<span class=\"token punctuation\">(<\/span><br \/>\n                    connect<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span><span class=\"token punctuation\">,<\/span>    <span class=\"token comment\"># \u8fde\u63a5\u8d85\u65f6<\/span><br \/>\n                    read<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">,<\/span>      <span class=\"token comment\"># \u8bfb\u53d6\u8d85\u65f6<\/span><br \/>\n                    write<span class=\"token operator\">&#061;<\/span><span class=\"token number\">10.0<\/span><span class=\"token punctuation\">,<\/span>     <span class=\"token comment\"># \u5199\u5165\u8d85\u65f6<\/span><br \/>\n                    pool<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5.0<\/span>        <span class=\"token comment\"># \u8fde\u63a5\u6c60\u7b49\u5f85\u8d85\u65f6<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                limits<span class=\"token operator\">&#061;<\/span>httpx<span class=\"token punctuation\">.<\/span>Limits<span class=\"token punctuation\">(<\/span><br \/>\n                    max_connections<span class=\"token operator\">&#061;<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">,<\/span>       <span class=\"token comment\"># \u6700\u5927\u8fde\u63a5\u6570<\/span><br \/>\n                    max_keepalive_connections<span class=\"token operator\">&#061;<\/span><span class=\"token number\">20<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u6700\u5927\u4fdd\u6d3b\u8fde\u63a5<\/span><br \/>\n                    keepalive_expiry<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span>      <span class=\"token comment\"># \u4fdd\u6d3b\u8fc7\u671f\u65f6\u95f4<\/span><br \/>\n                <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                http2<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span>  <span class=\"token comment\"># \u542f\u7528 HTTP\/2<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u6570\u636e\u5e93\u8fde\u63a5\u6c60&#xff08;\u4ee5 asyncpg \u4e3a\u4f8b&#xff09;<\/span><br \/>\n            <span class=\"token comment\"># self._db_pool &#061; await asyncpg.create_pool(<\/span><br \/>\n            <span class=\"token comment\">#     host&#061;DB_HOST,<\/span><br \/>\n            <span class=\"token comment\">#     database&#061;DB_NAME,<\/span><br \/>\n            <span class=\"token comment\">#     user&#061;DB_USER,<\/span><br \/>\n            <span class=\"token comment\">#     password&#061;DB_PASSWORD,<\/span><br \/>\n            <span class=\"token comment\">#     min_size&#061;5,      # \u6700\u5c0f\u8fde\u63a5\u6570<\/span><br \/>\n            <span class=\"token comment\">#     max_size&#061;20,     # \u6700\u5927\u8fde\u63a5\u6570<\/span><br \/>\n            <span class=\"token comment\">#     command_timeout&#061;30.0<\/span><br \/>\n            <span class=\"token comment\"># )<\/span><\/p>\n<p>            logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8fde\u63a5\u6c60\u521d\u59cb\u5316\u5b8c\u6210&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">shutdown<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5173\u95ed\u6240\u6709\u8fde\u63a5\u6c60&#xff08;\u670d\u52a1\u5668\u5173\u95ed\u65f6\u8c03\u7528&#xff09;&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>_http_client<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_http_client<span class=\"token punctuation\">.<\/span>aclose<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>_db_pool<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_db_pool<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8fde\u63a5\u6c60\u5df2\u5173\u95ed&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;property<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">http_client<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>_http_client <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8fde\u63a5\u6c60\u672a\u521d\u59cb\u5316&#xff0c;\u8bf7\u5148\u8c03\u7528 initialize()&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>_http_client<\/p>\n<p><span class=\"token comment\"># \u5168\u5c40\u5355\u4f8b<\/span><br \/>\npool_manager <span class=\"token operator\">&#061;<\/span> ConnectionPoolManager<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u5728\u5de5\u5177\u4e2d\u4f7f\u7528\u8fde\u63a5\u6c60<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">fetch_external_data<\/span><span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u4ece\u5916\u90e8 API \u83b7\u53d6\u6570\u636e&#xff08;\u4f7f\u7528\u8fde\u63a5\u6c60&#xff09;&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u590d\u7528\u8fde\u63a5\u6c60\u4e2d\u7684 HTTP \u5ba2\u6237\u7aef<\/span><br \/>\n    response <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> pool_manager<span class=\"token punctuation\">.<\/span>http_client<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">)<\/span><br \/>\n    response<span class=\"token punctuation\">.<\/span>raise_for_status<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> response<span class=\"token punctuation\">.<\/span>text<\/p>\n<h4>9.2 \u8bf7\u6c42\u9650\u6d41\u4e0e\u7194\u65ad<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/middleware\/rate_limit.py &#8211; \u8bf7\u6c42\u9650\u6d41\u4e0e\u7194\u65ad<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">from<\/span> collections <span class=\"token keyword\">import<\/span> defaultdict<br \/>\n<span class=\"token keyword\">from<\/span> functools <span class=\"token keyword\">import<\/span> wraps<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Dict<span class=\"token punctuation\">,<\/span> Tuple<br \/>\n<span class=\"token keyword\">import<\/span> logging<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.rate_limit&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RateLimiter<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u4ee4\u724c\u6876\u9650\u6d41\u5668<\/p>\n<p>    \u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u7684\u9650\u6d41\u7b56\u7565&#xff1a;<br \/>\n    &#8211; \u4f7f\u7528 Redis \u4f5c\u4e3a\u5206\u5e03\u5f0f\u8ba1\u6570\u5668&#xff08;\u591a\u5b9e\u4f8b\u5171\u4eab&#xff09;<br \/>\n    &#8211; \u6216\u4f7f\u7528\u8fdb\u7a0b\u5185\u8ba1\u6570\u5668&#xff08;\u5355\u5b9e\u4f8b\u573a\u666f&#xff09;<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> rate<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100.0<\/span><span class=\"token punctuation\">,<\/span> burst<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">200<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        Args:<br \/>\n            rate: \u6bcf\u79d2\u5141\u8bb8\u7684\u8bf7\u6c42\u6570&#xff08;\u4ee4\u724c\u751f\u6210\u901f\u7387&#xff09;<br \/>\n            burst: \u6876\u5bb9\u91cf&#xff08;\u7a81\u53d1\u5141\u8bb8\u7684\u6700\u5927\u8bf7\u6c42\u6570&#xff09;<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>rate <span class=\"token operator\">&#061;<\/span> rate<br \/>\n        self<span class=\"token punctuation\">.<\/span>burst <span class=\"token operator\">&#061;<\/span> burst<br \/>\n        self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">:<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> Tuple<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>  <span class=\"token comment\"># key -&gt; (tokens, last_time)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_lock <span class=\"token operator\">&#061;<\/span> asyncio<span class=\"token punctuation\">.<\/span>Lock<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">acquire<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;global&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u5c1d\u8bd5\u83b7\u53d6\u4e00\u4e2a\u4ee4\u724c<\/p>\n<p>        Args:<br \/>\n            key: \u9650\u6d41\u952e&#xff08;\u53ef\u4ee5\u662f IP\u3001API Key\u3001\u7528\u6237ID\u7b49&#xff09;<\/p>\n<p>        Returns:<br \/>\n            True \u8868\u793a\u5141\u8bb8\u901a\u8fc7&#xff0c;False \u8868\u793a\u88ab\u9650\u6d41<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">with<\/span> self<span class=\"token punctuation\">.<\/span>_lock<span class=\"token punctuation\">:<\/span><br \/>\n            now <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> key <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>burst <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p>            tokens<span class=\"token punctuation\">,<\/span> last_time <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token comment\"># \u8865\u5145\u4ee4\u724c<\/span><br \/>\n            elapsed <span class=\"token operator\">&#061;<\/span> now <span class=\"token operator\">&#8211;<\/span> last_time<br \/>\n            tokens <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>burst<span class=\"token punctuation\">,<\/span> tokens <span class=\"token operator\">&#043;<\/span> elapsed <span class=\"token operator\">*<\/span> self<span class=\"token punctuation\">.<\/span>rate<span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> tokens <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>tokens <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>_tokens<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>tokens<span class=\"token punctuation\">,<\/span> now<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">CircuitBreaker<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u7194\u65ad\u5668<\/p>\n<p>    \u5f53\u4e0b\u6e38\u670d\u52a1&#xff08;\u6570\u636e\u5e93\u3001\u5916\u90e8API&#xff09;\u6301\u7eed\u5931\u8d25\u65f6&#xff0c;<br \/>\n    \u81ea\u52a8\u5207\u65ad\u8bf7\u6c42&#xff0c;\u907f\u514d\u96ea\u5d29\u6548\u5e94\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u7194\u65ad\u5668\u72b6\u6001<\/span><br \/>\n    CLOSED <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;closed&#034;<\/span>       <span class=\"token comment\"># \u6b63\u5e38\u72b6\u6001&#xff0c;\u8bf7\u6c42\u901a\u8fc7<\/span><br \/>\n    OPEN <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;open&#034;<\/span>           <span class=\"token comment\"># \u7194\u65ad\u72b6\u6001&#xff0c;\u8bf7\u6c42\u76f4\u63a5\u5931\u8d25<\/span><br \/>\n    HALF_OPEN <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;half_open&#034;<\/span> <span class=\"token comment\"># \u534a\u5f00\u72b6\u6001&#xff0c;\u5141\u8bb8\u5c11\u91cf\u63a2\u6d4b\u8bf7\u6c42<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span><br \/>\n        self<span class=\"token punctuation\">,<\/span><br \/>\n        failure_threshold<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        recovery_timeout<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        half_open_max_calls<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>failure_threshold <span class=\"token operator\">&#061;<\/span> failure_threshold<br \/>\n        self<span class=\"token punctuation\">.<\/span>recovery_timeout <span class=\"token operator\">&#061;<\/span> recovery_timeout<br \/>\n        self<span class=\"token punctuation\">.<\/span>half_open_max_calls <span class=\"token operator\">&#061;<\/span> half_open_max_calls<\/p>\n<p>        self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>CLOSED<br \/>\n        self<span class=\"token punctuation\">.<\/span>_failure_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_last_failure_time <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_half_open_calls <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;property<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">state<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>OPEN<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u68c0\u67e5\u662f\u5426\u53ef\u4ee5\u8fdb\u5165\u534a\u5f00\u72b6\u6001<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> self<span class=\"token punctuation\">.<\/span>_last_failure_time <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>recovery_timeout<span class=\"token punctuation\">:<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>HALF_OPEN<br \/>\n                self<span class=\"token punctuation\">.<\/span>_half_open_calls <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>_state<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">can_execute<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5224\u65ad\u5f53\u524d\u662f\u5426\u5141\u8bb8\u6267\u884c\u8bf7\u6c42&#034;&#034;&#034;<\/span><br \/>\n        state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>state<br \/>\n        <span class=\"token keyword\">if<\/span> state <span class=\"token operator\">&#061;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>CLOSED<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n        <span class=\"token keyword\">elif<\/span> state <span class=\"token operator\">&#061;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>HALF_OPEN<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>_half_open_calls <span class=\"token operator\">&lt;<\/span> self<span class=\"token punctuation\">.<\/span>half_open_max_calls<br \/>\n        <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># OPEN<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">record_success<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bb0\u5f55\u6210\u529f&#034;&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_failure_count <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>CLOSED<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">record_failure<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bb0\u5f55\u5931\u8d25&#034;&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_failure_count <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">1<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_last_failure_time <span class=\"token operator\">&#061;<\/span> time<span class=\"token punctuation\">.<\/span>time<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>HALF_OPEN<span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>OPEN<br \/>\n        <span class=\"token keyword\">elif<\/span> self<span class=\"token punctuation\">.<\/span>_failure_count <span class=\"token operator\">&gt;&#061;<\/span> self<span class=\"token punctuation\">.<\/span>failure_threshold<span class=\"token punctuation\">:<\/span><br \/>\n            self<span class=\"token punctuation\">.<\/span>_state <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>OPEN<br \/>\n            logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7194\u65ad\u5668\u6253\u5f00&#xff01;\u8fde\u7eed\u5931\u8d25 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>self<span class=\"token punctuation\">.<\/span>_failure_count<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u6b21&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\nrate_limiter <span class=\"token operator\">&#061;<\/span> RateLimiter<span class=\"token punctuation\">(<\/span>rate<span class=\"token operator\">&#061;<\/span><span class=\"token number\">50.0<\/span><span class=\"token punctuation\">,<\/span> burst<span class=\"token operator\">&#061;<\/span><span class=\"token number\">100<\/span><span class=\"token punctuation\">)<\/span><br \/>\ncircuit_breaker <span class=\"token operator\">&#061;<\/span> CircuitBreaker<span class=\"token punctuation\">(<\/span>failure_threshold<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> recovery_timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">with_rate_limit<\/span><span class=\"token punctuation\">(<\/span>key_extractor<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u9650\u6d41\u88c5\u9970\u5668&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">decorator<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token decorator annotation punctuation\">&#064;wraps<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">wrapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u63d0\u53d6\u9650\u6d41\u952e<\/span><br \/>\n            key <span class=\"token operator\">&#061;<\/span> key_extractor<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> key_extractor <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;global&#034;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">await<\/span> rate_limiter<span class=\"token punctuation\">.<\/span>acquire<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;RATE_LIMITED&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41&#xff0c;\u8bf7\u7a0d\u540e\u91cd\u8bd5&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;retry_after_seconds&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> func<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> wrapper<br \/>\n    <span class=\"token keyword\">return<\/span> decorator<\/p>\n<h4>9.3 OAuth 2.0 \/ API Key \u8ba4\u8bc1<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/middleware\/auth.py &#8211; \u8ba4\u8bc1\u4e0e\u6388\u6743<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\nMCP v2 \u89c4\u8303\u63a8\u8350\u4f7f\u7528 OAuth 2.1 \u8fdb\u884c\u8ba4\u8bc1\u3002<br \/>\n\u5bf9\u4e8e\u7b80\u5355\u573a\u666f&#xff0c;\u4e5f\u652f\u6301 API Key \u8ba4\u8bc1\u3002<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> hashlib<br \/>\n<span class=\"token keyword\">import<\/span> hmac<br \/>\n<span class=\"token keyword\">import<\/span> time<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Optional<span class=\"token punctuation\">,<\/span> Set<br \/>\n<span class=\"token keyword\">from<\/span> functools <span class=\"token keyword\">import<\/span> wraps<br \/>\n<span class=\"token keyword\">import<\/span> logging<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.auth&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">APIKeyAuthenticator<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    API Key \u8ba4\u8bc1\u5668<\/p>\n<p>    \u9002\u7528\u4e8e\u5185\u90e8\u670d\u52a1\u95f4\u8c03\u7528\u6216\u7b80\u5355\u7684\u5ba2\u6237\u7aef\u8ba4\u8bc1\u3002<br \/>\n    \u751f\u4ea7\u73af\u5883\u5efa\u8bae\u4f7f\u7528 OAuth 2.0\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token comment\"># \u5b9e\u9645\u9879\u76ee\u4e2d\u4ece\u6570\u636e\u5e93\u6216\u914d\u7f6e\u4e2d\u5fc3\u52a0\u8f7d<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_valid_keys<span class=\"token punctuation\">:<\/span> Set<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_key_permissions<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">add_key<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> api_key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> permissions<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c API Key&#034;&#034;&#034;<\/span><br \/>\n        key_hash <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_hash_key<span class=\"token punctuation\">(<\/span>api_key<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_valid_keys<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>key_hash<span class=\"token punctuation\">)<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_key_permissions<span class=\"token punctuation\">[<\/span>key_hash<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> permissions <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;read&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;write&#034;<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">verify<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> api_key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u9a8c\u8bc1 API Key<\/p>\n<p>        Returns:<br \/>\n            \u9a8c\u8bc1\u6210\u529f\u8fd4\u56de\u6743\u9650\u4fe1\u606f&#xff0c;\u5931\u8d25\u8fd4\u56de None<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        key_hash <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_hash_key<span class=\"token punctuation\">(<\/span>api_key<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> key_hash <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>_valid_keys<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;permissions&#034;<\/span><span class=\"token punctuation\">:<\/span> self<span class=\"token punctuation\">.<\/span>_key_permissions<span class=\"token punctuation\">[<\/span>key_hash<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;staticmethod<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_hash_key<\/span><span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5bf9 Key \u8fdb\u884c\u54c8\u5e0c&#xff08;\u4e0d\u5b58\u50a8\u660e\u6587&#xff09;&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> hashlib<span class=\"token punctuation\">.<\/span>sha256<span class=\"token punctuation\">(<\/span>key<span class=\"token punctuation\">.<\/span>encode<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>hexdigest<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">OAuth2Authenticator<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    OAuth 2.0 \/ 2.1 \u8ba4\u8bc1\u5668&#xff08;MCP v2 \u63a8\u8350&#xff09;<\/p>\n<p>    \u652f\u6301 Authorization Code Flow \u548c Client Credentials Flow\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> issuer_url<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> audience<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>issuer_url <span class=\"token operator\">&#061;<\/span> issuer_url<br \/>\n        self<span class=\"token punctuation\">.<\/span>audience <span class=\"token operator\">&#061;<\/span> audience<br \/>\n        self<span class=\"token punctuation\">.<\/span>_jwks_cache <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_jwks_cache_time <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">verify_token<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> token<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u9a8c\u8bc1 Bearer Token&#xff08;JWT&#xff09;<\/p>\n<p>        Args:<br \/>\n            token: JWT access token<\/p>\n<p>        Returns:<br \/>\n            \u89e3\u7801\u540e\u7684 claims&#xff0c;\u9a8c\u8bc1\u5931\u8d25\u8fd4\u56de None<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">import<\/span> jwt  <span class=\"token comment\"># PyJWT \u5e93<\/span><\/p>\n<p>            <span class=\"token comment\"># \u83b7\u53d6 JWKS&#xff08;JSON Web Key Set&#xff09;<\/span><br \/>\n            jwks <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_get_jwks<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u9a8c\u8bc1\u5e76\u89e3\u7801 JWT<\/span><br \/>\n            claims <span class=\"token operator\">&#061;<\/span> jwt<span class=\"token punctuation\">.<\/span>decode<span class=\"token punctuation\">(<\/span><br \/>\n                token<span class=\"token punctuation\">,<\/span><br \/>\n                key<span class=\"token operator\">&#061;<\/span>jwks<span class=\"token punctuation\">,<\/span><br \/>\n                algorithms<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;RS256&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ES256&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                audience<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>audience<span class=\"token punctuation\">,<\/span><br \/>\n                issuer<span class=\"token operator\">&#061;<\/span>self<span class=\"token punctuation\">.<\/span>issuer_url<span class=\"token punctuation\">,<\/span><br \/>\n                options<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;verify_exp&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> claims<\/p>\n<p>        <span class=\"token keyword\">except<\/span> jwt<span class=\"token punctuation\">.<\/span>ExpiredSignatureError<span class=\"token punctuation\">:<\/span><br \/>\n            logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Token \u5df2\u8fc7\u671f&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> jwt<span class=\"token punctuation\">.<\/span>InvalidTokenError <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n            logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;Token \u65e0\u6548: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p><span class=\"token comment\"># \u8ba4\u8bc1\u4e2d\u95f4\u4ef6<\/span><br \/>\nauthenticator <span class=\"token operator\">&#061;<\/span> APIKeyAuthenticator<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">require_auth<\/span><span class=\"token punctuation\">(<\/span>permissions<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8ba4\u8bc1\u88c5\u9970\u5668<\/p>\n<p>    \u7528\u6cd5:<br \/>\n        &#064;mcp.tool()<br \/>\n        &#064;require_auth(permissions&#061;[&#034;read&#034;])<br \/>\n        def sensitive_query(&#8230;):<br \/>\n            &#8230;<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">decorator<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token decorator annotation punctuation\">&#064;wraps<\/span><span class=\"token punctuation\">(<\/span>func<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">wrapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> _auth_context<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> _auth_context <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;UNAUTHORIZED&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u7f3a\u5c11\u8ba4\u8bc1\u4fe1\u606f&#034;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u68c0\u67e5\u6743\u9650<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> permissions<span class=\"token punctuation\">:<\/span><br \/>\n                user_perms <span class=\"token operator\">&#061;<\/span> _auth_context<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;permissions&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">any<\/span><span class=\"token punctuation\">(<\/span>p <span class=\"token keyword\">in<\/span> user_perms <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> permissions<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                        <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;FORBIDDEN&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                        <span class=\"token string\">&#034;message&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u6743\u9650\u4e0d\u8db3&#034;<\/span><br \/>\n                    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> func<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>args<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">**<\/span>kwargs<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> wrapper<br \/>\n    <span class=\"token keyword\">return<\/span> decorator<\/p>\n<h4>9.4 CORS \u4e0e\u8bf7\u6c42\u6765\u6e90\u63a7\u5236<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nCORS \u914d\u7f6e&#xff08;\u4ec5\u6d4f\u89c8\u5668\u5ba2\u6237\u7aef\u9700\u8981&#xff09;<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> starlette<span class=\"token punctuation\">.<\/span>middleware<span class=\"token punctuation\">.<\/span>cors <span class=\"token keyword\">import<\/span> CORSMiddleware<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">setup_cors<\/span><span class=\"token punctuation\">(<\/span>app<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u914d\u7f6e CORS \u7b56\u7565&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u751f\u4ea7\u73af\u5883&#xff1a;\u4e25\u683c\u9650\u5236\u6765\u6e90<\/span><br \/>\n    ALLOWED_ORIGINS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">&#034;https:\/\/app.example.com&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;https:\/\/admin.example.com&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><\/p>\n<p>    app<span class=\"token punctuation\">.<\/span>add_middleware<span class=\"token punctuation\">(<\/span><br \/>\n        CORSMiddleware<span class=\"token punctuation\">,<\/span><br \/>\n        allow_origins<span class=\"token operator\">&#061;<\/span>ALLOWED_ORIGINS<span class=\"token punctuation\">,<\/span><br \/>\n        allow_methods<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;POST&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># MCP \u53ea\u4f7f\u7528 POST<\/span><br \/>\n        allow_headers<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><br \/>\n            <span class=\"token string\">&#034;Content-Type&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;Authorization&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;X-API-Key&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;X-Request-ID&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        max_age<span class=\"token operator\">&#061;<\/span><span class=\"token number\">3600<\/span><span class=\"token punctuation\">,<\/span>  <span class=\"token comment\"># \u9884\u68c0\u8bf7\u6c42\u7f13\u5b581\u5c0f\u65f6<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<h4>9.5 \u8f93\u5165\u6d88\u6bd2\u4e0e\u6ce8\u5165\u9632\u62a4<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/middleware\/sanitizer.py &#8211; \u8f93\u5165\u6d88\u6bd2<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> re<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Any<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">InputSanitizer<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8f93\u5165\u6d88\u6bd2\u5668<\/p>\n<p>    \u9632\u6b62 SQL \u6ce8\u5165\u3001XSS\u3001\u547d\u4ee4\u6ce8\u5165\u7b49\u653b\u51fb\u3002<br \/>\n    \u6240\u6709\u7528\u6237\u8f93\u5165\u5728\u5230\u8fbe\u4e1a\u52a1\u903b\u8f91\u4e4b\u524d\u5fc5\u987b\u7ecf\u8fc7\u6d88\u6bd2\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># SQL \u6ce8\u5165\u68c0\u6d4b\u6a21\u5f0f<\/span><br \/>\n    SQL_INJECTION_PATTERNS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">r&#034;(\\\\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER)\\\\b)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;(&#8211;|;|\/\\\\*|\\\\*\/)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;(\\\\bOR\\\\b\\\\s&#043;\\\\d&#043;\\\\s*&#061;\\\\s*\\\\d&#043;)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;(\\\\bAND\\\\b\\\\s&#043;\\\\d&#043;\\\\s*&#061;\\\\s*\\\\d&#043;)&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token comment\"># XSS \u68c0\u6d4b\u6a21\u5f0f<\/span><br \/>\n    XSS_PATTERNS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">r&#034;&lt;script[^&gt;]*&gt;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;javascript:&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;on\\\\w&#043;\\\\s*&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;&lt;iframe&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token comment\"># \u547d\u4ee4\u6ce8\u5165\u68c0\u6d4b<\/span><br \/>\n    COMMAND_INJECTION_PATTERNS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n        <span class=\"token string\">r&#034;[;&amp;|&#096;$]&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;\\\\$$&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;\\\\beval\\\\b&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">r&#034;\\\\bexec\\\\b&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;classmethod<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">sanitize_string<\/span><span class=\"token punctuation\">(<\/span>cls<span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;general&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u6d88\u6bd2\u5b57\u7b26\u4e32\u8f93\u5165<\/p>\n<p>        Args:<br \/>\n            value: \u539f\u59cb\u8f93\u5165<br \/>\n            context: \u4f7f\u7528\u4e0a\u4e0b\u6587 (general\/sql\/html\/command)<\/p>\n<p>        Returns:<br \/>\n            \u6d88\u6bd2\u540e\u7684\u5b89\u5168\u5b57\u7b26\u4e32<\/p>\n<p>        Raises:<br \/>\n            ValueError: \u68c0\u6d4b\u5230\u6076\u610f\u8f93\u5165<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> value<\/p>\n<p>        <span class=\"token comment\"># \u901a\u7528\u68c0\u67e5&#xff1a;\u957f\u5ea6\u9650\u5236<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">10000<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8f93\u5165\u8d85\u8fc7\u6700\u5927\u957f\u5ea6\u9650\u5236&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># SQL \u4e0a\u4e0b\u6587\u68c0\u67e5<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> context <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;sql&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> pattern <span class=\"token keyword\">in<\/span> cls<span class=\"token punctuation\">.<\/span>SQL_INJECTION_PATTERNS<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> re<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>pattern<span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">,<\/span> re<span class=\"token punctuation\">.<\/span>IGNORECASE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u68c0\u6d4b\u5230\u6f5c\u5728\u7684 SQL \u6ce8\u5165: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>value<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token format-spec\">50]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#8230;&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># HTML \u4e0a\u4e0b\u6587\u68c0\u67e5<\/span><br \/>\n        <span class=\"token keyword\">elif<\/span> context <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;html&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> pattern <span class=\"token keyword\">in<\/span> cls<span class=\"token punctuation\">.<\/span>XSS_PATTERNS<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> re<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>pattern<span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">,<\/span> re<span class=\"token punctuation\">.<\/span>IGNORECASE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u68c0\u6d4b\u5230\u6f5c\u5728\u7684 XSS \u653b\u51fb&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u547d\u4ee4\u4e0a\u4e0b\u6587\u68c0\u67e5<\/span><br \/>\n        <span class=\"token keyword\">elif<\/span> context <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;command&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> pattern <span class=\"token keyword\">in<\/span> cls<span class=\"token punctuation\">.<\/span>COMMAND_INJECTION_PATTERNS<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> re<span class=\"token punctuation\">.<\/span>search<span class=\"token punctuation\">(<\/span>pattern<span class=\"token punctuation\">,<\/span> value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u68c0\u6d4b\u5230\u6f5c\u5728\u7684\u547d\u4ee4\u6ce8\u5165&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> value<span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token decorator annotation punctuation\">&#064;classmethod<\/span><br \/>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">sanitize_dict<\/span><span class=\"token punctuation\">(<\/span>cls<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;general&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u9012\u5f52\u6d88\u6bd2\u5b57\u5178\u4e2d\u7684\u6240\u6709\u5b57\u7b26\u4e32\u503c&#034;&#034;&#034;<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> key<span class=\"token punctuation\">,<\/span> value <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cls<span class=\"token punctuation\">.<\/span>sanitize_string<span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">elif<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> cls<span class=\"token punctuation\">.<\/span>sanitize_dict<span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">elif<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n                    cls<span class=\"token punctuation\">.<\/span>sanitize_string<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> v<br \/>\n                    <span class=\"token keyword\">for<\/span> v <span class=\"token keyword\">in<\/span> value<br \/>\n                <span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                result<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> value<br \/>\n        <span class=\"token keyword\">return<\/span> result<\/p>\n<h4>9.6 \u5ba1\u8ba1\u65e5\u5fd7\u4e0e\u654f\u611f\u6570\u636e\u8131\u654f<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/middleware\/audit.py &#8211; \u5ba1\u8ba1\u65e5\u5fd7<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> datetime <span class=\"token keyword\">import<\/span> datetime<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Any<\/p>\n<p><span class=\"token comment\"># \u72ec\u7acb\u7684\u5ba1\u8ba1\u65e5\u5fd7\u8bb0\u5f55\u5668&#xff08;\u8f93\u51fa\u5230\u5355\u72ec\u6587\u4ef6&#xff09;<\/span><br \/>\naudit_logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.audit&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\naudit_handler <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>FileHandler<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\/app\/logs\/audit.log&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\naudit_handler<span class=\"token punctuation\">.<\/span>setFormatter<span class=\"token punctuation\">(<\/span>logging<span class=\"token punctuation\">.<\/span>Formatter<span class=\"token punctuation\">(<\/span><br \/>\n    <span class=\"token string\">&#034;%(asctime)s | %(message)s&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\naudit_logger<span class=\"token punctuation\">.<\/span>addHandler<span class=\"token punctuation\">(<\/span>audit_handler<span class=\"token punctuation\">)<\/span><br \/>\naudit_logger<span class=\"token punctuation\">.<\/span>setLevel<span class=\"token punctuation\">(<\/span>logging<span class=\"token punctuation\">.<\/span>INFO<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u654f\u611f\u5b57\u6bb5\u5217\u8868&#xff08;\u65e5\u5fd7\u4e2d\u9700\u8981\u8131\u654f&#xff09;<\/span><br \/>\nSENSITIVE_FIELDS <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string\">&#034;password&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;secret&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;token&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;api_key&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string\">&#034;credit_card&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ssn&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;authorization&#034;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">mask_sensitive_data<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">:<\/span> Any<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Any<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5bf9\u654f\u611f\u6570\u636e\u8fdb\u884c\u8131\u654f&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            k<span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;***MASKED***&#034;<\/span> <span class=\"token keyword\">if<\/span> k<span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> SENSITIVE_FIELDS<br \/>\n            <span class=\"token keyword\">else<\/span> mask_sensitive_data<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> k<span class=\"token punctuation\">,<\/span> v <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">elif<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">[<\/span>mask_sensitive_data<span class=\"token punctuation\">(<\/span>item<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">for<\/span> item <span class=\"token keyword\">in<\/span> data<span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> data<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">log_tool_invocation<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    tool_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    arguments<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    result_status<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    duration_ms<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    client_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;unknown&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bb0\u5f55\u5de5\u5177\u8c03\u7528\u5ba1\u8ba1\u65e5\u5fd7&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token comment\"># \u8131\u654f\u5904\u7406<\/span><br \/>\n    safe_args <span class=\"token operator\">&#061;<\/span> mask_sensitive_data<span class=\"token punctuation\">(<\/span>arguments<span class=\"token punctuation\">)<\/span><\/p>\n<p>    audit_entry <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string\">&#034;timestamp&#034;<\/span><span class=\"token punctuation\">:<\/span> datetime<span class=\"token punctuation\">.<\/span>now<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>isoformat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;event&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;tool_invocation&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;tool&#034;<\/span><span class=\"token punctuation\">:<\/span> tool_name<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;arguments&#034;<\/span><span class=\"token punctuation\">:<\/span> safe_args<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;status&#034;<\/span><span class=\"token punctuation\">:<\/span> result_status<span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;duration_ms&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">round<\/span><span class=\"token punctuation\">(<\/span>duration_ms<span class=\"token punctuation\">,<\/span> <span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string\">&#034;client_id&#034;<\/span><span class=\"token punctuation\">:<\/span> client_id<span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    audit_logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span>json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>audit_entry<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>9.7 TLS\/mTLS \u52a0\u5bc6\u901a\u4fe1<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nTLS \u914d\u7f6e&#xff08;\u751f\u4ea7\u73af\u5883\u5fc5\u987b&#xff09;<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># Uvicorn \u542f\u52a8\u65f6\u914d\u7f6e TLS<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n# \u65b9\u5f0f\u4e00&#xff1a;Uvicorn \u76f4\u63a5\u914d\u7f6e TLS<br \/>\nuvicorn src.server:app \\\\<br \/>\n    &#8211;host 0.0.0.0 \\\\<br \/>\n    &#8211;port 8443 \\\\<br \/>\n    &#8211;ssl-keyfile \/etc\/ssl\/private\/server.key \\\\<br \/>\n    &#8211;ssl-certfile \/etc\/ssl\/certs\/server.crt \\\\<br \/>\n    &#8211;ssl-ca-certs \/etc\/ssl\/certs\/ca.crt  # mTLS: \u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66<\/p>\n<p># \u65b9\u5f0f\u4e8c&#xff1a;\u5728 Nginx\/Ingress \u5c42\u7ec8\u6b62 TLS&#xff08;\u63a8\u8350&#xff09;<br \/>\n# \u53c2\u89c1 8.5 \u8282\u7684 Nginx \u914d\u7f6e<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># mTLS \u5ba2\u6237\u7aef\u8bc1\u4e66\u9a8c\u8bc1&#xff08;\u9ad8\u5b89\u5168\u573a\u666f&#xff09;<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5bf9\u4e8e\u91d1\u878d\u3001\u533b\u7597\u7b49\u9ad8\u5b89\u5168\u8981\u6c42\u573a\u666f&#xff0c;\u53ef\u4ee5\u542f\u7528 mTLS&#xff1a;<br \/>\n&#8211; \u670d\u52a1\u5668\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66<br \/>\n&#8211; \u5ba2\u6237\u7aef\u9a8c\u8bc1\u670d\u52a1\u5668\u8bc1\u4e66<br \/>\n&#8211; \u53cc\u5411\u8ba4\u8bc1&#xff0c;\u9632\u6b62\u4e2d\u95f4\u4eba\u653b\u51fb<\/p>\n<p>Kubernetes \u4e2d\u53ef\u4f7f\u7528 Istio\/Linkerd \u81ea\u52a8\u7ba1\u7406 mTLS\u3002<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<hr \/>\n<h3>\u5341\u3001\u6269\u5c55\u5b9e\u6218&#xff1a;\u6784\u5efa\u591a\u5de5\u5177\u534f\u540c\u7684 Agent \u94fe<\/h3>\n<h4>10.1 Agent \u94fe\u7684\u8bbe\u8ba1\u601d\u60f3<\/h4>\n<p>\u5728\u5b9e\u9645\u4e1a\u52a1\u573a\u666f\u4e2d&#xff0c;\u5355\u4e2a\u5de5\u5177\u5f80\u5f80\u65e0\u6cd5\u5b8c\u6210\u590d\u6742\u4efb\u52a1\u3002Agent \u94fe&#xff08;Agent Chain&#xff09;\u901a\u8fc7\u5c06\u591a\u4e2a\u5de5\u5177\u6309\u903b\u8f91\u987a\u5e8f\u7f16\u6392&#xff0c;\u5b9e\u73b0\u590d\u6742\u5de5\u4f5c\u6d41\u7684\u81ea\u52a8\u5316\u6267\u884c\u3002<\/p>\n<p>Agent \u94fe\u7684\u6838\u5fc3\u8bbe\u8ba1\u539f\u5219&#xff1a;<\/p>\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502  Agent \u94fe\u8bbe\u8ba1\u6a21\u5f0f                                                \u2502<br \/>\n\u2502                                                                 \u2502<br \/>\n\u2502  \u6a21\u5f0f\u4e00&#xff1a;\u987a\u5e8f\u94fe&#xff08;Sequential Chain&#xff09;                              \u2502<br \/>\n\u2502  Tool A \u2192 Tool B \u2192 Tool C \u2192 \u6700\u7ec8\u7ed3\u679c                           \u2502<br \/>\n\u2502  \u9002\u7528&#xff1a;\u6570\u636e\u7ba1\u9053\u3001ETL \u6d41\u7a0b                                       \u2502<br \/>\n\u2502                                                                 \u2502<br \/>\n\u2502  \u6a21\u5f0f\u4e8c&#xff1a;\u6761\u4ef6\u5206\u652f\u94fe&#xff08;Conditional Chain&#xff09;                         \u2502<br \/>\n\u2502  Tool A \u2192 [\u5224\u65ad] \u2192 Tool B1 \u6216 Tool B2 \u2192 \u6700\u7ec8\u7ed3\u679c               \u2502<br \/>\n\u2502  \u9002\u7528&#xff1a;\u6839\u636e\u4e2d\u95f4\u7ed3\u679c\u9009\u62e9\u4e0d\u540c\u5904\u7406\u8def\u5f84                              \u2502<br \/>\n\u2502                                                                 \u2502<br \/>\n\u2502  \u6a21\u5f0f\u4e09&#xff1a;\u5e76\u884c\u805a\u5408\u94fe&#xff08;Parallel Aggregation Chain&#xff09;                \u2502<br \/>\n\u2502  Tool A \u2500\u2510                                                      \u2502<br \/>\n\u2502  Tool B \u2500\u253c\u2192 [\u805a\u5408] \u2192 \u6700\u7ec8\u7ed3\u679c                                   \u2502<br \/>\n\u2502  Tool C \u2500\u2518                                                      \u2502<br \/>\n\u2502  \u9002\u7528&#xff1a;\u591a\u6e90\u6570\u636e\u6c47\u603b                                             \u2502<br \/>\n\u2502                                                                 \u2502<br \/>\n\u2502  \u6a21\u5f0f\u56db&#xff1a;\u5faa\u73af\u94fe&#xff08;Loop Chain&#xff09;                                    \u2502<br \/>\n\u2502  Tool A \u2192 [\u68c0\u67e5] \u2192 \u4e0d\u6ee1\u8db3 \u2192 Tool A&#xff08;\u91cd\u8bd5&#xff09;                      \u2502<br \/>\n\u2502                    \u2192 \u6ee1\u8db3 \u2192 \u6700\u7ec8\u7ed3\u679c                             \u2502<br \/>\n\u2502  \u9002\u7528&#xff1a;\u8f6e\u8be2\u7b49\u5f85\u3001\u8fed\u4ee3\u4f18\u5316                                       \u2502<br \/>\n\u2502                                                                 \u2502<br \/>\n\u2502  \u6a21\u5f0f\u4e94&#xff1a;\u591a Server \u8054\u90a6\u94fe&#xff08;Federated Chain&#xff09;                     \u2502<br \/>\n\u2502  MCP Server 1 (\u5929\u6c14) \u2500\u2510                                        \u2502<br \/>\n\u2502  MCP Server 2 (\u6570\u636e\u5e93) \u2500\u253c\u2192 [\u7f16\u6392\u5668] \u2192 \u6700\u7ec8\u7ed3\u679c                  \u2502<br \/>\n\u2502  MCP Server 3 (\u641c\u7d22) \u2500\u2500\u2518                                        \u2502<br \/>\n\u2502  \u9002\u7528&#xff1a;\u8de8\u9886\u57df\u80fd\u529b\u7ec4\u5408                                           \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<h4>10.2 \u5de5\u5177\u7f16\u6392\u4e0e\u4f9d\u8d56\u7ba1\u7406<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nsrc\/orchestrator.py &#8211; Agent \u94fe\u7f16\u6392\u5668<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u5b9e\u73b0\u591a\u5de5\u5177\u534f\u540c\u8c03\u7528\u7684\u6838\u5fc3\u903b\u8f91<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> asyncio<br \/>\n<span class=\"token keyword\">import<\/span> json<br \/>\n<span class=\"token keyword\">import<\/span> logging<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Any<span class=\"token punctuation\">,<\/span> Callable<span class=\"token punctuation\">,<\/span> Dict<span class=\"token punctuation\">,<\/span> List<span class=\"token punctuation\">,<\/span> Optional<br \/>\n<span class=\"token keyword\">from<\/span> dataclasses <span class=\"token keyword\">import<\/span> dataclass<span class=\"token punctuation\">,<\/span> field<br \/>\n<span class=\"token keyword\">from<\/span> enum <span class=\"token keyword\">import<\/span> Enum<\/p>\n<p>logger <span class=\"token operator\">&#061;<\/span> logging<span class=\"token punctuation\">.<\/span>getLogger<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;mcp.orchestrator&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">StepStatus<\/span><span class=\"token punctuation\">(<\/span>Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    PENDING <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;pending&#034;<\/span><br \/>\n    RUNNING <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;running&#034;<\/span><br \/>\n    COMPLETED <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;completed&#034;<\/span><br \/>\n    FAILED <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;failed&#034;<\/span><br \/>\n    SKIPPED <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;skipped&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ChainStep<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u94fe\u4e2d\u7684\u4e00\u4e2a\u6b65\u9aa4&#034;&#034;&#034;<\/span><br \/>\n    name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>                          <span class=\"token comment\"># \u6b65\u9aa4\u540d\u79f0<\/span><br \/>\n    tool_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span>                     <span class=\"token comment\"># \u8981\u8c03\u7528\u7684\u5de5\u5177\u540d<\/span><br \/>\n    arguments_template<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span>           <span class=\"token comment\"># \u53c2\u6570\u6a21\u677f&#xff08;\u652f\u6301\u53d8\u91cf\u5f15\u7528&#xff09;<\/span><br \/>\n    depends_on<span class=\"token punctuation\">:<\/span> List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> field<span class=\"token punctuation\">(<\/span>default_factory<span class=\"token operator\">&#061;<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u4f9d\u8d56\u7684\u524d\u7f6e\u6b65\u9aa4<\/span><br \/>\n    condition<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span>    <span class=\"token comment\"># \u6267\u884c\u6761\u4ef6\u8868\u8fbe\u5f0f<\/span><br \/>\n    retry_count<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span>               <span class=\"token comment\"># \u91cd\u8bd5\u6b21\u6570<\/span><br \/>\n    retry_delay<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span>           <span class=\"token comment\"># \u91cd\u8bd5\u95f4\u9694&#xff08;\u79d2&#xff09;<\/span><br \/>\n    timeout<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30.0<\/span>              <span class=\"token comment\"># \u8d85\u65f6\u65f6\u95f4&#xff08;\u79d2&#xff09;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u8fd0\u884c\u65f6\u72b6\u6001<\/span><br \/>\n    status<span class=\"token punctuation\">:<\/span> StepStatus <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>PENDING<br \/>\n    result<span class=\"token punctuation\">:<\/span> Any <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    error<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">AgentChainOrchestrator<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    Agent \u94fe\u7f16\u6392\u5668<\/p>\n<p>    \u8d1f\u8d23\u6309\u4f9d\u8d56\u5173\u7cfb\u6267\u884c\u591a\u4e2a\u5de5\u5177\u8c03\u7528&#xff0c;<br \/>\n    \u652f\u6301\u5e76\u884c\u6267\u884c\u3001\u6761\u4ef6\u5206\u652f\u3001\u9519\u8bef\u91cd\u8bd5\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> mcp_server<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>mcp_server <span class=\"token operator\">&#061;<\/span> mcp_server<br \/>\n        self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">:<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> ChainStep<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>execution_log<span class=\"token punctuation\">:<\/span> List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">add_step<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> step<span class=\"token punctuation\">:<\/span> ChainStep<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6dfb\u52a0\u4e00\u4e2a\u6267\u884c\u6b65\u9aa4&#034;&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">[<\/span>step<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> step<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_resolve_template<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> template<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u89e3\u6790\u53c2\u6570\u6a21\u677f\u4e2d\u7684\u53d8\u91cf\u5f15\u7528<\/p>\n<p>        \u652f\u6301\u8bed\u6cd5: {{step_name.result.field}}<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        resolved <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> key<span class=\"token punctuation\">,<\/span> value <span class=\"token keyword\">in<\/span> template<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">and<\/span> <span class=\"token string\">&#034;{{&#034;<\/span> <span class=\"token keyword\">in<\/span> value<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token comment\"># \u89e3\u6790\u53d8\u91cf\u5f15\u7528<\/span><br \/>\n                resolved<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_interpolate<span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">elif<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                resolved<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_resolve_template<span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                resolved<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> value<br \/>\n        <span class=\"token keyword\">return<\/span> resolved<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_interpolate<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> template<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Any<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5b57\u7b26\u4e32\u63d2\u503c&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">import<\/span> re<br \/>\n        pattern <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">r&#034;\\\\{\\\\{(\\\\w&#043;)\\\\.result(?:\\\\.(\\\\w&#043;(?:\\\\.\\\\w&#043;)*))?\\\\}\\\\}&#034;<\/span><\/p>\n<p>        <span class=\"token keyword\">def<\/span> <span class=\"token function\">replacer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">match<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            step_name <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">match<\/span><span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            field_path <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">match<\/span><span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> step_name <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> context<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">match<\/span><span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            result <span class=\"token operator\">&#061;<\/span> context<span class=\"token punctuation\">[<\/span>step_name<span class=\"token punctuation\">]<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> field_path<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> part <span class=\"token keyword\">in<\/span> field_path<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                        result <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>part<span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">match<\/span><span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> result<\/p>\n<p>        <span class=\"token comment\"># \u5982\u679c\u6574\u4e2a\u5b57\u7b26\u4e32\u5c31\u662f\u4e00\u4e2a\u53d8\u91cf\u5f15\u7528&#xff0c;\u8fd4\u56de\u539f\u59cb\u7c7b\u578b<\/span><br \/>\n        full_match <span class=\"token operator\">&#061;<\/span> re<span class=\"token punctuation\">.<\/span>fullmatch<span class=\"token punctuation\">(<\/span>pattern<span class=\"token punctuation\">,<\/span> template<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> full_match<span class=\"token punctuation\">:<\/span><br \/>\n            step_name <span class=\"token operator\">&#061;<\/span> full_match<span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            field_path <span class=\"token operator\">&#061;<\/span> full_match<span class=\"token punctuation\">.<\/span>group<span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            result <span class=\"token operator\">&#061;<\/span> context<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>step_name<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> field_path <span class=\"token keyword\">and<\/span> result<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> part <span class=\"token keyword\">in<\/span> field_path<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                        result <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>part<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> result<\/p>\n<p>        <span class=\"token keyword\">return<\/span> re<span class=\"token punctuation\">.<\/span>sub<span class=\"token punctuation\">(<\/span>pattern<span class=\"token punctuation\">,<\/span> replacer<span class=\"token punctuation\">,<\/span> template<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">execute<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> initial_context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u6267\u884c\u6574\u4e2a Agent \u94fe<\/p>\n<p>        Args:<br \/>\n            initial_context: \u521d\u59cb\u4e0a\u4e0b\u6587&#xff08;\u53ef\u5305\u542b\u7528\u6237\u8f93\u5165\u7b49&#xff09;<\/p>\n<p>        Returns:<br \/>\n            \u6267\u884c\u7ed3\u679c\u6458\u8981<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        context <span class=\"token operator\">&#061;<\/span> initial_context <span class=\"token keyword\">or<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>execution_log <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u5f00\u59cb\u6267\u884c Agent \u94fe&#xff0c;\u5171 <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span><span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u4e2a\u6b65\u9aa4&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token comment\"># \u62d3\u6251\u6392\u5e8f\u786e\u5b9a\u6267\u884c\u987a\u5e8f<\/span><br \/>\n        execution_order <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_topological_sort<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> step_name <span class=\"token keyword\">in<\/span> execution_order<span class=\"token punctuation\">:<\/span><br \/>\n            step <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">[<\/span>step_name<span class=\"token punctuation\">]<\/span><\/p>\n<p>            <span class=\"token comment\"># \u68c0\u67e5\u4f9d\u8d56\u662f\u5426\u5b8c\u6210<\/span><br \/>\n            deps_met <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">all<\/span><span class=\"token punctuation\">(<\/span><br \/>\n                self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">[<\/span>dep<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>COMPLETED<br \/>\n                <span class=\"token keyword\">for<\/span> dep <span class=\"token keyword\">in<\/span> step<span class=\"token punctuation\">.<\/span>depends_on<br \/>\n            <span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> deps_met<span class=\"token punctuation\">:<\/span><br \/>\n                step<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>SKIPPED<br \/>\n                logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6b65\u9aa4 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u8df3\u8fc7&#xff1a;\u4f9d\u8d56\u672a\u6ee1\u8db3&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token keyword\">continue<\/span><\/p>\n<p>            <span class=\"token comment\"># \u68c0\u67e5\u6267\u884c\u6761\u4ef6<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> step<span class=\"token punctuation\">.<\/span>condition<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_evaluate_condition<span class=\"token punctuation\">(<\/span>step<span class=\"token punctuation\">.<\/span>condition<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    step<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>SKIPPED<br \/>\n                    <span class=\"token keyword\">continue<\/span><\/p>\n<p>            <span class=\"token comment\"># \u6267\u884c\u6b65\u9aa4&#xff08;\u5e26\u91cd\u8bd5&#xff09;<\/span><br \/>\n            step<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>RUNNING<br \/>\n            logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6267\u884c\u6b65\u9aa4: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> (\u5de5\u5177: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step<span class=\"token punctuation\">.<\/span>tool_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">)&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            success <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_execute_step_with_retry<span class=\"token punctuation\">(<\/span>step<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> success<span class=\"token punctuation\">:<\/span><br \/>\n                step<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>COMPLETED<br \/>\n                context<span class=\"token punctuation\">[<\/span>step_name<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> step<span class=\"token punctuation\">.<\/span>result<br \/>\n                logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6b65\u9aa4 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u5b8c\u6210&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                step<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>FAILED<br \/>\n                logger<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6b65\u9aa4 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step<span class=\"token punctuation\">.<\/span>error<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token comment\"># \u6839\u636e\u7b56\u7565\u51b3\u5b9a\u662f\u5426\u7ee7\u7eed<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><\/p>\n<p>        <span class=\"token comment\"># \u751f\u6210\u6267\u884c\u6458\u8981<\/span><br \/>\n        summary <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;total_steps&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;completed&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> s <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>COMPLETED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;failed&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> s <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>FAILED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;skipped&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> s <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">.<\/span>values<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>status <span class=\"token operator\">&#061;&#061;<\/span> StepStatus<span class=\"token punctuation\">.<\/span>SKIPPED<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;context&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span>k<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">200<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> k<span class=\"token punctuation\">,<\/span> v <span class=\"token keyword\">in<\/span> context<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> summary<\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_execute_step_with_retry<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> step<span class=\"token punctuation\">:<\/span> ChainStep<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5e26\u91cd\u8bd5\u7684\u6b65\u9aa4\u6267\u884c&#034;&#034;&#034;<\/span><br \/>\n        attempts <span class=\"token operator\">&#061;<\/span> step<span class=\"token punctuation\">.<\/span>retry_count <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> attempt <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span>attempts<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token comment\"># \u89e3\u6790\u53c2\u6570\u6a21\u677f<\/span><br \/>\n                arguments <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_resolve_template<span class=\"token punctuation\">(<\/span>step<span class=\"token punctuation\">.<\/span>arguments_template<span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><\/p>\n<p>                <span class=\"token comment\"># \u8c03\u7528 MCP \u5de5\u5177&#xff08;\u5e26\u8d85\u65f6&#xff09;<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>wait_for<span class=\"token punctuation\">(<\/span><br \/>\n                    self<span class=\"token punctuation\">.<\/span>_call_tool<span class=\"token punctuation\">(<\/span>step<span class=\"token punctuation\">.<\/span>tool_name<span class=\"token punctuation\">,<\/span> arguments<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    timeout<span class=\"token operator\">&#061;<\/span>step<span class=\"token punctuation\">.<\/span>timeout<br \/>\n                <span class=\"token punctuation\">)<\/span><\/p>\n<p>                <span class=\"token comment\"># \u89e3\u6790\u7ed3\u679c<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                        step<span class=\"token punctuation\">.<\/span>result <span class=\"token operator\">&#061;<\/span> json<span class=\"token punctuation\">.<\/span>loads<span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><br \/>\n                    <span class=\"token keyword\">except<\/span> json<span class=\"token punctuation\">.<\/span>JSONDecodeError<span class=\"token punctuation\">:<\/span><br \/>\n                        step<span class=\"token punctuation\">.<\/span>result <span class=\"token operator\">&#061;<\/span> result<br \/>\n                <span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                    step<span class=\"token punctuation\">.<\/span>result <span class=\"token operator\">&#061;<\/span> result<\/p>\n<p>                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<p>            <span class=\"token keyword\">except<\/span> asyncio<span class=\"token punctuation\">.<\/span>TimeoutError<span class=\"token punctuation\">:<\/span><br \/>\n                step<span class=\"token punctuation\">.<\/span>error <span class=\"token operator\">&#061;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u8d85\u65f6&#xff08;&gt;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step<span class=\"token punctuation\">.<\/span>timeout<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u79d2&#xff09;&#034;<\/span><\/span><br \/>\n                logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6b65\u9aa4 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u7b2c<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>attempt<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u6b21\u5c1d\u8bd5\u8d85\u65f6&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n                step<span class=\"token punctuation\">.<\/span>error <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><br \/>\n                logger<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6b65\u9aa4 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>step<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u7b2c<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>attempt<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u6b21\u5c1d\u8bd5\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>            <span class=\"token comment\"># \u91cd\u8bd5\u524d\u7b49\u5f85<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> attempt <span class=\"token operator\">&lt;<\/span> attempts <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span>step<span class=\"token punctuation\">.<\/span>retry_delay <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>attempt <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_call_tool<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> tool_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> arguments<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8c03\u7528 MCP \u5de5\u5177&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token comment\"># \u5b9e\u9645\u5b9e\u73b0\u4e2d\u8c03\u7528 MCP server \u7684\u5de5\u5177\u6267\u884c\u65b9\u6cd5<\/span><br \/>\n        <span class=\"token comment\"># \u8fd9\u91cc\u7b80\u5316\u4e3a\u76f4\u63a5\u8c03\u7528\u6ce8\u518c\u7684\u51fd\u6570<\/span><br \/>\n        tool_func <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>mcp_server<span class=\"token punctuation\">.<\/span>_tools<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span>tool_name<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> tool_func <span class=\"token keyword\">is<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u5de5\u5177 &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>tool_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039; \u4e0d\u5b58\u5728&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> asyncio<span class=\"token punctuation\">.<\/span>iscoroutinefunction<span class=\"token punctuation\">(<\/span>tool_func<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> tool_func<span class=\"token punctuation\">(<\/span><span class=\"token operator\">**<\/span>arguments<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> tool_func<span class=\"token punctuation\">(<\/span><span class=\"token operator\">**<\/span>arguments<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_topological_sort<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u62d3\u6251\u6392\u5e8f&#034;&#034;&#034;<\/span><br \/>\n        visited <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">set<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>        <span class=\"token keyword\">def<\/span> <span class=\"token function\">dfs<\/span><span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> node <span class=\"token keyword\">in<\/span> visited<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">return<\/span><br \/>\n            visited<span class=\"token punctuation\">.<\/span>add<span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> dep <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">[<\/span>node<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">.<\/span>depends_on<span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">if<\/span> dep <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">:<\/span><br \/>\n                    dfs<span class=\"token punctuation\">(<\/span>dep<span class=\"token punctuation\">)<\/span><br \/>\n            result<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>node<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> name <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>steps<span class=\"token punctuation\">:<\/span><br \/>\n            dfs<span class=\"token punctuation\">(<\/span>name<span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> result<\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">_evaluate_condition<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> condition<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8bc4\u4f30\u6761\u4ef6\u8868\u8fbe\u5f0f&#xff08;\u7b80\u5316\u5b9e\u73b0&#xff09;&#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token comment\"># \u5b89\u5168\u5730\u8bc4\u4f30\u7b80\u5355\u6761\u4ef6<\/span><br \/>\n            <span class=\"token comment\"># \u751f\u4ea7\u73af\u5883\u5e94\u4f7f\u7528\u66f4\u5b89\u5168\u7684\u8868\u8fbe\u5f0f\u5f15\u64ce<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">eval<\/span><span class=\"token punctuation\">(<\/span>condition<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;__builtins__&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> context<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">except<\/span> Exception<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><\/p>\n<h4>10.3 \u5b9e\u6218&#xff1a;\u6784\u5efa&#034;\u667a\u80fd\u8fd0\u7ef4 Agent&#034;<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5b9e\u6218\u6848\u4f8b&#xff1a;\u667a\u80fd\u8fd0\u7ef4 Agent<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u573a\u666f&#xff1a;\u5f53\u6536\u5230\u544a\u8b66\u65f6&#xff0c;\u81ea\u52a8\u6267\u884c\u8bca\u65ad\u3001\u5206\u6790\u3001\u4fee\u590d\u5efa\u8bae\u7684\u5b8c\u6574\u6d41\u7a0b\u3002<\/p>\n<p>\u5de5\u5177\u94fe&#xff1a;<br \/>\n  1. get_alert_details  \u2192 \u83b7\u53d6\u544a\u8b66\u8be6\u60c5<br \/>\n  2. check_system_metrics \u2192 \u68c0\u67e5\u7cfb\u7edf\u6307\u6807<br \/>\n  3. query_recent_logs  \u2192 \u67e5\u8be2\u6700\u8fd1\u65e5\u5fd7<br \/>\n  4. analyze_root_cause \u2192 \u5206\u6790\u6839\u56e0<br \/>\n  5. generate_fix_plan  \u2192 \u751f\u6210\u4fee\u590d\u65b9\u6848<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">build_ops_agent_chain<\/span><span class=\"token punctuation\">(<\/span>orchestrator<span class=\"token punctuation\">:<\/span> AgentChainOrchestrator<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6784\u5efa\u8fd0\u7ef4 Agent \u94fe&#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa41&#xff1a;\u83b7\u53d6\u544a\u8b66\u8be6\u60c5<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;get_alert&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;get_alert_details&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;alert_id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{user_input.alert_id}}&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">10.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa42&#xff1a;\u68c0\u67e5\u7cfb\u7edf\u6307\u6807&#xff08;\u4f9d\u8d56\u6b65\u9aa41\u7684\u7ed3\u679c&#xff09;<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;check_metrics&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;check_system_metrics&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;server_id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{get_alert.result.server_id}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;time_range&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;30m&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;metrics&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;cpu&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;memory&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;disk&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;network&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;get_alert&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa43&#xff1a;\u67e5\u8be2\u76f8\u5173\u65e5\u5fd7&#xff08;\u4f9d\u8d56\u6b65\u9aa41&#xff09;<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;query_logs&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;query_recent_logs&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;server_id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{get_alert.result.server_id}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;level&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;ERROR&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;minutes&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">30<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;keyword&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{get_alert.result.error_type}}&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;get_alert&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">20.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        retry_count<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span>  <span class=\"token comment\"># \u65e5\u5fd7\u67e5\u8be2\u53ef\u80fd\u5076\u5c14\u8d85\u65f6&#xff0c;\u5141\u8bb8\u91cd\u8bd5<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa44&#xff1a;\u5206\u6790\u6839\u56e0&#xff08;\u4f9d\u8d56\u6b65\u9aa42\u548c3&#xff09;<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;analyze_cause&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;analyze_root_cause&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;alert_info&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{get_alert.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;metrics_data&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{check_metrics.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;log_entries&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{query_logs.result}}&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;check_metrics&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;query_logs&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa45&#xff1a;\u751f\u6210\u4fee\u590d\u65b9\u6848&#xff08;\u4f9d\u8d56\u6b65\u9aa44&#xff09;<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;generate_fix&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;generate_fix_plan&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;root_cause&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{analyze_cause.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;severity&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{get_alert.result.severity}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;auto_fix&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;false&#034;<\/span>  <span class=\"token comment\"># \u5b89\u5168\u8d77\u89c1&#xff0c;\u9ed8\u8ba4\u4e0d\u81ea\u52a8\u6267\u884c\u4fee\u590d<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;analyze_cause&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u6ce8\u518c\u4e3a MCP \u5de5\u5177<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">run_ops_agent<\/span><span class=\"token punctuation\">(<\/span>alert_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8fd0\u884c\u667a\u80fd\u8fd0\u7ef4 Agent\u3002<\/p>\n<p>    \u63a5\u6536\u544a\u8b66 ID&#xff0c;\u81ea\u52a8\u6267\u884c\u5b8c\u6574\u7684\u8bca\u65ad-\u5206\u6790-\u4fee\u590d\u5efa\u8bae\u6d41\u7a0b\u3002<\/p>\n<p>    Args:<br \/>\n        alert_id: \u544a\u8b66\u552f\u4e00\u6807\u8bc6\u7b26<\/p>\n<p>    Returns:<br \/>\n        \u5b8c\u6574\u7684\u8bca\u65ad\u62a5\u544a\u548c\u4fee\u590d\u5efa\u8bae<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    orchestrator <span class=\"token operator\">&#061;<\/span> AgentChainOrchestrator<span class=\"token punctuation\">(<\/span>mcp_server<span class=\"token operator\">&#061;<\/span>mcp<span class=\"token punctuation\">)<\/span><br \/>\n    build_ops_agent_chain<span class=\"token punctuation\">(<\/span>orchestrator<span class=\"token punctuation\">)<\/span><\/p>\n<p>    result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> orchestrator<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><br \/>\n        initial_context<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;user_input&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;alert_id&#034;<\/span><span class=\"token punctuation\">:<\/span> alert_id<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>10.4 \u5b9e\u6218&#xff1a;\u6784\u5efa&#034;\u6570\u636e\u5206\u6790 Agent&#034;<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5b9e\u6218\u6848\u4f8b&#xff1a;\u6570\u636e\u5206\u6790 Agent<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u573a\u666f&#xff1a;\u7528\u6237\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u5206\u6790\u9700\u6c42&#xff0c;Agent \u81ea\u52a8\u5b8c\u6210<br \/>\n     \u6570\u636e\u83b7\u53d6 \u2192 \u6e05\u6d17 \u2192 \u7edf\u8ba1 \u2192 \u53ef\u89c6\u5316\u5efa\u8bae \u7684\u5168\u6d41\u7a0b\u3002<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">run_data_analysis_agent<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    question<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    data_source<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;main_database&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    output_format<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;summary&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8fd0\u884c\u6570\u636e\u5206\u6790 Agent\u3002<\/p>\n<p>    \u6839\u636e\u7528\u6237\u7684\u81ea\u7136\u8bed\u8a00\u95ee\u9898&#xff0c;\u81ea\u52a8\u7f16\u6392\u6570\u636e\u67e5\u8be2\u3001<br \/>\n    \u7edf\u8ba1\u5206\u6790\u3001\u7ed3\u679c\u6c47\u603b\u7b49\u5de5\u5177\u5b8c\u6210\u5206\u6790\u4efb\u52a1\u3002<\/p>\n<p>    Args:<br \/>\n        question: \u7528\u6237\u7684\u5206\u6790\u95ee\u9898&#xff08;\u81ea\u7136\u8bed\u8a00&#xff09;<br \/>\n        data_source: \u6570\u636e\u6e90\u6807\u8bc6<br \/>\n        output_format: \u8f93\u51fa\u683c\u5f0f (summary\/detailed\/chart_suggestion)<\/p>\n<p>    Returns:<br \/>\n        \u5206\u6790\u7ed3\u679c\u62a5\u544a<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    orchestrator <span class=\"token operator\">&#061;<\/span> AgentChainOrchestrator<span class=\"token punctuation\">(<\/span>mcp_server<span class=\"token operator\">&#061;<\/span>mcp<span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa41&#xff1a;\u7406\u89e3\u95ee\u9898&#xff0c;\u751f\u6210\u67e5\u8be2\u8ba1\u5212<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;plan_query&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;generate_query_plan&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;question&#034;<\/span><span class=\"token punctuation\">:<\/span> question<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;data_source&#034;<\/span><span class=\"token punctuation\">:<\/span> data_source<br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa42&#xff1a;\u6267\u884c\u6570\u636e\u67e5\u8be2<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;execute_query&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;execute_data_query&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;query_plan&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{plan_query.result.query}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;data_source&#034;<\/span><span class=\"token punctuation\">:<\/span> data_source<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;limit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1000<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;plan_query&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        retry_count<span class=\"token operator\">&#061;<\/span><span class=\"token number\">1<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa43&#xff1a;\u6570\u636e\u6e05\u6d17\u4e0e\u9884\u5904\u7406<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;clean_data&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;preprocess_data&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;raw_data&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{execute_query.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;operations&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;remove_nulls&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;normalize&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;detect_outliers&#034;<\/span><span class=\"token punctuation\">]<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;execute_query&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">20.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa44&#xff1a;\u7edf\u8ba1\u5206\u6790<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;analyze&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;statistical_analysis&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;data&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{clean_data.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;analysis_type&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{plan_query.result.analysis_type}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;group_by&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{plan_query.result.group_by}}&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;clean_data&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">25.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6b65\u9aa45&#xff1a;\u751f\u6210\u62a5\u544a<\/span><br \/>\n    orchestrator<span class=\"token punctuation\">.<\/span>add_step<span class=\"token punctuation\">(<\/span>ChainStep<span class=\"token punctuation\">(<\/span><br \/>\n        name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;report&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        tool_name<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;generate_analysis_report&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        arguments_template<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;analysis_results&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;{{analyze.result}}&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;original_question&#034;<\/span><span class=\"token punctuation\">:<\/span> question<span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;format&#034;<\/span><span class=\"token punctuation\">:<\/span> output_format<br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        depends_on<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;analyze&#034;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">15.0<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u6267\u884c\u94fe<\/span><br \/>\n    result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> orchestrator<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>10.5 \u591a MCP Server \u8054\u90a6\u8c03\u7528<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u591a MCP Server \u8054\u90a6\u8c03\u7528<br \/>\n&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<br \/>\n\u5728\u590d\u6742\u573a\u666f\u4e2d&#xff0c;\u53ef\u80fd\u9700\u8981\u540c\u65f6\u8c03\u7528\u591a\u4e2a\u72ec\u7acb\u7684 MCP Server\u3002<br \/>\n\u4f8b\u5982&#xff1a;\u5929\u6c14\u6570\u636e\u6765\u81ea\u5929\u6c14 MCP Server&#xff0c;\u7528\u6237\u6570\u636e\u6765\u81ea\u7528\u6237 MCP Server&#xff0c;<br \/>\n     \u63a8\u8350\u903b\u8f91\u6765\u81ea\u63a8\u8350 MCP Server\u3002<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">import<\/span> httpx<br \/>\n<span class=\"token keyword\">from<\/span> typing <span class=\"token keyword\">import<\/span> Dict<span class=\"token punctuation\">,<\/span> List<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">MCPFederator<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    MCP Server \u8054\u90a6\u8c03\u7528\u5668<\/p>\n<p>    \u7ba1\u7406\u4e0e\u591a\u4e2a\u8fdc\u7a0b MCP Server \u7684\u8fde\u63a5&#xff0c;<br \/>\n    \u63d0\u4f9b\u7edf\u4e00\u7684\u5de5\u5177\u8c03\u7528\u63a5\u53e3\u3002<br \/>\n    &#034;&#034;&#034;<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_servers<span class=\"token punctuation\">:<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>  <span class=\"token comment\"># name -&gt; url<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_client <span class=\"token operator\">&#061;<\/span> httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>timeout<span class=\"token operator\">&#061;<\/span><span class=\"token number\">30.0<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">def<\/span> <span class=\"token function\">register_server<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> url<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u6ce8\u518c\u8fdc\u7a0b MCP Server&#034;&#034;&#034;<\/span><br \/>\n        self<span class=\"token punctuation\">.<\/span>_servers<span class=\"token punctuation\">[<\/span>name<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> url<br \/>\n        logger<span class=\"token punctuation\">.<\/span>info<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u6ce8\u518c MCP Server: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> -&gt; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">call_tool<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> server_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> tool_name<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> arguments<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n        \u8c03\u7528\u8fdc\u7a0b MCP Server \u7684\u5de5\u5177<\/p>\n<p>        Args:<br \/>\n            server_name: \u670d\u52a1\u5668\u540d\u79f0<br \/>\n            tool_name: \u5de5\u5177\u540d\u79f0<br \/>\n            arguments: \u5de5\u5177\u53c2\u6570<br \/>\n        &#034;&#034;&#034;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> server_name <span class=\"token keyword\">not<\/span> <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>_servers<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> ValueError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u672a\u6ce8\u518c\u7684 MCP Server: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>server_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        url <span class=\"token operator\">&#061;<\/span> self<span class=\"token punctuation\">.<\/span>_servers<span class=\"token punctuation\">[<\/span>server_name<span class=\"token punctuation\">]<\/span><\/p>\n<p>        <span class=\"token comment\"># \u6784\u9020 JSON-RPC \u8bf7\u6c42<\/span><br \/>\n        payload <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string\">&#034;jsonrpc&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;method&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;tools\/call&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;name&#034;<\/span><span class=\"token punctuation\">:<\/span> tool_name<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;arguments&#034;<\/span><span class=\"token punctuation\">:<\/span> arguments<br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        response <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">&#061;<\/span>payload<span class=\"token punctuation\">)<\/span><br \/>\n        response<span class=\"token punctuation\">.<\/span>raise_for_status<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        result <span class=\"token operator\">&#061;<\/span> response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token string\">&#034;error&#034;<\/span> <span class=\"token keyword\">in<\/span> result<span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u8fdc\u7a0b\u5de5\u5177\u8c03\u7528\u5931\u8d25: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>result<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#039;error&#039;<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> result<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;result&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">list_all_tools<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> Dict<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span> List<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u83b7\u53d6\u6240\u6709\u6ce8\u518c\u670d\u52a1\u5668\u7684\u5de5\u5177\u5217\u8868&#034;&#034;&#034;<\/span><br \/>\n        all_tools <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">for<\/span> name<span class=\"token punctuation\">,<\/span> url <span class=\"token keyword\">in<\/span> self<span class=\"token punctuation\">.<\/span>_servers<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                payload <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token string\">&#034;jsonrpc&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;id&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;method&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;tools\/list&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                    <span class=\"token string\">&#034;params&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                response <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_client<span class=\"token punctuation\">.<\/span>post<span class=\"token punctuation\">(<\/span>url<span class=\"token punctuation\">,<\/span> json<span class=\"token operator\">&#061;<\/span>payload<span class=\"token punctuation\">)<\/span><br \/>\n                result <span class=\"token operator\">&#061;<\/span> response<span class=\"token punctuation\">.<\/span>json<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                all_tools<span class=\"token punctuation\">[<\/span>name<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> result<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;result&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tools&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n                all_tools<span class=\"token punctuation\">[<\/span>name<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>        <span class=\"token keyword\">return<\/span> all_tools<\/p>\n<p><span class=\"token comment\"># \u4f7f\u7528\u793a\u4f8b<\/span><br \/>\nfederator <span class=\"token operator\">&#061;<\/span> MCPFederator<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\nfederator<span class=\"token punctuation\">.<\/span>register_server<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;weather&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;http:\/\/weather-mcp:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nfederator<span class=\"token punctuation\">.<\/span>register_server<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;database&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;http:\/\/db-mcp:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nfederator<span class=\"token punctuation\">.<\/span>register_server<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;search&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;http:\/\/search-mcp:8000\/mcp&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">federated_query<\/span><span class=\"token punctuation\">(<\/span><br \/>\n    city<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    include_history<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    include_recommendations<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">bool<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">False<\/span><br \/>\n<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n    \u8054\u90a6\u67e5\u8be2&#xff1a;\u540c\u65f6\u4ece\u591a\u4e2a MCP Server \u83b7\u53d6\u6570\u636e\u5e76\u805a\u5408\u3002<\/p>\n<p>    Args:<br \/>\n        city: \u67e5\u8be2\u57ce\u5e02<br \/>\n        include_history: \u662f\u5426\u5305\u542b\u5386\u53f2\u6570\u636e<br \/>\n        include_recommendations: \u662f\u5426\u5305\u542b\u63a8\u8350\u4fe1\u606f<br \/>\n    &#034;&#034;&#034;<\/span><br \/>\n    results <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\"># \u5e76\u884c\u8c03\u7528\u591a\u4e2a MCP Server<\/span><br \/>\n    tasks <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><\/p>\n<p>    <span class=\"token comment\"># \u8c03\u7528\u5929\u6c14\u670d\u52a1<\/span><br \/>\n    tasks<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><br \/>\n        federator<span class=\"token punctuation\">.<\/span>call_tool<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;weather&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;get_current_weather&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">:<\/span> city<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u8c03\u7528\u6570\u636e\u5e93\u670d\u52a1<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> include_history<span class=\"token punctuation\">:<\/span><br \/>\n        tasks<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><br \/>\n            federator<span class=\"token punctuation\">.<\/span>call_tool<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;database&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;query_records&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string\">&#034;table&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;weather_history&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;conditions&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;city &#061; &#039;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>city<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#039;&#034;<\/span><\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string\">&#034;limit&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token number\">30<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token comment\"># \u5e76\u884c\u6267\u884c<\/span><br \/>\n    task_results <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> asyncio<span class=\"token punctuation\">.<\/span>gather<span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>tasks<span class=\"token punctuation\">,<\/span> return_exceptions<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    results<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;current_weather&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> include_history <span class=\"token keyword\">and<\/span> <span class=\"token builtin\">len<\/span><span class=\"token punctuation\">(<\/span>task_results<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        results<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;history&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> Exception<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>task_results<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>results<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>10.6 \u9519\u8bef\u6062\u590d\u4e0e\u91cd\u8bd5\u7b56\u7565<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\nAgent \u94fe\u7684\u9519\u8bef\u6062\u590d\u7b56\u7565<br \/>\n&#034;&#034;&#034;<\/span><br \/>\n<span class=\"token keyword\">from<\/span> enum <span class=\"token keyword\">import<\/span> Enum<\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RetryStrategy<\/span><span class=\"token punctuation\">(<\/span>Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u91cd\u8bd5\u7b56\u7565&#034;&#034;&#034;<\/span><br \/>\n    NONE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;none&#034;<\/span>              <span class=\"token comment\"># \u4e0d\u91cd\u8bd5<\/span><br \/>\n    FIXED <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;fixed&#034;<\/span>            <span class=\"token comment\"># \u56fa\u5b9a\u95f4\u9694\u91cd\u8bd5<\/span><br \/>\n    EXPONENTIAL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;exponential&#034;<\/span>  <span class=\"token comment\"># \u6307\u6570\u9000\u907f\u91cd\u8bd5<\/span><br \/>\n    LINEAR <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;linear&#034;<\/span>          <span class=\"token comment\"># \u7ebf\u6027\u9012\u589e\u91cd\u8bd5<\/span><\/p>\n<p><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">FallbackStrategy<\/span><span class=\"token punctuation\">(<\/span>Enum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u964d\u7ea7\u7b56\u7565&#034;&#034;&#034;<\/span><br \/>\n    SKIP <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;skip&#034;<\/span>              <span class=\"token comment\"># \u8df3\u8fc7\u5931\u8d25\u6b65\u9aa4&#xff0c;\u7ee7\u7eed\u6267\u884c<\/span><br \/>\n    ABORT <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;abort&#034;<\/span>            <span class=\"token comment\"># \u4e2d\u6b62\u6574\u4e2a\u94fe<\/span><br \/>\n    DEFAULT_VALUE <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;default&#034;<\/span>  <span class=\"token comment\"># \u4f7f\u7528\u9ed8\u8ba4\u503c\u66ff\u4ee3<\/span><br \/>\n    FALLBACK_TOOL <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;fallback&#034;<\/span> <span class=\"token comment\"># \u8c03\u7528\u5907\u7528\u5de5\u5177<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;dataclass<\/span><br \/>\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">ResilienceConfig<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u5f39\u6027\u914d\u7f6e&#034;&#034;&#034;<\/span><br \/>\n    retry_strategy<span class=\"token punctuation\">:<\/span> RetryStrategy <span class=\"token operator\">&#061;<\/span> RetryStrategy<span class=\"token punctuation\">.<\/span>EXPONENTIAL<br \/>\n    max_retries<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3<\/span><br \/>\n    base_delay<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span>       <span class=\"token comment\"># \u57fa\u7840\u5ef6\u8fdf&#xff08;\u79d2&#xff09;<\/span><br \/>\n    max_delay<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">float<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">30.0<\/span>       <span class=\"token comment\"># \u6700\u5927\u5ef6\u8fdf&#xff08;\u79d2&#xff09;<\/span><br \/>\n    fallback_strategy<span class=\"token punctuation\">:<\/span> FallbackStrategy <span class=\"token operator\">&#061;<\/span> FallbackStrategy<span class=\"token punctuation\">.<\/span>ABORT<br \/>\n    fallback_value<span class=\"token punctuation\">:<\/span> Any <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    fallback_tool<span class=\"token punctuation\">:<\/span> Optional<span class=\"token punctuation\">[<\/span><span class=\"token builtin\">str<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><br \/>\n    circuit_breaker_threshold<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">calculate_retry_delay<\/span><span class=\"token punctuation\">(<\/span>strategy<span class=\"token punctuation\">:<\/span> RetryStrategy<span class=\"token punctuation\">,<\/span> attempt<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">:<\/span> ResilienceConfig<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">float<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u8ba1\u7b97\u91cd\u8bd5\u5ef6\u8fdf&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> strategy <span class=\"token operator\">&#061;&#061;<\/span> RetryStrategy<span class=\"token punctuation\">.<\/span>FIXED<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> config<span class=\"token punctuation\">.<\/span>base_delay<br \/>\n    <span class=\"token keyword\">elif<\/span> strategy <span class=\"token operator\">&#061;&#061;<\/span> RetryStrategy<span class=\"token punctuation\">.<\/span>EXPONENTIAL<span class=\"token punctuation\">:<\/span><br \/>\n        delay <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">.<\/span>base_delay <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">**<\/span> attempt<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>delay<span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">.<\/span>max_delay<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">elif<\/span> strategy <span class=\"token operator\">&#061;&#061;<\/span> RetryStrategy<span class=\"token punctuation\">.<\/span>LINEAR<span class=\"token punctuation\">:<\/span><br \/>\n        delay <span class=\"token operator\">&#061;<\/span> config<span class=\"token punctuation\">.<\/span>base_delay <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>attempt <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">min<\/span><span class=\"token punctuation\">(<\/span>delay<span class=\"token punctuation\">,<\/span> config<span class=\"token punctuation\">.<\/span>max_delay<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><\/p>\n<p><span class=\"token comment\"># \u5728 Agent \u94fe\u4e2d\u4f7f\u7528\u5f39\u6027\u914d\u7f6e<\/span><br \/>\n<span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\norchestrator &#061; AgentChainOrchestrator(mcp_server&#061;mcp)<br \/>\norchestrator.resilience &#061; ResilienceConfig(<br \/>\n    retry_strategy&#061;RetryStrategy.EXPONENTIAL,<br \/>\n    max_retries&#061;3,<br \/>\n    base_delay&#061;1.0,<br \/>\n    fallback_strategy&#061;FallbackStrategy.DEFAULT_VALUE,<br \/>\n    fallback_value&#061;{&#034;status&#034;: &#034;unavailable&#034;, &#034;data&#034;: []}<br \/>\n)<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<hr \/>\n<h3>\u5341\u4e00\u3001\u5e38\u89c1\u9677\u9631\u4e0e\u95ee\u9898\u6392\u9664<\/h3>\n<h4>11.1 \u534f\u8bae\u7248\u672c\u517c\u5bb9\u6027\u9677\u9631<\/h4>\n<table>\n<tr>\u9677\u9631\u75c7\u72b6\u89e3\u51b3\u65b9\u6848<\/tr>\n<tbody>\n<tr>\n<td>SDK \u7248\u672c\u4e0e\u534f\u8bae\u7248\u672c\u4e0d\u5339\u914d<\/td>\n<td>\u8fde\u63a5\u6210\u529f\u4f46\u5de5\u5177\u5217\u8868\u4e3a\u7a7a<\/td>\n<td>\u786e\u8ba4 SDK \u7248\u672c\u652f\u6301 2026-07-28 \u89c4\u8303<\/td>\n<\/tr>\n<tr>\n<td>\u5ba2\u6237\u7aef\u4ecd\u4f7f\u7528\u65e7\u7248 initialize \u63e1\u624b<\/td>\n<td>\u670d\u52a1\u5668\u8fd4\u56de 400 \u6216\u5ffd\u7565<\/td>\n<td>\u5347\u7ea7\u5ba2\u6237\u7aef SDK&#xff0c;\u6216\u670d\u52a1\u5668\u517c\u5bb9\u6a21\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>\u6df7\u7528\u6709\u72b6\u6001\u548c\u65e0\u72b6\u6001\u8c03\u7528<\/td>\n<td>\u95f4\u6b47\u6027 502\/\u8d85\u65f6<\/td>\n<td>\u7edf\u4e00\u4f7f\u7528\u65e0\u72b6\u6001\u6a21\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>protocolVersion \u5b57\u6bb5\u7f3a\u5931<\/td>\n<td>\u670d\u52a1\u5668\u62d2\u7edd\u8bf7\u6c42<\/td>\n<td>\u6bcf\u4e2a\u8bf7\u6c42\u5fc5\u987b\u643a\u5e26\u534f\u8bae\u7248\u672c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span class=\"token comment\"># \u517c\u5bb9\u6027\u68c0\u67e5\u4ee3\u7801<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">check_sdk_compatibility<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token triple-quoted-string string\">&#034;&#034;&#034;\u68c0\u67e5 SDK \u7248\u672c\u662f\u5426\u652f\u6301\u65e0\u72b6\u6001\u6a21\u5f0f&#034;&#034;&#034;<\/span><br \/>\n    <span class=\"token keyword\">import<\/span> mcp<br \/>\n    version <span class=\"token operator\">&#061;<\/span> mcp<span class=\"token punctuation\">.<\/span>__version__<\/p>\n<p>    <span class=\"token comment\"># \u89e3\u6790\u7248\u672c\u53f7<\/span><br \/>\n    major<span class=\"token punctuation\">,<\/span> minor <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">map<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> version<span class=\"token punctuation\">.<\/span>split<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;.&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">:<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> major <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">raise<\/span> RuntimeError<span class=\"token punctuation\">(<\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;MCP SDK \u7248\u672c <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>version<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u8fc7\u65e7&#xff0c;&#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u65e0\u72b6\u6001\u6a21\u5f0f\u9700\u8981 &gt;&#061; 1.0.0\u3002&#034;<\/span><\/span><br \/>\n            <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u8bf7\u8fd0\u884c: pip install &#8211;upgrade mcp&#034;<\/span><\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><\/p>\n<p>    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u2705 MCP SDK <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>version<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\"> \u652f\u6301\u65e0\u72b6\u6001\u6a21\u5f0f&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><\/p>\n<h4>11.2 \u65e0\u72b6\u6001\u6a21\u5f0f\u5e38\u89c1\u8bef\u533a<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8bef\u533a\u4e00&#xff1a;\u8ba4\u4e3a\u65e0\u72b6\u6001 &#061; \u4e0d\u80fd\u6709\u4efb\u4f55\u5185\u90e8\u72b6\u6001<br \/>\n\u6b63\u786e\u7406\u89e3&#xff1a;\u534f\u8bae\u5c42\u65e0\u72b6\u6001&#xff08;\u4e0d\u7ef4\u62a4 session&#xff09;&#xff0c;\u4f46\u5b9e\u73b0\u5c42\u53ef\u4ee5\u6709\u8fde\u63a5\u6c60\u3001\u7f13\u5b58\u7b49\u3002<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u274c \u9519\u8bef&#xff1a;\u6bcf\u6b21\u8bf7\u6c42\u90fd\u521b\u5efa\u65b0\u7684\u6570\u636e\u5e93\u8fde\u63a5<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">bad_query<\/span><span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    conn <span class=\"token operator\">&#061;<\/span> sqlite3<span class=\"token punctuation\">.<\/span>connect<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;data.db&#034;<\/span><span class=\"token punctuation\">)<\/span>  <span class=\"token comment\"># \u6bcf\u6b21\u65b0\u5efa\u8fde\u63a5&#xff0c;\u6027\u80fd\u5dee<\/span><br \/>\n    result <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>fetchall<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    conn<span class=\"token punctuation\">.<\/span>close<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \u2705 \u6b63\u786e&#xff1a;\u4f7f\u7528\u8fde\u63a5\u6c60&#xff08;\u8fdb\u7a0b\u7ea7\u590d\u7528&#xff09;<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">good_query<\/span><span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">with<\/span> get_pooled_connection<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> conn<span class=\"token punctuation\">:<\/span>  <span class=\"token comment\"># \u4ece\u6c60\u4e2d\u83b7\u53d6<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> conn<span class=\"token punctuation\">.<\/span>execute<span class=\"token punctuation\">(<\/span>sql<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>fetchall<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8bef\u533a\u4e8c&#xff1a;\u8ba4\u4e3a\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0d\u9700\u8981 initialize<br \/>\n\u6b63\u786e\u7406\u89e3&#xff1a;\u867d\u7136\u4e0d\u5f3a\u5236&#xff0c;\u4f46\u63a8\u8350\u5ba2\u6237\u7aef\u4ecd\u53d1\u9001 initialize \u4ee5\u83b7\u53d6\u670d\u52a1\u5668\u80fd\u529b\u3002<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u8bef\u533a\u4e09&#xff1a;\u5728\u5de5\u5177\u51fd\u6570\u4e2d\u4f7f\u7528\u5168\u5c40\u53ef\u53d8\u72b6\u6001\u5b58\u50a8\u8bf7\u6c42\u4e0a\u4e0b\u6587<br \/>\n\u6b63\u786e\u7406\u89e3&#xff1a;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb&#xff0c;\u4e0d\u80fd\u4f9d\u8d56&#034;\u4e0a\u4e00\u6b21\u8bf7\u6c42\u8bbe\u7f6e\u4e86\u4ec0\u4e48&#034;\u3002<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u274c \u9519\u8bef&#xff1a;\u4f9d\u8d56\u5168\u5c40\u72b6\u6001<\/span><br \/>\n_current_user <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">None<\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">set_user<\/span><span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">global<\/span> _current_user<br \/>\n    _current_user <span class=\"token operator\">&#061;<\/span> user_id  <span class=\"token comment\"># \u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b&#xff0c;\u4e0b\u4e00\u4e2a\u8bf7\u6c42\u770b\u4e0d\u5230\u8fd9\u4e2a&#xff01;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7528\u6237\u8bbe\u7f6e\u4e3a <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>user_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p><span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_user_data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># _current_user \u53ef\u80fd\u662f None \u6216\u5176\u4ed6\u8bf7\u6c42\u8bbe\u7f6e\u7684\u503c&#xff01;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7528\u6237\u6570\u636e: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>_current_user<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p><span class=\"token comment\"># \u2705 \u6b63\u786e&#xff1a;\u6bcf\u4e2a\u8bf7\u6c42\u81ea\u5305\u542b<\/span><br \/>\n<span class=\"token decorator annotation punctuation\">&#064;mcp<span class=\"token punctuation\">.<\/span>tool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_user_data<\/span><span class=\"token punctuation\">(<\/span>user_id<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token comment\"># user_id \u4f5c\u4e3a\u53c2\u6570\u4f20\u5165&#xff0c;\u4e0d\u4f9d\u8d56\u5916\u90e8\u72b6\u6001<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u7528\u6237\u6570\u636e: <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>user_id<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<h4>11.3 \u90e8\u7f72\u76f8\u5173\u9677\u9631<\/h4>\n<table>\n<tr>\u9677\u9631\u75c7\u72b6\u89e3\u51b3\u65b9\u6848<\/tr>\n<tbody>\n<tr>\n<td>Docker \u4e2d\u65f6\u533a\u4e0d\u6b63\u786e<\/td>\n<td>\u65e5\u5fd7\u65f6\u95f4\u6233\u504f\u5dee<\/td>\n<td>\u8bbe\u7f6e TZ&#061;Asia\/Shanghai \u73af\u5883\u53d8\u91cf<\/td>\n<\/tr>\n<tr>\n<td>\u5bb9\u5668\u5185\u5b58\u9650\u5236\u8fc7\u5c0f<\/td>\n<td>OOMKilled<\/td>\n<td>\u81f3\u5c11\u5206\u914d 256MB&#xff0c;\u63a8\u8350 512MB<\/td>\n<\/tr>\n<tr>\n<td>\u5065\u5eb7\u68c0\u67e5\u8def\u5f84\u9519\u8bef<\/td>\n<td>Pod \u53cd\u590d\u91cd\u542f<\/td>\n<td>\u786e\u8ba4 \/health \u7aef\u70b9\u5b58\u5728\u4e14\u8fd4\u56de 200<\/td>\n<\/tr>\n<tr>\n<td>\u7aef\u53e3\u672a\u6b63\u786e\u66b4\u9732<\/td>\n<td>\u5916\u90e8\u65e0\u6cd5\u8bbf\u95ee<\/td>\n<td>\u68c0\u67e5 EXPOSE\u3001Service\u3001Ingress \u914d\u7f6e<\/td>\n<\/tr>\n<tr>\n<td>\u65e5\u5fd7\u8f93\u51fa\u5230 stdout<\/td>\n<td>\u4e0e stdio \u4f20\u8f93\u51b2\u7a81<\/td>\n<td>HTTP \u6a21\u5f0f\u65e5\u5fd7\u8d70 stderr \u6216\u6587\u4ef6<\/td>\n<\/tr>\n<tr>\n<td>\u955c\u50cf\u8fc7\u5927<\/td>\n<td>\u6784\u5efa\/\u62c9\u53d6\u6162<\/td>\n<td>\u4f7f\u7528\u591a\u9636\u6bb5\u6784\u5efa &#043; slim\/alpine \u57fa\u7840\u955c\u50cf<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>11.4 \u6027\u80fd\u9677\u9631<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u6027\u80fd\u9677\u9631\u6e05\u5355<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96311&#xff1a;\u5de5\u5177\u8fd4\u56de\u8fc7\u5927\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token comment\"># \u274c \u8fd4\u56de\u6574\u4e2a\u6570\u636e\u5e93\u8868&#xff08;\u53ef\u80fd\u51e0MB&#xff09;<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u5206\u9875\u8fd4\u56de&#xff0c;\u9650\u5236\u6700\u5927\u6761\u6570<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96312&#xff1a;\u540c\u6b65\u963b\u585e\u8c03\u7528<\/span><br \/>\n<span class=\"token comment\"># \u274c \u5728\u5f02\u6b65\u5de5\u5177\u4e2d\u4f7f\u7528 time.sleep() \u6216\u540c\u6b65 HTTP \u8bf7\u6c42<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u4f7f\u7528 asyncio.sleep() \u548c httpx.AsyncClient<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96313&#xff1a;\u91cd\u590d\u8ba1\u7b97<\/span><br \/>\n<span class=\"token comment\"># \u274c \u6bcf\u6b21\u8bf7\u6c42\u90fd\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u542f\u52a8\u65f6\u52a0\u8f7d\u4e00\u6b21&#xff0c;\u7f13\u5b58\u5728\u5185\u5b58\u4e2d<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96314&#xff1a;\u65e5\u5fd7\u8fc7\u591a<\/span><br \/>\n<span class=\"token comment\"># \u274c \u5728\u9ad8\u9891\u5de5\u5177\u4e2d\u6253\u5370 DEBUG \u65e5\u5fd7<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u751f\u4ea7\u73af\u5883\u4f7f\u7528 INFO \u7ea7\u522b&#xff0c;\u654f\u611f\u6570\u636e\u8131\u654f<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96315&#xff1a;JSON \u5e8f\u5217\u5316\u5927\u5bf9\u8c61<\/span><br \/>\n<span class=\"token comment\"># \u274c json.dumps(huge_dict, indent&#061;4)  # indent \u589e\u52a0\u4f53\u79ef<\/span><br \/>\n<span class=\"token comment\"># \u2705 json.dumps(data)  # \u751f\u4ea7\u73af\u5883\u4e0d\u52a0 indent<\/span><\/p>\n<h4>11.5 \u5b89\u5168\u9677\u9631<\/h4>\n<p><span class=\"token triple-quoted-string string\">&#034;&#034;&#034;<br \/>\n\u5b89\u5168\u9677\u9631\u6e05\u5355<br \/>\n&#034;&#034;&#034;<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96311&#xff1a;SQL \u6ce8\u5165<\/span><br \/>\n<span class=\"token comment\"># \u274c f&#034;SELECT * FROM users WHERE name &#061; &#039;{user_input}&#039;&#034;<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u4f7f\u7528\u53c2\u6570\u5316\u67e5\u8be2: cursor.execute(&#034;SELECT * FROM users WHERE name &#061; ?&#034;, (user_input,))<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96312&#xff1a;\u8def\u5f84\u904d\u5386<\/span><br \/>\n<span class=\"token comment\"># \u274c open(f&#034;\/data\/{user_provided_path}&#034;)  # \u7528\u6237\u53ef\u80fd\u4f20 ..\/..\/etc\/passwd<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u9a8c\u8bc1\u8def\u5f84\u5728\u5141\u8bb8\u7684\u76ee\u5f55\u5185<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96313&#xff1a;SSRF&#xff08;\u670d\u52a1\u7aef\u8bf7\u6c42\u4f2a\u9020&#xff09;<\/span><br \/>\n<span class=\"token comment\"># \u274c \u76f4\u63a5\u4f7f\u7528\u7528\u6237\u63d0\u4f9b\u7684 URL \u53d1\u8d77\u8bf7\u6c42<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u767d\u540d\u5355\u57df\u540d&#xff0c;\u7981\u6b62\u5185\u7f51 IP<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96314&#xff1a;\u654f\u611f\u4fe1\u606f\u6cc4\u9732<\/span><br \/>\n<span class=\"token comment\"># \u274c \u5728\u9519\u8bef\u6d88\u606f\u4e2d\u66b4\u9732\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u8fd4\u56de\u901a\u7528\u9519\u8bef\u4fe1\u606f&#xff0c;\u8be6\u7ec6\u4fe1\u606f\u53ea\u8bb0\u5f55\u5230\u65e5\u5fd7<\/span><\/p>\n<p><span class=\"token comment\"># \u9677\u96315&#xff1a;\u672a\u9650\u5236\u5de5\u5177\u6743\u9650<\/span><br \/>\n<span class=\"token comment\"># \u274c \u6240\u6709\u5ba2\u6237\u7aef\u53ef\u4ee5\u8c03\u7528\u6240\u6709\u5de5\u5177&#xff08;\u5305\u62ec\u5220\u9664\u6570\u636e&#xff09;<\/span><br \/>\n<span class=\"token comment\"># \u2705 \u57fa\u4e8e\u89d2\u8272\u7684\u8bbf\u95ee\u63a7\u5236&#xff08;RBAC&#xff09;<\/span><\/p>\n<hr \/>\n<h3>\u5341\u4e8c\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/h3>\n<h4>12.1 \u5168\u6587\u56de\u987e<\/h4>\n<p>\u672c\u6587\u4ece\u96f6\u5f00\u59cb&#xff0c;\u5b8c\u6574\u8986\u76d6\u4e86 MCP \u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668\u7684\u5168\u751f\u547d\u5468\u671f&#xff1a;<\/p>\n<table>\n<tr>\u7ae0\u8282\u6838\u5fc3\u5185\u5bb9\u5173\u952e\u4ea7\u51fa<\/tr>\n<tbody>\n<tr>\n<td>\u4e00<\/td>\n<td>MCP \u6838\u5fc3\u6982\u5ff5<\/td>\n<td>\u7406\u89e3\u534f\u8bae\u67b6\u6784\u3001\u4e09\u5927\u539f\u8bed\u3001\u65e0\u72b6\u6001\u4f18\u52bf<\/td>\n<\/tr>\n<tr>\n<td>\u4e8c<\/td>\n<td>\u73af\u5883\u642d\u5efa<\/td>\n<td>\u53ef\u8fd0\u884c\u7684\u5f00\u53d1\u73af\u5883<\/td>\n<\/tr>\n<tr>\n<td>\u4e09<\/td>\n<td>\u670d\u52a1\u5668\u521d\u59cb\u5316<\/td>\n<td>\u6700\u5c0f\u53ef\u8fd0\u884c MCP Server<\/td>\n<\/tr>\n<tr>\n<td>\u56db<\/td>\n<td>\u5de5\u5177\u5f00\u53d1<\/td>\n<td>\u5b8c\u6574\u7684\u5de5\u5177\u96c6&#xff08;\u5929\u6c14\u3001\u6570\u636e\u5e93\u3001\u641c\u7d22&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u4e94<\/td>\n<td>\u8d44\u6e90\u4e0e\u63d0\u793a\u8bcd<\/td>\n<td>\u77e5\u8bc6\u5e93\u8d44\u6e90\u3001\u4ee3\u7801\u5ba1\u67e5\u6a21\u677f<\/td>\n<\/tr>\n<tr>\n<td>\u516d<\/td>\n<td>\u8c03\u8bd5\u9a8c\u8bc1<\/td>\n<td>Inspector &#043; curl &#043; \u5ba2\u6237\u7aef\u6d4b\u8bd5<\/td>\n<\/tr>\n<tr>\n<td>\u4e03<\/td>\n<td>\u9519\u8bef\u6392\u67e5<\/td>\n<td>\u7cfb\u7edf\u5316\u7684\u6392\u969c\u65b9\u6cd5\u8bba<\/td>\n<\/tr>\n<tr>\n<td>\u516b<\/td>\n<td>\u751f\u4ea7\u90e8\u7f72<\/td>\n<td>Docker &#043; K8s &#043; CI\/CD \u5b8c\u6574\u65b9\u6848<\/td>\n<\/tr>\n<tr>\n<td>\u4e5d<\/td>\n<td>\u6027\u80fd\u4e0e\u5b89\u5168<\/td>\n<td>\u9650\u6d41\u3001\u8ba4\u8bc1\u3001\u52a0\u5bc6\u3001\u5ba1\u8ba1<\/td>\n<\/tr>\n<tr>\n<td>\u5341<\/td>\n<td>Agent \u94fe<\/td>\n<td>\u591a\u5de5\u5177\u7f16\u6392\u3001\u8054\u90a6\u8c03\u7528<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>12.2 \u6838\u5fc3\u8981\u70b9\u603b\u7ed3<\/h4>\n<p>\u65e0\u72b6\u6001 MCP \u670d\u52a1\u5668\u7684\u4e94\u4e2a\u6838\u5fc3\u539f\u5219&#xff1a;<\/p>\n<li>\u8bf7\u6c42\u81ea\u5305\u542b&#xff1a;\u6bcf\u4e2a HTTP \u8bf7\u6c42\u643a\u5e26\u5904\u7406\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f<\/li>\n<li>\u6c34\u5e73\u53ef\u6269\u5c55&#xff1a;\u4efb\u610f\u5b9e\u4f8b\u53ef\u5904\u7406\u4efb\u610f\u8bf7\u6c42&#xff0c;\u52a0\u526f\u672c\u5373\u52a0\u5bb9\u91cf<\/li>\n<li>\u6545\u969c\u65e0\u611f\u77e5&#xff1a;\u5355\u5b9e\u4f8b\u5b95\u673a\u4e0d\u5f71\u54cd\u670d\u52a1&#xff0c;\u8bf7\u6c42\u81ea\u52a8\u8def\u7531\u5230\u5176\u4ed6\u5b9e\u4f8b<\/li>\n<li>\u6807\u51c6\u5316\u90e8\u7f72&#xff1a;\u4e0e\u666e\u901a HTTP \u5fae\u670d\u52a1\u5b8c\u5168\u4e00\u81f4\u7684\u8fd0\u7ef4\u65b9\u5f0f<\/li>\n<li>\u5b89\u5168\u5185\u5efa&#xff1a;OAuth 2.0 \u8ba4\u8bc1\u3001\u8f93\u5165\u6821\u9a8c\u3001\u5ba1\u8ba1\u65e5\u5fd7\u4ece\u8bbe\u8ba1\u9636\u6bb5\u5c31\u8003\u8651<\/li>\n<p>\u751f\u4ea7\u73af\u5883\u68c0\u67e5\u6e05\u5355&#xff1a;<\/p>\n<ul>\n<li class=\"task-list-item\"> \u4f7f\u7528\u65e0\u72b6\u6001\u6a21\u5f0f&#xff08;stateless&#061;True&#xff09;<\/li>\n<li class=\"task-list-item\"> \u6240\u6709\u5de5\u5177\u6709\u53c2\u6570\u6821\u9a8c\u548c\u9519\u8bef\u5904\u7406<\/li>\n<li class=\"task-list-item\"> \u542f\u7528 HTTPS&#xff08;TLS 1.2&#043;&#xff09;<\/li>\n<li class=\"task-list-item\"> \u914d\u7f6e API Key \u6216 OAuth \u8ba4\u8bc1<\/li>\n<li class=\"task-list-item\"> \u8bbe\u7f6e\u8bf7\u6c42\u9650\u6d41<\/li>\n<li class=\"task-list-item\"> \u914d\u7f6e\u5065\u5eb7\u68c0\u67e5\u7aef\u70b9<\/li>\n<li class=\"task-list-item\"> \u542f\u7528\u7ed3\u6784\u5316\u65e5\u5fd7\u548c\u5ba1\u8ba1<\/li>\n<li class=\"task-list-item\"> \u5bb9\u5668\u5316\u90e8\u7f72&#xff0c;\u975e root \u7528\u6237\u8fd0\u884c<\/li>\n<li class=\"task-list-item\"> \u914d\u7f6e\u8d44\u6e90\u9650\u5236&#xff08;CPU\/\u5185\u5b58&#xff09;<\/li>\n<li class=\"task-list-item\"> \u8bbe\u7f6e\u81ea\u52a8\u6269\u7f29\u5bb9\u7b56\u7565<\/li>\n<li class=\"task-list-item\"> \u654f\u611f\u6570\u636e\u8131\u654f<\/li>\n<li class=\"task-list-item\"> \u5b9a\u671f\u5b89\u5168\u626b\u63cf<\/li>\n<\/ul>\n<h4>12.3 \u672a\u6765\u5c55\u671b<\/h4>\n<p>MCP \u534f\u8bae\u6b63\u5728\u5feb\u901f\u6f14\u8fdb&#xff0c;\u4ee5\u4e0b\u662f\u503c\u5f97\u5173\u6ce8\u7684\u65b9\u5411&#xff1a;<\/p>\n<li>Tasks&#xff08;\u5f02\u6b65\u4efb\u52a1&#xff09;&#xff1a;v2 \u89c4\u8303\u5f15\u5165\u7684\u957f\u65f6\u95f4\u8fd0\u884c\u4efb\u52a1\u652f\u6301&#xff0c;\u9002\u5408\u590d\u6742 Agent \u5de5\u4f5c\u6d41<\/li>\n<li>A2A&#xff08;Agent-to-Agent&#xff09;\u534f\u8bae&#xff1a;Google \u63a8\u51fa\u7684 Agent \u95f4\u901a\u4fe1\u534f\u8bae&#xff0c;\u4e0e MCP \u4e92\u8865<\/li>\n<li>MCP \u6ce8\u518c\u4e2d\u5fc3&#xff1a;\u7c7b\u4f3c\u5fae\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3\u7684 MCP Server \u53d1\u73b0\u673a\u5236<\/li>\n<li>\u591a\u6a21\u6001\u5de5\u5177&#xff1a;\u652f\u6301\u56fe\u50cf\u3001\u97f3\u9891\u3001\u89c6\u9891\u7684\u5de5\u5177\u8c03\u7528<\/li>\n<li>\u8fb9\u7f18\u90e8\u7f72&#xff1a;\u5728 IoT \u8bbe\u5907\u3001\u8fb9\u7f18\u8282\u70b9\u8fd0\u884c\u8f7b\u91cf MCP Server<\/li>\n<li>\u4f01\u4e1a\u7ea7\u6cbb\u7406&#xff1a;\u7edf\u4e00\u7684 MCP Server \u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u7248\u672c\u63a7\u5236\u3001\u7070\u5ea6\u53d1\u5e03<\/li>\n<hr \/>\n<h3>\u5341\u4e09\u3001\u8be6\u7ec6\u53c2\u8003\u8d44\u6599<\/h3>\n<h4>13.1 \u5b98\u65b9\u6587\u6863<\/h4>\n<table>\n<tr>\u8d44\u6e90URL\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>MCP \u5b98\u65b9\u89c4\u8303<\/td>\n<td>https:\/\/spec.modelcontextprotocol.io<\/td>\n<td>\u534f\u8bae\u5b8c\u6574\u89c4\u8303&#xff08;2026-07-28\u7248&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>MCP \u5b98\u65b9\u6587\u6863<\/td>\n<td>https:\/\/modelcontextprotocol.io<\/td>\n<td>\u6982\u5ff5\u4ecb\u7ecd\u3001\u5feb\u901f\u5165\u95e8<\/td>\n<\/tr>\n<tr>\n<td>Python SDK<\/td>\n<td>https:\/\/github.com\/modelcontextprotocol\/python-sdk<\/td>\n<td>\u5b98\u65b9 Python SDK<\/td>\n<\/tr>\n<tr>\n<td>TypeScript SDK<\/td>\n<td>https:\/\/github.com\/modelcontextprotocol\/typescript-sdk<\/td>\n<td>\u5b98\u65b9 TS SDK<\/td>\n<\/tr>\n<tr>\n<td>MCP Servers \u4ed3\u5e93<\/td>\n<td>https:\/\/github.com\/modelcontextprotocol\/servers<\/td>\n<td>\u5b98\u65b9\u793a\u4f8b\u670d\u52a1\u5668\u96c6\u5408<\/td>\n<\/tr>\n<tr>\n<td>MCP Inspector<\/td>\n<td>https:\/\/github.com\/modelcontextprotocol\/inspector<\/td>\n<td>\u5b98\u65b9\u8c03\u8bd5\u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>\u534f\u8bae\u53d8\u66f4\u65e5\u5fd7<\/td>\n<td>https:\/\/spec.modelcontextprotocol.io\/changelog<\/td>\n<td>\u7248\u672c\u53d8\u66f4\u8bb0\u5f55<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>13.2 \u793e\u533a\u8d44\u6e90<\/h4>\n<table>\n<tr>\u8d44\u6e90\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>MCP Discord<\/td>\n<td>\u5b98\u65b9\u793e\u533a&#xff0c;\u83b7\u53d6\u5e2e\u52a9\u548c\u8ba8\u8bba<\/td>\n<\/tr>\n<tr>\n<td>Awesome MCP Servers<\/td>\n<td>\u793e\u533a\u7ef4\u62a4\u7684 MCP Server \u5217\u8868<\/td>\n<\/tr>\n<tr>\n<td>Smithery.ai<\/td>\n<td>MCP Server \u6ce8\u518c\u4e0e\u53d1\u73b0\u5e73\u53f0<\/td>\n<\/tr>\n<tr>\n<td>MCP.so<\/td>\n<td>MCP Server \u76ee\u5f55\u7f51\u7ad9<\/td>\n<\/tr>\n<tr>\n<td>Linux \u57fa\u91d1\u4f1a AAIF<\/td>\n<td>MCP \u534f\u8bae\u6cbb\u7406\u7ec4\u7ec7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>13.3 \u76f8\u5173\u534f\u8bae\u4e0e\u6807\u51c6<\/h4>\n<table>\n<tr>\u534f\u8bae\/\u6807\u51c6\u5173\u7cfb\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>JSON-RPC 2.0<\/td>\n<td>MCP \u5e95\u5c42\u6d88\u606f\u683c\u5f0f<\/td>\n<td>MCP \u6d88\u606f\u57fa\u4e8e JSON-RPC 2.0 \u5c01\u88c5<\/td>\n<\/tr>\n<tr>\n<td>OAuth 2.1<\/td>\n<td>MCP \u8ba4\u8bc1\u6807\u51c6<\/td>\n<td>MCP v2 \u63a8\u8350\u7684\u8ba4\u8bc1\u65b9\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>OpenAPI\/Swagger<\/td>\n<td>\u4e92\u8865\u5173\u7cfb<\/td>\n<td>REST API \u63cf\u8ff0\u6807\u51c6&#xff0c;MCP \u5de5\u5177\u53ef\u6620\u5c04\u4e3a OpenAPI<\/td>\n<\/tr>\n<tr>\n<td>A2A (Agent2Agent)<\/td>\n<td>\u4e92\u8865\u5173\u7cfb<\/td>\n<td>Agent \u95f4\u901a\u4fe1\u534f\u8bae&#xff08;Google&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>gRPC<\/td>\n<td>\u66ff\u4ee3\u65b9\u6848<\/td>\n<td>\u9ad8\u6027\u80fd RPC&#xff0c;\u9002\u5408\u5185\u90e8\u670d\u52a1\u901a\u4fe1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>13.4 \u63a8\u8350\u5b66\u4e60\u8def\u5f84<\/h4>\n<p>\u521d\u5b66\u8005\u8def\u5f84&#xff1a;<br \/>\n  \u672c\u6587\u7b2c1-6\u7ae0 \u2192 MCP Inspector \u5b9e\u64cd \u2192 \u5b98\u65b9 Quickstart \u2192 \u6784\u5efa\u7b2c\u4e00\u4e2a\u5de5\u5177<\/p>\n<p>\u8fdb\u9636\u8def\u5f84&#xff1a;<br \/>\n  \u672c\u6587\u7b2c7-9\u7ae0 \u2192 \u9605\u8bfb\u534f\u8bae\u89c4\u8303\u539f\u6587 \u2192 \u7814\u7a76\u5b98\u65b9 SDK \u6e90\u7801 \u2192 \u751f\u4ea7\u90e8\u7f72\u5b9e\u8df5<\/p>\n<p>\u4e13\u5bb6\u8def\u5f84&#xff1a;<br \/>\n  \u672c\u6587\u7b2c10\u7ae0 \u2192 \u53c2\u4e0e MCP \u89c4\u8303\u8ba8\u8bba \u2192 \u8d21\u732e\u5f00\u6e90 MCP Server \u2192 \u4f01\u4e1a\u7ea7\u67b6\u6784\u8bbe\u8ba1<\/p>\n<hr \/>\n<h3>\u9644\u5f55<\/h3>\n<h4>\u9644\u5f55 A&#xff1a;MCP \u534f\u8bae\u5b8c\u6574\u6d88\u606f\u683c\u5f0f\u53c2\u8003<\/h4>\n<p>A.1 \u8bf7\u6c42\u683c\u5f0f&#xff08;JSON-RPC 2.0&#xff09;<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;jsonrpc&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;method&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;tools\/call&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;params&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string-property property\">&#034;name&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;get_current_weather&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string-property property\">&#034;arguments&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;city&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;\u5317\u4eac&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;unit&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;celsius&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>A.2 \u6210\u529f\u54cd\u5e94<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;jsonrpc&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;result&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string-property property\">&#034;content&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">[<\/span><br \/>\n            <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token string-property property\">&#034;type&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;text&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token string-property property\">&#034;text&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;{\\\\&#034;city\\\\&#034;: \\\\&#034;\u5317\u4eac\\\\&#034;, \\\\&#034;temperature\\\\&#034;: 26.5, &#8230;}&#034;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">]<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>A.3 \u9519\u8bef\u54cd\u5e94<\/p>\n<p><span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token string-property property\">&#034;jsonrpc&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;2.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;id&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token string-property property\">&#034;error&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token string-property property\">&#034;code&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">32602<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string-property property\">&#034;message&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;Invalid params: &#039;city&#039; is required&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token string-property property\">&#034;data&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token string-property property\">&#034;field&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;city&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\n            <span class=\"token string-property property\">&#034;constraint&#034;<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">&#034;required&#034;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>A.4 \u6838\u5fc3\u65b9\u6cd5\u5217\u8868<\/p>\n<table>\n<tr>\u65b9\u6cd5\u65b9\u5411\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>initialize<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u521d\u59cb\u5316&#xff08;\u65e0\u72b6\u6001\u6a21\u5f0f\u4e0b\u53ef\u9009&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>tools\/list<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u83b7\u53d6\u6240\u6709\u5de5\u5177\u5217\u8868<\/td>\n<\/tr>\n<tr>\n<td>tools\/call<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u8c03\u7528\u6307\u5b9a\u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>resources\/list<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u83b7\u53d6\u6240\u6709\u8d44\u6e90\u5217\u8868<\/td>\n<\/tr>\n<tr>\n<td>resources\/read<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u8bfb\u53d6\u6307\u5b9a\u8d44\u6e90<\/td>\n<\/tr>\n<tr>\n<td>prompts\/list<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u83b7\u53d6\u6240\u6709\u63d0\u793a\u8bcd\u6a21\u677f<\/td>\n<\/tr>\n<tr>\n<td>prompts\/get<\/td>\n<td>Client \u2192 Server<\/td>\n<td>\u83b7\u53d6\u6307\u5b9a\u63d0\u793a\u8bcd<\/td>\n<\/tr>\n<tr>\n<td>ping<\/td>\n<td>\u53cc\u5411<\/td>\n<td>\u8fde\u901a\u6027\u68c0\u67e5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>\u9644\u5f55 B&#xff1a;FastMCP API \u901f\u67e5\u8868<\/h4>\n<table>\n<tr>API\u8bf4\u660e\u793a\u4f8b<\/tr>\n<tbody>\n<tr>\n<td>FastMCP(name, stateless&#061;True)<\/td>\n<td>\u521b\u5efa\u670d\u52a1\u5668\u5b9e\u4f8b<\/td>\n<td>mcp &#061; FastMCP(&#034;my-server&#034;, stateless&#061;True)<\/td>\n<\/tr>\n<tr>\n<td>&#064;mcp.tool()<\/td>\n<td>\u6ce8\u518c\u5de5\u5177<\/td>\n<td>&#064;mcp.tool() def my_tool(&#8230;)<\/td>\n<\/tr>\n<tr>\n<td>&#064;mcp.resource(&#034;uri&#034;)<\/td>\n<td>\u6ce8\u518c\u8d44\u6e90<\/td>\n<td>&#064;mcp.resource(&#034;config:\/\/info&#034;)<\/td>\n<\/tr>\n<tr>\n<td>&#064;mcp.prompt()<\/td>\n<td>\u6ce8\u518c\u63d0\u793a\u8bcd<\/td>\n<td>&#064;mcp.prompt() def my_prompt(&#8230;)<\/td>\n<\/tr>\n<tr>\n<td>mcp.run(transport&#061;&#8230;)<\/td>\n<td>\u542f\u52a8\u670d\u52a1\u5668<\/td>\n<td>mcp.run(transport&#061;&#034;streamable-http&#034;)<\/td>\n<\/tr>\n<tr>\n<td>mcp.list_tools()<\/td>\n<td>\u5217\u51fa\u5de5\u5177<\/td>\n<td>\u5185\u90e8\u4f7f\u7528<\/td>\n<\/tr>\n<tr>\n<td>mcp.call_tool(name, args)<\/td>\n<td>\u8c03\u7528\u5de5\u5177<\/td>\n<td>\u5185\u90e8\u4f7f\u7528<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>\u9644\u5f55 C&#xff1a;\u5b8c\u6574\u9879\u76ee\u6e90\u7801\u6e05\u5355<\/h4>\n<p>mcp-agent-server\/<br \/>\n\u251c\u2500\u2500 src\/<br \/>\n\u2502   \u251c\u2500\u2500 __init__.py                 # \u5305\u521d\u59cb\u5316<br \/>\n\u2502   \u251c\u2500\u2500 server.py                   # \u4e3b\u5165\u53e3&#xff08;~80\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 config.py                   # \u914d\u7f6e\u7ba1\u7406&#xff08;~40\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 health.py                   # \u5065\u5eb7\u68c0\u67e5&#xff08;~60\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 orchestrator.py             # Agent \u94fe\u7f16\u6392\u5668&#xff08;~200\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 tools\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 weather.py              # \u5929\u6c14\u5de5\u5177&#xff08;~120\u884c&#xff09;<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 database.py             # \u6570\u636e\u5e93\u5de5\u5177&#xff08;~150\u884c&#xff09;<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 search.py              # \u641c\u7d22\u5de5\u5177&#xff08;~80\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 resources\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 knowledge_base.py       # \u77e5\u8bc6\u5e93\u8d44\u6e90&#xff08;~100\u884c&#xff09;<br \/>\n\u2502   \u251c\u2500\u2500 prompts\/<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 templates.py            # \u63d0\u793a\u8bcd\u6a21\u677f&#xff08;~90\u884c&#xff09;<br \/>\n\u2502   \u2514\u2500\u2500 middleware\/<br \/>\n\u2502       \u251c\u2500\u2500 __init__.py<br \/>\n\u2502       \u251c\u2500\u2500 auth.py                 # \u8ba4\u8bc1&#xff08;~100\u884c&#xff09;<br \/>\n\u2502       \u251c\u2500\u2500 rate_limit.py           # \u9650\u6d41&#xff08;~80\u884c&#xff09;<br \/>\n\u2502       \u251c\u2500\u2500 sanitizer.py            # \u8f93\u5165\u6d88\u6bd2&#xff08;~70\u884c&#xff09;<br \/>\n\u2502       \u2514\u2500\u2500 audit.py               # \u5ba1\u8ba1\u65e5\u5fd7&#xff08;~50\u884c&#xff09;<br \/>\n\u251c\u2500\u2500 tests\/<br \/>\n\u2502   \u251c\u2500\u2500 test_tools.py               # \u5de5\u5177\u5355\u5143\u6d4b\u8bd5<br \/>\n\u2502   \u251c\u2500\u2500 test_integration.py         # \u96c6\u6210\u6d4b\u8bd5<br \/>\n\u2502   \u2514\u2500\u2500 diagnose.py                 # \u8bca\u65ad\u811a\u672c<br \/>\n\u251c\u2500\u2500 deploy\/<br \/>\n\u2502   \u251c\u2500\u2500 Dockerfile                  # Docker \u6784\u5efa<br \/>\n\u2502   \u251c\u2500\u2500 docker-compose.yml          # \u7f16\u6392\u914d\u7f6e<br \/>\n\u2502   \u251c\u2500\u2500 nginx\/nginx.conf            # \u53cd\u5411\u4ee3\u7406<br \/>\n\u2502   \u2514\u2500\u2500 k8s\/<br \/>\n\u2502       \u251c\u2500\u2500 deployment.yaml         # K8s \u90e8\u7f72<br \/>\n\u2502       \u251c\u2500\u2500 service.yaml            # K8s \u670d\u52a1<br \/>\n\u2502       \u251c\u2500\u2500 hpa.yaml                # \u81ea\u52a8\u6269\u7f29\u5bb9<br \/>\n\u2502       \u2514\u2500\u2500 ingress.yaml            # \u5165\u53e3\u914d\u7f6e<br \/>\n\u251c\u2500\u2500 .github\/workflows\/<br \/>\n\u2502   \u2514\u2500\u2500 deploy.yml                  # CI\/CD \u6d41\u6c34\u7ebf<br \/>\n\u251c\u2500\u2500 requirements.txt                # Python \u4f9d\u8d56<br \/>\n\u251c\u2500\u2500 pyproject.toml                  # \u9879\u76ee\u914d\u7f6e<br \/>\n\u251c\u2500\u2500 .env.example                    # \u73af\u5883\u53d8\u91cf\u6a21\u677f<br \/>\n\u2514\u2500\u2500 README.md                       # \u9879\u76ee\u8bf4\u660e<\/p>\n<h4>\u9644\u5f55 D&#xff1a;\u672f\u8bed\u8868<\/h4>\n<table>\n<tr>\u672f\u8bed\u82f1\u6587\u5b9a\u4e49<\/tr>\n<tbody>\n<tr>\n<td>MCP<\/td>\n<td>Model Context Protocol<\/td>\n<td>\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae&#xff0c;AI \u4e0e\u5de5\u5177\u901a\u4fe1\u7684\u5f00\u653e\u6807\u51c6<\/td>\n<\/tr>\n<tr>\n<td>Tool<\/td>\n<td>Tool<\/td>\n<td>MCP \u670d\u52a1\u5668\u66b4\u9732\u7684\u53ef\u8c03\u7528\u51fd\u6570<\/td>\n<\/tr>\n<tr>\n<td>Resource<\/td>\n<td>Resource<\/td>\n<td>MCP \u670d\u52a1\u5668\u66b4\u9732\u7684\u53ef\u8bfb\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td>Prompt<\/td>\n<td>Prompt<\/td>\n<td>MCP \u670d\u52a1\u5668\u63d0\u4f9b\u7684\u63d0\u793a\u8bcd\u6a21\u677f<\/td>\n<\/tr>\n<tr>\n<td>Host<\/td>\n<td>Host<\/td>\n<td>\u8fd0\u884c AI \u6a21\u578b\u7684\u5e94\u7528\u7a0b\u5e8f<\/td>\n<\/tr>\n<tr>\n<td>Client<\/td>\n<td>MCP Client<\/td>\n<td>\u5d4c\u5165 Host \u4e2d\u7684\u534f\u8bae\u5ba2\u6237\u7aef<\/td>\n<\/tr>\n<tr>\n<td>Server<\/td>\n<td>MCP Server<\/td>\n<td>\u63d0\u4f9b\u5de5\u5177\/\u8d44\u6e90\/\u63d0\u793a\u8bcd\u7684\u670d\u52a1<\/td>\n<\/tr>\n<tr>\n<td>Transport<\/td>\n<td>Transport<\/td>\n<td>\u901a\u4fe1\u4f20\u8f93\u5c42&#xff08;stdio\/HTTP&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>Streamable HTTP<\/td>\n<td>Streamable HTTP<\/td>\n<td>MCP v2 \u63a8\u8350\u7684 HTTP \u4f20\u8f93\u65b9\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>Stateless<\/td>\n<td>Stateless<\/td>\n<td>\u65e0\u72b6\u6001&#xff0c;\u6bcf\u4e2a\u8bf7\u6c42\u72ec\u7acb\u5904\u7406<\/td>\n<\/tr>\n<tr>\n<td>JSON-RPC<\/td>\n<td>JSON-RPC 2.0<\/td>\n<td>MCP \u5e95\u5c42\u6d88\u606f\u683c\u5f0f\u6807\u51c6<\/td>\n<\/tr>\n<tr>\n<td>FastMCP<\/td>\n<td>FastMCP<\/td>\n<td>Python SDK \u4e2d\u7684\u9ad8\u5c42\u6846\u67b6<\/td>\n<\/tr>\n<tr>\n<td>Inspector<\/td>\n<td>MCP Inspector<\/td>\n<td>\u5b98\u65b9\u53ef\u89c6\u5316\u8c03\u8bd5\u5de5\u5177<\/td>\n<\/tr>\n<tr>\n<td>HPA<\/td>\n<td>Horizontal Pod Autoscaler<\/td>\n<td>K8s \u6c34\u5e73\u81ea\u52a8\u6269\u7f29\u5bb9<\/td>\n<\/tr>\n<tr>\n<td>mTLS<\/td>\n<td>Mutual TLS<\/td>\n<td>\u53cc\u5411 TLS \u8ba4\u8bc1<\/td>\n<\/tr>\n<tr>\n<td>RBAC<\/td>\n<td>Role-Based Access Control<\/td>\n<td>\u57fa\u4e8e\u89d2\u8272\u7684\u8bbf\u95ee\u63a7\u5236<\/td>\n<\/tr>\n<tr>\n<td>Circuit Breaker<\/td>\n<td>Circuit Breaker<\/td>\n<td>\u7194\u65ad\u5668\u6a21\u5f0f<\/td>\n<\/tr>\n<tr>\n<td>Token Bucket<\/td>\n<td>Token Bucket<\/td>\n<td>\u4ee4\u724c\u6876\u9650\u6d41\u7b97\u6cd5<\/td>\n<\/tr>\n<tr>\n<td>SSE<\/td>\n<td>Server-Sent Events<\/td>\n<td>\u670d\u52a1\u7aef\u63a8\u9001\u4e8b\u4ef6&#xff08;\u6d41\u5f0f\u54cd\u5e94&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>AAIF<\/td>\n<td>Agentic AI Foundation<\/td>\n<td>Linux \u57fa\u91d1\u4f1a\u4e0b\u7684 AI Agent \u6cbb\u7406\u7ec4\u7ec7<\/td>\n<\/tr>\n<tr>\n<td>A2A<\/td>\n<td>Agent-to-Agent<\/td>\n<td>Google \u63a8\u51fa\u7684 Agent \u95f4\u901a\u4fe1\u534f\u8bae<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<p>\u672c\u6587\u5b8c<\/p>\n<p>\u6700\u540e\u66f4\u65b0&#xff1a;2026\u5e748\u67085\u65e5<\/p>\n<p>\u57fa\u4e8e MCP \u534f\u8bae\u89c4\u8303\u7248\u672c&#xff1a;2026-07-28&#xff08;v2&#xff09;<\/p>\n<p>\u9002\u7528 SDK \u7248\u672c&#xff1a;Python mcp &gt;&#061; 1.2.0 \/ TypeScript &#064;modelcontextprotocol\/sdk &gt;&#061; 1.3.0<\/p>\n<p>\u5982\u6709\u95ee\u9898\u6216\u5efa\u8bae&#xff0c;\u6b22\u8fce\u5728\u8bc4\u8bba\u533a\u4ea4\u6d41\u3002\u795d\u4f60\u7684 AI Agent \u4e4b\u65c5\u987a\u5229&#xff01;&#x1f680;<\/p>\n<hr \/>\n<hr \/>\n","protected":false},"excerpt":{"rendered":"<p>MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218&#xff1a;\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668\u6458\u8981<br \/>\nModel Context Protocol&#xff08;MCP&#xff09;\u662f\u7531 Anthropic \u4e8e 2024 \u5e74 11 \u6708\u63a8\u51fa\u7684\u5f00\u653e\u6807\u51c6\u534f\u8bae&#xff0c;\u65e8\u5728\u7edf\u4e00\u5927\u8bed\u8a00\u6a21\u578b&#xff08;LLM&#xff09;\u4e0e\u5916\u90e8\u6570\u636e\u6e90\u3001\u5de5\u5177\u4e4b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f\u30022026 \u5e74 7 \u6708 28 \u65e5&#xff0c;MCP \u53d1\u5e03\u4e86\u5177\u6709\u91cc\u7a0b\u7891\u610f\u4e49\u7684 v2 \u89c4\u8303&#xff08;\u534f\u8bae\u7248\u672c\u53f7 2026-07-28&amp;#<\/p>\n","protected":false},"author":2,"featured_media":93859,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[50,43,44],"topic":[],"class_list":["post-93860","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-50","tag-43","tag-44"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/93860.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218&#xff1a;\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668\u6458\u8981 Model Context Protocol&#xff08;MCP&#xff09;\u662f\u7531 Anthropic \u4e8e 2024 \u5e74 11 \u6708\u63a8\u51fa\u7684\u5f00\u653e\u6807\u51c6\u534f\u8bae&#xff0c;\u65e8\u5728\u7edf\u4e00\u5927\u8bed\u8a00\u6a21\u578b&#xff08;LLM&#xff09;\u4e0e\u5916\u90e8\u6570\u636e\u6e90\u3001\u5de5\u5177\u4e4b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f\u30022026 \u5e74 7 \u6708 28 \u65e5&#xff0c;MCP \u53d1\u5e03\u4e86\u5177\u6709\u91cc\u7a0b\u7891\u610f\u4e49\u7684 v2 \u89c4\u8303&#xff08;\u534f\u8bae\u7248\u672c\u53f7 2026-07-28&amp;#\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/93860.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-13T02:41:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260813024108-6a7d2ec409627.jpg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"53 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93860.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/93860.html\",\"name\":\"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-08-13T02:41:11+00:00\",\"dateModified\":\"2026-08-13T02:41:11+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/93860.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/93860.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/93860.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/93860.html","og_locale":"zh_CN","og_type":"article","og_title":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218&#xff1a;\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668\u6458\u8981 Model Context Protocol&#xff08;MCP&#xff09;\u662f\u7531 Anthropic \u4e8e 2024 \u5e74 11 \u6708\u63a8\u51fa\u7684\u5f00\u653e\u6807\u51c6\u534f\u8bae&#xff0c;\u65e8\u5728\u7edf\u4e00\u5927\u8bed\u8a00\u6a21\u578b&#xff08;LLM&#xff09;\u4e0e\u5916\u90e8\u6570\u636e\u6e90\u3001\u5de5\u5177\u4e4b\u95f4\u7684\u901a\u4fe1\u65b9\u5f0f\u30022026 \u5e74 7 \u6708 28 \u65e5&#xff0c;MCP \u53d1\u5e03\u4e86\u5177\u6709\u91cc\u7a0b\u7891\u610f\u4e49\u7684 v2 \u89c4\u8303&#xff08;\u534f\u8bae\u7248\u672c\u53f7 2026-07-28&amp;#","og_url":"https:\/\/www.wsisp.com\/helps\/93860.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-08-13T02:41:11+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/08\/20260813024108-6a7d2ec409627.jpg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"53 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/93860.html","url":"https:\/\/www.wsisp.com\/helps\/93860.html","name":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-08-13T02:41:11+00:00","dateModified":"2026-08-13T02:41:11+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/93860.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/93860.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/93860.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"MCP \u534f\u8bae\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u96f6\u642d\u5efa\u65e0\u72b6\u6001 AI Agent \u670d\u52a1\u5668"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=93860"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/93860\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/93859"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=93860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=93860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=93860"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=93860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}