fast-agent-mcp 0.3.12__tar.gz → 0.3.14__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 (306) hide show
  1. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/PKG-INFO +16 -7
  2. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/README.md +13 -4
  3. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/setup/fastagent.config.yaml +5 -0
  4. {fast_agent_mcp-0.3.12/src/fast_agent/resources → fast_agent_mcp-0.3.14}/examples/workflows/router.py +1 -0
  5. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/pyproject.toml +3 -3
  6. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/llm_agent.py +15 -34
  7. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/llm_decorator.py +13 -2
  8. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/mcp_agent.py +18 -2
  9. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/tool_agent.py +8 -10
  10. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/check_config.py +45 -1
  11. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/config.py +63 -0
  12. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/constants.py +3 -0
  13. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/context.py +42 -9
  14. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/listeners.py +1 -1
  15. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/event_progress.py +2 -3
  16. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/interfaces.py +9 -2
  17. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_factory.py +4 -0
  18. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/google/google_converter.py +10 -3
  19. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider_key_manager.py +1 -0
  20. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider_types.py +1 -0
  21. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/request_params.py +3 -1
  22. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_agent_client_session.py +13 -0
  23. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_aggregator.py +313 -40
  24. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_connection_manager.py +95 -22
  25. fast_agent_mcp-0.3.14/src/fast_agent/mcp/skybridge.py +45 -0
  26. fast_agent_mcp-0.3.14/src/fast_agent/mcp/sse_tracking.py +287 -0
  27. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/transport_tracking.py +37 -3
  28. fast_agent_mcp-0.3.14/src/fast_agent/mcp/types.py +24 -0
  29. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14/src/fast_agent/resources}/examples/workflows/router.py +1 -0
  30. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/fastagent.config.yaml +5 -0
  31. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/console_display.py +347 -20
  32. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/enhanced_prompt.py +107 -58
  33. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/interactive_prompt.py +57 -34
  34. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mcp_display.py +159 -41
  35. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/rich_progress.py +4 -1
  36. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/.gitignore +0 -0
  37. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/LICENSE +0 -0
  38. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/a2a/agent_executor.py +0 -0
  39. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/a2a/server.py +0 -0
  40. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/azure-openai/fastagent.config.yaml +0 -0
  41. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/bedrock/fast-agent.config.yaml +0 -0
  42. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/custom-agents/agent.py +0 -0
  43. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/custom-agents/fastagent.config.yaml +0 -0
  44. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/data-analysis/analysis-campaign.py +0 -0
  45. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/data-analysis/analysis.py +0 -0
  46. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/data-analysis/fastagent.config.yaml +0 -0
  47. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  48. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/fastapi/fastapi-advanced.py +0 -0
  49. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/fastapi/fastapi-simple.py +0 -0
  50. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/fastapi/pyproject.toml +0 -0
  51. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/fastapi/readme.md +0 -0
  52. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  53. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  54. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  55. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  56. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  57. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/forms_demo.py +0 -0
  58. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/game_character.py +0 -0
  59. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/game_character_handler.py +0 -0
  60. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/tool_call.py +0 -0
  61. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  62. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  63. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  64. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  65. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/agent_one.py +0 -0
  66. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/agent_two.py +0 -0
  67. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  68. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  69. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/cat.png +0 -0
  70. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example1.py +0 -0
  71. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example2.py +0 -0
  72. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example3.py +0 -0
  73. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  74. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/new-api/display_check.py +0 -0
  75. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/new-api/fastagent.config.yaml +0 -0
  76. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/new-api/simple_llm.py +0 -0
  77. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/new-api/simple_llm_advanced.py +0 -0
  78. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/new-api/simple_mcp.py +0 -0
  79. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/agent.py +0 -0
  80. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/fastagent.config.yaml +0 -0
  81. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/openapi_mcp_server.py +0 -0
  82. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/petstore.yaml +0 -0
  83. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/pyproject.toml +0 -0
  84. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/openapi/run-as-server.sh +0 -0
  85. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/otel/agent.py +0 -0
  86. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/otel/agent2.py +0 -0
  87. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/otel/docker-compose.yaml +0 -0
  88. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/otel/fastagent.config.yaml +0 -0
  89. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/researcher/fastagent.config.yaml +0 -0
  90. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/researcher/researcher-eval.py +0 -0
  91. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/researcher/researcher-imp.py +0 -0
  92. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/researcher/researcher.py +0 -0
  93. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/setup/.gitignore +0 -0
  94. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/setup/agent.py +0 -0
  95. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/setup/fastagent.secrets.yaml.example +0 -0
  96. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/setup/pyproject.toml.tmpl +0 -0
  97. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/.env.sample +0 -0
  98. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/Makefile +0 -0
  99. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/README.md +0 -0
  100. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/agent.py +0 -0
  101. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/clam.jpg +0 -0
  102. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/crab.png +0 -0
  103. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/shrimp.png +0 -0
  104. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/docker-compose.yml +0 -0
  105. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/fastagent.config.yaml +0 -0
  106. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/image_demo.py +0 -0
  107. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  108. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  109. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  110. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  111. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/simple_agent.py +0 -0
  112. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  113. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  114. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  115. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tool-use-agent/agent.py +0 -0
  116. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/tool-use-agent/fastagent.config.yaml +0 -0
  117. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/chaining.py +0 -0
  118. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/evaluator.py +0 -0
  119. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/fastagent.config.yaml +0 -0
  120. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/graded_report.md +0 -0
  121. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/human_input.py +0 -0
  122. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/orchestrator.py +0 -0
  123. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/parallel.py +0 -0
  124. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/short_story.md +0 -0
  125. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/examples/workflows/short_story.txt +0 -0
  126. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/hatch_build.py +0 -0
  127. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/__init__.py +0 -0
  128. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/__init__.py +0 -0
  129. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/agent_types.py +0 -0
  130. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  131. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  132. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  133. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  134. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  135. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  136. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  137. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/__init__.py +0 -0
  138. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/__main__.py +0 -0
  139. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/auth.py +0 -0
  140. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/go.py +0 -0
  141. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/quickstart.py +0 -0
  142. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  143. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/setup.py +0 -0
  144. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/url_parser.py +0 -0
  145. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/constants.py +0 -0
  146. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/main.py +0 -0
  147. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/terminal.py +0 -0
  148. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/context_dependent.py +0 -0
  149. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/__init__.py +0 -0
  150. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/agent_app.py +0 -0
  151. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/core_app.py +0 -0
  152. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/direct_decorators.py +0 -0
  153. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/direct_factory.py +0 -0
  154. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/error_handling.py +0 -0
  155. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/exceptions.py +0 -0
  156. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/__init__.py +0 -0
  157. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/executor.py +0 -0
  158. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/task_registry.py +0 -0
  159. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  160. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/fastagent.py +0 -0
  161. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/__init__.py +0 -0
  162. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/events.py +0 -0
  163. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/json_serializer.py +0 -0
  164. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/logger.py +0 -0
  165. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/transport.py +0 -0
  166. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/prompt.py +0 -0
  167. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/core/validation.py +0 -0
  168. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/history/history_exporter.py +0 -0
  169. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/__init__.py +0 -0
  170. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  171. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/elicitation_state.py +0 -0
  172. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/form_fields.py +0 -0
  173. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/simple_form.py +0 -0
  174. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/types.py +0 -0
  175. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/__init__.py +0 -0
  176. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/fastagent_llm.py +0 -0
  177. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/passthrough.py +0 -0
  178. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/playback.py +0 -0
  179. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/silent.py +0 -0
  180. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/slow.py +0 -0
  181. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/memory.py +0 -0
  182. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_database.py +0 -0
  183. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_info.py +0 -0
  184. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/prompt_utils.py +0 -0
  185. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  186. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  187. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  188. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  189. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  190. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  191. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  192. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  193. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  194. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  195. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  196. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  197. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  198. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  199. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  200. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  201. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  202. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  203. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  204. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/sampling_converter.py +0 -0
  205. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/usage_tracking.py +0 -0
  206. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/__init__.py +0 -0
  207. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/common.py +0 -0
  208. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  209. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  210. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/gen_client.py +0 -0
  211. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  212. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  213. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  214. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/hf_auth.py +0 -0
  215. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/interfaces.py +0 -0
  216. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/logger_textio.py +0 -0
  217. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_content.py +0 -0
  218. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mime_utils.py +0 -0
  219. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/oauth_client.py +0 -0
  220. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt.py +0 -0
  221. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  222. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_render.py +0 -0
  223. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  224. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  225. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  226. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  227. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  228. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  229. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  230. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  231. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/resource_utils.py +0 -0
  232. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/sampling.py +0 -0
  233. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/server/__init__.py +0 -0
  234. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/server/agent_server.py +0 -0
  235. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  236. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  237. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/ui_agent.py +0 -0
  238. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/ui_mixin.py +0 -0
  239. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp_server_registry.py +0 -0
  240. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/py.typed +0 -0
  241. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  242. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  243. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  244. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  245. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  246. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  247. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  248. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  249. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  250. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  251. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  252. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  253. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  254. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  255. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  256. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  257. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  258. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  259. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  260. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  261. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  262. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  263. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  264. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  265. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  266. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  267. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  268. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  269. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  270. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  271. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  272. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  273. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  274. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  275. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  276. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  277. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  278. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  279. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  280. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  281. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  282. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  283. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  284. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  285. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  286. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  287. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  288. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  289. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  290. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/.gitignore +0 -0
  291. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/agent.py +0 -0
  292. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  293. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  294. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/tools/elicitation.py +0 -0
  295. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/types/__init__.py +0 -0
  296. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/types/llm_stop_reason.py +0 -0
  297. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/__init__.py +0 -0
  298. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/console.py +0 -0
  299. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/elicitation_form.py +0 -0
  300. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/elicitation_style.py +0 -0
  301. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/history_display.py +0 -0
  302. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  303. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mermaid_utils.py +0 -0
  304. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/notification_tracker.py +0 -0
  305. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/progress_display.py +0 -0
  306. {fast_agent_mcp-0.3.12 → fast_agent_mcp-0.3.14}/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.14
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
@@ -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.33.0
221
221
  Requires-Dist: keyring>=24.3.1
222
- Requires-Dist: mcp==1.16.0
222
+ Requires-Dist: mcp==1.17.0
223
223
  Requires-Dist: openai>=2.1.0
224
224
  Requires-Dist: opentelemetry-distro>=0.55b0
225
225
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.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
  >
@@ -15,6 +15,11 @@ default_model: gpt-5-mini.low
15
15
  # mcp_ui_output_dir: ".fast-agent/ui" # Where to write MCP-UI HTML files (relative to CWD if not absolute)
16
16
  # mcp_ui_mode: enabled
17
17
 
18
+ # MCP timeline display (adjust activity window/intervals in MCP UI + fast-agent check)
19
+ #mcp_timeline:
20
+ # steps: 20 # number of timeline buckets to render
21
+ # step_seconds: 30 # seconds per bucket (accepts values like "45s", "2m")
22
+
18
23
  # Logging and Console Configuration:
19
24
  logger:
20
25
  # level: "debug" | "info" | "warning" | "error"
@@ -60,6 +60,7 @@ async def main() -> None:
60
60
  await agent.interactive(agent_name="route")
61
61
  for request in SAMPLE_REQUESTS:
62
62
  await agent.route(request)
63
+ await agent.interactive()
63
64
 
64
65
 
65
66
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.12"
3
+ version = "0.3.14"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -12,10 +12,10 @@ 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
- "mcp==1.16.0",
18
+ "mcp==1.17.0",
19
19
  "opentelemetry-distro>=0.55b0",
20
20
  "opentelemetry-exporter-otlp-proto-http>=1.7.0",
21
21
  "pydantic-settings>=2.7.0",
@@ -58,7 +58,16 @@ class LlmAgent(LlmDecorator):
58
58
  super().__init__(config=config, context=context)
59
59
 
60
60
  # Initialize display component
61
- self.display = ConsoleDisplay(config=self._context.config if self._context else None)
61
+ self._display = ConsoleDisplay(config=self._context.config if self._context else None)
62
+
63
+ @property
64
+ def display(self) -> ConsoleDisplay:
65
+ """UI display helper for presenting messages and tool activity."""
66
+ return self._display
67
+
68
+ @display.setter
69
+ def display(self, value: ConsoleDisplay) -> None:
70
+ self._display = value
62
71
 
63
72
  async def show_assistant_message(
64
73
  self,
@@ -139,7 +148,10 @@ class LlmAgent(LlmDecorator):
139
148
  else:
140
149
  # Fallback if we couldn't extract text
141
150
  additional_segments.append(
142
- Text(f"\n\nError details: {str(error_blocks[0])}", style="dim red italic")
151
+ Text(
152
+ f"\n\nError details: {str(error_blocks[0])}",
153
+ style="dim red italic",
154
+ )
143
155
  )
144
156
  else:
145
157
  # Fallback if no detailed error is available
@@ -170,7 +182,7 @@ class LlmAgent(LlmDecorator):
170
182
  combined += segment
171
183
  additional_message_text = combined
172
184
 
173
- message_text = message.last_text() or ""
185
+ message_text = message
174
186
 
175
187
  # Use provided name/model or fall back to defaults
176
188
  display_name = name if name is not None else self.name
@@ -219,7 +231,6 @@ class LlmAgent(LlmDecorator):
219
231
  if "user" == messages[-1].role:
220
232
  self.show_user_message(message=messages[-1])
221
233
 
222
- # TODO -- we should merge the request parameters here with the LLM defaults?
223
234
  # TODO - manage error catch, recovery, pause
224
235
  result, summary = await self._generate_with_summary(messages, request_params, tools)
225
236
 
@@ -243,33 +254,3 @@ class LlmAgent(LlmDecorator):
243
254
  summary_text = Text(f"\n\n{summary.message}", style="dim red italic") if summary else None
244
255
  await self.show_assistant_message(message=message, additional_message=summary_text)
245
256
  return result, message
246
-
247
- # async def show_prompt_loaded(
248
- # self,
249
- # prompt_name: str,
250
- # description: Optional[str] = None,
251
- # message_count: int = 0,
252
- # arguments: Optional[dict[str, str]] = None,
253
- # ) -> None:
254
- # """
255
- # Display information about a loaded prompt template.
256
-
257
- # Args:
258
- # prompt_name: The name of the prompt
259
- # description: Optional description of the prompt
260
- # message_count: Number of messages in the prompt
261
- # arguments: Optional dictionary of arguments passed to the prompt
262
- # """
263
- # # Get aggregator from attached LLM if available
264
- # aggregator = None
265
- # if self._llm and hasattr(self._llm, "aggregator"):
266
- # aggregator = self._llm.aggregator
267
-
268
- # await self.display.show_prompt_loaded(
269
- # prompt_name=prompt_name,
270
- # description=description,
271
- # message_count=message_count,
272
- # agent_name=self.name,
273
- # aggregator=aggregator,
274
- # arguments=arguments,
275
- # )
@@ -110,6 +110,11 @@ class LlmDecorator(AgentProtocol):
110
110
  self._llm: Optional[FastAgentLLMProtocol] = None
111
111
  self._initialized = False
112
112
 
113
+ @property
114
+ def context(self) -> Context | None:
115
+ """Optional execution context supplied at construction time."""
116
+ return self._context
117
+
113
118
  @property
114
119
  def initialized(self) -> bool:
115
120
  """Check if the agent is initialized."""
@@ -243,9 +248,12 @@ class LlmDecorator(AgentProtocol):
243
248
  """
244
249
  # Normalize all input types to a list of PromptMessageExtended
245
250
  multipart_messages = normalize_to_extended_list(messages)
251
+ final_request_params = (
252
+ self.llm.get_request_params(request_params) if self._llm else request_params
253
+ )
246
254
 
247
255
  with self._tracer.start_as_current_span(f"Agent: '{self._name}' generate"):
248
- return await self.generate_impl(multipart_messages, request_params, tools)
256
+ return await self.generate_impl(multipart_messages, final_request_params, tools)
249
257
 
250
258
  async def generate_impl(
251
259
  self,
@@ -352,9 +360,12 @@ class LlmDecorator(AgentProtocol):
352
360
  """
353
361
  # Normalize all input types to a list of PromptMessageExtended
354
362
  multipart_messages = normalize_to_extended_list(messages)
363
+ final_request_params = (
364
+ self.llm.get_request_params(request_params) if self._llm else request_params
365
+ )
355
366
 
356
367
  with self._tracer.start_as_current_span(f"Agent: '{self._name}' structured"):
357
- return await self.structured_impl(multipart_messages, model, request_params)
368
+ return await self.structured_impl(multipart_messages, model, final_request_params)
358
369
 
359
370
  async def structured_impl(
360
371
  self,
@@ -169,6 +169,11 @@ class McpAgent(ABC, ToolAgent):
169
169
  return {}
170
170
  return await self._aggregator.collect_server_status()
171
171
 
172
+ @property
173
+ def aggregator(self) -> MCPAggregator:
174
+ """Expose the MCP aggregator for UI integrations."""
175
+ return self._aggregator
176
+
172
177
  @property
173
178
  def initialized(self) -> bool:
174
179
  """Check if both the agent and aggregator are initialized."""
@@ -664,7 +669,18 @@ class McpAgent(ABC, ToolAgent):
664
669
  tool_results[correlation_id] = result
665
670
 
666
671
  # Show tool result (like ToolAgent does)
667
- self.display.show_tool_result(name=self._name, result=result)
672
+ skybridge_config = None
673
+ if namespaced_tool:
674
+ skybridge_config = await self._aggregator.get_skybridge_config(
675
+ namespaced_tool.server_name
676
+ )
677
+
678
+ self.display.show_tool_result(
679
+ name=self._name,
680
+ result=result,
681
+ tool_name=display_tool_name,
682
+ skybridge_config=skybridge_config,
683
+ )
668
684
 
669
685
  self.logger.debug(f"MCP tool {display_tool_name} executed successfully")
670
686
  except Exception as e:
@@ -675,7 +691,7 @@ class McpAgent(ABC, ToolAgent):
675
691
  )
676
692
  tool_results[correlation_id] = error_result
677
693
 
678
- # Show error result too
694
+ # Show error result too (no need for skybridge config on errors)
679
695
  self.display.show_tool_result(name=self._name, result=error_result)
680
696
 
681
697
  return self._finalize_tool_results(tool_results)
@@ -5,7 +5,11 @@ from mcp.types import CallToolResult, ListToolsResult, Tool
5
5
 
6
6
  from fast_agent.agents.agent_types import AgentConfig
7
7
  from fast_agent.agents.llm_agent import LlmAgent
8
- from fast_agent.constants import FAST_AGENT_ERROR_CHANNEL, HUMAN_INPUT_TOOL_NAME
8
+ from fast_agent.constants import (
9
+ DEFAULT_MAX_ITERATIONS,
10
+ FAST_AGENT_ERROR_CHANNEL,
11
+ HUMAN_INPUT_TOOL_NAME,
12
+ )
9
13
  from fast_agent.context import Context
10
14
  from fast_agent.core.logging.logger import get_logger
11
15
  from fast_agent.mcp.helpers.content_helpers import text_content
@@ -15,13 +19,6 @@ from fast_agent.types.llm_stop_reason import LlmStopReason
15
19
 
16
20
  logger = get_logger(__name__)
17
21
 
18
- DEFAULT_MAX_TOOL_CALLS = 20
19
-
20
-
21
- # should we have MAX_TOOL_CALLS instead to constrain by number of tools rather than turns...?
22
- DEFAULT_MAX_ITERATIONS = 20
23
- """Maximum number of User/Assistant turns to take"""
24
-
25
22
 
26
23
  class ToolAgent(LlmAgent):
27
24
  """
@@ -91,6 +88,7 @@ class ToolAgent(LlmAgent):
91
88
  tools = (await self.list_tools()).tools
92
89
 
93
90
  iterations = 0
91
+ max_iterations = request_params.max_iterations if request_params else DEFAULT_MAX_ITERATIONS
94
92
 
95
93
  while True:
96
94
  result = await super().generate_impl(
@@ -115,7 +113,7 @@ class ToolAgent(LlmAgent):
115
113
  break
116
114
 
117
115
  iterations += 1
118
- if iterations > DEFAULT_MAX_ITERATIONS:
116
+ if iterations > max_iterations:
119
117
  logger.warning("Max iterations reached, stopping tool loop")
120
118
  break
121
119
  return result
@@ -170,7 +168,7 @@ class ToolAgent(LlmAgent):
170
168
  # Delegate to call_tool for execution (overridable by subclasses)
171
169
  result = await self.call_tool(tool_name, tool_args)
172
170
  tool_results[correlation_id] = result
173
- self.display.show_tool_result(name=self.name, result=result)
171
+ self.display.show_tool_result(name=self.name, result=result, tool_name=tool_name)
174
172
 
175
173
  return self._finalize_tool_results(tool_results)
176
174
 
@@ -144,7 +144,7 @@ def get_fastagent_version() -> str:
144
144
 
145
145
  def get_config_summary(config_path: Optional[Path]) -> dict:
146
146
  """Extract key information from the configuration file."""
147
- from fast_agent.config import Settings
147
+ from fast_agent.config import MCPTimelineSettings, Settings
148
148
 
149
149
  # Get actual defaults from Settings class
150
150
  default_settings = Settings()
@@ -163,6 +163,10 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
163
163
  "enable_markup": default_settings.logger.enable_markup,
164
164
  },
165
165
  "mcp_ui_mode": default_settings.mcp_ui_mode,
166
+ "timeline": {
167
+ "steps": default_settings.mcp_timeline.steps,
168
+ "step_seconds": default_settings.mcp_timeline.step_seconds,
169
+ },
166
170
  "mcp_servers": [],
167
171
  }
168
172
 
@@ -211,6 +215,22 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
211
215
  if "mcp_ui_mode" in config:
212
216
  result["mcp_ui_mode"] = config["mcp_ui_mode"]
213
217
 
218
+ # Get timeline settings
219
+ if "mcp_timeline" in config:
220
+ try:
221
+ timeline_override = MCPTimelineSettings(**(config.get("mcp_timeline") or {}))
222
+ except Exception as exc: # pragma: no cover - defensive
223
+ console.print(
224
+ "[yellow]Warning:[/yellow] Invalid mcp_timeline configuration; "
225
+ "using defaults."
226
+ )
227
+ console.print(f"[yellow]Details:[/yellow] {exc}")
228
+ else:
229
+ result["timeline"] = {
230
+ "steps": timeline_override.steps,
231
+ "step_seconds": timeline_override.step_seconds,
232
+ }
233
+
214
234
  # Get MCP server info
215
235
  if "mcp" in config and "servers" in config["mcp"]:
216
236
  for server_name, server_config in config["mcp"]["servers"].items():
@@ -385,6 +405,28 @@ def show_check_summary() -> None:
385
405
  else:
386
406
  mcp_ui_display = f"[green]{mcp_ui_mode}[/green]"
387
407
 
408
+ timeline_settings = config_summary.get("timeline", {})
409
+ timeline_steps = timeline_settings.get("steps", 20)
410
+ timeline_step_seconds = timeline_settings.get("step_seconds", 30)
411
+
412
+ def format_step_interval(seconds: int) -> str:
413
+ try:
414
+ total = int(seconds)
415
+ except (TypeError, ValueError):
416
+ return str(seconds)
417
+ if total <= 0:
418
+ return "0s"
419
+ if total % 86400 == 0:
420
+ return f"{total // 86400}d"
421
+ if total % 3600 == 0:
422
+ return f"{total // 3600}h"
423
+ if total % 60 == 0:
424
+ return f"{total // 60}m"
425
+ minutes, secs = divmod(total, 60)
426
+ if minutes:
427
+ return f"{minutes}m{secs:02d}s"
428
+ return f"{secs}s"
429
+
388
430
  # Prepare all settings as pairs
389
431
  settings_data = [
390
432
  ("Log Level", logger.get("level", "warning (default)")),
@@ -395,6 +437,8 @@ def show_check_summary() -> None:
395
437
  ("Show Tools", bool_to_symbol(logger.get("show_tools", True))),
396
438
  ("Truncate Tools", bool_to_symbol(logger.get("truncate_tools", True))),
397
439
  ("Enable Markup", bool_to_symbol(logger.get("enable_markup", True))),
440
+ ("Timeline Steps", f"[green]{timeline_steps}[/green]"),
441
+ ("Timeline Interval", f"[green]{format_step_interval(timeline_step_seconds)}[/green]"),
398
442
  ]
399
443
 
400
444
  # Add rows in two-column layout, styling some values in green
@@ -49,6 +49,66 @@ class MCPElicitationSettings(BaseModel):
49
49
  model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
50
50
 
51
51
 
52
+ class MCPTimelineSettings(BaseModel):
53
+ """Configuration for MCP activity timeline display."""
54
+
55
+ steps: int = 20
56
+ """Number of timeline buckets to render."""
57
+
58
+ step_seconds: int = 30
59
+ """Duration of each timeline bucket in seconds."""
60
+
61
+ model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
62
+
63
+ @staticmethod
64
+ def _parse_duration(value: str) -> int:
65
+ """Parse simple duration strings like '30s', '2m', '1h' into seconds."""
66
+ pattern = re.compile(r"^\s*(\d+)\s*([smhd]?)\s*$", re.IGNORECASE)
67
+ match = pattern.match(value)
68
+ if not match:
69
+ raise ValueError("Expected duration in seconds (e.g. 30, '45s', '2m').")
70
+ amount = int(match.group(1))
71
+ unit = match.group(2).lower()
72
+ multiplier = {
73
+ "": 1,
74
+ "s": 1,
75
+ "m": 60,
76
+ "h": 3600,
77
+ "d": 86400,
78
+ }.get(unit)
79
+ if multiplier is None:
80
+ raise ValueError("Duration unit must be one of s, m, h, or d.")
81
+ return amount * multiplier
82
+
83
+ @field_validator("steps", mode="before")
84
+ @classmethod
85
+ def _coerce_steps(cls, value: Any) -> int:
86
+ if isinstance(value, str):
87
+ if not value.strip().isdigit():
88
+ raise ValueError("Timeline steps must be a positive integer.")
89
+ value = int(value.strip())
90
+ elif isinstance(value, float):
91
+ value = int(value)
92
+ if not isinstance(value, int):
93
+ raise TypeError("Timeline steps must be an integer.")
94
+ if value <= 0:
95
+ raise ValueError("Timeline steps must be greater than zero.")
96
+ return value
97
+
98
+ @field_validator("step_seconds", mode="before")
99
+ @classmethod
100
+ def _coerce_step_seconds(cls, value: Any) -> int:
101
+ if isinstance(value, str):
102
+ value = cls._parse_duration(value)
103
+ elif isinstance(value, (int, float)):
104
+ value = int(value)
105
+ else:
106
+ raise TypeError("Timeline step duration must be a number of seconds.")
107
+ if value <= 0:
108
+ raise ValueError("Timeline step duration must be greater than zero.")
109
+ return value
110
+
111
+
52
112
  class MCPRootSettings(BaseModel):
53
113
  """Represents a root directory configuration for an MCP server."""
54
114
 
@@ -528,6 +588,9 @@ class Settings(BaseSettings):
528
588
  mcp_ui_output_dir: str = ".fast-agent/ui"
529
589
  """Directory where MCP-UI HTML files are written. Relative paths are resolved from CWD."""
530
590
 
591
+ mcp_timeline: MCPTimelineSettings = MCPTimelineSettings()
592
+ """Display settings for MCP activity timelines."""
593
+
531
594
  @classmethod
532
595
  def find_config(cls) -> Path | None:
533
596
  """Find the config file in the current directory or parent directories."""
@@ -8,3 +8,6 @@ MCP_UI = "mcp-ui"
8
8
  REASONING = "reasoning"
9
9
  FAST_AGENT_ERROR_CHANNEL = "fast-agent-error"
10
10
  FAST_AGENT_REMOVED_METADATA_CHANNEL = "fast-agent-removed-meta"
11
+ # should we have MAX_TOOL_CALLS instead to constrain by number of tools rather than turns...?
12
+ DEFAULT_MAX_ITERATIONS = 20
13
+ """Maximum number of User/Assistant turns to take"""
@@ -1,10 +1,10 @@
1
- """
2
- A central context object to store global state that is shared across the application.
3
- """
1
+ from __future__ import annotations
4
2
 
5
3
  import asyncio
6
4
  import concurrent.futures
5
+ import logging
7
6
  import uuid
7
+ from pathlib import Path
8
8
  from typing import TYPE_CHECKING, Any, Optional, Union
9
9
 
10
10
  from opentelemetry import trace
@@ -29,12 +29,18 @@ from fast_agent.mcp_server_registry import ServerRegistry
29
29
 
30
30
  if TYPE_CHECKING:
31
31
  from fast_agent.core.executor.workflow_signal import SignalWaitCallback
32
+ from fast_agent.mcp.mcp_connection_manager import MCPConnectionManager
32
33
  else:
33
34
  # Runtime placeholders for the types
34
35
  SignalWaitCallback = Any
36
+ MCPConnectionManager = Any
35
37
 
36
38
  logger = get_logger(__name__)
37
39
 
40
+ """
41
+ A central context object to store global state that is shared across the application.
42
+ """
43
+
38
44
 
39
45
  class Context(BaseModel):
40
46
  """
@@ -52,6 +58,7 @@ class Context(BaseModel):
52
58
  task_registry: Optional[ActivityRegistry] = None
53
59
 
54
60
  tracer: trace.Tracer | None = None
61
+ _connection_manager: "MCPConnectionManager | None" = None
55
62
 
56
63
  model_config = ConfigDict(
57
64
  extra="allow",
@@ -130,16 +137,42 @@ async def configure_logger(config: "Settings") -> None:
130
137
  """
131
138
  Configure logging and tracing based on the application config.
132
139
  """
140
+ settings = config.logger
141
+
142
+ # Configure the standard Python logger used by LoggingListener so it respects settings.
143
+ python_logger = logging.getLogger("fast_agent")
144
+ python_logger.handlers.clear()
145
+ python_logger.setLevel(settings.level.upper())
146
+ python_logger.propagate = False
147
+
148
+ handler: logging.Handler
149
+ if settings.type == "console":
150
+ handler = logging.StreamHandler()
151
+ elif settings.type == "file":
152
+ log_path = Path(settings.path)
153
+ if log_path.parent:
154
+ log_path.parent.mkdir(parents=True, exist_ok=True)
155
+ handler = logging.FileHandler(log_path)
156
+ elif settings.type == "none":
157
+ handler = logging.NullHandler()
158
+ else:
159
+ # For transports that handle output elsewhere (e.g., HTTP), suppress console output.
160
+ handler = logging.NullHandler()
161
+
162
+ handler.setLevel(settings.level.upper())
163
+ handler.setFormatter(logging.Formatter("%(message)s"))
164
+ python_logger.addHandler(handler)
165
+
133
166
  # Use StreamingExclusionFilter to prevent streaming events from flooding logs
134
- event_filter: EventFilter = StreamingExclusionFilter(min_level=config.logger.level)
135
- logger.info(f"Configuring logger with level: {config.logger.level}")
136
- transport = create_transport(settings=config.logger, event_filter=event_filter)
167
+ event_filter: EventFilter = StreamingExclusionFilter(min_level=settings.level)
168
+ logger.info(f"Configuring logger with level: {settings.level}")
169
+ transport = create_transport(settings=settings, event_filter=event_filter)
137
170
  await LoggingConfig.configure(
138
171
  event_filter=event_filter,
139
172
  transport=transport,
140
- batch_size=config.logger.batch_size,
141
- flush_interval=config.logger.flush_interval,
142
- progress_display=config.logger.progress_display,
173
+ batch_size=settings.batch_size,
174
+ flush_interval=settings.flush_interval,
175
+ progress_display=settings.progress_display,
143
176
  )
144
177
 
145
178
 
@@ -70,7 +70,7 @@ def convert_log_event(event: Event) -> "ProgressEvent | None":
70
70
 
71
71
  # Extract streaming token count for STREAMING actions
72
72
  streaming_tokens = None
73
- if progress_action == ProgressAction.STREAMING:
73
+ if progress_action == ProgressAction.STREAMING or progress_action == ProgressAction.THINKING:
74
74
  streaming_tokens = event_data.get("details", "")
75
75
 
76
76
  # Extract progress data for TOOL_PROGRESS actions
@@ -14,6 +14,7 @@ class ProgressAction(str, Enum):
14
14
  INITIALIZED = "Initialized"
15
15
  CHATTING = "Chatting"
16
16
  STREAMING = "Streaming" # Special action for real-time streaming updates
17
+ THINKING = "Thinking" # Special action for real-time thinking updates
17
18
  ROUTING = "Routing"
18
19
  PLANNING = "Planning"
19
20
  READY = "Ready"
@@ -53,9 +54,7 @@ class ProgressEvent(BaseModel):
53
54
  base = f"{self.action.ljust(11)}. {self.target}"
54
55
  if self.details:
55
56
  base += f" - {self.details}"
56
-
57
+
57
58
  if self.agent_name:
58
59
  base = f"[{self.agent_name}] {base}"
59
60
  return base
60
-
61
-
@@ -21,7 +21,7 @@ from typing import (
21
21
 
22
22
  from a2a.types import AgentCard
23
23
  from mcp import Tool
24
- from mcp.types import GetPromptResult, Prompt, PromptMessage, ReadResourceResult
24
+ from mcp.types import GetPromptResult, ListToolsResult, Prompt, PromptMessage, ReadResourceResult
25
25
  from pydantic import BaseModel
26
26
  from rich.text import Text
27
27
 
@@ -79,6 +79,11 @@ class FastAgentLLMProtocol(Protocol):
79
79
  self, prompt_result: "GetPromptResult", prompt_name: str
80
80
  ) -> str: ...
81
81
 
82
+ def get_request_params(
83
+ self,
84
+ request_params: RequestParams | None = None,
85
+ ) -> RequestParams: ...
86
+
82
87
  @property
83
88
  def message_history(self) -> List[PromptMessageExtended]: ...
84
89
 
@@ -116,7 +121,7 @@ class LlmAgentProtocol(Protocol):
116
121
  def clear(self, *, clear_prompts: bool = False) -> None: ...
117
122
 
118
123
 
119
- class AgentProtocol(LlmAgentProtocol):
124
+ class AgentProtocol(LlmAgentProtocol, Protocol):
120
125
  """Standard agent interface with flexible input types."""
121
126
 
122
127
  async def __call__(
@@ -190,6 +195,8 @@ class AgentProtocol(LlmAgentProtocol):
190
195
 
191
196
  async def list_mcp_tools(self, namespace: str | None = None) -> Mapping[str, List[Tool]]: ...
192
197
 
198
+ async def list_tools(self) -> ListToolsResult: ...
199
+
193
200
  async def get_resource(
194
201
  self, resource_uri: str, namespace: str | None = None
195
202
  ) -> ReadResourceResult: ...