{"id":727,"date":"2026-02-08T01:06:21","date_gmt":"2026-02-07T17:06:21","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/02\/08\/%e3%80%90claude-code-%e9%80%b2%e9%9a%8e%e9%85%8d%e7%bd%ae%e3%80%9104-hooks-%e8%88%87-mcp%ef%bc%9a%e4%ba%8b%e4%bb%b6%e9%a9%85%e5%8b%95%e8%87%aa%e5%8b%95%e5%8c%96%e8%88%87%e5%a4%96%e9%83%a8%e6%9c%8d\/"},"modified":"2026-02-08T01:06:21","modified_gmt":"2026-02-07T17:06:21","slug":"%e3%80%90claude-code-%e9%80%b2%e9%9a%8e%e9%85%8d%e7%bd%ae%e3%80%9104-hooks-%e8%88%87-mcp%ef%bc%9a%e4%ba%8b%e4%bb%b6%e9%a9%85%e5%8b%95%e8%87%aa%e5%8b%95%e5%8c%96%e8%88%87%e5%a4%96%e9%83%a8%e6%9c%8d","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/02\/08\/%e3%80%90claude-code-%e9%80%b2%e9%9a%8e%e9%85%8d%e7%bd%ae%e3%80%9104-hooks-%e8%88%87-mcp%ef%bc%9a%e4%ba%8b%e4%bb%b6%e9%a9%85%e5%8b%95%e8%87%aa%e5%8b%95%e5%8c%96%e8%88%87%e5%a4%96%e9%83%a8%e6%9c%8d\/","title":{"rendered":"\u3010Claude Code \u9032\u968e\u914d\u7f6e\u3011#04 Hooks \u8207 MCP\uff1a\u4e8b\u4ef6\u9a45\u52d5\u81ea\u52d5\u5316\u8207\u5916\u90e8\u670d\u52d9\u6574\u5408"},"content":{"rendered":"\n<div id=\"quiz-cb6968a0\">\n<style>\n#quiz-cb6968a0 .question {\n        background: white;\n        border-radius: 8px;\n        padding: 20px;\n        margin: 20px 0;\n        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n      }#quiz-cb6968a0 .question h3 {\n        margin-top: 0;\n        color: #333;\n      }#quiz-cb6968a0 .options {\n        list-style: none;\n        padding: 0;\n      }#quiz-cb6968a0 .options li {\n        padding: 12px 15px;\n        margin: 8px 0;\n        border: 2px solid #ddd;\n        border-radius: 6px;\n        cursor: pointer;\n        transition: all 0.2s;\n      }#quiz-cb6968a0 .options li:hover:not(.disabled) {\n        border-color: #4caf50;\n        background: #f0fff0;\n      }#quiz-cb6968a0 .options li.correct {\n        border-color: #4caf50;\n        background: #e8f5e9;\n      }#quiz-cb6968a0 .options li.wrong {\n        border-color: #f44336;\n        background: #ffebee;\n      }#quiz-cb6968a0 .options li.disabled {\n        cursor: default;\n        opacity: 0.7;\n      }#quiz-cb6968a0 .options li.show-answer {\n        border-color: #4caf50;\n        background: #e8f5e9;\n      }#quiz-cb6968a0 .feedback {\n        margin-top: 15px;\n        padding: 12px;\n        border-radius: 6px;\n        display: none;\n      }#quiz-cb6968a0 .feedback.correct {\n        background: #e8f5e9;\n        color: #2e7d32;\n        display: block;\n      }#quiz-cb6968a0 .feedback.wrong {\n        background: #ffebee;\n        color: #c62828;\n        display: block;\n      }#quiz-cb6968a0 .score {\n        text-align: center;\n        font-size: 1.5em;\n        padding: 20px;\n        background: white;\n        border-radius: 8px;\n        margin-top: 20px;\n      }#quiz-cb6968a0 .code-block {\n        background: #1e1e1e;\n        color: #d4d4d4;\n        padding: 14px;\n        border-radius: 6px;\n        font-family: \"Monaco\", \"Consolas\", \"Courier New\", monospace;\n        font-size: 0.9em;\n        overflow-x: auto;\n        margin: 12px 0;\n        white-space: pre-wrap;\n      }\n<\/style>\n<h1>\u6e2c\u9a57\uff1aHooks \u8207 MCP \u2014 \u4e8b\u4ef6\u9a45\u52d5\u81ea\u52d5\u5316\u8207\u5916\u90e8\u670d\u52d9\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. \u5728 Claude Code \u7684 hooks \u914d\u7f6e\u4e2d\uff0c<code>PreToolUse<\/code> \u4e8b\u4ef6\u7684\u6700\u5e38\u898b\u7528\u9014\u662f\u4ec0\u9ebc\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(1, 'A', 'C')\">A. \u5728 Session \u7d50\u675f\u6642\u4fdd\u5b58\u72c0\u614b<\/li>\n        <li onclick=\"checkAnswer(1, 'B', 'C')\">B. \u81ea\u52d5\u683c\u5f0f\u5316\u7a0b\u5f0f\u78bc<\/li>\n        <li onclick=\"checkAnswer(1, 'C', 'C')\">C. \u963b\u6b62\u5371\u96aa\u6307\u4ee4\u7684\u57f7\u884c<\/li>\n        <li onclick=\"checkAnswer(1, 'D', 'C')\">D. \u8f09\u5165\u74b0\u5883\u8b8a\u6578\u8207\u6062\u5fa9\u4e0a\u4e0b\u6587<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb1\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q2\">\n      <h3>2. \u8acb\u770b\u4e0b\u65b9\u7684 hooks \u914d\u7f6e\u7247\u6bb5\uff0c\u9019\u6bb5\u914d\u7f6e\u7684\u529f\u80fd\u662f\u4ec0\u9ebc\uff1f<\/h3>\n      <div class=\"code-block\">{\n  &#8220;hooks&#8221;: {\n    &#8220;PostToolUse&#8221;: [\n      {\n        &#8220;matcher&#8221;: &#8220;Write|Edit&#8221;,\n        &#8220;hooks&#8221;: [\n          {\n            &#8220;type&#8221;: &#8220;command&#8221;,\n            &#8220;command&#8221;: &#8220;npx prettier &#8211;write &#8230;&#8221;\n          }\n        ]\n      }\n    ]\n  }\n}<\/div>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(2, 'A', 'B')\">A. \u5728\u5beb\u5165\u6216\u7de8\u8f2f\u6a94\u6848\u524d\uff0c\u5148\u6aa2\u67e5\u6a94\u6848\u683c\u5f0f<\/li>\n        <li onclick=\"checkAnswer(2, 'B', 'B')\">B. \u5728\u5beb\u5165\u6216\u7de8\u8f2f\u6a94\u6848\u5f8c\uff0c\u81ea\u52d5\u7528 Prettier \u683c\u5f0f\u5316<\/li>\n        <li onclick=\"checkAnswer(2, 'C', 'B')\">C. \u5728\u6240\u6709\u5de5\u5177\u57f7\u884c\u5f8c\uff0c\u7528 Prettier \u683c\u5f0f\u5316\u6240\u6709\u6a94\u6848<\/li>\n        <li onclick=\"checkAnswer(2, 'D', 'B')\">D. \u5728\u5beb\u5165\u6216\u7de8\u8f2f\u6a94\u6848\u524d\uff0c\u963b\u6b62\u4e0d\u7b26\u5408\u683c\u5f0f\u898f\u7bc4\u7684\u64cd\u4f5c<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb2\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q3\">\n      <h3>3. Hook \u8173\u672c\u56de\u50b3 <code>exit 2<\/code> \u6642\uff0cClaude Code \u6703\u600e\u9ebc\u8655\u7406\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(3, 'A', 'D')\">A. \u5ffd\u7565\u932f\u8aa4\u4e26\u7e7c\u7e8c\u57f7\u884c<\/li>\n        <li onclick=\"checkAnswer(3, 'B', 'D')\">B. \u986f\u793a\u8b66\u544a\u4f46\u4e0d\u5f71\u97ff\u6d41\u7a0b<\/li>\n        <li onclick=\"checkAnswer(3, 'C', 'D')\">C. \u5c07 stdout \u7684\u5167\u5bb9\u56de\u994b\u7d66 Claude<\/li>\n        <li onclick=\"checkAnswer(3, 'D', 'D')\">D. \u963b\u6b62\u8a72\u52d5\u4f5c\uff0c\u4e26\u5c07 stderr \u7684\u8a0a\u606f\u56de\u994b\u7d66 Claude<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb3\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q4\">\n      <h3>4. \u5982\u4f55\u5340\u5206 MCP \u914d\u7f6e\u4e2d\u7684 stdio \u985e\u578b\u8207 HTTP \u985e\u578b\u4f3a\u670d\u5668\uff1f<\/h3>\n      <div class=\"code-block\">\/\/ \u914d\u7f6e A\n{\n  &#8220;github&#8221;: {\n    &#8220;command&#8221;: &#8220;npx&#8221;,\n    &#8220;args&#8221;: [&#8220;-y&#8221;, &#8220;@modelcontextprotocol\/server-github&#8221;]\n  }\n}\n\n\/\/ \u914d\u7f6e B\n{\n  &#8220;vercel&#8221;: {\n    &#8220;type&#8221;: &#8220;http&#8221;,\n    &#8220;url&#8221;: &#8220;https:\/\/mcp.vercel.com&#8221;\n  }\n}<\/div>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(4, 'A', 'C')\">A. \u6709 <code>\"url\"<\/code> \u7684\u662f stdio \u985e\u578b\uff0c\u6709 <code>\"command\"<\/code> \u7684\u662f HTTP \u985e\u578b<\/li>\n        <li onclick=\"checkAnswer(4, 'B', 'C')\">B. \u5169\u8005\u6c92\u6709\u5340\u5225\uff0c\u53ea\u662f\u5beb\u6cd5\u4e0d\u540c<\/li>\n        <li onclick=\"checkAnswer(4, 'C', 'C')\">C. \u6709 <code>\"command\"<\/code> + <code>\"args\"<\/code> \u7684\u662f stdio\uff08\u672c\u6a5f\u57f7\u884c\uff09\uff0c\u6709 <code>\"type\": \"http\"<\/code> + <code>\"url\"<\/code> \u7684\u662f HTTP\uff08\u9060\u7aef\u670d\u52d9\uff09<\/li>\n        <li onclick=\"checkAnswer(4, 'D', 'C')\">D. \u914d\u7f6e A \u662f\u9060\u7aef\u670d\u52d9\uff0c\u914d\u7f6e B \u662f\u672c\u6a5f\u57f7\u884c<\/li>\n      <\/ul>\n      <div class=\"feedback\" id=\"fb4\"><\/div>\n    <\/div>\n\n    <div class=\"question\" id=\"q5\">\n      <h3>5. MCP \u5de5\u5177\u5728 hooks \u7684 matcher \u4e2d\u4f7f\u7528\u4ec0\u9ebc\u547d\u540d\u683c\u5f0f\uff1f<\/h3>\n      <ul class=\"options\">\n        <li onclick=\"checkAnswer(5, 'A', 'B')\">A. <code>mcp.\u4f3a\u670d\u5668\u540d\u7a31.\u5de5\u5177\u540d\u7a31<\/code><\/li>\n        <li onclick=\"checkAnswer(5, 'B', 'B')\">B. <code>mcp__\u4f3a\u670d\u5668\u540d\u7a31__\u5de5\u5177\u540d\u7a31<\/code>\uff08\u96d9\u5e95\u7dda\u5206\u9694\uff09<\/li>\n        <li onclick=\"checkAnswer(5, 'C', 'B')\">C. <code>mcp-\u4f3a\u670d\u5668\u540d\u7a31-\u5de5\u5177\u540d\u7a31<\/code>\uff08\u77ed\u6a6b\u7dda\u5206\u9694\uff09<\/li>\n        <li onclick=\"checkAnswer(5, 'D', 'B')\">D. <code>mcp\/\u4f3a\u670d\u5668\u540d\u7a31\/\u5de5\u5177\u540d\u7a31<\/code>\uff08\u659c\u7dda\u5206\u9694\uff09<\/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: \" <code>PreToolUse<\/code> \u5728\u5de5\u5177\u57f7\u884c\u300c\u524d\u300d\u89f8\u767c\uff0c\u6700\u5e38\u898b\u7684\u7528\u9014\u662f\u963b\u6b62\u5371\u96aa\u6307\u4ee4\uff08\u5982 <code>rm -rf<\/code>\u3001<code>git push --force<\/code> \u7b49\uff09\u3002\u81ea\u52d5\u683c\u5f0f\u5316\u5c6c\u65bc <code>PostToolUse<\/code>\uff08\u5de5\u5177\u57f7\u884c\u5f8c\uff09\uff0c\u8f09\u5165\u74b0\u5883\u8b8a\u6578\u5c6c\u65bc <code>SessionStart<\/code>\uff0c\u4fdd\u5b58\u72c0\u614b\u5c6c\u65bc <code>SessionEnd<\/code>\u3002\",\n        2: \" \u95dc\u9375\u5728\u65bc\u5169\u500b\u5730\u65b9\uff1a\u4e8b\u4ef6\u662f <code>PostToolUse<\/code>\uff08\u5de5\u5177\u57f7\u884c\u300c\u5f8c\u300d\uff09\uff0cmatcher \u662f <code>Write|Edit<\/code>\uff08\u5beb\u5165\u6216\u7de8\u8f2f\u6642\uff09\u3002\u6240\u4ee5\u662f\u300c\u5beb\u5165\u6216\u7de8\u8f2f\u6a94\u6848\u4e4b\u5f8c\uff0c\u81ea\u52d5\u7528 Prettier \u683c\u5f0f\u5316\u300d\u3002\u5982\u679c\u662f\u300c\u524d\u300d\u61c9\u8a72\u7528 <code>PreToolUse<\/code>\uff1bmatcher \u53ea\u5339\u914d Write \u548c Edit\uff0c\u4e0d\u6703\u5c0d\u6240\u6709\u5de5\u5177\u89f8\u767c\u3002\",\n        3: \" \u5728 hook \u8173\u672c\u4e2d\uff0c<code>exit 0<\/code> \u4ee3\u8868\u653e\u884c\uff0c<code>exit 2<\/code> \u4ee3\u8868\u963b\u6b62\u8a72\u52d5\u4f5c\u3002\u963b\u6b62\u6642\uff0cstderr \u7684\u8a0a\u606f\u6703\u56de\u994b\u7d66 Claude \u4f5c\u70ba\u932f\u8aa4\u539f\u56e0\u3002\u5176\u4ed6 exit code\uff08\u975e 0 \u975e 2\uff09\u624d\u662f\u300c\u975e\u963b\u585e\u932f\u8aa4\u300d\uff0c\u5373\u8a18\u9304\u932f\u8aa4\u4f46\u7e7c\u7e8c\u57f7\u884c\u3002\",\n        4: \" stdio \u985e\u578b\u7684 MCP \u4f3a\u670d\u5668\u6703\u5728\u672c\u6a5f\u555f\u52d5\u4e00\u500b\u7a0b\u5f0f\uff0c\u7279\u5fb5\u662f\u914d\u7f6e\u4e2d\u6709 <code>command<\/code> \u548c <code>args<\/code> \u6b04\u4f4d\u3002HTTP \u985e\u578b\u5247\u9023\u63a5\u5230\u9060\u7aef\u670d\u52d9\uff0c\u7279\u5fb5\u662f\u6709 <code>\\\"type\\\": \\\"http\\\"<\/code> \u548c <code>url<\/code> \u6b04\u4f4d\u3002\u5169\u8005\u7684\u904b\u4f5c\u65b9\u5f0f\u5b8c\u5168\u4e0d\u540c\uff1astdio \u900f\u904e stdin\/stdout \u901a\u8a0a\uff0cHTTP \u900f\u904e\u7db2\u8def\u901a\u8a0a\u3002\",\n        5: \" MCP \u5de5\u5177\u5728 hooks \u88e1\u7684\u547d\u540d\u683c\u5f0f\u662f <code>mcp__&lt;\u4f3a\u670d\u5668\u540d\u7a31&gt;__&lt;\u5de5\u5177\u540d\u7a31&gt;<\/code>\uff0c\u4f7f\u7528\u96d9\u5e95\u7dda\u5206\u9694\u3002\u4f8b\u5982 <code>mcp__github__search_repositories<\/code>\u3002\u9019\u500b\u683c\u5f0f\u5f88\u91cd\u8981\uff0c\u56e0\u70ba\u4f60\u9700\u8981\u7528\u5b83\u4f86\u5728 hooks \u7684 matcher \u4e2d\u5339\u914d\u7279\u5b9a\u7684 MCP \u5de5\u5177\u3002\"\n      };\n\n      function checkAnswer(qNum, selected, correctAns) {\n        const question = document.getElementById(\"q\" + qNum);\n        if (question.classList.contains(\"answered\")) return;\n\n        question.classList.add(\"answered\");\n        answered++;\n\n        const options = question.querySelectorAll(\".options li\");\n        options.forEach((opt) => {\n          opt.classList.add(\"disabled\");\n          if (opt.textContent.startsWith(correctAns + \".\")) {\n            opt.classList.add(\"show-answer\");\n          }\n        });\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 =\n            \"\u2717 \u932f\u8aa4\u3002\u6b63\u78ba\u7b54\u6848\u662f \" + correctAns + \"\u3002\" + explanations[qNum];\n          options.forEach((opt) => {\n            if (opt.textContent.startsWith(selected + \".\")) {\n              opt.classList.add(\"wrong\");\n            }\n          });\n        }\n\n        if (answered === total) {\n          const scoreDiv = document.getElementById(\"score\");\n          scoreDiv.style.display = \"block\";\n          scoreDiv.innerHTML =\n            \"\u6e2c\u9a57\u5b8c\u6210\uff01\u5f97\u5206\uff1a\" +\n            correct +\n            \" \/ \" +\n            total +\n            (correct === total\n              ? \" \ud83c\udf89 \u5168\u5c0d\uff01\"\n              : correct >= Math.ceil(total * 0.6)\n                ? \" \ud83d\udc4d \u4e0d\u932f\uff01\"\n                : \" \ud83d\udcda \u518d\u8907\u7fd2\u4e00\u4e0b\u5427\");\n        }\n      }\n    \n<\/script>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e00\u53e5\u8a71\u8aaa\u660e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hooks \u8b93 Claude Code \u5728\u7279\u5b9a\u4e8b\u4ef6\u767c\u751f\u6642\u81ea\u52d5\u57f7\u884c\u8173\u672c\uff08\u50cf Git hooks \u90a3\u6a23\uff09\uff0cMCP \u8b93 Claude Code \u9023\u63a5\u5916\u90e8\u670d\u52d9\uff08GitHub\u3001Supabase\u3001Vercel \u7b49\uff09\uff1b\u5169\u8005\u7d50\u5408\uff0c\u5c31\u80fd\u6253\u9020\u300cAI \u505a\u5b8c\u4e8b\uff0c\u81ea\u52d5\u89f8\u767c\u4e0b\u4e00\u6b65\u300d\u7684\u5de5\u4f5c\u6d41\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u524d\u7f6e\u77e5\u8b58<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>\u5df2\u8b80\u904e\u672c\u7cfb\u5217\u7b2c 1-3 \u7bc7\uff08Rules\u3001Commands\u3001Agents\uff09<\/li>\n\n\n<li>\u77e5\u9053 JSON \u7684\u57fa\u672c\u8a9e\u6cd5<\/li>\n\n\n<li>\u807d\u904e CI\/CD \u7684\u6982\u5ff5\uff08\u300c\u7a0b\u5f0f\u78bc\u63a8\u4e0a\u53bb\u5f8c\u81ea\u52d5\u8dd1\u6e2c\u8a66\u3001\u81ea\u52d5\u90e8\u7f72\u300d\u90a3\u7a2e\uff09<\/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\">\u7b2c\u4e00\u90e8\u5206\uff1aHooks \u2014 \u4e8b\u4ef6\u9a45\u52d5\u7684\u81ea\u52d5\u5316<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Hooks \u662f\u4ec0\u9ebc\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f60\u53ef\u80fd\u7528\u904e Git hooks \u2014 \u5728 <code>git commit<\/code> \u4e4b\u524d\u81ea\u52d5\u8dd1 lint\uff0c\u5728 <code>git push<\/code> \u4e4b\u524d\u8dd1\u6e2c\u8a66\u3002Claude Code \u7684 Hooks \u662f\u540c\u6a23\u7684\u6982\u5ff5\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\">\u7576\u67d0\u500b\u4e8b\u4ef6\u767c\u751f\u6642\uff0c\u81ea\u52d5\u57f7\u884c\u4f60\u6307\u5b9a\u7684\u52d5\u4f5c\u3002<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u5dee\u5225\u5728\u65bc\uff0cGit hooks \u53ea\u80fd\u639b\u5728 Git \u64cd\u4f5c\u4e0a\uff0c\u800c Claude Code hooks \u80fd\u639b\u5728 Claude \u7684\u6574\u500b\u5de5\u4f5c\u6d41\u7a0b\u4e0a \u2014 \u5f9e\u555f\u52d5 session\u3001\u57f7\u884c\u5de5\u5177\u3001\u5230\u7d50\u675f\u5c0d\u8a71\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">hooks \u7684\u751f\u547d\u9031\u671f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u628a Claude Code \u7684\u5de5\u4f5c\u6d41\u60f3\u50cf\u6210\u4e00\u689d\u6642\u9593\u7dda\uff0chooks \u5c31\u662f\u4f60\u63d2\u5728\u4e0a\u9762\u7684\u300c\u6aa2\u67e5\u7ad9\u300d\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=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Session<\/span> \u958b\u59cb\n  \u2193\n  \u251c\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;SessionStart]<\/span> \u2190 \u8f09\u5165\u74b0\u5883\u3001\u521d\u59cb\u5316\n  \u2193\n  \u4f7f\u7528\u8005\u9001\u51fa <span class=\"hljs-selector-tag\">prompt<\/span>\n  \u251c\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;UserPromptSubmit]<\/span> \u2190 \u53ef\u4ee5\u6514\u622a\u6216\u52a0\u4e0a\u4e0b\u6587\n  \u2193\n  <span class=\"hljs-selector-tag\">Claude<\/span> \u8981\u7528\u5de5\u5177\u4e86\n  \u251c\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;PreToolUse]<\/span> \u2190 \u5de5\u5177\u57f7\u884c\u300c\u524d\u300d\uff0c\u53ef\u4ee5\u963b\u6b62\n  \u2193\n  \u5de5\u5177\u57f7\u884c\u5b8c\u7562\n  \u251c\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;PostToolUse]<\/span> \u2190 \u5de5\u5177\u57f7\u884c\u300c\u5f8c\u300d\uff0c\u53ef\u4ee5\u8ffd\u52a0\u52d5\u4f5c\n  \u2193\n  <span class=\"hljs-selector-tag\">Claude<\/span> \u6e96\u5099\u505c\u4e0b\u4f86\n  \u251c\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;Stop]<\/span> \u2190 \u53ef\u4ee5\u963b\u6b62\u505c\u4e0b\uff0c\u8b93\u5b83\u7e7c\u7e8c\u505a\n  \u2193\n  <span class=\"hljs-selector-tag\">Session<\/span> \u7d50\u675f\n  \u2514\u2500\u2500 <span class=\"hljs-selector-attr\">&#91;SessionEnd]<\/span> \u2190 \u6e05\u7406\u3001\u4fdd\u5b58\u72c0\u614b\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h3 class=\"wp-block-heading\">\u6240\u6709\u4e8b\u4ef6\u985e\u578b\u4e00\u89bd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f60\u4e0d\u9700\u8981\u5168\u90e8\u8a18\u4f4f\uff0c\u4f46\u770b\u5230\u914d\u7f6e\u6642\u8981\u80fd\u5c0d\u7167\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u4e8b\u4ef6<\/th>\n<th>\u4ec0\u9ebc\u6642\u5019\u89f8\u767c<\/th>\n<th>\u6700\u5e38\u898b\u7684\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>SessionStart<\/code><\/td>\n<td>Session \u555f\u52d5\u6216\u6062\u5fa9<\/td>\n<td>\u8f09\u5165\u74b0\u5883\u8b8a\u6578\u3001\u6062\u5fa9\u4e0a\u4e0b\u6587<\/td>\n<\/tr>\n<tr>\n<td><code>UserPromptSubmit<\/code><\/td>\n<td>\u4f7f\u7528\u8005\u9001\u51fa prompt<\/td>\n<td>\u9a57\u8b49 prompt\u3001\u52a0\u4e0a\u4e0b\u6587<\/td>\n<\/tr>\n<tr>\n<td><code>PreToolUse<\/code><\/td>\n<td>\u5de5\u5177\u57f7\u884c\u524d<\/td>\n<td><strong>\u963b\u6b62\u5371\u96aa\u6307\u4ee4<\/strong>\uff08\u6700\u5e38\u7528\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>PostToolUse<\/code><\/td>\n<td>\u5de5\u5177\u6210\u529f\u57f7\u884c\u5f8c<\/td>\n<td>\u81ea\u52d5\u683c\u5f0f\u5316\u3001\u8dd1\u578b\u5225\u6aa2\u67e5<\/td>\n<\/tr>\n<tr>\n<td><code>PostToolUseFailure<\/code><\/td>\n<td>\u5de5\u5177\u57f7\u884c\u5931\u6557\u5f8c<\/td>\n<td>\u8a18\u9304\u932f\u8aa4\u3001\u767c\u901a\u77e5<\/td>\n<\/tr>\n<tr>\n<td><code>PermissionRequest<\/code><\/td>\n<td>\u6b0a\u9650\u5c0d\u8a71\u6846\u51fa\u73fe\u6642<\/td>\n<td>\u81ea\u52d5\u540c\u610f\/\u62d2\u7d55\u7279\u5b9a\u64cd\u4f5c<\/td>\n<\/tr>\n<tr>\n<td><code>Stop<\/code><\/td>\n<td>Claude \u56de\u7b54\u5b8c\u7562<\/td>\n<td>\u5f37\u5236\u7e7c\u7e8c\uff08\u5982\u6aa2\u67e5\u672a\u5b8c\u6210\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>SubagentStart<\/code><\/td>\n<td>\u5b50\u4ee3\u7406\u555f\u52d5<\/td>\n<td>\u6ce8\u5165\u4e0a\u4e0b\u6587\u7d66\u5b50\u4ee3\u7406<\/td>\n<\/tr>\n<tr>\n<td><code>SubagentStop<\/code><\/td>\n<td>\u5b50\u4ee3\u7406\u7d50\u675f<\/td>\n<td>\u9a57\u8b49\u5b50\u4ee3\u7406\u7684\u8f38\u51fa<\/td>\n<\/tr>\n<tr>\n<td><code>PreCompact<\/code><\/td>\n<td>\u4e0a\u4e0b\u6587\u58d3\u7e2e\u524d<\/td>\n<td>\u4fdd\u5b58\u72c0\u614b\u5feb\u7167<\/td>\n<\/tr>\n<tr>\n<td><code>SessionEnd<\/code><\/td>\n<td>Session \u7d50\u675f<\/td>\n<td>\u4fdd\u5b58\u72c0\u614b\u3001\u6e05\u7406\u8cc7\u6e90<\/td>\n<\/tr>\n<tr>\n<td><code>Notification<\/code><\/td>\n<td>\u9001\u51fa\u901a\u77e5\u6642<\/td>\n<td>\u81ea\u8a02\u901a\u77e5\u65b9\u5f0f<\/td>\n<\/tr>\n<tr>\n<td><code>TeammateIdle<\/code><\/td>\n<td>\u5718\u968a\u6210\u54e1\u9592\u7f6e<\/td>\n<td>\u54c1\u8cea\u6aa2\u67e5<\/td>\n<\/tr>\n<tr>\n<td><code>TaskCompleted<\/code><\/td>\n<td>\u4efb\u52d9\u6a19\u8a18\u5b8c\u6210<\/td>\n<td>\u9a57\u8b49\u5b8c\u6210\u689d\u4ef6<\/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<h3 class=\"wp-block-heading\">\u8b80\u61c2 hooks \u914d\u7f6e<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">hooks \u914d\u7f6e\u653e\u5728 <code>.claude\/settings.json<\/code> \u4e2d\u3002\u7d50\u69cb\u662f\u4e09\u5c64\u5de2\u72c0\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\"><span><code class=\"hljs\">hooks \u914d\u7f6e\n  \u2514\u2500\u2500 \u4e8b\u4ef6\u985e\u578b\uff08\u4ec0\u9ebc\u6642\u5019\u89f8\u767c\uff09\n       \u2514\u2500\u2500 Matcher \u7fa4\u7d44\uff08\u904e\u6ffe\u689d\u4ef6\uff1a\u54ea\u4e9b\u5de5\u5177\u89f8\u767c\uff09\n            \u2514\u2500\u2500 Hook \u8655\u7406\u5668\uff08\u8981\u505a\u4ec0\u9ebc\u4e8b\uff09\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4f86\u770b\u4e00\u500b\u6700\u5c0f\u7bc4\u4f8b\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=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PreToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\".claude\/hooks\/block-rm.sh\"<\/span>\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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\">\u9010\u884c\u7ffb\u8b6f\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=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"hooks\"<\/span>: {                          <span class=\"hljs-comment\">\/\/ hooks \u914d\u7f6e\u7684\u958b\u59cb<\/span>\n  <span class=\"hljs-string\">\"PreToolUse\"<\/span>: &#91;                   <span class=\"hljs-comment\">\/\/ \u4e8b\u4ef6\uff1a\u5728\u5de5\u5177\u57f7\u884c\u300c\u524d\u300d<\/span>\n    {\n      <span class=\"hljs-string\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>,            <span class=\"hljs-comment\">\/\/ \u904e\u6ffe\uff1a\u53ea\u5728 Bash \u5de5\u5177\u6642\u89f8\u767c<\/span>\n      <span class=\"hljs-string\">\"hooks\"<\/span>: &#91;                    <span class=\"hljs-comment\">\/\/ \u8981\u505a\u7684\u4e8b\uff08\u53ef\u4ee5\u6709\u591a\u500b\uff09<\/span>\n        {\n          <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,        <span class=\"hljs-comment\">\/\/ \u985e\u578b\uff1a\u57f7\u884c shell \u6307\u4ee4<\/span>\n          <span class=\"hljs-string\">\"command\"<\/span>: <span class=\"hljs-string\">\".claude\/hooks\/block-rm.sh\"<\/span>  <span class=\"hljs-comment\">\/\/ \u8dd1\u9019\u500b\u8173\u672c<\/span>\n        }\n      ]\n    }\n  ]\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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\">\u767d\u8a71\u6587\uff1a\u300c<strong>\u6bcf\u6b21 Claude \u8981\u57f7\u884c Bash \u6307\u4ee4\u4e4b\u524d\uff0c\u5148\u8dd1 <code>block-rm.sh<\/code> \u9019\u500b\u8173\u672c\u4f86\u6aa2\u67e5\u3002<\/strong>\u300d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Matcher \u600e\u9ebc\u904b\u4f5c\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Matcher \u662f\u6b63\u5247\u8868\u9054\u5f0f\uff08regex\uff09\uff0c\u7528\u4f86\u904e\u6ffe\u300c\u9019\u500b hook \u8981\u5c0d\u54ea\u4e9b\u5de5\u5177\u751f\u6548\u300d\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=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ \u53ea\u5c0d Bash \u5de5\u5177\u751f\u6548<\/span>\n<span class=\"hljs-string\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>\n\n<span class=\"hljs-comment\">\/\/ \u5c0d Edit \u6216 Write \u5de5\u5177\u751f\u6548\uff08\u7528 | \u4ee3\u8868\u300c\u6216\u300d\uff09<\/span>\n<span class=\"hljs-string\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Edit|Write\"<\/span>\n\n<span class=\"hljs-comment\">\/\/ \u5c0d\u6240\u6709 MCP \u5de5\u5177\u751f\u6548<\/span>\n<span class=\"hljs-string\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"mcp__.*\"<\/span>\n\n<span class=\"hljs-comment\">\/\/ \u5c0d memory \u9019\u500b MCP \u4f3a\u670d\u5668\u7684\u6240\u6709\u5de5\u5177\u751f\u6548<\/span>\n<span class=\"hljs-string\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"mcp__memory__.*\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">\u4e0d\u540c\u4e8b\u4ef6\u7684 matcher \u904e\u6ffe\u5c0d\u8c61\u4e0d\u540c\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u4e8b\u4ef6<\/th>\n<th>matcher \u904e\u6ffe\u4ec0\u9ebc<\/th>\n<th>\u7bc4\u4f8b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>PreToolUse<\/code>\u3001<code>PostToolUse<\/code><\/td>\n<td>\u5de5\u5177\u540d\u7a31<\/td>\n<td><code>\"Bash\"<\/code>\u3001<code>\"Edit\\|Write\"<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>SessionStart<\/code><\/td>\n<td>\u555f\u52d5\u65b9\u5f0f<\/td>\n<td><code>\"startup\"<\/code>\u3001<code>\"resume\"<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>SessionEnd<\/code><\/td>\n<td>\u7d50\u675f\u539f\u56e0<\/td>\n<td><code>\"clear\"<\/code>\u3001<code>\"logout\"<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>Notification<\/code><\/td>\n<td>\u901a\u77e5\u985e\u578b<\/td>\n<td><code>\"permission_prompt\"<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u7701\u7565 matcher \u6216\u5beb <code>\"*\"<\/code>\uff0c\u5c31\u662f\u300c\u5168\u90e8\u90fd\u89f8\u767c\u300d\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hook \u8655\u7406\u5668\u7684\u4e09\u7a2e\u985e\u578b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hook \u6709\u4e09\u7a2e\u985e\u578b\uff0c\u770b\u5230 <code>\"type\"<\/code> \u6b04\u4f4d\u5c31\u77e5\u9053\u662f\u54ea\u4e00\u7a2e\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Command\uff08\u6700\u5e38\u898b\uff09\u2014 \u57f7\u884c shell \u6307\u4ee4<\/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-5\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n  <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\".claude\/hooks\/check-style.sh\"<\/span>,\n  <span class=\"hljs-attr\">\"timeout\"<\/span>: <span class=\"hljs-number\">30<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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\">\u767d\u8a71\uff1a\u300c\u8dd1\u4e00\u500b\u8173\u672c\uff0c\u6700\u591a\u7b49 30 \u79d2\u3002\u300d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Prompt \u2014 \u8b93 AI \u5224\u65b7<\/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-6\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"prompt\"<\/span>,\n  <span class=\"hljs-attr\">\"prompt\"<\/span>: <span class=\"hljs-string\">\"\u6aa2\u67e5\u9019\u500b\u64cd\u4f5c\u662f\u5426\u5b89\u5168\uff1a$ARGUMENTS\"<\/span>,\n  <span class=\"hljs-attr\">\"timeout\"<\/span>: <span class=\"hljs-number\">30<\/span>\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\">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\">\u767d\u8a71\uff1a\u300c\u628a\u4e8b\u4ef6\u8cc7\u8a0a\u4e1f\u7d66\u4e00\u500b\u5c0f AI \u6a21\u578b\uff0c\u8b93\u5b83\u5224\u65b7\u8981\u4e0d\u8981\u653e\u884c\u3002\u300d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Agent \u2014 \u8b93 AI \u7528\u5de5\u5177\u9a57\u8b49<\/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-7\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"agent\"<\/span>,\n  <span class=\"hljs-attr\">\"prompt\"<\/span>: <span class=\"hljs-string\">\"\u9a57\u8b49\u6240\u6709\u55ae\u5143\u6e2c\u8a66\u90fd\u901a\u904e\uff1a$ARGUMENTS\"<\/span>,\n  <span class=\"hljs-attr\">\"timeout\"<\/span>: <span class=\"hljs-number\">120<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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\">\u767d\u8a71\uff1a\u300c\u555f\u52d5\u4e00\u500b\u5b50\u4ee3\u7406\uff0c\u5b83\u53ef\u4ee5\u8b80\u6a94\u3001\u641c\u5c0b\uff0c\u505a\u5b8c\u9a57\u8b49\u518d\u56de\u5831\u3002\u300d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hook \u8173\u672c\u600e\u9ebc\u548c Claude Code \u6e9d\u901a<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hook \u8173\u672c\u900f\u904e <strong>stdin<\/strong>\uff08\u6a19\u6e96\u8f38\u5165\uff09\u63a5\u6536 JSON \u8cc7\u6599\uff0c\u900f\u904e <strong>exit code<\/strong> \u548c <strong>stdout<\/strong> \u56de\u50b3\u7d50\u679c\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 Code \u2500\u2500<span class=\"hljs-built_in\">JSON<\/span>\u2500\u2500\u2192 hook \u8173\u672c \u2500\u2500exit code + stdout\u2500\u2500\u2192 Claude Code\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\">\u4e09\u7a2e exit code \u7684\u610f\u601d\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Exit Code<\/th>\n<th>\u610f\u601d<\/th>\n<th>\u6548\u679c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>0<\/code><\/td>\n<td>\u6210\u529f\uff0c\u653e\u884c<\/td>\n<td>\u7e7c\u7e8c\u57f7\u884c<\/td>\n<\/tr>\n<tr>\n<td><code>2<\/code><\/td>\n<td>\u963b\u6b62<\/td>\n<td>\u963b\u6b62\u8a72\u52d5\u4f5c\uff08stderr \u56de\u994b\u7d66 Claude\uff09<\/td>\n<\/tr>\n<tr>\n<td>\u5176\u4ed6<\/td>\n<td>\u975e\u963b\u585e\u932f\u8aa4<\/td>\n<td>\u8a18\u9304\u932f\u8aa4\u4f46\u7e7c\u7e8c<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f86\u770b\u4e00\u500b\u5b8c\u6574\u7684 hook \u8173\u672c\u7bc4\u4f8b\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=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\n<span class=\"hljs-comment\"># .claude\/hooks\/block-rm.sh<\/span>\n<span class=\"hljs-comment\"># \u529f\u80fd\uff1a\u963b\u6b62 Claude \u57f7\u884c rm -rf \u6307\u4ee4<\/span>\n\n<span class=\"hljs-comment\"># \u5f9e stdin \u8b80\u53d6 JSON\uff0c\u53d6\u51fa command \u6b04\u4f4d<\/span>\nCOMMAND=$(jq -r <span class=\"hljs-string\">'.tool_input.command'<\/span>)\n\n<span class=\"hljs-comment\"># \u6aa2\u67e5\u6307\u4ee4\u662f\u5426\u5305\u542b rm -rf<\/span>\n<span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$COMMAND\"<\/span> | grep -q <span class=\"hljs-string\">'rm -rf'<\/span>; then\n  <span class=\"hljs-comment\"># \u8f38\u51fa JSON \u544a\u8a34 Claude Code\uff1a\u62d2\u7d55\u9019\u500b\u64cd\u4f5c<\/span>\n  jq -n <span class=\"hljs-string\">'{\n    hookSpecificOutput: {\n      hookEventName: \"PreToolUse\",\n      permissionDecision: \"deny\",\n      permissionDecisionReason: \"\u5371\u96aa\u6307\u4ee4 rm -rf \u5df2\u88ab hook \u963b\u6b62\"\n    }\n  }'<\/span>\n<span class=\"hljs-keyword\">else<\/span>\n  <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>  <span class=\"hljs-comment\"># \u653e\u884c<\/span>\nfi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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\u6bb5\u7ffb\u8b6f\u9019\u500b\u6d41\u7a0b\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=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Claude \u60f3\u57f7\u884c <span class=\"hljs-string\">\"rm -rf \/tmp\/build\"<\/span>\n<span class=\"hljs-number\">2.<\/span> PreToolUse \u4e8b\u4ef6\u89f8\u767c\uff0cmatcher <span class=\"hljs-string\">\"Bash\"<\/span> \u5339\u914d\u6210\u529f\n<span class=\"hljs-number\">3.<\/span> block-rm.sh \u6536\u5230 <span class=\"hljs-built_in\">JSON<\/span>\uff1a{<span class=\"hljs-string\">\"tool_name\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>, <span class=\"hljs-string\">\"tool_input\"<\/span>: {<span class=\"hljs-string\">\"command\"<\/span>: <span class=\"hljs-string\">\"rm -rf \/tmp\/build\"<\/span>}}\n<span class=\"hljs-number\">4.<\/span> \u8173\u672c\u767c\u73fe <span class=\"hljs-string\">\"rm -rf\"<\/span>\uff0c\u56de\u50b3 deny\n<span class=\"hljs-number\">5.<\/span> Claude Code \u963b\u6b62\u57f7\u884c\uff0c\u544a\u8a34 Claude \u539f\u56e0\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u8b80\u61c2\u5be6\u6230\u914d\u7f6e<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u9762\u662f\u4e00\u500b\u771f\u5be6\u5c08\u6848\u7684 hooks \u914d\u7f6e\u7247\u6bb5\u3002\u6211\u6703\u9010\u584a\u7ffb\u8b6f\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=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PreToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node -e \\\"const i=JSON.parse(require('fs').readFileSync('\/dev\/stdin','utf8')); const c=i.tool_input?.command||''; if(\/^(npm run dev|yarn dev|python.*app\\\\.py)\/.test(c) &amp;&amp; !process.env.TMUX){process.stderr.write('\u8acb\u5728 tmux \u4e2d\u57f7\u884c dev server');process.exit(2)}\\\"\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u6aa2\u67e5 dev server \u74b0\u5883...\"<\/span>\n          }\n        ]\n      },\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Write\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node -e \\\"const i=JSON.parse(require('fs').readFileSync('\/dev\/stdin','utf8')); const p=i.tool_input?.file_path||''; if(\/\\\\.(md|mdx)$\/.test(p) &amp;&amp; !\/README|CHANGELOG\/.test(p)){process.stderr.write('\u907f\u514d\u5efa\u7acb\u4e0d\u5fc5\u8981\u7684\u6587\u4ef6\u6a94\u6848');process.exit(2)}\\\"\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u6aa2\u67e5\u6a94\u6848\u8def\u5f91...\"<\/span>\n          }\n        ]\n      }\n    ],\n    <span class=\"hljs-attr\">\"PostToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Write|Edit\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node -e \\\"const i=JSON.parse(require('fs').readFileSync('\/dev\/stdin','utf8')); const p=i.tool_input?.file_path||''; if(\/\\\\.(js|ts|jsx|tsx)$\/.test(p)){require('child_process').execSync('npx prettier --write '+p)}\\\"\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u81ea\u52d5\u683c\u5f0f\u5316...\"<\/span>\n          }\n        ]\n      }\n    ],\n    <span class=\"hljs-attr\">\"Stop\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node scripts\/hooks\/check-console-log.js\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u6aa2\u67e5 console.log...\"<\/span>\n          }\n        ]\n      }\n    ],\n    <span class=\"hljs-attr\">\"SessionStart\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"startup\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node scripts\/hooks\/session-start.js\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u8f09\u5165\u4e0a\u4e0b\u6587...\"<\/span>\n          }\n        ]\n      }\n    ],\n    <span class=\"hljs-attr\">\"SessionEnd\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"node scripts\/hooks\/session-end.js\"<\/span>,\n            <span class=\"hljs-attr\">\"statusMessage\"<\/span>: <span class=\"hljs-string\">\"\u4fdd\u5b58\u72c0\u614b...\"<\/span>\n          }\n        ]\n      }\n    ]\n  }\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\">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\">\u9010\u584a\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u5340\u584a<\/th>\n<th>\u767d\u8a71\u610f\u601d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>PreToolUse<\/code> + <code>Bash<\/code><\/td>\n<td>\u57f7\u884c Bash \u524d\uff1a\u5982\u679c\u662f dev server \u6307\u4ee4\u4f46\u4e0d\u5728 tmux \u88e1\uff0c\u5c31\u963b\u6b62<\/td>\n<\/tr>\n<tr>\n<td><code>PreToolUse<\/code> + <code>Write<\/code><\/td>\n<td>\u5beb\u6a94\u524d\uff1a\u5982\u679c\u662f .md \u6a94\u4f46\u4e0d\u662f README\/CHANGELOG\uff0c\u5c31\u963b\u6b62<\/td>\n<\/tr>\n<tr>\n<td><code>PostToolUse<\/code> + <code>Write\\|Edit<\/code><\/td>\n<td>\u5beb\u6a94\u6216\u7de8\u8f2f\u5f8c\uff1a\u5982\u679c\u662f JS\/TS \u6a94\uff0c\u81ea\u52d5\u8dd1 Prettier \u683c\u5f0f\u5316<\/td>\n<\/tr>\n<tr>\n<td><code>Stop<\/code><\/td>\n<td>Claude \u505c\u4e0b\u524d\uff1a\u6aa2\u67e5\u4fee\u6539\u7684\u6a94\u6848\u88e1\u6709\u6c92\u6709\u5fd8\u8a18\u79fb\u9664\u7684 console.log<\/td>\n<\/tr>\n<tr>\n<td><code>SessionStart<\/code> + <code>startup<\/code><\/td>\n<td>\u65b0 session \u555f\u52d5\u6642\uff1a\u8f09\u5165\u4e4b\u524d\u4fdd\u5b58\u7684\u4e0a\u4e0b\u6587<\/td>\n<\/tr>\n<tr>\n<td><code>SessionEnd<\/code><\/td>\n<td>Session \u7d50\u675f\u6642\uff1a\u4fdd\u5b58\u7576\u524d\u72c0\u614b<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">hooks \u914d\u7f6e\u653e\u54ea\u88e1\uff1f<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u4f4d\u7f6e<\/th>\n<th>\u7bc4\u570d<\/th>\n<th>\u80fd\u5206\u4eab\u55ce<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>~\/.claude\/settings.json<\/code><\/td>\n<td>\u6240\u6709\u5c08\u6848<\/td>\n<td>\u4e0d\u80fd\uff0c\u53ea\u5728\u4f60\u7684\u96fb\u8166<\/td>\n<\/tr>\n<tr>\n<td><code>.claude\/settings.json<\/code><\/td>\n<td>\u55ae\u4e00\u5c08\u6848<\/td>\n<td>\u80fd\uff0c\u53ef commit \u9032 repo<\/td>\n<\/tr>\n<tr>\n<td><code>.claude\/settings.local.json<\/code><\/td>\n<td>\u55ae\u4e00\u5c08\u6848<\/td>\n<td>\u4e0d\u80fd\uff0c\u88ab gitignore<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u4f73\u5be6\u8e10\uff1a<strong>\u5718\u968a\u5171\u7528\u7684 hook \u653e <code>.claude\/settings.json<\/code>\uff0c\u500b\u4eba\u7684\u653e <code>.claude\/settings.local.json<\/code>\u3002<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e8c\u90e8\u5206\uff1aMCP \u2014 \u9023\u63a5\u5916\u90e8\u670d\u52d9\u7684\u5354\u8b70<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">MCP \u662f\u4ec0\u9ebc\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MCP \u5168\u7a31 <strong>Model Context Protocol<\/strong>\uff08\u6a21\u578b\u4e0a\u4e0b\u6587\u5354\u8b70\uff09\uff0c\u662f\u4e00\u500b\u958b\u653e\u6a19\u6e96\uff0c\u8b93 AI \u5de5\u5177\uff08\u50cf Claude Code\uff09\u80fd\u9023\u63a5\u5230\u5916\u90e8\u670d\u52d9\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6253\u500b\u6bd4\u65b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>\u6c92\u6709 MCP<\/strong>\uff1aClaude Code \u53ea\u80fd\u8b80\u5beb\u4f60\u672c\u6a5f\u7684\u6a94\u6848\u3001\u8dd1 shell \u6307\u4ee4<\/li>\n\n\n<li><strong>\u6709\u4e86 MCP<\/strong>\uff1aClaude Code \u9084\u80fd\u76f4\u63a5\u64cd\u4f5c GitHub PR\u3001\u67e5 Supabase \u8cc7\u6599\u5eab\u3001\u7ba1\u7406 Vercel \u90e8\u7f72<\/li>\n\n<\/ul>\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\">\u4f60\u7684\u554f\u984c: \u300c\u5e6b\u6211\u770b <span class=\"hljs-selector-tag\">PR<\/span> <span class=\"hljs-selector-id\">#456<\/span> \u4e26\u63d0\u51fa\u6539\u9032\u5efa\u8b70\u300d\n    \u2193\n<span class=\"hljs-selector-tag\">Claude<\/span> <span class=\"hljs-selector-tag\">Code<\/span> \u2500\u2500<span class=\"hljs-selector-tag\">MCP<\/span>\u2500\u2500\u2192 <span class=\"hljs-selector-tag\">GitHub<\/span> \u4f3a\u670d\u5668 \u2192 \u53d6\u5f97 <span class=\"hljs-selector-tag\">PR<\/span> \u5167\u5bb9\n    \u2193\n<span class=\"hljs-selector-tag\">Claude<\/span> \u5206\u6790 + \u56de\u8986\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<h3 class=\"wp-block-heading\">MCP \u914d\u7f6e\u9577\u4ec0\u9ebc\u6a23\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MCP \u914d\u7f6e\u53ef\u4ee5\u653e\u5728 <code>.mcp.json<\/code>\uff08\u5c08\u6848\u6839\u76ee\u9304\uff0c\u53ef commit\uff09\u6216 <code>~\/.claude.json<\/code>\uff08\u500b\u4eba\u5168\u57df\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5c0f\u7bc4\u4f8b\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-13\" 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\">\"github\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@modelcontextprotocol\/server-github\"<\/span>],\n      <span class=\"hljs-attr\">\"env\"<\/span>: {\n        <span class=\"hljs-attr\">\"GITHUB_PERSONAL_ACCESS_TOKEN\"<\/span>: <span class=\"hljs-string\">\"ghp_xxxxxxxxxxxx\"<\/span>\n      }\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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\">\u9010\u884c\u7ffb\u8b6f\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-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"mcpServers\"<\/span>: {                     <span class=\"hljs-comment\">\/\/ MCP \u4f3a\u670d\u5668\u5217\u8868<\/span>\n  <span class=\"hljs-string\">\"github\"<\/span>: {                       <span class=\"hljs-comment\">\/\/ \u4f3a\u670d\u5668\u540d\u7a31\uff08\u81ea\u5df1\u53d6\u7684\uff09<\/span>\n    <span class=\"hljs-string\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,               <span class=\"hljs-comment\">\/\/ \u7528 npx \u555f\u52d5<\/span>\n    <span class=\"hljs-string\">\"args\"<\/span>: &#91;                       <span class=\"hljs-comment\">\/\/ \u555f\u52d5\u53c3\u6578<\/span>\n      <span class=\"hljs-string\">\"-y\"<\/span>,                         <span class=\"hljs-comment\">\/\/ \u81ea\u52d5\u78ba\u8a8d\u5b89\u88dd<\/span>\n      <span class=\"hljs-string\">\"@modelcontextprotocol\/server-github\"<\/span>  <span class=\"hljs-comment\">\/\/ GitHub MCP \u5957\u4ef6<\/span>\n    ],\n    <span class=\"hljs-string\">\"env\"<\/span>: {                        <span class=\"hljs-comment\">\/\/ \u74b0\u5883\u8b8a\u6578<\/span>\n      <span class=\"hljs-string\">\"GITHUB_PERSONAL_ACCESS_TOKEN\"<\/span>: <span class=\"hljs-string\">\"ghp_xxxxxxxxxxxx\"<\/span>  <span class=\"hljs-comment\">\/\/ GitHub Token<\/span>\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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\">\u767d\u8a71\u6587\uff1a\u300c<strong>\u7528 npx \u555f\u52d5 GitHub MCP \u4f3a\u670d\u5668\uff0c\u7528\u9019\u500b token \u4f86\u9a57\u8b49\u8eab\u4efd\u3002<\/strong>\u300d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5169\u7a2e MCP \u4f3a\u670d\u5668\u985e\u578b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u770b\u5230\u914d\u7f6e\u6642\uff0c\u6ce8\u610f\u5340\u5206\u9019\u5169\u7a2e\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. stdio \u985e\u578b \u2014 \u672c\u6a5f\u57f7\u884c\u7684\u7a0b\u5f0f<\/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-15\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"github\"<\/span>: {\n    <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n    <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@modelcontextprotocol\/server-github\"<\/span>],\n    <span class=\"hljs-attr\">\"env\"<\/span>: {\n      <span class=\"hljs-attr\">\"GITHUB_PERSONAL_ACCESS_TOKEN\"<\/span>: <span class=\"hljs-string\">\"ghp_xxx\"<\/span>\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><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\">\u7279\u5fb5\uff1a\u6709 <code>command<\/code> \u548c <code>args<\/code>\u3002Claude Code \u6703\u5728\u4f60\u96fb\u8166\u4e0a\u555f\u52d5\u9019\u500b\u7a0b\u5f0f\uff0c\u900f\u904e stdin\/stdout \u901a\u8a0a\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. HTTP \u985e\u578b \u2014 \u9060\u7aef\u670d\u52d9<\/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-16\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"vercel\"<\/span>: {\n    <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"http\"<\/span>,\n    <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/mcp.vercel.com\"<\/span>\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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\">\u7279\u5fb5\uff1a\u6709 <code>\"type\": \"http\"<\/code> \u548c <code>url<\/code>\u3002Claude Code \u900f\u904e\u7db2\u8def\u9023\u5230\u9060\u7aef MCP \u4f3a\u670d\u5668\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u8b80\u61c2\u5b8c\u6574\u7684 MCP \u914d\u7f6e<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u662f\u4e00\u500b\u771f\u5be6\u5c08\u6848\u7684 <code>mcp-servers.json<\/code>\uff0c\u5305\u542b\u591a\u500b\u5e38\u7528\u670d\u52d9\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-17\" 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\">\"github\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@modelcontextprotocol\/server-github\"<\/span>],\n      <span class=\"hljs-attr\">\"env\"<\/span>: {\n        <span class=\"hljs-attr\">\"GITHUB_PERSONAL_ACCESS_TOKEN\"<\/span>: <span class=\"hljs-string\">\"YOUR_GITHUB_PAT_HERE\"<\/span>\n      },\n      <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"GitHub operations - PRs, issues, repos\"<\/span>\n    },\n    <span class=\"hljs-attr\">\"supabase\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@supabase\/mcp-server-supabase@latest\"<\/span>, <span class=\"hljs-string\">\"--project-ref=YOUR_PROJECT_REF\"<\/span>],\n      <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Supabase database operations\"<\/span>\n    },\n    <span class=\"hljs-attr\">\"vercel\"<\/span>: {\n      <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"http\"<\/span>,\n      <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/mcp.vercel.com\"<\/span>,\n      <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Vercel deployments and projects\"<\/span>\n    },\n    <span class=\"hljs-attr\">\"railway\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@railway\/mcp-server\"<\/span>],\n      <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Railway deployments\"<\/span>\n    },\n    <span class=\"hljs-attr\">\"memory\"<\/span>: {\n      <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx\"<\/span>,\n      <span class=\"hljs-attr\">\"args\"<\/span>: &#91;<span class=\"hljs-string\">\"-y\"<\/span>, <span class=\"hljs-string\">\"@modelcontextprotocol\/server-memory\"<\/span>],\n      <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Persistent memory across sessions\"<\/span>\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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\">\u9010\u584a\u7ffb\u8b6f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u4f3a\u670d\u5668<\/th>\n<th>\u985e\u578b<\/th>\n<th>\u7528\u9014<\/th>\n<th>\u9700\u8981\u4ec0\u9ebc<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>github<\/code><\/td>\n<td>stdio<\/td>\n<td>\u64cd\u4f5c PR\u3001Issue\u3001Repo<\/td>\n<td>GitHub Personal Access Token<\/td>\n<\/tr>\n<tr>\n<td><code>supabase<\/code><\/td>\n<td>stdio<\/td>\n<td>\u64cd\u4f5c\u8cc7\u6599\u5eab<\/td>\n<td>Project Reference<\/td>\n<\/tr>\n<tr>\n<td><code>vercel<\/code><\/td>\n<td>http<\/td>\n<td>\u7ba1\u7406\u90e8\u7f72<\/td>\n<td>OAuth \u767b\u5165\uff08\u900f\u904e <code>\/mcp<\/code> \u6307\u4ee4\uff09<\/td>\n<\/tr>\n<tr>\n<td><code>railway<\/code><\/td>\n<td>stdio<\/td>\n<td>\u7ba1\u7406\u90e8\u7f72<\/td>\n<td>Railway Token<\/td>\n<\/tr>\n<tr>\n<td><code>memory<\/code><\/td>\n<td>stdio<\/td>\n<td>\u8de8 session \u8a18\u61b6<\/td>\n<td>\u4e0d\u9700\u8981\u984d\u5916\u8a8d\u8b49<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">MCP \u7684\u4e09\u500b\u5b89\u88dd scope<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528 <code>claude mcp add<\/code> \u6307\u4ee4\u65b0\u589e MCP \u4f3a\u670d\u5668\u6642\uff0c<code>--scope<\/code> \u6c7a\u5b9a\u914d\u7f6e\u653e\u54ea\u88e1\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Scope<\/th>\n<th>\u5b58\u653e\u4f4d\u7f6e<\/th>\n<th>\u8ab0\u80fd\u7528<\/th>\n<th>\u7528\u9014<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>local<\/code>\uff08\u9810\u8a2d\uff09<\/td>\n<td><code>~\/.claude.json<\/code>\uff08\u5c08\u6848\u8def\u5f91\u4e0b\uff09<\/td>\n<td>\u53ea\u6709\u4f60\uff0c\u53ea\u5728\u9019\u500b\u5c08\u6848<\/td>\n<td>\u500b\u4eba\u958b\u767c\u7528<\/td>\n<\/tr>\n<tr>\n<td><code>project<\/code><\/td>\n<td><code>.mcp.json<\/code>\uff08\u5c08\u6848\u6839\u76ee\u9304\uff09<\/td>\n<td>\u6240\u6709\u4eba\uff08\u53ef commit\uff09<\/td>\n<td>\u5718\u968a\u5171\u7528<\/td>\n<\/tr>\n<tr>\n<td><code>user<\/code><\/td>\n<td><code>~\/.claude.json<\/code>\uff08\u5168\u57df\uff09<\/td>\n<td>\u53ea\u6709\u4f60\uff0c\u6240\u6709\u5c08\u6848<\/td>\n<td>\u500b\u4eba\u5e38\u7528\u5de5\u5177<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e38\u7528\u6307\u4ee4\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-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \u65b0\u589e\u4e00\u500b HTTP \u985e\u578b\u7684 MCP \u4f3a\u670d\u5668<\/span>\nclaude mcp add --transport http github https:<span class=\"hljs-comment\">\/\/api.githubcopilot.com\/mcp\/<\/span>\n\n<span class=\"hljs-comment\"># \u65b0\u589e\u4e00\u500b stdio \u985e\u578b\uff0c\u5e36\u74b0\u5883\u8b8a\u6578<\/span>\nclaude mcp add --transport stdio --env GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxx github \\\n  -- npx -y @modelcontextprotocol\/server-github\n\n<span class=\"hljs-comment\"># \u5217\u51fa\u6240\u6709\u5df2\u914d\u7f6e\u7684\u4f3a\u670d\u5668<\/span>\nclaude mcp <span class=\"hljs-keyword\">list<\/span>\n\n<span class=\"hljs-comment\"># \u5728 Claude Code \u5167\u67e5\u770b\u72c0\u614b<\/span>\n\/mcp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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\">\u74b0\u5883\u8b8a\u6578\u5c55\u958b<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>.mcp.json<\/code> \u652f\u63f4\u74b0\u5883\u8b8a\u6578\uff0c\u8b93\u5718\u968a\u5171\u4eab\u914d\u7f6e\u4f46\u5404\u81ea\u7528\u81ea\u5df1\u7684\u5bc6\u9470\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-19\" 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\">\"api-server\"<\/span>: {\n      <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"http\"<\/span>,\n      <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"${API_BASE_URL:-https:\/\/api.example.com}\/mcp\"<\/span>,\n      <span class=\"hljs-attr\">\"headers\"<\/span>: {\n        <span class=\"hljs-attr\">\"Authorization\"<\/span>: <span class=\"hljs-string\">\"Bearer ${API_KEY}\"<\/span>\n      }\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><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<\/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-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">${<span class=\"hljs-attr\">API_BASE_URL<\/span>:-https:<span class=\"hljs-comment\">\/\/api.example.com}<\/span>\n\u2191 \u5982\u679c API_BASE_URL \u74b0\u5883\u8b8a\u6578\u6709\u8a2d\u5b9a\u5c31\u7528\u5b83\uff0c\u5426\u5247\u7528\u9810\u8a2d\u503c\n\n${API_KEY}\n\u2191 \u5fc5\u9808\u8a2d\u5b9a\u9019\u500b\u74b0\u5883\u8b8a\u6578\uff0c\u5426\u5247\u6703\u5831\u932f\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><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\">\u9019\u6a23 <code>.mcp.json<\/code> \u53ef\u4ee5\u5b89\u5168\u5730 commit \u9032 repo\uff0c\u6bcf\u500b\u4eba\u5728\u81ea\u5df1\u7684 <code>.env<\/code> \u6216 shell \u88e1\u8a2d\u5b9a\u81ea\u5df1\u7684 key\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u4e09\u90e8\u5206\uff1aHooks + MCP \u7684\u5354\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">MCP \u5de5\u5177\u5728 hooks \u88e1\u7684\u540d\u7a31\u898f\u5247<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576 MCP \u4f3a\u670d\u5668\u9023\u63a5\u4e0a\u4f86\uff0c\u5b83\u63d0\u4f9b\u7684\u5de5\u5177\u5728 hooks \u88e1\u7684\u547d\u540d\u683c\u5f0f\u662f\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-21\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">mcp__<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u4f3a\u670d\u5668\u540d\u7a31<\/span>&gt;<\/span>__<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u5de5\u5177\u540d\u7a31<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u4f8b\u5982\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\"><span><code class=\"hljs\">mcp__github__search_repositories    \u2190 GitHub \u7684\u641c\u5c0b repo \u5de5\u5177\nmcp__memory__create_entities        \u2190 Memory \u7684\u5efa\u7acb\u5be6\u9ad4\u5de5\u5177\nmcp__filesystem__read_file          \u2190 Filesystem \u7684\u8b80\u6a94\u5de5\u5177\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\u4f60\u53ef\u4ee5\u7528 hooks \u4f86\u76e3\u63a7\u6216\u63a7\u5236 MCP \u5de5\u5177\u7684\u4f7f\u7528\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-22\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PreToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"mcp__github__.*\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"echo 'GitHub \u64cd\u4f5c\u5df2\u8a18\u9304' &gt;&gt; ~\/mcp-operations.log\"<\/span>\n          }\n        ]\n      },\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"mcp__.*__write.*\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"\/home\/user\/scripts\/validate-mcp-write.py\"<\/span>\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u898f\u5247<\/th>\n<th>\u610f\u601d<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>mcp__github__.*<\/code><\/td>\n<td>\u6240\u6709 GitHub MCP \u5de5\u5177\u64cd\u4f5c\u524d\uff0c\u8a18\u4e00\u7b46 log<\/td>\n<\/tr>\n<tr>\n<td><code>mcp__.*__write.*<\/code><\/td>\n<td>\u4efb\u4f55 MCP \u4f3a\u670d\u5668\u7684\u5beb\u5165\u64cd\u4f5c\u524d\uff0c\u8dd1\u9a57\u8b49\u8173\u672c<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u5be6\u6230\u7bc4\u4f8b\uff1acommit \u524d\u81ea\u52d5\u5b89\u5168\u6aa2\u67e5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u500b\u7bc4\u4f8b\u7d50\u5408 Hooks \u4f86\u963b\u6b62\u5371\u96aa\u7684 git \u64cd\u4f5c\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u914d\u7f6e\uff08<code>.claude\/settings.json<\/code>\uff09\uff1a<\/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-23\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PreToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"\\\"$CLAUDE_PROJECT_DIR\\\"\/.claude\/hooks\/git-safety.sh\"<\/span>\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><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\"><strong>\u8173\u672c\uff08<code>.claude\/hooks\/git-safety.sh<\/code>\uff09\uff1a<\/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-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/bin\/bash<\/span>\n<span class=\"hljs-comment\"># \u8b80\u53d6 Claude \u8981\u57f7\u884c\u7684\u6307\u4ee4<\/span>\nINPUT=$(cat)\nCOMMAND=$(<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$INPUT\"<\/span> | jq -r <span class=\"hljs-string\">'.tool_input.command \/\/ empty'<\/span>)\n\n<span class=\"hljs-comment\"># \u963b\u6b62\u5f37\u5236\u63a8\u9001\u5230 main<\/span>\n<span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$COMMAND\"<\/span> | grep -qE <span class=\"hljs-string\">'git push.*--force.*(main|master)'<\/span>; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"\u7981\u6b62\u5c0d main\/master \u57f7\u884c force push\"<\/span> &gt;&amp;<span class=\"hljs-number\">2<\/span>\n  <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">2<\/span>\nfi\n\n<span class=\"hljs-comment\"># \u963b\u6b62 hard reset<\/span>\n<span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$COMMAND\"<\/span> | grep -q <span class=\"hljs-string\">'git reset --hard'<\/span>; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"\u7981\u6b62 git reset --hard\uff0c\u8acb\u7528\u66f4\u5b89\u5168\u7684\u65b9\u5f0f\"<\/span> &gt;&amp;<span class=\"hljs-number\">2<\/span>\n  <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">2<\/span>\nfi\n\n<span class=\"hljs-comment\"># \u63d0\u4ea4\u524d\u63d0\u9192\u6aa2\u67e5<\/span>\n<span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$COMMAND\"<\/span> | grep -q <span class=\"hljs-string\">'git push'<\/span>; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"ask\",\"permissionDecisionReason\":\"\u5373\u5c07 push\uff0c\u8acb\u78ba\u8a8d\u8b8a\u66f4\u5167\u5bb9\"}}'<\/span>\n  <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\nfi\n\n<span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><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\">\u6d41\u7a0b\u89e3\u8b80\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-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Claude \u60f3\u57f7\u884c git push --force origin main\n  \u2193\nPreToolUse \u89f8\u767c \u2192 matcher <span class=\"hljs-string\">\"Bash\"<\/span> \u5339\u914d\n  \u2193\ngit-safety.sh \u6536\u5230\u6307\u4ee4\n  \u2193\n\u767c\u73fe <span class=\"hljs-string\">\"force push\"<\/span> + <span class=\"hljs-string\">\"main\"<\/span> \u2192 <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">2<\/span>\uff08\u963b\u6b62\uff09\n  \u2193\nClaude \u6536\u5230\u932f\u8aa4\u8a0a\u606f\uff0c\u4e0d\u6703\u57f7\u884c\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><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\">\u6ce8\u610f\u4e09\u7a2e\u56de\u61c9\u65b9\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-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># 1. \u76f4\u63a5\u963b\u6b62<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"\u539f\u56e0\"<\/span> &gt;&amp;<span class=\"hljs-number\">2<\/span>\n<span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">2<\/span>\n\n<span class=\"hljs-comment\"># 2. \u653e\u884c<\/span>\n<span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\n\n<span class=\"hljs-comment\"># 3. \u8b93\u4f7f\u7528\u8005\u78ba\u8a8d\uff08\u5f48\u51fa\u6b0a\u9650\u5c0d\u8a71\u6846\uff09<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"ask\",\"permissionDecisionReason\":\"\u7406\u7531\"}}'<\/span>\n<span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><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\">\u5be6\u6230\u7bc4\u4f8b\uff1a\u5beb\u6a94\u5f8c\u81ea\u52d5\u8dd1\u6e2c\u8a66\uff08\u975e\u540c\u6b65\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6709\u4e9b hook \u4e0d\u9700\u8981\u963b\u585e\u6d41\u7a0b\uff0c\u53ef\u4ee5\u5728\u80cc\u666f\u8dd1\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-27\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PostToolUse\"<\/span>: &#91;\n      {\n        <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Write|Edit\"<\/span>,\n        <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;\n          {\n            <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>,\n            <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"\\\"$CLAUDE_PROJECT_DIR\\\"\/.claude\/hooks\/run-tests-async.sh\"<\/span>,\n            <span class=\"hljs-attr\">\"async\"<\/span>: <span class=\"hljs-literal\">true<\/span>,\n            <span class=\"hljs-attr\">\"timeout\"<\/span>: <span class=\"hljs-number\">300<\/span>\n          }\n        ]\n      }\n    ]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><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\">\u95dc\u9375\u662f <code>\"async\": true<\/code>\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-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Claude \u5beb\u5b8c\u6a94\u6848 \u2192 PostToolUse \u89f8\u767c\n                    \u2193\n              run-tests-<span class=\"hljs-keyword\">async<\/span>.sh \u5728\u80cc\u666f\u8dd1\n                    \u2193\n              Claude \u7e7c\u7e8c\u5de5\u4f5c\uff08\u4e0d\u7b49\u6e2c\u8a66\u8dd1\u5b8c\uff09\n                    \u2193\n              \u6e2c\u8a66\u8dd1\u5b8c \u2192 \u7d50\u679c\u5728\u4e0b\u4e00\u8f2a\u5c0d\u8a71\u4e2d\u56de\u5831\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c\u56db\u90e8\u5206\uff1a\u5b89\u5168\u8003\u91cf<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Hook \u8173\u672c\u7684\u5b89\u5168\u6700\u4f73\u5be6\u8e10<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">hooks \u4ee5\u4f60\u7684\u4f7f\u7528\u8005\u6b0a\u9650\u57f7\u884c\uff0c\u7b49\u540c\u65bc\u4f60\u5728\u7d42\u7aef\u6a5f\u8dd1\u4efb\u4f55\u6307\u4ee4\u3002\u6ce8\u610f\u4ee5\u4e0b\u5e7e\u9ede\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-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\u5fc5\u505a\uff1a\n- \u6c38\u9060\u7528\u5f15\u865f\u5305\u8b8a\u6578\uff1a<span class=\"hljs-string\">\"$VAR\"<\/span> \u800c\u975e $VAR\n- \u7528\u7d55\u5c0d\u8def\u5f91\u6216 <span class=\"hljs-string\">\"$CLAUDE_PROJECT_DIR\"<\/span> \u6307\u5b9a\u8173\u672c\u4f4d\u7f6e\n- \u6aa2\u67e5 .. \u9632\u6b62\u8def\u5f91\u7a7f\u8d8a\uff08path traversal\uff09\n- \u907f\u514d\u8655\u7406 .env\u3001.git\/\u3001\u91d1\u9470\u7b49\u654f\u611f\u6a94\u6848\n\n\u77e5\u9053\u5c31\u597d\uff1a\n- hooks \u5728 session \u555f\u52d5\u6642\u5feb\u7167\uff0c\u4e2d\u9014\u4fee\u6539\u4e0d\u6703\u7acb\u523b\u751f\u6548\n- \u4e2d\u9014\u88ab\u4fee\u6539\u7684 hooks \u6703\u89f8\u767c\u8b66\u544a\uff0c\u9700\u8981\u5728 \/hooks \u9078\u55ae\u4e2d\u5be9\u6838\n- \u4f01\u696d\u7248\u53ef\u4ee5\u7528 allowManagedHooksOnly \u9650\u5236\u53ea\u7528\u7ba1\u7406\u54e1\u6838\u51c6\u7684 hooks\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><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\">MCP \u4f3a\u670d\u5668\u7684\u5b89\u5168\u6ce8\u610f\u4e8b\u9805<\/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-30\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\u5fc5\u505a\uff1a\n<span class=\"hljs-selector-tag\">-<\/span> \u4e0d\u8981\u628a <span class=\"hljs-selector-tag\">API<\/span> <span class=\"hljs-selector-tag\">key<\/span> \u76f4\u63a5\u5beb\u5728 <span class=\"hljs-selector-class\">.mcp<\/span><span class=\"hljs-selector-class\">.json<\/span> \u88e1\uff08\u7528\u74b0\u5883\u8b8a\u6578\uff09\n<span class=\"hljs-selector-tag\">-<\/span> \u7b2c\u4e09\u65b9 <span class=\"hljs-selector-tag\">MCP<\/span> \u4f3a\u670d\u5668\u672a\u7d93 <span class=\"hljs-selector-tag\">Anthropic<\/span> \u9a57\u8b49\uff0c\u81ea\u884c\u8a55\u4f30\u98a8\u96aa\n<span class=\"hljs-selector-tag\">-<\/span> \u5225\u958b\u592a\u591a <span class=\"hljs-selector-tag\">MCP<\/span> \u4f3a\u670d\u5668\uff08\u5b98\u65b9\u5efa\u8b70\u4e0d\u8d85\u904e 10 \u500b\uff0c\u4ee5\u514d\u4f54\u7528\u4e0a\u4e0b\u6587\u7a97\u53e3\uff09\n\n\u77e5\u9053\u5c31\u597d\uff1a\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">MCP<\/span> <span class=\"hljs-selector-tag\">Tool<\/span> <span class=\"hljs-selector-tag\">Search<\/span> \u529f\u80fd\uff1a\u7576\u5de5\u5177\u592a\u591a\u6642\uff0c<span class=\"hljs-selector-tag\">Claude<\/span> <span class=\"hljs-selector-tag\">Code<\/span> \u6703\u81ea\u52d5\u6309\u9700\u8f09\u5165\n<span class=\"hljs-selector-tag\">-<\/span> \u53ef\u7528 <span class=\"hljs-selector-tag\">MAX_MCP_OUTPUT_TOKENS<\/span> \u9650\u5236 <span class=\"hljs-selector-tag\">MCP<\/span> \u8f38\u51fa\u5927\u5c0f\n<span class=\"hljs-selector-tag\">-<\/span> \u5c08\u6848\u5c64\u7d1a\u7684 <span class=\"hljs-selector-class\">.mcp<\/span><span class=\"hljs-selector-class\">.json<\/span> \u9996\u6b21\u4f7f\u7528\u6703\u8981\u6c42\u78ba\u8a8d\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Vibe Coder \u6aa2\u67e5\u9ede<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576\u4f60\u5728\u5c08\u6848\u88e1\u770b\u5230 hooks \u548c MCP \u914d\u7f6e\u6642\uff0c\u6309\u9019\u500b\u9806\u5e8f\u78ba\u8a8d\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u770b\u5230 hooks \u914d\u7f6e\u6642\uff1a<\/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-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-number\">1.<\/span> \u770b\u300c\u4e8b\u4ef6\u985e\u578b\u300d\u2192 \u9019\u662f\u5728\u4ec0\u9ebc\u6642\u5019\u89f8\u767c\u7684\uff1f\n<span class=\"hljs-number\">2.<\/span> \u770b\u300cmatcher\u300d\u2192 \u91dd\u5c0d\u54ea\u500b\u5de5\u5177\u6216\u689d\u4ef6\uff1f\n<span class=\"hljs-number\">3.<\/span> \u770b\u300ctype\u300d\u2192 \u662f command\uff08\u8dd1\u8173\u672c\uff09\u3001prompt\uff08AI \u5224\u65b7\uff09\u9084\u662f agent\uff08AI \u7528\u5de5\u5177\u9a57\u8b49\uff09\uff1f\n<span class=\"hljs-number\">4.<\/span> \u770b\u8173\u672c\u5167\u5bb9 \u2192 <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">2<\/span> \u4ee3\u8868\u963b\u6b62\uff0c<span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span> \u4ee3\u8868\u653e\u884c\n<span class=\"hljs-number\">5.<\/span> \u6709 <span class=\"hljs-string\">\"async\"<\/span>: <span class=\"hljs-keyword\">true<\/span> \u55ce\uff1f\u2192 \u662f\u7684\u8a71\u5c31\u662f\u80cc\u666f\u57f7\u884c\uff0c\u4e0d\u963b\u585e\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><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\"><strong>\u770b\u5230 MCP \u914d\u7f6e\u6642\uff1a<\/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-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-number\">1.<\/span> \u6709 <span class=\"hljs-string\">\"command\"<\/span> + <span class=\"hljs-string\">\"args\"<\/span> \u2192 \u672c\u6a5f\u57f7\u884c\u7684 stdio \u4f3a\u670d\u5668\n<span class=\"hljs-number\">2.<\/span> \u6709 <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"http\"<\/span> + <span class=\"hljs-string\">\"url\"<\/span> \u2192 \u9060\u7aef HTTP \u4f3a\u670d\u5668\n<span class=\"hljs-number\">3.<\/span> \u6709 <span class=\"hljs-string\">\"env\"<\/span> \u2192 \u9700\u8981\u8a2d\u5b9a\u74b0\u5883\u8b8a\u6578\uff08\u901a\u5e38\u662f API key\uff09\n<span class=\"hljs-number\">4.<\/span> \u6709 ${<span class=\"hljs-keyword\">VAR<\/span>} \u2192 \u7528\u74b0\u5883\u8b8a\u6578\u5c55\u958b\uff0c\u5be6\u969b\u503c\u5728\u4f60\u7684 shell \u74b0\u5883\u4e2d\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5e38\u898b\u914d\u7f6e\u6a21\u5f0f\u901f\u67e5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u5f8c\u6574\u7406\u5e7e\u500b\u4f60\u6700\u53ef\u80fd\u9047\u5230\u7684\u914d\u7f6e\u6a21\u5f0f\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6a21\u5f0f 1\uff1a\u963b\u6b62\u5371\u96aa\u64cd\u4f5c<\/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-33\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PreToolUse\"<\/span>: &#91;{\n      <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Bash\"<\/span>,\n      <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;{<span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>, <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"scripts\/block-dangerous.sh\"<\/span>}]\n    }]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><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\"><strong>\u6a21\u5f0f 2\uff1a\u81ea\u52d5\u683c\u5f0f\u5316<\/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-34\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"PostToolUse\"<\/span>: &#91;{\n      <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"Write|Edit\"<\/span>,\n      <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;{<span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>, <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"npx prettier --write $(jq -r '.tool_input.file_path')\"<\/span>}]\n    }]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><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\"><strong>\u6a21\u5f0f 3\uff1aSession \u72c0\u614b\u7ba1\u7406<\/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-35\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"SessionStart\"<\/span>: &#91;{\n      <span class=\"hljs-attr\">\"matcher\"<\/span>: <span class=\"hljs-string\">\"startup\"<\/span>,\n      <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;{<span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>, <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"scripts\/load-context.js\"<\/span>}]\n    }],\n    <span class=\"hljs-attr\">\"SessionEnd\"<\/span>: &#91;{\n      <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;{<span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"command\"<\/span>, <span class=\"hljs-attr\">\"command\"<\/span>: <span class=\"hljs-string\">\"scripts\/save-state.js\"<\/span>}]\n    }]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><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\"><strong>\u6a21\u5f0f 4\uff1aMCP \u5916\u90e8\u670d\u52d9<\/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-36\" 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\">\"github\"<\/span>: {\n      <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"http\"<\/span>,\n      <span class=\"hljs-attr\">\"url\"<\/span>: <span class=\"hljs-string\">\"https:\/\/api.githubcopilot.com\/mcp\/\"<\/span>\n    }\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><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\"><strong>\u6a21\u5f0f 5\uff1aAI \u54c1\u8cea\u9598\u9580<\/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-37\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"hooks\"<\/span>: {\n    <span class=\"hljs-attr\">\"Stop\"<\/span>: &#91;{\n      <span class=\"hljs-attr\">\"hooks\"<\/span>: &#91;{\n        <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"prompt\"<\/span>,\n        <span class=\"hljs-attr\">\"prompt\"<\/span>: <span class=\"hljs-string\">\"\u6aa2\u67e5\u6240\u6709\u4efb\u52d9\u662f\u5426\u5b8c\u6210\uff1a$ARGUMENTS\u3002\u56de\u50b3 {\\\"ok\\\": true} \u6216 {\\\"ok\\\": false, \\\"reason\\\": \\\"\u539f\u56e0\\\"}\"<\/span>,\n        <span class=\"hljs-attr\">\"timeout\"<\/span>: <span class=\"hljs-number\">30<\/span>\n      }]\n    }]\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><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<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<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u6982\u5ff5<\/th>\n<th>\u4e00\u53e5\u8a71<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Hooks<\/td>\n<td>\u5728 Claude Code \u5de5\u4f5c\u6d41\u7684\u7279\u5b9a\u6642\u9593\u9ede\u81ea\u52d5\u57f7\u884c\u8173\u672c<\/td>\n<\/tr>\n<tr>\n<td>Hook \u4e8b\u4ef6<\/td>\n<td>14 \u7a2e\u4e8b\u4ef6\u6db5\u84cb\u6574\u500b session \u751f\u547d\u9031\u671f<\/td>\n<\/tr>\n<tr>\n<td>Matcher<\/td>\n<td>\u7528\u6b63\u5247\u8868\u9054\u5f0f\u904e\u6ffe\u300c\u5c0d\u54ea\u500b\u5de5\u5177\u89f8\u767c\u300d<\/td>\n<\/tr>\n<tr>\n<td>Hook \u985e\u578b<\/td>\n<td>command\uff08\u8dd1\u8173\u672c\uff09\u3001prompt\uff08AI \u5224\u65b7\uff09\u3001agent\uff08AI \u9a57\u8b49\uff09<\/td>\n<\/tr>\n<tr>\n<td>Exit code<\/td>\n<td>0 = \u653e\u884c\u30012 = \u963b\u6b62\u3001\u5176\u4ed6 = \u975e\u963b\u585e\u932f\u8aa4<\/td>\n<\/tr>\n<tr>\n<td>MCP<\/td>\n<td>\u8b93 Claude Code \u9023\u63a5\u5916\u90e8\u670d\u52d9\u7684\u958b\u653e\u5354\u8b70<\/td>\n<\/tr>\n<tr>\n<td>MCP \u985e\u578b<\/td>\n<td>stdio\uff08\u672c\u6a5f\u7a0b\u5f0f\uff09vs HTTP\uff08\u9060\u7aef\u670d\u52d9\uff09<\/td>\n<\/tr>\n<tr>\n<td>Scope<\/td>\n<td>local\uff08\u500b\u4eba+\u5c08\u6848\uff09\u3001project\uff08\u5718\u968a\u5171\u4eab\uff09\u3001user\uff08\u500b\u4eba\u5168\u57df\uff09<\/td>\n<\/tr>\n<tr>\n<td>Hooks + MCP<\/td>\n<td>\u7528 hooks \u76e3\u63a7\/\u63a7\u5236 MCP \u5de5\u5177\uff0c\u5de5\u5177\u540d\u7a31\u683c\u5f0f <code>mcp__\u4f3a\u670d\u5668__\u5de5\u5177<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0b\u4e00\u7bc7\uff0c\u6211\u5011\u5c07\u9032\u5165\u7cfb\u5217\u6700\u7d42\u7ae0\uff1a<strong>\u5c08\u6848\u6a21\u677f\u8207\u6574\u5408\u5be6\u6230<\/strong>\uff0c\u628a Rules\u3001Commands\u3001Agents\u3001Hooks\u3001MCP \u5168\u90e8\u4e32\u8d77\u4f86\uff0c\u770b\u4e00\u500b\u5b8c\u6574\u7684 Claude Code \u5c08\u6848\u914d\u7f6e\u9577\u4ec0\u9ebc\u6a23\u3002<\/p>\n\n\n\n<div id=\"quiz-7fe757b9\">\n<style>\n#quiz-7fe757b9 .badge {\n        display: inline-block;\n        padding: 4px 10px;\n        border-radius: 12px;\n        font-size: 0.75em;\n        font-weight: bold;\n        margin-left: 8px;\n      }#quiz-7fe757b9 .badge.scenario {\n        background: #ebf8ff;\n        color: #2b6cb0;\n      }#quiz-7fe757b9 .badge.debug {\n        background: #fef3c7;\n        color: #92400e;\n      }#quiz-7fe757b9 .question-adv {\n        background: white;\n        border-radius: 10px;\n        padding: 24px;\n        margin: 20px 0;\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n        border-left: 4px solid #ed8936;\n      }#quiz-7fe757b9 .question-adv h3 {\n        margin-top: 0;\n        color: #2d3748;\n      }#quiz-7fe757b9 .code-block {\n        background: #1e1e1e;\n        color: #d4d4d4;\n        padding: 14px;\n        border-radius: 6px;\n        font-family: \"Menlo\", \"Monaco\", \"Courier New\", monospace;\n        font-size: 0.9em;\n        overflow-x: auto;\n        margin: 12px 0;\n        white-space: pre-wrap;\n      }#quiz-7fe757b9 .options-adv {\n        list-style: none;\n        padding: 0;\n      }#quiz-7fe757b9 .options-adv li {\n        padding: 14px 16px;\n        margin: 10px 0;\n        border: 2px solid #e2e8f0;\n        border-radius: 8px;\n        cursor: pointer;\n        transition: all 0.2s;\n      }#quiz-7fe757b9 .options-adv li:hover:not(.disabled) {\n        border-color: #ed8936;\n        background: #fffaf0;\n      }#quiz-7fe757b9 .options-adv li.disabled {\n        cursor: default;\n        opacity: 0.7;\n      }#quiz-7fe757b9 .options-adv li.show-answer {\n        border-color: #48bb78;\n        background: #f0fff4;\n      }#quiz-7fe757b9 .options-adv li.wrong {\n        border-color: #fc8181;\n        background: #fff5f5;\n      }#quiz-7fe757b9 .feedback-adv {\n        margin-top: 16px;\n        padding: 14px;\n        border-radius: 8px;\n        display: none;\n        line-height: 1.6;\n      }#quiz-7fe757b9 .feedback-adv.correct {\n        background: #f0fff4;\n        color: #276749;\n        display: block;\n      }#quiz-7fe757b9 .feedback-adv.wrong {\n        background: #fff5f5;\n        color: #c53030;\n        display: block;\n      }#quiz-7fe757b9 .feedback-adv \n      .score-adv {\n        text-align: center;\n        font-size: 1.4em;\n        padding: 24px;\n        background: white;\n        border-radius: 10px;\n        margin-top: 24px;\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n      }#quiz-7fe757b9 .intro {\n        background: #ebf8ff;\n        padding: 16px;\n        border-radius: 8px;\n        margin-bottom: 20px;\n        color: #2c5282;\n      }\n<\/style>\n<h1>\u9032\u968e\u6e2c\u9a57\uff1aHooks \u8207 MCP \u2014 \u4e8b\u4ef6\u9a45\u52d5\u81ea\u52d5\u5316\u8207\u5916\u90e8\u670d\u52d9\u6574\u5408<\/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    <!-- \u60c5\u5883\u984c 1 -->\n    <div class=\"question-adv\" id=\"qAdv1\">\n      <h3>1. \u4f60\u7684\u5718\u968a\u5e0c\u671b Claude Code \u5728\u6bcf\u6b21\u5beb\u5165 JS\/TS \u6a94\u6848\u5f8c\u81ea\u52d5\u8dd1 ESLint\uff0c\u4f46\u4e0d\u8981\u963b\u585e Claude \u7684\u5de5\u4f5c\u6d41\u7a0b\u3002\u4f60\u61c9\u8a72\u600e\u9ebc\u914d\u7f6e\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(1, 'A', 'C')\">A. \u7528 <code>PreToolUse<\/code> + matcher <code>\"Write\"<\/code>\uff0c\u5728\u5beb\u5165\u524d\u8dd1 ESLint<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'B', 'C')\">B. \u7528 <code>PostToolUse<\/code> + matcher <code>\"Write|Edit\"<\/code>\uff0c\u540c\u6b65\u57f7\u884c ESLint<\/li>\n        <li onclick=\"checkAnswerAdv(1, 'C', 'C')\">C. \u7528 <code>PostToolUse<\/code> + matcher <code>\"Write|Edit\"<\/code>\uff0c\u52a0\u4e0a <code>\"async\": true<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(1, 'D', 'C')\">D. \u7528 <code>Stop<\/code> \u4e8b\u4ef6\uff0c\u5728 Claude \u505c\u4e0b\u6642\u7d71\u4e00\u8dd1 ESLint<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv1\"><\/div>\n    <\/div>\n\n    <!-- \u60c5\u5883\u984c 2 -->\n    <div class=\"question-adv\" id=\"qAdv2\">\n      <h3>2. \u4f60\u60f3\u8b93\u5718\u968a\u5171\u7528\u4e00\u5957 MCP \u914d\u7f6e\uff08\u5305\u542b GitHub \u548c Vercel\uff09\uff0c\u4f46\u6bcf\u500b\u4eba\u7528\u81ea\u5df1\u7684 API key\u3002\u6700\u4f73\u505a\u6cd5\u662f\u4ec0\u9ebc\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(2, 'A', 'B')\">A. \u6bcf\u500b\u4eba\u5404\u81ea\u7528 <code>claude mcp add --scope local<\/code> \u624b\u52d5\u65b0\u589e\uff0c\u4e0d\u5171\u4eab\u914d\u7f6e<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'B', 'B')\">B. \u5728 <code>.mcp.json<\/code> \u4e2d\u7528 <code>${API_KEY}<\/code> \u74b0\u5883\u8b8a\u6578\u5c55\u958b\uff0ccommit \u9032 repo\uff0c\u5404\u81ea\u5728\u672c\u6a5f\u8a2d\u5b9a\u74b0\u5883\u8b8a\u6578<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'C', 'B')\">C. \u628a API key \u76f4\u63a5\u5beb\u5728 <code>.mcp.json<\/code> \u88e1\uff0ccommit \u9032 repo \u65b9\u4fbf\u5718\u968a\u4f7f\u7528<\/li>\n        <li onclick=\"checkAnswerAdv(2, 'D', 'B')\">D. \u7528 <code>--scope user<\/code> \u628a\u914d\u7f6e\u5beb\u9032 <code>~\/.claude.json<\/code>\uff0c\u518d\u628a\u9019\u500b\u6a94\u6848\u5206\u4eab\u7d66\u5718\u968a<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv2\"><\/div>\n    <\/div>\n\n    <!-- \u60c5\u5883\u984c 3 -->\n    <div class=\"question-adv\" id=\"qAdv3\">\n      <h3>3. \u4f60\u60f3\u8b93 Claude Code \u5728\u6bcf\u6b21\u4f7f\u7528 GitHub MCP \u5de5\u5177\u524d\u90fd\u8a18\u9304\u4e00\u7b46 log\uff0c\u4f46\u4e0d\u5f71\u97ff Supabase \u7b49\u5176\u4ed6 MCP \u5de5\u5177\u3002matcher \u61c9\u8a72\u600e\u9ebc\u5beb\uff1f <span class=\"badge scenario\">\u60c5\u5883\u984c<\/span><\/h3>\n      <div class=\"code-block\">{\n  &#8220;hooks&#8221;: {\n    &#8220;PreToolUse&#8221;: [\n      {\n        &#8220;matcher&#8221;: &#8220;???&#8221;,\n        &#8220;hooks&#8221;: [\n          {\n            &#8220;type&#8221;: &#8220;command&#8221;,\n            &#8220;command&#8221;: &#8220;echo &#8216;GitHub MCP used&#8217; >> ~\/mcp.log&#8221;\n          }\n        ]\n      }\n    ]\n  }\n}<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(3, 'A', 'D')\">A. <code>\"matcher\": \"github\"<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(3, 'B', 'D')\">B. <code>\"matcher\": \"mcp__.*\"<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(3, 'C', 'D')\">C. <code>\"matcher\": \"mcp.github.*\"<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(3, 'D', 'D')\">D. <code>\"matcher\": \"mcp__github__.*\"<\/code><\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv3\"><\/div>\n    <\/div>\n\n    <!-- \u932f\u8aa4\u8a3a\u65b7\u984c 1 -->\n    <div class=\"question-adv\" id=\"qAdv4\">\n      <h3>4. \u5c0f\u83ef\u5beb\u4e86\u4e00\u500b hook \u8173\u672c\uff0c\u60f3\u8981\u5728 Claude \u57f7\u884c <code>rm -rf<\/code> \u6642\u963b\u6b62\u64cd\u4f5c\u3002\u4f46\u6e2c\u8a66\u6642\u767c\u73fe Claude \u4ecd\u7136\u6210\u529f\u57f7\u884c\u4e86\u5371\u96aa\u6307\u4ee4\u3002\u8acb\u770b\u4e0b\u65b9\u8173\u672c\uff0c\u554f\u984c\u6700\u53ef\u80fd\u51fa\u5728\u54ea\u88e1\uff1f <span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">#!\/bin\/bash\nCOMMAND=$(jq -r &#8216;.tool_input.command&#8217;)\n\nif echo &#8220;$COMMAND&#8221; | grep -q &#8216;rm -rf&#8217;; then\n  echo &#8220;\u5371\u96aa\u6307\u4ee4\u5df2\u88ab\u963b\u6b62&#8221;\n  exit 1\nfi\n\nexit 0<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(4, 'A', 'C')\">A. <code>jq<\/code> \u6307\u4ee4\u5beb\u932f\u4e86\uff0c\u61c9\u8a72\u7528 <code>jq -r '.command'<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(4, 'B', 'C')\">B. <code>grep -q<\/code> \u7121\u6cd5\u5339\u914d\u542b\u7a7a\u683c\u7684\u5b57\u4e32<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'C', 'C')\">C. \u963b\u6b62\u64cd\u4f5c\u61c9\u8a72\u7528 <code>exit 2<\/code> \u800c\u975e <code>exit 1<\/code>\uff0c\u4e14\u932f\u8aa4\u8a0a\u606f\u61c9\u8f38\u51fa\u5230 stderr<\/li>\n        <li onclick=\"checkAnswerAdv(4, 'D', 'C')\">D. \u8173\u672c\u7f3a\u5c11 <code>chmod +x<\/code> \u57f7\u884c\u6b0a\u9650<\/li>\n      <\/ul>\n      <div class=\"feedback-adv\" id=\"fbAdv4\"><\/div>\n    <\/div>\n\n    <!-- \u932f\u8aa4\u8a3a\u65b7\u984c 2 -->\n    <div class=\"question-adv\" id=\"qAdv5\">\n      <h3>5. \u5c0f\u660e\u60f3\u5728\u5c08\u6848\u4e2d\u914d\u7f6e GitHub MCP \u4f3a\u670d\u5668\u4f9b\u5718\u968a\u4f7f\u7528\uff0c\u4f46\u968a\u53cb\u56de\u5831\u9023\u4e0d\u4e0a\u3002\u8acb\u770b\u914d\u7f6e\u6a94\uff0c\u6700\u53ef\u80fd\u7684\u554f\u984c\u662f\u4ec0\u9ebc\uff1f <span class=\"badge debug\">\u932f\u8aa4\u8a3a\u65b7<\/span><\/h3>\n      <div class=\"code-block\">\/\/ .mcp.json\uff08\u5df2 commit \u9032 repo\uff09\n{\n  &#8220;mcpServers&#8221;: {\n    &#8220;github&#8221;: {\n      &#8220;command&#8221;: &#8220;npx&#8221;,\n      &#8220;args&#8221;: [&#8220;-y&#8221;, &#8220;@modelcontextprotocol\/server-github&#8221;],\n      &#8220;env&#8221;: {\n        &#8220;GITHUB_PERSONAL_ACCESS_TOKEN&#8221;: &#8220;ghp_a1b2c3d4e5f6g7h8&#8221;\n      }\n    }\n  }\n}<\/div>\n      <ul class=\"options-adv\">\n        <li onclick=\"checkAnswerAdv(5, 'A', 'B')\">A. <code>npx<\/code> \u6307\u4ee4\u4e0d\u652f\u63f4 MCP \u4f3a\u670d\u5668\uff0c\u61c9\u8a72\u6539\u7528 <code>node<\/code><\/li>\n        <li onclick=\"checkAnswerAdv(5, 'B', 'B')\">B. Token \u4e0d\u61c9\u8a72\u5beb\u6b7b\u5728 <code>.mcp.json<\/code> \u88e1\uff1b\u61c9\u6539\u7528 <code>${GITHUB_PERSONAL_ACCESS_TOKEN}<\/code> \u74b0\u5883\u8b8a\u6578\u5c55\u958b\uff0c\u6bcf\u500b\u4eba\u5728\u672c\u6a5f\u8a2d\u5b9a\u81ea\u5df1\u7684 token<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'C', 'B')\">C. <code>.mcp.json<\/code> \u4e0d\u652f\u63f4 stdio \u985e\u578b\uff0c\u5fc5\u9808\u6539\u7528 HTTP \u985e\u578b<\/li>\n        <li onclick=\"checkAnswerAdv(5, 'D', 'B')\">D. \u7f3a\u5c11 <code>\"type\": \"stdio\"<\/code> \u6b04\u4f4d\uff0c\u5c0e\u81f4 Claude Code \u7121\u6cd5\u8fa8\u8b58\u4f3a\u670d\u5668\u985e\u578b<\/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: \" \u9700\u6c42\u6709\u5169\u500b\u8981\u9ede\uff1a(1) \u5beb\u5165\u5f8c\u89f8\u767c\uff0c\u6240\u4ee5\u662f <code>PostToolUse<\/code> \u800c\u975e <code>PreToolUse<\/code>\uff1b(2) \u4e0d\u8981\u963b\u585e\uff0c\u6240\u4ee5\u9700\u8981 <code>\\\"async\\\": true<\/code>\u3002\u9078\u9805 A \u7528\u4e86\u932f\u8aa4\u7684\u4e8b\u4ef6\uff08Pre \u662f\u57f7\u884c\u524d\uff09\u3002\u9078\u9805 B \u96d6\u7136\u4e8b\u4ef6\u6b63\u78ba\uff0c\u4f46\u540c\u6b65\u57f7\u884c\u6703\u963b\u585e Claude \u7684\u5de5\u4f5c\u3002\u9078\u9805 D \u5728 <code>Stop<\/code> \u6642\u624d\u7d71\u4e00\u6aa2\u67e5\uff0c\u7121\u6cd5\u505a\u5230\u300c\u6bcf\u6b21\u5beb\u5165\u5f8c\u7acb\u5373\u8dd1\u300d\u7684\u6548\u679c\u3002\",\n        2: \" <code>.mcp.json<\/code> \u652f\u63f4\u74b0\u5883\u8b8a\u6578\u5c55\u958b\u8a9e\u6cd5 <code>${VAR}<\/code>\uff0c\u9019\u8b93\u4f60\u53ef\u4ee5\u628a\u914d\u7f6e commit \u9032 repo \u800c\u4e0d\u66b4\u9732\u5bc6\u9470\u3002\u6bcf\u500b\u5718\u968a\u6210\u54e1\u5728\u81ea\u5df1\u7684 shell \u74b0\u5883\u6216 <code>.env<\/code> \u88e1\u8a2d\u5b9a\u81ea\u5df1\u7684 API key\u3002\u9078\u9805 A \u53ef\u884c\u4f46\u6c92\u6709\u5171\u4eab\u914d\u7f6e\u7684\u597d\u8655\u3002\u9078\u9805 C \u6703\u6d29\u6f0f\u5bc6\u9470\u5230\u7248\u672c\u63a7\u5236\uff0c\u662f\u56b4\u91cd\u7684\u5b89\u5168\u554f\u984c\u3002\u9078\u9805 D \u7684 <code>~\/.claude.json<\/code> \u662f\u500b\u4eba\u6a94\u6848\uff0c\u4e0d\u61c9\u8a72\u76f4\u63a5\u5206\u4eab\u3002\",\n        3: \" MCP \u5de5\u5177\u5728 hooks \u88e1\u7684\u547d\u540d\u683c\u5f0f\u662f <code>mcp__&lt;\u4f3a\u670d\u5668\u540d\u7a31&gt;__&lt;\u5de5\u5177\u540d\u7a31&gt;<\/code>\uff08\u96d9\u5e95\u7dda\u5206\u9694\uff09\u3002\u8981\u5339\u914d GitHub \u4f3a\u670d\u5668\u7684\u6240\u6709\u5de5\u5177\uff0c\u6b63\u78ba\u7684\u6b63\u5247\u662f <code>mcp__github__.*<\/code>\u3002\u9078\u9805 A \u7684 <code>\\\"github\\\"<\/code> \u53ea\u5339\u914d\u540d\u70ba github \u7684\u5167\u5efa\u5de5\u5177\uff08\u4e0d\u5b58\u5728\u9019\u500b\u5de5\u5177\uff09\u3002\u9078\u9805 B \u7684 <code>mcp__.*<\/code> \u6703\u5339\u914d\u6240\u6709 MCP \u4f3a\u670d\u5668\u7684\u6240\u6709\u5de5\u5177\uff0c\u5305\u62ec Supabase\u3002\u9078\u9805 C \u7528\u4e86\u9ede\u865f\u5206\u9694\uff0c\u4e0d\u7b26\u5408 MCP \u7684\u547d\u540d\u898f\u5247\u3002\",\n        4: \" \u5728 Claude Code \u7684 hook \u6a5f\u5236\u4e2d\uff0c<code>exit 2<\/code> \u624d\u662f\u300c\u963b\u6b62\u64cd\u4f5c\u300d\u7684\u4fe1\u865f\uff0c<code>exit 1<\/code> \u6216\u5176\u4ed6\u975e 0 \u975e 2 \u7684 exit code \u53ea\u662f\u300c\u975e\u963b\u585e\u932f\u8aa4\u300d\uff0c\u6703\u8a18\u9304\u932f\u8aa4\u4f46\u4e0d\u6703\u963b\u6b62\u64cd\u4f5c\u3002\u6b64\u5916\uff0c\u963b\u6b62\u6642\u7684\u932f\u8aa4\u8a0a\u606f\u61c9\u8a72\u8f38\u51fa\u5230 stderr\uff08\u7528 <code>&gt;&amp;2<\/code>\uff09\uff0c\u800c\u4e0d\u662f stdout\u3002\u6b63\u78ba\u5beb\u6cd5\u61c9\u8a72\u662f\uff1a<code>echo \\\"\u5371\u96aa\u6307\u4ee4\u5df2\u88ab\u963b\u6b62\\\" &gt;&amp;2<\/code> \u52a0\u4e0a <code>exit 2<\/code>\u3002\",\n        5: \" \u9019\u88e1\u6709\u5169\u500b\u554f\u984c\uff1a\u9996\u5148\uff0c\u5c0f\u660e\u628a\u81ea\u5df1\u7684 GitHub Personal Access Token \u76f4\u63a5\u5beb\u6b7b\u5728 <code>.mcp.json<\/code> \u4e2d\u4e26 commit \u9032 repo\uff0c\u9019\u662f\u5b89\u5168\u554f\u984c\uff08\u5bc6\u9470\u6d29\u6f0f\uff09\u3002\u5176\u6b21\uff0c\u968a\u53cb\u7684 token \u548c\u5c0f\u660e\u4e0d\u540c\uff0c\u4ed6\u5011\u9700\u8981\u81ea\u5df1\u7684 token \u624d\u80fd\u9a57\u8b49\u3002\u6b63\u78ba\u505a\u6cd5\u662f\u7528 <code>${GITHUB_PERSONAL_ACCESS_TOKEN}<\/code> \u74b0\u5883\u8b8a\u6578\u5c55\u958b\uff0c\u8b93\u6bcf\u500b\u4eba\u5728\u672c\u6a5f\u8a2d\u5b9a\u81ea\u5df1\u7684\u503c\u3002\u9078\u9805 A \u4e0d\u5c0d\uff0c<code>npx<\/code> \u662f\u6a19\u6e96\u7684 stdio MCP \u555f\u52d5\u65b9\u5f0f\u3002\u9078\u9805 C \u4e0d\u5c0d\uff0c<code>.mcp.json<\/code> \u652f\u63f4 stdio \u985e\u578b\u3002\u9078\u9805 D \u4e0d\u5c0d\uff0cstdio \u662f\u9810\u8a2d\u985e\u578b\uff0c\u4e0d\u9700\u8981\u984d\u5916\u8072\u660e\u3002\"\n      };\n\n      function checkAnswerAdv(qNum, selected, correctAns) {\n        const question = document.getElementById(\"qAdv\" + qNum);\n        if (question.classList.contains(\"answered\")) return;\n\n        question.classList.add(\"answered\");\n        answeredAdv++;\n\n        const options = question.querySelectorAll(\".options-adv li\");\n        options.forEach((opt) => {\n          opt.classList.add(\"disabled\");\n          if (opt.textContent.startsWith(correctAns + \".\")) {\n            opt.classList.add(\"show-answer\");\n          }\n        });\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 =\n            \"\u2717 \u932f\u8aa4\u3002\u6b63\u78ba\u7b54\u6848\u662f \" + correctAns + \"\u3002\" + explanationsAdv[qNum];\n          options.forEach((opt) => {\n            if (opt.textContent.startsWith(selected + \".\")) {\n              opt.classList.add(\"wrong\");\n            }\n          });\n        }\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))\n            msg = \"\ud83d\udcaa \u5f88\u68d2\uff01\u518d\u8907\u7fd2\u4e00\u4e0b\u932f\u7684\u984c\u76ee\";\n          else if (correctAdv >= Math.ceil(totalAdv * 0.6))\n            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 =\n            \"\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\uff1aHooks \u8207 MCP \u2014 \u4e8b\u4ef6\u9a45\u52d5\u81ea\u52d5\u5316\u8207\u5916\u90e8\u670d\u52d9\u6574\u5408 \u5171 5 \u984c\uff0c\u9ede\u9078\u7b54\u6848\u5f8c\u6703\u7acb\u5373\u986f\u793a\u7d50\u679c 1. \u5728 [&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":[654],"tags":[655,399,352,440,326],"class_list":["post-727","post","type-post","status-publish","format-standard","hentry","category-claude-code-","tag-ai","tag-claude-code","tag-hooks","tag-mcp","tag-326"],"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\/727","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=727"}],"version-history":[{"count":0,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/727\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}