fast-agent-mcp 0.2.13__tar.gz → 0.2.16__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.
Files changed (175) hide show
  1. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/.gitignore +1 -0
  2. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/PKG-INFO +1 -1
  3. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/pyproject.toml +1 -1
  4. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/agent.py +2 -2
  5. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/base_agent.py +3 -3
  6. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/chain_agent.py +2 -2
  7. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +3 -3
  8. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/orchestrator_agent.py +3 -3
  9. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/parallel_agent.py +2 -2
  10. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/router_agent.py +2 -2
  11. fast_agent_mcp-0.2.16/src/mcp_agent/cli/commands/check_config.py +450 -0
  12. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/commands/setup.py +1 -1
  13. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/main.py +8 -15
  14. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/config.py +4 -7
  15. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/agent_types.py +8 -8
  16. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/direct_decorators.py +10 -8
  17. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/direct_factory.py +4 -1
  18. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/enhanced_prompt.py +6 -5
  19. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/interactive_prompt.py +70 -50
  20. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/validation.py +6 -4
  21. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/event_progress.py +6 -6
  22. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/augmented_llm.py +10 -2
  23. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/augmented_llm_passthrough.py +5 -3
  24. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/augmented_llm_playback.py +2 -1
  25. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/model_factory.py +7 -27
  26. fast_agent_mcp-0.2.16/src/mcp_agent/llm/provider_key_manager.py +83 -0
  27. fast_agent_mcp-0.2.16/src/mcp_agent/llm/provider_types.py +16 -0
  28. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +5 -26
  29. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +5 -24
  30. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/augmented_llm_generic.py +4 -16
  31. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/augmented_llm_openai.py +4 -26
  32. fast_agent_mcp-0.2.16/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +50 -0
  33. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/interfaces.py +2 -1
  34. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp_server/agent_server.py +120 -38
  35. fast_agent_mcp-0.2.13/src/mcp_agent/cli/commands/config.py +0 -11
  36. fast_agent_mcp-0.2.13/src/mcp_agent/executor/temporal.py +0 -383
  37. fast_agent_mcp-0.2.13/src/mcp_agent/executor/workflow.py +0 -195
  38. fast_agent_mcp-0.2.13/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -78
  39. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/LICENSE +0 -0
  40. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/README.md +0 -0
  41. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/data-analysis/analysis-campaign.py +0 -0
  42. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/data-analysis/analysis.py +0 -0
  43. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/data-analysis/fastagent.config.yaml +0 -0
  44. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  45. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/mcp/state-transfer/agent_one.py +0 -0
  46. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/mcp/state-transfer/agent_two.py +0 -0
  47. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  48. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/researcher/fastagent.config.yaml +0 -0
  49. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/researcher/researcher-eval.py +0 -0
  50. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/researcher/researcher-imp.py +0 -0
  51. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/researcher/researcher.py +0 -0
  52. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/chaining.py +0 -0
  53. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/evaluator.py +0 -0
  54. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/fastagent.config.yaml +0 -0
  55. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/graded_report.md +0 -0
  56. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/human_input.py +0 -0
  57. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/orchestrator.py +0 -0
  58. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/parallel.py +0 -0
  59. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/router.py +0 -0
  60. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/short_story.md +0 -0
  61. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/examples/workflows/short_story.txt +0 -0
  62. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/__init__.py +0 -0
  63. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/__init__.py +0 -0
  64. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  65. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  66. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  67. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/app.py +0 -0
  68. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/__init__.py +0 -0
  69. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/__main__.py +0 -0
  70. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  71. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/cli/terminal.py +0 -0
  72. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/console.py +0 -0
  73. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/context.py +0 -0
  74. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/context_dependent.py +0 -0
  75. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/__init__.py +0 -0
  76. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/agent_app.py +0 -0
  77. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/error_handling.py +0 -0
  78. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/exceptions.py +0 -0
  79. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/fastagent.py +0 -0
  80. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/mcp_content.py +0 -0
  81. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/prompt.py +0 -0
  82. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/core/request_params.py +0 -0
  83. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/executor/__init__.py +0 -0
  84. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/executor/decorator_registry.py +0 -0
  85. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/executor/executor.py +0 -0
  86. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/executor/task_registry.py +0 -0
  87. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/executor/workflow_signal.py +0 -0
  88. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/human_input/__init__.py +0 -0
  89. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/human_input/handler.py +0 -0
  90. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/human_input/types.py +0 -0
  91. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/__init__.py +0 -0
  92. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/memory.py +0 -0
  93. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/prompt_utils.py +0 -0
  94. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/__init__.py +0 -0
  95. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  96. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  97. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  98. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  99. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  100. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  101. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  102. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/sampling_converter.py +0 -0
  103. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  104. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/__init__.py +0 -0
  105. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/events.py +0 -0
  106. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/json_serializer.py +0 -0
  107. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/listeners.py +0 -0
  108. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/logger.py +0 -0
  109. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/rich_progress.py +0 -0
  110. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/tracing.py +0 -0
  111. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/logging/transport.py +0 -0
  112. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/__init__.py +0 -0
  113. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/gen_client.py +0 -0
  114. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  115. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  116. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/logger_textio.py +0 -0
  117. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  118. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
  119. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  120. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/mime_utils.py +0 -0
  121. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  122. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompt_render.py +0 -0
  123. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  124. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  125. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  126. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  127. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  128. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  129. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  130. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  131. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/resource_utils.py +0 -0
  132. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp/sampling.py +0 -0
  133. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp_server/__init__.py +0 -0
  134. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/mcp_server_registry.py +0 -0
  135. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/progress_display.py +0 -0
  136. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  137. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  138. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  139. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  140. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/in_dev/agent_build.py +0 -0
  141. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/in_dev/css-LICENSE.txt +0 -0
  142. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/in_dev/slides.py +0 -0
  143. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/agent.py +0 -0
  144. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/fastagent.config.yaml +0 -0
  145. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/history_transfer.py +0 -0
  146. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/job.py +0 -0
  147. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/prompt_category.py +0 -0
  148. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/prompt_sizing.py +0 -0
  149. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/simple.txt +0 -0
  150. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/sizer.py +0 -0
  151. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/internal/social.py +0 -0
  152. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  153. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  154. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  155. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  156. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/__init__.py +0 -0
  157. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/agent.py +0 -0
  158. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/delimited_prompt.txt +0 -0
  159. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/fastagent.config.yaml +0 -0
  160. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/image_server.py +0 -0
  161. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/prompt1.txt +0 -0
  162. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/prompting/work_with_image.py +0 -0
  163. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  164. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  165. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  166. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  167. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  168. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  169. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  170. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  171. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  172. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  173. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  174. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  175. {fast_agent_mcp-0.2.13 → fast_agent_mcp-0.2.16}/src/mcp_agent/ui/console_display.py +0 -0
@@ -193,3 +193,4 @@ fastagent.jsonl
193
193
  tests/e2e/workflow/weather_location.txt
194
194
  tests/integration/prompt-state/multipart.json
195
195
  tests/integration/prompt-state/history.json
196
+ !tests/integration/api/fastagent.secrets.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.13
3
+ Version: 0.2.16
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>, Sarmad Qadri <sarmad@lastmileai.dev>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.2.13"
3
+ version = "0.2.16"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -66,7 +66,7 @@ class Agent(BaseAgent):
66
66
  agent_name_str = str(self.name)
67
67
 
68
68
  # Create agent_types dictionary with just this agent
69
- agent_types = {agent_name_str: self.agent_type}
69
+ agent_types = {agent_name_str: self.agent_type.value}
70
70
 
71
71
  # Create the interactive prompt
72
72
  prompt = InteractivePrompt(agent_types=agent_types)
@@ -84,7 +84,7 @@ class Agent(BaseAgent):
84
84
  async def list_prompts_wrapper(agent_name):
85
85
  # Always call list_prompts on this agent regardless of agent_name
86
86
  return await self.list_prompts()
87
-
87
+
88
88
  # Define wrapper for list_resources function
89
89
  async def list_resources_wrapper(agent_name):
90
90
  # Always call list_resources on this agent regardless of agent_name
@@ -32,7 +32,7 @@ from mcp.types import (
32
32
  )
33
33
  from pydantic import BaseModel
34
34
 
35
- from mcp_agent.core.agent_types import AgentConfig
35
+ from mcp_agent.core.agent_types import AgentConfig, AgentType
36
36
  from mcp_agent.core.exceptions import PromptExitError
37
37
  from mcp_agent.core.prompt import Prompt
38
38
  from mcp_agent.core.request_params import RequestParams
@@ -623,7 +623,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
623
623
  return response.first_text()
624
624
 
625
625
  @property
626
- def agent_type(self) -> str:
626
+ def agent_type(self) -> AgentType:
627
627
  """
628
628
  Return the type of this agent.
629
629
 
@@ -632,7 +632,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
632
632
  Returns:
633
633
  String representing the agent type
634
634
  """
635
- return self.config.agent_type
635
+ return AgentType.BASIC
636
636
 
637
637
  @property
638
638
  def message_history(self) -> List[PromptMessageMultipart]:
@@ -26,9 +26,9 @@ class ChainAgent(BaseAgent):
26
26
 
27
27
  # TODO -- consider adding "repeat" mode
28
28
  @property
29
- def agent_type(self) -> str:
29
+ def agent_type(self) -> AgentType:
30
30
  """Return the type of this agent."""
31
- return AgentType.CHAIN.value
31
+ return AgentType.CHAIN
32
32
 
33
33
  def __init__(
34
34
  self,
@@ -64,11 +64,11 @@ class EvaluatorOptimizerAgent(BaseAgent):
64
64
  for refinement, continuing until a quality threshold is reached or a maximum
65
65
  number of refinement cycles is completed.
66
66
  """
67
-
67
+
68
68
  @property
69
- def agent_type(self) -> str:
69
+ def agent_type(self) -> AgentType:
70
70
  """Return the type of this agent."""
71
- return AgentType.EVALUATOR_OPTIMIZER.value
71
+ return AgentType.EVALUATOR_OPTIMIZER
72
72
 
73
73
  def __init__(
74
74
  self,
@@ -46,11 +46,11 @@ class OrchestratorAgent(BaseAgent):
46
46
  to specialized worker agents, synthesizing their results into a cohesive output.
47
47
  Supports both full planning and iterative planning modes.
48
48
  """
49
-
49
+
50
50
  @property
51
- def agent_type(self) -> str:
51
+ def agent_type(self) -> AgentType:
52
52
  """Return the type of this agent."""
53
- return AgentType.ORCHESTRATOR.value
53
+ return AgentType.ORCHESTRATOR
54
54
 
55
55
  def __init__(
56
56
  self,
@@ -20,9 +20,9 @@ class ParallelAgent(BaseAgent):
20
20
  """
21
21
 
22
22
  @property
23
- def agent_type(self) -> str:
23
+ def agent_type(self) -> AgentType:
24
24
  """Return the type of this agent."""
25
- return AgentType.PARALLEL.value
25
+ return AgentType.PARALLEL
26
26
 
27
27
  def __init__(
28
28
  self,
@@ -106,9 +106,9 @@ class RouterAgent(BaseAgent):
106
106
  """
107
107
 
108
108
  @property
109
- def agent_type(self) -> str:
109
+ def agent_type(self) -> AgentType:
110
110
  """Return the type of this agent."""
111
- return AgentType.ROUTER.value
111
+ return AgentType.ROUTER
112
112
 
113
113
  def __init__(
114
114
  self,
@@ -0,0 +1,450 @@
1
+ """Command to check FastAgent configuration."""
2
+
3
+ import platform
4
+ import sys
5
+ from importlib.metadata import version
6
+ from pathlib import Path
7
+ from typing import Optional
8
+
9
+ import typer
10
+ import yaml
11
+ from rich.console import Console
12
+ from rich.panel import Panel
13
+ from rich.table import Table
14
+
15
+ from mcp_agent.llm.provider_key_manager import API_KEY_HINT_TEXT, ProviderKeyManager
16
+ from mcp_agent.llm.provider_types import Provider
17
+
18
+ app = typer.Typer(
19
+ help="Check and diagnose FastAgent configuration",
20
+ no_args_is_help=False, # Allow showing our custom help instead
21
+ )
22
+ console = Console()
23
+
24
+
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
42
+
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
50
+
51
+
52
+ def get_system_info() -> dict:
53
+ """Get system information including Python version, OS, etc."""
54
+ return {
55
+ "platform": platform.system(),
56
+ "platform_version": platform.version(),
57
+ "python_version": sys.version,
58
+ "python_path": sys.executable,
59
+ }
60
+
61
+
62
+ def get_secrets_summary(secrets_path: Optional[Path]) -> dict:
63
+ """Extract information from the secrets file."""
64
+ result = {
65
+ "status": "not_found", # Default status: not found
66
+ "error": None,
67
+ "secrets": {},
68
+ }
69
+
70
+ if not secrets_path:
71
+ return result
72
+
73
+ if not secrets_path.exists():
74
+ result["status"] = "not_found"
75
+ return result
76
+
77
+ # File exists, attempt to parse
78
+ try:
79
+ with open(secrets_path, "r") as f:
80
+ secrets = yaml.safe_load(f)
81
+
82
+ # Mark as successfully parsed
83
+ result["status"] = "parsed"
84
+ result["secrets"] = secrets or {}
85
+
86
+ except Exception as e:
87
+ # File exists but has parse errors
88
+ result["status"] = "error"
89
+ result["error"] = str(e)
90
+ console.print(f"[yellow]Warning:[/yellow] Error parsing secrets file: {e}")
91
+
92
+ return result
93
+
94
+
95
+ def check_api_keys(secrets_summary: dict) -> dict:
96
+ """Check if API keys are configured in secrets file or environment."""
97
+ import os
98
+
99
+ # Initialize results dict using Provider enum values
100
+ results = {
101
+ provider.value: {"env": None, "config": None}
102
+ for provider in Provider
103
+ if provider != Provider.FAST_AGENT
104
+ } # Include GENERIC but exclude FAST_AGENT
105
+
106
+ # Get secrets if available
107
+ secrets = secrets_summary.get("secrets", {})
108
+ secrets_status = secrets_summary.get("status", "not_found")
109
+
110
+ # Check both environment variables and config file for each provider
111
+ for provider_value in results:
112
+ # Check environment variables using ProviderKeyManager
113
+ env_key_name = ProviderKeyManager.get_env_key_name(provider_value)
114
+ env_key_value = os.environ.get(env_key_name)
115
+ if env_key_value:
116
+ # Store the last 5 characters if key is long enough
117
+ if len(env_key_value) > 5:
118
+ results[provider_value]["env"] = f"...{env_key_value[-5:]}"
119
+ else:
120
+ results[provider_value]["env"] = "...***"
121
+
122
+ # Check secrets file if it was parsed successfully
123
+ if secrets_status == "parsed":
124
+ config_key = ProviderKeyManager.get_config_file_key(provider_value, secrets)
125
+ if config_key and config_key != API_KEY_HINT_TEXT:
126
+ # Store the last 5 characters if key is long enough
127
+ if len(config_key) > 5:
128
+ results[provider_value]["config"] = f"...{config_key[-5:]}"
129
+ else:
130
+ results[provider_value]["config"] = "...***"
131
+
132
+ return results
133
+
134
+
135
+ def get_fastagent_version() -> str:
136
+ """Get the installed version of FastAgent."""
137
+ try:
138
+ return version("fast-agent-mcp")
139
+ except: # noqa: E722
140
+ return "unknown"
141
+
142
+
143
+ def get_config_summary(config_path: Optional[Path]) -> dict:
144
+ """Extract key information from the configuration file."""
145
+ result = {
146
+ "status": "not_found", # Default status: not found
147
+ "error": None,
148
+ "default_model": "haiku (system default)",
149
+ "logger": {},
150
+ "mcp_servers": [],
151
+ }
152
+
153
+ if not config_path:
154
+ return result
155
+
156
+ if not config_path.exists():
157
+ result["status"] = "not_found"
158
+ return result
159
+
160
+ # File exists, attempt to parse
161
+ try:
162
+ with open(config_path, "r") as f:
163
+ config = yaml.safe_load(f)
164
+
165
+ # Mark as successfully parsed
166
+ result["status"] = "parsed"
167
+
168
+ if not config:
169
+ return result
170
+
171
+ # Get default model
172
+ if "default_model" in config:
173
+ result["default_model"] = config["default_model"]
174
+
175
+ # Get logger settings
176
+ if "logger" in config:
177
+ logger_config = config["logger"]
178
+ result["logger"] = {
179
+ "level": logger_config.get("level", "info (default)"),
180
+ "type": logger_config.get("type", "console (default)"),
181
+ "progress_display": str(logger_config.get("progress_display", True)),
182
+ "show_chat": str(logger_config.get("show_chat", True)),
183
+ "show_tools": str(logger_config.get("show_tools", True)),
184
+ }
185
+
186
+ # Get MCP server info
187
+ if "mcp" in config and "servers" in config["mcp"]:
188
+ for server_name, server_config in config["mcp"]["servers"].items():
189
+ server_info = {
190
+ "name": server_name,
191
+ "transport": "STDIO", # Default transport type
192
+ "command": "",
193
+ "url": "",
194
+ }
195
+
196
+ # Determine transport type
197
+ if "url" in server_config:
198
+ server_info["transport"] = "SSE"
199
+ server_info["url"] = server_config.get("url", "")
200
+
201
+ # Get command and args
202
+ command = server_config.get("command", "")
203
+ args = server_config.get("args", [])
204
+
205
+ if command:
206
+ if args:
207
+ args_str = " ".join([str(arg) for arg in args])
208
+ full_cmd = f"{command} {args_str}"
209
+ # Truncate if too long
210
+ if len(full_cmd) > 60:
211
+ full_cmd = full_cmd[:57] + "..."
212
+ server_info["command"] = full_cmd
213
+ else:
214
+ server_info["command"] = command
215
+
216
+ # Truncate URL if too long
217
+ if server_info["url"] and len(server_info["url"]) > 60:
218
+ server_info["url"] = server_info["url"][:57] + "..."
219
+
220
+ result["mcp_servers"].append(server_info)
221
+
222
+ except Exception as e:
223
+ # File exists but has parse errors
224
+ result["status"] = "error"
225
+ result["error"] = str(e)
226
+ console.print(f"[red]Error parsing configuration file:[/red] {e}")
227
+
228
+ return result
229
+
230
+
231
+ def show_check_summary() -> None:
232
+ """Show a summary of checks with colorful styling."""
233
+ cwd = Path.cwd()
234
+ config_files = find_config_files(cwd)
235
+ system_info = get_system_info()
236
+ config_summary = get_config_summary(config_files["config"])
237
+ secrets_summary = get_secrets_summary(config_files["secrets"])
238
+ api_keys = check_api_keys(secrets_summary)
239
+ fastagent_version = get_fastagent_version()
240
+
241
+ # System info panel
242
+ system_table = Table(show_header=False, box=None)
243
+ system_table.add_column("Key", style="cyan")
244
+ system_table.add_column("Value")
245
+
246
+ system_table.add_row("FastAgent Version", fastagent_version)
247
+ system_table.add_row("Platform", system_info["platform"])
248
+ system_table.add_row("Python Version", ".".join(system_info["python_version"].split(".")[:3]))
249
+ system_table.add_row("Python Path", system_info["python_path"])
250
+
251
+ console.print(Panel(system_table, title="System Information", border_style="blue"))
252
+
253
+ # Configuration files panel
254
+ config_path = config_files["config"]
255
+ secrets_path = config_files["secrets"]
256
+
257
+ files_table = Table(show_header=False, box=None)
258
+ files_table.add_column("Setting", style="cyan")
259
+ files_table.add_column("Value")
260
+
261
+ # Show secrets file status
262
+ secrets_status = secrets_summary.get("status", "not_found")
263
+ if secrets_status == "not_found":
264
+ files_table.add_row("Secrets File", "[yellow]Not found[/yellow]")
265
+ elif secrets_status == "error":
266
+ files_table.add_row("Secrets File", f"[orange_red1]Errors[/orange_red1] ({secrets_path})")
267
+ files_table.add_row(
268
+ "Secrets Error",
269
+ f"[orange_red1]{secrets_summary.get('error', 'Unknown error')}[/orange_red1]",
270
+ )
271
+ else: # parsed successfully
272
+ files_table.add_row("Secrets File", f"[green]Found[/green] ({secrets_path})")
273
+
274
+ # Show config file status
275
+ config_status = config_summary.get("status", "not_found")
276
+ if config_status == "not_found":
277
+ files_table.add_row("Config File", "[red]Not found[/red]")
278
+ elif config_status == "error":
279
+ files_table.add_row("Config File", f"[orange_red1]Errors[/orange_red1] ({config_path})")
280
+ files_table.add_row(
281
+ "Config Error",
282
+ f"[orange_red1]{config_summary.get('error', 'Unknown error')}[/orange_red1]",
283
+ )
284
+ else: # parsed successfully
285
+ files_table.add_row("Config File", f"[green]Found[/green] ({config_path})")
286
+ files_table.add_row(
287
+ "Default Model", config_summary.get("default_model", "haiku (system default)")
288
+ )
289
+
290
+ # Add logger settings if available
291
+ logger = config_summary.get("logger", {})
292
+ if logger:
293
+ files_table.add_row("Logger Level", logger.get("level", "info (default)"))
294
+ files_table.add_row("Logger Type", logger.get("type", "console (default)"))
295
+ files_table.add_row("Progress Display", logger.get("progress_display", "True"))
296
+ files_table.add_row("Show Chat", logger.get("show_chat", "True"))
297
+ files_table.add_row("Show Tools", logger.get("show_tools", "True"))
298
+
299
+ console.print(Panel(files_table, title="Configuration Files", border_style="blue"))
300
+
301
+ # API keys panel
302
+ keys_table = Table(show_header=True, box=None)
303
+ keys_table.add_column("Provider", style="cyan")
304
+ keys_table.add_column("Env", justify="center")
305
+ keys_table.add_column("Config", justify="center")
306
+ keys_table.add_column("Active Key", style="green")
307
+
308
+ for provider, status in api_keys.items():
309
+ # Environment key indicator
310
+ if status["env"] and status["config"]:
311
+ # Both exist but config takes precedence (env is present but not active)
312
+ env_status = "[yellow]✓[/yellow]"
313
+ elif status["env"]:
314
+ # Only env exists and is active
315
+ env_status = "[bold green]✓[/bold green]"
316
+ else:
317
+ # No env key
318
+ env_status = "[dim]✗[/dim]"
319
+
320
+ # Config file key indicator
321
+ if status["config"]:
322
+ # Config exists and takes precedence (is active)
323
+ config_status = "[bold green]✓[/bold green]"
324
+ else:
325
+ # No config key
326
+ config_status = "[dim]✗[/dim]"
327
+
328
+ # Display active key
329
+ if status["config"]:
330
+ # Config key is active
331
+ active = f"[bold green]{status['config']}[/bold green]"
332
+ elif status["env"]:
333
+ # Env key is active
334
+ active = f"[bold green]{status['env']}[/bold green]"
335
+ elif provider == "generic":
336
+ # Generic provider uses "ollama" as a default when no key is set
337
+ active = "[green]ollama (default)[/green]"
338
+ else:
339
+ # No key available for other providers
340
+ active = "[dim]Not configured[/dim]"
341
+
342
+ keys_table.add_row(provider.capitalize(), env_status, config_status, active)
343
+
344
+ console.print(Panel(keys_table, title="API Keys", border_style="blue"))
345
+
346
+ # MCP Servers panel (shown after API Keys)
347
+ if config_summary.get("status") == "parsed":
348
+ mcp_servers = config_summary.get("mcp_servers", [])
349
+ if mcp_servers:
350
+ servers_table = Table(show_header=True, box=None)
351
+ servers_table.add_column("Name", style="cyan")
352
+ servers_table.add_column("Transport", style="magenta")
353
+ servers_table.add_column("Command/URL")
354
+
355
+ for server in mcp_servers:
356
+ name = server["name"]
357
+ transport = server["transport"]
358
+
359
+ # Show either command or URL based on transport type
360
+ if transport == "STDIO":
361
+ command_url = server["command"] or "[dim]Not configured[/dim]"
362
+ servers_table.add_row(name, transport, command_url)
363
+ else: # SSE
364
+ command_url = server["url"] or "[dim]Not configured[/dim]"
365
+ servers_table.add_row(name, transport, command_url)
366
+
367
+ console.print(Panel(servers_table, title="MCP Servers", border_style="blue"))
368
+
369
+ # Show help tips
370
+ if config_status == "not_found" or secrets_status == "not_found":
371
+ console.print("\n[bold]Setup Tips:[/bold]")
372
+ console.print("Run [cyan]fast-agent setup[/cyan] to create configuration files")
373
+ elif config_status == "error" or secrets_status == "error":
374
+ console.print("\n[bold]Config File Issues:[/bold]")
375
+ console.print("Fix the YAML syntax errors in your configuration files")
376
+
377
+ if all(
378
+ not api_keys[provider]["env"] and not api_keys[provider]["config"] for provider in api_keys
379
+ ):
380
+ console.print(
381
+ "\n[yellow]No API keys configured. Set up API keys to use LLM services:[/yellow]"
382
+ )
383
+ console.print("1. Add keys to fastagent.secrets.yaml")
384
+ env_vars = ", ".join(
385
+ [
386
+ ProviderKeyManager.get_env_key_name(p.value)
387
+ for p in Provider
388
+ if p != Provider.FAST_AGENT
389
+ ]
390
+ )
391
+ console.print(f"2. Or set environment variables ({env_vars})")
392
+
393
+
394
+ @app.command()
395
+ def show(
396
+ path: Optional[str] = typer.Argument(None, help="Path to configuration file to display"),
397
+ secrets: bool = typer.Option(
398
+ False, "--secrets", "-s", help="Show secrets file instead of config"
399
+ ),
400
+ ) -> None:
401
+ """Display the configuration file content or search for it."""
402
+ file_type = "secrets" if secrets else "config"
403
+
404
+ if path:
405
+ config_path = Path(path).resolve()
406
+ if not config_path.exists():
407
+ console.print(
408
+ f"[red]Error:[/red] {file_type.capitalize()} file not found at {config_path}"
409
+ )
410
+ raise typer.Exit(1)
411
+ else:
412
+ config_files = find_config_files(Path.cwd())
413
+ config_path = config_files[file_type]
414
+ if not config_path:
415
+ console.print(
416
+ f"[yellow]No {file_type} file found in current directory or parents[/yellow]"
417
+ )
418
+ console.print("Run [cyan]fast-agent setup[/cyan] to create configuration files")
419
+ raise typer.Exit(1)
420
+
421
+ console.print(f"\n[bold]{file_type.capitalize()} file:[/bold] {config_path}\n")
422
+
423
+ try:
424
+ with open(config_path, "r") as f:
425
+ content = f.read()
426
+
427
+ # Try to parse as YAML to check validity
428
+ parsed = yaml.safe_load(content)
429
+
430
+ # Show parsing success status
431
+ console.print("[green]YAML syntax is valid[/green]")
432
+ if parsed is None:
433
+ console.print("[yellow]Warning: File is empty or contains only comments[/yellow]\n")
434
+ else:
435
+ console.print(
436
+ f"[green]Successfully parsed {len(parsed) if isinstance(parsed, dict) else 0} root keys[/green]\n"
437
+ )
438
+
439
+ # Print the content
440
+ console.print(content)
441
+
442
+ except Exception as e:
443
+ console.print(f"[red]Error parsing {file_type} file:[/red] {e}")
444
+
445
+
446
+ @app.callback(invoke_without_command=True)
447
+ def main(ctx: typer.Context) -> None:
448
+ """Check and diagnose FastAgent configuration."""
449
+ if ctx.invoked_subcommand is None:
450
+ show_check_summary()
@@ -190,7 +190,7 @@ def init(
190
190
  # Check for existing .gitignore
191
191
  needs_gitignore = not find_gitignore(config_path)
192
192
 
193
- console.print("\n[bold]fast-agent Setup[/bold]\n")
193
+ console.print("\n[bold]fast-agent setup[/bold]\n")
194
194
  console.print("This will create the following files:")
195
195
  console.print(f" - {config_path}/fastagent.config.yaml")
196
196
  console.print(f" - {config_path}/fastagent.secrets.yaml")
@@ -4,7 +4,7 @@ import typer
4
4
  from rich.console import Console
5
5
  from rich.table import Table
6
6
 
7
- from mcp_agent.cli.commands import quickstart, setup
7
+ from mcp_agent.cli.commands import check_config, quickstart, setup
8
8
  from mcp_agent.cli.terminal import Application
9
9
 
10
10
  app = typer.Typer(
@@ -14,6 +14,7 @@ app = typer.Typer(
14
14
 
15
15
  # Subcommands
16
16
  app.add_typer(setup.app, name="setup", help="Set up a new agent project")
17
+ app.add_typer(check_config.app, name="check", help="Show or diagnose fast-agent configuration")
17
18
  app.add_typer(quickstart.app, name="bootstrap", help="Create example applications")
18
19
  app.add_typer(quickstart.app, name="quickstart", help="Create example applications")
19
20
 
@@ -31,30 +32,22 @@ def show_welcome() -> None:
31
32
  except: # noqa: E722
32
33
  app_version = "unknown"
33
34
 
34
- console.print(f"\n[bold]fast-agent (fast-agent-mcp) {app_version}[/bold]")
35
- console.print("Build effective agents using Model Context Protocol (MCP)")
35
+ console.print(f"\nfast-agent {app_version} [dim](fast-agent-mcp)[/dim] ")
36
36
 
37
37
  # Create a table for commands
38
38
  table = Table(title="\nAvailable Commands")
39
39
  table.add_column("Command", style="green")
40
40
  table.add_column("Description")
41
41
 
42
- table.add_row("setup", "Set up a new agent project with configuration files")
42
+ table.add_row("setup", "Create a new agent and configuration files")
43
+ table.add_row("check", "Show or diagnose fast-agent configuration")
43
44
  table.add_row("quickstart", "Create example applications (workflow, researcher, etc.)")
44
- # table.add_row("config", "Manage agent configuration settings")
45
45
 
46
46
  console.print(table)
47
47
 
48
- console.print("\n[bold]Getting Started:[/bold]")
49
- console.print("1. Set up a new project:")
50
- console.print(" fastagent setup")
51
- console.print("\n2. Create Building Effective Agents workflow examples:")
52
- console.print(" fastagent quickstart workflow")
53
- console.print("\n3. Explore other examples:")
54
- console.print(" fastagent quickstart")
55
-
56
- console.print("\nUse --help with any command for more information")
57
- console.print("Example: fastagent quickstart --help")
48
+ console.print(
49
+ "\n[italic]get started with:[/italic] [cyan]fast-agent[/cyan] [green]setup[/green]"
50
+ )
58
51
 
59
52
 
60
53
  @app.callback(invoke_without_command=True)