{"id":873,"date":"2026-08-20T23:22:36","date_gmt":"2026-08-20T15:22:36","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/08\/20\/%e3%80%90mcp-%e8%88%87-fastmcp-%e5%af%a6%e6%88%b0%e3%80%9104-%e9%83%a8%e7%bd%b2%e8%88%87%e6%95%b4%e5%90%88%ef%bc%9ahttp-%e5%82%b3%e8%bc%b8%e3%80%81%e6%8e%88%e6%ac%8a%e8%88%87%e6%8e%a5%e4%b8%8a-ai\/"},"modified":"2026-08-20T23:22:36","modified_gmt":"2026-08-20T15:22:36","slug":"%e3%80%90mcp-%e8%88%87-fastmcp-%e5%af%a6%e6%88%b0%e3%80%9104-%e9%83%a8%e7%bd%b2%e8%88%87%e6%95%b4%e5%90%88%ef%bc%9ahttp-%e5%82%b3%e8%bc%b8%e3%80%81%e6%8e%88%e6%ac%8a%e8%88%87%e6%8e%a5%e4%b8%8a-ai","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/08\/20\/%e3%80%90mcp-%e8%88%87-fastmcp-%e5%af%a6%e6%88%b0%e3%80%9104-%e9%83%a8%e7%bd%b2%e8%88%87%e6%95%b4%e5%90%88%ef%bc%9ahttp-%e5%82%b3%e8%bc%b8%e3%80%81%e6%8e%88%e6%ac%8a%e8%88%87%e6%8e%a5%e4%b8%8a-ai\/","title":{"rendered":"\u3010MCP \u8207 FastMCP \u5be6\u6230\u3011#04 \u90e8\u7f72\u8207\u6574\u5408\uff1aHTTP \u50b3\u8f38\u3001\u6388\u6b0a\u8207\u63a5\u4e0a AI \u5ba2\u6236\u7aef"},"content":{"rendered":"\n<div id=\"quiz-cb4a9ea2\">\n<style>\n#quiz-cb4a9ea2 .question { background: white; border-radius: 8px; padding: 20px; margin: 20px 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }#quiz-cb4a9ea2 .question h3 { margin-top: 0; color: #333; }#quiz-cb4a9ea2 .options { list-style: none; padding: 0; }#quiz-cb4a9ea2 .options li { padding: 12px 15px; margin: 8px 0; border: 2px solid #ddd; border-radius: 6px; cursor: pointer; transition: all 0.2s; }#quiz-cb4a9ea2 .options li:hover:not(.disabled) { border-color: #4caf50; background: #f0fff0; }#quiz-cb4a9ea2 .options li.correct { border-color: #4caf50; background: #e8f5e9; }#quiz-cb4a9ea2 .options li.wrong { border-color: #f44336; background: #ffebee; }#quiz-cb4a9ea2 .options li.disabled { cursor: default; opacity: 0.7; }#quiz-cb4a9ea2 .options li.show-answer { border-color: #4caf50; background: #e8f5e9; }#quiz-cb4a9ea2 .feedback { margin-top: 15px; padding: 12px; border-radius: 6px; display: none; }#quiz-cb4a9ea2 .feedback.correct { background: #e8f5e9; color: #2e7d32; display: block; }#quiz-cb4a9ea2 .feedback.wrong { background: #ffebee; color: #c62828; display: block; }#quiz-cb4a9ea2 .score { text-align: center; font-size: 1.5em; padding: 20px; background: white; border-radius: 8px; margin-top: 20px; }#quiz-cb4a9ea2 .code-block { background: #1e1e1e; color: #d4d4d4; padding: 14px; border-radius: 6px; font-family: \"Monaco\", \"Consolas\", \"Courier New\", monospace; font-size: 0.9em; overflow-x: auto; margin: 12px 0; white-space: pre-wrap; }\n<\/style>\n<h1>\u6e2c\u9a57\uff1aMCP \u90e8\u7f72\u8207\u6574\u5408<\/h1>\n    <p>\u5171 5 \u984c\uff0c\u9ede\u9078\u7b54\u6848\u5f8c\u6703\u7acb\u5373\u986f\u793a\u7d50\u679c<\/p>\n\n    <div class=\"question\" id=\"q1\">\n      <h3>1. \u70ba\u4ec0\u9ebc stdio \u50b3\u8f38\u7121\u6cd5\u7528\u4f86\u8b93\u9060\u7aef\u6a5f\u5668\u9023\u4e0a\u4f60\u7684 MCP server\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(1, 'A', 'C')\">A. stdio \u50b3\u8f38\u901f\u5ea6\u592a\u6162\uff0c\u4e0d\u9069\u5408\u7db2\u8def<\/li>\n        <li onclick=\"checkAnswer(1, 'B', 'C')\">B. stdio \u6c92\u6709\u52a0\u5bc6\uff0c\u88ab\u9632\u706b\u7246\u64cb\u6389<\/li>\n        <li onclick=\"checkAnswer(1, 'C', 'C')\">C. stdio \u662f\u9760\u5ba2\u6236\u7aef\u5728\u672c\u6a5f\u628a server \u7576\u5b50\u7a0b\u5e8f\u555f\u52d5\uff0c\u5169\u8005\u5fc5\u9808\u5728\u540c\u4e00\u53f0\u6a5f\u5668<\/li>\n        <li onclick=\"checkAnswer(1, 'D', 'C')\">D. stdio \u4e00\u6b21\u53ea\u80fd\u670d\u52d9\u4e00\u500b\u5de5\u5177\u547c\u53eb<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb1\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q2\">\n      <h3>2. \u5728 FastMCP 2.x \u4e2d\uff0c\u8981\u628a server \u5207\u63db\u6210\u5c0d\u5916\u7684 Streamable HTTP \u50b3\u8f38\uff0c\u6700\u6b63\u78ba\u7684\u5beb\u6cd5\u662f\uff1f<\/h3>\n      <div class=\"code-block\">mcp.run(transport=____, host=&#8221;0.0.0.0&#8243;, port=8000, path=&#8221;\/mcp&#8221;)<\/div>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(2, 'A', 'B')\">A. &#8220;stdio&#8221;<\/li>\n        <li onclick=\"checkAnswer(2, 'B', 'B')\">B. &#8220;http&#8221;<\/li>\n        <li onclick=\"checkAnswer(2, 'C', 'B')\">C. &#8220;websocket&#8221;<\/li>\n        <li onclick=\"checkAnswer(2, 'D', 'B')\">D. &#8220;tcp&#8221;<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb2\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q3\">\n      <h3>3. \u6839\u64da\u6587\u7ae0\uff0c\u70ba\u4ec0\u9ebc\u300c\u5c0d\u5916\u7684 HTTP MCP server \u4e00\u5b9a\u8981\u52a0\u6388\u6b0a\u300d\uff0c\u4f46 stdio \u6642\u4ee3\u901a\u5e38\u4e0d\u7528\u7169\u60f1\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(3, 'A', 'D')\">A. HTTP \u50b3\u8f38\u672c\u8eab\u6709\u6f0f\u6d1e\uff0cstdio \u6c92\u6709<\/li>\n        <li onclick=\"checkAnswer(3, 'B', 'D')\">B. HTTP \u4e00\u5b9a\u8981\u4ed8\u8cbb\u624d\u80fd\u7528\u6388\u6b0a\u529f\u80fd<\/li>\n        <li onclick=\"checkAnswer(3, 'C', 'D')\">C. stdio \u6703\u81ea\u52d5\u52a0\u5bc6\u6240\u6709\u8a0a\u606f<\/li>\n        <li onclick=\"checkAnswer(3, 'D', 'D')\">D. stdio \u80fd\u555f\u52d5\u7a0b\u5e8f\u7684\u4eba\u672c\u4f86\u5c31\u662f\u672c\u6a5f\u4f7f\u7528\u8005\uff1bHTTP \u639b\u4e0a\u7db2\u5f8c\u4efb\u4f55\u77e5\u9053\u7db2\u5740\u7684\u4eba\u90fd\u80fd\u547c\u53eb\u5de5\u5177<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb3\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q4\">\n      <h3>4. \u5728 MCP 2026 \u6388\u6b0a\u898f\u683c\u4e2d\uff0c\u4f60\u81ea\u5df1\u5beb\u7684 MCP server \u626e\u6f14\u4ec0\u9ebc\u89d2\u8272\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(4, 'A', 'A')\">A. Resource Server\uff08\u8cc7\u6e90\u4f3a\u670d\u5668\uff09\uff0c\u53ea\u8ca0\u8cac\u9a57\u7968\uff0c\u4e0d\u8ca0\u8cac\u767c token<\/li>\n        <li onclick=\"checkAnswer(4, 'B', 'A')\">B. Authorization Server\uff0c\u8ca0\u8cac\u8b93\u4f7f\u7528\u8005\u767b\u5165\u4e26\u767c token<\/li>\n        <li onclick=\"checkAnswer(4, 'C', 'A')\">C. \u540c\u6642\u662f\u767b\u5165\u9801\u9762\u8207\u8cc7\u6599\u5eab<\/li>\n        <li onclick=\"checkAnswer(4, 'D', 'A')\">D. \u6191\u8b49\u9812\u767c\u6a5f\u69cb\uff08CA\uff09<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb4\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q5\">\n      <h3>5. \u7528 Claude Code \u8a3b\u518a\u4e00\u500b\u300c\u9060\u7aef HTTP\u300dMCP server\uff0c\u6b63\u78ba\u7684\u6307\u4ee4\u662f\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(5, 'A', 'B')\">A. claude mcp add my-server &#8212; python server.py<\/li>\n        <li onclick=\"checkAnswer(5, 'B', 'B')\">B. claude mcp add &#8211;transport http my-server https:\/\/mcp.yourcompany.com\/mcp<\/li>\n        <li onclick=\"checkAnswer(5, 'C', 'B')\">C. claude mcp run &#8211;stdio server.py<\/li>\n        <li onclick=\"checkAnswer(5, 'D', 'B')\">D. pip install my-server<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb5\"><\/div>\n    <\/div>\n\n    <div class=\"score\" id=\"score\" style=\"display:none;\"><\/div>\n<script>\n\n      let answered = 0;\n      let correct = 0;\n      const total = 5;\n      const explanations = {\n        1: \"stdio \u662f\u628a server \u7576\u672c\u5730\u5b50\u7a0b\u5e8f spawn \u4f86\u6e9d\u901a\uff0c\u6240\u4ee5\u5ba2\u6236\u7aef\u8207 server \u5fc5\u9808\u5728\u540c\u4e00\u53f0\u6a5f\u5668\uff1b\u8981\u8de8\u7db2\u8def\u5c31\u5f97\u63db\u6210 HTTP\u3002\u901f\u5ea6\u3001\u52a0\u5bc6\u3001\u4f75\u767c\u90fd\u4e0d\u662f stdio \u7684\u6838\u5fc3\u9650\u5236\u3002\",\n        2: \"FastMCP 2.x \u7528 transport=\\\"http\\\" \u4ee3\u8868 Streamable HTTP\u3002\\\"streamable-http\\\" \u662f\u5176\u6b63\u5f0f\u5168\u540d\uff08\u7b49\u50f9\uff09\uff0c\\\"sse\\\" \u5247\u662f\u5df2\u88ab\u53d6\u4ee3\u7684\u820a\u50b3\u8f38\uff1b\u6c92\u6709 websocket\/tcp \u9019\u5169\u500b\u9078\u9805\u3002\",\n        3: \"\u5dee\u5225\u5728\u4fe1\u4efb\u908a\u754c\uff1astdio \u80fd\u555f\u52d5\u7a0b\u5e8f\u7684\u5c31\u662f\u672c\u6a5f\u4f7f\u7528\u8005\uff0c\u5929\u7136\u5b89\u5168\uff1bHTTP \u4e00\u65e6\u5c0d\u5916\uff0c\u4efb\u4f55\u77e5\u9053\u7db2\u5740\u7684\u4eba\u90fd\u80fd\u547c\u53eb\u5de5\u5177\uff0c\u82e5\u5de5\u5177\u6703\u52d5\u8cc7\u6599\u5eab\u6216\u5bc4\u4fe1\u5c31\u662f\u707d\u96e3\uff0c\u6240\u4ee5\u5fc5\u9808\u52a0\u6388\u6b0a\u3002\",\n        4: \"MCP 2026 \u6388\u6b0a\u57fa\u65bc OAuth 2.1\uff0c\u660e\u78ba\u628a\u89d2\u8272\u5206\u958b\uff1a\u4f60\u7684 server \u662f Resource Server\uff08\u53ea\u9a57\u7968\uff09\uff0c\u767c token \u4ea4\u7d66\u53e6\u4e00\u500b Authorization Server\uff08IdP\uff0c\u5982 Auth0\u3001GitHub\uff09\u3002\",\n        5: \"\u9060\u7aef HTTP server \u7528 claude mcp add --transport http <\u540d\u7a31> <\u7db2\u5740>\u3002\u628a\u555f\u52d5\u6307\u4ee4\u63a5\u5728 -- \u5f8c\u9762\uff08A\uff09\u662f\u672c\u6a5f stdio \u7684\u5beb\u6cd5\u3002\"\n      };\n\n      function checkAnswer(qNum, selected, correctAns) {\n        const question = document.getElementById(\"q\" + qNum);\n        if (question.classList.contains(\"answered\")) return;\n        question.classList.add(\"answered\");\n        answered++;\n        const options = question.querySelectorAll(\".options li\");\n        options.forEach((opt) => {\n          opt.classList.add(\"disabled\");\n          if (opt.textContent.startsWith(correctAns + \".\")) opt.classList.add(\"show-answer\");\n        });\n        const feedback = document.getElementById(\"fb\" + qNum);\n        if (selected === correctAns) {\n          correct++;\n          feedback.className = \"feedback correct\";\n          feedback.innerHTML = \"\u2713 \u6b63\u78ba\uff01\" + explanations[qNum];\n        } else {\n          feedback.className = \"feedback wrong\";\n          feedback.innerHTML = \"\u2717 \u932f\u8aa4\u3002\u6b63\u78ba\u7b54\u6848\u662f \" + correctAns + \"\u3002\" + explanations[qNum];\n          options.forEach((opt) => { if (opt.textContent.startsWith(selected + \".\")) opt.classList.add(\"wrong\"); });\n        }\n        if (answered === total) {\n          const scoreDiv = document.getElementById(\"score\");\n          scoreDiv.style.display = \"block\";\n          scoreDiv.innerHTML = \"\u6e2c\u9a57\u5b8c\u6210\uff01\u5f97\u5206\uff1a\" + correct + \" \/ \" + total + (correct === total ? \" \ud83c\udf89 \u5168\u5c0d\uff01\" : correct >= Math.ceil(total * 0.6) ? \" \ud83d\udc4d \u4e0d\u932f\uff01\" : \" \ud83d\udcda \u518d\u8907\u7fd2\u4e00\u4e0b\u5427\");\n        }\n      }\n    \n<\/script>\n<\/div>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u7cfb\u5217\u7b2c 4 \u7bc7\uff08\u5171 4 \u7bc7\uff09\uff5c\u96e3\u5ea6\uff1aL2-\u9032\u968e<br>\u524d\u7f6e\uff1a\u9700\u5148\u8b80\u904e\u7b2c 1\uff5e3 \u7bc7\uff08MCP \u6982\u5ff5\u3001\u7528 FastMCP \u5beb server\u3001tools\/resources\/prompts\uff09\uff0c\u4e26\u5177\u5099\u57fa\u672c HTTP \u8207\u90e8\u7f72\u6982\u5ff5<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e00\u53e5\u8a71\u8aaa\u660e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u4e09\u7bc7\u4f60\u7684 server \u4e00\u76f4\u8eb2\u5728\u672c\u6a5f\u3001\u7528 stdio \u8ddf\u5ba2\u6236\u7aef\u8b1b\u8a71\uff1b\u9019\u7bc7\u6559\u4f60\u628a\u5b83\u300c\u642c\u4e0a\u7db2\u300d\u2014\u2014\u5207\u63db\u6210 HTTP \u50b3\u8f38\u3001\u52a0\u4e0a\u57fa\u672c\u7684\u6388\u6b0a\u4fdd\u8b77\uff0c\u6700\u5f8c\u771f\u7684\u63a5\u5230 Claude Code \/ Claude Desktop \u4e0a\u8dd1\u901a\u4e00\u8f2a\u3002\u91cd\u9ede\u4e0d\u662f\u53eb\u4f60\u6703\u5beb\u9019\u4e9b\uff0c\u800c\u662f<strong>\u770b\u61c2 AI \u5e6b\u4f60\u6539\u7684\u90e8\u7f72 code\uff0c\u4e26\u77e5\u9053\u54ea\u88e1\u6700\u5bb9\u6613\u51fa\u5305<\/strong>\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5148\u5c0d\u9f4a\uff1a\u9019\u7bc7\u5728\u89e3\u6c7a\u4ec0\u9ebc\u554f\u984c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b2c 2 \u7bc7\u6211\u5011\u5beb\u7684 server \u7d50\u5c3e\u5927\u6982\u9577\u9019\u6a23\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    mcp.run()   <span class=\"hljs-comment\"># \u6c92\u6307\u5b9a transport\uff0c\u9810\u8a2d\u5c31\u662f stdio<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>stdio<\/code>\uff08standard input\/output\uff09\u7684\u610f\u601d\u662f\uff1a\u5ba2\u6236\u7aef<strong>\u76f4\u63a5\u628a\u4f60\u7684 Python \u7a0b\u5f0f\u7576\u5b50\u7a0b\u5e8f\u555f\u52d5<\/strong>\uff0c\u7528\u6a19\u6e96\u8f38\u5165\u8f38\u51fa\u9019\u689d\u7ba1\u5b50\u50b3\u8a0a\u606f\u3002\u9019\u5728\u672c\u6a5f\u5f88\u723d\u2014\u2014\u4e0d\u7528\u958b\u57e0\u3001\u4e0d\u7528\u7ba1\u7db2\u8def\u2014\u2014\u4f46\u5b83\u6709\u500b\u786c\u9650\u5236\uff1a<strong>\u5ba2\u6236\u7aef\u5fc5\u9808\u8ddf server \u5728\u540c\u4e00\u53f0\u6a5f\u5668<\/strong>\uff0c\u56e0\u70ba\u5b83\u662f\u9760\u300c\u555f\u52d5\u4e00\u500b\u672c\u5730\u7a0b\u5e8f\u300d\u5728\u6e9d\u901a\u7684\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u65e6\u4f60\u60f3\u8b93 server \u8dd1\u5728\u4e00\u53f0\u96f2\u4e3b\u6a5f\u3001\u8b93\u591a\u500b\u4eba\u6216\u591a\u53f0\u6a5f\u5668\u9023\u9032\u4f86\uff0cstdio \u5c31\u4e0d\u5920\u4e86\u3002\u9019\u6642\u8981\u63db\u6210 HTTP \u50b3\u8f38\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u770b\u5230\u9019\u7bc7\u7684 code \u88e1\u51fa\u73fe <code>transport=\"http\"<\/code>\u3001<code>host<\/code>\u3001<code>port<\/code>\u3001<code>\/mcp<\/code> \u8def\u5f91\u3001<code>JWKS<\/code>\u3001<code>Bearer<\/code> \u9019\u4e9b\u5b57\uff0c\u5c31\u662f\u5728\u8b1b\u300c\u628a server \u5c0d\u5916\u670d\u52d9\u300d\u9019\u4ef6\u4e8b\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u50b3\u8f38\u65b9\u5f0f\uff1astdio vs Streamable HTTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FastMCP 2.x \u652f\u63f4\u5169\u7a2e\u4f60\u6703\u5be6\u969b\u7528\u5230\u7684\u50b3\u8f38\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># 1) \u672c\u6a5f\uff1a\u9810\u8a2d stdio<\/span>\nmcp.run()                    <span class=\"hljs-comment\"># \u7b49\u540c mcp.run(transport=\"stdio\")<\/span>\n\n<span class=\"hljs-comment\"># 2) \u5c0d\u5916\uff1aStreamable HTTP<\/span>\nmcp.run(transport=<span class=\"hljs-string\">\"http\"<\/span>, host=<span class=\"hljs-string\">\"127.0.0.1\"<\/span>, port=<span class=\"hljs-number\">8000<\/span>, path=<span class=\"hljs-string\">\"\/mcp\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9010\u884c\u7ffb\u8b6f\u7b2c 2 \u7a2e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>transport=\"http\"<\/code>\uff1a\u6539\u7528 Streamable HTTP \u50b3\u8f38\uff08\u900f\u904e\u4e00\u822c\u7684 HTTP \u8acb\u6c42\uff0b\u4f3a\u670d\u5668\u63a8\u9001\u4f86\u50b3\u8a0a\u606f\uff09\u3002<\/li>\n\n\n<li><code>host=\"127.0.0.1\"<\/code>\uff1a\u53ea\u7d81\u5728\u672c\u6a5f\u56de\u74b0\u4f4d\u5740\uff08\u7b49\u4e00\u4e0b\u7684\u7d05\u65d7\u6703\u8b1b\u9019\u500b\u5751\uff09\u3002<\/li>\n\n\n<li><code>port=8000<\/code>\uff1a\u5c0d\u5916\u807d\u9019\u500b\u57e0\u3002<\/li>\n\n\n<li><code>path=\"\/mcp\"<\/code>\uff1aMCP \u7684\u7aef\u9ede\u639b\u5728 <code>\/mcp<\/code> \u9019\u689d\u8def\u5f91\uff0c\u6240\u4ee5\u5b8c\u6574\u7db2\u5740\u662f <code>http:\/\/127.0.0.1:8000\/mcp<\/code>\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u53e5\u8a71\u8a18\u4f4f\u5dee\u5225\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>stdio<\/th>\n<th>Streamable HTTP<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u8ab0\u555f\u52d5 server<\/td>\n<td>\u5ba2\u6236\u7aef\u628a\u5b83\u7576\u5b50\u7a0b\u5e8f spawn<\/td>\n<td>\u4f60\u81ea\u5df1\u5148\u628a\u5b83\u8dd1\u8d77\u4f86\u7576\u670d\u52d9<\/td>\n<\/tr>\n<tr>\n<td>\u4f4d\u7f6e<\/td>\n<td>\u5fc5\u9808\u540c\u4e00\u53f0\u6a5f\u5668<\/td>\n<td>\u53ef\u4ee5\u8de8\u7db2\u8def<\/td>\n<\/tr>\n<tr>\n<td>\u8981\u958b\u57e0\u55ce<\/td>\n<td>\u4e0d\u7528<\/td>\n<td>\u8981\uff08host\/port\/path\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u9069\u5408<\/td>\n<td>\u672c\u6a5f\u5de5\u5177\u3001\u958b\u767c\u6e2c\u8a66<\/td>\n<td>\u6b63\u5f0f\u5c0d\u5916\u3001\u591a\u4eba\u5171\u7528<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u5fc5\u770b\u61c2<\/strong>\uff1a<code>transport=\"http\"<\/code> \u4ee3\u8868\u9019 server \u8981\u5c0d\u5916\u4e86\uff0c\u63a5\u4e0b\u4f86\u6240\u6709\u5b89\u5168\u554f\u984c\u90fd\u8ddf\u8457\u4f86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd70\ufe0f <strong>\u8a8d\u5f97\u5c31\u597d\uff08\u820a\u5beb\u6cd5\uff09<\/strong>\uff1a\u4f60\u53ef\u80fd\u6703\u5728\u820a code \u770b\u5230 <code>transport=\"sse\"<\/code>\uff08Server-Sent Events\uff09\u6216 <code>transport=\"streamable-http\"<\/code>\uff08\u5b8c\u6574\u540d\u7a31\uff09\u3002<code>sse<\/code> \u662f<strong>\u4e0a\u4e00\u4ee3\u3001\u5df2\u88ab\u53d6\u4ee3<\/strong>\u7684\u50b3\u8f38\uff1b<code>streamable-http<\/code> \u5247\u662f <code>http<\/code> \u7684\u6b63\u5f0f\u5168\u540d\uff0c\u5169\u8005\u7b49\u50f9\u3002AI \u82e5\u5e6b\u4f60\u7dad\u8b77\u820a\u5c08\u6848\u53ef\u80fd\u5beb\u6210\u9019\u6a23\uff0c\u770b\u5230\u4e0d\u7528\u614c\uff0c\u4f46\u65b0\u5c08\u6848\u4e00\u5f8b\u7528 <code>\"http\"<\/code>\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u90e8\u7f72\u8003\u91cf\uff1a\u5c0d\u5916\u670d\u52d9\u8981\u591a\u60f3\u4e09\u4ef6\u4e8b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a <code>mcp.run(transport=\"http\", ...)<\/code> \u8dd1\u8d77\u4f86\uff0c\u5b83\u5176\u5be6\u662f\u555f\u52d5\u4e86\u4e00\u500b ASGI web \u670d\u52d9\uff08\u5e95\u5c64\u662f Uvicorn\/Starlette\uff09\u3002\u8981\u771f\u7684\u300c\u5c0d\u5916\u300d\uff0c\u4f60\u6703\u9047\u5230\u4e09\u500b\u7d93\u5178\u554f\u984c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. \u7d81 127.0.0.1 \u9084\u662f 0.0.0.0\uff1f<\/h3>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \u53ea\u6709\u672c\u6a5f\u9023\u5f97\u5230\uff08\u5916\u9762\u9023\u4e0d\u9032\u4f86\uff09<\/span>\nmcp.run(transport=<span class=\"hljs-string\">\"http\"<\/span>, host=<span class=\"hljs-string\">\"127.0.0.1\"<\/span>, port=<span class=\"hljs-number\">8000<\/span>)\n\n<span class=\"hljs-comment\"># \u8b93\u6a5f\u5668\u7684\u7db2\u8def\u4ecb\u9762\u90fd\u80fd\u9023\u9032\u4f86\uff08\u96f2\u4e3b\u6a5f\uff0f\u5bb9\u5668\u88e1\u901a\u5e38\u8981\u9019\u500b\uff09<\/span>\nmcp.run(transport=<span class=\"hljs-string\">\"http\"<\/span>, host=<span class=\"hljs-string\">\"0.0.0.0\"<\/span>, port=<span class=\"hljs-number\">8000<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>127.0.0.1<\/code> = \u300c\u53ea\u63a5\u53d7\u9019\u53f0\u6a5f\u5668\u81ea\u5df1\u7684\u9023\u7dda\u300d\uff1b<code>0.0.0.0<\/code> = \u300c\u63a5\u53d7\u4f86\u81ea\u4efb\u4f55\u7db2\u5361\u7684\u9023\u7dda\u300d\u3002\u5728\u5bb9\u5668\u6216\u96f2\u4e3b\u6a5f\u88e1\u5fd8\u4e86\u6539\u6210 <code>0.0.0.0<\/code>\uff0c\u5c31\u6703\u51fa\u73fe\u300c\u672c\u6a5f curl \u5f97\u5230\u3001\u5916\u9762\u6b7b\u6d3b\u9023\u4e0d\u4e0a\u300d\u7684\u9b3c\u6253\u7246\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. \u524d\u9762\u901a\u5e38\u9084\u6709\u4e00\u5c64\u53cd\u5411\u4ee3\u7406<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b63\u5f0f\u74b0\u5883\u5f88\u5c11\u8b93 Python \u670d\u52d9<strong>\u76f4\u63a5<\/strong>\u66dd\u9732\u5728\u516c\u7db2\uff0c\u524d\u9762\u4e00\u822c\u64fa nginx \/ Caddy \/ Traefik \u9019\u985e\u53cd\u5411\u4ee3\u7406\uff0c\u8ca0\u8cac HTTPS \u6191\u8b49\u3001\u7d81\u7db2\u57df\u3001\u64cb\u6d41\u91cf\u3002\u4f60\u7684 FastMCP \u53ea\u9700\u5728\u5167\u90e8\u807d\u4e00\u500b\u57e0\uff08\u4f8b\u5982 <code>127.0.0.1:8000<\/code>\uff09\uff0c\u4ee3\u7406\u518d\u628a <code>https:\/\/mcp.yourcompany.com\/mcp<\/code> \u8f49\u9032\u4f86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53cd\u5411\u4ee3\u7406\u6709\u500b MCP \u5c08\u5c6c\u7684\u5751\uff1aStreamable HTTP \u6703\u7528\u5230\u4f3a\u670d\u5668\u6301\u7e8c\u63a8\u9001\uff08\u4e32\u6d41\uff09\u3002\u5982\u679c\u4ee3\u7406\u628a\u56de\u61c9<strong>\u7de9\u885d<\/strong>\u8d77\u4f86\uff08buffering\uff09\u7b49\u6536\u5b8c\u624d\u5410\u7d66\u5ba2\u6236\u7aef\uff0c\u4e32\u6d41\u5c31\u58de\u4e86\u3002nginx \u8a18\u5f97\u5c0d\u9019\u689d\u8def\u5f91\u95dc\u6389\u7de9\u885d\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">location \/mcp {\n    proxy_pass http:<span class=\"hljs-comment\">\/\/127.0.0.1:8000;<\/span>\n    proxy_buffering off;      <span class=\"hljs-comment\"># \ud83d\udea9 \u95dc\u9375\uff1a\u4e0d\u7136\u4e32\u6d41\u6703\u5361\u4f4f<\/span>\n    proxy_read_timeout <span class=\"hljs-number\">3600<\/span>s; <span class=\"hljs-comment\"># \u9577\u9023\u7dda\u5225\u592a\u5feb\u88ab\u5207<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">3. \u6709\u72c0\u614b vs \u7121\u72c0\u614b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">FastMCP \u7684 HTTP \u9810\u8a2d\u662f<strong>\u6709\u72c0\u614b<\/strong>\u7684\uff08server \u8a18\u5f97\u6bcf\u500b\u9023\u7dda\u7684 session\uff09\u3002\u5982\u679c\u4f60\u8981\u5728\u591a\u53f0\u6a5f\u5668\u5f8c\u9762\u505a\u8ca0\u8f09\u5e73\u8861\u3001\u6216\u60f3\u90e8\u7f72\u6210 serverless\uff0c\u901a\u5e38\u6703\u6539\u6210\u7121\u72c0\u614b\u6a21\u5f0f\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">mcp = FastMCP(<span class=\"hljs-string\">\"my-server\"<\/span>, stateless_http=<span class=\"hljs-keyword\">True<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><code>stateless_http=True<\/code> \u767d\u8a71\u8b1b\u5c31\u662f\u300c\u6bcf\u500b\u8acb\u6c42\u5404\u81ea\u7368\u7acb\u3001server \u4e0d\u8a18\u5f97\u4e0a\u4e00\u500b\u300d\uff0c\u9019\u6a23\u4efb\u4f55\u4e00\u53f0\u6a5f\u5668\u90fd\u80fd\u8655\u7406\u4efb\u4f55\u8acb\u6c42\uff0c\u597d\u6c34\u5e73\u64f4\u5c55\u3002<strong>\u77e5\u9053\u6709\u9019\u9078\u9805\u5c31\u597d<\/strong>\uff0c\u4e00\u958b\u59cb\u4e0d\u7528\u78b0\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u6388\u6b0a\u8207\u5b89\u5168\uff1a\u5c0d\u5916\u7684 server \u4e00\u5b9a\u8981\u6709\u9580<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u662f\u6574\u7bc7\u6700\u91cd\u8981\u7684\u4e00\u6bb5\u3002<strong>stdio \u6642\u4ee3\u4e0d\u592a\u9700\u8981\u7169\u60f1\u6388\u6b0a<\/strong>\uff0c\u56e0\u70ba\u80fd\u555f\u52d5\u4f60\u7a0b\u5e8f\u7684\u4eba\u672c\u4f86\u5c31\u662f\u672c\u6a5f\u4f7f\u7528\u8005\u3002\u4e00\u65e6\u63db\u6210 HTTP\u3001\u639b\u4e0a\u516c\u7db2\uff0c\u60c5\u6cc1\u5b8c\u5168\u53cd\u904e\u4f86\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u6c92\u52a0\u4fdd\u8b77\u7684 HTTP MCP server = \u4f60\u628a\u300c\u80fd\u57f7\u884c\u9019\u4e9b\u5de5\u5177\u300d\u7684\u80fd\u529b\u516c\u958b\u5728\u7db2\u8def\u4e0a\uff0c\u4efb\u4f55\u77e5\u9053\u7db2\u5740\u7684\u4eba\u90fd\u80fd\u547c\u53eb\u3002\u5982\u679c\u4f60\u7684\u5de5\u5177\u6703\u67e5\u8cc7\u6599\u5eab\u3001\u5bc4\u4fe1\u3001\u52d5\u6a94\u6848\uff0c\u9019\u5c31\u662f\u707d\u96e3\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">MCP 2026 \u898f\u683c\u600e\u9ebc\u770b\u6388\u6b0a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">2026 \u7248\u7684 MCP \u6388\u6b0a\u5efa\u7acb\u5728 <strong>OAuth 2.1<\/strong> \u4e0a\uff0c\u6838\u5fc3\u89d2\u8272\u5206\u5de5\u662f\u9019\u6a23\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>\u4f60\u7684 MCP server = Resource Server\uff08\u8cc7\u6e90\u4f3a\u670d\u5668\uff09<\/strong>\uff1a\u53ea\u8ca0\u8cac\u300c\u9a57\u7968\u300d\uff0c\u4e0d\u8ca0\u8cac\u767c\u7968\u3002<\/li>\n\n\n<li><strong>Authorization Server\uff08\u6388\u6b0a\u4f3a\u670d\u5668\uff09= \u53e6\u4e00\u500b\u8eab\u5206\u4f9b\u61c9\u5546\uff08IdP\uff09<\/strong>\uff1a\u50cf Auth0\u3001WorkOS\u3001GitHub\u3001Google\uff0c\u8ca0\u8cac\u767b\u5165\u4f7f\u7528\u8005\u3001\u767c token\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e7e\u500b\u4f60\u5728 code \u6216\u8a2d\u5b9a\u88e1\u6703\u770b\u5230\u3001\u503c\u5f97\u8a8d\u5f97\u7684\u898f\u683c\u540d\u8a5e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Protected Resource Metadata\uff08RFC 9728\uff09<\/strong>\uff1aserver \u6703\u63d0\u4f9b\u4e00\u500b <code>\/.well-known\/oauth-protected-resource<\/code> \u7aef\u9ede\uff0c\u7b49\u65bc\u9580\u53e3\u8cbc\u5f35\u544a\u793a\uff1a\u300c\u8981\u9032\u4f86\uff1f\u53bb\u9019\u500b\u6388\u6b0a\u4f3a\u670d\u5668\u62ff\u7968\u300d\u3002\u5ba2\u6236\u7aef\u6c92\u5e36\u7968\u6642\uff0cserver \u56de <code>401<\/code> \u4e26\u9644\u4e0a\u9019\u500b\u8cc7\u8a0a\uff0c\u5ba2\u6236\u7aef\u5c31\u77e5\u9053\u8a72\u53bb\u54ea\u767b\u5165\u3002<\/li>\n\n\n<li><strong>Resource Indicators\uff08RFC 8707\uff09<\/strong>\uff1a\u5ba2\u6236\u7aef\u62ff\u7968\u6642\u8981\u8a3b\u660e\u300c\u9019\u5f35\u7968\u662f\u8981\u7528\u5728<strong>\u54ea\u500b<\/strong> server\u300d\uff0c\u767c\u51fa\u4f86\u7684 token \u5c31\u88ab\u7d81\u5b9a\u5230\u4f60\u7684 server\uff08audience \u7d81\u5b9a\uff09\u3002\u9019\u662f\u70ba\u4e86\u9632\u6b62\u300c\u62ff\u53bb A server \u7684\u7968\u88ab\u5077\u6e21\u5230 B server \u7528\u300d\u7684\u6df7\u6dc6\u4ee3\u7406\uff08confused deputy\uff09\u653b\u64ca\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f60\u4e0d\u9700\u8981\u80cc\u9019\u4e9b RFC \u865f\u78bc\uff0c\u4f46\u8981\u80fd\u8a8d\u5f97\uff1a<strong>\u6388\u6b0a\u4f3a\u670d\u5668\u548c\u8cc7\u6e90\u4f3a\u670d\u5668\u662f\u5206\u958b\u7684\uff0ctoken \u8981\u7d81\u5b9a\u5230\u7279\u5b9a server<\/strong>\uff0c\u9019\u662f\u65b0\u898f\u683c\u7684\u5169\u500b\u4e3b\u65cb\u5f8b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">FastMCP \u600e\u9ebc\u52a0\u9a57\u8b49<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u52d9\u5be6\u7684\u5165\u9580\u4f5c\u6cd5\u662f\u300c\u9a57 Bearer JWT\u300d\uff1a\u5ba2\u6236\u7aef\u6bcf\u500b\u8acb\u6c42\u5e36\u4e00\u500b <code>Authorization: Bearer &lt;token&gt;<\/code>\uff0c\u4f60\u7684 server \u62ff IdP \u516c\u958b\u7684\u91d1\u9470\uff08JWKS\uff09\u53bb\u9a57\u9019\u5f35 token \u662f\u4e0d\u662f\u771f\u7684\u3001\u6709\u6c92\u6709\u904e\u671f\u3001audience \u5c0d\u4e0d\u5c0d\u3002<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> fastmcp <span class=\"hljs-keyword\">import<\/span> FastMCP\n<span class=\"hljs-keyword\">from<\/span> fastmcp.server.auth.providers.jwt <span class=\"hljs-keyword\">import<\/span> JWTVerifier\n\nverifier = JWTVerifier(\n    jwks_uri=<span class=\"hljs-string\">\"https:\/\/your-idp.example.com\/.well-known\/jwks.json\"<\/span>,\n    issuer=<span class=\"hljs-string\">\"https:\/\/your-idp.example.com\"<\/span>,\n    audience=<span class=\"hljs-string\">\"https:\/\/mcp.yourcompany.com\/mcp\"<\/span>,\n)\n\nmcp = FastMCP(<span class=\"hljs-string\">\"secure-server\"<\/span>, auth=verifier)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9010\u884c\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>jwks_uri=...<\/code>\uff1aIdP \u516c\u4f48\u516c\u9470\u7684\u5730\u65b9\uff0cserver \u7528\u5b83\u4f86\u9a57\u8b49 token \u7c3d\u7ae0\u662f\u771f\u7684\u3002<\/li>\n\n\n<li><code>issuer=...<\/code>\uff1a\u53ea\u63a5\u53d7\u9019\u500b\u767c\u884c\u8005\u767c\u7684\u7968\u3002<\/li>\n\n\n<li><code>audience=...<\/code>\uff1a\u53ea\u63a5\u53d7\u300c\u6307\u5b9a\u7d66\u6211\u9019\u500b server\u300d\u7684\u7968\u2014\u2014\u9019\u884c\u5c31\u5c0d\u61c9\u4e0a\u9762 Resource Indicators \u7684 audience \u7d81\u5b9a\u3002<\/li>\n\n\n<li><code>auth=verifier<\/code>\uff1a\u628a\u9019\u500b\u9a57\u8b49\u5668\u4ea4\u7d66 FastMCP\uff0c\u4e4b\u5f8c<strong>\u6bcf\u500b HTTP \u8acb\u6c42\u90fd\u6703\u5148\u904e\u5b89\u6aa2<\/strong>\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">FastMCP \u4e5f\u6709\u628a\u5e38\u898b IdP \u5305\u597d\u7684\u6574\u5408\uff08\u4f8b\u5982 GitHub\u3001Google\u3001WorkOS\u3001Auth0 \u7684 provider\uff09\uff0c\u8b93\u4f60\u9023\u300c\u4f7f\u7528\u8005\u767b\u5165 \u2192 \u62ff token\u300d\u6574\u689d OAuth \u6d41\u7a0b\u90fd\u7701\u4e8b\u3002\u521d\u671f\u4e0d\u7528\u5168\u4e0a\uff0c\u5148\u6709 <code>JWTVerifier<\/code> \u9019\u9053\u9580\u5c31\u8d0f\u904e\u300c\u88f8\u5954\u300d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd70\ufe0f <strong>\u8a8d\u5f97\u5c31\u597d\uff08\u820a\u547d\u540d\uff09<\/strong>\uff1a\u820a\u7248 FastMCP \u9019\u500b\u985e\u5225\u53eb <code>BearerAuthProvider<\/code>\uff08\u5728 <code>fastmcp.server.auth.providers.bearer<\/code>\uff09\u3002\u529f\u80fd\u4e00\u6a23\uff0c\u53ea\u662f\u5f8c\u4f86\u6539\u540d\u6210 <code>JWTVerifier<\/code>\u3002AI \u5f9e\u820a\u6559\u5b78\u6284\u4f86\u6642\u53ef\u80fd\u7d66\u4f60\u820a\u540d\u5b57\uff0cimport \u5831 <code>ImportError<\/code> \u6642\u5c31\u5f80\u9019\u500b\u65b9\u5411\u554f\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u63a5\u4e0a AI \u5ba2\u6236\u7aef\uff1a\u7aef\u5230\u7aef\u8dd1\u901a\u4e00\u8f2a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">server \u4e0a\u7dda\u4e86\u3001\u6709\u9580\u4e86\uff0c\u6700\u5f8c\u4e00\u6b65\u662f\u628a\u5b83\u8a3b\u518a\u7d66\u5be6\u969b\u7684 AI \u5ba2\u6236\u7aef\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Claude Code\uff08CLI\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Code \u7528 <code>claude mcp add<\/code> \u8a3b\u518a\u3002<strong>\u9060\u7aef HTTP<\/strong> server \u9019\u6a23\u52a0\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">claude mcp add --transport http my-server https:<span class=\"hljs-comment\">\/\/mcp.yourcompany.com\/mcp<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c server \u8981\u6388\u6b0a\uff0c\u5e36\u4e0a header\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">claude mcp add --transport http my-server https:<span class=\"hljs-comment\">\/\/mcp.yourcompany.com\/mcp \\<\/span>\n  --header <span class=\"hljs-string\">\"Authorization: Bearer &lt;\u4f60\u7684token&gt;\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u672c\u6a5f stdio<\/strong> server \u5247\u662f\u628a\u555f\u52d5\u6307\u4ee4\u63a5\u5728 <code>--<\/code> \u5f8c\u9762\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">claude<\/span> <span class=\"hljs-selector-tag\">mcp<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-selector-tag\">my-server<\/span> <span class=\"hljs-selector-tag\">--<\/span> <span class=\"hljs-selector-tag\">python<\/span> <span class=\"hljs-selector-tag\">server<\/span><span class=\"hljs-selector-class\">.py<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u52a0\u5b8c\u7528 <code>claude mcp list<\/code> \u770b\u6709\u6c92\u6709\u9023\u4e0a\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Claude Desktop\uff08\u8a2d\u5b9a\u6a94\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Desktop \u8b80\u4e00\u500b JSON \u8a2d\u5b9a\u6a94\uff08<code>claude_desktop_config.json<\/code>\uff09\u3002\u672c\u6a5f stdio server \u9577\u9019\u6a23\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"mcpServers\"<\/span>: {\n    <span class=\"hljs-attr\">\"my-server\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"python\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"\/absolute\/path\/to\/server.py\"<\/span>]\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u7ffb\u8b6f\uff1a\u300c\u767b\u8a18\u4e00\u500b\u53eb <code>my-server<\/code> \u7684 MCP server\uff0c\u7528 <code>python \/absolute\/path\/to\/server.py<\/code> \u9019\u500b\u6307\u4ee4\u628a\u5b83\u555f\u52d5\u8d77\u4f86\u3002\u300d\u6ce8\u610f\u8def\u5f91\u8981\u7528<strong>\u7d55\u5c0d\u8def\u5f91<\/strong>\uff0c\u9019\u662f\u6700\u5e38\u898b\u7684\u8e29\u96f7\u9ede\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u5c0f\u63d0\u9192\uff1aFastMCP \u6709 CLI \u5e6b\u4f60\u7701\u6389\u624b\u5beb\u8a2d\u5b9a\uff0c\u4f8b\u5982 <code>fastmcp install claude-desktop server.py<\/code>\uff0c\u5b83\u6703\u81ea\u52d5\u628a\u4e0a\u9762\u90a3\u6bb5 JSON \u585e\u9032\u53bb\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">\u7aef\u5230\u7aef\u9a57\u6536\u8207\u9664\u932f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u7dda\u5f8c\u4e0d\u8981\u53ea\u9760\u300c\u5728 Claude \u88e1\u8a66\u8a66\u770b\u300d\uff0c\u90a3\u592a\u6162\u4e5f\u770b\u4e0d\u5230\u7d30\u7bc0\u3002\u4e09\u500b\u597d\u7528\u7684\u9a57\u6536\u624b\u6bb5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>MCP Inspector<\/strong>\uff08\u5b98\u65b9\u9664\u932f UI\uff09\uff1a<\/li>\n\n\n<li><strong>FastMCP \u5167\u5efa Client<\/strong>\uff08\u5beb\u6210\u5c0f\u8173\u672c\uff0c\u53ef\u653e\u9032\u6e2c\u8a66\uff09\uff1a<\/li>\n\n\n<li><strong>curl \u6253\u7aef\u9ede<\/strong>\uff1a\u76f4\u63a5 <code>curl<\/code> server \u7684 <code>\/mcp<\/code>\uff0c\u7528\u4f86\u5206\u8fa8\u300c\u662f server \u639b\u4e86\uff0c\u9084\u662f\u5ba2\u6236\u7aef\u8a2d\u5b9a\u932f\u4e86\u300d\u3002<\/li>\n\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udea9 \u7d05\u65d7\uff1a\u9019\u4e9b\u770b\u5230\u8981\u7acb\u523b\u8b66\u89ba<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AI \u5e6b\u4f60\u5beb\u90e8\u7f72 code \u6642\uff0c\u6700\u5e38\u5728\u9019\u5e7e\u500b\u5730\u65b9\u57cb\u96f7\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \ud83d\udea9 \u7d05\u65d7 1\uff1a\u5c0d\u5916 HTTP \u537b\u5b8c\u5168\u6c92 auth<\/span>\nmcp.run(transport=<span class=\"hljs-string\">\"http\"<\/span>, host=<span class=\"hljs-string\">\"0.0.0.0\"<\/span>, port=<span class=\"hljs-number\">8000<\/span>)\n<span class=\"hljs-comment\"># \u7d81 0.0.0.0 \u66dd\u9732\u5230\u516c\u7db2\u3001\u53c8\u6c92 auth = \u8ab0\u90fd\u80fd\u547c\u53eb\u4f60\u7684\u5de5\u5177\u3002<\/span>\n<span class=\"hljs-comment\"># \u5c0d AI \u8aaa\uff1a\u300c\u9019\u500b\u5c0d\u5916 server \u6c92\u6709\u4efb\u4f55\u6388\u6b0a\u4fdd\u8b77\uff0c\u5e6b\u6211\u52a0\u4e0a JWT\/Bearer \u9a57\u8b49\u300d<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \ud83d\udea9 \u7d05\u65d7 2\uff1a\u628a\u6536\u5230\u7684 token \u539f\u5c01\u4e0d\u52d5\u8f49\u624b\u7d66\u4e0b\u6e38<\/span>\nheaders = {<span class=\"hljs-string\">\"Authorization\"<\/span>: request.headers&#91;<span class=\"hljs-string\">\"Authorization\"<\/span>]}\nrequests.get(<span class=\"hljs-string\">\"https:\/\/other-api.com\"<\/span>, headers=headers)\n<span class=\"hljs-comment\"># \u9019\u662f token passthrough \/ \u6df7\u6dc6\u4ee3\u7406\uff0cMCP 2026 \u898f\u683c\u660e\u6587\u53cd\u5c0d\u3002<\/span>\n<span class=\"hljs-comment\"># token \u61c9\u8a72\u662f\u7d81\u5b9a\u7d66\u300c\u4f60\u9019\u500b server\u300d\u7684\uff0c\u4e0d\u8a72\u62ff\u53bb\u5225\u8655\u7528\u3002<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n\n<li>\ud83d\udea9 <strong><code>audience<\/code> \u6c92\u8a2d\u6216\u8a2d\u932f<\/strong>\uff1atoken \u9a57\u8b49\u770b\u4f3c\u6709\u505a\uff0c\u4f46\u8ab0\u7684\u7968\u90fd\u6536\uff0c\u7b49\u65bc\u9580\u5f62\u540c\u865b\u8a2d\u3002\u8981\u78ba\u8a8d <code>audience<\/code> \u5c0d\u5230\u4f60 server \u7684\u771f\u5be6\u7db2\u5740\u3002<\/li>\n\n\n<li>\ud83d\udea9 <strong>\u53cd\u5411\u4ee3\u7406\u958b\u8457 buffering<\/strong>\uff1a\u4e32\u6d41\u6703\u83ab\u540d\u5361\u4f4f\u3001\u5ba2\u6236\u7aef\u4e00\u76f4\u8f49\u5708\u3002\u770b\u5230 nginx \u8a2d\u5b9a\u6c92 <code>proxy_buffering off<\/code> \u5c31\u8981\u554f\u3002<\/li>\n\n\n<li>\ud83d\udea9 <strong>\u516c\u7db2\u670d\u52d9\u6c92 HTTPS<\/strong>\uff1aBearer token \u7528\u660e\u6587 HTTP \u50b3\u7b49\u65bc\u628a\u9470\u5319\u8cbc\u5728\u9580\u4e0a\u3002\u6b63\u5f0f\u5c0d\u5916\u4e00\u5b9a\u8d70 <code>https:\/\/<\/code>\u3002<\/li>\n\n\n<li>\ud83d\udea9 <strong>host \u7d81 <code>127.0.0.1<\/code> \u537b\u62b1\u6028\u5916\u9762\u9023\u4e0d\u4e0a<\/strong>\uff1a\u9019\u4e0d\u662f\u5b89\u5168\u554f\u984c\u800c\u662f\u9023\u4e0d\u901a\uff0c\u5bb9\u5668\/\u96f2\u4e3b\u6a5f\u8a18\u5f97\u6539 <code>0.0.0.0<\/code>\uff08\u4f46\u540c\u6642\u52d9\u5fc5\u914d\u4e0a auth\uff0c\u5225\u70ba\u4e86\u9023\u901a\u5c31\u88f8\u5954\uff09\u3002<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Vibe Coder \u9a57\u6536\u6aa2\u67e5\u9ede<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u53eb AI \u5e6b\u4f60\u628a server \u4e0a\u7dda\u5f8c\uff0c\u7167\u9019\u5f35\u8868\u9010\u9805\u9a57\u6536\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>[ ] <strong>\u50b3\u8f38\u5c0d\u4e0d\u5c0d<\/strong>\uff1a<code>grep transport server.py<\/code>\uff0c\u78ba\u8a8d\u662f <code>\"http\"<\/code>\uff08\u5c0d\u5916\uff09\u9084\u662f <code>\"stdio\"<\/code>\uff08\u672c\u6a5f\uff09\u7b26\u5408\u4f60\u7684\u610f\u5716\u3002<\/li>\n\n\n<li>[ ] <strong>\u6709\u6c92\u6709\u9580<\/strong>\uff1a\u5c0d\u5916\u7684 server\uff0ccode \u88e1\u8981\u627e\u5f97\u5230 <code>auth=<\/code>\u3002\u6c92\u6709\u5c31\u662f\u88f8\u5954\uff0c\u9000\u56de\u53bb\u8981 AI \u52a0\u3002<\/li>\n\n\n<li>[ ] <strong>\u672c\u6a5f\u9023\u5f97\u5230\u55ce<\/strong>\uff1a<\/li>\n\n\n<li>[ ] <strong>\u6388\u6b0a\u6709\u6548\u55ce<\/strong>\uff1a\u6545\u610f<strong>\u4e0d\u5e36<\/strong> token \u547c\u53eb\u4e00\u6b21\uff0c\u61c9\u8a72\u88ab\u64cb\uff08\u56de 401\uff09\uff0c\u800c\u4e0d\u662f\u7167\u6a23\u57f7\u884c\u3002\u64cb\u4e0d\u4e0b\u4f86\u4ee3\u8868 auth \u6c92\u771f\u7684\u751f\u6548\u3002<\/li>\n\n\n<li>[ ] <strong>\u5ba2\u6236\u7aef\u770b\u5f97\u5230<\/strong>\uff1a<code>claude mcp list<\/code> \u88e1\u4f60\u7684 server \u72c0\u614b\u662f\u9023\u4e0a\u7684\u3002<\/li>\n\n\n<li>[ ] <strong>\u7aef\u5230\u7aef<\/strong>\uff1a\u5728 Claude \u88e1\u5be6\u969b\u8acb\u5b83\u7528\u4e00\u6b21\u4f60\u7684\u5de5\u5177\uff0c\u62ff\u5230\u9810\u671f\u7d50\u679c\u3002<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u770b\u4e0d\u61c2\u5c31\u9019\u6a23\u554f AI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u300c\u9019\u6bb5 <code>mcp.run(...)<\/code> \u662f\u7528 stdio \u9084\u662f HTTP \u50b3\u8f38\uff1f\u5c0d\u5916\u670d\u52d9\u7684\u8a71\u9084\u7f3a\u54ea\u4e9b\u5b89\u5168\u8a2d\u5b9a\uff1f\u300d<\/li>\n\n\n<li>\u300c\u5e6b\u6211\u6aa2\u67e5\u9019\u500b\u5c0d\u5916 MCP server \u6709\u6c92\u6709\u505a\u6388\u6b0a\uff0c\u6c92\u6709\u7684\u8a71\u7528 JWTVerifier \u5e6b\u6211\u88dc\u4e0a\uff0c\u4e26\u89e3\u91cb <code>issuer<\/code> \/ <code>audience<\/code> \u5404\u8981\u586b\u4ec0\u9ebc\u3002\u300d<\/li>\n\n\n<li>\u300c\u6211\u7167\u8a2d\u5b9a\u628a server \u52a0\u5230 Claude Code \u4f46\u9023\u4e0d\u4e0a\uff0c\u4e00\u6b65\u4e00\u6b65\u6559\u6211\u600e\u9ebc\u7528 MCP Inspector \u548c curl \u627e\u51fa\u662f server \u9084\u662f\u5ba2\u6236\u7aef\u7684\u554f\u984c\u3002\u300d<\/li>\n\n\n<li>\u300c\u7528\u767d\u8a71\u89e3\u91cb MCP 2026 \u6388\u6b0a\u898f\u683c\u88e1\u300e\u8cc7\u6e90\u4f3a\u670d\u5668\u548c\u6388\u6b0a\u4f3a\u670d\u5668\u5206\u958b\u300f\u9084\u6709\u300eResource Indicators \/ audience \u7d81\u5b9a\u300f\u5728\u9632\u4ec0\u9ebc\u653b\u64ca\u3002\u300d<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u7cfb\u5217\u56de\u9867\uff1a\u4f60\u73fe\u5728\u6703\u7684\u56db\u4ef6\u4e8b<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>#01\uff1aMCP \u662f\u4ec0\u9ebc\u3001\u70ba\u4ec0\u9ebc\u9700\u8981\u5b83\u3002<\/li>\n\n\n<li>#02\uff1a\u7528 FastMCP \u5beb\u51fa\u7b2c\u4e00\u500b server\u3002<\/li>\n\n\n<li>#03\uff1atools\u3001resources\u3001prompts \u4e09\u7a2e\u80fd\u529b\u600e\u9ebc\u8a2d\u8a08\u3002<\/li>\n\n\n<li>#04\uff08\u672c\u7bc7\uff09\uff1a\u628a server \u5f9e stdio \u63db\u6210 HTTP\u3001\u52a0\u4e0a OAuth\/JWT \u6388\u6b0a\u3001\u63a5\u4e0a\u771f\u5be6 AI \u5ba2\u6236\u7aef\u4e26\u7aef\u5230\u7aef\u9a57\u6536\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5230\u9019\u88e1\uff0c\u4f60\u5df2\u7d93\u80fd\u770b\u61c2 AI \u5e6b\u4f60\u5beb\u7684 MCP \u90e8\u7f72 code\uff0c\u4e5f\u77e5\u9053\u5c0d\u5916\u670d\u52d9\u6642\u6700\u8a72\u76ef\u7684\u90a3\u5e7e\u500b\u5b89\u5168\u7d05\u65d7\u2014\u2014\u9019\u6b63\u662f Vibe Coder \u6700\u9700\u8981\u7684\u300c\u770b\u5f97\u61c2\u3001\u6536\u5f97\u4e0b\u3001\u6293\u5f97\u5230\u5305\u300d\u7684\u80fd\u529b\u3002<\/p>\n\n\n\n<div id=\"quiz-c6b94135\">\n<style>\n#quiz-c6b94135 .badge { display: inline-block; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: bold; margin-left: 8px; }#quiz-c6b94135 .badge.scenario { background: #ebf8ff; color: #2b6cb0; }#quiz-c6b94135 .badge.debug { background: #fef3c7; color: #92400e; }#quiz-c6b94135 .question-adv { background: white; border-radius: 10px; padding: 24px; margin: 20px 0; box-shadow: 0 2px 8px rgba(0,0,0,0.08); border-left: 4px solid #ed8936; }#quiz-c6b94135 .question-adv h3 { margin-top: 0; color: #2d3748; }#quiz-c6b94135 .code-block { background: #1e1e1e; color: #d4d4d4; padding: 14px; border-radius: 6px; font-family: \"Menlo\", \"Monaco\", \"Courier New\", monospace; font-size: 0.9em; overflow-x: auto; margin: 12px 0; white-space: pre-wrap; }#quiz-c6b94135 .options-adv { list-style: none; padding: 0; }#quiz-c6b94135 .options-adv li { padding: 14px 16px; margin: 10px 0; border: 2px solid #e2e8f0; border-radius: 8px; cursor: pointer; transition: all 0.2s; }#quiz-c6b94135 .options-adv li:hover:not(.disabled) { border-color: #ed8936; background: #fffaf0; }#quiz-c6b94135 .options-adv li.disabled { cursor: default; opacity: 0.7; }#quiz-c6b94135 .options-adv li.show-answer { border-color: #48bb78; background: #f0fff4; }#quiz-c6b94135 .options-adv li.wrong { border-color: #fc8181; background: #fff5f5; }#quiz-c6b94135 .feedback-adv { margin-top: 16px; padding: 14px; border-radius: 8px; display: none; line-height: 1.6; }#quiz-c6b94135 .feedback-adv.correct { background: #f0fff4; color: #276749; display: block; }#quiz-c6b94135 .feedback-adv.wrong { background: #fff5f5; color: #c53030; display: block; }#quiz-c6b94135 .feedback-adv \n      .score-adv { text-align: center; font-size: 1.4em; padding: 24px; background: white; border-radius: 10px; margin-top: 24px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }#quiz-c6b94135 .intro { background: #ebf8ff; padding: 16px; border-radius: 8px; margin-bottom: 20px; color: #2c5282; }\n<\/style>\n<h1>\u9032\u968e\u6e2c\u9a57\uff1aMCP \u90e8\u7f72\u8207\u6574\u5408<\/h1>\n    <div class=\"intro\">\n      <strong>\u6e2c\u9a57\u76ee\u6a19\uff1a<\/strong>\u9a57\u8b49\u4f60\u662f\u5426\u80fd\u5728\u5be6\u969b\u90e8\u7f72\u60c5\u5883\u4e2d\u505a\u5c0d\u6c7a\u7b56\u3001\u6293\u51fa\u5e38\u898b\u932f\u8aa4\u3002<br \/>\n      \u5171 5 \u984c\uff0c\u5305\u542b\u60c5\u5883\u984c\u8207\u932f\u8aa4\u8a3a\u65b7\u984c\u3002\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv1\">\n      <h3>1. \u4f60\u628a FastMCP server \u90e8\u7f72\u5230\u96f2\u4e3b\u6a5f\u7684 Docker \u5bb9\u5668\u88e1\uff0c\u672c\u6a5f curl \u5f97\u5230\u56de\u61c9\uff0c\u4f46\u540c\u4e8b\u7684\u6a5f\u5668\u5c31\u662f\u9023\u4e0d\u4e0a\u3002\u4f60\u5728 code \u88e1\u770b\u5230\u4e0b\u9762\u9019\u884c\u3002\u6700\u8a72\u5148\u6539\u54ea\u88e1\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <div class=\"code-block\">mcp.run(transport=&#8221;http&#8221;, host=&#8221;127.0.0.1&#8243;, port=8000, path=&#8221;\/mcp&#8221;)<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(1, 'A', 'B')\">A. \u628a port \u6539\u6210 80<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'B', 'B')\">B. \u628a host \u6539\u6210 &#8220;0.0.0.0&#8221;\uff0c\u8b93\u5bb9\u5668\u63a5\u53d7\u4f86\u81ea\u4efb\u4f55\u7db2\u5361\u7684\u9023\u7dda\uff08\u540c\u6642\u8a18\u5f97\u914d\u4e0a auth\uff09<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'C', 'B')\">C. \u628a transport \u6539\u56de &#8220;stdio&#8221;<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'D', 'B')\">D. \u628a path \u6539\u6210 &#8220;\/&#8221;<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv1\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv2\">\n      <h3>2. \u4f60\u8981\u628a\u5c0d\u5916\u7684 MCP server \u90e8\u7f72\u6210\u8ca0\u8f09\u5e73\u8861\u5f8c\u7684\u591a\u53f0\u5be6\u4f8b\uff0c\u5e0c\u671b\u4efb\u4f55\u4e00\u53f0\u90fd\u80fd\u8655\u7406\u4efb\u4f55\u8acb\u6c42\u4ee5\u4fbf\u6c34\u5e73\u64f4\u5c55\u3002\u6700\u9069\u5408\u7684\u8a2d\u5b9a\u662f\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(2, 'A', 'C')\">A. \u6539\u7528 transport=&#8221;stdio&#8221;<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'B', 'C')\">B. \u628a port \u8a2d\u6210 0\uff0c\u8b93\u7cfb\u7d71\u96a8\u6a5f\u5206\u914d<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'C', 'C')\">C. \u5efa\u7acb server \u6642\u52a0 stateless_http=True\uff0c\u8b93\u6bcf\u500b\u8acb\u6c42\u5404\u81ea\u7368\u7acb\u3001server \u4e0d\u8a18\u5f97\u4e0a\u4e00\u500b<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'D', 'C')\">D. \u95dc\u6389\u6388\u6b0a\u4ee5\u52a0\u5feb\u8acb\u6c42\u901f\u5ea6<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv2\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv3\">\n      <h3>3. Code review \u6642\u4f60\u770b\u5230 AI \u5e6b\u67d0\u5de5\u5177\u5beb\u4e86\u4e0b\u9762\u9019\u6bb5\u3002\u70ba\u4ec0\u9ebc\u9019\u5728 MCP 2026 \u898f\u683c\u4e0b\u662f\u7d05\u65d7\uff1f <span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">headers = {&#8220;Authorization&#8221;: request.headers[&#8220;Authorization&#8221;]}\nrequests.get(&#8220;https:\/\/other-api.com&#8221;, headers=headers)<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(3, 'A', 'A')\">A. \u9019\u662f token passthrough\uff0f\u6df7\u6dc6\u4ee3\u7406\uff1atoken \u61c9\u7d81\u5b9a\u7d66\u300c\u4f60\u9019\u500b server\u300d\uff0c\u4e0d\u8a72\u539f\u5c01\u8f49\u624b\u7d66\u4e0b\u6e38<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'B', 'A')\">B. requests \u5957\u4ef6\u592a\u820a\uff0c\u61c9\u6539\u7528 httpx<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'C', 'A')\">C. headers \u5b57\u5178\u7684\u9375\u4e0d\u8a72\u7528\u5927\u5beb<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'D', 'A')\">D. \u6c92\u554f\u984c\uff0c\u91cd\u8907\u5229\u7528 token \u53ef\u4ee5\u7701\u4e00\u6b21\u767b\u5165<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv3\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv4\">\n      <h3>4. \u4f60\u7684 Streamable HTTP server \u4e0a\u7dda\u5f8c\uff0c\u5ba2\u6236\u7aef\u9023\u4e0a\u537b\u4e00\u76f4\u8f49\u5708\u3001\u4e32\u6d41\u56de\u61c9\u9072\u9072\u4e0d\u4f86\u3002\u524d\u9762\u64fa\u4e86\u4e00\u53f0 nginx \u53cd\u5411\u4ee3\u7406\u3002\u6700\u53ef\u80fd\u7684\u539f\u56e0\u8207\u4fee\u6cd5\u662f\uff1f <span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">location \/mcp {\n    proxy_pass http:\/\/127.0.0.1:8000;\n    # proxy_buffering \u6c92\u8a2d\u5b9a\uff0c\u4f7f\u7528\u9810\u8a2d\n}<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(4, 'A', 'C')\">A. port \u6253\u932f\uff0c\u6539\u6210 8080<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'B', 'C')\">B. \u8981\u628a transport \u6539\u6210 sse \u624d\u652f\u63f4\u4e32\u6d41<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'C', 'C')\">C. \u4ee3\u7406\u9810\u8a2d\u6703\u7de9\u885d\u56de\u61c9\uff0c\u7834\u58de\u4e32\u6d41\uff1b\u5728\u8a72 location \u52a0 proxy_buffering off<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'D', 'C')\">D. server \u9700\u8981\u6539\u7d81 0.0.0.0<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv4\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv5\">\n      <h3>5. \u4f60\u60f3\u5728\u90e8\u7f72\u5f8c\u9a57\u6536\u300c\u6388\u6b0a\u771f\u7684\u6709\u751f\u6548\u300d\uff0c\u800c\u4e0d\u662f\u53ea\u78ba\u8a8d\u9023\u5f97\u4e0a\u3002\u4e0b\u5217\u54ea\u500b\u505a\u6cd5\u6700\u80fd\u9a57\u8b49\u9019\u4ef6\u4e8b\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(5, 'A', 'D')\">A. \u5e36\u8457\u6b63\u78ba token \u547c\u53eb\uff0c\u6210\u529f\u5c31\u4ee3\u8868\u5b89\u5168<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'B', 'D')\">B. \u770b server log \u6709\u6c92\u6709 error<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'C', 'D')\">C. \u5728 Claude \u88e1\u554f\u5b83\u300c\u4f60\u5b89\u5168\u55ce\u300d<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'D', 'D')\">D. \u6545\u610f\u300c\u4e0d\u5e36\u300dtoken \u547c\u53eb\u4e00\u6b21\uff0c\u61c9\u8a72\u88ab\u64cb\uff08\u56de 401\uff09\u800c\u4e0d\u662f\u7167\u6a23\u57f7\u884c<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv5\"><\/div>\n    <\/div>\n\n    <div class=\"score-adv\" id=\"scoreAdv\" style=\"display:none;\"><\/div>\n<script>\n\n      let answeredAdv = 0;\n      let correctAdv = 0;\n      const totalAdv = 5;\n      const explanationsAdv = {\n        1: \"\u7d81 127.0.0.1 \u4ee3\u8868\u53ea\u63a5\u53d7\u672c\u6a5f\u9023\u7dda\uff0c\u6240\u4ee5\u5bb9\u5668\u5167 curl \u5f97\u5230\u3001\u5916\u9762\u9023\u4e0d\u4e0a\u3002\u6539 0.0.0.0 \u624d\u6703\u63a5\u53d7\u4efb\u4f55\u7db2\u5361\u7684\u9023\u7dda\u3002\u4f46\u4e00\u65e6\u5c0d\u5916\uff0c\u52d9\u5fc5\u540c\u6642\u914d\u4e0a auth\uff0c\u5225\u70ba\u4e86\u9023\u901a\u800c\u88f8\u5954\u3002\u6539 port \u6216 path \u90fd\u4e0d\u89e3\u6c7a\u300c\u53ea\u7d81\u672c\u6a5f\u300d\u9019\u500b\u6839\u56e0\u3002\",\n        2: \"\u6c34\u5e73\u64f4\u5c55\u7684\u95dc\u9375\u662f\u7121\u72c0\u614b\uff1astateless_http=True \u8b93\u6bcf\u500b\u8acb\u6c42\u5404\u81ea\u7368\u7acb\u3001server \u4e0d\u8a18\u5f97 session\uff0c\u4efb\u4f55\u4e00\u53f0\u5be6\u4f8b\u90fd\u80fd\u8655\u7406\u4efb\u4f55\u8acb\u6c42\u3002stdio \u7121\u6cd5\u5c0d\u5916\uff1bport=0 \u8207\u95dc\u6388\u6b0a\u90fd\u4e0d\u89e3\u6c7a\u72c0\u614b\u5206\u4eab\u554f\u984c\uff0c\u95dc\u6388\u6b0a\u66f4\u662f\u5371\u96aa\u3002\",\n        3: \"\u628a\u6536\u5230\u7684 Authorization \u539f\u5c01\u4e0d\u52d5\u8f49\u7d66\u4e0b\u6e38 API\uff0c\u5c31\u662f token passthrough\uff0fconfused deputy\uff0cMCP 2026 \u898f\u683c\u660e\u6587\u53cd\u5c0d\u3002token \u61c9\u900f\u904e Resource Indicators \u7d81\u5b9a\u5230\u4f60\u9019\u500b server \u7684 audience\uff0c\u4e0d\u8a72\u88ab\u5077\u6e21\u5230\u5225\u8655\u4f7f\u7528\u3002\",\n        4: \"Streamable HTTP \u6703\u7528\u4f3a\u670d\u5668\u6301\u7e8c\u63a8\u9001\uff1b\u82e5\u53cd\u5411\u4ee3\u7406\u628a\u56de\u61c9\u7de9\u885d\u5230\u6536\u5b8c\u624d\u5410\u51fa\uff0c\u4e32\u6d41\u5c31\u5361\u4f4f\u3002\u5c0d\u8a72 location \u52a0 proxy_buffering off\uff08\u4e26\u62c9\u9577 read timeout\uff09\u5373\u53ef\u3002\u6539 sse \u662f\u8d70\u56de\u982d\u8def\uff0cport\/host \u90fd\u4e0d\u662f\u6b64\u75c7\u72c0\u7684\u539f\u56e0\u3002\",\n        5: \"\u53ea\u6709\u300e\u6c92\u5e36\u7968\u4e5f\u80fd\u9032\u300f\u624d\u8b49\u660e\u9580\u662f\u58de\u7684\u3002\u6545\u610f\u4e0d\u5e36 token \u547c\u53eb\u3001\u9810\u671f\u88ab\u64cb\uff08401\uff09\uff0c\u624d\u80fd\u9a57\u8b49\u6388\u6b0a\u771f\u7684\u751f\u6548\u3002\u5e36\u6b63\u78ba token \u6210\u529f\u53ea\u8b49\u660e\u6b63\u5e38\u8def\u5f91\u53ef\u7528\uff0c\u770b log \u6216\u554f AI \u90fd\u7121\u6cd5\u5ba2\u89c0\u9a57\u6536\u6388\u6b0a\u3002\"\n      };\n\n      function checkAnswerAdv(qNum, selected, correctAns) {\n        const question = document.getElementById(\"qAdv\" + qNum);\n        if (question.classList.contains(\"answered\")) return;\n        question.classList.add(\"answered\");\n        answeredAdv++;\n        const options = question.querySelectorAll(\".options-adv li\");\n        options.forEach((opt) => {\n          opt.classList.add(\"disabled\");\n          if (opt.textContent.startsWith(correctAns + \".\")) opt.classList.add(\"show-answer\");\n        });\n        const feedback = document.getElementById(\"fbAdv\" + qNum);\n        if (selected === correctAns) {\n          correctAdv++;\n          feedback.className = \"feedback-adv correct\";\n          feedback.innerHTML = \"\u2713 \u6b63\u78ba\uff01\" + explanationsAdv[qNum];\n        } else {\n          feedback.className = \"feedback-adv wrong\";\n          feedback.innerHTML = \"\u2717 \u932f\u8aa4\u3002\u6b63\u78ba\u7b54\u6848\u662f \" + correctAns + \"\u3002\" + explanationsAdv[qNum];\n          options.forEach((opt) => { if (opt.textContent.startsWith(selected + \".\")) opt.classList.add(\"wrong\"); });\n        }\n        if (answeredAdv === totalAdv) {\n          const scoreDiv = document.getElementById(\"scoreAdv\");\n          scoreDiv.style.display = \"block\";\n          let msg = \"\";\n          if (correctAdv === totalAdv) msg = \"\ud83c\udfaf \u5b8c\u7f8e\uff01\u4f60\u5df2\u7d93\u6e96\u5099\u597d\u5be6\u6230\u4e86\uff01\";\n          else if (correctAdv >= Math.ceil(totalAdv * 0.8)) msg = \"\ud83d\udcaa \u5f88\u68d2\uff01\u518d\u8907\u7fd2\u4e00\u4e0b\u932f\u7684\u984c\u76ee\";\n          else if (correctAdv >= Math.ceil(totalAdv * 0.6)) msg = \"\ud83d\udcd6 \u5efa\u8b70\u91cd\u8b80\u76f8\u95dc\u6bb5\u843d\u5f8c\u518d\u8a66\u4e00\u6b21\";\n          else msg = \"\ud83d\udd04 \u5efa\u8b70\u91cd\u65b0\u95b1\u8b80\u6587\u4ef6\uff0c\u7279\u5225\u6ce8\u610f\u6388\u6b0a\u8207\u90e8\u7f72\u7d30\u7bc0\";\n          scoreDiv.innerHTML = \"\u6e2c\u9a57\u5b8c\u6210\uff01\u5f97\u5206\uff1a\" + correctAdv + \" \/ \" + totalAdv + \"<br>\" + msg;\n        }\n      }\n    \n<\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u6e2c\u9a57\uff1aMCP \u90e8\u7f72\u8207\u6574\u5408 \u5171 5 \u984c\uff0c\u9ede\u9078\u7b54\u6848\u5f8c\u6703\u7acb\u5373\u986f\u793a\u7d50\u679c 1. \u70ba\u4ec0\u9ebc stdio \u50b3\u8f38\u7121\u6cd5\u7528\u4f86\u8b93\u9060\u7aef\u6a5f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[934],"tags":[399,938,440,947,946],"class_list":["post-873","post","type-post","status-publish","format-standard","hentry","category-mcp","tag-claude-code","tag-fastmcp","tag-mcp","tag-oauth-","tag-streamable-http"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=873"}],"version-history":[{"count":0,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/873\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}