fast-agent-mcp 0.3.12__tar.gz → 0.3.13__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 (303) hide show
  1. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/PKG-INFO +15 -6
  2. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/README.md +13 -4
  3. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/pyproject.toml +2 -2
  4. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/llm_agent.py +1 -1
  5. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/google/google_converter.py +10 -3
  6. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/mcp_agent_client_session.py +13 -0
  7. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/mcp_connection_manager.py +58 -15
  8. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/console_display.py +52 -2
  9. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/mcp_display.py +51 -14
  10. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/.gitignore +0 -0
  11. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/LICENSE +0 -0
  12. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/a2a/agent_executor.py +0 -0
  13. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/a2a/server.py +0 -0
  14. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/azure-openai/fastagent.config.yaml +0 -0
  15. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/bedrock/fast-agent.config.yaml +0 -0
  16. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/custom-agents/agent.py +0 -0
  17. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/custom-agents/fastagent.config.yaml +0 -0
  18. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/data-analysis/analysis-campaign.py +0 -0
  19. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/data-analysis/analysis.py +0 -0
  20. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/data-analysis/fastagent.config.yaml +0 -0
  21. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  22. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/fastapi/fastapi-advanced.py +0 -0
  23. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/fastapi/fastapi-simple.py +0 -0
  24. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/fastapi/pyproject.toml +0 -0
  25. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/fastapi/readme.md +0 -0
  26. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  27. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  28. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  29. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  30. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  31. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/forms_demo.py +0 -0
  32. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/game_character.py +0 -0
  33. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/game_character_handler.py +0 -0
  34. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/elicitations/tool_call.py +0 -0
  35. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  36. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  37. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  38. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  39. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/state-transfer/agent_one.py +0 -0
  40. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/state-transfer/agent_two.py +0 -0
  41. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  42. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  43. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/vision-examples/cat.png +0 -0
  44. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/vision-examples/example1.py +0 -0
  45. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/vision-examples/example2.py +0 -0
  46. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/vision-examples/example3.py +0 -0
  47. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  48. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/new-api/display_check.py +0 -0
  49. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/new-api/fastagent.config.yaml +0 -0
  50. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/new-api/simple_llm.py +0 -0
  51. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/new-api/simple_llm_advanced.py +0 -0
  52. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/new-api/simple_mcp.py +0 -0
  53. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/agent.py +0 -0
  54. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/fastagent.config.yaml +0 -0
  55. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/openapi_mcp_server.py +0 -0
  56. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/petstore.yaml +0 -0
  57. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/pyproject.toml +0 -0
  58. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/openapi/run-as-server.sh +0 -0
  59. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/otel/agent.py +0 -0
  60. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/otel/agent2.py +0 -0
  61. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/otel/docker-compose.yaml +0 -0
  62. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/otel/fastagent.config.yaml +0 -0
  63. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/researcher/fastagent.config.yaml +0 -0
  64. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/researcher/researcher-eval.py +0 -0
  65. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/researcher/researcher-imp.py +0 -0
  66. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/researcher/researcher.py +0 -0
  67. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/setup/.gitignore +0 -0
  68. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/setup/agent.py +0 -0
  69. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/setup/fastagent.config.yaml +0 -0
  70. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/setup/fastagent.secrets.yaml.example +0 -0
  71. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/setup/pyproject.toml.tmpl +0 -0
  72. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/.env.sample +0 -0
  73. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/Makefile +0 -0
  74. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/README.md +0 -0
  75. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/agent.py +0 -0
  76. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/demo_images/clam.jpg +0 -0
  77. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/demo_images/crab.png +0 -0
  78. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/demo_images/shrimp.png +0 -0
  79. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/docker-compose.yml +0 -0
  80. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/fastagent.config.yaml +0 -0
  81. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/image_demo.py +0 -0
  82. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  83. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  84. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  85. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  86. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/simple_agent.py +0 -0
  87. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  88. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  89. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  90. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tool-use-agent/agent.py +0 -0
  91. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/tool-use-agent/fastagent.config.yaml +0 -0
  92. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/chaining.py +0 -0
  93. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/evaluator.py +0 -0
  94. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/fastagent.config.yaml +0 -0
  95. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/graded_report.md +0 -0
  96. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/human_input.py +0 -0
  97. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/orchestrator.py +0 -0
  98. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/parallel.py +0 -0
  99. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/router.py +0 -0
  100. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/short_story.md +0 -0
  101. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/examples/workflows/short_story.txt +0 -0
  102. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/hatch_build.py +0 -0
  103. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/__init__.py +0 -0
  104. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/__init__.py +0 -0
  105. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/agent_types.py +0 -0
  106. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/llm_decorator.py +0 -0
  107. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/mcp_agent.py +0 -0
  108. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/tool_agent.py +0 -0
  109. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  110. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  111. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  112. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  113. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  114. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  115. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  116. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/__init__.py +0 -0
  117. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/__main__.py +0 -0
  118. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/auth.py +0 -0
  119. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/check_config.py +0 -0
  120. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/go.py +0 -0
  121. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/quickstart.py +0 -0
  122. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  123. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/setup.py +0 -0
  124. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/commands/url_parser.py +0 -0
  125. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/constants.py +0 -0
  126. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/main.py +0 -0
  127. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/cli/terminal.py +0 -0
  128. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/config.py +0 -0
  129. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/constants.py +0 -0
  130. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/context.py +0 -0
  131. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/context_dependent.py +0 -0
  132. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/__init__.py +0 -0
  133. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/agent_app.py +0 -0
  134. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/core_app.py +0 -0
  135. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/direct_decorators.py +0 -0
  136. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/direct_factory.py +0 -0
  137. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/error_handling.py +0 -0
  138. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/exceptions.py +0 -0
  139. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/executor/__init__.py +0 -0
  140. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/executor/executor.py +0 -0
  141. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/executor/task_registry.py +0 -0
  142. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  143. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/fastagent.py +0 -0
  144. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/__init__.py +0 -0
  145. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/events.py +0 -0
  146. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/json_serializer.py +0 -0
  147. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/listeners.py +0 -0
  148. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/logger.py +0 -0
  149. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/logging/transport.py +0 -0
  150. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/prompt.py +0 -0
  151. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/core/validation.py +0 -0
  152. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/event_progress.py +0 -0
  153. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/history/history_exporter.py +0 -0
  154. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/__init__.py +0 -0
  155. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  156. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/elicitation_state.py +0 -0
  157. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/form_fields.py +0 -0
  158. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/simple_form.py +0 -0
  159. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/human_input/types.py +0 -0
  160. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/interfaces.py +0 -0
  161. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/__init__.py +0 -0
  162. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/fastagent_llm.py +0 -0
  163. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/internal/passthrough.py +0 -0
  164. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/internal/playback.py +0 -0
  165. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/internal/silent.py +0 -0
  166. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/internal/slow.py +0 -0
  167. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/memory.py +0 -0
  168. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/model_database.py +0 -0
  169. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/model_factory.py +0 -0
  170. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/model_info.py +0 -0
  171. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/prompt_utils.py +0 -0
  172. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  173. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  174. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  175. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  176. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  177. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  178. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  179. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  180. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  181. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  182. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  183. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  184. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  185. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  186. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  187. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  188. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  189. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  190. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  191. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider_key_manager.py +0 -0
  192. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/provider_types.py +0 -0
  193. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/request_params.py +0 -0
  194. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/sampling_converter.py +0 -0
  195. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/llm/usage_tracking.py +0 -0
  196. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/__init__.py +0 -0
  197. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/common.py +0 -0
  198. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  199. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  200. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/gen_client.py +0 -0
  201. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  202. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  203. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  204. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/hf_auth.py +0 -0
  205. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/interfaces.py +0 -0
  206. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/logger_textio.py +0 -0
  207. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/mcp_aggregator.py +0 -0
  208. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/mcp_content.py +0 -0
  209. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/mime_utils.py +0 -0
  210. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/oauth_client.py +0 -0
  211. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompt.py +0 -0
  212. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  213. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompt_render.py +0 -0
  214. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  215. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  216. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  217. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  218. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  219. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  220. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  221. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  222. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/resource_utils.py +0 -0
  223. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/sampling.py +0 -0
  224. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/server/__init__.py +0 -0
  225. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/server/agent_server.py +0 -0
  226. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  227. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  228. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/transport_tracking.py +0 -0
  229. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/ui_agent.py +0 -0
  230. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp/ui_mixin.py +0 -0
  231. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/mcp_server_registry.py +0 -0
  232. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/py.typed +0 -0
  233. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  234. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  235. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  236. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  237. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  238. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  239. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  240. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  241. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  242. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  243. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  244. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  245. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  246. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  247. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  248. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  249. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  250. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  251. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  252. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  253. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  254. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  255. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  256. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  257. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  258. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  259. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  260. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  261. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  262. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  263. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  264. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  265. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  266. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  267. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  268. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  269. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  270. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  271. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  272. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  273. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  274. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  275. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  276. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  277. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  278. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  279. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  280. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  281. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  282. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  283. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/setup/.gitignore +0 -0
  284. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/setup/agent.py +0 -0
  285. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
  286. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  287. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  288. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/tools/elicitation.py +0 -0
  289. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/types/__init__.py +0 -0
  290. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/types/llm_stop_reason.py +0 -0
  291. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/__init__.py +0 -0
  292. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/console.py +0 -0
  293. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/elicitation_form.py +0 -0
  294. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/elicitation_style.py +0 -0
  295. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/enhanced_prompt.py +0 -0
  296. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/history_display.py +0 -0
  297. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/interactive_prompt.py +0 -0
  298. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  299. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/mermaid_utils.py +0 -0
  300. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/notification_tracker.py +0 -0
  301. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/progress_display.py +0 -0
  302. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/rich_progress.py +0 -0
  303. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.13}/src/fast_agent/ui/usage_display.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.3.12
3
+ Version: 0.3.13
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
@@ -208,7 +208,7 @@ License-File: LICENSE
208
208
  Classifier: License :: OSI Approved :: Apache Software License
209
209
  Classifier: Operating System :: OS Independent
210
210
  Classifier: Programming Language :: Python :: 3
211
- Requires-Python: >=3.13.5
211
+ Requires-Python: <3.14,>=3.13.5
212
212
  Requires-Dist: a2a-sdk>=0.3.6
213
213
  Requires-Dist: aiohttp>=3.11.13
214
214
  Requires-Dist: anthropic>=0.69.0
@@ -249,15 +249,24 @@ Description-Content-Type: text/markdown
249
249
  ## Overview
250
250
 
251
251
  > [!TIP]
252
- > Documentation site is in production here : https://fast-agent.ai. Feel free to feed back what's helpful and what's not. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
252
+ > Please see : https://fast-agent.ai for latest documentation. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
253
253
 
254
- **`fast-agent`** enables you to create and interact with sophisticated Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling. Model support is comprehensive with native support for Anthropic, OpenAI and Google as well as Azure, Ollama, Deepseek and dozens of others via TensorZero.
254
+ **`fast-agent`** enables you to create and interact with sophisticated multimodal Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling and Elicitations.
255
255
 
256
- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6)
256
+ <!-- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6) -->
257
257
 
258
258
  The simple declarative syntax lets you concentrate on composing your Prompts and MCP Servers to [build effective agents](https://www.anthropic.com/research/building-effective-agents).
259
259
 
260
- `fast-agent` is multi-modal, supporting Images and PDFs for both Anthropic and OpenAI endpoints via Prompts, Resources and MCP Tool Call results. The inclusion of passthrough and playback LLMs enable rapid development and test of Python glue-code for your applications.
260
+ Model support is comprehensive with native support for Anthropic, OpenAI and Google providers as well as Azure, Ollama, Deepseek and dozens of others via TensorZero. Structured Outputs, PDF and Vision support is simple to use and well tested. Passthrough and Playback LLMs enable rapid development and test of Python glue-code for your applications.
261
+
262
+ <img width="800" alt="MCP Transport Diagnostics" src="https://github.com/user-attachments/assets/e26472de-58d9-4726-8bdd-01eb407414cf" />
263
+
264
+
265
+ `fast-agent` is the only tool that allows you to inspect Streamable HTTP Transport usage - a critical feature for ensuring reliable, compliant deployments. OAuth is supported with KeyRing storage for secrets. Use the `fast-agent auth` command to manage.
266
+
267
+
268
+
269
+
261
270
 
262
271
  > [!IMPORTANT]
263
272
  >
@@ -10,15 +10,24 @@
10
10
  ## Overview
11
11
 
12
12
  > [!TIP]
13
- > Documentation site is in production here : https://fast-agent.ai. Feel free to feed back what's helpful and what's not. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
13
+ > Please see : https://fast-agent.ai for latest documentation. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
14
14
 
15
- **`fast-agent`** enables you to create and interact with sophisticated Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling. Model support is comprehensive with native support for Anthropic, OpenAI and Google as well as Azure, Ollama, Deepseek and dozens of others via TensorZero.
15
+ **`fast-agent`** enables you to create and interact with sophisticated multimodal Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling and Elicitations.
16
16
 
17
- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6)
17
+ <!-- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6) -->
18
18
 
19
19
  The simple declarative syntax lets you concentrate on composing your Prompts and MCP Servers to [build effective agents](https://www.anthropic.com/research/building-effective-agents).
20
20
 
21
- `fast-agent` is multi-modal, supporting Images and PDFs for both Anthropic and OpenAI endpoints via Prompts, Resources and MCP Tool Call results. The inclusion of passthrough and playback LLMs enable rapid development and test of Python glue-code for your applications.
21
+ Model support is comprehensive with native support for Anthropic, OpenAI and Google providers as well as Azure, Ollama, Deepseek and dozens of others via TensorZero. Structured Outputs, PDF and Vision support is simple to use and well tested. Passthrough and Playback LLMs enable rapid development and test of Python glue-code for your applications.
22
+
23
+ <img width="800" alt="MCP Transport Diagnostics" src="https://github.com/user-attachments/assets/e26472de-58d9-4726-8bdd-01eb407414cf" />
24
+
25
+
26
+ `fast-agent` is the only tool that allows you to inspect Streamable HTTP Transport usage - a critical feature for ensuring reliable, compliant deployments. OAuth is supported with KeyRing storage for secrets. Use the `fast-agent auth` command to manage.
27
+
28
+
29
+
30
+
22
31
 
23
32
  > [!IMPORTANT]
24
33
  >
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.12"
3
+ version = "0.3.13"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -12,7 +12,7 @@ classifiers = [
12
12
  "License :: OSI Approved :: Apache Software License",
13
13
  "Operating System :: OS Independent"
14
14
  ]
15
- requires-python = ">=3.13.5"
15
+ requires-python = ">=3.13.5,<3.14"
16
16
  dependencies = [
17
17
  "fastapi>=0.115.6",
18
18
  "mcp==1.16.0",
@@ -170,7 +170,7 @@ class LlmAgent(LlmDecorator):
170
170
  combined += segment
171
171
  additional_message_text = combined
172
172
 
173
- message_text = message.last_text() or ""
173
+ message_text = message
174
174
 
175
175
  # Use provided name/model or fall back to defaults
176
176
  display_name = name if name is not None else self.name
@@ -53,6 +53,14 @@ class GoogleConverter:
53
53
  if key in unsupported_keys:
54
54
  continue # Skip this key
55
55
 
56
+ # Rewrite unsupported 'const' to a safe form for Gemini tools
57
+ # - For string const, convert to enum [value]
58
+ # - For non-string const (booleans/numbers), drop the constraint
59
+ if key == "const":
60
+ if isinstance(value, str):
61
+ cleaned_schema["enum"] = [value]
62
+ continue
63
+
56
64
  if (
57
65
  key == "format"
58
66
  and schema.get("type") == "string"
@@ -140,9 +148,8 @@ class GoogleConverter:
140
148
  )
141
149
  elif is_resource_content(part_content):
142
150
  assert isinstance(part_content, EmbeddedResource)
143
- if (
144
- "application/pdf" == part_content.resource.mimeType
145
- and isinstance(part_content.resource, BlobResourceContents)
151
+ if "application/pdf" == part_content.resource.mimeType and isinstance(
152
+ part_content.resource, BlobResourceContents
146
153
  ):
147
154
  pdf_bytes = base64.b64decode(part_content.resource.blob)
148
155
  parts.append(
@@ -4,6 +4,7 @@ It adds logging and supports sampling requests.
4
4
  """
5
5
 
6
6
  from datetime import timedelta
7
+ from time import perf_counter
7
8
  from typing import TYPE_CHECKING
8
9
 
9
10
  from mcp import ClientSession, ServerNotification
@@ -207,6 +208,7 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
207
208
  ) -> ReceiveResultT:
208
209
  logger.debug("send_request: request=", data=request.model_dump())
209
210
  request_id = getattr(self, "_request_id", None)
211
+ start_time = perf_counter()
210
212
  try:
211
213
  result = await super().send_request(
212
214
  request=request,
@@ -220,6 +222,7 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
220
222
  data=result.model_dump() if result is not None else "no response returned",
221
223
  )
222
224
  self._attach_transport_channel(request_id, result)
225
+ self._attach_transport_elapsed(result, perf_counter() - start_time)
223
226
  return result
224
227
  except Exception as e:
225
228
  # Handle connection errors cleanly
@@ -250,6 +253,16 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
250
253
  # If result cannot be mutated, ignore silently
251
254
  pass
252
255
 
256
+ @staticmethod
257
+ def _attach_transport_elapsed(result, elapsed: float | None) -> None:
258
+ if result is None or elapsed is None:
259
+ return
260
+ try:
261
+ setattr(result, "transport_elapsed", max(elapsed, 0.0))
262
+ except Exception:
263
+ # Ignore if result is immutable
264
+ pass
265
+
253
266
  async def _received_notification(self, notification: ServerNotification) -> None:
254
267
  """
255
268
  Can be overridden by subclasses to handle a notification without needing
@@ -38,6 +38,8 @@ from fast_agent.mcp.streamable_http_tracking import tracking_streamablehttp_clie
38
38
  from fast_agent.mcp.transport_tracking import TransportChannelMetrics
39
39
 
40
40
  if TYPE_CHECKING:
41
+ from mcp.client.auth import OAuthClientProvider
42
+
41
43
  from fast_agent.context import Context
42
44
  from fast_agent.mcp_server_registry import ServerRegistry
43
45
 
@@ -65,6 +67,38 @@ def _add_none_to_context(context_manager):
65
67
  return StreamingContextAdapter(context_manager)
66
68
 
67
69
 
70
+ def _prepare_headers_and_auth(
71
+ server_config: MCPServerSettings,
72
+ ) -> tuple[dict[str, str], Optional["OAuthClientProvider"], set[str]]:
73
+ """
74
+ Prepare request headers and determine if OAuth authentication should be used.
75
+
76
+ Returns a copy of the headers, an OAuth auth provider when applicable, and the set
77
+ of user-supplied authorization header keys.
78
+ """
79
+ headers: dict[str, str] = dict(server_config.headers or {})
80
+ auth_header_keys = {"authorization", "x-hf-authorization"}
81
+ user_provided_auth_keys = {key for key in headers if key.lower() in auth_header_keys}
82
+
83
+ # OAuth is only relevant for SSE/HTTP transports and should be skipped when the
84
+ # user has already supplied explicit Authorization headers.
85
+ if server_config.transport not in ("sse", "http") or user_provided_auth_keys:
86
+ return headers, None, user_provided_auth_keys
87
+
88
+ oauth_auth = build_oauth_provider(server_config)
89
+ if oauth_auth is not None:
90
+ # Scrub Authorization headers so OAuth-managed credentials are the only ones sent.
91
+ for header_name in (
92
+ "Authorization",
93
+ "authorization",
94
+ "X-HF-Authorization",
95
+ "x-hf-authorization",
96
+ ):
97
+ headers.pop(header_name, None)
98
+
99
+ return headers, oauth_auth, user_provided_auth_keys
100
+
101
+
68
102
  class ServerConnection:
69
103
  """
70
104
  Represents a long-lived MCP server connection, including:
@@ -113,7 +147,9 @@ class ServerConnection:
113
147
  self.server_implementation: Implementation | None = None
114
148
  self.client_capabilities: dict | None = None
115
149
  self.server_instructions_available: bool = False
116
- self.server_instructions_enabled: bool = server_config.include_instructions if server_config else True
150
+ self.server_instructions_enabled: bool = (
151
+ server_config.include_instructions if server_config else True
152
+ )
117
153
  self.session_id: str | None = None
118
154
  self._get_session_id_cb: GetSessionIdCallback | None = None
119
155
  self.transport_metrics: TransportChannelMetrics | None = None
@@ -404,7 +440,9 @@ class MCPConnectionManager(ContextDependent):
404
440
 
405
441
  logger.debug(f"{server_name}: Found server configuration=", data=config.model_dump())
406
442
 
407
- transport_metrics = TransportChannelMetrics() if config.transport in ("http", "stdio") else None
443
+ transport_metrics = (
444
+ TransportChannelMetrics() if config.transport in ("http", "stdio") else None
445
+ )
408
446
 
409
447
  def transport_context_factory():
410
448
  if config.transport == "stdio":
@@ -425,7 +463,9 @@ class MCPConnectionManager(ContextDependent):
425
463
 
426
464
  channel_hook = transport_metrics.record_event if transport_metrics else None
427
465
  return _add_none_to_context(
428
- tracking_stdio_client(server_params, channel_hook=channel_hook, errlog=error_handler)
466
+ tracking_stdio_client(
467
+ server_params, channel_hook=channel_hook, errlog=error_handler
468
+ )
429
469
  )
430
470
  elif config.transport == "sse":
431
471
  if not config.url:
@@ -434,12 +474,12 @@ class MCPConnectionManager(ContextDependent):
434
474
  )
435
475
  # Suppress MCP library error spam
436
476
  self._suppress_mcp_sse_errors()
437
- oauth_auth = build_oauth_provider(config)
438
- # If using OAuth, strip any pre-existing Authorization headers to avoid conflicts
439
- headers = dict(config.headers or {})
440
- if oauth_auth is not None:
441
- headers.pop("Authorization", None)
442
- headers.pop("X-HF-Authorization", None)
477
+ headers, oauth_auth, user_auth_keys = _prepare_headers_and_auth(config)
478
+ if user_auth_keys:
479
+ logger.debug(
480
+ f"{server_name}: Using user-specified auth header(s); skipping OAuth provider.",
481
+ user_auth_headers=sorted(user_auth_keys),
482
+ )
443
483
  return _add_none_to_context(
444
484
  sse_client(
445
485
  config.url,
@@ -453,19 +493,22 @@ class MCPConnectionManager(ContextDependent):
453
493
  raise ValueError(
454
494
  f"Server '{server_name}' uses http transport but no url is specified"
455
495
  )
456
- oauth_auth = build_oauth_provider(config)
457
- headers = dict(config.headers or {})
458
- if oauth_auth is not None:
459
- headers.pop("Authorization", None)
460
- headers.pop("X-HF-Authorization", None)
496
+ headers, oauth_auth, user_auth_keys = _prepare_headers_and_auth(config)
497
+ if user_auth_keys:
498
+ logger.debug(
499
+ f"{server_name}: Using user-specified auth header(s); skipping OAuth provider.",
500
+ user_auth_headers=sorted(user_auth_keys),
501
+ )
461
502
  channel_hook = None
462
503
  if transport_metrics is not None:
504
+
463
505
  def channel_hook(event):
464
506
  try:
465
507
  transport_metrics.record_event(event)
466
508
  except Exception: # pragma: no cover - defensive guard
467
509
  logger.debug(
468
- "%s: transport metrics hook failed", server_name,
510
+ "%s: transport metrics hook failed",
511
+ server_name,
469
512
  exc_info=True,
470
513
  )
471
514
 
@@ -6,6 +6,7 @@ from mcp.types import CallToolResult
6
6
  from rich.panel import Panel
7
7
  from rich.text import Text
8
8
 
9
+ from fast_agent.constants import REASONING
9
10
  from fast_agent.ui import console
10
11
  from fast_agent.ui.mcp_ui_utils import UILink
11
12
  from fast_agent.ui.mermaid_utils import (
@@ -144,6 +145,25 @@ class ConsoleDisplay:
144
145
  self._markup = config.logger.enable_markup if config else True
145
146
  self._escape_xml = True
146
147
 
148
+ @staticmethod
149
+ def _format_elapsed(elapsed: float) -> str:
150
+ """Format elapsed seconds for display."""
151
+ if elapsed < 0:
152
+ elapsed = 0.0
153
+ if elapsed < 0.001:
154
+ return "<1ms"
155
+ if elapsed < 1:
156
+ return f"{elapsed * 1000:.0f}ms"
157
+ if elapsed < 10:
158
+ return f"{elapsed:.2f}s"
159
+ if elapsed < 60:
160
+ return f"{elapsed:.1f}s"
161
+ minutes, seconds = divmod(elapsed, 60)
162
+ if minutes < 60:
163
+ return f"{int(minutes)}m {seconds:02.0f}s"
164
+ hours, minutes = divmod(int(minutes), 60)
165
+ return f"{hours}h {minutes:02d}m"
166
+
147
167
  def display_message(
148
168
  self,
149
169
  content: Any,
@@ -156,6 +176,7 @@ class ConsoleDisplay:
156
176
  is_error: bool = False,
157
177
  truncate_content: bool = True,
158
178
  additional_message: Text | None = None,
179
+ pre_content: Text | None = None,
159
180
  ) -> None:
160
181
  """
161
182
  Unified method to display formatted messages to the console.
@@ -170,6 +191,8 @@ class ConsoleDisplay:
170
191
  max_item_length: Optional max length for bottom metadata items (with ellipsis)
171
192
  is_error: For tool results, whether this is an error (uses red color)
172
193
  truncate_content: Whether to truncate long content
194
+ additional_message: Optional Rich Text appended after the main content
195
+ pre_content: Optional Rich Text shown before the main content
173
196
  """
174
197
  # Get configuration for this message type
175
198
  config = MESSAGE_CONFIGS[message_type]
@@ -191,6 +214,8 @@ class ConsoleDisplay:
191
214
  self._create_combined_separator_status(left, right_info)
192
215
 
193
216
  # Display the content
217
+ if pre_content and pre_content.plain:
218
+ console.console.print(pre_content, markup=self._markup)
194
219
  self._display_content(
195
220
  content, truncate_content, is_error, message_type, check_markdown_markers=False
196
221
  )
@@ -544,7 +569,7 @@ class ConsoleDisplay:
544
569
 
545
570
  # Build transport channel info for bottom bar
546
571
  channel = getattr(result, "transport_channel", None)
547
- bottom_metadata = None
572
+ bottom_metadata_items: List[str] = []
548
573
  if channel:
549
574
  # Format channel info for bottom bar
550
575
  if channel == "post-json":
@@ -560,7 +585,13 @@ class ConsoleDisplay:
560
585
  else:
561
586
  transport_info = channel.upper()
562
587
 
563
- bottom_metadata = [transport_info]
588
+ bottom_metadata_items.append(transport_info)
589
+
590
+ elapsed = getattr(result, "transport_elapsed", None)
591
+ if isinstance(elapsed, (int, float)):
592
+ bottom_metadata_items.append(self._format_elapsed(float(elapsed)))
593
+
594
+ bottom_metadata = bottom_metadata_items or None
564
595
 
565
596
  # Build right info (without channel info)
566
597
  right_info = f"[dim]tool result - {status}[/dim]"
@@ -724,8 +755,26 @@ class ConsoleDisplay:
724
755
  # Extract text from PromptMessageExtended if needed
725
756
  from fast_agent.types import PromptMessageExtended
726
757
 
758
+ pre_content: Text | None = None
759
+
727
760
  if isinstance(message_text, PromptMessageExtended):
728
761
  display_text = message_text.last_text() or ""
762
+
763
+ channels = message_text.channels or {}
764
+ reasoning_blocks = channels.get(REASONING) or []
765
+ if reasoning_blocks:
766
+ from fast_agent.mcp.helpers.content_helpers import get_text
767
+
768
+ reasoning_segments = []
769
+ for block in reasoning_blocks:
770
+ text = get_text(block)
771
+ if text:
772
+ reasoning_segments.append(text)
773
+
774
+ if reasoning_segments:
775
+ joined = "\n".join(reasoning_segments)
776
+ if joined.strip():
777
+ pre_content = Text(joined, style="dim default")
729
778
  else:
730
779
  display_text = message_text
731
780
 
@@ -743,6 +792,7 @@ class ConsoleDisplay:
743
792
  max_item_length=max_item_length,
744
793
  truncate_content=False, # Assistant messages shouldn't be truncated
745
794
  additional_message=additional_message,
795
+ pre_content=pre_content,
746
796
  )
747
797
 
748
798
  # Handle mermaid diagrams separately (after the main message)
@@ -54,6 +54,17 @@ class Colours:
54
54
  TEXT_CYAN = "cyan"
55
55
 
56
56
 
57
+ # Symbol definitions for timelines and legends
58
+ SYMBOL_IDLE = "·"
59
+ SYMBOL_ERROR = "●"
60
+ SYMBOL_RESPONSE = "▼"
61
+ SYMBOL_NOTIFICATION = "●"
62
+ SYMBOL_REQUEST = "◆"
63
+ SYMBOL_STDIO_ACTIVITY = "●"
64
+ SYMBOL_PING = "●"
65
+ SYMBOL_DISABLED = "▽"
66
+
67
+
57
68
  # Color mappings for different contexts
58
69
  TIMELINE_COLORS = {
59
70
  "error": Colours.ERROR,
@@ -263,11 +274,19 @@ def _build_inline_timeline(buckets: Iterable[str]) -> str:
263
274
  for state in buckets:
264
275
  color = TIMELINE_COLORS.get(state, Colours.NONE)
265
276
  if state in {"idle", "none"}:
266
- symbol = "·"
277
+ symbol = SYMBOL_IDLE
267
278
  elif state == "request":
268
- symbol = "◆" # Diamond for requests - rare and important
279
+ symbol = SYMBOL_REQUEST
280
+ elif state == "notification":
281
+ symbol = SYMBOL_NOTIFICATION
282
+ elif state == "error":
283
+ symbol = SYMBOL_ERROR
284
+ elif state == "ping":
285
+ symbol = SYMBOL_PING
286
+ elif state == "disabled":
287
+ symbol = SYMBOL_DISABLED
269
288
  else:
270
- symbol = "●" # Circle for other activity
289
+ symbol = SYMBOL_RESPONSE
271
290
  timeline += f"[bold {color}]{symbol}[/bold {color}]"
272
291
  timeline += " [dim]now[/dim]"
273
292
  return timeline
@@ -416,7 +435,12 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
416
435
  elif arrow_style == Colours.ARROW_ERROR and "GET" in label:
417
436
  # Highlight GET stream errors in red to match the arrow indicator
418
437
  label_style = Colours.TEXT_ERROR
419
- elif channel.request_count == 0 and channel.response_count == 0:
438
+ elif (
439
+ channel.request_count == 0
440
+ and channel.response_count == 0
441
+ and channel.notification_count == 0
442
+ and (channel.ping_count or 0) == 0
443
+ ):
420
444
  # No activity = dim
421
445
  label_style = Colours.TEXT_DIM
422
446
  else:
@@ -431,19 +455,26 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
431
455
  for bucket_state in channel.activity_buckets:
432
456
  color = timeline_color_map.get(bucket_state, "dim")
433
457
  if bucket_state in {"idle", "none"}:
434
- symbol = "·"
458
+ symbol = SYMBOL_IDLE
435
459
  elif is_stdio:
436
- # For STDIO, all activity shows as filled circles since types are combined
437
- symbol = "●"
460
+ symbol = SYMBOL_STDIO_ACTIVITY
438
461
  elif bucket_state == "request":
439
- symbol = "◆" # Diamond for requests - rare and important
462
+ symbol = SYMBOL_REQUEST
463
+ elif bucket_state == "notification":
464
+ symbol = SYMBOL_NOTIFICATION
465
+ elif bucket_state == "error":
466
+ symbol = SYMBOL_ERROR
467
+ elif bucket_state == "ping":
468
+ symbol = SYMBOL_PING
469
+ elif bucket_state == "disabled":
470
+ symbol = SYMBOL_DISABLED
440
471
  else:
441
- symbol = "●" # Circle for other activity
472
+ symbol = SYMBOL_RESPONSE
442
473
  line.append(symbol, style=f"bold {color}")
443
474
  else:
444
475
  # Show dim dots for no activity
445
476
  for _ in range(20):
446
- line.append("·", style="black dim")
477
+ line.append(SYMBOL_IDLE, style="black dim")
447
478
  line.append(" now", style="dim")
448
479
 
449
480
  # Metrics - different layouts for stdio vs HTTP
@@ -548,11 +579,17 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
548
579
  if i > 0:
549
580
  footer.append(" ", style="dim")
550
581
  if name == "idle":
551
- symbol = "·"
582
+ symbol = SYMBOL_IDLE
552
583
  elif name == "request":
553
- symbol = "◆" # Diamond for requests
584
+ symbol = SYMBOL_REQUEST
585
+ elif name == "notification":
586
+ symbol = SYMBOL_NOTIFICATION
587
+ elif name == "error":
588
+ symbol = SYMBOL_ERROR
589
+ elif name == "ping":
590
+ symbol = SYMBOL_PING
554
591
  else:
555
- symbol = "●"
592
+ symbol = SYMBOL_RESPONSE
556
593
  footer.append(symbol, style=f"{color}")
557
594
  footer.append(f" {name}", style="dim")
558
595
 
@@ -619,7 +656,7 @@ async def render_mcp_status(agent, indent: str = "") -> None:
619
656
 
620
657
  header_label = Text(indent)
621
658
  header_label.append("▎", style=Colours.TEXT_CYAN)
622
- header_label.append("●", style=f"dim {Colours.TEXT_CYAN}")
659
+ header_label.append(SYMBOL_RESPONSE, style=f"dim {Colours.TEXT_CYAN}")
623
660
  header_label.append(f" [{index:2}] ", style=Colours.TEXT_CYAN)
624
661
  header_label.append(server, style=f"{Colours.TEXT_INFO} bold")
625
662
  render_header(header_label)
File without changes