{"id":106088,"date":"2025-04-15T05:25:32","date_gmt":"2025-04-15T00:55:32","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/"},"modified":"2025-04-15T05:25:32","modified_gmt":"2025-04-15T00:55:32","slug":"building-ai-agents-with-google-adk-fastapi-and-mcp-26h7","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/","title":{"rendered":"\u0633\u0627\u062e\u062a \u0646\u0645\u0627\u06cc\u0646\u062f\u06af\u0627\u0646 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0628\u0627 Google ADK \u060c FastAPI \u0648 MCP"},"content":{"rendered":"<div data-article-id=\"2406928\" id=\"article-body\">\n<blockquote>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u062f\u063a\u0627\u0645 \u06a9\u06cc\u062a \u062a\u0648\u0633\u0639\u0647 \u0639\u0627\u0645\u0644 Google (ADK) \u0628\u0627 FastAPI \u0648 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0632\u0645\u06cc\u0646\u0647 Model (MCP) \u067e\u06cc\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0633\u0627\u0633\u06cc ADK \u0634\u0631\u0648\u0639 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u060c \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 FastAPI \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc \u062f\u0647\u06cc\u0645 \u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9 \u0633\u0631\u0648\u0631 MCP \u0631\u0627 \u0627\u0632 \u0647\u0645\u0627\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<\/blockquote>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A2%D9%86%DA%86%D9%87_%DB%8C%D8%A7%D8%AF_%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D8%AF_%DA%AF%D8%B1%D9%81%D8%AA\" >\u0622\u0646\u0686\u0647 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%82%D8%B3%D9%85%D8%AA_1_%D8%B4%D8%B1%D9%88%D8%B9_%D8%A8%D8%A7_Google_ADK\" >\u0642\u0633\u0645\u062a 1: \u0634\u0631\u0648\u0639 \u0628\u0627 Google ADK<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%86%D8%B5%D8%A8\" >\u0646\u0635\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D8%B9%D8%A7%D9%85%D9%84_%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C\" >\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0627\u0633\u0627\u0633\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A2%DA%98%D8%A7%D9%86%D8%B3_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0622\u0698\u0627\u0646\u0633 \u062e\u0648\u062f \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%82%D8%B3%D9%85%D8%AA_2_%D8%A7%D8%AF%D8%BA%D8%A7%D9%85_%D8%A8%D8%A7_Fastapi\" >\u0642\u0633\u0645\u062a 2: \u0627\u062f\u063a\u0627\u0645 \u0628\u0627 Fastapi<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%86%D8%B5%D8%A8-2\" >\u0646\u0635\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_Fastapi\" >\u0627\u06cc\u062c\u0627\u062f \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc Fastapi<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_FastAPI\" >\u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 FastAPI<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%82%D8%B3%D9%85%D8%AA_3_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%B3%D8%B1%D9%88%D8%B1_MCP\" >\u0642\u0633\u0645\u062a 3: \u0627\u06cc\u062c\u0627\u062f \u0633\u0631\u0648\u0631 MCP<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%86%D8%B5%D8%A8-3\" >\u0646\u0635\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86%DB%8C_%D8%A7%D8%B2_%D8%B3%D8%B1%D9%88%D8%B1_MCP\" >\u0627\u0641\u0632\u0648\u062f\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0633\u0631\u0648\u0631 MCP<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86%DB%8C_%D8%A7%D8%B2_%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86_%D8%AE%D8%B7_%D9%81%D8%B1%D9%85%D8%A7%D9%86_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D8%B3%D8%B1%D9%88%D8%B1_MCP\" >\u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0631\u0648\u0631 MCP<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%B3%D8%B1%D9%88%D8%B1_MCP_%D8%AE%D9%88%D8%AF_%D8%A8%D8%A7_Claude_%DB%8C%D8%A7_%D8%B3%D8%A7%DB%8C%D8%B1_%D8%AF%D8%B3%D8%AA%DB%8C%D8%A7%D8%B1%D8%A7%D9%86_%D9%87%D9%88%D8%B4_%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C\" >\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u0631 MCP \u062e\u0648\u062f \u0628\u0627 Claude \u06cc\u0627 \u0633\u0627\u06cc\u0631 \u062f\u0633\u062a\u06cc\u0627\u0631\u0627\u0646 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B1%D9%88%D8%B4%D9%87%D8%A7\" >\u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%85%D8%B3%D8%A7%D8%A6%D9%84_%D9%88_%D8%B1%D8%A7%D9%87_%D8%AD%D9%84_%D9%87%D8%A7%DB%8C_%D9%85%D8%B4%D8%AA%D8%B1%DA%A9\" >\u0645\u0633\u0627\u0626\u0644 \u0648 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0645\u0634\u062a\u0631\u06a9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/building-ai-agents-with-google-adk-fastapi-and-mcp-26h7\/#%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\" >\u067e\u0627\u06cc\u0627\u0646<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A2%D9%86%DA%86%D9%87_%DB%8C%D8%A7%D8%AF_%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D8%AF_%DA%AF%D8%B1%D9%81%D8%AA\"><\/span>\n<p>  \u0622\u0646\u0686\u0647 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0627\u0635\u0644\u06cc ADK \u0628\u0627 \u0627\u0628\u0632\u0627\u0631<\/li>\n<li>\u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 FastAPI \u0628\u0647 \u0639\u0627\u0645\u0644 ADK \u062e\u0648\u062f \u062e\u062f\u0645\u062a \u06a9\u0631\u062f<\/li>\n<li>\u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc ADK \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0633\u0631\u0648\u0631 MCP \u0627\u0641\u0634\u0627 \u06a9\u0631\u062f<\/li>\n<li>\u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634\u0647\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0627\u0644\u06af\u0648\u06cc \u0627\u062f\u063a\u0627\u0645<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7%DB%8C\"><\/span>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0634\u0645\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f:<\/p>\n<ul>\n<li>\u067e\u0627\u06cc\u062a\u0648\u0646 3.10+ \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 API Gemini Google (\u06cc\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u062f\u06cc\u06af\u0631)<\/li>\n<li>\u062f\u0627\u0646\u0634 \u0627\u0633\u0627\u0633\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0648 API<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%82%D8%B3%D9%85%D8%AA_1_%D8%B4%D8%B1%D9%88%D8%B9_%D8%A8%D8%A7_Google_ADK\"><\/span>\n<p>  \u0642\u0633\u0645\u062a 1: \u0634\u0631\u0648\u0639 \u0628\u0627 Google ADK<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u06a9\u06cc\u062a \u062a\u0648\u0633\u0639\u0647 Google Agent (ADK) \u0686\u0627\u0631\u0686\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u0639\u0648\u0627\u0645\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0628\u0627 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%B5%D8%A8\"><\/span>\n<p>  \u0646\u0635\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>google-adk python-dotenv\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DB%8C%DA%A9_%D8%B9%D8%A7%D9%85%D9%84_%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0627\u0633\u0627\u0633\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0639\u0627\u0645\u0644 \u0633\u0627\u062f\u0647 \u0628\u0627 \u062f\u0648 \u0627\u0628\u0632\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645: \u06cc\u06a9\u06cc \u0628\u0631\u0627\u06cc \u0628\u0631\u0631\u0633\u06cc \u0622\u0628 \u0648 \u0647\u0648\u0627 \u0648 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u0632\u0645\u0627\u0646 \u0641\u0639\u0644\u06cc \u062f\u0631 \u06cc\u06a9 \u0634\u0647\u0631.<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>adk_agents\/\n  \u251c\u2500\u2500 multi_tool_agent\/\n  \u2502   \u251c\u2500\u2500 __init__.py\n  \u2502   \u2514\u2500\u2500 agent.py\n  \u2514\u2500\u2500 __init__.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 <code>multi_tool_agent\/agent.py<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">import<\/span> <span class=\"n\">datetime<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">zoneinfo<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">ZoneInfo<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">google.adk.agents<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Agent<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">get_weather<\/span><span class=\"p\">(<\/span><span class=\"n\">city<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Get the current weather in a city.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"nf\">lower<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">new york<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n            <span class=\"sh\">\"<\/span><span class=\"s\">status<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">success<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n            <span class=\"sh\">\"<\/span><span class=\"s\">report<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">The weather in New York is sunny with 25\u00b0C.<\/span><span class=\"sh\">\"<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">status<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">error<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">error_message<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Weather for <\/span><span class=\"sh\">'<\/span><span class=\"si\">{<\/span><span class=\"n\">city<\/span><span class=\"si\">}<\/span><span class=\"sh\">'<\/span><span class=\"s\"> unavailable.<\/span><span class=\"sh\">\"<\/span>\n    <span class=\"p\">}<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">get_current_time<\/span><span class=\"p\">(<\/span><span class=\"n\">city<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">:<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Get the current time in a city.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">city_timezones<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">new york<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">America\/New_York<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">london<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Europe\/London<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">tokyo<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Asia\/Tokyo<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">paris<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Europe\/Paris<\/span><span class=\"sh\">\"<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"nf\">lower<\/span><span class=\"p\">()<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">city_timezones<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">tz<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">ZoneInfo<\/span><span class=\"p\">(<\/span><span class=\"n\">city_timezones<\/span><span class=\"p\">[<\/span><span class=\"n\">city<\/span><span class=\"p\">.<\/span><span class=\"nf\">lower<\/span><span class=\"p\">()])<\/span>\n            <span class=\"n\">now<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">(<\/span><span class=\"n\">tz<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">status<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">success<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"sh\">\"<\/span><span class=\"s\">report<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">The current time in <\/span><span class=\"si\">{<\/span><span class=\"n\">city<\/span><span class=\"si\">}<\/span><span class=\"s\"> is <\/span><span class=\"si\">{<\/span><span class=\"n\">now<\/span><span class=\"p\">.<\/span><span class=\"n\">strftime<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">%Y-%m-%d %H<\/span><span class=\"si\">:<\/span><span class=\"o\">%<\/span><span class=\"n\">M<\/span><span class=\"si\">:<\/span><span class=\"o\">%<\/span><span class=\"n\">S<\/span> <span class=\"o\">%<\/span><span class=\"n\">Z<\/span><span class=\"sh\">'<\/span><span class=\"s\">)<\/span><span class=\"si\">}<\/span><span class=\"sh\">\"<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">pass<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">status<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">error<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">error_message<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Time information for <\/span><span class=\"sh\">'<\/span><span class=\"si\">{<\/span><span class=\"n\">city<\/span><span class=\"si\">}<\/span><span class=\"sh\">'<\/span><span class=\"s\"> unavailable.<\/span><span class=\"sh\">\"<\/span>\n    <span class=\"p\">}<\/span>\n\n<span class=\"c1\"># Define the agent with the name \"root_agent\" (required by ADK)\n<\/span><span class=\"n\">root_agent<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Agent<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">weather_time_agent<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">model<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">gemini-1.5-flash<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># Use your preferred Gemini model\n<\/span>    <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Agent that provides weather and time information for cities.<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">instruction<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">You help users with time and weather information for various cities.<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">tools<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"n\">get_weather<\/span><span class=\"p\">,<\/span> <span class=\"n\">get_current_time<\/span><span class=\"p\">],<\/span>\n<span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u062a\u0645\u0627\u064b \u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u0631\u0627 \u062f\u0631 \u0622\u0646 \u0635\u0627\u062f\u0631 \u06a9\u0646\u06cc\u062f <code>multi_tool_agent\/__init__.py<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">.agent<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">root_agent<\/span>\n\n<span class=\"n\">__all__<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">root_agent<\/span><span class=\"sh\">\"<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A2%DA%98%D8%A7%D9%86%D8%B3_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0622\u0698\u0627\u0646\u0633 \u062e\u0648\u062f \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0639\u0627\u0645\u0644 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 ADK CLI \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd <\/span>adk_agents\nadk chat <span class=\"nt\">-a<\/span> multi_tool_agent\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f GUI \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd <\/span>adk_agents\nadk web <span class=\"nt\">-a<\/span> multi_tool_agent\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%82%D8%B3%D9%85%D8%AA_2_%D8%A7%D8%AF%D8%BA%D8%A7%D9%85_%D8%A8%D8%A7_Fastapi\"><\/span>\n<p>  \u0642\u0633\u0645\u062a 2: \u0627\u062f\u063a\u0627\u0645 \u0628\u0627 Fastapi<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062d\u0627\u0644 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0639\u0627\u0645\u0644 ADK \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 FastAPI \u0628\u067e\u06cc\u0686\u0627\u0646\u06cc\u0645 \u060c \u06a9\u0647 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0648\u0628 \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%B5%D8%A8-2\"><\/span>\n<p>  \u0646\u0635\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>fastapi <span class=\"s2\">\"uvicorn[standard]\"<\/span> sqlalchemy\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%A8%D8%B3%D8%AA%D9%87_%D8%A8%D9%86%D8%AF%DB%8C_Fastapi\"><\/span>\n<p>  \u0627\u06cc\u062c\u0627\u062f \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc Fastapi<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0646 <code>api.py<\/code> \u062f\u0631 \u0641\u0647\u0631\u0633\u062a \u0627\u0635\u0644\u06cc \u062e\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">sys<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">uvicorn<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">fastapi<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">FastAPI<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">google.adk.cli.fast_api<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">get_fast_api_app<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">dotenv<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">load_dotenv<\/span>\n\n<span class=\"c1\"># Set up paths\n<\/span><span class=\"n\">BASE_DIR<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">abspath<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">dirname<\/span><span class=\"p\">(<\/span><span class=\"n\">__file__<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">AGENT_DIR<\/span> <span class=\"o\">=<\/span> <span class=\"n\">BASE_DIR<\/span>  <span class=\"c1\"># Parent directory containing multi_tool_agent\n<\/span>\n<span class=\"c1\"># Set up DB path for sessions\n<\/span><span class=\"n\">SESSION_DB_URL<\/span> <span class=\"o\">=<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">sqlite:\/\/\/<\/span><span class=\"si\">{<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">sessions.db<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"sh\">\"<\/span>\n\n<span class=\"c1\"># Create the FastAPI app using ADK's helper\n<\/span><span class=\"n\">app<\/span><span class=\"p\">:<\/span> <span class=\"n\">FastAPI<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">get_fast_api_app<\/span><span class=\"p\">(<\/span>\n    <span class=\"n\">agent_dir<\/span><span class=\"o\">=<\/span><span class=\"n\">AGENT_DIR<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">session_db_url<\/span><span class=\"o\">=<\/span><span class=\"n\">SESSION_DB_URL<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">allow_origins<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">*<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>  <span class=\"c1\"># In production, restrict this\n<\/span>    <span class=\"n\">web<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># Enable the ADK Web UI\n<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Add custom endpoints\n<\/span><span class=\"nd\">@app.get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/health<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">health_check<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span><span class=\"sh\">\"<\/span><span class=\"s\">status<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">healthy<\/span><span class=\"sh\">\"<\/span><span class=\"p\">}<\/span>\n\n<span class=\"nd\">@app.get<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\/agent-info<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">agent_info<\/span><span class=\"p\">():<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Provide agent information<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"kn\">from<\/span> <span class=\"n\">multi_tool_agent<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">root_agent<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">agent_name<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">root_agent<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">description<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">root_agent<\/span><span class=\"p\">.<\/span><span class=\"n\">description<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">model<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"n\">root_agent<\/span><span class=\"p\">.<\/span><span class=\"n\">model<\/span><span class=\"p\">,<\/span>\n        <span class=\"sh\">\"<\/span><span class=\"s\">tools<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">t<\/span><span class=\"p\">.<\/span><span class=\"n\">__name__<\/span> <span class=\"k\">for<\/span> <span class=\"n\">t<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">root_agent<\/span><span class=\"p\">.<\/span><span class=\"n\">tools<\/span><span class=\"p\">]<\/span>\n    <span class=\"p\">}<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">__main__<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span>\n    <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Starting FastAPI server...<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">uvicorn<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">app<\/span><span class=\"p\">,<\/span> \n        <span class=\"n\">host<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">0.0.0.0<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> \n        <span class=\"n\">port<\/span><span class=\"o\">=<\/span><span class=\"mi\">9999<\/span><span class=\"p\">,<\/span> \n        <span class=\"nb\">reload<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span>\n    <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_FastAPI\"><\/span>\n<p>  \u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 FastAPI<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>python api.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 UI Web ADK \u062f\u0631 http: \/\/ localhost: 9999\/dev-ui<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%82%D8%B3%D9%85%D8%AA_3_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D8%B3%D8%B1%D9%88%D8%B1_MCP\"><\/span>\n<p>  \u0642\u0633\u0645\u062a 3: \u0627\u06cc\u062c\u0627\u062f \u0633\u0631\u0648\u0631 MCP<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u0631\u0648\u062a\u06a9\u0644 \u0632\u0645\u06cc\u0646\u0647 Model (MCP) \u0628\u0647 \u0645\u062f\u0644 \u0647\u0627\u06cc AI \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0634\u0641 \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 MCP \u062f\u0631 \u0645\u0639\u0631\u0636 \u062f\u06cc\u062f \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%B5%D8%A8-3\"><\/span>\n<p>  \u0646\u0635\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>mcp\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%86_%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86%DB%8C_%D8%A7%D8%B2_%D8%B3%D8%B1%D9%88%D8%B1_MCP\"><\/span>\n<p>  \u0627\u0641\u0632\u0648\u062f\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0633\u0631\u0648\u0631 MCP<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06a9\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>api.py<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># MCP Server Implementation\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">mcp<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">types<\/span> <span class=\"k\">as<\/span> <span class=\"n\">mcp_types<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">mcp.server.lowlevel<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Server<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">mcp.server.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">InitializationOptions<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">mcp.server.stdio<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">json<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">asyncio<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">google.adk.tools.function_tool<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">FunctionTool<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">google.adk.tools.mcp_tool.conversion_utils<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">adk_to_mcp_tool_type<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">create_mcp_server<\/span><span class=\"p\">():<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Creates an MCP server exposing our agent<\/span><span class=\"sh\">'<\/span><span class=\"s\">s tools.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"kn\">from<\/span> <span class=\"n\">multi_tool_agent.agent<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">get_weather<\/span><span class=\"p\">,<\/span> <span class=\"n\">get_current_time<\/span>\n\n    <span class=\"c1\"># Wrap functions in FunctionTool objects\n<\/span>    <span class=\"n\">weather_tool<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">FunctionTool<\/span><span class=\"p\">(<\/span><span class=\"n\">get_weather<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">time_tool<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">FunctionTool<\/span><span class=\"p\">(<\/span><span class=\"n\">get_current_time<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># Create MCP Server\n<\/span>    <span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Server<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">weather-time-mcp-server<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"nd\">@app.list_tools<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">list_tools<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">list<\/span><span class=\"p\">[<\/span><span class=\"n\">mcp_types<\/span><span class=\"p\">.<\/span><span class=\"n\">Tool<\/span><span class=\"p\">]:<\/span>\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">List available tools.<\/span><span class=\"sh\">\"\"\"<\/span>\n        <span class=\"c1\"># Convert ADK tools to MCP format\n<\/span>        <span class=\"n\">mcp_tools<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n            <span class=\"nf\">adk_to_mcp_tool_type<\/span><span class=\"p\">(<\/span><span class=\"n\">weather_tool<\/span><span class=\"p\">),<\/span>\n            <span class=\"nf\">adk_to_mcp_tool_type<\/span><span class=\"p\">(<\/span><span class=\"n\">time_tool<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">]<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">mcp_tools<\/span>\n\n    <span class=\"nd\">@app.call_tool<\/span><span class=\"p\">()<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">call_tool<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">arguments<\/span><span class=\"p\">:<\/span> <span class=\"nb\">dict<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nb\">list<\/span><span class=\"p\">[<\/span><span class=\"n\">mcp_types<\/span><span class=\"p\">.<\/span><span class=\"n\">TextContent<\/span><span class=\"p\">]:<\/span>\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Execute a tool call.<\/span><span class=\"sh\">\"\"\"<\/span>\n        <span class=\"c1\"># Map tool names to functions\n<\/span>        <span class=\"n\">tools<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">weather_tool<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"n\">weather_tool<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">time_tool<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"n\">time_tool<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"n\">name<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tools<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n                <span class=\"c1\"># Execute the tool\n<\/span>                <span class=\"n\">result<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">tools<\/span><span class=\"p\">[<\/span><span class=\"n\">name<\/span><span class=\"p\">].<\/span><span class=\"nf\">run_async<\/span><span class=\"p\">(<\/span>\n                    <span class=\"n\">args<\/span><span class=\"o\">=<\/span><span class=\"n\">arguments<\/span><span class=\"p\">,<\/span>\n                    <span class=\"n\">tool_context<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">,<\/span>\n                <span class=\"p\">)<\/span>\n                <span class=\"k\">return<\/span> <span class=\"p\">[<\/span><span class=\"n\">mcp_types<\/span><span class=\"p\">.<\/span><span class=\"nc\">TextContent<\/span><span class=\"p\">(<\/span><span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">text<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"nf\">dumps<\/span><span class=\"p\">(<\/span><span class=\"n\">result<\/span><span class=\"p\">))]<\/span>\n            <span class=\"k\">except<\/span> <span class=\"nb\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\n                <span class=\"k\">return<\/span> <span class=\"p\">[<\/span><span class=\"n\">mcp_types<\/span><span class=\"p\">.<\/span><span class=\"nc\">TextContent<\/span><span class=\"p\">(<\/span>\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">text<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> \n                    <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"nf\">dumps<\/span><span class=\"p\">({<\/span><span class=\"sh\">\"<\/span><span class=\"s\">error<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nf\">str<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span><span class=\"p\">)})<\/span>\n                <span class=\"p\">)]<\/span>\n        <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n            <span class=\"k\">return<\/span> <span class=\"p\">[<\/span><span class=\"n\">mcp_types<\/span><span class=\"p\">.<\/span><span class=\"nc\">TextContent<\/span><span class=\"p\">(<\/span>\n                <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">text<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> \n                <span class=\"n\">text<\/span><span class=\"o\">=<\/span><span class=\"n\">json<\/span><span class=\"p\">.<\/span><span class=\"nf\">dumps<\/span><span class=\"p\">({<\/span><span class=\"sh\">\"<\/span><span class=\"s\">error<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Tool <\/span><span class=\"sh\">'<\/span><span class=\"si\">{<\/span><span class=\"n\">name<\/span><span class=\"si\">}<\/span><span class=\"sh\">'<\/span><span class=\"s\"> not found<\/span><span class=\"sh\">\"<\/span><span class=\"p\">})<\/span>\n            <span class=\"p\">)]<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">app<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">run_mcp_server<\/span><span class=\"p\">():<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Run the MCP server over standard I\/O.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_mcp_server<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">with<\/span> <span class=\"n\">mcp<\/span><span class=\"p\">.<\/span><span class=\"n\">server<\/span><span class=\"p\">.<\/span><span class=\"n\">stdio<\/span><span class=\"p\">.<\/span><span class=\"nf\">stdio_server<\/span><span class=\"p\">()<\/span> <span class=\"nf\">as <\/span><span class=\"p\">(<\/span><span class=\"n\">read_stream<\/span><span class=\"p\">,<\/span> <span class=\"n\">write_stream<\/span><span class=\"p\">):<\/span>\n        <span class=\"k\">await<\/span> <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">read_stream<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">write_stream<\/span><span class=\"p\">,<\/span>\n            <span class=\"nc\">InitializationOptions<\/span><span class=\"p\">(<\/span>\n                <span class=\"n\">server_name<\/span><span class=\"o\">=<\/span><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">server_version<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">0.1.0<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">capabilities<\/span><span class=\"o\">=<\/span><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_capabilities<\/span><span class=\"p\">(),<\/span>\n            <span class=\"p\">),<\/span>\n        <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B4%D8%AA%DB%8C%D8%A8%D8%A7%D9%86%DB%8C_%D8%A7%D8%B2_%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86_%D8%AE%D8%B7_%D9%81%D8%B1%D9%85%D8%A7%D9%86_%D8%B1%D8%A7_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u062e\u0634 \u0627\u0635\u0644\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0647\u0631 \u062f\u0648 \u062d\u0627\u0644\u062a \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">__main__<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span>\n    <span class=\"c1\"># Parse command line arguments\n<\/span>    <span class=\"kn\">import<\/span> <span class=\"n\">argparse<\/span>\n    <span class=\"n\">parser<\/span> <span class=\"o\">=<\/span> <span class=\"n\">argparse<\/span><span class=\"p\">.<\/span><span class=\"nc\">ArgumentParser<\/span><span class=\"p\">(<\/span><span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">ADK Agent Server<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"nf\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">--mode<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">choices<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">web<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">mcp<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span> <span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">web<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\n                      <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Run as web server or MCP server (default: web)<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">args<\/span> <span class=\"o\">=<\/span> <span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse_args<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">mode<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">mcp<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span>\n        <span class=\"c1\"># Run as MCP server\n<\/span>        <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Starting MCP server mode...<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">asyncio<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nf\">run_mcp_server<\/span><span class=\"p\">())<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n        <span class=\"c1\"># Run as web server (default)\n<\/span>        <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Starting Web server mode...<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">uvicorn<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">app<\/span><span class=\"p\">,<\/span> \n            <span class=\"n\">host<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">0.0.0.0<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> \n            <span class=\"n\">port<\/span><span class=\"o\">=<\/span><span class=\"mi\">9999<\/span><span class=\"p\">,<\/span> \n            <span class=\"nb\">reload<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span>\n        <span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%D8%B4_%D8%B3%D8%B1%D9%88%D8%B1_MCP\"><\/span>\n<p>  \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u0631\u0648\u0631 MCP<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u062a\u0633\u062a \u0633\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>test_mcp_server.py<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">asyncio<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">subprocess<\/span>\n<span class=\"kn\">import<\/span> <span class=\"n\">time<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">google.adk.tools.mcp_tool<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">MCPToolset<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">mcp.client.stdio<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">StdioServerParameters<\/span>\n\n<span class=\"n\">API_SCRIPT_PATH<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">dirname<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"nf\">abspath<\/span><span class=\"p\">(<\/span><span class=\"n\">__file__<\/span><span class=\"p\">)),<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">api.py<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">test_mcp_server<\/span><span class=\"p\">():<\/span>\n    <span class=\"sh\">\"\"\"<\/span><span class=\"s\">Test the MCP server by checking tool availability.<\/span><span class=\"sh\">\"\"\"<\/span>\n    <span class=\"c1\"># Connect to MCP server\n<\/span>    <span class=\"n\">tools<\/span><span class=\"p\">,<\/span> <span class=\"n\">exit_stack<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">MCPToolset<\/span><span class=\"p\">.<\/span><span class=\"nf\">from_server<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">connection_params<\/span><span class=\"o\">=<\/span><span class=\"nc\">StdioServerParameters<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">command<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">python<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">args<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"n\">API_SCRIPT_PATH<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">--mode<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">mcp<\/span><span class=\"sh\">'<\/span><span class=\"p\">]<\/span>\n        <span class=\"p\">)<\/span>\n    <span class=\"p\">)<\/span>\n\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"c1\"># List available tools\n<\/span>        <span class=\"n\">tool_names<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">tool<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"k\">for<\/span> <span class=\"n\">tool<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tools<\/span><span class=\"p\">]<\/span>\n        <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Found <\/span><span class=\"si\">{<\/span><span class=\"nf\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">tool_names<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"s\"> tools: <\/span><span class=\"si\">{<\/span><span class=\"sh\">'<\/span><span class=\"s\">, <\/span><span class=\"sh\">'<\/span><span class=\"p\">.<\/span><span class=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">tool_names<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n\n        <span class=\"c1\"># Verify expected tools are available\n<\/span>        <span class=\"k\">if<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">get_weather<\/span><span class=\"sh\">\"<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tool_names<\/span> <span class=\"ow\">and<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">get_current_time<\/span><span class=\"sh\">\"<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">tool_names<\/span><span class=\"p\">:<\/span>\n            <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">SUCCESS: MCP server is working correctly!<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n            <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">WARNING: Not all expected tools were found!<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">finally<\/span><span class=\"p\">:<\/span>\n        <span class=\"k\">await<\/span> <span class=\"n\">exit_stack<\/span><span class=\"p\">.<\/span><span class=\"nf\">aclose<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">__main__<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">asyncio<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nf\">test_mcp_server<\/span><span class=\"p\">())<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0622\u0632\u0645\u0648\u0646 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>python test_mcp_server.py\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D8%B3%D8%B1%D9%88%D8%B1_MCP_%D8%AE%D9%88%D8%AF_%D8%A8%D8%A7_Claude_%DB%8C%D8%A7_%D8%B3%D8%A7%DB%8C%D8%B1_%D8%AF%D8%B3%D8%AA%DB%8C%D8%A7%D8%B1%D8%A7%D9%86_%D9%87%D9%88%D8%B4_%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C\"><\/span>\n<p>  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0633\u0631\u0648\u0631 MCP \u062e\u0648\u062f \u0628\u0627 Claude \u06cc\u0627 \u0633\u0627\u06cc\u0631 \u062f\u0633\u062a\u06cc\u0627\u0631\u0627\u0646 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u0633\u0631\u0648\u0631 MCP \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0622\u0646 \u0628\u0627 \u0647\u0631 \u062f\u0633\u062a\u06cc\u0627\u0631 AI \u0633\u0627\u0632\u06af\u0627\u0631 \u0628\u0627 MCP \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<ol>\n<li>\u0633\u0631\u0648\u0631 MCP \u062e\u0648\u062f \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>   python api.py <span class=\"nt\">--mode<\/span> mcp\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0633\u0631\u0648\u0631 MCP \u060c \u062f\u0633\u062a\u06cc\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062e\u0648\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u06a9\u0644\u0648\u062f) \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u062f\u0633\u06a9 \u062a\u0627\u067e Claude \u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0633\u0631\u0648\u0631 MCP \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u062e\u0648\u062f \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<\/li>\n<li>\n<p>\u062f\u0633\u062a\u06cc\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0642\u0627\u062f\u0631 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n<ul>\n<li>\u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u06a9\u0634\u0641 \u06a9\u0646\u06cc\u062f (get_weather \u0648 get_current_time)<\/li>\n<li>\u062f\u0631 \u0635\u0648\u0631\u062a \u0644\u0632\u0648\u0645 \u062f\u0631 \u0637\u0648\u0644 \u0645\u06a9\u0627\u0644\u0645\u0627\u062a \u0628\u0627 \u0627\u06cc\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B1%D9%88%D8%B4%D9%87%D8%A7\"><\/span>\n<p>  \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<strong>\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637<\/strong>: \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0648 \u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc API \u0631\u0627 \u062f\u0631 \u06cc\u06a9 <code>.env<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/li>\n<li>\n<strong>\u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<\/strong>: \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062e\u0637\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u062f\u0631 \u0647\u0631 \u062f\u0648 \u0627\u062c\u0631\u0627\u06cc \u0627\u0628\u0632\u0627\u0631<\/li>\n<li>\n<strong>\u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645<\/strong>: \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062c\u0627\u0645\u0639 \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0627\u0634\u06a9\u0627\u0644 \u0632\u062f\u0627\u06cc\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\n<strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a<\/strong>: \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\n<strong>\u062a\u0633\u062a<\/strong>: \u0628\u0631\u0627\u06cc \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0648 \u062a\u0633\u062a \u0647\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u062e\u0648\u062f \u0628\u0631\u0627\u06cc \u0646\u0642\u0627\u0637 \u067e\u0627\u06cc\u0627\u0646\u06cc \u062e\u0648\u062f \u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u0627\u062d\u062f \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B3%D8%A7%D8%A6%D9%84_%D9%88_%D8%B1%D8%A7%D9%87_%D8%AD%D9%84_%D9%87%D8%A7%DB%8C_%D9%85%D8%B4%D8%AA%D8%B1%DA%A9\"><\/span>\n<p>  \u0645\u0633\u0627\u0626\u0644 \u0648 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627\u06cc \u0645\u0634\u062a\u0631\u06a9<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<strong>\u0646\u0645\u0627\u06cc\u0646\u062f\u0647 \u062f\u0631 Fastapi \u06cc\u0627\u0641\u062a \u0646\u0634\u062f<\/strong>: \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f <code>AGENT_DIR<\/code> \u0631\u0648\u06cc \u0641\u0647\u0631\u0633\u062a \u0648\u0627\u0644\u062f\u06cc\u0646 \u062d\u0627\u0648\u06cc \u0632\u06cc\u0631 \u0645\u062c\u0645\u0648\u0639\u0647 \u0639\u0627\u0645\u0644 \u0634\u0645\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a<\/li>\n<li>\n<strong>\u062e\u0637\u0627\u0647\u0627\u06cc \u062a\u0628\u062f\u06cc\u0644 \u0627\u0628\u0632\u0627\u0631 MCP<\/strong>: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062a\u0648\u0627\u0628\u0639 \u0627\u0628\u0632\u0627\u0631 \u0634\u0645\u0627 \u062f\u0627\u0631\u0627\u06cc \u0646\u06a9\u0627\u062a \u0646\u0648\u0639 \u0645\u0646\u0627\u0633\u0628\u06cc \u0627\u0633\u062a<\/li>\n<li>\n<strong>\u062e\u0637\u0627\u0647\u0627\u06cc \u0648\u0627\u0631\u062f\u0627\u062a \u0645\u0627\u0698\u0648\u0644<\/strong>: \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f <code>__init__.py<\/code> \u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627 \u0627\u0634\u06cc\u0627\u0621 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0635\u0627\u062f\u0631 \u0645\u06cc \u06a9\u0646\u0646\u062f<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\"><\/span>\n<p>  \u067e\u0627\u06cc\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631 \u062f\u0627\u0631\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f:<\/p>\n<ol>\n<li>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0639\u0627\u0645\u0644 ADK \u0645\u0633\u062a\u0642\u0644 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 Fastapi \u0628\u0627 UI \u062e\u062f\u0645\u062a \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0633\u0631\u0648\u0631 MCP \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u06cc\u0627\u0631\u0627\u0646 AI \u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f<\/li>\n<\/ol>\n<p>\u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u062a\u0639\u062f\u062f \u0631\u0627 \u0627\u0632 \u0647\u0645\u0627\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u0628\u0647 \u0634\u0645\u0627 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0639\u0627\u0645\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0634\u0645\u0627 \u0645\u062a\u0646\u0648\u0639 \u062a\u0631 \u0648 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0627\u062f\u063a\u0627\u0645 \u06a9\u06cc\u062a \u062a\u0648\u0633\u0639\u0647 \u0639\u0627\u0645\u0644 Google (ADK) \u0628\u0627 FastAPI \u0648 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0632\u0645\u06cc\u0646\u0647 Model (MCP) \u067e\u06cc\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0633\u0627\u0633\u06cc ADK \u0634\u0631\u0648\u0639 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u060c \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631 \u0628\u0627 FastAPI \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc \u062f\u0647\u06cc\u0645 \u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06cc\u06a9 \u0633\u0631\u0648\u0631 MCP \u0631\u0627 \u0627\u0632 \u0647\u0645\u0627\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u06a9\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. &hellip;<\/p>\n","protected":false},"author":2,"featured_media":106089,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-106088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/106088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=106088"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/106088\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/106089"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=106088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=106088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=106088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}