fast-agent-mcp 0.3.15__tar.gz → 0.3.17__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 (320) hide show
  1. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/PKG-INFO +8 -7
  2. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/textual_markdown_demo.py +54 -15
  3. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/agent.py +2 -5
  4. {fast_agent_mcp-0.3.15/src/fast_agent/resources → fast_agent_mcp-0.3.17/examples}/setup/agent.py +2 -0
  5. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/setup/fastagent.config.yaml +6 -0
  6. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/pyproject.toml +8 -7
  7. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/__init__.py +2 -0
  8. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/agent_types.py +5 -0
  9. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/llm_agent.py +7 -0
  10. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/llm_decorator.py +6 -0
  11. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/mcp_agent.py +134 -10
  12. fast_agent_mcp-0.3.17/src/fast_agent/cli/__main__.py +73 -0
  13. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/check_config.py +85 -0
  14. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/go.py +100 -36
  15. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/constants.py +15 -1
  16. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/main.py +2 -1
  17. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/config.py +39 -10
  18. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/constants.py +8 -0
  19. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/context.py +24 -15
  20. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/direct_decorators.py +9 -0
  21. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/fastagent.py +101 -1
  22. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/listeners.py +8 -0
  23. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/interfaces.py +12 -0
  24. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/fastagent_llm.py +45 -0
  25. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/memory.py +26 -1
  26. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_database.py +4 -1
  27. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_factory.py +4 -2
  28. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_info.py +19 -43
  29. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +112 -0
  30. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/google/llm_google_native.py +238 -7
  31. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_openai.py +382 -19
  32. fast_agent_mcp-0.3.17/src/fast_agent/llm/provider/openai/responses.py +133 -0
  33. {fast_agent_mcp-0.3.15/examples → fast_agent_mcp-0.3.17/src/fast_agent/resources}/setup/agent.py +2 -0
  34. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/fastagent.config.yaml +6 -0
  35. fast_agent_mcp-0.3.17/src/fast_agent/skills/__init__.py +9 -0
  36. fast_agent_mcp-0.3.17/src/fast_agent/skills/registry.py +208 -0
  37. fast_agent_mcp-0.3.17/src/fast_agent/tools/shell_runtime.py +404 -0
  38. fast_agent_mcp-0.3.17/src/fast_agent/ui/console_display.py +1011 -0
  39. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/elicitation_form.py +76 -24
  40. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/elicitation_style.py +2 -2
  41. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/enhanced_prompt.py +107 -37
  42. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/history_display.py +20 -5
  43. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/interactive_prompt.py +108 -3
  44. fast_agent_mcp-0.3.17/src/fast_agent/ui/markdown_helpers.py +104 -0
  45. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/markdown_truncator.py +103 -45
  46. fast_agent_mcp-0.3.17/src/fast_agent/ui/message_primitives.py +50 -0
  47. fast_agent_mcp-0.3.17/src/fast_agent/ui/streaming.py +638 -0
  48. fast_agent_mcp-0.3.17/src/fast_agent/ui/tool_display.py +417 -0
  49. fast_agent_mcp-0.3.15/src/fast_agent/cli/__main__.py +0 -38
  50. fast_agent_mcp-0.3.15/src/fast_agent/ui/console_display.py +0 -1960
  51. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/.gitignore +0 -0
  52. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/LICENSE +0 -0
  53. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/README.md +0 -0
  54. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/a2a/agent_executor.py +0 -0
  55. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/a2a/server.py +0 -0
  56. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/azure-openai/fastagent.config.yaml +0 -0
  57. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/bedrock/fast-agent.config.yaml +0 -0
  58. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/custom-agents/agent.py +0 -0
  59. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/custom-agents/fastagent.config.yaml +0 -0
  60. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/data-analysis/analysis-campaign.py +0 -0
  61. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/data-analysis/analysis.py +0 -0
  62. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/data-analysis/fastagent.config.yaml +0 -0
  63. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  64. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/fastapi/fastapi-advanced.py +0 -0
  65. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/fastapi/fastapi-simple.py +0 -0
  66. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/fastapi/pyproject.toml +0 -0
  67. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/fastapi/readme.md +0 -0
  68. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  69. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  70. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  71. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  72. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  73. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/forms_demo.py +0 -0
  74. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/game_character.py +0 -0
  75. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/game_character_handler.py +0 -0
  76. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/tool_call.py +0 -0
  77. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  78. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  79. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  80. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  81. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/agent_one.py +0 -0
  82. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/agent_two.py +0 -0
  83. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  84. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  85. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/cat.png +0 -0
  86. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example1.py +0 -0
  87. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example2.py +0 -0
  88. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example3.py +0 -0
  89. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  90. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/display_check.py +0 -0
  91. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/fastagent.config.yaml +0 -0
  92. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/simple_llm.py +0 -0
  93. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/simple_llm_advanced.py +0 -0
  94. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/new-api/simple_mcp.py +0 -0
  95. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/fastagent.config.yaml +0 -0
  96. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/openapi_mcp_server.py +0 -0
  97. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/petstore.yaml +0 -0
  98. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/pyproject.toml +0 -0
  99. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/openapi/run-as-server.sh +0 -0
  100. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/otel/agent.py +0 -0
  101. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/otel/agent2.py +0 -0
  102. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/otel/docker-compose.yaml +0 -0
  103. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/otel/fastagent.config.yaml +0 -0
  104. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/researcher/fastagent.config.yaml +0 -0
  105. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/researcher/researcher-eval.py +0 -0
  106. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/researcher/researcher-imp.py +0 -0
  107. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/researcher/researcher.py +0 -0
  108. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/setup/.gitignore +0 -0
  109. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/setup/fastagent.secrets.yaml.example +0 -0
  110. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/setup/pyproject.toml.tmpl +0 -0
  111. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/.env.sample +0 -0
  112. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/Makefile +0 -0
  113. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/README.md +0 -0
  114. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/agent.py +0 -0
  115. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/clam.jpg +0 -0
  116. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/crab.png +0 -0
  117. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/shrimp.png +0 -0
  118. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/docker-compose.yml +0 -0
  119. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/fastagent.config.yaml +0 -0
  120. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/image_demo.py +0 -0
  121. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  122. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  123. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  124. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  125. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/simple_agent.py +0 -0
  126. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  127. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  128. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  129. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tool-use-agent/agent.py +0 -0
  130. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/tool-use-agent/fastagent.config.yaml +0 -0
  131. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/chaining.py +0 -0
  132. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/evaluator.py +0 -0
  133. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/fastagent.config.yaml +0 -0
  134. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/graded_report.md +0 -0
  135. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/human_input.py +0 -0
  136. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/orchestrator.py +0 -0
  137. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/parallel.py +0 -0
  138. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/router.py +0 -0
  139. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/short_story.md +0 -0
  140. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/examples/workflows/short_story.txt +0 -0
  141. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/hatch_build.py +0 -0
  142. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/__init__.py +0 -0
  143. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/tool_agent.py +0 -0
  144. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  145. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  146. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  147. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  148. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  149. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  150. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  151. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/__init__.py +0 -0
  152. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/auth.py +0 -0
  153. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/quickstart.py +0 -0
  154. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  155. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/setup.py +0 -0
  156. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/url_parser.py +0 -0
  157. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/terminal.py +0 -0
  158. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/context_dependent.py +0 -0
  159. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/__init__.py +0 -0
  160. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/agent_app.py +0 -0
  161. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/core_app.py +0 -0
  162. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/direct_factory.py +0 -0
  163. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/error_handling.py +0 -0
  164. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/exceptions.py +0 -0
  165. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/__init__.py +0 -0
  166. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/executor.py +0 -0
  167. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/task_registry.py +0 -0
  168. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  169. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/__init__.py +0 -0
  170. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/events.py +0 -0
  171. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/json_serializer.py +0 -0
  172. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/logger.py +0 -0
  173. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/transport.py +0 -0
  174. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/prompt.py +0 -0
  175. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/core/validation.py +0 -0
  176. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/event_progress.py +0 -0
  177. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/history/history_exporter.py +0 -0
  178. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/__init__.py +0 -0
  179. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  180. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/elicitation_state.py +0 -0
  181. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/form_fields.py +0 -0
  182. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/simple_form.py +0 -0
  183. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/types.py +0 -0
  184. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/__init__.py +0 -0
  185. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/passthrough.py +0 -0
  186. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/playback.py +0 -0
  187. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/silent.py +0 -0
  188. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/slow.py +0 -0
  189. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/prompt_utils.py +0 -0
  190. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  191. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  192. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  193. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  194. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  195. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  196. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  197. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  198. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  199. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  200. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  201. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  202. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  203. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  204. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  205. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  206. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  207. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider_key_manager.py +0 -0
  208. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider_types.py +0 -0
  209. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/request_params.py +0 -0
  210. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/sampling_converter.py +0 -0
  211. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/usage_tracking.py +0 -0
  212. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/__init__.py +0 -0
  213. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/common.py +0 -0
  214. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  215. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  216. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/gen_client.py +0 -0
  217. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  218. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  219. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  220. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/hf_auth.py +0 -0
  221. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/interfaces.py +0 -0
  222. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/logger_textio.py +0 -0
  223. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  224. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_aggregator.py +0 -0
  225. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
  226. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_content.py +0 -0
  227. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mime_utils.py +0 -0
  228. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/oauth_client.py +0 -0
  229. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt.py +0 -0
  230. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  231. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_render.py +0 -0
  232. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  233. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  234. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  235. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  236. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  237. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  238. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  239. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  240. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/resource_utils.py +0 -0
  241. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/sampling.py +0 -0
  242. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/server/__init__.py +0 -0
  243. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/server/agent_server.py +0 -0
  244. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/skybridge.py +0 -0
  245. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/sse_tracking.py +0 -0
  246. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  247. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  248. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/transport_tracking.py +0 -0
  249. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/types.py +0 -0
  250. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/ui_agent.py +0 -0
  251. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/ui_mixin.py +0 -0
  252. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp_server_registry.py +0 -0
  253. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/py.typed +0 -0
  254. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  255. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  256. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  257. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  258. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  259. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  260. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  261. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  262. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  263. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  264. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  265. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  266. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  267. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  268. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  269. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  270. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  271. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  272. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  273. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  274. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  275. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  276. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  277. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  278. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  279. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  280. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  281. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  282. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  283. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  284. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  285. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  286. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  287. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  288. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  289. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  290. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  291. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  292. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  293. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  294. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  295. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  296. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  297. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  298. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  299. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  300. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  301. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  302. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  303. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  304. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/.gitignore +0 -0
  305. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  306. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  307. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/tools/elicitation.py +0 -0
  308. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/types/__init__.py +0 -0
  309. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/types/llm_stop_reason.py +0 -0
  310. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/__init__.py +0 -0
  311. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/console.py +0 -0
  312. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mcp_display.py +0 -0
  313. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  314. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mermaid_utils.py +0 -0
  315. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/notification_tracker.py +0 -0
  316. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/plain_text_truncator.py +0 -0
  317. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/progress_display.py +0 -0
  318. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/rich_progress.py +0 -0
  319. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/streaming_buffer.py +0 -0
  320. {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.17}/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.15
3
+ Version: 0.3.17
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
@@ -209,18 +209,18 @@ Classifier: License :: OSI Approved :: Apache Software License
209
209
  Classifier: Operating System :: OS Independent
210
210
  Classifier: Programming Language :: Python :: 3
211
211
  Requires-Python: <3.14,>=3.13.5
212
- Requires-Dist: a2a-sdk>=0.3.6
213
- Requires-Dist: aiohttp>=3.11.13
214
- Requires-Dist: anthropic>=0.69.0
212
+ Requires-Dist: a2a-sdk>=0.3.10
213
+ Requires-Dist: aiohttp>=3.13.1
214
+ Requires-Dist: anthropic>=0.71.0
215
215
  Requires-Dist: azure-identity>=1.14.0
216
216
  Requires-Dist: boto3>=1.35.0
217
217
  Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
- Requires-Dist: google-genai>=1.33.0
220
+ Requires-Dist: google-genai>=1.46.0
221
221
  Requires-Dist: keyring>=24.3.1
222
- Requires-Dist: mcp==1.18.0
223
- Requires-Dist: openai>=2.3.0
222
+ Requires-Dist: mcp==1.19.0
223
+ Requires-Dist: openai[aiohttp]>=2.6.1
224
224
  Requires-Dist: opentelemetry-distro>=0.55b0
225
225
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
226
226
  Requires-Dist: opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'
@@ -231,6 +231,7 @@ Requires-Dist: prompt-toolkit>=3.0.52
231
231
  Requires-Dist: pydantic-settings>=2.7.0
232
232
  Requires-Dist: pydantic>=2.10.4
233
233
  Requires-Dist: pyperclip>=1.9.0
234
+ Requires-Dist: python-frontmatter>=1.1.0
234
235
  Requires-Dist: pyyaml>=6.0.2
235
236
  Requires-Dist: rich>=14.1.0
236
237
  Requires-Dist: tensorzero>=2025.7.5
@@ -20,12 +20,9 @@ from fast_agent import FastAgent
20
20
  from fast_agent.constants import REASONING
21
21
  from fast_agent.mcp.helpers.content_helpers import get_text
22
22
  from fast_agent.types import PromptMessageExtended
23
- from fast_agent.ui.console_display import (
24
- MESSAGE_CONFIGS,
25
- ConsoleDisplay,
26
- MessageType,
27
- _prepare_markdown_content,
28
- )
23
+ from fast_agent.ui.console_display import ConsoleDisplay
24
+ from fast_agent.ui.markdown_helpers import prepare_markdown_content
25
+ from fast_agent.ui.message_primitives import MESSAGE_CONFIGS, MessageType
29
26
 
30
27
  if TYPE_CHECKING:
31
28
  from mcp.types import CallToolResult
@@ -208,7 +205,7 @@ class ChatDisplay(RichLog):
208
205
  if formatted:
209
206
  segments.append(Markdown(formatted))
210
207
  else:
211
- prepared = _prepare_markdown_content(content, True) if content else ""
208
+ prepared = prepare_markdown_content(content, True) if content else ""
212
209
  if prepared:
213
210
  segments.append(Markdown(prepared))
214
211
 
@@ -362,6 +359,7 @@ class TextualDisplay(ConsoleDisplay):
362
359
  name: str | None = None,
363
360
  highlight_index: int | None = None,
364
361
  max_item_length: int | None = None,
362
+ metadata: dict | None = None,
365
363
  ) -> None:
366
364
  self._app.handle_display_tool_call(
367
365
  agent_name=name,
@@ -370,6 +368,7 @@ class TextualDisplay(ConsoleDisplay):
370
368
  bottom_items=bottom_items,
371
369
  highlight_index=highlight_index,
372
370
  max_item_length=max_item_length,
371
+ metadata=metadata,
373
372
  )
374
373
 
375
374
  def show_tool_result(
@@ -680,23 +679,63 @@ class MarkdownLLMApp(App[None]):
680
679
  bottom_items: list[str] | None,
681
680
  highlight_index: int | None,
682
681
  max_item_length: int | None,
682
+ metadata: dict | None,
683
683
  ) -> None:
684
- if tool_args:
685
- try:
686
- args_text = json.dumps(tool_args, indent=2, sort_keys=True)
687
- except TypeError: # pragma: no cover - fallback for unserializable args
688
- args_text = str(tool_args)
689
- content = f"```json\n{args_text}\n```"
684
+ metadata = metadata or {}
685
+
686
+ if metadata.get("variant") == "shell":
687
+ command = metadata.get("command") or tool_args.get("command")
688
+ command_display = command if isinstance(command, str) and command.strip() else None
689
+ if command_display:
690
+ content = f"```shell\n$ {command_display}\n```"
691
+ else:
692
+ content = "_No shell command provided._"
693
+
694
+ details: list[str] = []
695
+ shell_name = metadata.get("shell_name")
696
+ shell_path = metadata.get("shell_path")
697
+ if shell_name or shell_path:
698
+ if shell_name and shell_path and shell_path != shell_name:
699
+ details.append(f"shell: {shell_name} ({shell_path})")
700
+ elif shell_path:
701
+ details.append(f"shell: {shell_path}")
702
+ elif shell_name:
703
+ details.append(f"shell: {shell_name}")
704
+ working_dir = metadata.get("working_dir_display") or metadata.get("working_dir")
705
+ if working_dir:
706
+ details.append(f"cwd: {working_dir}")
707
+
708
+ capability_bits: list[str] = []
709
+ if metadata.get("streams_output"):
710
+ capability_bits.append("streams stdout/stderr")
711
+ if metadata.get("returns_exit_code"):
712
+ capability_bits.append("reports exit code")
713
+
714
+ if capability_bits:
715
+ details.append("; ".join(capability_bits))
716
+
717
+ if details:
718
+ bullet_points = "\n".join(f"- {line}" for line in details)
719
+ content = f"{content}\n\n{bullet_points}"
690
720
  else:
691
- content = "_No arguments provided._"
721
+ if tool_args:
722
+ try:
723
+ args_text = json.dumps(tool_args, indent=2, sort_keys=True)
724
+ except TypeError: # pragma: no cover - fallback for unserializable args
725
+ args_text = str(tool_args)
726
+ content = f"```json\n{args_text}\n```"
727
+ else:
728
+ content = "_No arguments provided._"
692
729
 
693
730
  self._active_assistant_message = None
694
731
 
732
+ right_info = "shell command" if metadata.get("variant") == "shell" else f"tool request - {tool_name}"
733
+
695
734
  message = ChatMessage(
696
735
  role="tool_call",
697
736
  content=content,
698
737
  name=agent_name or "Tool",
699
- right_info=f"tool request - {tool_name}",
738
+ right_info=right_info,
700
739
  bottom_metadata=bottom_items,
701
740
  highlight_index=highlight_index,
702
741
  max_item_length=max_item_length,
@@ -1,16 +1,13 @@
1
1
  import asyncio
2
2
 
3
3
  from fast_agent import FastAgent
4
+ from fast_agent.constants import DEFAULT_AGENT_INSTRUCTION
4
5
 
5
6
  # Create the application
6
7
  fast = FastAgent("fast-agent example")
7
8
 
8
9
 
9
- default_instruction = """You are a helpful AI Agent.
10
-
11
- {{serverInstructions}}
12
-
13
- The current date is {{currentDate}}."""
10
+ default_instruction = DEFAULT_AGENT_INSTRUCTION
14
11
 
15
12
 
16
13
  # Define the agent
@@ -10,6 +10,8 @@ default_instruction = """You are a helpful AI Agent.
10
10
 
11
11
  {{serverInstructions}}
12
12
 
13
+ {{agentSkills}}
14
+
13
15
  The current date is {{currentDate}}."""
14
16
 
15
17
 
@@ -20,6 +20,12 @@ mcp_timeline:
20
20
  steps: 20 # number of timeline buckets to render
21
21
  step_seconds: 15 # seconds per bucket (accepts values like "45s", "2m")
22
22
 
23
+ #shell_execution:
24
+ # length of time before terminating subprocess
25
+ # timeout_seconds: 20
26
+ # warning interval if no output seen
27
+ # warning_seconds: 5
28
+
23
29
  # Logging and Console Configuration:
24
30
  logger:
25
31
  # level: "debug" | "info" | "warning" | "error"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.15"
3
+ version = "0.3.17"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -15,7 +15,7 @@ classifiers = [
15
15
  requires-python = ">=3.13.5,<3.14"
16
16
  dependencies = [
17
17
  "fastapi>=0.115.6",
18
- "mcp==1.18.0",
18
+ "mcp==1.19.0",
19
19
  "opentelemetry-distro>=0.55b0",
20
20
  "opentelemetry-exporter-otlp-proto-http>=1.7.0",
21
21
  "pydantic-settings>=2.7.0",
@@ -23,24 +23,25 @@ dependencies = [
23
23
  "pyyaml>=6.0.2",
24
24
  "rich>=14.1.0",
25
25
  "typer>=0.15.1",
26
- "anthropic>=0.69.0",
27
- "openai>=2.3.0",
26
+ "anthropic>=0.71.0",
27
+ "openai[aiohttp]>=2.6.1",
28
28
  "azure-identity>=1.14.0",
29
29
  "boto3>=1.35.0",
30
30
  "prompt-toolkit>=3.0.52",
31
- "aiohttp>=3.11.13",
31
+ "aiohttp>=3.13.1",
32
32
  "opentelemetry-instrumentation-openai>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
33
33
  "opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
34
34
  "opentelemetry-instrumentation-mcp>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
35
- "google-genai>=1.33.0",
35
+ "google-genai>=1.46.0",
36
36
  "opentelemetry-instrumentation-google-genai>=0.3b0",
37
37
  "tensorzero>=2025.7.5",
38
38
  "deprecated>=1.2.18",
39
- "a2a-sdk>=0.3.6",
39
+ "a2a-sdk>=0.3.10",
40
40
  "email-validator>=2.2.0",
41
41
  "pyperclip>=1.9.0",
42
42
  "keyring>=24.3.1",
43
43
  "textual>=6.2.1",
44
+ "python-frontmatter>=1.1.0",
44
45
  ]
45
46
 
46
47
  # For Azure OpenAI with DefaultAzureCredential support, install with: pip install fast-agent-mcp[azure]
@@ -23,6 +23,7 @@ from fast_agent.config import (
23
23
  OpenRouterSettings,
24
24
  OpenTelemetrySettings,
25
25
  Settings,
26
+ SkillsSettings,
26
27
  TensorZeroSettings,
27
28
  XAISettings,
28
29
  )
@@ -126,6 +127,7 @@ __all__ = [
126
127
  "BedrockSettings",
127
128
  "HuggingFaceSettings",
128
129
  "LoggerSettings",
130
+ "SkillsSettings",
129
131
  # Progress and event tracking (lazy loaded)
130
132
  "ProgressAction",
131
133
  "ProgressEvent",
@@ -4,10 +4,13 @@ Type definitions for agents and agent configurations.
4
4
 
5
5
  from dataclasses import dataclass, field
6
6
  from enum import StrEnum, auto
7
+ from pathlib import Path
7
8
  from typing import Dict, List, Optional
8
9
 
9
10
  from mcp.client.session import ElicitationFnT
10
11
 
12
+ from fast_agent.skills import SkillManifest, SkillRegistry
13
+
11
14
  # Forward imports to avoid circular dependencies
12
15
  from fast_agent.types import RequestParams
13
16
 
@@ -36,6 +39,8 @@ class AgentConfig:
36
39
  tools: Optional[Dict[str, List[str]]] = None
37
40
  resources: Optional[Dict[str, List[str]]] = None
38
41
  prompts: Optional[Dict[str, List[str]]] = None
42
+ skills: SkillManifest | SkillRegistry | Path | str | None = None
43
+ skill_manifests: List[SkillManifest] = field(default_factory=list, repr=False)
39
44
  model: str | None = None
40
45
  use_history: bool = True
41
46
  default_request_params: RequestParams | None = None
@@ -246,6 +246,7 @@ class LlmAgent(LlmDecorator):
246
246
  display_model = self.llm.model_name if self._llm else None
247
247
 
248
248
  remove_listener: Callable[[], None] | None = None
249
+ remove_tool_listener: Callable[[], None] | None = None
249
250
 
250
251
  with self.display.streaming_assistant_message(
251
252
  name=display_name,
@@ -253,8 +254,12 @@ class LlmAgent(LlmDecorator):
253
254
  ) as stream_handle:
254
255
  try:
255
256
  remove_listener = self.llm.add_stream_listener(stream_handle.update)
257
+ remove_tool_listener = self.llm.add_tool_stream_listener(
258
+ stream_handle.handle_tool_event
259
+ )
256
260
  except Exception:
257
261
  remove_listener = None
262
+ remove_tool_listener = None
258
263
 
259
264
  try:
260
265
  result, summary = await self._generate_with_summary(
@@ -263,6 +268,8 @@ class LlmAgent(LlmDecorator):
263
268
  finally:
264
269
  if remove_listener:
265
270
  remove_listener()
271
+ if remove_tool_listener:
272
+ remove_tool_listener()
266
273
 
267
274
  if summary:
268
275
  summary_text = Text(f"\n\n{summary.message}", style="dim red italic")
@@ -718,6 +718,12 @@ class LlmDecorator(AgentProtocol):
718
718
  return self._llm.message_history
719
719
  return []
720
720
 
721
+ def pop_last_message(self) -> PromptMessageExtended | None:
722
+ """Remove and return the most recent message from the conversation history."""
723
+ if self._llm:
724
+ return self._llm.pop_last_message()
725
+ return None
726
+
721
727
  @property
722
728
  def usage_accumulator(self) -> UsageAccumulator | None:
723
729
  """
@@ -42,12 +42,15 @@ from fast_agent.core.exceptions import PromptExitError
42
42
  from fast_agent.core.logging.logger import get_logger
43
43
  from fast_agent.interfaces import FastAgentLLMProtocol
44
44
  from fast_agent.mcp.mcp_aggregator import MCPAggregator, ServerStatus
45
+ from fast_agent.skills.registry import format_skills_for_prompt
45
46
  from fast_agent.tools.elicitation import (
46
47
  get_elicitation_tool,
47
48
  run_elicitation_form,
48
49
  set_elicitation_input_callback,
49
50
  )
51
+ from fast_agent.tools.shell_runtime import ShellRuntime
50
52
  from fast_agent.types import PromptMessageExtended, RequestParams
53
+ from fast_agent.ui import console
51
54
 
52
55
  # Define a TypeVar for models
53
56
  ModelT = TypeVar("ModelT", bound=BaseModel)
@@ -59,6 +62,7 @@ if TYPE_CHECKING:
59
62
 
60
63
  from fast_agent.context import Context
61
64
  from fast_agent.llm.usage_tracking import UsageAccumulator
65
+ from fast_agent.skills import SkillManifest
62
66
 
63
67
 
64
68
  class McpAgent(ABC, ToolAgent):
@@ -73,7 +77,6 @@ class McpAgent(ABC, ToolAgent):
73
77
  self,
74
78
  config: AgentConfig,
75
79
  connection_persistence: bool = True,
76
- # legacy human_input_callback removed
77
80
  context: "Context | None" = None,
78
81
  **kwargs,
79
82
  ) -> None:
@@ -96,6 +99,69 @@ class McpAgent(ABC, ToolAgent):
96
99
  self.instruction = self.config.instruction
97
100
  self.executor = context.executor if context else None
98
101
  self.logger = get_logger(f"{__name__}.{self._name}")
102
+ manifests: List[SkillManifest] = list(getattr(self.config, "skill_manifests", []) or [])
103
+ if not manifests and context and getattr(context, "skill_registry", None):
104
+ try:
105
+ manifests = list(context.skill_registry.load_manifests()) # type: ignore[assignment]
106
+ except Exception:
107
+ manifests = []
108
+
109
+ self._skill_manifests = list(manifests)
110
+ self._skill_map: Dict[str, SkillManifest] = {
111
+ manifest.name: manifest for manifest in manifests
112
+ }
113
+ self._agent_skills_warning_shown = False
114
+ shell_flag_requested = bool(context and getattr(context, "shell_runtime", False))
115
+ skills_configured = bool(self._skill_manifests)
116
+ self._shell_runtime_activation_reason: str | None = None
117
+
118
+ if shell_flag_requested and skills_configured:
119
+ self._shell_runtime_activation_reason = (
120
+ "via --shell flag and agent skills configuration"
121
+ )
122
+ elif shell_flag_requested:
123
+ self._shell_runtime_activation_reason = "via --shell flag"
124
+ elif skills_configured:
125
+ self._shell_runtime_activation_reason = "because agent skills are configured"
126
+
127
+ # Get timeout configuration from context
128
+ timeout_seconds = 90 # default
129
+ warning_interval_seconds = 30 # default
130
+ if context and context.config:
131
+ shell_config = getattr(context.config, "shell_execution", None)
132
+ if shell_config:
133
+ timeout_seconds = getattr(shell_config, "timeout_seconds", 90)
134
+ warning_interval_seconds = getattr(shell_config, "warning_interval_seconds", 30)
135
+
136
+ # Derive skills directory from this agent's manifests (respects per-agent config)
137
+ skills_directory = None
138
+ if self._skill_manifests:
139
+ # Get the skills directory from the first manifest's path
140
+ # Path structure: .fast-agent/skills/skill-name/SKILL.md
141
+ # So we need parent.parent of the manifest path
142
+ first_manifest = self._skill_manifests[0]
143
+ if first_manifest.path:
144
+ skills_directory = first_manifest.path.parent.parent
145
+
146
+ self._shell_runtime = ShellRuntime(
147
+ self._shell_runtime_activation_reason,
148
+ self.logger,
149
+ timeout_seconds=timeout_seconds,
150
+ warning_interval_seconds=warning_interval_seconds,
151
+ skills_directory=skills_directory,
152
+ )
153
+ self._shell_runtime_enabled = self._shell_runtime.enabled
154
+ self._shell_access_modes: tuple[str, ...] = ()
155
+ if self._shell_runtime_enabled:
156
+ modes: list[str] = ["[red]direct[/red]"]
157
+ if skills_configured:
158
+ modes.append("skills")
159
+ if shell_flag_requested:
160
+ modes.append("switch")
161
+ self._shell_access_modes = tuple(modes)
162
+ self._bash_tool = self._shell_runtime.tool
163
+ if self._shell_runtime_enabled:
164
+ self._shell_runtime.announce()
99
165
 
100
166
  # Store the default request params from config
101
167
  self._default_request_params = self.config.default_request_params
@@ -207,6 +273,24 @@ class McpAgent(ABC, ToolAgent):
207
273
  "{{serverInstructions}}", server_instructions
208
274
  )
209
275
 
276
+ skills_placeholder_present = "{{agentSkills}}" in self.instruction
277
+
278
+ if skills_placeholder_present:
279
+ agent_skills = format_skills_for_prompt(self._skill_manifests)
280
+ self.instruction = self.instruction.replace("{{agentSkills}}", agent_skills)
281
+ self._agent_skills_warning_shown = True
282
+ elif self._skill_manifests and not self._agent_skills_warning_shown:
283
+ warning_message = (
284
+ "Agent skills are configured but the system prompt does not include {{agentSkills}}. "
285
+ "Skill descriptions will not be added to the system prompt."
286
+ )
287
+ self.logger.warning(warning_message)
288
+ try:
289
+ console.console.print(f"[yellow]{warning_message}[/yellow]")
290
+ except Exception: # pragma: no cover - console fallback
291
+ pass
292
+ self._agent_skills_warning_shown = True
293
+
210
294
  # Update default request params to match
211
295
  if self._default_request_params:
212
296
  self._default_request_params.systemPrompt = self.instruction
@@ -315,11 +399,12 @@ class McpAgent(ABC, ToolAgent):
315
399
  """
316
400
  # Get all tools from the aggregator
317
401
  result = await self._aggregator.list_tools()
402
+ aggregator_tools = list(result.tools)
318
403
 
319
404
  # Apply filtering if tools are specified in config
320
405
  if self.config.tools is not None:
321
406
  filtered_tools = []
322
- for tool in result.tools:
407
+ for tool in aggregator_tools:
323
408
  # Extract server name from tool name, handling server names with hyphens
324
409
  server_name = None
325
410
  for configured_server in self.config.tools.keys():
@@ -334,7 +419,12 @@ class McpAgent(ABC, ToolAgent):
334
419
  if self._matches_pattern(tool.name, pattern, server_name):
335
420
  filtered_tools.append(tool)
336
421
  break
337
- result.tools = filtered_tools
422
+ aggregator_tools = filtered_tools
423
+
424
+ result.tools = aggregator_tools
425
+
426
+ if self._bash_tool and all(tool.name != self._bash_tool.name for tool in result.tools):
427
+ result.tools.append(self._bash_tool)
338
428
 
339
429
  # Append human input tool if enabled and available
340
430
  if self.config.human_input and getattr(self, "_human_input_tool", None):
@@ -353,6 +443,9 @@ class McpAgent(ABC, ToolAgent):
353
443
  Returns:
354
444
  Result of the tool call
355
445
  """
446
+ if self._shell_runtime.tool and name == self._shell_runtime.tool.name:
447
+ return await self._shell_runtime.execute(arguments)
448
+
356
449
  if name == HUMAN_INPUT_TOOL_NAME:
357
450
  # Call the elicitation-backed human input tool
358
451
  return await self._call_human_input_tool(arguments)
@@ -615,6 +708,10 @@ class McpAgent(ABC, ToolAgent):
615
708
  namespaced_tool.tool.name
616
709
  for namespaced_tool in self._aggregator._namespaced_tool_map.values()
617
710
  ]
711
+ if self._shell_runtime.tool:
712
+ available_tools.append(self._shell_runtime.tool.name)
713
+
714
+ available_tools = list(dict.fromkeys(available_tools))
618
715
 
619
716
  # Process each tool call using our aggregator
620
717
  for correlation_id, tool_request in request.tool_calls.items():
@@ -628,6 +725,8 @@ class McpAgent(ABC, ToolAgent):
628
725
  tool_available = False
629
726
  if tool_name == HUMAN_INPUT_TOOL_NAME:
630
727
  tool_available = True
728
+ elif self._bash_tool and tool_name == self._bash_tool.name:
729
+ tool_available = True
631
730
  elif namespaced_tool:
632
731
  tool_available = True
633
732
  else:
@@ -654,6 +753,14 @@ class McpAgent(ABC, ToolAgent):
654
753
  # Tool not found in list, no highlighting
655
754
  pass
656
755
 
756
+ metadata: dict[str, Any] | None = None
757
+ if (
758
+ self._shell_runtime_enabled
759
+ and self._shell_runtime.tool
760
+ and display_tool_name == self._shell_runtime.tool.name
761
+ ):
762
+ metadata = self._shell_runtime.metadata(tool_args.get("command"))
763
+
657
764
  self.display.show_tool_call(
658
765
  name=self._name,
659
766
  tool_args=tool_args,
@@ -661,10 +768,11 @@ class McpAgent(ABC, ToolAgent):
661
768
  tool_name=display_tool_name,
662
769
  highlight_index=highlight_index,
663
770
  max_item_length=12,
771
+ metadata=metadata,
664
772
  )
665
773
 
666
774
  try:
667
- # Use our aggregator to call the MCP tool
775
+ # Use the appropriate handler for this tool
668
776
  result = await self.call_tool(tool_name, tool_args)
669
777
  tool_results[correlation_id] = result
670
778
 
@@ -675,12 +783,13 @@ class McpAgent(ABC, ToolAgent):
675
783
  namespaced_tool.server_name
676
784
  )
677
785
 
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
- )
786
+ if not getattr(result, "_suppress_display", False):
787
+ self.display.show_tool_result(
788
+ name=self._name,
789
+ result=result,
790
+ tool_name=display_tool_name,
791
+ skybridge_config=skybridge_config,
792
+ )
684
793
 
685
794
  self.logger.debug(f"MCP tool {display_tool_name} executed successfully")
686
795
  except Exception as e:
@@ -873,6 +982,9 @@ class McpAgent(ABC, ToolAgent):
873
982
 
874
983
  result[special_server_name].append(self._human_input_tool)
875
984
 
985
+ # if self._skill_lookup_tool:
986
+ # result.setdefault("__skills__", []).append(self._skill_lookup_tool)
987
+
876
988
  return result
877
989
 
878
990
  @property
@@ -985,6 +1097,18 @@ class McpAgent(ABC, ToolAgent):
985
1097
  Convert a Tool to an AgentSkill.
986
1098
  """
987
1099
 
1100
+ if tool.name in self._skill_map:
1101
+ manifest = self._skill_map[tool.name]
1102
+ return AgentSkill(
1103
+ id=f"skill:{manifest.name}",
1104
+ name=manifest.name,
1105
+ description=manifest.description or "",
1106
+ tags=["skill"],
1107
+ examples=None,
1108
+ input_modes=None,
1109
+ output_modes=None,
1110
+ )
1111
+
988
1112
  _, tool_without_namespace = await self._parse_resource_name(tool.name, "tool")
989
1113
  return AgentSkill(
990
1114
  id=tool.name,
@@ -0,0 +1,73 @@
1
+ import asyncio
2
+ import json
3
+ import sys
4
+
5
+ from fast_agent.cli.constants import GO_SPECIFIC_OPTIONS, KNOWN_SUBCOMMANDS
6
+ from fast_agent.cli.main import app
7
+
8
+ # if the arguments would work with "go" we'll just route to it
9
+
10
+
11
+ def main():
12
+ """Main entry point that handles auto-routing to 'go' command."""
13
+ try:
14
+ loop = asyncio.get_event_loop()
15
+
16
+ def _log_asyncio_exception(loop: asyncio.AbstractEventLoop, context: dict) -> None:
17
+ import logging
18
+
19
+ logger = logging.getLogger("fast_agent.asyncio")
20
+
21
+ message = context.get("message", "(no message)")
22
+ task = context.get("task")
23
+ future = context.get("future")
24
+ handle = context.get("handle")
25
+ source_traceback = context.get("source_traceback")
26
+ exception = context.get("exception")
27
+
28
+ details = {
29
+ "message": message,
30
+ "task": repr(task) if task else None,
31
+ "future": repr(future) if future else None,
32
+ "handle": repr(handle) if handle else None,
33
+ "source_traceback": [str(frame) for frame in source_traceback] if source_traceback else None,
34
+ }
35
+
36
+ logger.error("Unhandled asyncio error: %s", message)
37
+ logger.error("Asyncio context: %s", json.dumps(details, indent=2))
38
+
39
+ if exception:
40
+ logger.exception("Asyncio exception", exc_info=exception)
41
+
42
+ loop.set_exception_handler(_log_asyncio_exception)
43
+ except RuntimeError:
44
+ # No running loop yet (rare for sync entry), safe to ignore
45
+ pass
46
+ # Check if we should auto-route to 'go'
47
+ if len(sys.argv) > 1:
48
+ # Check if first arg is not already a subcommand
49
+ first_arg = sys.argv[1]
50
+
51
+ # Only auto-route if any known go-specific options are present
52
+ has_go_options = any(
53
+ (arg in GO_SPECIFIC_OPTIONS) or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
54
+ for arg in sys.argv[1:]
55
+ )
56
+
57
+ if first_arg not in KNOWN_SUBCOMMANDS and has_go_options:
58
+ # Find where to insert 'go' - before the first go-specific option
59
+ insert_pos = 1
60
+ for i, arg in enumerate(sys.argv[1:], 1):
61
+ if (arg in GO_SPECIFIC_OPTIONS) or any(
62
+ arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS
63
+ ):
64
+ insert_pos = i
65
+ break
66
+ # Auto-route to go command
67
+ sys.argv.insert(insert_pos, "go")
68
+
69
+ app()
70
+
71
+
72
+ if __name__ == "__main__":
73
+ main()