{"id":872,"date":"2026-08-20T23:22:25","date_gmt":"2026-08-20T15:22:25","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/08\/20\/resources%e3%80%81prompts-%e8%88%87-context%ef%bc%9a%e8%ae%93-mcp-server-%e6%9b%b4%e5%a5%bd%e7%94%a8\/"},"modified":"2026-08-20T23:22:25","modified_gmt":"2026-08-20T15:22:25","slug":"resources%e3%80%81prompts-%e8%88%87-context%ef%bc%9a%e8%ae%93-mcp-server-%e6%9b%b4%e5%a5%bd%e7%94%a8","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/08\/20\/resources%e3%80%81prompts-%e8%88%87-context%ef%bc%9a%e8%ae%93-mcp-server-%e6%9b%b4%e5%a5%bd%e7%94%a8\/","title":{"rendered":"Resources\u3001Prompts \u8207 Context\uff1a\u8b93 MCP Server \u66f4\u597d\u7528"},"content":{"rendered":"\n<div id=\"quiz-02576de5\">\n<style>\n#quiz-02576de5 .question { background: white; border-radius: 8px; padding: 20px; margin: 20px 0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); }#quiz-02576de5 .question h3 { margin-top: 0; color: #333; }#quiz-02576de5 .options { list-style: none; padding: 0; }#quiz-02576de5 .options li { padding: 12px 15px; margin: 8px 0; border: 2px solid #ddd; border-radius: 6px; cursor: pointer; transition: all 0.2s; }#quiz-02576de5 .options li:hover:not(.disabled) { border-color: #4caf50; background: #f0fff0; }#quiz-02576de5 .options li.correct { border-color: #4caf50; background: #e8f5e9; }#quiz-02576de5 .options li.wrong { border-color: #f44336; background: #ffebee; }#quiz-02576de5 .options li.disabled { cursor: default; opacity: 0.7; }#quiz-02576de5 .options li.show-answer { border-color: #4caf50; background: #e8f5e9; }#quiz-02576de5 .feedback { margin-top: 15px; padding: 12px; border-radius: 6px; display: none; }#quiz-02576de5 .feedback.correct { background: #e8f5e9; color: #2e7d32; display: block; }#quiz-02576de5 .feedback.wrong { background: #ffebee; color: #c62828; display: block; }#quiz-02576de5 .score { text-align: center; font-size: 1.5em; padding: 20px; background: white; border-radius: 8px; margin-top: 20px; }#quiz-02576de5 .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\uff1aResources\u3001Prompts \u8207 Context<\/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. \u4f9d\u6587\u7ae0\u7684\u5206\u985e\uff0cMCP \u4e09\u7a2e\u539f\u8a9e\u4e2d\u300cResource\u300d\u6700\u50cf\u4e0b\u5217\u54ea\u4e00\u500b\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(1, 'A', 'B')\">A. POST\uff0f\u57f7\u884c\u4e00\u500b\u6709\u526f\u4f5c\u7528\u7684\u52d5\u4f5c<\/li>\n        <li onclick=\"checkAnswer(1, 'B', 'B')\">B. GET\uff0f\u552f\u8b80\u5730\u8b80\u53d6\u4e00\u4efd\u8cc7\u6599<\/li>\n        <li onclick=\"checkAnswer(1, 'C', 'B')\">C. \u4e00\u6bb5\u7d66\u4f7f\u7528\u8005\u6311\u9078\u7684\u5c0d\u8a71\u958b\u5834\u767d\u7bc4\u672c<\/li>\n        <li onclick=\"checkAnswer(1, 'D', 'B')\">D. \u4e00\u500b\u80cc\u666f\u6392\u7a0b\u4efb\u52d9<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb1\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q2\">\n      <h3>2. \u95dc\u65bc <code>@mcp.resource(\"data:\/\/config\")<\/code> \u7684\u6558\u8ff0\uff0c\u4f55\u8005\u6b63\u78ba\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(2, 'A', 'C')\">A. server \u4e00\u555f\u52d5\u5c31\u6703\u7acb\u523b\u57f7\u884c\u8a72\u51fd\u5f0f\u4e26\u5feb\u53d6\u7d50\u679c<\/li>\n        <li onclick=\"checkAnswer(2, 'B', 'C')\">B. \u5b83\u6703\u6539\u8b8a\u72c0\u614b\uff0c\u5c6c\u65bc\u6709\u526f\u4f5c\u7528\u7684\u64cd\u4f5c<\/li>\n        <li onclick=\"checkAnswer(2, 'C', 'C')\">C. \u51fd\u5f0f\u53ea\u6709\u5728 client \u4f86\u8b80\u8a72 URI \u6642\u624d\u57f7\u884c\uff08\u5ef6\u9072\u8f09\u5165\uff09<\/li>\n        <li onclick=\"checkAnswer(2, 'D', 'C')\">D. \u56de\u50b3\u503c\u4e00\u5b9a\u8981\u81ea\u5df1\u5148 json.dumps \u624d\u80fd\u7528<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb2\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q3\">\n      <h3>3. \u4e0b\u9762\u9019\u500b\u8cc7\u6e90\u6a21\u677f\uff0cclient \u8b80 <code>users:\/\/42<\/code> \u6642\u6703\u767c\u751f\u4ec0\u9ebc\uff1f<\/h3>\n      <div class=\"code-block\">@mcp.resource(&#8220;users:\/\/{user_id}&#8221;)\ndef get_user(user_id: str) -> dict:\n    return {&#8220;id&#8221;: user_id, &#8220;name&#8221;: f&#8221;User {user_id}&#8221;}<\/div>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(3, 'A', 'A')\">A. user_id \u88ab\u586b\u6210 &#8220;42&#8221; \u50b3\u9032\u51fd\u5f0f\uff0c\u56de\u50b3\u8a72\u4f7f\u7528\u8005\u8cc7\u6599<\/li>\n        <li onclick=\"checkAnswer(3, 'B', 'A')\">B. \u6703\u5831\u932f\uff0c\u56e0\u70ba\u6a21\u677f\u4e0d\u80fd\u5e36\u53c3\u6578<\/li>\n        <li onclick=\"checkAnswer(3, 'C', 'A')\">C. \u53ea\u6703\u56de\u50b3\u56fa\u5b9a\u7684\u9810\u8a2d\u503c\uff0c\u5ffd\u7565 42<\/li>\n        <li onclick=\"checkAnswer(3, 'D', 'A')\">D. \u9700\u8981\u53e6\u5916\u547c\u53eb\u4e00\u500b tool \u624d\u80fd\u53d6\u5f97\u8cc7\u6599<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb3\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q4\">\n      <h3>4. \u95dc\u65bc <code>ctx: Context<\/code> \u53c3\u6578\uff0c\u4e0b\u5217\u4f55\u8005\u6b63\u78ba\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(4, 'A', 'D')\">A. \u53c3\u6578\u4e00\u5b9a\u8981\u547d\u540d\u70ba ctx\uff0c\u6539\u540d\u5c31\u5931\u6548<\/li>\n        <li onclick=\"checkAnswer(4, 'B', 'D')\">B. \u5b83\u6703\u51fa\u73fe\u5728\u7d66 AI \u7684\u5de5\u5177\u8aaa\u660e\u88e1\uff0c\u4f9b\u6a21\u578b\u586b\u503c<\/li>\n        <li onclick=\"checkAnswer(4, 'C', 'D')\">C. Context \u7684\u65b9\u6cd5\u90fd\u662f\u540c\u6b65\u7684\uff0c\u4e0d\u9700\u8981 await<\/li>\n        <li onclick=\"checkAnswer(4, 'D', 'D')\">D. \u9760\u578b\u5225\u6a19\u8a3b\u6ce8\u5165\uff0cclient \u770b\u4e0d\u5230\u5b83\uff0c\u65b9\u6cd5\u591a\u70ba async<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb4\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q5\">\n      <h3>5. \u4f9d\u6587\u7ae0\u7684\u5be6\u52d9\u5224\u65b7\uff0c\u300c\u65b0\u589e\u4e00\u7b46\u8a02\u55ae\u300d\u9019\u500b\u9700\u6c42\u61c9\u8a72\u7528\u54ea\u7a2e\u539f\u8a9e\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(5, 'A', 'B')\">A. Resource\uff0c\u56e0\u70ba\u5b83\u8ddf\u8cc7\u6599\u6709\u95dc<\/li>\n        <li onclick=\"checkAnswer(5, 'B', 'B')\">B. Tool\uff0c\u56e0\u70ba\u5b83\u6703\u6539\u8b8a\u72c0\u614b\u3001\u6709\u526f\u4f5c\u7528<\/li>\n        <li onclick=\"checkAnswer(5, 'C', 'B')\">C. Prompt\uff0c\u56e0\u70ba\u5b83\u662f\u53ef\u91cd\u7528\u7684\u7bc4\u672c<\/li>\n        <li onclick=\"checkAnswer(5, 'D', 'B')\">D. \u8cc7\u6e90\u6a21\u677f\uff0c\u56e0\u70ba\u5b83\u5e36\u4e86\u4e00\u500b\u8a02\u55ae\u53c3\u6578<\/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: \"Resource \u662f\u552f\u8b80\u7684\u8cc7\u6599\u5b58\u53d6\uff0c\u8a9e\u610f\u7b49\u540c\u5f8c\u7aef\u7684 GET\u3002Tool \u624d\u662f\u505a\u4e8b\uff08POST\uff09\uff0cPrompt \u662f\u7d66\u4f7f\u7528\u8005\u6311\u7684\u7bc4\u672c\u3002\",\n        2: \"Resource \u63a1\u5ef6\u9072\u8f09\u5165\uff08lazy loading\uff09\uff0c\u53ea\u6709 client \u4f86\u8b80\u8a72 URI \u6642\u51fd\u5f0f\u624d\u57f7\u884c\u3002\u56de\u50b3 dict\/list \u6703\u81ea\u52d5\u5e8f\u5217\u5316\u6210 JSON\uff0c\u4e0d\u5fc5\u81ea\u5df1 json.dumps\u3002\",\n        3: \"URI \u88e1\u7684 {user_id} \u662f\u6a21\u677f\u53c3\u6578\uff0c\u8b80 users:\/\/42 \u6642\u6703\u88ab\u586b\u6210 \\\"42\\\" \u50b3\u9032\u540c\u540d\u7684\u51fd\u5f0f\u53c3\u6578\uff0c\u7b49\u540c\u5f8c\u7aef\u7684\u8def\u5f91\u53c3\u6578\u3002\",\n        4: \"Context \u9760\u578b\u5225\u6a19\u8a3b\u6ce8\u5165\uff0c\u53c3\u6578\u540d\u4e0d\u91cd\u8981\uff1b\u5b83\u4e0d\u6703\u51fa\u73fe\u5728\u7d66 client \u7684 schema \u88e1\uff1b\u65b9\u6cd5\u591a\u70ba async\uff0c\u547c\u53eb\u8981\u52a0 await\u3002\",\n        5: \"\u65b0\u589e\u8a02\u55ae\u6703\u6539\u8b8a\u72c0\u614b\u3001\u6709\u526f\u4f5c\u7528\uff0c\u5c6c\u65bc\u300c\u505a\u4e8b\u300d\uff0c\u61c9\u8a72\u7528 Tool\u3002\u552f\u8b80\u53d6\u8cc7\u6599\u624d\u7528 Resource\u3002\",\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\">\u3010MCP \u8207 FastMCP \u5be6\u6230\u3011\u7cfb\u5217 #03\uff08\u5171 4 \u7bc7\uff09\uff5c\u96e3\u5ea6\uff1aL2-\u9032\u968e<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u5169\u7bc7\u6211\u5011\u641e\u61c2\u4e86 MCP \u7684\u539f\u8a9e\uff08Tool \/ Resource \/ Prompt\uff09\uff0c\u4e5f\u7528 FastMCP \u5beb\u51fa\u4e86\u7b2c\u4e00\u500b <strong>tool<\/strong>\u3002 \u5230\u9019\u88e1\u4f60\u6703\u767c\u73fe\uff1aAI \u5e6b\u4f60\u751f\u7684 MCP server \u5e7e\u4e4e\u6e05\u4e00\u8272\u90fd\u662f <code>@mcp.tool<\/code>\u2014\u2014\u56e0\u70ba tool \u6700\u597d\u61c2\u3001\u6700\u842c\u7528\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u4e00\u500b\u300c\u597d\u7528\u300d\u7684 server\uff0c\u901a\u5e38\u6703\u6df7\u7528\u4e09\u7a2e\u539f\u8a9e\uff1a <strong>Tool \u505a\u4e8b\u3001Resource \u7d66\u8cc7\u6599\u3001Prompt \u7d66\u7bc4\u672c<\/strong>\u3002 \u518d\u52a0\u4e0a\u4e00\u500b\u5e38\u88ab\u5ffd\u7565\u3001\u4f46\u4e00\u770b\u5230\u5c31\u4ee3\u8868\u9019\u500b server \u6709\u5728\u8a8d\u771f\u505a\u4e8b\u7684\u6771\u897f\u2014\u2014<strong>Context \u7269\u4ef6<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7bc7\u7684\u91cd\u9ede\u4e0d\u662f\u6559\u4f60\u5f9e\u96f6\u5beb\uff0c\u800c\u662f\u6559\u4f60<strong>\u770b\u61c2 AI \u4ea4\u51fa\u4f86\u7684 server \u88e1\uff0c\u9019\u4e09\u7a2e\u6771\u897f\u5404\u81ea\u5728\u5e79\u561b\u3001\u6709\u6c92\u6709\u7528\u5c0d\u5730\u65b9\u3001\u6709\u6c92\u6709\u8e29\u96f7<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u56e0\u70ba\u9019\u88e1\u6700\u7d93\u5178\u7684\u5751\u662f\uff1a<strong>AI \u628a\u6240\u6709\u6771\u897f\u90fd\u5beb\u6210 tool<\/strong>\uff0c\u80fd\u8dd1\u3001\u4e5f\u6709\u8f38\u51fa\uff0c\u4f46\u628a\u300c\u7d14\u8b80\u8cc7\u6599\u300d\u786c\u505a\u6210 tool\u3001\u628a\u300c\u8a72\u7d66\u4f7f\u7528\u8005\u9078\u7684\u7bc4\u672c\u300d\u4e5f\u585e\u9032 tool\uff0c\u7d50\u679c server \u53c8\u80a5\u53c8\u96e3\u7dad\u8b77\u3002\u4f60\u8981\u80fd\u4e00\u773c\u770b\u51fa\u300c\u9019\u500b\u5176\u5be6\u8a72\u662f resource \/ prompt\u300d\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\">\u7248\u672c\u63d0\u9192\uff1aFastMCP \u76ee\u524d\u4e3b\u6d41\u662f v2.x\uff0c\u672c\u6587\u7bc4\u4f8b\u4ee5\u6b64\u70ba\u6e96\u3002v4 \u662f beta\uff0c\u6709\u4e9b\u65b0\u5beb\u6cd5\uff08\u4f8b\u5982 <code>CurrentContext()<\/code>\uff09\u672c\u6587\u6703\u6a19\u8a3b\u300c\u8a8d\u5f97\u5c31\u597d\u300d\u3002AI \u751f\u51fa\u4f86\u7684 code \u5169\u7a2e\u6df7\u8457\u90fd\u53ef\u80fd\u51fa\u73fe\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\">\u4e00\u53e5\u8a71\u8aaa\u660e<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u539f\u8a9e<\/th>\n<th>\u4e00\u53e5\u8a71<\/th>\n<th>\u50cf\u4ec0\u9ebc<\/th>\n<th>\u8ab0\u5728\u63a7\u5236<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Tool<\/strong><\/td>\n<td>\u300c\u5e6b\u6211\u505a\u4e00\u4ef6\u4e8b\u300d\uff08\u53ef\u80fd\u6709\u526f\u4f5c\u7528\uff09<\/td>\n<td>POST\uff0f\u57f7\u884c\u4e00\u500b\u52d5\u4f5c<\/td>\n<td>\u6a21\u578b\u6c7a\u5b9a\u4f55\u6642\u547c\u53eb<\/td>\n<\/tr>\n<tr>\n<td><strong>Resource<\/strong><\/td>\n<td>\u300c\u7d66\u6211\u770b\u4e00\u4efd\u8cc7\u6599\u300d\uff08\u552f\u8b80\uff09<\/td>\n<td>GET\uff0f\u8b80\u4e00\u500b\u6a94\u6848<\/td>\n<td>\u61c9\u7528\u7a0b\u5f0f\u6c7a\u5b9a\u8f09\u5165<\/td>\n<\/tr>\n<tr>\n<td><strong>Prompt<\/strong><\/td>\n<td>\u300c\u7167\u9019\u500b\u7bc4\u672c\u5e6b\u6211\u958b\u5834\u300d<\/td>\n<td>\u4e00\u6bb5\u53ef\u91cd\u7528\u7684\u63d0\u793a\u8a9e<\/td>\n<td>\u4f7f\u7528\u8005\u4e3b\u52d5\u6311\u9078<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u8a18\u4f4f\u9019\u5f35\u8868\uff0c\u4f60\u5c31\u6293\u5230\u516b\u6210\u4e86\u3002\u770b code \u6642\u5fc3\u88e1\u4e00\u76f4\u554f\uff1a<strong>\u9019\u6bb5\u5230\u5e95\u662f\u300c\u505a\u4e8b\u300d\u3001\u300c\u7d66\u8cc7\u6599\u300d\u9084\u662f\u300c\u7d66\u7bc4\u672c\u300d\uff1f<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Resource\uff1a\u552f\u8b80\u8cc7\u6599\uff0c\u9577\u9019\u6a23<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AI \u5beb\u7684 resource \u6700\u5c0f\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\">from fastmcp import FastMCP\n\nmcp = FastMCP(name=<span class=\"hljs-string\">\"DataServer\"<\/span>)\n\n@mcp.resource(<span class=\"hljs-string\">\"data:\/\/config\"<\/span>)   <span class=\"hljs-comment\"># \u9019\u662f\u9019\u4efd\u8cc7\u6599\u7684\u300c\u7db2\u5740\u300d\uff0cclient \u7528\u5b83\u4f86\u8b80<\/span>\ndef get_config() -&gt; str:         <span class=\"hljs-comment\"># \u6709\u4eba\u8b80 data:\/\/config \u6642\u624d\u6703\u57f7\u884c\u9019\u500b\u51fd\u5f0f<\/span>\n    <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\u63d0\u4f9b\u61c9\u7528\u7a0b\u5f0f\u8a2d\u5b9a\u3002\"<\/span><span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">'{\"theme\": \"dark\", \"version\": \"1.2.0\"}'<\/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\">\u9010\u884c\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>@mcp.resource(\"data:\/\/config\")<\/code>\uff1a\u5ba3\u544a\u4e00\u500b\u552f\u8b80\u8cc7\u6e90\uff0c\u5b83\u7684 URI\uff08\u552f\u4e00\u7db2\u5740\uff09\u662f <code>data:\/\/config<\/code>\u3002<\/li>\n\n\n<li><code>def get_config() -&gt; str<\/code>\uff1a\u51fd\u5f0f\u540d\u6703\u8b8a\u6210\u8cc7\u6e90\u540d\u7a31\uff0cdocstring \u6703\u8b8a\u6210\u63cf\u8ff0\u3002<\/li>\n\n\n<li><strong>\u91cd\u9ede<\/strong>\uff1a\u9019\u500b\u51fd\u5f0f<strong>\u4e0d\u662f\u4e00\u555f\u52d5\u5c31\u8dd1<\/strong>\uff0c\u800c\u662f<strong>\u6709\u4eba\u4f86\u8b80 <code>data:\/\/config<\/code> \u6642\u624d\u8dd1<\/strong>\uff08\u53eb lazy loading\uff0c\u5ef6\u9072\u8f09\u5165\uff09\u3002<\/li>\n\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u300c\u9019\u5728\u5e79\u561b\u300d\uff1a\u628a\u4e00\u4efd\u8cc7\u6599\u639b\u5728\u4e00\u500b\u7db2\u5740\u4e0a\uff0cclient \u60f3\u770b\u7684\u6642\u5019\u4f86\u62ff\uff0c\u8ddf\u5f8c\u7aef\u7684 <code>GET \/config<\/code> \u662f\u540c\u4e00\u500b\u5473\u9053\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u56de\u50b3\u503c AI \u5e38\u898b\u6709\u5e7e\u7a2e\u5beb\u6cd5\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\">@mcp.resource(<span class=\"hljs-string\">\"data:\/\/config\"<\/span>)\ndef get_config() -&gt; dict:        <span class=\"hljs-comment\"># \u56de\u50b3 dict\uff0cFastMCP \u6703\u81ea\u52d5\u8f49\u6210 JSON<\/span>\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"theme\"<\/span>: <span class=\"hljs-string\">\"dark\"<\/span>, <span class=\"hljs-string\">\"version\"<\/span>: <span class=\"hljs-string\">\"1.2.0\"<\/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\">\u56de <code>str<\/code> \u5c31\u662f\u7d14\u6587\u5b57\uff0c\u56de <code>dict<\/code> \/ <code>list<\/code> \u6703\u81ea\u52d5\u88ab\u5e8f\u5217\u5316\u6210 JSON\u3002\u4f60\u4e0d\u7528\u81ea\u5df1 <code>json.dumps<\/code>\uff08\u96d6\u7136 AI \u6709\u6642\u6703\u591a\u6b64\u4e00\u8209\u81ea\u5df1\u8f49\uff0c\u80fd\u8dd1\u4f46\u6c92\u5fc5\u8981\uff09\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u8cc7\u6e90\u6a21\u677f\uff1a\u5e36\u53c3\u6578\u7684 URI\uff08\u91cd\u9ede\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u9762\u90a3\u500b\u662f\u300c\u56fa\u5b9a\u4e00\u4efd\u8cc7\u6599\u300d\u3002\u66f4\u5e38\u898b\u7684\u662f<strong>\u540c\u4e00\u7a2e\u8cc7\u6599\u3001\u4f9d id \u4e0d\u540c\u7d66\u4e0d\u540c\u5167\u5bb9<\/strong>\u2014\u2014\u9019\u5c31\u662f<strong>\u8cc7\u6e90\u6a21\u677f\uff08Resource Template\uff09<\/strong>\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-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@mcp.resource(<span class=\"hljs-string\">\"users:\/\/{user_id}\"<\/span>)     <span class=\"hljs-comment\"># URI \u88e1\u6709 {user_id}\uff0c\u5c31\u8b8a\u6210\u300c\u6a21\u677f\u300d<\/span>\ndef get_user(user_id: str) -&gt; dict:    <span class=\"hljs-comment\"># \u51fd\u5f0f\u53c3\u6578\u540d\u8981\u8ddf {user_id} \u4e00\u6a21\u4e00\u6a23<\/span>\n    <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\u4f9d user_id \u56de\u50b3\u4f7f\u7528\u8005\u8cc7\u6599\u3002\"<\/span><span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"id\"<\/span>: user_id, <span class=\"hljs-string\">\"name\"<\/span>: f<span class=\"hljs-string\">\"User {user_id}\"<\/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\">\u9010\u884c\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>URI \u88e1\u51fa\u73fe <code>{user_id}<\/code> \u9019\u7a2e\u5927\u62ec\u865f \u2192 FastMCP \u8a8d\u5f97\u9019\u662f<strong>\u6a21\u677f<\/strong>\uff0c\u4e0d\u662f\u56fa\u5b9a\u8cc7\u6e90\u3002<\/li>\n\n\n<li>client \u8b80 <code>users:\/\/42<\/code> \u6642\uff0c<code>user_id<\/code> \u5c31\u6703\u88ab\u586b\u6210 <code>\"42\"<\/code> \u50b3\u9032\u51fd\u5f0f\u3002<\/li>\n\n\n<li><strong>\u95dc\u9375\u9a57\u6536\u9ede<\/strong>\uff1a<code>{\u5927\u62ec\u865f\u88e1\u7684\u540d\u5b57}<\/code> \u4e00\u5b9a\u8981\u8ddf<strong>\u51fd\u5f0f\u53c3\u6578\u540d<\/strong>\u5c0d\u5f97\u4e0a\uff0c\u5c0d\u4e0d\u4e0a\u5c31\u7206\u3002<\/li>\n\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u300c\u9019\u5728\u5e79\u561b\u300d\uff1a\u7b49\u65bc\u5f8c\u7aef\u7684 <code>GET \/users\/{id}<\/code>\u3002URI \u662f\u8def\u7531\uff0c\u5927\u62ec\u865f\u662f\u8def\u5f91\u53c3\u6578\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">\u8a8d\u5f97\u5c31\u597d\uff1a\u5169\u7a2e\u62ec\u865f\u7684\u5dee\u5225<\/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-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@mcp.resource(<span class=\"hljs-string\">\"files:\/\/{filename}\"<\/span>)     <span class=\"hljs-comment\"># \u55ae\u6bb5\uff1a\u53ea\u5403\u4e00\u6bb5\uff0c\u4e0d\u8de8 \/<\/span>\ndef get_file(filename: str) -&gt; str: ...\n\n@mcp.resource(<span class=\"hljs-string\">\"path:\/\/{filepath*}\"<\/span>)     <span class=\"hljs-comment\"># \u5e36\u661f\u865f = \u842c\u7528\uff0c\u53ef\u4ee5\u5403\u542b \/ \u7684\u591a\u6bb5\u8def\u5f91<\/span>\ndef get_path(filepath: str) -&gt; str: ...\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<ul class=\"wp-block-list\">\n\n<li><code>{filename}<\/code>\uff1a\u53ea\u5339\u914d\u4e00\u6bb5\uff0c<code>files:\/\/a\/b<\/code> <strong>\u4e0d\u6703<\/strong>\u5339\u914d\u3002<\/li>\n\n\n<li><code>{filepath*}<\/code>\uff08\u591a\u4e00\u500b <code>*<\/code>\uff09\uff1a\u53ef\u4ee5\u5339\u914d <code>path:\/\/docs\/server\/x.md<\/code> \u9019\u7a2e\u591a\u5c64\u8def\u5f91\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u770b\u5230 <code>*<\/code> \u4e0d\u7528\u614c\uff0c\u5c31\u662f\u300c\u9019\u500b\u53c3\u6578\u53ef\u4ee5\u542b\u659c\u7dda\u3001\u5403\u591a\u6bb5\u300d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 <strong>\u5fc5\u770b\u61c2<\/strong>\uff1a<code>{param}<\/code> \u8981\u5c0d\u61c9\u540c\u540d\u51fd\u5f0f\u53c3\u6578\u3002 \ud83d\udd70\ufe0f <strong>\u8a8d\u5f97\u5c31\u597d<\/strong>\uff1a<code>{param*}<\/code> \u842c\u7528\u53c3\u6578\uff08\u8655\u7406\u6a94\u6848\u8def\u5f91\u6642\u624d\u6703\u51fa\u73fe\uff09\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Prompt\uff1a\u53ef\u91cd\u7528\u7684\u63d0\u793a\u7bc4\u672c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prompt \u662f<strong>\u7d66\u4f7f\u7528\u8005\u6311\u7684\u5c0d\u8a71\u7bc4\u672c<\/strong>\u3002\u8ddf tool \u6700\u5927\u7684\u5dee\u5225\uff1a<strong>tool \u662f\u6a21\u578b\u81ea\u5df1\u6c7a\u5b9a\u8981\u4e0d\u8981\u547c\u53eb\uff1bprompt \u662f\u4f7f\u7528\u8005\u5f9e\u9078\u55ae\u9ede\u4e0b\u53bb\u3001\u62ff\u4f86\u7576\u958b\u5834\u767d\u7684<\/strong>\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-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from fastmcp import FastMCP\n\nmcp = FastMCP(name=<span class=\"hljs-string\">\"PromptServer\"<\/span>)\n\n@mcp.prompt                        <span class=\"hljs-comment\"># \u6ce8\u610f\uff1a\u6c92\u6709\u62ec\u865f\u3001\u6c92\u6709 URI<\/span>\ndef ask_about_topic(topic: str) -&gt; str:\n    <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\u7522\u751f\u4e00\u53e5\u8acb AI \u89e3\u91cb\u67d0\u4e3b\u984c\u7684\u63d0\u793a\u3002\"<\/span><span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-keyword\">return<\/span> f<span class=\"hljs-string\">\"\u53ef\u4ee5\u8acb\u4f60\u89e3\u91cb\u300e{topic}\u300f\u9019\u500b\u6982\u5ff5\u55ce\uff1f\"<\/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\">\u9010\u884c\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>@mcp.prompt<\/code>\uff1a\u5ba3\u544a\u4e00\u500b\u63d0\u793a\u7bc4\u672c\uff08\u8ddf resource \u4e0d\u540c\uff0c<strong>\u4e0d\u9700\u8981 URI<\/strong>\uff0c\u7528\u51fd\u5f0f\u540d\u7576\u8b58\u5225\uff09\u3002<\/li>\n\n\n<li><code>topic: str<\/code>\uff1a\u9019\u500b\u7bc4\u672c\u7684\u53c3\u6578\u3002\u4f7f\u7528\u8005\u9078\u9019\u500b prompt \u6642\uff0cclient \u6703\u554f\u4ed6\u8981\u586b\u4ec0\u9ebc <code>topic<\/code>\u3002<\/li>\n\n\n<li>\u56de\u50b3\u7684\u5b57\u4e32\uff0c\u5c31\u662f\u6700\u5f8c\u9935\u7d66 AI \u7684\u8a0a\u606f\u3002<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u8f2a\u8a0a\u606f\u7248\u672c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u6642\u5019 AI \u6703\u56de\u50b3\u4e00\u4e32\u8a0a\u606f\uff08\u6a21\u64ec\u4e00\u6bb5\u5c0d\u8a71\u958b\u5834\uff09\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-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">fastmcp<\/span><span class=\"hljs-selector-class\">.prompts<\/span> <span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">Message<\/span>\n\n<span class=\"hljs-keyword\">@mcp<\/span>.prompt\ndef code_request(<span class=\"hljs-attribute\">language:<\/span> str, <span class=\"hljs-attribute\">task:<\/span> str) -&gt; list&#91;Message]:\n    <span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"\u7522\u751f\u4e00\u6bb5\u8acb AI \u5beb code \u7684\u5c0d\u8a71\u3002\"<\/span><span class=\"hljs-string\">\"\"<\/span>\n    return &#91;\n        Message(f<span class=\"hljs-string\">\"\u8acb\u7528 {language} \u5beb\u4e00\u500b\u51fd\u5f0f\uff0c\u529f\u80fd\u662f\uff1a{task}\"<\/span>),\n        Message(<span class=\"hljs-string\">\"\u597d\u7684\uff0c\u6211\u4f86\u5e6b\u4f60\u5beb\u3002\"<\/span>, role=<span class=\"hljs-string\">\"assistant\"<\/span>),  # \u9810\u8a2d role \u662f user\n    ]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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<ul class=\"wp-block-list\">\n\n<li><code>Message(...)<\/code> \u9810\u8a2d <code>role=\"user\"<\/code>\uff08\u4f7f\u7528\u8005\u8aaa\u7684\uff09\u3002<\/li>\n\n\n<li>\u52a0 <code>role=\"assistant\"<\/code> \u8868\u793a\u300c\u9019\u53e5\u5047\u88dd\u662f AI \u5df2\u7d93\u56de\u7684\u300d\uff0c\u7528\u4f86\u92ea\u9673\u8a9e\u6c23\u3002<\/li>\n\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u300c\u9019\u5728\u5e79\u561b\u300d\uff1a\u628a\u300c\u6bcf\u6b21\u90fd\u8981\u6253\u7684\u90a3\u4e32\u958b\u5834\u767d\u300d\u5b58\u6210\u4e00\u500b\u7bc4\u672c\uff0c\u4f7f\u7528\u8005\u9ede\u4e00\u4e0b\u3001\u586b\u5e7e\u500b\u7a7a\uff0c\u5c31\u81ea\u52d5\u5c55\u958b\u6210\u5b8c\u6574\u63d0\u793a\u3002\u50cf IDE \u7684 code snippet\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\">Context\uff1a\u4e00\u770b\u5230\u5c31\u4ee3\u8868 server \u6709\u5728\u8a8d\u771f\u505a\u4e8b<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Context<\/code> \u662f\u4f60\u5728 tool \/ resource \/ prompt \u88e1\u591a\u63a5\u4e00\u500b\u53c3\u6578\uff0c\u5c31\u80fd\u62ff\u5230\u7684\u300c\u8ddf client \u6e9d\u901a\u7684\u7ba1\u9053\u300d\u3002\u5b83\u80fd\u505a\uff1a<strong>\u8a18 log\u3001\u56de\u5831\u9032\u5ea6\u3001\u8b80\u5176\u4ed6 resource\u3001\u8ddf\u4f7f\u7528\u8005\u8981\u8f38\u5165<\/strong>\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-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from fastmcp import FastMCP, Context\n\nmcp = FastMCP(name=<span class=\"hljs-string\">\"Demo\"<\/span>)\n\n@mcp.tool\nasync def process_file(file_uri: str, ctx: Context) -&gt; str:\n    <span class=\"hljs-comment\">#                              ^^^^^^^^^^^^ \u591a\u63a5\u4e00\u500b Context\uff0cFastMCP \u81ea\u52d5\u585e\u9032\u4f86<\/span>\n    await ctx.info(f<span class=\"hljs-string\">\"\u958b\u59cb\u8655\u7406 {file_uri}\"<\/span>)   <span class=\"hljs-comment\"># \u9001\u4e00\u5247 log \u56de client\uff0c\u8b93\u4eba\u770b\u5f97\u5230\u9032\u5ea6<\/span>\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"\u8655\u7406\u5b8c\u6210\"<\/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\">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\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>ctx: Context<\/code>\uff1a<strong>\u9760\u578b\u5225\u6a19\u8a3b\u8a8d\u4eba<\/strong>\uff0c\u53c3\u6578\u53eb\u4ec0\u9ebc\u540d\u5b57\u4e0d\u91cd\u8981\uff0c\u53ea\u8981\u578b\u5225\u662f <code>Context<\/code>\uff0cFastMCP \u5c31\u6703\u81ea\u52d5\u628a context \u585e\u9032\u4f86\u3002<\/li>\n\n\n<li><strong>client \u770b\u4e0d\u5230\u9019\u500b\u53c3\u6578<\/strong>\uff1a\u5b83\u4e0d\u6703\u51fa\u73fe\u5728\u7d66 AI \u7684\u5de5\u5177\u8aaa\u660e\u88e1\uff0c\u7d14\u7cb9\u662f server \u5167\u90e8\u7528\u7684\u3002<\/li>\n\n\n<li><code>await ctx.info(...)<\/code>\uff1aContext \u7684\u65b9\u6cd5\u5e7e\u4e4e\u90fd\u662f <strong>async<\/strong>\uff0c\u6240\u4ee5\u51fd\u5f0f\u901a\u5e38\u8981\u5beb\u6210 <code>async def<\/code>\u3001\u547c\u53eb\u8981\u52a0 <code>await<\/code>\u3002<\/li>\n\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u2705 **\u5fc5\u770b\u61c2**\uff1a<code>ctx: Context<\/code> \u662f\u578b\u5225\u6ce8\u5165\uff0c\u9760\u578b\u5225\u4e0d\u9760\u540d\u5b57\uff1bclient \u770b\u4e0d\u5230\u5b83\u3002<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Context \u6700\u5e38\u898b\u7684\u56db\u62db<\/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-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># 1) \u8a18 log\uff08\u56db\u500b\u7b49\u7d1a\uff09<\/span>\nawait ctx.debug(<span class=\"hljs-string\">\"\u9664\u932f\u8a0a\u606f\"<\/span>)\nawait ctx.info(<span class=\"hljs-string\">\"\u4e00\u822c\u8a0a\u606f\"<\/span>)\nawait ctx.warning(<span class=\"hljs-string\">\"\u8b66\u544a\"<\/span>)\nawait ctx.error(<span class=\"hljs-string\">\"\u51fa\u932f\u4e86\"<\/span>)\n\n<span class=\"hljs-comment\"># 2) \u56de\u5831\u9032\u5ea6\uff08\u8dd1\u5f88\u4e45\u7684\u5de5\u4f5c\uff0c\u8b93 client \u986f\u793a\u9032\u5ea6\u689d\uff09<\/span>\nawait ctx.report_progress(progress=<span class=\"hljs-number\">50<\/span>, total=<span class=\"hljs-number\">100<\/span>)   <span class=\"hljs-comment\"># \u505a\u5230\u4e00\u534a\u4e86<\/span>\n\n<span class=\"hljs-comment\"># 3) \u5728 tool \u88e1\u8b80\u300c\u5225\u7684 resource\u300d<\/span>\nresult = await ctx.read_resource(<span class=\"hljs-string\">\"data:\/\/config\"<\/span>)\ncontent = result.contents&#91;<span class=\"hljs-number\">0<\/span>].content                <span class=\"hljs-comment\"># \u62ff\u5230\u5167\u5bb9<\/span>\n\n<span class=\"hljs-comment\"># 4) \u8ddf\u4f7f\u7528\u8005\u8981\u8f38\u5165\uff08\u4e92\u52d5\uff09<\/span>\nanswer = await ctx.elicit(<span class=\"hljs-string\">\"\u8acb\u8f38\u5165\u4f60\u7684\u540d\u5b57\uff1a\"<\/span>, response_type=str)\n<span class=\"hljs-keyword\">if<\/span> answer.action == <span class=\"hljs-string\">\"accept\"<\/span>:\n    name = answer.data\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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\">\u4f60\u4e0d\u7528\u80cc\u9019\u4e9b\u65b9\u6cd5\uff0c\u4f46<strong>\u770b\u5230\u5b83\u5011\u4f60\u8981\u77e5\u9053\u610f\u7fa9<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><code>ctx.report_progress<\/code> \u2192 \u9019\u662f\u500b<strong>\u8dd1\u5f97\u4e45<\/strong>\u7684\u64cd\u4f5c\uff08AI \u9858\u610f\u5beb\u9019\u500b\uff0c\u901a\u5e38\u4ee3\u8868\u5b83\u6709\u60f3\u5230 UX\uff09\u3002<\/li>\n\n\n<li><code>ctx.read_resource<\/code> \u2192 \u9019\u500b tool <strong>\u6703\u53bb\u8b80\u5225\u7684\u8cc7\u6599\u6e90<\/strong>\uff0c\u8cc7\u6599\u6d41\u4e0d\u53ea\u6709\u53c3\u6578\u9032\u4f86\u9019\u4e00\u689d\u3002<\/li>\n\n\n<li><code>ctx.elicit<\/code> \u2192 \u9019\u500b tool <strong>\u57f7\u884c\u5230\u4e00\u534a\u6703\u505c\u4e0b\u4f86\u554f\u4f7f\u7528\u8005<\/strong>\uff08\u6bd4\u8f03\u65b0\u7684\u529f\u80fd\uff09\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udd70\ufe0f <strong>\u8a8d\u5f97\u5c31\u597d\uff08v4 \u65b0\u5beb\u6cd5\uff09<\/strong>\uff1a\u65b0\u7248\u6709\u6642\u6703\u5beb\u6210 <code>ctx: Context = CurrentContext()<\/code>\uff0c\u610f\u601d\u4e00\u6a23\uff0c\u90fd\u662f\u62ff context\uff0c\u53ea\u662f\u63db\u4e86\u6ce8\u5165\u5beb\u6cd5\u3002\u770b\u5230\u5225\u4ee5\u70ba\u662f\u65b0\u6771\u897f\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4ec0\u9ebc\u6642\u5019\u8a72\u7528\u54ea\u500b\uff1f\uff08\u5be6\u52d9\u5224\u65b7\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u662f\u9a57\u6536 AI \u7522\u51fa\u6642\u6700\u503c\u5f97\u770b\u7684\u4e00\u9ede\u3002\u7d66\u4f60\u4e00\u500b\u6c7a\u7b56\u53e3\u8a23\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=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">\u5b83\u6703\u300c\u6539\u8b8a\u72c0\u614b\u300d\u6216\u300c\u57f7\u884c\u52d5\u4f5c\u300d\u55ce\uff1f\uff08\u5beb\u5165 DB\u3001\u5bc4\u4fe1\u3001\u547c\u53eb API \u505a\u4e8b\uff09\n   \u2192 \u662f \u2192 Tool\n\n\u5b83\u53ea\u662f\u300c\u628a\u4e00\u4efd\u8cc7\u6599\u8b80\u51fa\u4f86\u7d66\u770b\u300d\u55ce\uff1f\uff08\u8a2d\u5b9a\u3001\u6a94\u6848\u3001\u67e5\u8a62\u7d50\u679c\uff0c\u552f\u8b80\uff09\n   \u2192 \u662f \u2192 Resource\uff08\u56fa\u5b9a\u5c31\u7528 data:<span class=\"hljs-comment\">\/\/x\uff0c\u8981\u5e36 id \u5c31\u7528 data:\/\/{id}\uff09<\/span>\n\n\u5b83\u662f\u300c\u4e00\u6bb5\u8981\u91cd\u8907\u4f7f\u7528\u3001\u7d66\u4f7f\u7528\u8005\u6311\u7684\u958b\u5834\u767d\uff0f\u7bc4\u672c\u300d\u55ce\uff1f\n   \u2192 \u662f \u2192 Prompt\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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\">\u5c0d\u7167\u4e00\u4e0b\u5c31\u5f88\u6e05\u695a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u9700\u6c42<\/th>\n<th>\u8a72\u7528<\/th>\n<th>\u70ba\u4ec0\u9ebc<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u300c\u65b0\u589e\u4e00\u7b46\u8a02\u55ae\u300d<\/td>\n<td>Tool<\/td>\n<td>\u6709\u526f\u4f5c\u7528\u3001\u5728\u505a\u4e8b<\/td>\n<\/tr>\n<tr>\n<td>\u300c\u8b80\u53d6\u7cfb\u7d71\u8a2d\u5b9a\u300d<\/td>\n<td>Resource<\/td>\n<td>\u552f\u8b80\u3001\u50cf GET<\/td>\n<\/tr>\n<tr>\n<td>\u300c\u4f9d ID \u62ff\u4f7f\u7528\u8005\u8cc7\u6599\u300d<\/td>\n<td>Resource \u6a21\u677f<\/td>\n<td>\u552f\u8b80 + \u5e36\u53c3\u6578<\/td>\n<\/tr>\n<tr>\n<td>\u300c\u5e6b\u6211\u628a bug report \u6574\u7406\u6210\u6a19\u6e96\u683c\u5f0f\u300d<\/td>\n<td>Prompt<\/td>\n<td>\u53ef\u91cd\u7528\u7684\u7bc4\u672c<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\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\u770b\u5230\u9019\u4e9b\u8981\u8b66\u89ba<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d05\u65d7 1\uff1a\u4ec0\u9ebc\u90fd\u505a\u6210 tool<\/strong><\/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=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@mcp<\/span>.tool\ndef get_config() -&gt; <span class=\"hljs-attribute\">dict:<\/span>      # \ud83d\udea9 \u9019\u6839\u672c\u6c92\u505a\u4e8b\uff0c\u53ea\u662f\u8b80\u8a2d\u5b9a \u2192 \u8a72\u662f resource\n    return load_config()\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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\">\u7d14\u552f\u8b80\u3001\u6c92\u6709\u526f\u4f5c\u7528\u7684\u300c\u62ff\u8cc7\u6599\u300d\u88ab\u5beb\u6210 tool\u3002\u80fd\u8dd1\uff0c\u4f46\u8a9e\u610f\u932f\u4e86\uff0c\u4e5f\u8b93\u6a21\u578b\u7684\u5de5\u5177\u6e05\u55ae\u7121\u8b02\u8b8a\u9577\u3002 \u8ddf AI \u8aaa\uff1a\u300c\u9019\u500b\u53ea\u662f\u552f\u8b80\u53d6\u8cc7\u6599\uff0c\u6539\u5beb\u6210 <code>@mcp.resource<\/code> \u6bd4\u8f03\u5408\u9069\u55ce\uff1f\u300d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d05\u65d7 2\uff1a\u8cc7\u6e90\u6a21\u677f\u7684\u53c3\u6578\u540d\u5c0d\u4e0d\u4e0a<\/strong><\/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\">@mcp.resource(<span class=\"hljs-string\">\"users:\/\/{user_id}\"<\/span>)\ndef get_user(id: str) -&gt; dict:   <span class=\"hljs-comment\"># \ud83d\udea9 URI \u662f {user_id}\uff0c\u53c3\u6578\u537b\u53eb id \u2192 \u5c0d\u4e0d\u4e0a\u6703\u7206<\/span>\n    ...\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\n<p class=\"wp-block-paragraph\">\u5927\u62ec\u865f\u540d\u5b57\u5fc5\u9808\u7b49\u65bc\u51fd\u5f0f\u53c3\u6578\u540d\u3002\u9019\u7a2e\u932f AI \u5076\u723e\u6703\u72af\uff0c\u5c24\u5176\u662f\u5b83\u6539\u4e86\u5176\u4e2d\u4e00\u908a\u5fd8\u4e86\u6539\u53e6\u4e00\u908a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d05\u65d7 3\uff1a\u7528\u4e86 Context \u537b\u6c92 async \/ await<\/strong><\/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-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@mcp<\/span>.tool\ndef process(<span class=\"hljs-attribute\">ctx:<\/span> Context) -&gt; <span class=\"hljs-attribute\">str:<\/span>   # \ud83d\udea9 \u6c92 async\n    ctx.info(<span class=\"hljs-string\">\"start\"<\/span>)               # \ud83d\udea9 \u6c92 await \u2192 \u9019\u884c\u7b49\u65bc\u6c92\u771f\u7684\u9001\u51fa\n    return <span class=\"hljs-string\">\"done\"<\/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\">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\">Context \u7684\u65b9\u6cd5\u662f async \u7684\u3002\u5c11\u4e86 <code>async def<\/code> \u6216\u5c11\u4e86 <code>await<\/code>\uff0clog \u548c\u9032\u5ea6\u56de\u5831\u6703<strong>\u9ed8\u9ed8\u5931\u6548<\/strong>\u2014\u2014\u4e0d\u6703\u5831\u932f\uff0c\u4f46 client \u4ec0\u9ebc\u90fd\u6536\u4e0d\u5230\u3002\u9019\u7a2e\u300c\u975c\u9ed8\u5931\u6548\u300d\u6700\u96e3\u6293\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u7d05\u65d7 4\uff1a\u628a\u654f\u611f\u8cc7\u6599\u585e\u9032 resource \u76f4\u63a5\u5410<\/strong><\/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-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@mcp.resource(<span class=\"hljs-string\">\"data:\/\/secrets\"<\/span>)\ndef get_secrets() -&gt; dict:\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"api_key\"<\/span>: os.environ&#91;<span class=\"hljs-string\">\"API_KEY\"<\/span>]}   <span class=\"hljs-comment\"># \ud83d\udea9 \u91d1\u9470\u88ab\u7576\u6210\u8cc7\u6e90\u516c\u958b<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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\">Resource \u662f\u7d66 client \/ LLM \u8b80\u7684\u3002\u628a\u91d1\u9470\u3001\u5bc6\u78bc\u653e\u9032\u53bb\uff0c\u7b49\u65bc\u4e3b\u52d5\u905e\u51fa\u53bb\u3002\u770b\u5230 resource \u5728\u56de\u50b3\u74b0\u5883\u8b8a\u6578\u3001token\u3001\u5bc6\u78bc\uff0c\u8981\u7acb\u523b\u8b66\u89ba\u3002<\/p>\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\">\u62ff\u5230 AI \u751f\u7684 MCP server\uff0c\u4f60\u53ef\u4ee5\u9019\u6a23\u9a57\u6536\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>\u5206\u985e\u6578\u4e00\u6578<\/strong>\uff1a\u6253\u958b\u6a94\u6848\uff0c\u6578 <code>@mcp.tool<\/code> \/ <code>@mcp.resource<\/code> \/ <code>@mcp.prompt<\/code> \u5404\u5e7e\u500b\u3002\u5982\u679c<strong>\u5168\u90e8\u90fd\u662f tool<\/strong>\uff0c\u516b\u6210\u6709\u8a72\u62c6\u6210 resource \u7684\u6771\u897f \u2192 \u554f AI\u3002<\/li>\n\n\n<li><strong>\u6a21\u677f\u53c3\u6578\u5c0d\u540d\u5b57<\/strong>\uff1a\u6bcf\u500b <code>@mcp.resource(\"...{x}...\")<\/code>\uff0c\u78ba\u8a8d\u51fd\u5f0f\u88e1\u6709\u540c\u540d\u53c3\u6578 <code>x<\/code>\u3002\u7528\u7de8\u8f2f\u5668\u641c\u5927\u62ec\u865f\u6700\u5feb\u3002<\/li>\n\n\n<li><strong>Context \u4e00\u5b9a async<\/strong>\uff1a\u641c <code>ctx.<\/code>\uff0c\u78ba\u8a8d\u6bcf\u4e00\u8655\u524d\u9762\u90fd\u6709 <code>await<\/code>\u3001\u6240\u5728\u51fd\u5f0f\u662f <code>async def<\/code>\u3002<\/li>\n\n\n<li><strong>\u5be6\u969b\u8dd1\u4e00\u6b21<\/strong>\uff08FastMCP \u5167\u5efa\u958b\u767c\u5de5\u5177\uff09\uff1a<\/li>\n\n\n<li><strong>\u554f AI \u6aa2\u67e5\u4e00\u8f2a<\/strong>\uff08\u76f4\u63a5\u8907\u88fd\uff09\uff1a<\/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\">\u770b\u4e0d\u61c2\u5c31\u9019\u6a23\u554f AI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u300c\u7528\u767d\u8a71\u4e00\u53e5\u8a71\u89e3\u91cb\u9019\u6bb5 <code>@mcp.resource(\"data:\/\/{id}\")<\/code> \u5728\u5e79\u561b\uff0c\u6211\u662f\u521d\u5b78\u8005\u3002\u300d<\/li>\n\n\n<li>\u300c\u9019\u500b server \u70ba\u4ec0\u9ebc\u8981\u7528 Context\uff1f\u62ff\u6389\u5b83\u6703\u600e\u6a23\uff1f\u300d<\/li>\n\n\n<li>\u300c\u5e6b\u6211\u5224\u65b7\u9019\u5e7e\u500b\u51fd\u5f0f\uff0c\u5404\u81ea\u61c9\u8a72\u662f tool\u3001resource \u9084\u662f prompt\uff0c\u4e26\u8aaa\u660e\u7406\u7531\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\">\u5c0f\u7d50<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Tool \u505a\u4e8b\u3001Resource \u7d66\u8cc7\u6599\uff08\u552f\u8b80\uff09\u3001Prompt \u7d66\u7bc4\u672c<\/strong>\u2014\u2014\u5148\u5206\u985e\uff0c\u518d\u770b\u7d30\u7bc0\u3002<\/li>\n\n\n<li><strong>\u8cc7\u6e90\u6a21\u677f<\/strong> <code>data:\/\/{id}<\/code>\uff1aURI \u5927\u62ec\u865f\u540d\u5b57 = \u51fd\u5f0f\u53c3\u6578\u540d\uff0c\u7b49\u65bc\u5f8c\u7aef\u7684\u8def\u5f91\u53c3\u6578\u3002<\/li>\n\n\n<li><strong>Context<\/strong>\uff08<code>ctx: Context<\/code>\uff09\uff1a\u8a18 log\u3001\u56de\u5831\u9032\u5ea6\u3001\u8b80\u5225\u7684 resource\u3001\u8ddf\u4f7f\u7528\u8005\u4e92\u52d5\uff1b\u65b9\u6cd5\u90fd\u662f async\uff0c\u5c11\u4e86 <code>await<\/code> \u6703\u975c\u9ed8\u5931\u6548\u3002<\/li>\n\n\n<li>\u9a57\u6536\u91cd\u9ede\uff1a<strong>\u5225\u8b93\u6240\u6709\u6771\u897f\u90fd\u8b8a\u6210 tool<\/strong>\uff0c\u4e26\u76ef\u7dca\u6a21\u677f\u53c3\u6578\u540d\u8207 async\/await\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u4e00\u7bc7\uff08#04\uff09\u6211\u5011\u6703\u628a\u9019\u500b server \u771f\u7684\u300c\u4e0a\u7dda\u300d\u2014\u2014\u90e8\u7f72\u8207\u8ddf client \u4e32\u63a5\u3002<\/p>\n\n\n\n<div id=\"quiz-466ef977\">\n<style>\n#quiz-466ef977 .badge { display: inline-block; padding: 4px 10px; border-radius: 12px; font-size: 0.75em; font-weight: bold; margin-left: 8px; }#quiz-466ef977 .badge.scenario { background: #ebf8ff; color: #2b6cb0; }#quiz-466ef977 .badge.debug { background: #fef3c7; color: #92400e; }#quiz-466ef977 .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-466ef977 .question-adv h3 { margin-top: 0; color: #2d3748; }#quiz-466ef977 .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-466ef977 .options-adv { list-style: none; padding: 0; }#quiz-466ef977 .options-adv li { padding: 14px 16px; margin: 10px 0; border: 2px solid #e2e8f0; border-radius: 8px; cursor: pointer; transition: all 0.2s; }#quiz-466ef977 .options-adv li:hover:not(.disabled) { border-color: #ed8936; background: #fffaf0; }#quiz-466ef977 .options-adv li.disabled { cursor: default; opacity: 0.7; }#quiz-466ef977 .options-adv li.show-answer { border-color: #48bb78; background: #f0fff4; }#quiz-466ef977 .options-adv li.wrong { border-color: #fc8181; background: #fff5f5; }#quiz-466ef977 .feedback-adv { margin-top: 16px; padding: 14px; border-radius: 8px; display: none; line-height: 1.6; }#quiz-466ef977 .feedback-adv.correct { background: #f0fff4; color: #276749; display: block; }#quiz-466ef977 .feedback-adv.wrong { background: #fff5f5; color: #c53030; display: block; }#quiz-466ef977 .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-466ef977 .intro { background: #ebf8ff; padding: 16px; border-radius: 8px; margin-bottom: 20px; color: #2c5282; }\n<\/style>\n<h1>\u9032\u968e\u6e2c\u9a57\uff1aResources\u3001Prompts \u8207 Context<\/h1>\n    <div class=\"intro\">\n      <strong>\u6e2c\u9a57\u76ee\u6a19\uff1a<\/strong>\u9a57\u8b49\u4f60\u662f\u5426\u80fd\u5728\u5be6\u969b\u60c5\u5883\u4e2d\u61c9\u7528\u6240\u5b78\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\u5728\u9a57\u6536 AI \u751f\u7684 MCP server\uff0c\u767c\u73fe\u4e0b\u9762\u9019\u6bb5\u3002\u4f60\u8a72\u5efa\u8b70\u600e\u9ebc\u6539\uff1f<span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <div class=\"code-block\">@mcp.tool\ndef get_config() -> dict:\n    return load_config()   # \u7d14\u552f\u8b80\uff0c\u8b80\u51fa\u7cfb\u7d71\u8a2d\u5b9a<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(1, 'A', 'B')\">A. \u4e0d\u7528\u6539\uff0c\u80fd\u8dd1\u5c31\u597d\uff0ctool \u6700\u842c\u7528<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'B', 'B')\">B. \u6539\u6210 @mcp.resource\uff0c\u56e0\u70ba\u5b83\u662f\u552f\u8b80\u53d6\u8cc7\u6599\u3001\u6c92\u6709\u526f\u4f5c\u7528<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'C', 'B')\">C. \u6539\u6210 @mcp.prompt\uff0c\u56e0\u70ba\u5b83\u56de\u50b3\u7d50\u69cb\u5316\u8cc7\u6599<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'D', 'B')\">D. \u52a0\u4e0a async\/await \u5c31\u597d\uff0c\u8a9e\u610f\u4e0d\u7528\u52d5<\/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\u5beb\u4e00\u500b\u300c\u8dd1\u5f88\u4e45\u3001\u60f3\u5728 client \u986f\u793a\u9032\u5ea6\u689d\u300d\u7684 tool\uff0c\u6700\u9069\u5408\u7528 Context \u7684\u54ea\u500b\u65b9\u6cd5\uff1f<span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(2, 'A', 'C')\">A. await ctx.info(&#8220;50%&#8221;)<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'B', 'C')\">B. await ctx.read_resource(&#8220;progress:\/\/50&#8221;)<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'C', 'C')\">C. await ctx.report_progress(progress=50, total=100)<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'D', 'C')\">D. await ctx.elicit(&#8220;\u9032\u5ea6 50%&#8221;, response_type=int)<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv2\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv3\">\n      <h3>3. \u9700\u6c42\u662f\u300c\u5e6b\u6211\u628a bug report \u6574\u7406\u6210\u516c\u53f8\u6a19\u6e96\u683c\u5f0f\u7684\u63d0\u793a\uff0c\u8b93\u5718\u968a\u6bcf\u500b\u4eba\u90fd\u80fd\u91cd\u8907\u7528\u300d\u3002\u6700\u9069\u5408\u7684\u539f\u8a9e\u662f\uff1f<span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(3, 'A', 'D')\">A. Tool\uff0c\u56e0\u70ba\u5b83\u8981\u8655\u7406\u6587\u5b57<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'B', 'D')\">B. Resource\uff0c\u56e0\u70ba\u5b83\u662f\u4e00\u4efd\u6587\u4ef6<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'C', 'D')\">C. \u8cc7\u6e90\u6a21\u677f\uff0c\u56e0\u70ba\u6bcf\u500b bug \u6709\u4e0d\u540c id<\/li>\n        <li onclick=\"checkAnswerAdv(3, 'D', 'D')\">D. Prompt\uff0c\u56e0\u70ba\u5b83\u662f\u53ef\u91cd\u7528\u3001\u7d66\u4f7f\u7528\u8005\u6311\u7684\u63d0\u793a\u7bc4\u672c<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv3\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv4\">\n      <h3>4. \u9019\u500b\u8cc7\u6e90\u6a21\u677f\u8a3b\u518a\u6216\u547c\u53eb\u6642\u6703\u51fa\u554f\u984c\uff0c\u539f\u56e0\u662f\u4ec0\u9ebc\uff1f<span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">@mcp.resource(&#8220;users:\/\/{user_id}&#8221;)\ndef get_user(id: str) -> dict:\n    return {&#8220;id&#8221;: id}<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(4, 'A', 'B')\">A. URI \u4e0d\u80fd\u7528 users:\/\/ \u958b\u982d<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'B', 'B')\">B. URI \u7684 {user_id} \u8207\u51fd\u5f0f\u53c3\u6578\u540d id \u5c0d\u4e0d\u4e0a\uff0c\u5169\u8005\u5fc5\u9808\u540c\u540d<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'C', 'B')\">C. \u56de\u50b3\u578b\u5225\u4e0d\u80fd\u662f dict<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'D', 'B')\">D. \u8cc7\u6e90\u6a21\u677f\u4e00\u5b9a\u8981\u5beb\u6210 async def<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv4\"><\/div>\n    <\/div>\n\n    <div class=\"question-adv\" id=\"qAdv5\">\n      <h3>5. \u9019\u500b tool \u57f7\u884c\u5f8c\uff0cclient \u5b8c\u5168\u6536\u4e0d\u5230\u4efb\u4f55 log\uff0c\u4e5f\u4e0d\u5831\u932f\u3002\u6700\u53ef\u80fd\u7684\u539f\u56e0\u662f\uff1f<span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">@mcp.tool\ndef process(ctx: Context) -> str:\n    ctx.info(&#8220;start&#8221;)\n    return &#8220;done&#8221;<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(5, 'A', 'C')\">A. Context \u6c92\u6709 info \u65b9\u6cd5\uff0c\u61c9\u8a72\u7528 print<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'B', 'C')\">B. tool \u4e0d\u80fd\u4f7f\u7528 Context\uff0c\u53ea\u6709 resource \u53ef\u4ee5<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'C', 'C')\">C. \u51fd\u5f0f\u4e0d\u662f async \u4e14 ctx.info \u6c92 await\uff0c\u975e\u540c\u6b65\u547c\u53eb\u6c92\u88ab\u771f\u6b63\u9001\u51fa\uff08\u975c\u9ed8\u5931\u6548\uff09<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'D', 'C')\">D. log \u7b49\u7d1a info \u9810\u8a2d\u88ab\u904e\u6ffe\uff0c\u8981\u6539\u7528 ctx.error<\/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: \"get_config \u7d14\u552f\u8b80\u3001\u7121\u526f\u4f5c\u7528\uff0c\u8a9e\u610f\u4e0a\u662f\u300c\u7d66\u8cc7\u6599\u300d\uff0c\u61c9\u6539\u6210 <code>@mcp.resource<\/code>\u3002\u5168\u90e8\u585e\u6210 tool \u6703\u8b93\u6a21\u578b\u7684\u5de5\u5177\u6e05\u55ae\u7121\u8b02\u8b8a\u9577\uff0c\u4e5f\u9055\u53cd\u539f\u8a9e\u8a9e\u610f\u3002\",\n        2: \"\u56de\u5831\u9032\u5ea6\u7684\u5c08\u7528\u65b9\u6cd5\u662f <code>ctx.report_progress(progress, total)<\/code>\uff0cclient \u53ef\u64da\u6b64\u986f\u793a\u9032\u5ea6\u689d\u3002ctx.info \u53ea\u662f\u9001 log \u6587\u5b57\uff1bread_resource \u662f\u8b80\u8cc7\u6599\uff1belicit \u662f\u8ddf\u4f7f\u7528\u8005\u8981\u8f38\u5165\u3002\",\n        3: \"\u53ef\u91cd\u7528\u3001\u7d66\u4f7f\u7528\u8005\u4e3b\u52d5\u6311\u9078\u7684\u63d0\u793a\u7bc4\u672c\uff0c\u6b63\u662f <code>@mcp.prompt<\/code> \u7684\u5b9a\u4f4d\u3002Tool \u662f\u505a\u4e8b\u3001Resource \u662f\u552f\u8b80\u8cc7\u6599\uff0c\u90fd\u4e0d\u7b26\u5408\u300c\u7bc4\u672c\u300d\u9019\u500b\u8a9e\u610f\u3002\",\n        4: \"\u8cc7\u6e90\u6a21\u677f URI \u88e1\u7684 <code>{user_id}<\/code> \u5fc5\u9808\u5c0d\u61c9\u5230\u540c\u540d\u7684\u51fd\u5f0f\u53c3\u6578\u3002\u9019\u88e1\u51fd\u5f0f\u53c3\u6578\u53eb id\uff0c\u5169\u908a\u5c0d\u4e0d\u4e0a\u5c31\u6703\u51fa\u932f\u3002AI \u6539\u4e86\u4e00\u908a\u5fd8\u4e86\u6539\u53e6\u4e00\u908a\u6642\u6700\u5e38\u898b\u3002\",\n        5: \"Context \u7684\u65b9\u6cd5\u662f async \u7684\u3002\u51fd\u5f0f\u6c92\u5beb <code>async def<\/code>\u3001\u547c\u53eb\u53c8\u6c92\u52a0 <code>await<\/code>\uff0c\u9019\u500b\u5354\u7a0b\u6839\u672c\u6c92\u88ab await \u57f7\u884c\uff0clog \u975c\u9ed8\u5931\u6548\u2014\u2014\u4e0d\u5831\u932f\u4f46 client \u6536\u4e0d\u5230\u3002\u4fee\u6cd5\uff1a<code>async def process(ctx: Context)<\/code> \u52a0 <code>await ctx.info(...)<\/code>\u3002\",\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\u64cd\u4f5c\u6d41\u7a0b\";\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\uff1aResources\u3001Prompts \u8207 Context \u5171 5 \u984c\uff0c\u9ede\u9078\u7b54\u6848\u5f8c\u6703\u7acb\u5373\u986f\u793a\u7d50\u679c 1. \u4f9d\u6587 [&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":[945,938,440,944,943],"class_list":["post-872","post","type-post","status-publish","format-standard","hentry","category-mcp","tag-context","tag-fastmcp","tag-mcp","tag-prompt","tag-resource"],"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\/872","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=872"}],"version-history":[{"count":0,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}