fast-agent-mcp 0.2.40__tar.gz → 0.2.41__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 (230) hide show
  1. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/forms_demo.py +0 -6
  3. {fast_agent_mcp-0.2.40/src/mcp_agent/resources → fast_agent_mcp-0.2.41}/examples/workflows/router.py +9 -0
  4. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/pyproject.toml +3 -3
  5. fast_agent_mcp-0.2.41/src/mcp_agent/cli/__main__.py +33 -0
  6. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/commands/check_config.py +140 -81
  7. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/commands/go.py +151 -38
  8. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/commands/quickstart.py +6 -2
  9. fast_agent_mcp-0.2.41/src/mcp_agent/cli/commands/server_helpers.py +106 -0
  10. fast_agent_mcp-0.2.41/src/mcp_agent/cli/constants.py +25 -0
  11. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/main.py +1 -1
  12. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/config.py +94 -44
  13. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/agent_app.py +104 -15
  14. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/agent_types.py +1 -0
  15. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/direct_decorators.py +9 -0
  16. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/direct_factory.py +18 -4
  17. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/enhanced_prompt.py +165 -13
  18. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/fastagent.py +4 -0
  19. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/interactive_prompt.py +37 -37
  20. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/usage_display.py +11 -1
  21. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/validation.py +21 -2
  22. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/elicitation_form.py +53 -21
  23. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/augmented_llm.py +28 -9
  24. fast_agent_mcp-0.2.41/src/mcp_agent/llm/augmented_llm_silent.py +48 -0
  25. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/model_database.py +20 -0
  26. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/model_factory.py +12 -0
  27. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/provider_key_manager.py +22 -8
  28. fast_agent_mcp-0.2.41/src/mcp_agent/llm/provider_types.py +29 -0
  29. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +7 -2
  30. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_azure.py +7 -1
  31. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +4 -1
  32. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_openai.py +9 -2
  33. fast_agent_mcp-0.2.41/src/mcp_agent/llm/providers/augmented_llm_xai.py +38 -0
  34. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/usage_tracking.py +28 -3
  35. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/mcp_agent_client_session.py +2 -0
  36. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/mcp_aggregator.py +38 -44
  37. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/sampling.py +15 -11
  38. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -6
  39. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41/src/mcp_agent/resources}/examples/workflows/router.py +9 -0
  40. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/ui/console_display.py +125 -13
  41. fast_agent_mcp-0.2.40/src/mcp_agent/cli/__main__.py +0 -7
  42. fast_agent_mcp-0.2.40/src/mcp_agent/llm/provider_types.py +0 -22
  43. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/.gitignore +0 -0
  44. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/LICENSE +0 -0
  45. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/README.md +0 -0
  46. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/azure-openai/fastagent.config.yaml +0 -0
  47. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/custom-agents/agent.py +0 -0
  48. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/custom-agents/fastagent.config.yaml +0 -0
  49. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/data-analysis/analysis-campaign.py +0 -0
  50. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/data-analysis/analysis.py +0 -0
  51. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/data-analysis/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  53. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  54. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  55. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  56. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  57. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  58. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/game_character.py +0 -0
  59. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/game_character_handler.py +0 -0
  60. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/elicitations/tool_call.py +0 -0
  61. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/state-transfer/agent_one.py +0 -0
  62. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/state-transfer/agent_two.py +0 -0
  63. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  64. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  65. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/vision-examples/cat.png +0 -0
  66. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/vision-examples/example1.py +0 -0
  67. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/vision-examples/example2.py +0 -0
  68. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/vision-examples/example3.py +0 -0
  69. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  70. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/otel/agent.py +0 -0
  71. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/otel/agent2.py +0 -0
  72. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/otel/docker-compose.yaml +0 -0
  73. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/otel/fastagent.config.yaml +0 -0
  74. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/researcher/fastagent.config.yaml +0 -0
  75. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/researcher/researcher-eval.py +0 -0
  76. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/researcher/researcher-imp.py +0 -0
  77. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/researcher/researcher.py +0 -0
  78. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/.env.sample +0 -0
  79. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/Makefile +0 -0
  80. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/README.md +0 -0
  81. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/agent.py +0 -0
  82. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/demo_images/clam.jpg +0 -0
  83. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/demo_images/crab.png +0 -0
  84. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/demo_images/shrimp.png +0 -0
  85. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/docker-compose.yml +0 -0
  86. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/fastagent.config.yaml +0 -0
  87. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/image_demo.py +0 -0
  88. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  89. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  90. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  91. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/simple_agent.py +0 -0
  92. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  93. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  94. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  95. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/chaining.py +0 -0
  96. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/evaluator.py +0 -0
  97. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/fastagent.config.yaml +0 -0
  98. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/graded_report.md +0 -0
  99. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/human_input.py +0 -0
  100. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/orchestrator.py +0 -0
  101. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/parallel.py +0 -0
  102. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/short_story.md +0 -0
  103. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/examples/workflows/short_story.txt +0 -0
  104. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/hatch_build.py +0 -0
  105. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/__init__.py +0 -0
  106. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/__init__.py +0 -0
  107. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/agent.py +0 -0
  108. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/base_agent.py +0 -0
  109. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  110. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  111. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  112. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  113. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  114. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  115. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  116. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  117. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/app.py +0 -0
  118. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/__init__.py +0 -0
  119. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/commands/setup.py +0 -0
  120. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  121. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/cli/terminal.py +0 -0
  122. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/console.py +0 -0
  123. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/context.py +0 -0
  124. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/context_dependent.py +0 -0
  125. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/__init__.py +0 -0
  126. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/error_handling.py +0 -0
  127. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/exceptions.py +0 -0
  128. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/mcp_content.py +0 -0
  129. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/prompt.py +0 -0
  130. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/core/request_params.py +0 -0
  131. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/event_progress.py +0 -0
  132. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/executor/__init__.py +0 -0
  133. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/executor/executor.py +0 -0
  134. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/executor/task_registry.py +0 -0
  135. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/executor/workflow_signal.py +0 -0
  136. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/__init__.py +0 -0
  137. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
  138. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
  139. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/elicitation_state.py +0 -0
  140. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/handler.py +0 -0
  141. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/human_input/types.py +0 -0
  142. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/__init__.py +0 -0
  143. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  144. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  145. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  146. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/memory.py +0 -0
  147. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/prompt_utils.py +0 -0
  148. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/__init__.py +0 -0
  149. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  150. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
  151. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  152. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  153. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  154. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  155. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +0 -0
  156. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  157. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  158. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  159. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +0 -0
  160. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  161. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  162. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  163. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  164. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/sampling_converter.py +0 -0
  165. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  166. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/__init__.py +0 -0
  167. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/events.py +0 -0
  168. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/json_serializer.py +0 -0
  169. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/listeners.py +0 -0
  170. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/logger.py +0 -0
  171. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/rich_progress.py +0 -0
  172. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/logging/transport.py +0 -0
  173. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/__init__.py +0 -0
  174. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/common.py +0 -0
  175. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
  176. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
  177. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/gen_client.py +0 -0
  178. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  179. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  180. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  181. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/hf_auth.py +0 -0
  182. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/interfaces.py +0 -0
  183. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/logger_textio.py +0 -0
  184. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  185. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/mime_utils.py +0 -0
  186. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  187. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompt_render.py +0 -0
  188. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  189. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  190. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  191. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  192. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  193. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  194. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  195. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  196. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp/resource_utils.py +0 -0
  197. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp_server/__init__.py +0 -0
  198. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  199. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/mcp_server_registry.py +0 -0
  200. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/progress_display.py +0 -0
  201. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  202. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  203. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  204. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  205. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  206. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  207. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  208. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  209. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  210. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  211. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  212. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  213. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  214. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  215. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  216. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  217. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  218. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  219. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  220. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  221. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  222. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  223. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  224. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
  225. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  226. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  227. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  228. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
  229. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  230. {fast_agent_mcp-0.2.40 → fast_agent_mcp-0.2.41}/src/mcp_agent/tools/tool_definition.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.40
3
+ Version: 0.2.41
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
@@ -51,8 +51,6 @@ async def main():
51
51
  else:
52
52
  console.print("[red]No registration data received[/red]")
53
53
 
54
- console.print("\n" + "─" * 50 + "\n")
55
-
56
54
  # Example 2: Product Review
57
55
  console.print("[bold yellow]Example 2: Product Review Form[/bold yellow]")
58
56
  console.print(
@@ -66,8 +64,6 @@ async def main():
66
64
  )
67
65
  console.print(review_panel)
68
66
 
69
- console.print("\n" + "─" * 50 + "\n")
70
-
71
67
  # Example 3: Account Settings
72
68
  console.print("[bold yellow]Example 3: Account Settings Form[/bold yellow]")
73
69
  console.print(
@@ -81,8 +77,6 @@ async def main():
81
77
  )
82
78
  console.print(settings_panel)
83
79
 
84
- console.print("\n" + "─" * 50 + "\n")
85
-
86
80
  # Example 4: Service Appointment
87
81
  console.print("[bold yellow]Example 4: Service Appointment Booking[/bold yellow]")
88
82
  console.print(
@@ -7,6 +7,8 @@ Demonstrates router's ability to either:
7
7
 
8
8
  import asyncio
9
9
 
10
+ from rich.console import Console
11
+
10
12
  from mcp_agent.core.fastagent import FastAgent
11
13
 
12
14
  # Create the application
@@ -45,7 +47,14 @@ SAMPLE_REQUESTS = [
45
47
  agents=["code_expert", "general_assistant", "fetcher"],
46
48
  )
47
49
  async def main() -> None:
50
+ console = Console()
51
+ console.print(
52
+ "\n[bright_red]Router Workflow Demo[/bright_red]\n\n"
53
+ "Enter a request to route it to the appropriate agent.\nEnter [bright_red]STOP[/bright_red] to run the demo, [bright_red]EXIT[/bright_red] to leave"
54
+ )
55
+
48
56
  async with fast.run() as agent:
57
+ await agent.interactive(agent_name="route")
49
58
  for request in SAMPLE_REQUESTS:
50
59
  await agent.route(request)
51
60
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.2.40"
3
+ version = "0.2.41"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -108,8 +108,8 @@ dev = [
108
108
  ]
109
109
 
110
110
  [project.scripts]
111
- fast-agent = "mcp_agent.cli.__main__:app"
112
- fast-agent-mcp = "mcp_agent.cli.__main__:app"
111
+ fast-agent = "mcp_agent.cli.__main__:main"
112
+ fast-agent-mcp = "mcp_agent.cli.__main__:main"
113
113
  fastagent = "mcp_agent.cli.__main__:app"
114
114
  silsila = "mcp_agent.cli.__main__:app"
115
115
  prompt-server = "mcp_agent.mcp.prompts.__main__:main"
@@ -0,0 +1,33 @@
1
+ import sys
2
+
3
+ from mcp_agent.cli.constants import GO_SPECIFIC_OPTIONS, KNOWN_SUBCOMMANDS
4
+ from mcp_agent.cli.main import app
5
+
6
+ # if the arguments would work with "go" we'll just route to it
7
+
8
+
9
+ def main():
10
+ """Main entry point that handles auto-routing to 'go' command."""
11
+ # Check if we should auto-route to 'go'
12
+ if len(sys.argv) > 1:
13
+ # Check if first arg is not already a subcommand
14
+ first_arg = sys.argv[1]
15
+
16
+ if first_arg not in KNOWN_SUBCOMMANDS and any(
17
+ arg in sys.argv or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
18
+ for arg in sys.argv
19
+ ):
20
+ # Find where to insert 'go' - before the first go-specific option
21
+ insert_pos = 1
22
+ for i, arg in enumerate(sys.argv[1:], 1):
23
+ if arg in GO_SPECIFIC_OPTIONS or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS):
24
+ insert_pos = i
25
+ break
26
+ # Auto-route to go command
27
+ sys.argv.insert(insert_pos, "go")
28
+
29
+ app()
30
+
31
+
32
+ if __name__ == "__main__":
33
+ main()
@@ -23,30 +23,14 @@ console = Console()
23
23
 
24
24
 
25
25
  def find_config_files(start_path: Path) -> dict[str, Optional[Path]]:
26
- """Find FastAgent configuration files in current directory or parents."""
27
- results = {
28
- "config": None,
29
- "secrets": None,
30
- }
31
-
32
- current = start_path
33
- while current != current.parent: # Stop at root directory
34
- config_path = current / "fastagent.config.yaml"
35
- secrets_path = current / "fastagent.secrets.yaml"
36
-
37
- if config_path.exists() and results["config"] is None:
38
- results["config"] = config_path
39
-
40
- if secrets_path.exists() and results["secrets"] is None:
41
- results["secrets"] = secrets_path
26
+ """Find FastAgent configuration files, preferring secrets file next to config file."""
27
+ from mcp_agent.config import find_fastagent_config_files
42
28
 
43
- # Stop searching if we found both files
44
- if results["config"] is not None and results["secrets"] is not None:
45
- break
46
-
47
- current = current.parent
48
-
49
- return results
29
+ config_path, secrets_path = find_fastagent_config_files(start_path)
30
+ return {
31
+ "config": config_path,
32
+ "secrets": secrets_path,
33
+ }
50
34
 
51
35
 
52
36
  def get_system_info() -> dict:
@@ -109,13 +93,23 @@ def check_api_keys(secrets_summary: dict, config_summary: dict) -> dict:
109
93
  secrets_status = secrets_summary.get("status", "not_found")
110
94
  # Get config if available
111
95
  config = config_summary if config_summary.get("status") == "parsed" else {}
96
+
112
97
  config_azure = {}
113
98
  if config and "azure" in config.get("config", {}):
114
99
  config_azure = config["config"]["azure"]
115
100
 
116
- for provider_value in results:
101
+ for provider in results:
102
+ # Always check environment variables first
103
+ env_key_name = ProviderKeyManager.get_env_key_name(provider)
104
+ env_key_value = os.environ.get(env_key_name)
105
+ if env_key_value:
106
+ if len(env_key_value) > 5:
107
+ results[provider]["env"] = f"...{env_key_value[-5:]}"
108
+ else:
109
+ results[provider]["env"] = "...***"
110
+
117
111
  # Special handling for Azure: support api_key and DefaultAzureCredential
118
- if provider_value == "azure":
112
+ if provider == "azure":
119
113
  # Prefer secrets if present, else fallback to config
120
114
  azure_cfg = {}
121
115
  if secrets_status == "parsed" and "azure" in secrets:
@@ -125,40 +119,18 @@ def check_api_keys(secrets_summary: dict, config_summary: dict) -> dict:
125
119
 
126
120
  use_default_cred = azure_cfg.get("use_default_azure_credential", False)
127
121
  base_url = azure_cfg.get("base_url")
128
- api_key = azure_cfg.get("api_key")
129
- # DefaultAzureCredential mode
130
122
  if use_default_cred and base_url:
131
- results[provider_value]["config"] = "DefaultAzureCredential"
132
- # API key mode (retrocompatible)
133
- if api_key and api_key != API_KEY_HINT_TEXT:
134
- if len(api_key) > 5:
135
- if results[provider_value]["config"]:
136
- results[provider_value]["config"] += " + api_key"
137
- else:
138
- results[provider_value]["config"] = f"...{api_key[-5:]}"
123
+ results[provider]["config"] = "DefaultAzureCredential"
124
+ continue
125
+
126
+ # Check secrets file if it was parsed successfully
127
+ if secrets_status == "parsed":
128
+ config_key = ProviderKeyManager.get_config_file_key(provider, secrets)
129
+ if config_key and config_key != API_KEY_HINT_TEXT:
130
+ if len(config_key) > 5:
131
+ results[provider]["config"] = f"...{config_key[-5:]}"
139
132
  else:
140
- if results[provider_value]["config"]:
141
- results[provider_value]["config"] += " + api_key"
142
- else:
143
- results[provider_value]["config"] = "...***"
144
- else:
145
- # Check environment variables using ProviderKeyManager
146
- env_key_name = ProviderKeyManager.get_env_key_name(provider_value)
147
- env_key_value = os.environ.get(env_key_name)
148
- if env_key_value:
149
- if len(env_key_value) > 5:
150
- results[provider_value]["env"] = f"...{env_key_value[-5:]}"
151
- else:
152
- results[provider_value]["env"] = "...***"
153
-
154
- # Check secrets file if it was parsed successfully
155
- if secrets_status == "parsed":
156
- config_key = ProviderKeyManager.get_config_file_key(provider_value, secrets)
157
- if config_key and config_key != API_KEY_HINT_TEXT:
158
- if len(config_key) > 5:
159
- results[provider_value]["config"] = f"...{config_key[-5:]}"
160
- else:
161
- results[provider_value]["config"] = "...***"
133
+ results[provider]["config"] = "...***"
162
134
 
163
135
  return results
164
136
 
@@ -173,11 +145,24 @@ def get_fastagent_version() -> str:
173
145
 
174
146
  def get_config_summary(config_path: Optional[Path]) -> dict:
175
147
  """Extract key information from the configuration file."""
148
+ from mcp_agent.config import Settings
149
+
150
+ # Get actual defaults from Settings class
151
+ default_settings = Settings()
152
+
176
153
  result = {
177
154
  "status": "not_found", # Default status: not found
178
155
  "error": None,
179
- "default_model": "haiku (system default)",
180
- "logger": {},
156
+ "default_model": default_settings.default_model,
157
+ "logger": {
158
+ "level": default_settings.logger.level,
159
+ "type": default_settings.logger.type,
160
+ "progress_display": default_settings.logger.progress_display,
161
+ "show_chat": default_settings.logger.show_chat,
162
+ "show_tools": default_settings.logger.show_tools,
163
+ "truncate_tools": default_settings.logger.truncate_tools,
164
+ "enable_markup": default_settings.logger.enable_markup,
165
+ },
181
166
  "mcp_servers": [],
182
167
  }
183
168
 
@@ -207,11 +192,19 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
207
192
  if "logger" in config:
208
193
  logger_config = config["logger"]
209
194
  result["logger"] = {
210
- "level": logger_config.get("level", "info (default)"),
211
- "type": logger_config.get("type", "console (default)"),
212
- "progress_display": str(logger_config.get("progress_display", True)),
213
- "show_chat": str(logger_config.get("show_chat", True)),
214
- "show_tools": str(logger_config.get("show_tools", True)),
195
+ "level": logger_config.get("level", default_settings.logger.level),
196
+ "type": logger_config.get("type", default_settings.logger.type),
197
+ "progress_display": logger_config.get(
198
+ "progress_display", default_settings.logger.progress_display
199
+ ),
200
+ "show_chat": logger_config.get("show_chat", default_settings.logger.show_chat),
201
+ "show_tools": logger_config.get("show_tools", default_settings.logger.show_tools),
202
+ "truncate_tools": logger_config.get(
203
+ "truncate_tools", default_settings.logger.truncate_tools
204
+ ),
205
+ "enable_markup": logger_config.get(
206
+ "enable_markup", default_settings.logger.enable_markup
207
+ ),
215
208
  }
216
209
 
217
210
  # Get MCP server info
@@ -228,10 +221,11 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
228
221
  if "url" in server_config:
229
222
  url = server_config.get("url", "")
230
223
  server_info["url"] = url
231
-
224
+
232
225
  # Use URL path to determine transport type
233
226
  try:
234
227
  from .url_parser import parse_server_url
228
+
235
229
  _, transport_type, _ = parse_server_url(url)
236
230
  server_info["transport"] = transport_type.upper()
237
231
  except Exception:
@@ -288,7 +282,9 @@ def show_check_summary() -> None:
288
282
  system_table.add_row("Python Version", ".".join(system_info["python_version"].split(".")[:3]))
289
283
  system_table.add_row("Python Path", system_info["python_path"])
290
284
 
291
- console.print(Panel(system_table, title="System Information", border_style="blue"))
285
+ console.print(
286
+ Panel(system_table, title="System Information", title_align="left", border_style="blue")
287
+ )
292
288
 
293
289
  # Configuration files panel
294
290
  config_path = config_files["config"]
@@ -327,25 +323,59 @@ def show_check_summary() -> None:
327
323
  "Default Model", config_summary.get("default_model", "haiku (system default)")
328
324
  )
329
325
 
330
- # Add logger settings if available
331
- logger = config_summary.get("logger", {})
332
- if logger:
333
- files_table.add_row("Logger Level", logger.get("level", "info (default)"))
334
- files_table.add_row("Logger Type", logger.get("type", "console (default)"))
335
- files_table.add_row("Progress Display", logger.get("progress_display", "True"))
336
- files_table.add_row("Show Chat", logger.get("show_chat", "True"))
337
- files_table.add_row("Show Tools", logger.get("show_tools", "True"))
326
+ console.print(
327
+ Panel(files_table, title="Configuration Files", title_align="left", border_style="blue")
328
+ )
329
+
330
+ # Logger Settings panel with two-column layout
331
+ logger = config_summary.get("logger", {})
332
+ logger_table = Table(show_header=True, box=None)
333
+ logger_table.add_column("Setting", style="cyan")
334
+ logger_table.add_column("Value")
335
+ logger_table.add_column("Setting", style="cyan")
336
+ logger_table.add_column("Value")
337
+
338
+ def bool_to_symbol(value):
339
+ return "[bold green]✓[/bold green]" if value else "[bold red]✗[/bold red]"
340
+
341
+ # Prepare all settings as pairs
342
+ settings_data = [
343
+ ("Logger Level", logger.get("level", "warning (default)")),
344
+ ("Logger Type", logger.get("type", "file (default)")),
345
+ ("Progress Display", bool_to_symbol(logger.get("progress_display", True))),
346
+ ("Show Chat", bool_to_symbol(logger.get("show_chat", True))),
347
+ ("Show Tools", bool_to_symbol(logger.get("show_tools", True))),
348
+ ("Truncate Tools", bool_to_symbol(logger.get("truncate_tools", True))),
349
+ ("Enable Markup", bool_to_symbol(logger.get("enable_markup", True))),
350
+ ]
351
+
352
+ # Add rows in two-column layout
353
+ for i in range(0, len(settings_data), 2):
354
+ left_setting, left_value = settings_data[i]
355
+ if i + 1 < len(settings_data):
356
+ right_setting, right_value = settings_data[i + 1]
357
+ logger_table.add_row(left_setting, left_value, right_setting, right_value)
358
+ else:
359
+ # Odd number of settings - fill right column with empty strings
360
+ logger_table.add_row(left_setting, left_value, "", "")
338
361
 
339
- console.print(Panel(files_table, title="Configuration Files", border_style="blue"))
362
+ console.print(
363
+ Panel(logger_table, title="Logger Settings", title_align="left", border_style="blue")
364
+ )
340
365
 
341
- # API keys panel
366
+ # API keys panel with two-column layout
342
367
  keys_table = Table(show_header=True, box=None)
343
368
  keys_table.add_column("Provider", style="cyan")
344
369
  keys_table.add_column("Env", justify="center")
345
370
  keys_table.add_column("Config", justify="center")
346
371
  keys_table.add_column("Active Key", style="green")
372
+ keys_table.add_column("Provider", style="cyan")
373
+ keys_table.add_column("Env", justify="center")
374
+ keys_table.add_column("Config", justify="center")
375
+ keys_table.add_column("Active Key", style="green")
347
376
 
348
- for provider, status in api_keys.items():
377
+ def format_provider_row(provider, status):
378
+ """Format a single provider's status for display."""
349
379
  # Environment key indicator
350
380
  if status["env"] and status["config"]:
351
381
  # Both exist but config takes precedence (env is present but not active)
@@ -379,10 +409,35 @@ def show_check_summary() -> None:
379
409
  # No key available for other providers
380
410
  active = "[dim]Not configured[/dim]"
381
411
 
382
- keys_table.add_row(provider.capitalize(), env_status, config_status, active)
412
+ # Get the proper display name for the provider
413
+ from mcp_agent.llm.provider_types import Provider
414
+
415
+ provider_enum = Provider(provider)
416
+ display_name = provider_enum.display_name
417
+
418
+ return display_name, env_status, config_status, active
419
+
420
+ # Split providers into two columns
421
+ providers_list = list(api_keys.items())
422
+ mid_point = (len(providers_list) + 1) // 2 # Round up for odd numbers
423
+
424
+ for i in range(mid_point):
425
+ # Left column
426
+ left_provider, left_status = providers_list[i]
427
+ left_data = format_provider_row(left_provider, left_status)
428
+
429
+ # Right column (if exists)
430
+ if i + mid_point < len(providers_list):
431
+ right_provider, right_status = providers_list[i + mid_point]
432
+ right_data = format_provider_row(right_provider, right_status)
433
+ # Add row with both columns
434
+ keys_table.add_row(*left_data, *right_data)
435
+ else:
436
+ # Add row with only left column (right column empty)
437
+ keys_table.add_row(*left_data, "", "", "", "")
383
438
 
384
439
  # Print the API Keys panel (fix: this was missing)
385
- keys_panel = Panel(keys_table, title="API Keys", border_style="blue", subtitle_align="left")
440
+ keys_panel = Panel(keys_table, title="API Keys", title_align="left", border_style="blue")
386
441
  console.print(keys_panel)
387
442
 
388
443
  # MCP Servers panel (shown after API Keys)
@@ -406,12 +461,16 @@ def show_check_summary() -> None:
406
461
  command_url = server["url"] or "[dim]Not configured[/dim]"
407
462
  servers_table.add_row(name, transport, command_url)
408
463
 
409
- console.print(Panel(servers_table, title="MCP Servers", border_style="blue"))
464
+ console.print(
465
+ Panel(servers_table, title="MCP Servers", title_align="left", border_style="blue")
466
+ )
410
467
 
411
468
  # Show help tips
412
469
  if config_status == "not_found" or secrets_status == "not_found":
413
470
  console.print("\n[bold]Setup Tips:[/bold]")
414
- console.print("Run [cyan]fast-agent setup[/cyan] to create configuration files")
471
+ console.print(
472
+ "Run [cyan]fast-agent setup[/cyan] to create configuration files. Visit [cyan][link=https://fast-agent.ai]fast-agent.ai[/link][/cyan] for configuration guides. "
473
+ )
415
474
  elif config_status == "error" or secrets_status == "error":
416
475
  console.print("\n[bold]Config File Issues:[/bold]")
417
476
  console.print("Fix the YAML syntax errors in your configuration files")