google-adk 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- google/adk/__init__.py +20 -0
- google/adk/agents/__init__.py +32 -0
- google/adk/agents/active_streaming_tool.py +38 -0
- google/adk/agents/base_agent.py +345 -0
- google/adk/agents/callback_context.py +112 -0
- google/adk/agents/invocation_context.py +181 -0
- google/adk/agents/langgraph_agent.py +140 -0
- google/adk/agents/live_request_queue.py +64 -0
- google/adk/agents/llm_agent.py +376 -0
- google/adk/agents/loop_agent.py +62 -0
- google/adk/agents/parallel_agent.py +96 -0
- google/adk/agents/readonly_context.py +46 -0
- google/adk/agents/remote_agent.py +50 -0
- google/adk/agents/run_config.py +87 -0
- google/adk/agents/sequential_agent.py +45 -0
- google/adk/agents/transcription_entry.py +34 -0
- google/adk/artifacts/__init__.py +23 -0
- google/adk/artifacts/base_artifact_service.py +128 -0
- google/adk/artifacts/gcs_artifact_service.py +195 -0
- google/adk/artifacts/in_memory_artifact_service.py +133 -0
- google/adk/auth/__init__.py +22 -0
- google/adk/auth/auth_credential.py +220 -0
- google/adk/auth/auth_handler.py +268 -0
- google/adk/auth/auth_preprocessor.py +116 -0
- google/adk/auth/auth_schemes.py +67 -0
- google/adk/auth/auth_tool.py +55 -0
- google/adk/cli/__init__.py +15 -0
- google/adk/cli/__main__.py +18 -0
- google/adk/cli/agent_graph.py +122 -0
- google/adk/cli/browser/adk_favicon.svg +17 -0
- google/adk/cli/browser/assets/audio-processor.js +51 -0
- google/adk/cli/browser/assets/config/runtime-config.json +3 -0
- google/adk/cli/browser/index.html +33 -0
- google/adk/cli/browser/main-XUU6OGCC.js +75 -0
- google/adk/cli/browser/polyfills-FFHMD2TL.js +18 -0
- google/adk/cli/browser/styles-4VDSPQ37.css +17 -0
- google/adk/cli/cli.py +181 -0
- google/adk/cli/cli_deploy.py +181 -0
- google/adk/cli/cli_eval.py +282 -0
- google/adk/cli/cli_tools_click.py +479 -0
- google/adk/cli/fast_api.py +774 -0
- google/adk/cli/media_streamer/__init__.py +19 -0
- google/adk/cli/media_streamer/index.html +228 -0
- google/adk/cli/utils/__init__.py +49 -0
- google/adk/cli/utils/envs.py +57 -0
- google/adk/cli/utils/evals.py +93 -0
- google/adk/cli/utils/logs.py +72 -0
- google/adk/code_executors/__init__.py +49 -0
- google/adk/code_executors/base_code_executor.py +97 -0
- google/adk/code_executors/code_execution_utils.py +256 -0
- google/adk/code_executors/code_executor_context.py +202 -0
- google/adk/code_executors/container_code_executor.py +196 -0
- google/adk/code_executors/unsafe_local_code_executor.py +71 -0
- google/adk/code_executors/vertex_ai_code_executor.py +234 -0
- google/adk/evaluation/__init__.py +31 -0
- google/adk/evaluation/agent_evaluator.py +329 -0
- google/adk/evaluation/evaluation_constants.py +24 -0
- google/adk/evaluation/evaluation_generator.py +270 -0
- google/adk/evaluation/response_evaluator.py +135 -0
- google/adk/evaluation/trajectory_evaluator.py +184 -0
- google/adk/events/__init__.py +21 -0
- google/adk/events/event.py +130 -0
- google/adk/events/event_actions.py +55 -0
- google/adk/examples/__init__.py +28 -0
- google/adk/examples/base_example_provider.py +35 -0
- google/adk/examples/example.py +27 -0
- google/adk/examples/example_util.py +123 -0
- google/adk/examples/vertex_ai_example_store.py +104 -0
- google/adk/flows/__init__.py +14 -0
- google/adk/flows/llm_flows/__init__.py +20 -0
- google/adk/flows/llm_flows/_base_llm_processor.py +52 -0
- google/adk/flows/llm_flows/_code_execution.py +458 -0
- google/adk/flows/llm_flows/_nl_planning.py +129 -0
- google/adk/flows/llm_flows/agent_transfer.py +132 -0
- google/adk/flows/llm_flows/audio_transcriber.py +109 -0
- google/adk/flows/llm_flows/auto_flow.py +49 -0
- google/adk/flows/llm_flows/base_llm_flow.py +559 -0
- google/adk/flows/llm_flows/basic.py +72 -0
- google/adk/flows/llm_flows/contents.py +370 -0
- google/adk/flows/llm_flows/functions.py +486 -0
- google/adk/flows/llm_flows/identity.py +47 -0
- google/adk/flows/llm_flows/instructions.py +137 -0
- google/adk/flows/llm_flows/single_flow.py +57 -0
- google/adk/memory/__init__.py +35 -0
- google/adk/memory/base_memory_service.py +74 -0
- google/adk/memory/in_memory_memory_service.py +62 -0
- google/adk/memory/vertex_ai_rag_memory_service.py +177 -0
- google/adk/models/__init__.py +31 -0
- google/adk/models/anthropic_llm.py +243 -0
- google/adk/models/base_llm.py +87 -0
- google/adk/models/base_llm_connection.py +76 -0
- google/adk/models/gemini_llm_connection.py +200 -0
- google/adk/models/google_llm.py +331 -0
- google/adk/models/lite_llm.py +673 -0
- google/adk/models/llm_request.py +98 -0
- google/adk/models/llm_response.py +111 -0
- google/adk/models/registry.py +102 -0
- google/adk/planners/__init__.py +23 -0
- google/adk/planners/base_planner.py +66 -0
- google/adk/planners/built_in_planner.py +75 -0
- google/adk/planners/plan_re_act_planner.py +208 -0
- google/adk/runners.py +456 -0
- google/adk/sessions/__init__.py +41 -0
- google/adk/sessions/base_session_service.py +133 -0
- google/adk/sessions/database_session_service.py +522 -0
- google/adk/sessions/in_memory_session_service.py +206 -0
- google/adk/sessions/session.py +54 -0
- google/adk/sessions/state.py +71 -0
- google/adk/sessions/vertex_ai_session_service.py +356 -0
- google/adk/telemetry.py +189 -0
- google/adk/tests/__init__.py +14 -0
- google/adk/tests/integration/.env.example +10 -0
- google/adk/tests/integration/__init__.py +18 -0
- google/adk/tests/integration/conftest.py +119 -0
- google/adk/tests/integration/fixture/__init__.py +14 -0
- google/adk/tests/integration/fixture/agent_with_config/__init__.py +15 -0
- google/adk/tests/integration/fixture/agent_with_config/agent.py +88 -0
- google/adk/tests/integration/fixture/callback_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/callback_agent/agent.py +105 -0
- google/adk/tests/integration/fixture/context_update_test/OWNERS +1 -0
- google/adk/tests/integration/fixture/context_update_test/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_update_test/agent.py +43 -0
- google/adk/tests/integration/fixture/context_update_test/successful_test.session.json +582 -0
- google/adk/tests/integration/fixture/context_variable_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/context_variable_agent/agent.py +115 -0
- google/adk/tests/integration/fixture/customer_support_ma/__init__.py +15 -0
- google/adk/tests/integration/fixture/customer_support_ma/agent.py +172 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/agent.py +338 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/order_query.test.json +69 -0
- google/adk/tests/integration/fixture/ecommerce_customer_service_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/flow_complex_spark/__init__.py +15 -0
- google/adk/tests/integration/fixture/flow_complex_spark/agent.py +182 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.debug.log +243 -0
- google/adk/tests/integration/fixture/flow_complex_spark/sample.session.json +190 -0
- google/adk/tests/integration/fixture/hello_world_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/hello_world_agent/agent.py +95 -0
- google/adk/tests/integration/fixture/hello_world_agent/roll_die.test.json +24 -0
- google/adk/tests/integration/fixture/hello_world_agent/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/home_automation_agent/agent.py +304 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/dependent_tool_calls.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/eval_data.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/memorizing_past_events/test_config.json +6 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_multi_turn_conversation.test.json +18 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test.test.json +17 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/simple_test2.test.json +5 -0
- google/adk/tests/integration/fixture/home_automation_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/tool_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/tool_agent/agent.py +218 -0
- google/adk/tests/integration/fixture/tool_agent/files/Agent_test_plan.pdf +0 -0
- google/adk/tests/integration/fixture/trip_planner_agent/__init__.py +15 -0
- google/adk/tests/integration/fixture/trip_planner_agent/agent.py +110 -0
- google/adk/tests/integration/fixture/trip_planner_agent/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/initial.session.json +13 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/test_config.json +5 -0
- google/adk/tests/integration/fixture/trip_planner_agent/test_files/trip_inquiry_sub_agent.test.json +7 -0
- google/adk/tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json +19 -0
- google/adk/tests/integration/models/__init__.py +14 -0
- google/adk/tests/integration/models/test_google_llm.py +65 -0
- google/adk/tests/integration/test_callback.py +70 -0
- google/adk/tests/integration/test_context_variable.py +67 -0
- google/adk/tests/integration/test_evalute_agent_in_fixture.py +76 -0
- google/adk/tests/integration/test_multi_agent.py +28 -0
- google/adk/tests/integration/test_multi_turn.py +42 -0
- google/adk/tests/integration/test_single_agent.py +23 -0
- google/adk/tests/integration/test_sub_agent.py +26 -0
- google/adk/tests/integration/test_system_instruction.py +177 -0
- google/adk/tests/integration/test_tools.py +287 -0
- google/adk/tests/integration/test_with_test_file.py +34 -0
- google/adk/tests/integration/tools/__init__.py +14 -0
- google/adk/tests/integration/utils/__init__.py +16 -0
- google/adk/tests/integration/utils/asserts.py +75 -0
- google/adk/tests/integration/utils/test_runner.py +97 -0
- google/adk/tests/unittests/__init__.py +14 -0
- google/adk/tests/unittests/agents/__init__.py +14 -0
- google/adk/tests/unittests/agents/test_base_agent.py +407 -0
- google/adk/tests/unittests/agents/test_langgraph_agent.py +191 -0
- google/adk/tests/unittests/agents/test_llm_agent_callbacks.py +138 -0
- google/adk/tests/unittests/agents/test_llm_agent_fields.py +231 -0
- google/adk/tests/unittests/agents/test_loop_agent.py +136 -0
- google/adk/tests/unittests/agents/test_parallel_agent.py +92 -0
- google/adk/tests/unittests/agents/test_sequential_agent.py +114 -0
- google/adk/tests/unittests/artifacts/__init__.py +14 -0
- google/adk/tests/unittests/artifacts/test_artifact_service.py +276 -0
- google/adk/tests/unittests/auth/test_auth_handler.py +575 -0
- google/adk/tests/unittests/conftest.py +73 -0
- google/adk/tests/unittests/fast_api/__init__.py +14 -0
- google/adk/tests/unittests/fast_api/test_fast_api.py +269 -0
- google/adk/tests/unittests/flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/__init__.py +14 -0
- google/adk/tests/unittests/flows/llm_flows/_test_examples.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_agent_transfer.py +311 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_long_running.py +244 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_request_euc.py +346 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_sequential.py +93 -0
- google/adk/tests/unittests/flows/llm_flows/test_functions_simple.py +258 -0
- google/adk/tests/unittests/flows/llm_flows/test_identity.py +66 -0
- google/adk/tests/unittests/flows/llm_flows/test_instructions.py +164 -0
- google/adk/tests/unittests/flows/llm_flows/test_model_callbacks.py +142 -0
- google/adk/tests/unittests/flows/llm_flows/test_other_configs.py +46 -0
- google/adk/tests/unittests/flows/llm_flows/test_tool_callbacks.py +269 -0
- google/adk/tests/unittests/models/__init__.py +14 -0
- google/adk/tests/unittests/models/test_google_llm.py +224 -0
- google/adk/tests/unittests/models/test_litellm.py +804 -0
- google/adk/tests/unittests/models/test_models.py +60 -0
- google/adk/tests/unittests/sessions/__init__.py +14 -0
- google/adk/tests/unittests/sessions/test_session_service.py +227 -0
- google/adk/tests/unittests/sessions/test_vertex_ai_session_service.py +246 -0
- google/adk/tests/unittests/streaming/__init__.py +14 -0
- google/adk/tests/unittests/streaming/test_streaming.py +50 -0
- google/adk/tests/unittests/tools/__init__.py +14 -0
- google/adk/tests/unittests/tools/apihub_tool/clients/test_apihub_client.py +499 -0
- google/adk/tests/unittests/tools/apihub_tool/test_apihub_toolset.py +204 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_connections_client.py +600 -0
- google/adk/tests/unittests/tools/application_integration_tool/clients/test_integration_client.py +630 -0
- google/adk/tests/unittests/tools/application_integration_tool/test_application_integration_toolset.py +345 -0
- google/adk/tests/unittests/tools/google_api_tool/__init__.py +13 -0
- google/adk/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +657 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_auto_auth_credential_exchanger.py +145 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_base_auth_credential_exchanger.py +68 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_oauth2_exchanger.py +153 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/credential_exchangers/test_service_account_exchanger.py +196 -0
- google/adk/tests/unittests/tools/openapi_tool/auth/test_auth_helper.py +573 -0
- google/adk/tests/unittests/tools/openapi_tool/common/test_common.py +436 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +1367 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_spec_parser.py +628 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +139 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_operation_parser.py +406 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +966 -0
- google/adk/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +201 -0
- google/adk/tests/unittests/tools/retrieval/__init__.py +14 -0
- google/adk/tests/unittests/tools/retrieval/test_vertex_ai_rag_retrieval.py +147 -0
- google/adk/tests/unittests/tools/test_agent_tool.py +167 -0
- google/adk/tests/unittests/tools/test_base_tool.py +141 -0
- google/adk/tests/unittests/tools/test_build_function_declaration.py +277 -0
- google/adk/tests/unittests/utils.py +304 -0
- google/adk/tools/__init__.py +51 -0
- google/adk/tools/_automatic_function_calling_util.py +346 -0
- google/adk/tools/agent_tool.py +176 -0
- google/adk/tools/apihub_tool/__init__.py +19 -0
- google/adk/tools/apihub_tool/apihub_toolset.py +209 -0
- google/adk/tools/apihub_tool/clients/__init__.py +13 -0
- google/adk/tools/apihub_tool/clients/apihub_client.py +332 -0
- google/adk/tools/apihub_tool/clients/secret_client.py +115 -0
- google/adk/tools/application_integration_tool/__init__.py +19 -0
- google/adk/tools/application_integration_tool/application_integration_toolset.py +230 -0
- google/adk/tools/application_integration_tool/clients/connections_client.py +903 -0
- google/adk/tools/application_integration_tool/clients/integration_client.py +253 -0
- google/adk/tools/base_tool.py +144 -0
- google/adk/tools/built_in_code_execution_tool.py +59 -0
- google/adk/tools/crewai_tool.py +72 -0
- google/adk/tools/example_tool.py +62 -0
- google/adk/tools/exit_loop_tool.py +23 -0
- google/adk/tools/function_parameter_parse_util.py +307 -0
- google/adk/tools/function_tool.py +87 -0
- google/adk/tools/get_user_choice_tool.py +28 -0
- google/adk/tools/google_api_tool/__init__.py +14 -0
- google/adk/tools/google_api_tool/google_api_tool.py +59 -0
- google/adk/tools/google_api_tool/google_api_tool_set.py +107 -0
- google/adk/tools/google_api_tool/google_api_tool_sets.py +55 -0
- google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +521 -0
- google/adk/tools/google_search_tool.py +68 -0
- google/adk/tools/langchain_tool.py +86 -0
- google/adk/tools/load_artifacts_tool.py +113 -0
- google/adk/tools/load_memory_tool.py +58 -0
- google/adk/tools/load_web_page.py +41 -0
- google/adk/tools/long_running_tool.py +39 -0
- google/adk/tools/mcp_tool/__init__.py +42 -0
- google/adk/tools/mcp_tool/conversion_utils.py +161 -0
- google/adk/tools/mcp_tool/mcp_tool.py +113 -0
- google/adk/tools/mcp_tool/mcp_toolset.py +272 -0
- google/adk/tools/openapi_tool/__init__.py +21 -0
- google/adk/tools/openapi_tool/auth/__init__.py +19 -0
- google/adk/tools/openapi_tool/auth/auth_helpers.py +498 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +25 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +105 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +55 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +117 -0
- google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +97 -0
- google/adk/tools/openapi_tool/common/__init__.py +19 -0
- google/adk/tools/openapi_tool/common/common.py +300 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +32 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +231 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +144 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +260 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +496 -0
- google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +268 -0
- google/adk/tools/preload_memory_tool.py +72 -0
- google/adk/tools/retrieval/__init__.py +36 -0
- google/adk/tools/retrieval/base_retrieval_tool.py +37 -0
- google/adk/tools/retrieval/files_retrieval.py +33 -0
- google/adk/tools/retrieval/llama_index_retrieval.py +41 -0
- google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +107 -0
- google/adk/tools/tool_context.py +90 -0
- google/adk/tools/toolbox_tool.py +46 -0
- google/adk/tools/transfer_to_agent_tool.py +21 -0
- google/adk/tools/vertex_ai_search_tool.py +96 -0
- google/adk/version.py +16 -0
- google_adk-0.0.1.dist-info/LICENSE.txt → google_adk-0.0.2.dist-info/LICENSE +32 -0
- google_adk-0.0.2.dist-info/METADATA +73 -0
- google_adk-0.0.2.dist-info/RECORD +308 -0
- {google_adk-0.0.1.dist-info → google_adk-0.0.2.dist-info}/WHEEL +1 -2
- google_adk-0.0.2.dist-info/entry_points.txt +3 -0
- agent_kit/__init__.py +0 -0
- google_adk-0.0.1.dist-info/METADATA +0 -15
- google_adk-0.0.1.dist-info/RECORD +0 -6
- google_adk-0.0.1.dist-info/top_level.txt +0 -1
@@ -0,0 +1,272 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from contextlib import AsyncExitStack
|
16
|
+
from types import TracebackType
|
17
|
+
from typing import Any, List, Optional, Tuple, Type
|
18
|
+
|
19
|
+
# Attempt to import MCP Tool from the MCP library, and hints user to upgrade
|
20
|
+
# their Python version to 3.10 if it fails.
|
21
|
+
try:
|
22
|
+
from mcp import ClientSession, StdioServerParameters
|
23
|
+
from mcp.client.sse import sse_client
|
24
|
+
from mcp.client.stdio import stdio_client
|
25
|
+
from mcp.types import ListToolsResult
|
26
|
+
except ImportError as e:
|
27
|
+
import sys
|
28
|
+
|
29
|
+
if sys.version_info < (3, 10):
|
30
|
+
raise ImportError(
|
31
|
+
'MCP Tool requires Python 3.10 or above. Please upgrade your Python'
|
32
|
+
' version.'
|
33
|
+
) from e
|
34
|
+
else:
|
35
|
+
raise e
|
36
|
+
|
37
|
+
from pydantic import BaseModel
|
38
|
+
|
39
|
+
from .mcp_tool import MCPTool
|
40
|
+
|
41
|
+
|
42
|
+
class SseServerParams(BaseModel):
|
43
|
+
url: str
|
44
|
+
headers: dict[str, Any] | None = None
|
45
|
+
timeout: float = 5
|
46
|
+
sse_read_timeout: float = 60 * 5
|
47
|
+
|
48
|
+
|
49
|
+
class MCPToolset:
|
50
|
+
"""Connects to a MCP Server, and retrieves MCP Tools into ADK Tools.
|
51
|
+
|
52
|
+
Usage:
|
53
|
+
Example 1: (using from_server helper):
|
54
|
+
```
|
55
|
+
async def load_tools():
|
56
|
+
return await MCPToolset.from_server(
|
57
|
+
connection_params=StdioServerParameters(
|
58
|
+
command='npx',
|
59
|
+
args=["-y", "@modelcontextprotocol/server-filesystem"],
|
60
|
+
)
|
61
|
+
)
|
62
|
+
|
63
|
+
# Use the tools in an LLM agent
|
64
|
+
tools, exit_stack = await load_tools()
|
65
|
+
agent = LlmAgent(
|
66
|
+
tools=tools
|
67
|
+
)
|
68
|
+
...
|
69
|
+
await exit_stack.aclose()
|
70
|
+
```
|
71
|
+
|
72
|
+
Example 2: (using `async with`):
|
73
|
+
|
74
|
+
```
|
75
|
+
async def load_tools():
|
76
|
+
async with MCPToolset(
|
77
|
+
connection_params=SseServerParams(url="http://0.0.0.0:8090/sse")
|
78
|
+
) as toolset:
|
79
|
+
tools = await toolset.load_tools()
|
80
|
+
|
81
|
+
agent = LlmAgent(
|
82
|
+
...
|
83
|
+
tools=tools
|
84
|
+
)
|
85
|
+
```
|
86
|
+
|
87
|
+
Example 3: (provide AsyncExitStack):
|
88
|
+
```
|
89
|
+
async def load_tools():
|
90
|
+
async_exit_stack = AsyncExitStack()
|
91
|
+
toolset = MCPToolset(
|
92
|
+
connection_params=StdioServerParameters(...),
|
93
|
+
)
|
94
|
+
async_exit_stack.enter_async_context(toolset)
|
95
|
+
tools = await toolset.load_tools()
|
96
|
+
agent = LlmAgent(
|
97
|
+
...
|
98
|
+
tools=tools
|
99
|
+
)
|
100
|
+
...
|
101
|
+
await async_exit_stack.aclose()
|
102
|
+
|
103
|
+
```
|
104
|
+
|
105
|
+
Attributes:
|
106
|
+
connection_params: The connection parameters to the MCP server. Can be
|
107
|
+
either `StdioServerParameters` or `SseServerParams`.
|
108
|
+
exit_stack: The async exit stack to manage the connection to the MCP server.
|
109
|
+
session: The MCP session being initialized with the connection.
|
110
|
+
"""
|
111
|
+
|
112
|
+
def __init__(
|
113
|
+
self, *, connection_params: StdioServerParameters | SseServerParams
|
114
|
+
):
|
115
|
+
"""Initializes the MCPToolset.
|
116
|
+
|
117
|
+
Usage:
|
118
|
+
Example 1: (using from_server helper):
|
119
|
+
```
|
120
|
+
async def load_tools():
|
121
|
+
return await MCPToolset.from_server(
|
122
|
+
connection_params=StdioServerParameters(
|
123
|
+
command='npx',
|
124
|
+
args=["-y", "@modelcontextprotocol/server-filesystem"],
|
125
|
+
)
|
126
|
+
)
|
127
|
+
|
128
|
+
# Use the tools in an LLM agent
|
129
|
+
tools, exit_stack = await load_tools()
|
130
|
+
agent = LlmAgent(
|
131
|
+
tools=tools
|
132
|
+
)
|
133
|
+
...
|
134
|
+
await exit_stack.aclose()
|
135
|
+
```
|
136
|
+
|
137
|
+
Example 2: (using `async with`):
|
138
|
+
|
139
|
+
```
|
140
|
+
async def load_tools():
|
141
|
+
async with MCPToolset(
|
142
|
+
connection_params=SseServerParams(url="http://0.0.0.0:8090/sse")
|
143
|
+
) as toolset:
|
144
|
+
tools = await toolset.load_tools()
|
145
|
+
|
146
|
+
agent = LlmAgent(
|
147
|
+
...
|
148
|
+
tools=tools
|
149
|
+
)
|
150
|
+
```
|
151
|
+
|
152
|
+
Example 3: (provide AsyncExitStack):
|
153
|
+
```
|
154
|
+
async def load_tools():
|
155
|
+
async_exit_stack = AsyncExitStack()
|
156
|
+
toolset = MCPToolset(
|
157
|
+
connection_params=StdioServerParameters(...),
|
158
|
+
)
|
159
|
+
async_exit_stack.enter_async_context(toolset)
|
160
|
+
tools = await toolset.load_tools()
|
161
|
+
agent = LlmAgent(
|
162
|
+
...
|
163
|
+
tools=tools
|
164
|
+
)
|
165
|
+
...
|
166
|
+
await async_exit_stack.aclose()
|
167
|
+
|
168
|
+
```
|
169
|
+
|
170
|
+
Args:
|
171
|
+
connection_params: The connection parameters to the MCP server. Can be:
|
172
|
+
`StdioServerParameters` for using local mcp server (e.g. using `npx` or
|
173
|
+
`python3`); or `SseServerParams` for a local/remote SSE server.
|
174
|
+
"""
|
175
|
+
if not connection_params:
|
176
|
+
raise ValueError('Missing connection params in MCPToolset.')
|
177
|
+
self.connection_params = connection_params
|
178
|
+
self.exit_stack = AsyncExitStack()
|
179
|
+
|
180
|
+
@classmethod
|
181
|
+
async def from_server(
|
182
|
+
cls,
|
183
|
+
*,
|
184
|
+
connection_params: StdioServerParameters | SseServerParams,
|
185
|
+
async_exit_stack: Optional[AsyncExitStack] = None,
|
186
|
+
) -> Tuple[List[MCPTool], AsyncExitStack]:
|
187
|
+
"""Retrieve all tools from the MCP connection.
|
188
|
+
|
189
|
+
Usage:
|
190
|
+
```
|
191
|
+
async def load_tools():
|
192
|
+
tools, exit_stack = await MCPToolset.from_server(
|
193
|
+
connection_params=StdioServerParameters(
|
194
|
+
command='npx',
|
195
|
+
args=["-y", "@modelcontextprotocol/server-filesystem"],
|
196
|
+
)
|
197
|
+
)
|
198
|
+
```
|
199
|
+
|
200
|
+
Args:
|
201
|
+
connection_params: The connection parameters to the MCP server.
|
202
|
+
async_exit_stack: The async exit stack to use. If not provided, a new
|
203
|
+
AsyncExitStack will be created.
|
204
|
+
|
205
|
+
Returns:
|
206
|
+
A tuple of the list of MCPTools and the AsyncExitStack.
|
207
|
+
- tools: The list of MCPTools.
|
208
|
+
- async_exit_stack: The AsyncExitStack used to manage the connection to
|
209
|
+
the MCP server. Use `await async_exit_stack.aclose()` to close the
|
210
|
+
connection when server shuts down.
|
211
|
+
"""
|
212
|
+
toolset = cls(connection_params=connection_params)
|
213
|
+
async_exit_stack = async_exit_stack or AsyncExitStack()
|
214
|
+
await async_exit_stack.enter_async_context(toolset)
|
215
|
+
tools = await toolset.load_tools()
|
216
|
+
return (tools, async_exit_stack)
|
217
|
+
|
218
|
+
async def _initialize(self) -> ClientSession:
|
219
|
+
"""Connects to the MCP Server and initializes the ClientSession."""
|
220
|
+
if isinstance(self.connection_params, StdioServerParameters):
|
221
|
+
client = stdio_client(self.connection_params)
|
222
|
+
elif isinstance(self.connection_params, SseServerParams):
|
223
|
+
client = sse_client(
|
224
|
+
url=self.connection_params.url,
|
225
|
+
headers=self.connection_params.headers,
|
226
|
+
timeout=self.connection_params.timeout,
|
227
|
+
sse_read_timeout=self.connection_params.sse_read_timeout,
|
228
|
+
)
|
229
|
+
else:
|
230
|
+
raise ValueError(
|
231
|
+
'Unable to initialize connection. Connection should be'
|
232
|
+
' StdioServerParameters or SseServerParams, but got'
|
233
|
+
f' {self.connection_params}'
|
234
|
+
)
|
235
|
+
|
236
|
+
transports = await self.exit_stack.enter_async_context(client)
|
237
|
+
self.session = await self.exit_stack.enter_async_context(
|
238
|
+
ClientSession(*transports)
|
239
|
+
)
|
240
|
+
await self.session.initialize()
|
241
|
+
return self.session
|
242
|
+
|
243
|
+
async def _exit(self):
|
244
|
+
"""Closes the connection to MCP Server."""
|
245
|
+
await self.exit_stack.aclose()
|
246
|
+
|
247
|
+
async def load_tools(self) -> List[MCPTool]:
|
248
|
+
"""Loads all tools from the MCP Server.
|
249
|
+
|
250
|
+
Returns:
|
251
|
+
A list of MCPTools imported from the MCP Server.
|
252
|
+
"""
|
253
|
+
tools_response: ListToolsResult = await self.session.list_tools()
|
254
|
+
return [
|
255
|
+
MCPTool(mcp_tool=tool, mcp_session=self.session)
|
256
|
+
for tool in tools_response.tools
|
257
|
+
]
|
258
|
+
|
259
|
+
async def __aenter__(self):
|
260
|
+
try:
|
261
|
+
await self._initialize()
|
262
|
+
return self
|
263
|
+
except Exception as e:
|
264
|
+
raise e
|
265
|
+
|
266
|
+
async def __aexit__(
|
267
|
+
self,
|
268
|
+
exc_type: Optional[Type[BaseException]],
|
269
|
+
exc: Optional[BaseException],
|
270
|
+
tb: Optional[TracebackType],
|
271
|
+
) -> None:
|
272
|
+
await self._exit()
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from .openapi_spec_parser import OpenAPIToolset
|
16
|
+
from .openapi_spec_parser import RestApiTool
|
17
|
+
|
18
|
+
__all__ = [
|
19
|
+
'OpenAPIToolset',
|
20
|
+
'RestApiTool',
|
21
|
+
]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright 2025 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from . import auth_helpers
|
16
|
+
|
17
|
+
__all__ = [
|
18
|
+
'auth_helpers',
|
19
|
+
]
|