fast-agent-mcp 0.2.54__tar.gz → 0.2.56__tar.gz

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.

Potentially problematic release.


This version of fast-agent-mcp might be problematic. Click here for more details.

Files changed (260) hide show
  1. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/PKG-INFO +4 -18
  2. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/pyproject.toml +4 -8
  3. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/base_agent.py +63 -6
  4. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/go.py +3 -3
  5. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/enhanced_prompt.py +1 -0
  6. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/model_database.py +4 -1
  7. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +7 -4
  8. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +1 -0
  9. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_groq.py +59 -30
  10. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_openai.py +6 -7
  11. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/interfaces.py +3 -1
  12. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/mcp_aggregator.py +58 -7
  13. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/.gitignore +0 -0
  14. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/LICENSE +0 -0
  15. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/README.md +0 -0
  16. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/azure-openai/fastagent.config.yaml +0 -0
  17. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/bedrock/fast-agent.config.yaml +0 -0
  18. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/custom-agents/agent.py +0 -0
  19. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/custom-agents/fastagent.config.yaml +0 -0
  20. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/data-analysis/analysis-campaign.py +0 -0
  21. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/data-analysis/analysis.py +0 -0
  22. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/data-analysis/fastagent.config.yaml +0 -0
  23. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  24. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  25. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  26. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  27. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  28. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  29. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/forms_demo.py +0 -0
  30. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/game_character.py +0 -0
  31. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/game_character_handler.py +0 -0
  32. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/elicitations/tool_call.py +0 -0
  33. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  34. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  35. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  36. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  37. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/state-transfer/agent_one.py +0 -0
  38. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/state-transfer/agent_two.py +0 -0
  39. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  40. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  41. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/vision-examples/cat.png +0 -0
  42. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/vision-examples/example1.py +0 -0
  43. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/vision-examples/example2.py +0 -0
  44. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/vision-examples/example3.py +0 -0
  45. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  46. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/otel/agent.py +0 -0
  47. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/otel/agent2.py +0 -0
  48. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/otel/docker-compose.yaml +0 -0
  49. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/otel/fastagent.config.yaml +0 -0
  50. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/researcher/fastagent.config.yaml +0 -0
  51. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/researcher/researcher-eval.py +0 -0
  52. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/researcher/researcher-imp.py +0 -0
  53. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/researcher/researcher.py +0 -0
  54. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/.env.sample +0 -0
  55. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/Makefile +0 -0
  56. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/README.md +0 -0
  57. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/agent.py +0 -0
  58. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/demo_images/clam.jpg +0 -0
  59. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/demo_images/crab.png +0 -0
  60. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/demo_images/shrimp.png +0 -0
  61. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/docker-compose.yml +0 -0
  62. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/fastagent.config.yaml +0 -0
  63. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/image_demo.py +0 -0
  64. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  65. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  66. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  67. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  68. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/simple_agent.py +0 -0
  69. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  70. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  71. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  72. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/chaining.py +0 -0
  73. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/evaluator.py +0 -0
  74. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/fastagent.config.yaml +0 -0
  75. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/graded_report.md +0 -0
  76. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/human_input.py +0 -0
  77. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/orchestrator.py +0 -0
  78. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/parallel.py +0 -0
  79. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/router.py +0 -0
  80. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/short_story.md +0 -0
  81. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/examples/workflows/short_story.txt +0 -0
  82. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/hatch_build.py +0 -0
  83. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/__init__.py +0 -0
  84. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/__init__.py +0 -0
  85. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/agent.py +0 -0
  86. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  87. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  88. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  89. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/iterative_planner.py +0 -0
  90. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  91. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  92. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  93. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  94. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  95. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/app.py +0 -0
  96. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/__init__.py +0 -0
  97. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/__main__.py +0 -0
  98. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/check_config.py +0 -0
  99. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  100. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
  101. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/setup.py +0 -0
  102. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  103. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/constants.py +0 -0
  104. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/main.py +0 -0
  105. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/cli/terminal.py +0 -0
  106. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/config.py +0 -0
  107. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/console.py +0 -0
  108. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/context.py +0 -0
  109. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/context_dependent.py +0 -0
  110. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/__init__.py +0 -0
  111. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/agent_app.py +0 -0
  112. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/agent_types.py +0 -0
  113. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/direct_decorators.py +0 -0
  114. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/direct_factory.py +0 -0
  115. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/error_handling.py +0 -0
  116. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/exceptions.py +0 -0
  117. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/fastagent.py +0 -0
  118. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/interactive_prompt.py +0 -0
  119. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/mcp_content.py +0 -0
  120. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/mermaid_utils.py +0 -0
  121. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/prompt.py +0 -0
  122. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/request_params.py +0 -0
  123. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/usage_display.py +0 -0
  124. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/core/validation.py +0 -0
  125. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/event_progress.py +0 -0
  126. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/executor/__init__.py +0 -0
  127. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/executor/executor.py +0 -0
  128. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/executor/task_registry.py +0 -0
  129. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/executor/workflow_signal.py +0 -0
  130. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/__init__.py +0 -0
  131. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/elicitation_form.py +0 -0
  132. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
  133. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
  134. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/elicitation_state.py +0 -0
  135. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/form_fields.py +0 -0
  136. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/handler.py +0 -0
  137. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/simple_form.py +0 -0
  138. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/human_input/types.py +0 -0
  139. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/__init__.py +0 -0
  140. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/augmented_llm.py +0 -0
  141. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  142. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  143. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
  144. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  145. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/memory.py +0 -0
  146. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/model_factory.py +0 -0
  147. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/prompt_utils.py +0 -0
  148. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/provider_key_manager.py +0 -0
  149. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/provider_types.py +0 -0
  150. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/__init__.py +0 -0
  151. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  152. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -0
  153. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
  154. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  155. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  156. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
  157. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  158. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  159. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_tensorzero_openai.py +0 -0
  160. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
  161. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  162. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  163. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  164. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  165. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  166. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  167. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  168. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/sampling_converter.py +0 -0
  169. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  170. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/llm/usage_tracking.py +0 -0
  171. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/__init__.py +0 -0
  172. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/events.py +0 -0
  173. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/json_serializer.py +0 -0
  174. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/listeners.py +0 -0
  175. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/logger.py +0 -0
  176. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/rich_progress.py +0 -0
  177. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/logging/transport.py +0 -0
  178. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/__init__.py +0 -0
  179. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/common.py +0 -0
  180. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
  181. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
  182. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/gen_client.py +0 -0
  183. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  184. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  185. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  186. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/hf_auth.py +0 -0
  187. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/logger_textio.py +0 -0
  188. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  189. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  190. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/mime_utils.py +0 -0
  191. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  192. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompt_render.py +0 -0
  193. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  194. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  195. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  196. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  197. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  198. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  199. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  200. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  201. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/resource_utils.py +0 -0
  202. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp/sampling.py +0 -0
  203. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp_server/__init__.py +0 -0
  204. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  205. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/mcp_server_registry.py +0 -0
  206. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/progress_display.py +0 -0
  207. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/py.typed +0 -0
  208. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  209. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  210. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  211. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  212. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  213. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  214. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  215. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  216. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  217. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  218. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  219. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  220. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  221. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  222. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  223. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  224. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  225. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  226. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  227. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  228. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  229. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/.env.sample +0 -0
  230. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/Makefile +0 -0
  231. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/README.md +0 -0
  232. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/agent.py +0 -0
  233. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  234. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  235. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  236. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  237. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  238. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/image_demo.py +0 -0
  239. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  240. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  241. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  242. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  243. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  244. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  245. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  246. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  247. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  248. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  249. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  250. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  251. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
  252. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  253. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  254. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  255. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  256. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
  257. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  258. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/tools/tool_definition.py +0 -0
  259. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/ui/console_display.py +0 -0
  260. {fast_agent_mcp-0.2.54 → fast_agent_mcp-0.2.56}/src/mcp_agent/ui/console_display_legacy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.54
3
+ Version: 0.2.56
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>
6
6
  License: Apache License
@@ -211,15 +211,15 @@ Classifier: Programming Language :: Python :: 3
211
211
  Requires-Python: >=3.13
212
212
  Requires-Dist: a2a-sdk>=0.3.0
213
213
  Requires-Dist: aiohttp>=3.11.13
214
- Requires-Dist: anthropic>=0.59.0
214
+ Requires-Dist: anthropic>=0.63.0
215
215
  Requires-Dist: azure-identity>=1.14.0
216
216
  Requires-Dist: boto3>=1.35.0
217
217
  Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
220
  Requires-Dist: google-genai>=1.27.0
221
- Requires-Dist: mcp==1.12.1
222
- Requires-Dist: openai>=1.97.1
221
+ Requires-Dist: mcp==1.12.4
222
+ Requires-Dist: openai>=1.99.9
223
223
  Requires-Dist: opentelemetry-distro>=0.55b0
224
224
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
225
225
  Requires-Dist: opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'
@@ -234,20 +234,6 @@ Requires-Dist: pyyaml>=6.0.2
234
234
  Requires-Dist: rich>=14.1.0
235
235
  Requires-Dist: tensorzero>=2025.7.5
236
236
  Requires-Dist: typer>=0.15.1
237
- Provides-Extra: azure
238
- Requires-Dist: azure-identity>=1.14.0; extra == 'azure'
239
- Provides-Extra: dev
240
- Requires-Dist: anthropic>=0.42.0; extra == 'dev'
241
- Requires-Dist: pre-commit>=4.0.1; extra == 'dev'
242
- Requires-Dist: pydantic>=2.10.4; extra == 'dev'
243
- Requires-Dist: pytest-asyncio>=0.21.1; extra == 'dev'
244
- Requires-Dist: pytest-cov; extra == 'dev'
245
- Requires-Dist: pytest>=7.4.0; extra == 'dev'
246
- Requires-Dist: pyyaml>=6.0.2; extra == 'dev'
247
- Requires-Dist: ruff>=0.8.4; extra == 'dev'
248
- Requires-Dist: tomli>=2.2.1; extra == 'dev'
249
- Provides-Extra: openai
250
- Requires-Dist: openai>=1.58.1; extra == 'openai'
251
237
  Description-Content-Type: text/markdown
252
238
 
253
239
  <p align="center">
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.2.54"
3
+ version = "0.2.56"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -15,7 +15,7 @@ classifiers = [
15
15
  requires-python = ">=3.13"
16
16
  dependencies = [
17
17
  "fastapi>=0.115.6",
18
- "mcp==1.12.1",
18
+ "mcp==1.12.4",
19
19
  "opentelemetry-distro>=0.55b0",
20
20
  "opentelemetry-exporter-otlp-proto-http>=1.7.0",
21
21
  "pydantic-settings>=2.7.0",
@@ -23,8 +23,8 @@ dependencies = [
23
23
  "pyyaml>=6.0.2",
24
24
  "rich>=14.1.0",
25
25
  "typer>=0.15.1",
26
- "anthropic>=0.59.0",
27
- "openai>=1.97.1",
26
+ "anthropic>=0.63.0",
27
+ "openai>=1.99.9",
28
28
  "azure-identity>=1.14.0",
29
29
  "boto3>=1.35.0",
30
30
  "prompt-toolkit>=3.0.51",
@@ -41,10 +41,6 @@ dependencies = [
41
41
  "pyperclip>=1.9.0",
42
42
  ]
43
43
 
44
- [project.optional-dependencies]
45
- openai = [
46
- "openai>=1.58.1",
47
- ]
48
44
  # For Azure OpenAI with DefaultAzureCredential support, install with: pip install fast-agent-mcp[azure]
49
45
  azure = [
50
46
  "azure-identity>=1.14.0"
@@ -364,12 +364,15 @@ class BaseAgent(MCPAggregator, AgentProtocol):
364
364
  if self.config.tools is not None:
365
365
  filtered_tools = []
366
366
  for tool in result.tools:
367
- # Extract server name from tool name (e.g., "mathematics-add" -> "mathematics")
368
- if "-" in tool.name:
369
- server_name = tool.name.split("-", 1)[0]
370
-
371
- # Check if this server has tool filters
372
- if server_name in self.config.tools:
367
+ # Extract server name from tool name, handling server names with hyphens
368
+ server_name = None
369
+ for configured_server in self.config.tools.keys():
370
+ if tool.name.startswith(f"{configured_server}-"):
371
+ server_name = configured_server
372
+ break
373
+
374
+ # Check if this server has tool filters
375
+ if server_name and server_name in self.config.tools:
373
376
  # Check if tool matches any pattern for this server
374
377
  for pattern in self.config.tools[server_name]:
375
378
  if self._matches_pattern(tool.name, pattern, server_name):
@@ -783,6 +786,60 @@ class BaseAgent(MCPAggregator, AgentProtocol):
783
786
 
784
787
  return result
785
788
 
789
+ async def list_mcp_tools(self, server_name: str | None = None) -> Mapping[str, List[Tool]]:
790
+ """
791
+ List all tools available to this agent, grouped by server and filtered by configuration.
792
+
793
+ Args:
794
+ server_name: Optional server name to list tools from
795
+
796
+ Returns:
797
+ Dictionary mapping server names to lists of Tool objects (with original names, not namespaced)
798
+ """
799
+ if not self.initialized:
800
+ await self.initialize()
801
+
802
+ # Get all tools from the parent class
803
+ result = await super().list_mcp_tools(server_name)
804
+
805
+ # Apply filtering if tools are specified in config
806
+ if self.config.tools is not None:
807
+ filtered_result = {}
808
+ for server, tools in result.items():
809
+ # Check if this server has tool filters
810
+ if server in self.config.tools:
811
+ filtered_tools = []
812
+ for tool in tools:
813
+ # Check if tool matches any pattern for this server
814
+ for pattern in self.config.tools[server]:
815
+ if self._matches_pattern(tool.name, pattern, server):
816
+ filtered_tools.append(tool)
817
+ break
818
+ if filtered_tools:
819
+ filtered_result[server] = filtered_tools
820
+ result = filtered_result
821
+
822
+ # Add human input tool to a special server if human input is configured
823
+ if self.human_input_callback:
824
+ from mcp.server.fastmcp.tools import Tool as FastTool
825
+
826
+ human_input_tool: FastTool = FastTool.from_function(self.request_human_input)
827
+ special_server_name = "__human_input__"
828
+
829
+ # If the special server doesn't exist in result, create it
830
+ if special_server_name not in result:
831
+ result[special_server_name] = []
832
+
833
+ result[special_server_name].append(
834
+ Tool(
835
+ name=HUMAN_INPUT_TOOL_NAME,
836
+ description=human_input_tool.description,
837
+ inputSchema=human_input_tool.parameters,
838
+ )
839
+ )
840
+
841
+ return result
842
+
786
843
  @property
787
844
  def agent_type(self) -> AgentType:
788
845
  """
@@ -121,9 +121,9 @@ async def _run_agent(
121
121
  print(response)
122
122
  elif prompt_file:
123
123
  prompt = load_prompt_multipart(Path(prompt_file))
124
- response = await agent.generate(prompt)
125
- # Print the response text and exit
126
- print(response.last_text())
124
+ response = await agent.agent.generate(prompt)
125
+ print(f"\nLoaded {len(prompt)} messages from prompt file '{prompt_file}'")
126
+ await agent.interactive()
127
127
  else:
128
128
  await agent.interactive()
129
129
 
@@ -585,6 +585,7 @@ async def get_enhanced_input(
585
585
  ("Ctrl+Y", "Copy"),
586
586
  ("Ctrl+L", "Clear"),
587
587
  ("↑/↓", "History"),
588
+ ("EXIT", "Exit")
588
589
  ]
589
590
 
590
591
  newline = "Ctrl+&lt;Enter&gt;:Submit" if in_multiline_mode else "&lt;Enter&gt;:Submit"
@@ -91,7 +91,10 @@ class ModelDatabase:
91
91
  )
92
92
 
93
93
  QWEN_STANDARD = ModelParameters(
94
- context_window=32000, max_output_tokens=8192, tokenizes=QWEN_MULTIMODAL
94
+ context_window=32000,
95
+ max_output_tokens=8192,
96
+ tokenizes=QWEN_MULTIMODAL,
97
+ json_mode="object",
95
98
  )
96
99
  QWEN3_REASONER = ModelParameters(
97
100
  context_window=131072,
@@ -1,24 +1,26 @@
1
1
  from mcp_agent.core.request_params import RequestParams
2
2
  from mcp_agent.llm.provider_types import Provider
3
+ from mcp_agent.llm.providers.augmented_llm_groq import GroqAugmentedLLM
3
4
  from mcp_agent.llm.providers.augmented_llm_openai import OpenAIAugmentedLLM
4
5
 
5
6
  ALIYUN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
6
7
  DEFAULT_QWEN_MODEL = "qwen-turbo"
7
8
 
8
9
 
9
- class AliyunAugmentedLLM(OpenAIAugmentedLLM):
10
+ class AliyunAugmentedLLM(GroqAugmentedLLM):
10
11
  def __init__(self, *args, **kwargs) -> None:
11
- super().__init__(*args, provider=Provider.ALIYUN, **kwargs)
12
+ OpenAIAugmentedLLM.__init__(self, *args, provider=Provider.ALIYUN, **kwargs)
12
13
 
13
14
  def _initialize_default_params(self, kwargs: dict) -> RequestParams:
14
15
  """Initialize Aliyun-specific default parameters"""
15
16
  # Get base defaults from parent (includes ModelDatabase lookup)
16
17
  base_params = super()._initialize_default_params(kwargs)
17
-
18
+
18
19
  # Override with Aliyun-specific settings
19
20
  chosen_model = kwargs.get("model", DEFAULT_QWEN_MODEL)
20
21
  base_params.model = chosen_model
21
-
22
+ base_params.parallel_tool_calls = True
23
+
22
24
  return base_params
23
25
 
24
26
  def _base_url(self) -> str:
@@ -27,3 +29,4 @@ class AliyunAugmentedLLM(OpenAIAugmentedLLM):
27
29
  base_url = self.context.config.aliyun.base_url
28
30
 
29
31
  return base_url if base_url else ALIYUN_BASE_URL
32
+
@@ -86,6 +86,7 @@ class BedrockAugmentedLLM(AugmentedLLM[BedrockMessageParam, BedrockMessage]):
86
86
  r"^cohere\..*", # Cohere models
87
87
  r"^ai21\..*", # AI21 models
88
88
  r"^stability\..*", # Stability AI models
89
+ r"^openai\..*", # OpenAI models
89
90
  ]
90
91
 
91
92
  import re
@@ -46,38 +46,25 @@ class GroqAugmentedLLM(OpenAIAugmentedLLM):
46
46
  assert self.default_request_params
47
47
  llm_model = self.default_request_params.model or DEFAULT_GROQ_MODEL
48
48
  json_mode: str | None = ModelDatabase.get_json_mode(llm_model)
49
- if "json_object" == json_mode:
49
+ if "object" == json_mode:
50
50
  request_params.response_format = {"type": "json_object"}
51
51
 
52
- # Get the full schema and extract just the properties
53
- full_schema = model.model_json_schema()
54
- properties = full_schema.get("properties", {})
55
- required_fields = full_schema.get("required", [])
56
-
57
- # Create a cleaner format description
58
- format_description = "{\n"
59
- for field_name, field_info in properties.items():
60
- field_type = field_info.get("type", "string")
61
- description = field_info.get("description", "")
62
- format_description += f' "{field_name}": "{field_type}"'
63
- if description:
64
- format_description += f" // {description}"
65
- if field_name in required_fields:
66
- format_description += " // REQUIRED"
67
- format_description += "\n"
68
- format_description += "}"
69
-
70
- multipart_messages[-1].add_text(
71
- f"""YOU MUST RESPOND WITH A JSON OBJECT IN EXACTLY THIS FORMAT:
72
- {format_description}
73
-
74
- IMPORTANT RULES:
75
- - Respond ONLY with the JSON object, no other text
76
- - Do NOT include "properties" or "schema" wrappers
77
- - Do NOT use code fences or markdown
78
- - The response must be valid JSON that matches the format above
79
- - All required fields must be included"""
80
- )
52
+ # Create a cleaner format description from full schema
53
+ full_schema = model.model_json_schema()
54
+ format_description = self._schema_to_json_object(
55
+ full_schema, full_schema.get("$defs")
56
+ )
57
+
58
+ multipart_messages[-1].add_text(
59
+ f"""YOU MUST RESPOND WITH A JSON OBJECT IN EXACTLY THIS FORMAT:
60
+ {format_description}
61
+
62
+ IMPORTANT RULES:
63
+ - Respond ONLY with the JSON object, no other text
64
+ - Do NOT include "properties" or "schema" wrappers
65
+ - Do NOT use code fences or markdown
66
+ - The response must be valid JSON that matches the format above
67
+ - All required fields must be included""")
81
68
 
82
69
  result: PromptMessageMultipart = await self._apply_prompt_provider_specific(
83
70
  multipart_messages, request_params
@@ -101,3 +88,45 @@ class GroqAugmentedLLM(OpenAIAugmentedLLM):
101
88
  base_url = self.context.config.groq.base_url
102
89
 
103
90
  return base_url if base_url else GROQ_BASE_URL
91
+
92
+ def _schema_to_json_object(
93
+ self, schema: dict, defs: dict | None = None, visited: set | None = None
94
+ ) -> str:
95
+ visited = visited or set()
96
+
97
+ if id(schema) in visited:
98
+ return '"<recursive>"'
99
+ visited.add(id(schema))
100
+
101
+ if "$ref" in schema:
102
+ ref = schema.get("$ref", "")
103
+ if ref.startswith("#/$defs/"):
104
+ target = ref.split("/")[-1]
105
+ if defs and target in defs:
106
+ return self._schema_to_json_object(defs[target], defs, visited)
107
+ return f'"<ref:{ref}>"'
108
+
109
+ schema_type = schema.get("type")
110
+ description = schema.get("description", "")
111
+ required = schema.get("required", [])
112
+
113
+ if schema_type == "object":
114
+ props = schema.get("properties", {})
115
+ result = "{\n"
116
+ for prop_name, prop_schema in props.items():
117
+ is_required = prop_name in required
118
+ prop_str = self._schema_to_json_object(prop_schema, defs, visited)
119
+ if is_required:
120
+ prop_str += " // REQUIRED"
121
+ result += f' "{prop_name}": {prop_str},\n'
122
+ result += "}"
123
+ return result
124
+ elif schema_type == "array":
125
+ items = schema.get("items", {})
126
+ items_str = self._schema_to_json_object(items, defs, visited)
127
+ return f"[{items_str}]"
128
+ elif schema_type:
129
+ comment = f" // {description}" if description else ""
130
+ return f'"{schema_type}"' + comment
131
+
132
+ return '"<unknown>"'
@@ -171,7 +171,6 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
171
171
  async def _process_stream_manual(self, stream, model: str):
172
172
  """Manual stream processing for providers like Ollama that may not work with ChatCompletionStreamState."""
173
173
  from openai.types.chat import ChatCompletionMessageToolCall
174
- from openai.types.chat.chat_completion_message_tool_call import Function
175
174
 
176
175
  # Track estimated output tokens by counting text chunks
177
176
  estimated_tokens = 0
@@ -249,10 +248,10 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
249
248
  ChatCompletionMessageToolCall(
250
249
  id=tool_call_data["id"],
251
250
  type=tool_call_data["type"],
252
- function=Function(
253
- name=tool_call_data["function"]["name"],
254
- arguments=tool_call_data["function"]["arguments"],
255
- ),
251
+ function={
252
+ "name": tool_call_data["function"]["name"],
253
+ "arguments": tool_call_data["function"]["arguments"],
254
+ },
256
255
  )
257
256
  )
258
257
 
@@ -333,8 +332,8 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
333
332
  ]
334
333
 
335
334
  if not available_tools:
336
- if self.provider == Provider.DEEPSEEK:
337
- available_tools = None # deepseek does not allow empty array
335
+ if self.provider in [Provider.DEEPSEEK, Provider.ALIYUN]:
336
+ available_tools = None # deepseek/aliyun does not allow empty array
338
337
  else:
339
338
  available_tools = []
340
339
 
@@ -25,7 +25,7 @@ from a2a.types import AgentCard
25
25
  from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
26
26
  from deprecated import deprecated
27
27
  from mcp import ClientSession
28
- from mcp.types import GetPromptResult, Prompt, PromptMessage, ReadResourceResult
28
+ from mcp.types import GetPromptResult, Prompt, PromptMessage, ReadResourceResult, Tool
29
29
  from pydantic import BaseModel
30
30
 
31
31
  from mcp_agent.core.agent_types import AgentType
@@ -203,6 +203,8 @@ class AgentProtocol(AugmentedLLMProtocol, Protocol):
203
203
 
204
204
  async def list_resources(self, server_name: str | None = None) -> Mapping[str, List[str]]: ...
205
205
 
206
+ async def list_mcp_tools(self, server_name: str | None = None) -> Mapping[str, List[Tool]]: ...
207
+
206
208
  async def get_resource(
207
209
  self, resource_uri: str, server_name: str | None = None
208
210
  ) -> ReadResourceResult:
@@ -572,14 +572,13 @@ class MCPAggregator(ContextDependent):
572
572
 
573
573
  # Next, attempt to interpret as a namespaced name
574
574
  if is_namespaced_name(name):
575
- parts = name.split(SEP, 1)
576
- server_name, local_name = parts[0], parts[1]
575
+ # Try to match against known server names, handling server names with hyphens
576
+ for server_name in self.server_names:
577
+ if name.startswith(f"{server_name}{SEP}"):
578
+ local_name = name[len(server_name) + len(SEP):]
579
+ return server_name, local_name
577
580
 
578
- # Validate that the parsed server actually exists
579
- if server_name in self.server_names:
580
- return server_name, local_name
581
-
582
- # If the server name doesn't exist, it might be a tool with a hyphen in its name
581
+ # If no server name matched, it might be a tool with a hyphen in its name
583
582
  # Fall through to the next checks
584
583
 
585
584
  # For tools, search all servers for the tool by exact name match
@@ -1232,3 +1231,55 @@ class MCPAggregator(ContextDependent):
1232
1231
  logger.error(f"Error fetching resources from {s_name}: {e}")
1233
1232
 
1234
1233
  return results
1234
+
1235
+ async def list_mcp_tools(self, server_name: str | None = None) -> Dict[str, List[Tool]]:
1236
+ """
1237
+ List available tools from one or all servers, grouped by server name.
1238
+
1239
+ Args:
1240
+ server_name: Optional server name to list tools from. If not provided,
1241
+ lists tools from all servers.
1242
+
1243
+ Returns:
1244
+ Dictionary mapping server names to lists of Tool objects (with original names, not namespaced)
1245
+ """
1246
+ if not self.initialized:
1247
+ await self.load_servers()
1248
+
1249
+ results: Dict[str, List[Tool]] = {}
1250
+
1251
+ # Get the list of servers to check
1252
+ servers_to_check = [server_name] if server_name else self.server_names
1253
+
1254
+ # For each server, try to list its tools
1255
+ for s_name in servers_to_check:
1256
+ if s_name not in self.server_names:
1257
+ logger.error(f"Server '{s_name}' not found")
1258
+ continue
1259
+
1260
+ # Initialize empty list for this server
1261
+ results[s_name] = []
1262
+
1263
+ # Check if server supports tools capability
1264
+ if not await self.server_supports_feature(s_name, "tools"):
1265
+ logger.debug(f"Server '{s_name}' does not support tools")
1266
+ continue
1267
+
1268
+ try:
1269
+ # Use the _execute_on_server method to call list_tools on the server
1270
+ result = await self._execute_on_server(
1271
+ server_name=s_name,
1272
+ operation_type="tools-list",
1273
+ operation_name="",
1274
+ method_name="list_tools",
1275
+ method_args={},
1276
+ )
1277
+
1278
+ # Get tools from result (these have original names, not namespaced)
1279
+ tools = getattr(result, "tools", [])
1280
+ results[s_name] = tools
1281
+
1282
+ except Exception as e:
1283
+ logger.error(f"Error fetching tools from {s_name}: {e}")
1284
+
1285
+ return results
File without changes