{"id":177,"date":"2025-06-05T23:43:48","date_gmt":"2025-06-05T15:43:48","guid":{"rendered":"http:\/\/sspacee.com\/?p=177"},"modified":"2025-06-05T23:44:06","modified_gmt":"2025-06-05T15:44:06","slug":"model-context-protocolmcp-%e7%bc%96%e7%a8%8b%e6%9e%81%e9%80%9f%e5%85%a5%e9%97%a8","status":"publish","type":"post","link":"http:\/\/sspacee.com\/?p=177","title":{"rendered":"Model Context Protocol(MCP) \u7f16\u7a0b\u6781\u901f\u5165\u95e8"},"content":{"rendered":"\n<p>\u7b80\u4ecb<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E7%AE%80%E4%BB%8B\"><\/a><\/p>\n\n\n\n<p>\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff08MCP\uff09\u662f\u4e00\u4e2a\u521b\u65b0\u7684\u5f00\u6e90\u534f\u8bae\uff0c\u5b83\u91cd\u65b0\u5b9a\u4e49\u4e86\u5927\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09\u4e0e\u5916\u90e8\u4e16\u754c\u7684\u4e92\u52a8\u65b9\u5f0f\u3002MCP \u63d0\u4f9b\u4e86\u4e00\u79cd\u6807\u51c6\u5316\u65b9\u6cd5\uff0c\u4f7f\u4efb\u610f\u5927\u8bed\u8a00\u6a21\u578b\u80fd\u591f\u8f7b\u677e\u8fde\u63a5\u5404\u79cd\u6570\u636e\u6e90\u548c\u5de5\u5177\uff0c\u5b9e\u73b0\u4fe1\u606f\u7684\u65e0\u7f1d\u8bbf\u95ee\u548c\u5904\u7406\u3002MCP \u5c31\u50cf\u662f AI \u5e94\u7528\u7a0b\u5e8f\u7684 USB-C \u63a5\u53e3\uff0c\u4e3a AI \u6a21\u578b\u63d0\u4f9b\u4e86\u4e00\u79cd\u6807\u51c6\u5316\u7684\u65b9\u5f0f\u6765\u8fde\u63a5\u4e0d\u540c\u7684\u6570\u636e\u6e90\u548c\u5de5\u5177\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250223214308430.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250223214308430.png\" alt=\"image-20250223214308430\"\/><\/a><\/figure>\n\n\n\n<p>MCP \u6709\u4ee5\u4e0b\u51e0\u4e2a\u6838\u5fc3\u529f\u80fd\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Resources \u8d44\u6e90<\/li>\n\n\n\n<li>Prompts \u63d0\u793a\u8bcd<\/li>\n\n\n\n<li>Tools \u5de5\u5177<\/li>\n\n\n\n<li>Sampling \u91c7\u6837<\/li>\n\n\n\n<li>Roots \u6839\u76ee\u5f55<\/li>\n\n\n\n<li>Transports \u4f20\u8f93\u5c42<\/li>\n<\/ul>\n\n\n\n<p>\u56e0\u4e3a\u5927\u90e8\u5206\u529f\u80fd\u5176\u5b9e\u90fd\u662f\u670d\u52a1\u4e8e Claude \u5ba2\u6237\u7aef\u7684\uff0c\u672c\u6587\u66f4\u5e0c\u671b\u7f16\u5199\u7684 MCP \u670d\u52a1\u5668\u670d\u52a1\u4e0e\u901a\u7528\u5927\u8bed\u8a00\u6a21\u578b\uff0c\u6240\u4ee5\u672c\u6587\u5c06\u4f1a\u4e3b\u8981\u4ee5\u201c\u5de5\u5177\u201d\u4e3a\u91cd\u70b9\uff0c\u5176\u4ed6\u529f\u80fd\u4f1a\u653e\u5230\u6700\u540e\u8fdb\u884c\u7b80\u5355\u8bb2\u89e3\u3002<\/p>\n\n\n\n<p>\u5176\u4e2d MCP \u7684\u4f20\u8f93\u5c42\u652f\u6301\u4e86 2 \u79cd\u534f\u8bae\u7684\u5b9e\u73b0\uff1astdio\uff08\u6807\u51c6\u8f93\u5165\/\u8f93\u51fa\uff09\u548c SSE\uff08\u670d\u52a1\u5668\u53d1\u9001\u4e8b\u4ef6\uff09\uff0c\u56e0\u4e3a stdio \u66f4\u4e3a\u5e38\u7528\uff0c\u6240\u4ee5\u672c\u6587\u4f1a\u4ee5 stdio \u4e3a\u4f8b\u8fdb\u884c\u8bb2\u89e3\u3002<\/p>\n\n\n\n<p>\u672c\u6587\u5c06\u4f1a\u4f7f\u7528 3.11 \u7684 Python \u7248\u672c\uff0c\u5e76\u4f7f\u7528 uv \u6765\u7ba1\u7406 Python \u9879\u76ee\u3002\u540c\u65f6\u4ee3\u7801\u5c06\u4f1a\u5728\u6587\u672b\u653e\u5230 Github \u4e0a\uff0c\u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u6211\u4eec\u8fd9\u5c31\u5f00\u59cb\u5427~<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f00\u53d1 MCP \u670d\u52a1\u5668<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E5%BC%80%E5%8F%91-mcp-%E6%9C%8D%E5%8A%A1%E5%99%A8\"><\/a><\/p>\n\n\n\n<p>\u5728\u8fd9\u4e00\u5c0f\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4f1a\u5b9e\u73b0\u4e00\u4e2a\u7528\u4e8e\u7f51\u7edc\u641c\u7d22\u7684\u670d\u52a1\u5668\u3002\u9996\u5148\uff0c\u6211\u4eec\u5148\u6765\u901a\u8fc7 uv \u521d\u59cb\u5316\u6211\u4eec\u7684\u9879\u76ee\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>uv \u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/docs.astral.sh\/uv\/\">https:\/\/docs.astral.sh\/uv\/<\/a><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u521d\u59cb\u5316\u9879\u76ee\nuv init mcp_getting_started\ncd mcp_getting_started\n\n# \u521b\u5efa\u865a\u62df\u73af\u5883\u5e76\u8fdb\u5165\u865a\u62df\u73af\u5883\nuv venv\n.venv\\Scripts\\activate.bat\n\n# \u5b89\u88c5\u4f9d\u8d56\nuv add \"mcp[cli]\" httpx openai\n<\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u6765\u521b\u5efa\u4e00\u4e2a\u53eb&nbsp;<code>web_search.py<\/code>&nbsp;\u6587\u4ef6\uff0c\u6765\u5b9e\u73b0\u6211\u4eec\u7684\u670d\u52a1\u3002MCP \u4e3a\u6211\u4eec\u63d0\u4f9b\u4e862\u4e2a\u5bf9\u8c61\uff1a<code>mcp.server.FastMCP<\/code>&nbsp;\u548c&nbsp;<code>mcp.server.Server<\/code>\uff0c<code>mcp.server.FastMCP<\/code>&nbsp;\u662f\u66f4\u9ad8\u5c42\u7684\u5c01\u88c5\uff0c\u6211\u4eec\u8fd9\u91cc\u5c31\u6765\u4f7f\u7528\u5b83\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import httpx\nfrom mcp.server import FastMCP\n\n# # \u521d\u59cb\u5316 FastMCP \u670d\u52a1\u5668\napp = FastMCP('web-search')<\/pre>\n\n\n\n<p>\u5b9e\u73b0\u6267\u884c\u7684\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0cMCP \u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a&nbsp;<code>@mcp.tool()<\/code>&nbsp;\u6211\u4eec\u53ea\u9700\u8981\u5c06\u5b9e\u73b0\u51fd\u6570\u7528\u8fd9\u4e2a\u88c5\u9970\u5668\u88c5\u9970\u5373\u53ef\u3002\u51fd\u6570\u540d\u79f0\u5c06\u4f5c\u4e3a\u5de5\u5177\u540d\u79f0\uff0c\u53c2\u6570\u5c06\u4f5c\u4e3a\u5de5\u5177\u53c2\u6570\uff0c\u5e76\u901a\u8fc7\u6ce8\u91ca\u6765\u63cf\u8ff0\u5de5\u5177\u4e0e\u53c2\u6570\uff0c\u4ee5\u53ca\u8fd4\u56de\u503c\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u76f4\u63a5\u4f7f\u7528\u667a\u8c31\u7684\u63a5\u53e3\uff0c\u5b83\u8fd9\u4e2a\u63a5\u53e3\u4e0d\u4ec5\u80fd\u5e2e\u6211\u4eec\u641c\u7d22\u5230\u76f8\u5173\u7684\u7ed3\u679c\u94fe\u63a5\uff0c\u5e76\u5e2e\u6211\u4eec\u751f\u6210\u4e86\u5bf9\u5e94\u94fe\u63a5\u4e2d\u6587\u7ae0\u603b\u7ed3\u540e\u7684\u5185\u5bb9\u7684\uff0c<del>\u5e76\u4e14\u73b0\u9636\u6bb5\u662f\u514d\u8d39\u7684<\/del>(\u76ee\u524d\u5df2\u7ecf\u5f00\u59cb\u6536\u8d39\uff0c0.03\u5143\/\u6b21)\uff0c\u975e\u5e38\u9002\u5408\u6211\u4eec\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/bigmodel.cn\/dev\/api\/search-tool\/web-search-pro\">https:\/\/bigmodel.cn\/dev\/api\/search-tool\/web-search-pro<\/a><\/p>\n\n\n\n<p>API Key \u751f\u6210\u5730\u5740\uff1a<a href=\"https:\/\/bigmodel.cn\/usercenter\/proj-mgmt\/apikeys\">https:\/\/bigmodel.cn\/usercenter\/proj-mgmt\/apikeys<\/a><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-preformatted\">@app.tool()\nasync def web_search(query: str) -&gt; str:\n    \"\"\"\n    \u641c\u7d22\u4e92\u8054\u7f51\u5185\u5bb9\n\n    Args:\n        query: \u8981\u641c\u7d22\u5185\u5bb9\n\n    Returns:\n        \u641c\u7d22\u7ed3\u679c\u7684\u603b\u7ed3\n    \"\"\"\n\n    async with httpx.AsyncClient() as client:\n        response = await client.post(\n            'https:\/\/open.bigmodel.cn\/api\/paas\/v4\/tools',\n            headers={'Authorization': '\u6362\u6210\u4f60\u81ea\u5df1\u7684API KEY'},\n            json={\n                'tool': 'web-search-pro',\n                'messages': [\n                    {'role': 'user', 'content': query}\n                ],\n                'stream': False\n            }\n        )\n\n        res_data = []\n        for choice in response.json()['choices']:\n            for message in choice['message']['tool_calls']:\n                search_results = message.get('search_result')\n                if not search_results:\n                    continue\n                for result in search_results:\n                    res_data.append(result['content'])\n\n        return '\\n\\n\\n'.join(res_data)<\/pre>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u6765\u6dfb\u52a0\u8fd0\u884c\u670d\u52a1\u5668\u7684\u4ee3\u7801\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if __name__ == \"__main__\":\n    app.run(transport='stdio')<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u8c03\u8bd5 MCP \u670d\u52a1\u5668<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E8%B0%83%E8%AF%95-mcp-%E6%9C%8D%E5%8A%A1%E5%99%A8\"><\/a><\/p>\n\n\n\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u5c31\u5b8c\u6210\u4e86 MCP \u670d\u52a1\u7aef\u7684\u7f16\u5199\u3002\u4e0b\u9762\uff0c\u6211\u4eec\u6765\u4f7f\u7528\u5b98\u65b9\u63d0\u4f9b\u7684&nbsp;<code>Inspector<\/code>&nbsp;\u53ef\u89c6\u5316\u5de5\u5177\u6765\u8c03\u8bd5\u6211\u4eec\u7684\u670d\u52a1\u5668\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e24\u79cd\u65b9\u6cd5\u6765\u8fd0\u884c<code>Inspector<\/code>\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u8bf7\u5148\u786e\u4fdd\u5df2\u7ecf\u5b89\u88c5\u4e86 node \u73af\u5883\u3002<\/p>\n<\/blockquote>\n\n\n\n<p>\u901a\u8fc7 npx\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">npx -y @modelcontextprotocol\/inspector &lt;command&gt; &lt;arg1&gt; &lt;arg2&gt;<\/pre>\n\n\n\n<p>\u6211\u4eec\u7684\u8fd9\u4e2a\u4ee3\u7801\u8fd0\u884c\u547d\u4ee4\u4e3a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">npx -y @modelcontextprotocol\/inspector uv run web_search.py<\/pre>\n\n\n\n<p>\u901a\u8fc7 mcp dev \u6765\u8fd0\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mcp dev PYTHONFILE<\/pre>\n\n\n\n<p>\u6211\u4eec\u7684\u8fd9\u4e2a\u4ee3\u7801\u8fd0\u884c\u547d\u4ee4\u4e3a\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mcp dev web_search.py<\/pre>\n\n\n\n<p>\u5f53\u51fa\u73b0\u5982\u4e0b\u63d0\u793a\u5219\u4ee3\u8868\u8fd0\u884c\u6210\u529f\u3002\u5982\u679c\u63d0\u793a\u8fde\u63a5\u51fa\u9519\uff0c\u53ef\u80fd\u662f\u7aef\u53e3\u88ab\u5360\u7528\uff0c\u53ef\u4ee5\u770b\u8fd9\u4e2a issue \u7684\u89e3\u51b3\u65b9\u6cd5\uff1a<a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/issues\/6\">#6<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250223223638135.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250223223638135.png\" alt=\"image-20250223223638135\"\/><\/a><\/figure>\n\n\n\n<p>\u7136\u540e\uff0c\u6211\u4eec\u6253\u5f00\u8fd9\u4e2a\u5730\u5740\uff0c\u70b9\u51fb\u5de6\u4fa7\u7684&nbsp;<code>Connect<\/code>&nbsp;\u6309\u94ae\uff0c\u5373\u53ef\u8fde\u63a5\u6211\u4eec\u521a\u5199\u7684\u670d\u52a1\u3002\u7136\u540e\u6211\u4eec\u5207\u6362\u5230&nbsp;<code>Tools<\/code>&nbsp;\u680f\u4e2d\uff0c\u70b9\u51fb&nbsp;<code>List Tools<\/code>&nbsp;\u6309\u94ae\u5373\u53ef\u770b\u5230\u6211\u4eec\u521a\u5199\u7684\u5de5\u5177\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f00\u59cb\u8fdb\u884c\u8c03\u8bd5\u5566\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250223224052795.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250223224052795.png\" alt=\"image-20250223224052795\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f00\u53d1 MCP \u5ba2\u6237\u7aef<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E5%BC%80%E5%8F%91-mcp-%E5%AE%A2%E6%88%B7%E7%AB%AF\"><\/a><\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5148\u6765\u770b\u770b\u5982\u4f55\u5728\u5ba2\u6237\u7aef\u5982\u4f55\u8c03\u7528\u6211\u4eec\u521a\u624d\u5f00\u53d1\u7684 MCP \u670d\u52a1\u5668\u4e2d\u7684\u5de5\u5177\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import asyncio\n\nfrom mcp.client.stdio import stdio_client\nfrom mcp import ClientSession, StdioServerParameters\n\n# \u4e3a stdio \u8fde\u63a5\u521b\u5efa\u670d\u52a1\u5668\u53c2\u6570\nserver_params = StdioServerParameters(\n    # \u670d\u52a1\u5668\u6267\u884c\u7684\u547d\u4ee4\uff0c\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528 uv \u6765\u8fd0\u884c web_search.py\n    command='uv',\n    # \u8fd0\u884c\u7684\u53c2\u6570\n    args=['run', 'web_search.py'],\n    # \u73af\u5883\u53d8\u91cf\uff0c\u9ed8\u8ba4\u4e3a None\uff0c\u8868\u793a\u4f7f\u7528\u5f53\u524d\u73af\u5883\u53d8\u91cf\n    # env=None\n)\n\n\nasync def main():\n    # \u521b\u5efa stdio \u5ba2\u6237\u7aef\n    async with stdio_client(server_params) as (stdio, write):\n        # \u521b\u5efa ClientSession \u5bf9\u8c61\n        async with ClientSession(stdio, write) as session:\n            # \u521d\u59cb\u5316 ClientSession\n            await session.initialize()\n\n            # \u5217\u51fa\u53ef\u7528\u7684\u5de5\u5177\n            response = await session.list_tools()\n            print(response)\n\n            # \u8c03\u7528\u5de5\u5177\n            response = await session.call_tool('web_search', {'query': '\u4eca\u5929\u676d\u5dde\u5929\u6c14'})\n            print(response)\n\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<p>\u56e0\u4e3a\u6211\u4eec\u7684python\u811a\u672c\u9700\u8981\u5728\u865a\u62df\u73af\u5883\u4e2d\u624d\u80fd\u8fd0\u884c\uff0c\u6240\u4ee5\u8fd9\u91cc\u6211\u4eec\u901a\u8fc7&nbsp;<code>uv<\/code>&nbsp;\u6765\u542f\u52a8\u6211\u4eec\u7684\u811a\u672c\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u6211\u4eec\u6765\u901a\u8fc7\u4e00\u4e2a\u5c0f\u4f8b\u5b50\u6765\u770b\u770b\u5982\u4f55\u8ba9&nbsp;<code>DeepSeek<\/code>&nbsp;\u6765\u8c03\u7528\u6211\u4eec MCP \u670d\u52a1\u5668\u4e2d\u7684\u65b9\u6cd5\u3002<\/p>\n\n\n\n<p>\u8fd9\u91cc\u6211\u4eec\u4f1a\u7528&nbsp;<code>dotenv<\/code>&nbsp;\u6765\u7ba1\u7406\u6211\u4eec\u76f8\u5173\u7684\u73af\u5883\u53d8\u91cf\u3002.env \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">OPENAI_API_KEY=sk-89baxxxxxxxxxxxxxxxxxx\nOPENAI_BASE_URL=https:\/\/api.deepseek.com\nOPENAI_MODEL=deepseek-chat<\/pre>\n\n\n\n<p>\u9996\u5148\u6211\u4eec\u6765\u7f16\u5199\u6211\u4eec\u7684&nbsp;<code>MCPClient<\/code>&nbsp;\u7c7b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import json\nimport asyncio\nimport os\nfrom typing import Optional\nfrom contextlib import AsyncExitStack\n\nfrom openai import OpenAI\nfrom dotenv import load_dotenv\n\nfrom mcp import ClientSession, StdioServerParameters\nfrom mcp.client.stdio import stdio_client\n\n\nload_dotenv()\n\n\nclass MCPClient:\n    def __init__(self):\n        self.session: Optional[ClientSession] = None\n        self.exit_stack = AsyncExitStack()\n        self.client = OpenAI()<\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u6dfb\u52a0&nbsp;<code>connect_to_server<\/code>&nbsp;\u65b9\u6cd5\u6765\u521d\u59cb\u5316\u6211\u4eec\u7684 MCP \u670d\u52a1\u5668\u7684 session\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    async def connect_to_server(self):\n        server_params = StdioServerParameters(\n            command='uv',\n            args=['run', 'web_search.py'],\n            env=None\n        )\n\n        stdio_transport = await self.exit_stack.enter_async_context(\n            stdio_client(server_params))\n        stdio, write = stdio_transport\n        self.session = await self.exit_stack.enter_async_context(\n            ClientSession(stdio, write))\n\n        await self.session.initialize()<\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u518d\u5b9e\u73b0\u4e00\u4e2a\u7528\u4e8e\u8c03\u7528 MCP \u670d\u52a1\u5668\u7684\u65b9\u6cd5\u6765\u5904\u7406\u548c DeepSeek \u4e4b\u95f4\u7684\u4ea4\u4e92\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    async def process_query(self, query: str) -&gt; str:\n        # \u8fd9\u91cc\u9700\u8981\u901a\u8fc7 system prompt \u6765\u7ea6\u675f\u4e00\u4e0b\u5927\u8bed\u8a00\u6a21\u578b\uff0c\n        # \u5426\u5219\u4f1a\u51fa\u73b0\u4e0d\u8c03\u7528\u5de5\u5177\uff0c\u81ea\u5df1\u4e71\u56de\u7b54\u7684\u60c5\u51b5\n        system_prompt = (\n            \"You are a helpful assistant.\"\n            \"You have the function of online search. \"\n            \"Please MUST call web_search tool to search the Internet content before answering.\"\n            \"Please do not lose the user's question information when searching,\"\n            \"and try to maintain the completeness of the question content as much as possible.\"\n            \"When there is a date related question in the user's question,\" \n            \"please use the search function directly to search and PROHIBIT inserting specific time.\"\n        )\n        \n        messages = [\n            {\"role\": \"system\", \"content\": system_prompt},\n            {\"role\": \"user\", \"content\": query}\n        ]\n\n        # \u83b7\u53d6\u6240\u6709 mcp \u670d\u52a1\u5668 \u5de5\u5177\u5217\u8868\u4fe1\u606f\n        response = await self.session.list_tools()\n        # \u751f\u6210 function call \u7684\u63cf\u8ff0\u4fe1\u606f\n        available_tools = [{\n            \"type\": \"function\",\n            \"function\": {\n                \"name\": tool.name,\n                \"description\": tool.description,\n                \"input_schema\": tool.inputSchema\n            }\n        } for tool in response.tools]\n\n        # \u8bf7\u6c42 deepseek\uff0cfunction call \u7684\u63cf\u8ff0\u4fe1\u606f\u901a\u8fc7 tools \u53c2\u6570\u4f20\u5165\n        response = self.client.chat.completions.create(\n            model=os.getenv(\"OPENAI_MODEL\"),\n            messages=messages,\n            tools=available_tools\n        )\n\n        # \u5904\u7406\u8fd4\u56de\u7684\u5185\u5bb9\n        content = response.choices[0]\n        if content.finish_reason == \"tool_calls\":\n            # \u5982\u4f55\u662f\u9700\u8981\u4f7f\u7528\u5de5\u5177\uff0c\u5c31\u89e3\u6790\u5de5\u5177\n            tool_call = content.message.tool_calls[0]\n            tool_name = tool_call.function.name\n            tool_args = json.loads(tool_call.function.arguments)\n\n            # \u6267\u884c\u5de5\u5177\n            result = await self.session.call_tool(tool_name, tool_args)\n            print(f\"\\n\\n[Calling tool {tool_name} with args {tool_args}]\\n\\n\")\n\t\t\t\n            # \u5c06 deepseek \u8fd4\u56de\u7684\u8c03\u7528\u54ea\u4e2a\u5de5\u5177\u6570\u636e\u548c\u5de5\u5177\u6267\u884c\u5b8c\u6210\u540e\u7684\u6570\u636e\u90fd\u5b58\u5165messages\u4e2d\n            messages.append(content.message.model_dump())\n            messages.append({\n                \"role\": \"tool\",\n                \"content\": result.content[0].text,\n                \"tool_call_id\": tool_call.id,\n            })\n\n            # \u5c06\u4e0a\u9762\u7684\u7ed3\u679c\u518d\u8fd4\u56de\u7ed9 deepseek \u7528\u4e8e\u751f\u4ea7\u6700\u7ec8\u7684\u7ed3\u679c\n            response = self.client.chat.completions.create(\n                model=os.getenv(\"OPENAI_MODEL\"),\n                messages=messages,\n            )\n            return response.choices[0].message.content\n\n        return content.message.content<\/pre>\n\n\n\n<p>\u63a5\u7740\uff0c\u6211\u4eec\u6765\u5b9e\u73b0\u5faa\u73af\u63d0\u95ee\u548c\u6700\u540e\u9000\u51fa\u540e\u5173\u95edsession\u7684\u64cd\u4f5c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    async def chat_loop(self):\n        while True:\n            try:\n                query = input(\"\\nQuery: \").strip()\n\n                if query.lower() == 'quit':\n                    break\n\n                response = await self.process_query(query)\n                print(\"\\n\" + response)\n\n            except Exception as e:\n                import traceback\n                traceback.print_exc()\n\n    async def cleanup(self):\n        \"\"\"Clean up resources\"\"\"\n        await self.exit_stack.aclose()<\/pre>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u6765\u5b8c\u6210\u8fd0\u884c\u8fd9\u4e2a\u5ba2\u6237\u7aef\u76f8\u5173\u7684\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">async def main():\n    client = MCPClient()\n    try:\n        await client.connect_to_server()\n        await client.chat_loop()\n    finally:\n        await client.cleanup()\n\n\nif __name__ == \"__main__\":\n    import sys\n\n    asyncio.run(main())<\/pre>\n\n\n\n<p>\u8fd9\u662f\u4e00\u4e2a\u6700\u7cbe\u7b80\u7684\u4ee3\u7801\uff0c\u91cc\u9762\u6ca1\u6709\u5b9e\u73b0\u8bb0\u5f55\u4e0a\u4e0b\u6587\u6d88\u606f\u7b49\u529f\u80fd\uff0c\u53ea\u662f\u4e3a\u4e86\u7528\u6700\u7b80\u5355\u7684\u4ee3\u7801\u6765\u4e86\u89e3\u5982\u4f55\u901a\u8fc7\u5927\u8bed\u8a00\u6a21\u578b\u6765\u8c03\u52a8 MCP \u670d\u52a1\u5668\u3002\u8fd9\u91cc\u53ea\u6f14\u793a\u4e86\u5982\u4f55\u8fde\u63a5\u5355\u670d\u52a1\u5668\uff0c\u5982\u679c\u4f60\u671f\u671b\u8fde\u63a5\u591a\u4e2a MCP \u670d\u52a1\u5668\uff0c\u65e0\u975e\u5c31\u662f\u5faa\u73af\u4e00\u4e0b&nbsp;<code>connect_to_server<\/code>&nbsp;\u4e2d\u7684\u4ee3\u7801\uff0c\u53ef\u4ee5\u5c06\u4ed6\u4eec\u5c01\u88c5\u6210\u4e00\u4e2a\u7c7b\uff0c\u7136\u540e\u5c06\u6240\u6709\u7684 MCP \u670d\u52a1\u5668\u4e2d\u7684\u5de5\u5177\u5faa\u73af\u904d\u5386\u751f\u6210\u4e00\u4e2a\u5927\u7684&nbsp;<code>available_tools<\/code>\uff0c\u7136\u540e\u5728\u901a\u8fc7\u5927\u8bed\u8a00\u6a21\u578b\u7684\u8fd4\u56de\u7ed3\u679c\u8fdb\u884c\u8c03\u7528\u5373\u53ef\uff0c\u8fd9\u91cc\u5c31\u4e0d\u518d\u8d58\u8ff0\u4e86\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6848\u4f8b\uff1a<a href=\"https:\/\/github.com\/modelcontextprotocol\/python-sdk\/blob\/main\/examples\/clients\/simple-chatbot\/mcp_simple_chatbot\/main.py\">https:\/\/github.com\/modelcontextprotocol\/python-sdk\/blob\/main\/examples\/clients\/simple-chatbot\/mcp_simple_chatbot\/main.py<\/a><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Sampling \u8bb2\u89e3<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#sampling-%E8%AE%B2%E8%A7%A3\"><\/a><\/p>\n\n\n\n<p>MCP \u8fd8\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a&nbsp;<code>Sampling<\/code>&nbsp;\u7684\u529f\u80fd\uff0c\u8fd9\u4e2a\u5982\u679c\u4ece\u5b57\u9762\u6765\u7406\u89e3\u4f1a\u8ba9\u4eba\u6478\u4e0d\u5230\u5934\u8111\uff0c\u4f46\u5b9e\u9645\u4e0a\u8fd9\u4e2a\u529f\u80fd\u5c31\u7ed9\u4e86\u6211\u4eec\u4e00\u4e2a\u5728\u6267\u884c\u5de5\u5177\u7684\u524d\u540e\u7684\u63a5\u53e3\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u5de5\u5177\u6267\u884c\u524d\u540e\u6765\u6267\u884c\u4e00\u4e9b\u64cd\u4f5c\u3002\u6bd4\u5982\uff0c\u5f53\u8c03\u7528\u672c\u5730\u6587\u4ef6\u7684\u5220\u9664\u7684\u5de5\u5177\u7684\u65f6\u5019\uff0c\u80af\u5b9a\u662f\u671f\u671b\u6211\u4eec\u786e\u8ba4\u540e\u518d\u8fdb\u884c\u5220\u9664\u3002\u90a3\u4e48\uff0c\u6b64\u65f6\u5c31\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2a\u529f\u80fd\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u6211\u4eec\u5c31\u6765\u5b9e\u73b0\u8fd9\u4e2a\u4eba\u5de5\u76d1\u7763\u7684\u5c0f\u529f\u80fd\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u6765\u521b\u5efa\u4e2a\u6a21\u62df\u62e5\u6709\u5220\u9664\u6587\u4ef6\u7684 MCP \u670d\u52a1\u5668\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u670d\u52a1\u7aef\nfrom mcp.server import FastMCP\nfrom mcp.types import SamplingMessage, TextContent\n\napp = FastMCP('file_server')\n\n\n@app.tool()\nasync def delete_file(file_path: str):\n    # \u521b\u5efa SamplingMessage \u7528\u4e8e\u89e6\u53d1 sampling callback \u51fd\u6570\n    result = await app.get_context().session.create_message(\n        messages=[\n            SamplingMessage(\n                role='user', content=TextContent(\n                    type='text', text=f'\u662f\u5426\u8981\u5220\u9664\u6587\u4ef6: {file_path} (Y)')\n            )\n        ],\n        max_tokens=100\n    )\n\n    # \u83b7\u53d6\u5230 sampling callback \u51fd\u6570\u7684\u8fd4\u56de\u503c\uff0c\u5e76\u6839\u636e\u8fd4\u56de\u503c\u8fdb\u884c\u5904\u7406\n    if result.content.text == 'Y':\n        return f'\u6587\u4ef6 {file_path} \u5df2\u88ab\u5220\u9664\uff01\uff01'\n\n\nif __name__ == '__main__':\n    app.run(transport='stdio')<\/pre>\n\n\n\n<p>\u8fd9\u91cc\u6700\u91cd\u8981\u7684\u5c31\u662f\u9700\u8981\u901a\u8fc7<code>create_message<\/code>\u65b9\u6cd5\u6765\u521b\u5efa\u4e00\u4e2a&nbsp;<code>SamplingMessage<\/code>&nbsp;\u7c7b\u578b\u7684 message\uff0c\u4ed6\u4f1a\u5c06\u8fd9\u4e2a message \u53d1\u9001\u7ed9 sampling callback \u5bf9\u5e94\u7684\u51fd\u6570\u4e2d\u3002<\/p>\n\n\n\n<p>\u63a5\u7740\uff0c\u6211\u4eec\u6765\u521b\u5efa\u5ba2\u6237\u7aef\u7684\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u5ba2\u6237\u7aef\nimport asyncio\n\nfrom mcp.client.stdio import stdio_client\nfrom mcp import ClientSession, StdioServerParameters\nfrom mcp.shared.context import RequestContext\nfrom mcp.types import (\n    TextContent,\n    CreateMessageRequestParams,\n    CreateMessageResult,\n)\n\nserver_params = StdioServerParameters(\n    command='uv',\n    args=['run', 'file_server.py'],\n)\n\n\nasync def sampling_callback(\n        context: RequestContext[ClientSession, None],\n        params: CreateMessageRequestParams,\n):\n    # \u83b7\u53d6\u5de5\u5177\u53d1\u9001\u7684\u6d88\u606f\u5e76\u663e\u793a\u7ed9\u7528\u6237\n    input_message = input(params.messages[0].content.text)\n    # \u5c06\u7528\u6237\u8f93\u5165\u53d1\u9001\u56de\u5de5\u5177\n    return CreateMessageResult(\n        role='user',\n        content=TextContent(\n            type='text',\n            text=input_message.strip().upper() or 'Y'\n        ),\n        model='user-input',\n        stopReason='endTurn'\n    )\n\n\nasync def main():\n    async with stdio_client(server_params) as (stdio, write):\n        async with ClientSession(\n                stdio, write,\n                # \u8bbe\u7f6e sampling_callback \u5bf9\u5e94\u7684\u65b9\u6cd5\n                sampling_callback=sampling_callback\n        ) as session:\n            await session.initialize()\n            res = await session.call_tool(\n                'delete_file',\n                {'file_path': 'C:\/xxx.txt'}\n            )\n            # \u83b7\u53d6\u5de5\u5177\u6700\u540e\u6267\u884c\u5b8c\u7684\u8fd4\u56de\u7ed3\u679c\n            print(res)\n\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<p>\u7279\u522b\u8981\u6ce8\u610f\u7684\u662f\uff0c\u76ee\u524d\u5728\u5de5\u5177\u91cc\u9762\u6253\u5370\u7684\u5185\u5bb9\u5b9e\u9645\u4e0a\u4f7f\u7528&nbsp;<code>stdio_client<\/code>&nbsp;\u662f\u65e0\u6cd5\u663e\u793a\u5230\u547d\u4ee4\u884c\u7a97\u53e3\u7684\u3002\u6240\u4ee5\uff0c\u6211\u4eec\u8c03\u8bd5\u7684\u8bdd\uff0c\u53ef\u4ee5\u4f7f\u7528&nbsp;<code>mcp.shared.memory.create_connected_server_and_client_session<\/code>\u3002<\/p>\n\n\n\n<p>\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u5ba2\u6237\u7aef\nfrom mcp.shared.memory import (\n    create_connected_server_and_client_session as create_session\n)\n# \u8fd9\u91cc\u9700\u8981\u5f15\u5165\u670d\u52a1\u7aef\u7684 app \u5bf9\u8c61\nfrom file_server import app\n\nasync def sampling_callback(context, params):\n    ...\n\nasync def main():\n    async with create_session(\n        app._mcp_server,\n        sampling_callback=sampling_callback\n    ) as client_session:\n        await client_session.call_tool(\n            'delete_file', \n            {'file_path': 'C:\/xxx.txt'}\n        )\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Claude Desktop \u52a0\u8f7d MCP Server<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#claude-desktop-%E5%8A%A0%E8%BD%BD-mcp-server\"><\/a><\/p>\n\n\n\n<p>\u56e0\u4e3a\u540e\u9762\u7684\u4e24\u4e2a\u529f\u80fd\u5b9e\u9645\u4e0a\u90fd\u662f\u4e3a\u4e86\u63d0\u4f9b\u7ed9 Claude \u684c\u9762\u7aef\u7528\u7684\uff0c\u6240\u4ee5\u8fd9\u91cc\u5148\u8bf4\u4e0b\u5982\u4f55\u52a0\u8f7d\u6211\u4eec\u81ea\u5b9a\u4e49\u7684 MCP Server \u5230 Claude \u684c\u9762\u7aef\u3002<\/p>\n\n\n\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5148\u6253\u5f00\u914d\u7f6e\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250227221154638.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250227221154638.png\" alt=\"image-20250227221154638\"\/><\/a><\/figure>\n\n\n\n<p>\u6211\u4eec\u70b9\u51fb&nbsp;<code>Developer<\/code>&nbsp;\u83dc\u5355\uff0c\u7136\u540e\u70b9\u51fb&nbsp;<code>Edit Config<\/code>&nbsp;\u6309\u94ae\u6253\u5f00 Claude \u684c\u9762\u7aef\u7684\u914d\u7f6e\u6587\u4ef6&nbsp;<code>claude_desktop_config.json<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250227221302174.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250227221302174.png\" alt=\"image-20250227221302174\"\/><\/a><\/figure>\n\n\n\n<p>\u7136\u540e\u5f00\u59cb\u6dfb\u52a0\u6211\u4eec\u7684\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u9700\u8981\u5728&nbsp;<code>mcpServers<\/code>&nbsp;\u5c42\u7ea7\u4e0b\uff0c\u53c2\u6570\u6709&nbsp;<code>command<\/code>\u3001<code>args<\/code>\u3001<code>env<\/code>\u3002\u5b9e\u9645\u4e0a\uff0c\u53c2\u6570\u548c&nbsp;<code>StdioServerParameters<\/code>&nbsp;\u5bf9\u8c61\u521d\u59cb\u5316\u65f6\u5019\u7684\u53c2\u6570\u662f\u4e00\u6837\u7684\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"mcpServers\": {\n    \"web-search-server\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"--directory\",\n        \"D:\/projects\/mcp_getting_started\",\n        \"run\",\n        \"web_search.py\"\n      ]\n    }\n  }\n}<\/pre>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u4fdd\u5b58\u6587\u4ef6\u540e\u91cd\u542f Claude \u684c\u9762\u7aef\u5c31\u53ef\u4ee5\u5728\u8fd9\u91cc\u770b\u5230\u6211\u4eec\u7684\u63d2\u4ef6\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250227221911231.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250227221911231.png\" alt=\"image-20250227221911231\"\/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250227221921036.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250227221921036.png\" alt=\"image-20250227221921036\"\/><\/a><\/figure>\n\n\n\n<p>\u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728\u6211\u4eec\u63d2\u4ef6\u7684\u76ee\u5f55\u4e0b\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u76f4\u63a5\u5b89\u88c5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mcp install web_search.py<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5176\u4ed6\u529f\u80fd<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E5%85%B6%E4%BB%96%E5%8A%9F%E8%83%BD\"><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prompt<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#prompt\"><\/a><\/p>\n\n\n\n<p>MCP \u8fd8\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\u751f\u6210 Prompt \u6a21\u677f\u7684\u529f\u80fd\u3002\u4ed6\u4f7f\u7528\u8d77\u6765\u4e5f\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u4f7f\u7528&nbsp;<code>prompt<\/code>&nbsp;\u88c5\u9970\u5668\u88c5\u9970\u4e00\u4e0b\u5373\u53ef\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">from mcp.server import FastMCP\n\napp = FastMCP('prompt_and_resources')\n\n@app.prompt('\u7ffb\u8bd1\u4e13\u5bb6')\nasync def translate_expert(\n        target_language: str = 'Chinese',\n) -&gt; str:\n    return f'\u4f60\u662f\u4e00\u4e2a\u7ffb\u8bd1\u4e13\u5bb6\uff0c\u64c5\u957f\u5c06\u4efb\u4f55\u8bed\u8a00\u7ffb\u8bd1\u6210{target_language}\u3002\u8bf7\u7ffb\u8bd1\u4ee5\u4e0b\u5185\u5bb9\uff1a'\n\n\nif __name__ == '__main__':\n    app.run(transport='stdio')<\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u7528\u4e0a\u4e00\u8282\u8bb2\u5230\u7684\u914d\u7f6e Claude \u684c\u9762\u7aef MCP \u670d\u52a1\u5668\u7684\u65b9\u6cd5\u6dfb\u52a0\u4e0b\u6211\u4eec\u7684\u65b0 MCP \u670d\u52a1\u5668\u3002\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u70b9\u51fb\u53f3\u4e0b\u89d2\u7684\u56fe\u6807\u5f00\u59cb\u4f7f\u7528\u5566\u3002<\/p>\n\n\n\n<p>\u4ed6\u4f1a\u8ba9\u6211\u4eec\u8bbe\u7f6e\u4e00\u4e0b\u6211\u4eec\u4f20\u5165\u7684\u53c2\u6570\uff0c\u7136\u540e\u4ed6\u4f1a\u5728\u6211\u4eec\u7684\u804a\u5929\u7a97\u53e3\u4e0a\u751f\u6210\u4e00\u4e2a\u9644\u4ef6\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/mcp001-1740666812436-2.gif\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/mcp001-1740666812436-2.gif\" alt=\"mcp001\"\/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Resource<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#resource\"><\/a><\/p>\n\n\n\n<p>\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728 Claude \u5ba2\u6237\u7aef\u4e0a\u9009\u62e9\u6211\u4eec\u4e3a\u7528\u6237\u63d0\u4f9b\u7684\u9884\u8bbe\u8d44\u6e90\uff0c\u540c\u65f6\u4e5f\u652f\u6301\u81ea\u5b9a\u4e49\u7684\u534f\u8bae\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">from mcp.server import FastMCP\n\napp = FastMCP('prompt_and_resources')\n\n@app.resource('echo:\/\/static')\nasync def echo_resource():\n    # \u8fd4\u56de\u7684\u662f\uff0c\u5f53\u7528\u6237\u4f7f\u7528\u8fd9\u4e2a\u8d44\u6e90\u65f6\uff0c\u8d44\u6e90\u7684\u5185\u5bb9\n    return 'Echo!'\n\n@app.resource('greeting:\/\/{name}')\nasync def get_greeting(name):\n    return f'Hello, {name}!'\n\n\nif __name__ == '__main__':\n    app.run(transport='stdio')<\/pre>\n\n\n\n<p>\u7136\u540e\uff0c\u6211\u4eec\u5230 Claude \u684c\u9762\u7aef\u4e0a\u770b\u770b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/mcp002.gif\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/mcp002.gif\" alt=\"mcp002\"\/><\/a><\/figure>\n\n\n\n<p>\u8fd9\u91cc\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff0c\u76ee\u524d Claude \u684c\u9762\u7aef\u662f\u6ca1\u6cd5\u8bfb\u5230\u8d44\u6e90\u88c5\u9970\u5668\u8bbe\u7f6e&nbsp;<code>greeting:\/\/{name}<\/code>&nbsp;\u8fd9\u79cd\u901a\u914d\u7b26\u7684\u8def\u5f84\uff0c\u672a\u6765\u5c06\u4f1a\u88ab\u652f\u6301\u3002\u4f46\u662f\uff0c\u5728\u6211\u4eec\u7684\u5ba2\u6237\u7aef\u4ee3\u7801\u4e2d\u662f\u53ef\u4ee5\u5f53\u505a\u8d44\u6e90\u6a21\u677f\u6765\u4f7f\u7528\u7684\uff0c\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import asyncio\nfrom pydantic import AnyUrl\n\nfrom mcp.client.stdio import stdio_client\nfrom mcp import ClientSession, StdioServerParameters\n\nserver_params = StdioServerParameters(\n    command='uv',\n    args=['run', 'prompt_and_resources.py'],\n)\n\n\nasync def main():\n    async with stdio_client(server_params) as (stdio, write):\n        async with ClientSession(stdio, write) as session:\n            await session.initialize()\n\n            # \u83b7\u53d6\u65e0\u901a\u914d\u7b26\u7684\u8d44\u6e90\u5217\u8868\n            res = await session.list_resources()\n            print(res)\n\n            # \u83b7\u53d6\u6709\u901a\u914d\u7b26\u7684\u8d44\u6e90\u5217\u8868(\u8d44\u6e90\u6a21\u677f)\n            res = await session.list_resource_templates()\n            print(res)\n\n            # \u8bfb\u53d6\u8d44\u6e90\uff0c\u4f1a\u5339\u914d\u901a\u914d\u7b26\n            res = await session.read_resource(AnyUrl('greeting:\/\/liming'))\n            print(res)\n\n            # \u83b7\u53d6 Prompt \u6a21\u677f\u5217\u8868\n            res = await session.list_prompts()\n            print(res)\n\n            # \u4f7f\u7528 Prompt \u6a21\u677f\n            res = await session.get_prompt(\n                '\u7ffb\u8bd1\u4e13\u5bb6', arguments={'target_language': '\u82f1\u8bed'})\n            print(res)\n\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u751f\u547d\u5468\u671f<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F\"><\/a><\/p>\n\n\n\n<p>MCP \u751f\u547d\u5468\u671f\u5206\u4e3a3\u4e2a\u9636\u6bb5\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u521d\u59cb\u5316<\/li>\n\n\n\n<li>\u4ea4\u4e92\u901a\u4fe1\u4e2d<\/li>\n\n\n\n<li>\u670d\u52a1\u88ab\u5173\u95ed<\/li>\n<\/ul>\n\n\n\n<p>\u56e0\u6b64\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u8fd9\u4e2a\u4e09\u4e2a\u9636\u6bb5\u7684\u5f00\u59cb\u548c\u7ed3\u675f\u6765\u505a\u4e00\u4e9b\u4e8b\u60c5\uff0c\u6bd4\u5982\u521b\u5efa\u6570\u636e\u5e93\u8fde\u63a5\u548c\u5173\u95ed\u6570\u636e\u5e93\u8fde\u63a5\u3001\u8bb0\u5f55\u65e5\u5fd7\u3001\u8bb0\u5f55\u5de5\u5177\u4f7f\u7528\u4fe1\u606f\u7b49\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u6211\u4eec\u5c06\u4ee5\u7f51\u9875\u641c\u7d22\u5de5\u5177\uff0c\u628a\u5de5\u5177\u8c03\u7528\u65f6\u7684\u67e5\u8be2\u548c\u67e5\u8be2\u5230\u7684\u7ed3\u679c\u5b58\u50a8\u5230\u4e00\u4e2a\u5168\u5c40\u4e0a\u4e0b\u6587\u4e2d\u4f5c\u4e3a\u7f13\u5b58\u4e3a\u4f8b\uff0c\u6765\u770b\u770b\u751f\u547d\u5468\u671f\u5982\u4f55\u4f7f\u7528\u3002\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import httpx\nfrom dataclasses import dataclass\nfrom contextlib import asynccontextmanager\n\nfrom mcp.server import FastMCP\nfrom mcp.server.fastmcp import Context\n\n\n@dataclass\n# \u521d\u59cb\u5316\u4e00\u4e2a\u751f\u547d\u5468\u671f\u4e0a\u4e0b\u6587\u5bf9\u8c61\nclass AppContext:\n    # \u91cc\u9762\u6709\u4e00\u4e2a\u5b57\u6bb5\u7528\u4e8e\u5b58\u50a8\u8bf7\u6c42\u5386\u53f2\n    histories: dict\n\n\n@asynccontextmanager\nasync def app_lifespan(server):\n    # \u5728 MCP \u521d\u59cb\u5316\u65f6\u6267\u884c\n    histories = {}\n    try:\n        # \u6bcf\u6b21\u901a\u4fe1\u4f1a\u628a\u8fd9\u4e2a\u4e0a\u4e0b\u6587\u901a\u8fc7\u53c2\u6570\u4f20\u5165\u5de5\u5177\n        yield AppContext(histories=histories)\n    finally:\n        # \u5f53 MCP \u670d\u52a1\u5173\u95ed\u65f6\u6267\u884c\n        print(histories)\n\n\napp = FastMCP(\n    'web-search', \n    # \u8bbe\u7f6e\u751f\u547d\u5468\u671f\u76d1\u542c\u51fd\u6570\n    lifespan=app_lifespan\n)\n\n\n@app.tool()\n# \u7b2c\u4e00\u4e2a\u53c2\u6570\u4f1a\u88ab\u4f20\u5165\u4e0a\u4e0b\u6587\u5bf9\u8c61\nasync def web_search(ctx: Context, query: str) -&gt; str:\n    \"\"\"\n    \u641c\u7d22\u4e92\u8054\u7f51\u5185\u5bb9\n\n    Args:\n        query: \u8981\u641c\u7d22\u5185\u5bb9\n\n    Returns:\n        \u641c\u7d22\u7ed3\u679c\u7684\u603b\u7ed3\n    \"\"\"\n    # \u5982\u679c\u4e4b\u524d\u95ee\u8fc7\u540c\u6837\u7684\u95ee\u9898\uff0c\u5c31\u76f4\u63a5\u8fd4\u56de\u7f13\u5b58\n    histories = ctx.request_context.lifespan_context.histories\n    if query in histories\uff1a\n    \treturn histories[query]\n\n    async with httpx.AsyncClient() as client:\n        response = await client.post(\n            'https:\/\/open.bigmodel.cn\/api\/paas\/v4\/tools',\n            headers={'Authorization': 'YOUR API KEY'},\n            json={\n                'tool': 'web-search-pro',\n                'messages': [\n                    {'role': 'user', 'content': query}\n                ],\n                'stream': False\n            }\n        )\n\n        res_data = []\n        for choice in response.json()['choices']:\n            for message in choice['message']['tool_calls']:\n                search_results = message.get('search_result')\n                if not search_results:\n                    continue\n                for result in search_results:\n                    res_data.append(result['content'])\n\n        return_data = '\\n\\n\\n'.join(res_data)\n\n        # \u5c06\u67e5\u8be2\u503c\u548c\u8fd4\u56de\u503c\u5b58\u5165\u5230 histories \u4e2d\n        ctx.request_context.lifespan_context.histories[query] = return_data\n        return return_data\n\n\nif __name__ == \"__main__\":\n    app.run()<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5728 LangChain \u4e2d\u4f7f\u7528 MCP \u670d\u52a1\u5668<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E5%9C%A8-langchain-%E4%B8%AD%E4%BD%BF%E7%94%A8-mcp-%E6%9C%8D%E5%8A%A1%E5%99%A8\"><\/a><\/p>\n\n\n\n<p>\u6700\u8fd1 LangChain \u53d1\u5e03\u4e86\u4e00\u4e2a\u65b0\u7684\u5f00\u6e90\u9879\u76ee&nbsp;<code>langchain-mcp-adapters<\/code>\uff0c\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u5c06 MCP \u670d\u52a1\u5668\u96c6\u6210\u5230 LangChain \u4e2d\u3002\u4e0b\u9762\u6211\u4eec\u6765\u770b\u770b\u5982\u4f55\u4f7f\u7528\u5b83:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">from mcp import ClientSession, StdioServerParameters\nfrom mcp.client.stdio import stdio_client\n\nfrom langchain_mcp_adapters.tools import load_mcp_tools\nfrom langgraph.prebuilt import create_react_agent\n\nfrom langchain_openai import ChatOpenAI\nmodel = ChatOpenAI(model=\"gpt-4o\")\n\nserver_params = StdioServerParameters(\n    command='uv',\n    args=['run', 'web_search.py'],\n)\n\nasync with stdio_client(server_params) as (read, write):\n    async with ClientSession(read, write) as session:\n        await session.initialize()\n\n        # \u83b7\u53d6\u5de5\u5177\u5217\u8868\n        tools = await load_mcp_tools(session)\n\n        # \u521b\u5efa\u5e76\u4f7f\u7528 ReAct agent\n        agent = create_react_agent(model, tools)\n        agent_response = await agent.ainvoke({'messages': '\u676d\u5dde\u4eca\u5929\u5929\u6c14\u600e\u4e48\u6837\uff1f'})<\/pre>\n\n\n\n<p>\u66f4\u8be6\u7ec6\u7684\u4f7f\u7528\u65b9\u6cd5\u8bf7\u53c2\u8003\uff1a<a href=\"https:\/\/github.com\/langchain-ai\/langchain-mcp-adapters\">https:\/\/github.com\/langchain-ai\/langchain-mcp-adapters<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DeepSeek + cline + \u81ea\u5b9a\u4e49MCP = \u56fe\u6587\u5927\u5e08<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#deepseek--cline--%E8%87%AA%E5%AE%9A%E4%B9%89mcp--%E5%9B%BE%E6%96%87%E5%A4%A7%E5%B8%88\"><\/a><\/p>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u6765\u4f7f\u7528 VsCode \u7684 cline \u63d2\u4ef6\uff0c\u6765\u901a\u8fc7 DeepSeek \u548c\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u4e00\u4e2a\u56fe\u7247\u751f\u6210\u7684 mcp \u670d\u52a1\u5668\u6765\u6784\u5efa\u4e00\u4e2a\u56fe\u6587\u5927\u5e08\u7684\u5e94\u7528\u3002\u5e9f\u8bdd\u4e0d\u591a\u8bf4\uff0c\u6211\u4eec\u76f4\u63a5\u5f00\u59cb\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u5148\u6765\u6784\u5efa\u6211\u4eec\u7684\u56fe\u7247\u751f\u6210\u7684 mcp server\uff0c\u8fd9\u91cc\u6211\u4eec\u76f4\u63a5\u7528 huggingface \u4e0a\u7684&nbsp;<code>FLUX.1-schnell<\/code>&nbsp;\u6a21\u578b\uff0c\u5730\u5740\u662f\uff1a<a href=\"https:\/\/huggingface.co\/spaces\/black-forest-labs\/FLUX.1-schnell\">https:\/\/huggingface.co\/spaces\/black-forest-labs\/FLUX.1-schnell<\/a>&nbsp;\u3002\u8fd9\u91cc\u6211\u4eec\u4e0d\u4f7f\u7528&nbsp;<code>gradio_client<\/code>&nbsp;\u5e93\uff0c\u800c\u662f\u4f1a\u4f7f\u7528&nbsp;<code>httpx<\/code>&nbsp;\u624b\u6413\u4e00\u4e2a\uff0c\u56e0\u4e3a\u4f7f\u7528&nbsp;<code>gradio_client<\/code>&nbsp;\u5e93\u53ef\u80fd\u4f1a\u51fa\u73b0\u7f16\u7801\u9519\u8bef\u7684bug\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># image_server.py\n\nimport json\nimport httpx\nfrom mcp.server import FastMCP\n\n\napp = FastMCP('image_server')\n\n\n@app.tool()\nasync def image_generation(image_prompt: str):\n    \"\"\"\n    \u751f\u6210\u56fe\u7247\n    :param image_prompt: \u56fe\u7247\u63cf\u8ff0\uff0c\u9700\u8981\u662f\u82f1\u6587\n    :return: \u56fe\u7247\u4fdd\u5b58\u5230\u7684\u672c\u5730\u8def\u5f84\n    \"\"\"\n    async with httpx.AsyncClient() as client:\n        data = {'data': [image_prompt, 0, True, 512, 512, 3]}\n\n        # \u521b\u5efa\u751f\u6210\u56fe\u7247\u4efb\u52a1\n        response1 = await client.post(\n            'https:\/\/black-forest-labs-flux-1-schnell.hf.space\/call\/infer',\n            json=data,\n            headers={\"Content-Type\": \"application\/json\"}\n        )\n\n        # \u89e3\u6790\u54cd\u5e94\u83b7\u53d6\u4e8b\u4ef6 ID\n        response_data = response1.json()\n        event_id = response_data.get('event_id')\n\n        if not event_id:\n            return '\u65e0\u6cd5\u83b7\u53d6\u4e8b\u4ef6 ID'\n\n        # \u901a\u8fc7\u6d41\u5f0f\u7684\u65b9\u5f0f\u62ff\u5230\u8fd4\u56de\u6570\u636e\n        url = f'https:\/\/black-forest-labs-flux-1-schnell.hf.space\/call\/infer\/{event_id}'\n        full_response = ''\n        async with client.stream('GET', url) as response2:\n            async for chunk in response2.aiter_text():\n                full_response += chunk\n\n        return json.loads(full_response.split('data: ')[-1])[0]['url']\n\nif __name__ == '__main__':\n    app.run(transport='stdio')<\/pre>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u5728\u865a\u62df\u73af\u5883\u4e0b\u4f7f\u7528\u4e0b\u9762\u7684\u547d\u4ee4\u6253\u5f00 MCP Inspector \u8fdb\u884c\u8c03\u8bd5\u4e0b\u6211\u4eec\u7684\u5de5\u5177\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mcp dev image_server.py<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301231332749.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301231332749.png\" alt=\"image-20250301231332749\"\/><\/a><\/figure>\n\n\n\n<p>\u63a5\u7740\u6211\u4eec\u5728 VsCode \u4e2d\u5b89\u88c5 cline \u63d2\u4ef6\uff0c\u5f53\u5b89\u88c5\u5b8c\u63d2\u4ef6\u540e\uff0c\u6211\u4eec\u914d\u7f6e\u4e00\u4e0b\u6211\u4eec\u7684 deepseek \u7684 api key\u3002\u63a5\u7740\uff0c\u6211\u4eec\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684&nbsp;<code>MCP Server<\/code>&nbsp;\u6309\u94ae\u6253\u5f00 mcp server \u5217\u8868\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301232248034.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301232248034.png\" alt=\"image-20250301232248034\"\/><\/a><\/figure>\n\n\n\n<p>\u7136\u540e\u5207\u6362\u5230&nbsp;<code>Installed<\/code>&nbsp;Tab \u70b9\u51fb&nbsp;<code>Configure MCP Servers<\/code>&nbsp;\u6309\u94ae\u6765\u7f16\u8f91\u81ea\u5b9a\u4e49\u7684 mcp \u670d\u52a1\u5668\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301232417966.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301232417966.png\" alt=\"image-20250301232417966\"\/><\/a><\/figure>\n\n\n\n<p>\u914d\u7f6e\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"mcpServers\": {\n    \"image_server\": {\n      \"command\": \"uv\",\n      \"args\": [\n        \"--directory\",\n        \"D:\/projects\/mcp_getting_started\",\n        \"run\",\n        \"image_server.py\"\n      ],\n      \"env\": {},\n      \"disabled\": false,\n      \"autoApprove\": []\n    }\n  }\n}<\/pre>\n\n\n\n<p>\u6211\u4eec\u4fdd\u5b58\u540e\uff0c\u8fd9\u91cc\u7684\u8fd9\u4e2a\u5c0f\u70b9\u662f\u7eff\u8272\u7684\u5c31\u8868\u793a\u6211\u4eec\u7684\u670d\u52a1\u5668\u5df2\u8fde\u63a5\uff0c\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528\u5566\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301232809433.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301232809433.png\" alt=\"image-20250301232809433\"\/><\/a><\/figure>\n\n\n\n<p>\u7136\u540e\uff0c\u6211\u4eec\u5c31\u6253\u5f00\u8f93\u5165\u6846\uff0c\u6765\u8f93\u5165\u6211\u4eec\u7684\u8981\u5199\u7684\u6587\u7ae0\u7684\u5185\u5bb9\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301233421292.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301233421292.png\" alt=\"image-20250301233421292\"\/><\/a><\/figure>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u4ed6\u6b63\u786e\u7684\u8c03\u7528\u4e86\u6211\u4eec\u7684\u5de5\u5177<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301233726301.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301233726301.png\" alt=\"image-20250301233726301\"\/><\/a><\/figure>\n\n\n\n<p>\u6700\u540e\uff0c\u5c31\u662f\u53ef\u4ee5\u770b\u5230\u751f\u6210\u7684\u6587\u7ae0\u5566\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250301234532249.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250301234532249.png\" alt=\"image-20250301234532249\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u501f\u52a9 serverless \u5c06 MCP \u670d\u52a1\u90e8\u7f72\u5230\u4e91\u7aef<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#%E5%80%9F%E5%8A%A9-serverless-%E5%B0%86-mcp-%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2%E5%88%B0%E4%BA%91%E7%AB%AF\"><\/a><\/p>\n\n\n\n<p>\u4e0a\u9762\u6211\u4eec\u8bb2\u7684\u90fd\u662f\u5982\u4f55\u4f7f\u7528\u672c\u5730\u7684 MCP \u670d\u52a1\uff0c\u4f46\u662f\u6709\u65f6\u6211\u4eec\u5e0c\u671b\u76f4\u63a5\u628a MCP \u670d\u52a1\u90e8\u7f72\u5230\u4e91\u7aef\u6765\u76f4\u63a5\u8c03\u7528\uff0c\u5c31\u7701\u53bb\u4e86\u672c\u5730\u4e0b\u8f7d\u542f\u52a8\u7684\u70e6\u607c\u4e86\u3002\u6b64\u65f6\uff0c\u6211\u4eec\u5c31\u9700\u8981\u6765\u4f7f\u7528 MCP \u7684 SSE \u7684\u534f\u8bae\u6765\u5b9e\u73b0\u4e86\u3002<\/p>\n\n\n\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u5148\u6765\u5199 SSE \u534f\u8bae\u7684 MCP \u670d\u52a1\u3002\u5b9e\u73b0\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u5c06\u6211\u4eec\u6700\u540e\u7684&nbsp;<code>run<\/code>&nbsp;\u547d\u4ee4\u4e2d\u7684&nbsp;<code>transport<\/code>&nbsp;\u53c2\u6570\u8bbe\u7f6e\u4e3a&nbsp;<code>sse<\/code>&nbsp;\u5373\u53ef\u3002\u4e0b\u9762\u8fd8\u662f\u4ee5\u4e0a\u9762\u7684\u7f51\u7edc\u641c\u7d22\u4e3a\u4f8b\u5b50\uff0c\u6765\u5b9e\u73b0\u4e00\u4e0b \uff0c\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># sse_web_search.py\nimport httpx\n\nfrom mcp.server import FastMCP\n\n\napp = FastMCP('web-search', port=9000)\n\n\n@app.tool()\nasync def web_search(query: str) -&gt; str:\n    \"\"\"\n    \u641c\u7d22\u4e92\u8054\u7f51\u5185\u5bb9\n\n    Args:\n        query: \u8981\u641c\u7d22\u5185\u5bb9\n\n    Returns:\n        \u641c\u7d22\u7ed3\u679c\u7684\u603b\u7ed3\n    \"\"\"\n    async with httpx.AsyncClient() as client:\n        response = await client.post(\n            'https:\/\/open.bigmodel.cn\/api\/paas\/v4\/tools',\n            headers={'Authorization': 'YOUR API KEY'},\n            json={\n                'tool': 'web-search-pro',\n                'messages': [\n                    {'role': 'user', 'content': query}\n                ],\n                'stream': False\n            }\n        )\n\n        res_data = []\n        for choice in response.json()['choices']:\n            for message in choice['message']['tool_calls']:\n                search_results = message.get('search_result')\n                if not search_results:\n                    continue\n                for result in search_results:\n                    res_data.append(result['content'])\n\n        return '\\n\\n\\n'.join(res_data)\n\n\nif __name__ == \"__main__\":\n    app.run(transport='sse')<\/pre>\n\n\n\n<p>\u5728&nbsp;<code>FastMCP<\/code>&nbsp;\u4e2d\uff0c\u6709\u51e0\u4e2a\u53ef\u4ee5\u8bbe\u7f6e SSE \u534f\u8bae\u76f8\u5173\u7684\u53c2\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>host: \u670d\u52a1\u5730\u5740\uff0c\u9ed8\u8ba4\u4e3a\u00a0<code>0.0.0.0<\/code><\/li>\n\n\n\n<li>port: \u670d\u52a1\u7aef\u53e3\uff0c\u9ed8\u8ba4\u4e3a 8000\u3002\u4e0a\u8ff0\u4ee3\u7801\u4e2d\uff0c\u6211\u8bbe\u7f6e\u4e3a\u00a0<code>9000<\/code><\/li>\n\n\n\n<li>sse_path\uff1asse \u7684\u8def\u7531\uff0c\u9ed8\u8ba4\u4e3a\u00a0<code>\/sse<\/code><\/li>\n<\/ul>\n\n\n\n<p>\u6b64\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u76f4\u63a5\u5199\u4e00\u4e2a\u5ba2\u6237\u7aef\u7684\u4ee3\u7801\u6765\u8fdb\u884c\u6d4b\u8bd5\u4e86\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import asyncio\nfrom mcp.client.sse import sse_client\nfrom mcp import ClientSession\n\n\nasync def main():\n    async with sse_client('http:\/\/localhost:9000\/sse') as streams:\n        async with ClientSession(*streams) as session:\n            await session.initialize()\n\n            res = await session.call_tool('web_search', {'query': '\u676d\u5dde\u4eca\u5929\u5929\u6c14'})\n            print(res)\n\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<p>\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u4ed6\u6b63\u5e38\u5de5\u4f5c\u4e86\uff0c\u5e76\u641c\u7d22\u5230\u4e86\u5185\u5bb9\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406152518223.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406152518223.png\" alt=\"image-20250406152518223\"\/><\/a><\/figure>\n\n\n\n<p>\u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528&nbsp;<code>mcp dev sse_web_search.py<\/code>&nbsp;\u7684\u65b9\u5f0f\u6765\u6d4b\u8bd5\u3002\u8fd9\u91cc\u8981\u6ce8\u610f\u7684\u662f\uff0c<code>Transport Type<\/code>&nbsp;\u9700\u8981\u6539\u6210&nbsp;<code>SSE<\/code>\uff0c\u7136\u540e\u4e0b\u9762\u586b\u5199\u6211\u4eec\u7684\u672c\u5730\u670d\u52a1\u5730\u5740\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406153106098.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406153106098.png\" alt=\"image-20250406153106098\"\/><\/a><\/figure>\n\n\n\n<p>\u5f53\u4e00\u5207\u90fd\u6d4b\u8bd5\u6ca1\u6709\u95ee\u9898\u540e\uff0c\u6211\u4eec\u5c31\u6765\u5c06\u4ed6\u901a\u8fc7 severless \u7684\u65b9\u5f0f\u6765\u90e8\u7f72\u5230\u4e91\u7aef\u3002\u8fd9\u91cc\u6211\u4eec\u9009\u62e9\u7684\u662f\u963f\u91cc\u4e91\u7684\u51fd\u6570\u8ba1\u7b97\u670d\u52a1\u3002\u9996\u5148\u6211\u4eec\u5148\u8fdb\u5165\u5230\u963f\u91cc\u4e91\u7684&nbsp;<code>\u51fd\u6570\u8ba1\u7b97 FC 3.0<\/code>&nbsp;\u7684&nbsp;<code>\u51fd\u6570<\/code>&nbsp;\u83dc\u5355\uff0c\u5e76\u70b9\u51fb&nbsp;<code>\u521b\u5efa\u51fd\u6570<\/code>&nbsp;\u6765\u521b\u5efa\u6211\u4eec\u7684\u670d\u52a1\u3002\u5730\u5740\u662f\uff1a<a href=\"https:\/\/fcnext.console.aliyun.com\/cn-hangzhou\/functions\">https:\/\/fcnext.console.aliyun.com\/cn-hangzhou\/functions<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406153655185.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406153655185.png\" alt=\"image-20250406153655185\"\/><\/a><\/figure>\n\n\n\n<p>\u6211\u4eec\u8fd9\u91cc\u9009\u62e9&nbsp;<code>Web\u51fd\u6570<\/code>&nbsp;\uff0c\u8fd0\u884c\u73af\u5883\u6211\u4eec\u9009\u62e9&nbsp;<code>Python 10<\/code>\u3002\u4ee3\u7801\u4e0a\u4f20\u65b9\u5f0f\u8fd9\u91cc\u53ef\u4ee5\u6839\u636e\u5927\u5bb6\u9700\u6c42\u6765\uff0c\u56e0\u4e3a\u6211\u8fd9\u91cc\u5c31\u4e00\u4e2a python \u6587\u4ef6\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u5c31\u76f4\u63a5\u9009\u62e9<code>\u4f7f\u7528\u793a\u4f8b\u4ee3\u7801<\/code>\u4e86\uff0c\u8fd9\u6837\u6211\u540e\u9762\u76f4\u63a5\u628a\u6211\u7684\u4ee3\u7801\u8986\u76d6\u8fdb\u53bb\u4e86\u5c31\u884c\u4e86\u3002\u542f\u52a8\u547d\u4ee4\u548c\u76d1\u542c\u7aef\u53e3\u6211\u8fd9\u91cc\u90fd\u4fdd\u7559\u4e3a\u9ed8\u8ba4(<strong>\u7aef\u53e3\u9700\u8981\u548c\u4ee3\u7801\u4e2d\u4e00\u81f4<\/strong>)\u3002<\/p>\n\n\n\n<p>\u73af\u5883\u53d8\u91cf\u5927\u5bb6\u53ef\u4ee5\u5c06\u4ee3\u7801\u4e2d\u7528\u5230\u7684 apikey \u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u8fd9\u91cc\u6211\u5c31\u4e0d\u8bbe\u7f6e\u4e86\u3002\u6700\u540e\u8bbe\u7f6e\u5b8c\u6210\u622a\u56fe\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406154115438.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406154115438.png\" alt=\"image-20250406154115438\"\/><\/a><\/figure>\n\n\n\n<p>\u5728\u9ad8\u7ea7\u8bbe\u7f6e\u4e2d\uff0c\u4e3a\u4e86\u65b9\u4fbf\u8c03\u8bd5\uff0c\u6211\u542f\u52a8\u4e86\u65e5\u5fd7\u529f\u80fd\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406154228341.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406154228341.png\" alt=\"image-20250406154228341\"\/><\/a><\/figure>\n\n\n\n<p>\u8bbe\u7f6e\u5b8c\u6210\u540e\uff0c\u70b9\u521b\u5efa\u5373\u53ef\u3002\u4ed6\u5c31\u8df3\u8f6c\u5230\u4ee3\u7801\u7f16\u8f91\u90e8\u5206\uff0c\u7136\u540e\u6211\u4eec\u628a\u4e4b\u524d\u7684\u4ee3\u7801\u590d\u5236\u8fdb\u53bb\u5373\u53ef\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406154441634.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406154441634.png\" alt=\"image-20250406154441634\"\/><\/a><\/figure>\n\n\n\n<p>\u5b8c\u6210\u540e\uff0c\u6211\u4eec\u6765\u5b89\u88c5\u4e0b\u4f9d\u8d56\u3002\u6211\u4eec\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684<code>\u7f16\u8f91\u5c42<\/code>\u3002\u8fd9\u91cc\u9ed8\u8ba4\u4f1a\u6709\u4e2a\u9ed8\u8ba4\u7684 flask \u7684\u5c42\uff0c\u56e0\u4e3a\u5f00\u59cb\u7684\u6a21\u677f\u7528\u7684\u662f flask\uff0c\u8fd9\u91cc\u6211\u4eec\u5c31\u4e0d\u9700\u8981\u4e86\u3002\u6211\u4eec\u5220\u9664\u4ed6\uff0c\u518d\u6dfb\u52a0\u4e00\u4e2a mcp \u7684\u5c42\u3002\u9009\u62e9<code>\u6dfb\u52a0\u5b98\u65b9\u516c\u5171\u5c42<\/code>\uff0c\u7136\u540e\u641c\u7d22&nbsp;<code>mcp<\/code>&nbsp;\u5c31\u80fd\u770b\u5230\u4e86\u4e00\u4e2a python \u7248\u7684 MCP \u5c42\uff0c\u91cc\u9762\u5305\u542b\u4e86 MCP \u6240\u6709\u7528\u5230\u7684\u4f9d\u8d56\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406154753623.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406154753623.png\" alt=\"image-20250406154753623\"\/><\/a><\/figure>\n\n\n\n<p>\u5982\u679c\u4f60\u8fd8\u6709\u5176\u4ed6\u7b2c\u4e09\u65b9\u7684\uff0c\u53ef\u4ee5\u5148\u641c\u7d22\u4e0b\u770b\u770b\u516c\u5171\u5c42\u4e2d\u662f\u5426\u6709\uff0c\u6ca1\u6709\u5c31\u53ef\u4ee5\u81ea\u884c\u6784\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u5c42\u3002\u70b9\u51fb\u8fd9\u91cc\u5c31\u53ef\u4ee5\uff0c\u53ea\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a&nbsp;<code>requirements<\/code>&nbsp;\u5217\u8868\u5c31\u53ef\u4ee5\u4e86\uff0c\u8fd9\u91cc\u5c31\u4e0d\u8d58\u8ff0\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406154935751.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406154935751.png\" alt=\"image-20250406154935751\"\/><\/a><\/figure>\n\n\n\n<p>\u5f53\u6211\u4eec\u90fd\u8bbe\u7f6e\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u53f3\u4e0b\u89d2\u7684\u90e8\u7f72\u5373\u53ef\u3002<\/p>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u53c8\u56de\u5230\u4e86\u6211\u4eec\u4ee3\u7801\u7f16\u8f91\u7684\u9875\u9762\uff0c\u6b64\u65f6\uff0c\u6211\u4eec\u518d\u70b9\u51fb\u5de6\u4e0a\u89d2\u7684\u90e8\u7f72\u4ee3\u7801\u3002\u7a0d\u7b49\u4e00\u4e24\u79d2\u5c31\u4f1a\u63d0\u793a\u4ee3\u7801\u90e8\u7f72\u6210\u529f\u3002\u6b64\u65f6\uff0c\u6211\u4eec\u7684 MCP \u670d\u52a1\u5c31\u88ab\u90e8\u7f72\u5230\u4e86\u4e91\u7aef\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406155135563.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406155135563.png\" alt=\"image-20250406155135563\"\/><\/a><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>20250409 \u66f4\u65b0\uff1a\u4e0d\u77e5\u9053\u662f\u4e0d\u662f\u5b98\u65b9\u770b\u5230\u4e86\u8fd9\u7bc7\u6587\u7ae0\uff0c\u73b0\u5728\u8fd0\u884c\u65f6\u53ef\u4ee5\u76f4\u63a5\u9009\u62e9&nbsp;<code>MCP \u8fd0\u884c\u65f6<\/code>&nbsp;\u4e86\uff0c\u5c31\u4e0d\u7528\u518d\u5728\u5c42\u90a3\u91cc\u624b\u52a8\u6dfb\u52a0&nbsp;<code>MCP \u5c42<\/code>&nbsp;\u4e86\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250409213302652.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250409213302652.png\" alt=\"image-20250409213302652\"\/><\/a><\/figure>\n<\/blockquote>\n\n\n\n<p>\u7136\u540e\uff0c\u6211\u4eec\u5207\u6362\u5230<code>\u914d\u7f6e<\/code>\u7684<code>\u89e6\u53d1\u5668<\/code>\u4e2d\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7528\u6765\u8bbf\u95ee\u7684 URL \u5730\u5740\u4e86\u3002\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u7ed1\u5b9a\u81ea\u5df1\u7684\u57df\u540d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406155353662.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406155353662.png\" alt=\"image-20250406155353662\"\/><\/a><\/figure>\n\n\n\n<p>\u7136\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u6211\u4eec\u4e0a\u9762\u7684\u5ba2\u6237\u7aef\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\u4e86\u3002<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import asyncio\nfrom mcp.client.sse import sse_client\nfrom mcp import ClientSession\n\n\nasync def main():\n    async with sse_client('https:\/\/mcp-test-whhergsbso.cn-hangzhou.fcapp.run\/sse') as streams:\n        async with ClientSession(*streams) as session:\n            await session.initialize()\n\n            res = await session.call_tool('web_search', {'query': '\u676d\u5dde\u4eca\u5929\u5929\u6c14'})\n            print(res)\n\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/pre>\n\n\n\n<p>\u5982\u679c\u6211\u4eec\u53d1\u73b0\u5728\u5ba2\u6237\u7aef\u6709\u62a5\u9519\u4e5f\u4e0d\u7528\u614c\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u5728\u65e5\u5fd7\u4e2d\u627e\u5230\u5bf9\u5e94\u51fa\u9519\u7684\u8bf7\u6c42\u70b9\u51fb<code>\u8bf7\u6c42\u65e5\u5fd7<\/code>\u67e5\u770b\u62a5\u9519\u6765\u4fee\u590d\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406155803071.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406155803071.png\" alt=\"image-20250406155803071\"\/><\/a><\/figure>\n\n\n\n<p>\u5230\u8fd9\u91cc\uff0c\u6211\u4eec\u7684 MCP \u670d\u52a1\u5c31\u88ab\u90e8\u7f72\u5230\u4e86\u4e91\u7aef\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728\u4efb\u4f55\u5730\u65b9\u76f4\u63a5\u6765\u4f7f\u7528\u5b83\u4e86\u3002<\/p>\n\n\n\n<p>\u6bd4\u5982\uff0c\u5728&nbsp;<code>Cherry-Studio<\/code>&nbsp;\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u6765\u8bbe\u7f6e\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406160152782.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406160152782.png\" alt=\"image-20250406160152782\"\/><\/a><\/figure>\n\n\n\n<p>\u5728&nbsp;<code>Cline<\/code>&nbsp;\u4e2d\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406160709759.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406160709759.png\" alt=\"image-20250406160709759\"\/><\/a><\/figure>\n\n\n\n<p>\u5728&nbsp;<code>Cursor<\/code>&nbsp;\u4e2d\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/blob\/main\/.assets\/image-20250406161055717.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\/raw\/main\/.assets\/image-20250406161055717.png\" alt=\"image-20250406161055717\"\/><\/a><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"mcpServers\": {\n    \"web-search\": {\n      \"url\": \"https:\/\/mcp-test-whhergsbso.cn-hangzhou.fcapp.run\/sse\"\n    }\n  }\n}<\/pre>\n\n\n\n<p>\u81f3\u6b64\uff0c\u6574\u4e2a MCP \u5165\u95e8\u6559\u7a0b\u5c31\u5230\u8fd9\u91cc\u5566\uff0c\u540e\u7eed\u6709\u5176\u4ed6\u7684\u518d\u8fdb\u884c\u66f4\u65b0\u3002\u76f8\u5173\u4ee3\u7801\u4f1a\u653e\u5230 github \u4ed3\u5e93\u4e2d\uff1a<a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide\">https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide<\/a><a href=\"https:\/\/github.com\/liaokongVFX\/MCP-Chinese-Getting-Started-Guide#model-context-protocolmcp-%E7%BC%96%E7%A8%8B%E6%9E%81%E9%80%9F%E5%85%A5%E9%97%A8\"><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb \u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff08MCP\uff09\u662f\u4e00\u4e2a\u521b\u65b0\u7684\u5f00\u6e90\u534f\u8bae\uff0c\u5b83\u91cd\u65b0\u5b9a\u4e49\u4e86\u5927\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09\u4e0e\u5916\u90e8\u4e16\u754c\u7684\u4e92\u52a8\u65b9\u5f0f\u3002MCP \u63d0\u4f9b\u4e86\u4e00\u79cd\u6807\u51c6\u5316\u65b9\u6cd5\uff0c\u4f7f\u4efb\u610f\u5927\u8bed\u8a00\u6a21\u578b\u80fd\u591f\u8f7b\u677e\u8fde\u63a5\u5404\u79cd\u6570\u636e\u6e90\u548c\u5de5\u5177\uff0c\u5b9e\u73b0\u4fe1\u606f\u7684\u65e0\u7f1d\u8bbf\u95ee\u548c\u5904\u7406\u3002MCP \u5c31\u50cf\u662f AI \u5e94\u7528\u7a0b\u5e8f\u7684 USB-C \u63a5\u53e3\uff0c\u4e3a AI \u6a21\u578b\u63d0\u4f9b\u4e86\u4e00\u79cd\u6807\u51c6\u5316\u7684\u65b9\u5f0f\u6765\u8fde\u63a5\u4e0d\u540c\u7684\u6570\u636e\u6e90\u548c\u5de5\u5177\u3002 MCP \u6709\u4ee5\u4e0b\u51e0\u4e2a\u6838\u5fc3\u529f\u80fd\uff1a \u56e0\u4e3a\u5927\u90e8\u5206\u529f\u80fd\u5176\u5b9e\u90fd\u662f\u670d\u52a1\u4e8e Claude \u5ba2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-177","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/posts\/177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/sspacee.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=177"}],"version-history":[{"count":1,"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions"}],"predecessor-version":[{"id":178,"href":"http:\/\/sspacee.com\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions\/178"}],"wp:attachment":[{"href":"http:\/\/sspacee.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/sspacee.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=177"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/sspacee.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}