fast-agent-mcp 0.2.55__tar.gz → 0.2.57__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.55 → fast_agent_mcp-0.2.57}/PKG-INFO +3 -17
  2. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/pyproject.toml +3 -7
  3. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/agent.py +10 -3
  4. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/base_agent.py +15 -7
  5. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/go.py +3 -3
  6. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/agent_app.py +18 -6
  7. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/enhanced_prompt.py +11 -2
  8. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/fastagent.py +2 -0
  9. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/request_params.py +5 -0
  10. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/event_progress.py +3 -0
  11. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm.py +15 -0
  12. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +1 -0
  13. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_groq.py +58 -29
  14. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_openai.py +4 -5
  15. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_agent_client_session.py +105 -2
  16. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_aggregator.py +97 -35
  17. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_connection_manager.py +19 -0
  18. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/ui/console_display.py +105 -15
  19. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/.gitignore +0 -0
  20. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/LICENSE +0 -0
  21. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/README.md +0 -0
  22. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/azure-openai/fastagent.config.yaml +0 -0
  23. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/bedrock/fast-agent.config.yaml +0 -0
  24. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/custom-agents/agent.py +0 -0
  25. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/custom-agents/fastagent.config.yaml +0 -0
  26. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/analysis-campaign.py +0 -0
  27. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/analysis.py +0 -0
  28. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/fastagent.config.yaml +0 -0
  29. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  30. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  31. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  32. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  33. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  34. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  35. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/forms_demo.py +0 -0
  36. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/game_character.py +0 -0
  37. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/game_character_handler.py +0 -0
  38. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/tool_call.py +0 -0
  39. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  40. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  41. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  42. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  43. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/agent_one.py +0 -0
  44. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/agent_two.py +0 -0
  45. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  46. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  47. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/cat.png +0 -0
  48. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example1.py +0 -0
  49. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example2.py +0 -0
  50. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example3.py +0 -0
  51. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/agent.py +0 -0
  53. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/agent2.py +0 -0
  54. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/docker-compose.yaml +0 -0
  55. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/fastagent.config.yaml +0 -0
  56. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/fastagent.config.yaml +0 -0
  57. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher-eval.py +0 -0
  58. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher-imp.py +0 -0
  59. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher.py +0 -0
  60. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/.env.sample +0 -0
  61. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/Makefile +0 -0
  62. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/README.md +0 -0
  63. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/agent.py +0 -0
  64. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/clam.jpg +0 -0
  65. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/crab.png +0 -0
  66. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/shrimp.png +0 -0
  67. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/docker-compose.yml +0 -0
  68. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/fastagent.config.yaml +0 -0
  69. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/image_demo.py +0 -0
  70. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  71. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  72. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  73. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  74. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/simple_agent.py +0 -0
  75. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  76. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  77. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  78. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/chaining.py +0 -0
  79. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/evaluator.py +0 -0
  80. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/fastagent.config.yaml +0 -0
  81. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/graded_report.md +0 -0
  82. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/human_input.py +0 -0
  83. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/orchestrator.py +0 -0
  84. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/parallel.py +0 -0
  85. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/router.py +0 -0
  86. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/short_story.md +0 -0
  87. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/short_story.txt +0 -0
  88. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/hatch_build.py +0 -0
  89. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/__init__.py +0 -0
  90. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/__init__.py +0 -0
  91. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  92. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  93. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  94. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/iterative_planner.py +0 -0
  95. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  96. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  97. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  98. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  99. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  100. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/app.py +0 -0
  101. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/__init__.py +0 -0
  102. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/__main__.py +0 -0
  103. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/check_config.py +0 -0
  104. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  105. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
  106. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/setup.py +0 -0
  107. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  108. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/constants.py +0 -0
  109. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/main.py +0 -0
  110. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/terminal.py +0 -0
  111. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/config.py +0 -0
  112. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/console.py +0 -0
  113. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/context.py +0 -0
  114. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/context_dependent.py +0 -0
  115. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/__init__.py +0 -0
  116. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/agent_types.py +0 -0
  117. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/direct_decorators.py +0 -0
  118. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/direct_factory.py +0 -0
  119. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/error_handling.py +0 -0
  120. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/exceptions.py +0 -0
  121. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/interactive_prompt.py +0 -0
  122. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/mcp_content.py +0 -0
  123. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/mermaid_utils.py +0 -0
  124. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/prompt.py +0 -0
  125. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/usage_display.py +0 -0
  126. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/validation.py +0 -0
  127. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/__init__.py +0 -0
  128. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/executor.py +0 -0
  129. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/task_registry.py +0 -0
  130. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/workflow_signal.py +0 -0
  131. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/__init__.py +0 -0
  132. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_form.py +0 -0
  133. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
  134. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
  135. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_state.py +0 -0
  136. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/form_fields.py +0 -0
  137. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/handler.py +0 -0
  138. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/simple_form.py +0 -0
  139. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/types.py +0 -0
  140. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/__init__.py +0 -0
  141. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  142. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  143. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
  144. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  145. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/memory.py +0 -0
  146. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/model_database.py +0 -0
  147. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/model_factory.py +0 -0
  148. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/prompt_utils.py +0 -0
  149. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/provider_key_manager.py +0 -0
  150. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/provider_types.py +0 -0
  151. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/__init__.py +0 -0
  152. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  153. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
  154. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -0
  155. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
  156. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  157. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  158. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
  159. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  160. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  161. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_tensorzero_openai.py +0 -0
  162. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
  163. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  164. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  165. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  166. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  167. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  168. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  169. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  170. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/sampling_converter.py +0 -0
  171. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  172. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/usage_tracking.py +0 -0
  173. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/__init__.py +0 -0
  174. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/events.py +0 -0
  175. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/json_serializer.py +0 -0
  176. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/listeners.py +0 -0
  177. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/logger.py +0 -0
  178. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/rich_progress.py +0 -0
  179. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/transport.py +0 -0
  180. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/__init__.py +0 -0
  181. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/common.py +0 -0
  182. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
  183. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
  184. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/gen_client.py +0 -0
  185. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  186. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  187. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  188. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/hf_auth.py +0 -0
  189. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/interfaces.py +0 -0
  190. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/logger_textio.py +0 -0
  191. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mime_utils.py +0 -0
  192. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  193. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_render.py +0 -0
  194. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  195. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  196. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  197. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  198. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  199. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  200. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  201. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  202. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/resource_utils.py +0 -0
  203. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/sampling.py +0 -0
  204. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server/__init__.py +0 -0
  205. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  206. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server_registry.py +0 -0
  207. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/progress_display.py +0 -0
  208. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/py.typed +0 -0
  209. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  210. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  211. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  212. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  213. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  214. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  215. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  216. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  217. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  218. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  219. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  220. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  221. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  222. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  223. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  224. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  225. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  226. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  227. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  228. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  229. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  230. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/.env.sample +0 -0
  231. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/Makefile +0 -0
  232. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/README.md +0 -0
  233. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/agent.py +0 -0
  234. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  235. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  236. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  237. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  238. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  239. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/image_demo.py +0 -0
  240. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  241. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  242. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  243. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  244. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  245. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  246. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  247. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  248. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  249. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  250. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  251. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  252. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
  253. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  254. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  255. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  256. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  257. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
  258. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  259. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/tools/tool_definition.py +0 -0
  260. {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/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.55
3
+ Version: 0.2.57
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,7 +211,7 @@ 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
@@ -219,7 +219,7 @@ 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
221
  Requires-Dist: mcp==1.12.4
222
- Requires-Dist: openai>=1.97.1
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.55"
3
+ version = "0.2.57"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -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"
@@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, TypeVar
10
10
  from mcp_agent.agents.base_agent import BaseAgent
11
11
  from mcp_agent.core.agent_types import AgentConfig
12
12
  from mcp_agent.core.interactive_prompt import InteractivePrompt
13
+ from mcp_agent.core.request_params import RequestParams
13
14
  from mcp_agent.human_input.types import HumanInputCallback
14
15
  from mcp_agent.logging.logger import get_logger
15
16
  from mcp_agent.mcp.interfaces import AugmentedLLMProtocol
@@ -51,13 +52,19 @@ class Agent(BaseAgent):
51
52
  **kwargs,
52
53
  )
53
54
 
54
- async def prompt(self, default_prompt: str = "", agent_name: Optional[str] = None) -> str:
55
+ async def prompt(
56
+ self,
57
+ default_prompt: str = "",
58
+ agent_name: Optional[str] = None,
59
+ request_params: RequestParams | None = None
60
+ ) -> str:
55
61
  """
56
62
  Start an interactive prompt session with this agent.
57
63
 
58
64
  Args:
59
65
  default: Default message to use when user presses enter
60
66
  agent_name: Ignored for single agents, included for API compatibility
67
+ request_params: Optional request parameters
61
68
 
62
69
  Returns:
63
70
  The result of the interactive session
@@ -66,14 +73,14 @@ class Agent(BaseAgent):
66
73
  agent_name_str = str(self.name)
67
74
 
68
75
  # Create agent_types dictionary with just this agent
69
- agent_types = {agent_name_str: self.agent_type.value}
76
+ agent_types = {agent_name_str: self.agent_type}
70
77
 
71
78
  # Create the interactive prompt
72
79
  prompt = InteractivePrompt(agent_types=agent_types)
73
80
 
74
81
  # Define wrapper for send function
75
82
  async def send_wrapper(message, agent_name):
76
- return await self.send(message)
83
+ return await self.send(message, request_params)
77
84
 
78
85
  # Start the prompt loop with just this agent
79
86
  return await prompt.prompt_loop(
@@ -208,7 +208,11 @@ class BaseAgent(MCPAggregator, AgentProtocol):
208
208
  result: PromptMessageMultipart = await self.generate([Prompt.user(message)], request_params)
209
209
  return result.first_text()
210
210
 
211
- async def send(self, message: Union[str, PromptMessage, PromptMessageMultipart]) -> str:
211
+ async def send(
212
+ self,
213
+ message: Union[str, PromptMessage, PromptMessageMultipart],
214
+ request_params: RequestParams | None = None
215
+ ) -> str:
212
216
  """
213
217
  Send a message to the agent and get a response.
214
218
 
@@ -217,6 +221,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
217
221
  - String: Converted to a user PromptMessageMultipart
218
222
  - PromptMessage: Converted to PromptMessageMultipart
219
223
  - PromptMessageMultipart: Used directly
224
+ - request_params: Optional request parameters
220
225
 
221
226
  Returns:
222
227
  The agent's response as a string
@@ -225,7 +230,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
225
230
  prompt = self._normalize_message_input(message)
226
231
 
227
232
  # Use the LLM to generate a response
228
- response = await self.generate([prompt], None)
233
+ response = await self.generate([prompt], request_params)
229
234
  return response.all_text()
230
235
 
231
236
  def _normalize_message_input(
@@ -364,12 +369,15 @@ class BaseAgent(MCPAggregator, AgentProtocol):
364
369
  if self.config.tools is not None:
365
370
  filtered_tools = []
366
371
  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]
372
+ # Extract server name from tool name, handling server names with hyphens
373
+ server_name = None
374
+ for configured_server in self.config.tools.keys():
375
+ if tool.name.startswith(f"{configured_server}-"):
376
+ server_name = configured_server
377
+ break
370
378
 
371
- # Check if this server has tool filters
372
- if server_name in self.config.tools:
379
+ # Check if this server has tool filters
380
+ if server_name and server_name in self.config.tools:
373
381
  # Check if tool matches any pattern for this server
374
382
  for pattern in self.config.tools[server_name]:
375
383
  if self._matches_pattern(tool.name, pattern, server_name):
@@ -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
 
@@ -11,6 +11,7 @@ from rich import print as rich_print
11
11
  from mcp_agent.agents.agent import Agent
12
12
  from mcp_agent.core.agent_types import AgentType
13
13
  from mcp_agent.core.interactive_prompt import InteractivePrompt
14
+ from mcp_agent.core.request_params import RequestParams
14
15
  from mcp_agent.mcp.prompt_message_multipart import PromptMessageMultipart
15
16
  from mcp_agent.progress_display import progress_display
16
17
 
@@ -53,6 +54,7 @@ class AgentApp:
53
54
  message: Union[str, PromptMessage, PromptMessageMultipart] | None = None,
54
55
  agent_name: str | None = None,
55
56
  default_prompt: str = "",
57
+ request_params: RequestParams | None = None,
56
58
  ) -> str:
57
59
  """
58
60
  Make the object callable to send messages or start interactive prompt.
@@ -65,19 +67,21 @@ class AgentApp:
65
67
  - PromptMessageMultipart: Used directly
66
68
  agent_name: Optional name of the agent to send to (defaults to first agent)
67
69
  default_prompt: Default message to use in interactive prompt mode
70
+ request_params: Optional request parameters including MCP metadata
68
71
 
69
72
  Returns:
70
73
  The agent's response as a string or the result of the interactive session
71
74
  """
72
75
  if message:
73
- return await self._agent(agent_name).send(message)
76
+ return await self._agent(agent_name).send(message, request_params)
74
77
 
75
- return await self.interactive(agent_name=agent_name, default_prompt=default_prompt)
78
+ return await self.interactive(agent_name=agent_name, default_prompt=default_prompt, request_params=request_params)
76
79
 
77
80
  async def send(
78
81
  self,
79
82
  message: Union[str, PromptMessage, PromptMessageMultipart],
80
83
  agent_name: Optional[str] = None,
84
+ request_params: RequestParams | None = None,
81
85
  ) -> str:
82
86
  """
83
87
  Send a message to the specified agent (or to all agents).
@@ -88,11 +92,12 @@ class AgentApp:
88
92
  - PromptMessage: Converted to PromptMessageMultipart
89
93
  - PromptMessageMultipart: Used directly
90
94
  agent_name: Optional name of the agent to send to
95
+ request_params: Optional request parameters including MCP metadata
91
96
 
92
97
  Returns:
93
98
  The agent's response as a string
94
99
  """
95
- return await self._agent(agent_name).send(message)
100
+ return await self._agent(agent_name).send(message, request_params)
96
101
 
97
102
  def _agent(self, agent_name: str | None) -> Agent:
98
103
  if agent_name:
@@ -233,17 +238,23 @@ class AgentApp:
233
238
  )
234
239
 
235
240
  @deprecated
236
- async def prompt(self, agent_name: str | None = None, default_prompt: str = "") -> str:
241
+ async def prompt(
242
+ self,
243
+ agent_name: str | None = None,
244
+ default_prompt: str = "",
245
+ request_params: RequestParams | None = None
246
+ ) -> str:
237
247
  """
238
248
  Deprecated - use interactive() instead.
239
249
  """
240
- return await self.interactive(agent_name=agent_name, default_prompt=default_prompt)
250
+ return await self.interactive(agent_name=agent_name, default_prompt=default_prompt, request_params=request_params)
241
251
 
242
252
  async def interactive(
243
253
  self,
244
254
  agent_name: str | None = None,
245
255
  default_prompt: str = "",
246
256
  pretty_print_parallel: bool = False,
257
+ request_params: RequestParams | None = None,
247
258
  ) -> str:
248
259
  """
249
260
  Interactive prompt for sending messages with advanced features.
@@ -252,6 +263,7 @@ class AgentApp:
252
263
  agent_name: Optional target agent name (uses default if not specified)
253
264
  default: Default message to use when user presses enter
254
265
  pretty_print_parallel: Enable clean parallel results display for parallel agents
266
+ request_params: Optional request parameters including MCP metadata
255
267
 
256
268
  Returns:
257
269
  The result of the interactive session
@@ -285,7 +297,7 @@ class AgentApp:
285
297
 
286
298
  # Define the wrapper for send function
287
299
  async def send_wrapper(message, agent_name):
288
- result = await self.send(message, agent_name)
300
+ result = await self.send(message, agent_name, request_params)
289
301
 
290
302
  # Show parallel results if enabled and this is a parallel agent
291
303
  if pretty_print_parallel:
@@ -428,9 +428,14 @@ def create_keybindings(on_toggle_multiline=None, app=None, agent_provider=None,
428
428
  """Enter: accept input when not in multiline mode."""
429
429
  event.current_buffer.validate_and_handle()
430
430
 
431
+ @kb.add("c-j", filter=Condition(lambda: not in_multiline_mode))
432
+ def _(event) -> None:
433
+ """Ctrl+J: Insert newline when in normal mode."""
434
+ event.current_buffer.insert_text("\n")
435
+
431
436
  @kb.add("c-m", filter=Condition(lambda: in_multiline_mode))
432
437
  def _(event) -> None:
433
- """Enter: insert newline when in multiline mode."""
438
+ """Enter: Insert newline when in multiline mode."""
434
439
  event.current_buffer.insert_text("\n")
435
440
 
436
441
  # Use c-j (Ctrl+J) as an alternative to represent Ctrl+Enter in multiline mode
@@ -581,13 +586,15 @@ async def get_enhanced_input(
581
586
 
582
587
  shortcuts = [
583
588
  ("Ctrl+T", toggle_text),
589
+ ("Ctrl+J", "Newline" if not in_multiline_mode else None),
584
590
  ("Ctrl+E", "External"),
585
591
  ("Ctrl+Y", "Copy"),
586
592
  ("Ctrl+L", "Clear"),
587
593
  ("↑/↓", "History"),
594
+ ("EXIT", "Exit")
588
595
  ]
589
596
 
590
- newline = "Ctrl+&lt;Enter&gt;:Submit" if in_multiline_mode else "&lt;Enter&gt;:Submit"
597
+ newline = "Ctrl+J:Submit" if in_multiline_mode else "&lt;Enter&gt;:Submit"
591
598
 
592
599
  # Only show relevant shortcuts based on mode
593
600
  shortcuts = [(k, v) for k, v in shortcuts if v]
@@ -669,6 +676,8 @@ async def get_enhanced_input(
669
676
  def pre_process_input(text):
670
677
  # Command processing
671
678
  if text and text.startswith("/"):
679
+ if text == "/":
680
+ return ""
672
681
  cmd_parts = text[1:].strip().split(maxsplit=1)
673
682
  cmd = cmd_parts[0].lower()
674
683
 
@@ -87,6 +87,7 @@ class FastAgent:
87
87
  ignore_unknown_args: bool = False,
88
88
  parse_cli_args: bool = True,
89
89
  quiet: bool = False, # Add quiet parameter
90
+ **kwargs
90
91
  ) -> None:
91
92
  """
92
93
  Initialize the fast-agent application.
@@ -203,6 +204,7 @@ class FastAgent:
203
204
  self.app = MCPApp(
204
205
  name=name,
205
206
  settings=config.Settings(**self.config) if hasattr(self, "config") else None,
207
+ **kwargs
206
208
  )
207
209
 
208
210
  # Stop progress display immediately if quiet mode is requested
@@ -52,3 +52,8 @@ class RequestParams(CreateMessageRequestParams):
52
52
  """
53
53
  Optional dictionary of template variables for dynamic templates. Currently only works for TensorZero inference backend
54
54
  """
55
+
56
+ mcp_metadata: Dict[str, Any] | None = None
57
+ """
58
+ Metadata to pass through to MCP tool calls via the _meta field.
59
+ """
@@ -25,6 +25,9 @@ class ProgressAction(str, Enum):
25
25
  FINISHED = "Finished"
26
26
  SHUTDOWN = "Shutdown"
27
27
  AGGREGATOR_INITIALIZED = "Running"
28
+ SERVER_OFFLINE = "Offline"
29
+ SERVER_RECONNECTING = "Reconnecting"
30
+ SERVER_ONLINE = "Online"
28
31
  FATAL_ERROR = "Error"
29
32
 
30
33
 
@@ -1,4 +1,5 @@
1
1
  from abc import abstractmethod
2
+ from contextvars import ContextVar
2
3
  from typing import (
3
4
  TYPE_CHECKING,
4
5
  Any,
@@ -61,6 +62,9 @@ if TYPE_CHECKING:
61
62
  # TODO -- move this to a constant
62
63
  HUMAN_INPUT_TOOL_NAME = "__human_input__"
63
64
 
65
+ # Context variable for storing MCP metadata
66
+ _mcp_metadata_var: ContextVar[Dict[str, Any] | None] = ContextVar('mcp_metadata', default=None)
67
+
64
68
 
65
69
  def deep_merge(dict1: Dict[Any, Any], dict2: Dict[Any, Any]) -> Dict[Any, Any]:
66
70
  """
@@ -232,6 +236,11 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
232
236
 
233
237
  self._precall(multipart_messages)
234
238
 
239
+ # Store MCP metadata in context variable
240
+ final_request_params = self.get_request_params(request_params)
241
+ if final_request_params.mcp_metadata:
242
+ _mcp_metadata_var.set(final_request_params.mcp_metadata)
243
+
235
244
  assistant_response: PromptMessageMultipart = await self._apply_prompt_provider_specific(
236
245
  multipart_messages, request_params
237
246
  )
@@ -275,6 +284,12 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
275
284
  multipart_messages = PromptMessageMultipart.to_multipart(multipart_messages)
276
285
 
277
286
  self._precall(multipart_messages)
287
+
288
+ # Store MCP metadata in context variable
289
+ final_request_params = self.get_request_params(request_params)
290
+ if final_request_params.mcp_metadata:
291
+ _mcp_metadata_var.set(final_request_params.mcp_metadata)
292
+
278
293
  result, assistant_response = await self._apply_prompt_provider_specific_structured(
279
294
  multipart_messages, model, request_params
280
295
  )
@@ -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
@@ -49,35 +49,22 @@ class GroqAugmentedLLM(OpenAIAugmentedLLM):
49
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
 
@@ -14,8 +14,17 @@ from mcp.shared.session import (
14
14
  SendRequestT,
15
15
  )
16
16
  from mcp.types import (
17
+ CallToolRequest,
18
+ CallToolRequestParams,
19
+ CallToolResult,
20
+ GetPromptRequest,
21
+ GetPromptRequestParams,
22
+ GetPromptResult,
17
23
  Implementation,
18
24
  ListRootsResult,
25
+ ReadResourceRequest,
26
+ ReadResourceRequestParams,
27
+ ReadResourceResult,
19
28
  Root,
20
29
  ToolListChangedNotification,
21
30
  )
@@ -180,8 +189,17 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
180
189
  )
181
190
  return result
182
191
  except Exception as e:
183
- logger.error(f"send_request failed: {str(e)}")
184
- raise
192
+ # Handle connection errors cleanly
193
+ from anyio import ClosedResourceError
194
+
195
+ if isinstance(e, ClosedResourceError):
196
+ # Show clean offline message and convert to ConnectionError
197
+ from mcp_agent import console
198
+ console.console.print(f"[dim red]MCP server {self.session_server_name} offline[/dim red]")
199
+ raise ConnectionError(f"MCP server {self.session_server_name} offline") from e
200
+ else:
201
+ logger.error(f"send_request failed: {str(e)}")
202
+ raise
185
203
 
186
204
  async def _received_notification(self, notification: ServerNotification) -> None:
187
205
  """
@@ -226,3 +244,88 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
226
244
  await self._tool_list_changed_callback(server_name)
227
245
  except Exception as e:
228
246
  logger.error(f"Error in tool list changed callback: {e}")
247
+
248
+ async def call_tool(
249
+ self,
250
+ name: str,
251
+ arguments: dict | None = None,
252
+ _meta: dict | None = None,
253
+ **kwargs
254
+ ) -> CallToolResult:
255
+ """Call a tool with optional metadata support."""
256
+ if _meta:
257
+ from mcp.types import RequestParams
258
+
259
+ # Safe merge - preserve existing meta fields like progressToken
260
+ existing_meta = kwargs.get('meta')
261
+ if existing_meta:
262
+ meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
263
+ meta_dict.update(_meta)
264
+ meta_obj = RequestParams.Meta(**meta_dict)
265
+ else:
266
+ meta_obj = RequestParams.Meta(**_meta)
267
+
268
+ # Create CallToolRequestParams without meta, then add _meta via model_dump
269
+ params = CallToolRequestParams(name=name, arguments=arguments)
270
+ params_dict = params.model_dump(by_alias=True)
271
+ params_dict["_meta"] = meta_obj.model_dump()
272
+
273
+ # Create request with proper types
274
+ request = CallToolRequest(
275
+ method="tools/call",
276
+ params=CallToolRequestParams.model_validate(params_dict)
277
+ )
278
+
279
+ return await self.send_request(request, CallToolResult)
280
+ else:
281
+ return await super().call_tool(name, arguments, **kwargs)
282
+
283
+ async def read_resource(self, uri: str, _meta: dict | None = None, **kwargs) -> ReadResourceResult:
284
+ """Read a resource with optional metadata support."""
285
+ if _meta:
286
+ from mcp.types import RequestParams
287
+
288
+ # Safe merge - preserve existing meta fields like progressToken
289
+ existing_meta = kwargs.get('meta')
290
+ if existing_meta:
291
+ meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
292
+ meta_dict.update(_meta)
293
+ meta_obj = RequestParams.Meta(**meta_dict)
294
+ else:
295
+ meta_obj = RequestParams.Meta(**_meta)
296
+
297
+ request = ReadResourceRequest(
298
+ method="resources/read",
299
+ params=ReadResourceRequestParams(uri=uri, meta=meta_obj)
300
+ )
301
+ return await self.send_request(request, ReadResourceResult)
302
+ else:
303
+ return await super().read_resource(uri, **kwargs)
304
+
305
+ async def get_prompt(
306
+ self,
307
+ name: str,
308
+ arguments: dict | None = None,
309
+ _meta: dict | None = None,
310
+ **kwargs
311
+ ) -> GetPromptResult:
312
+ """Get a prompt with optional metadata support."""
313
+ if _meta:
314
+ from mcp.types import RequestParams
315
+
316
+ # Safe merge - preserve existing meta fields like progressToken
317
+ existing_meta = kwargs.get('meta')
318
+ if existing_meta:
319
+ meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
320
+ meta_dict.update(_meta)
321
+ meta_obj = RequestParams.Meta(**meta_dict)
322
+ else:
323
+ meta_obj = RequestParams.Meta(**_meta)
324
+
325
+ request = GetPromptRequest(
326
+ method="prompts/get",
327
+ params=GetPromptRequestParams(name=name, arguments=arguments, meta=meta_obj)
328
+ )
329
+ return await self.send_request(request, GetPromptResult)
330
+ else:
331
+ return await super().get_prompt(name, arguments, **kwargs)