fast-agent-mcp 0.3.4__tar.gz → 0.3.6__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 (286) hide show
  1. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/PKG-INFO +39 -2
  2. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/README.md +36 -0
  3. {fast_agent_mcp-0.3.4/src/fast_agent/resources → fast_agent_mcp-0.3.6/examples}/setup/.gitignore +6 -0
  4. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/setup/agent.py +8 -1
  5. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/setup/fastagent.config.yaml +1 -2
  6. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/setup/pyproject.toml.tmpl +6 -0
  7. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/pyproject.toml +3 -2
  8. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/llm_agent.py +15 -1
  9. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/mcp_agent.py +73 -1
  10. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/tool_agent.py +10 -0
  11. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/router_agent.py +10 -2
  12. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/__main__.py +8 -5
  13. fast_agent_mcp-0.3.6/src/fast_agent/cli/commands/auth.py +393 -0
  14. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/check_config.py +76 -4
  15. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/go.py +8 -2
  16. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/quickstart.py +3 -1
  17. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/server_helpers.py +10 -2
  18. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/setup.py +7 -9
  19. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/constants.py +1 -1
  20. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/main.py +3 -1
  21. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/config.py +63 -9
  22. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/mcp_aggregator.py +30 -0
  23. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/mcp_connection_manager.py +41 -4
  24. fast_agent_mcp-0.3.6/src/fast_agent/mcp/oauth_client.py +509 -0
  25. {fast_agent_mcp-0.3.4/examples → fast_agent_mcp-0.3.6/src/fast_agent/resources}/setup/.gitignore +6 -0
  26. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/setup/agent.py +8 -1
  27. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/setup/fastagent.config.yaml +1 -2
  28. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/setup/pyproject.toml.tmpl +6 -0
  29. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/console_display.py +48 -31
  30. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/enhanced_prompt.py +8 -0
  31. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/interactive_prompt.py +54 -0
  32. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/.gitignore +0 -0
  33. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/LICENSE +0 -0
  34. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/azure-openai/fastagent.config.yaml +0 -0
  35. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/bedrock/fast-agent.config.yaml +0 -0
  36. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/custom-agents/agent.py +0 -0
  37. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/custom-agents/fastagent.config.yaml +0 -0
  38. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/data-analysis/analysis-campaign.py +0 -0
  39. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/data-analysis/analysis.py +0 -0
  40. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/data-analysis/fastagent.config.yaml +0 -0
  41. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  42. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/fastapi/fastapi-advanced.py +0 -0
  43. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/fastapi/fastapi-simple.py +0 -0
  44. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/fastapi/pyproject.toml +0 -0
  45. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/fastapi/readme.md +0 -0
  46. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  47. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  48. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  49. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  50. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  51. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/forms_demo.py +0 -0
  52. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/game_character.py +0 -0
  53. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/game_character_handler.py +0 -0
  54. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/elicitations/tool_call.py +0 -0
  55. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  56. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  57. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  58. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  59. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/state-transfer/agent_one.py +0 -0
  60. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/state-transfer/agent_two.py +0 -0
  61. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  62. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  63. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/vision-examples/cat.png +0 -0
  64. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/vision-examples/example1.py +0 -0
  65. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/vision-examples/example2.py +0 -0
  66. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/vision-examples/example3.py +0 -0
  67. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  68. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/new-api/display_check.py +0 -0
  69. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/new-api/simple_llm.py +0 -0
  70. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/new-api/simple_llm_advanced.py +0 -0
  71. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/new-api/simple_mcp.py +0 -0
  72. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/otel/agent.py +0 -0
  73. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/otel/agent2.py +0 -0
  74. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/otel/docker-compose.yaml +0 -0
  75. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/otel/fastagent.config.yaml +0 -0
  76. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/researcher/fastagent.config.yaml +0 -0
  77. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/researcher/researcher-eval.py +0 -0
  78. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/researcher/researcher-imp.py +0 -0
  79. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/researcher/researcher.py +0 -0
  80. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/setup/fastagent.secrets.yaml.example +0 -0
  81. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/.env.sample +0 -0
  82. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/Makefile +0 -0
  83. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/README.md +0 -0
  84. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/agent.py +0 -0
  85. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/demo_images/clam.jpg +0 -0
  86. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/demo_images/crab.png +0 -0
  87. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/demo_images/shrimp.png +0 -0
  88. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/docker-compose.yml +0 -0
  89. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/fastagent.config.yaml +0 -0
  90. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/image_demo.py +0 -0
  91. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  92. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  93. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  94. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  95. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/simple_agent.py +0 -0
  96. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  97. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  98. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  99. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/chaining.py +0 -0
  100. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/evaluator.py +0 -0
  101. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/fastagent.config.yaml +0 -0
  102. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/graded_report.md +0 -0
  103. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/human_input.py +0 -0
  104. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/orchestrator.py +0 -0
  105. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/parallel.py +0 -0
  106. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/router.py +0 -0
  107. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/short_story.md +0 -0
  108. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/examples/workflows/short_story.txt +0 -0
  109. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/hatch_build.py +0 -0
  110. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/__init__.py +0 -0
  111. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/__init__.py +0 -0
  112. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/agent_types.py +0 -0
  113. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/llm_decorator.py +0 -0
  114. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  115. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  116. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  117. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  118. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  119. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  120. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/__init__.py +0 -0
  121. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/commands/url_parser.py +0 -0
  122. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/cli/terminal.py +0 -0
  123. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/constants.py +0 -0
  124. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/context.py +0 -0
  125. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/context_dependent.py +0 -0
  126. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/__init__.py +0 -0
  127. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/agent_app.py +0 -0
  128. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/core_app.py +0 -0
  129. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/direct_decorators.py +0 -0
  130. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/direct_factory.py +0 -0
  131. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/error_handling.py +0 -0
  132. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/exceptions.py +0 -0
  133. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/executor/__init__.py +0 -0
  134. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/executor/executor.py +0 -0
  135. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/executor/task_registry.py +0 -0
  136. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  137. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/fastagent.py +0 -0
  138. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/__init__.py +0 -0
  139. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/events.py +0 -0
  140. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/json_serializer.py +0 -0
  141. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/listeners.py +0 -0
  142. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/logger.py +0 -0
  143. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/logging/transport.py +0 -0
  144. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/prompt.py +0 -0
  145. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/core/validation.py +0 -0
  146. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/event_progress.py +0 -0
  147. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/history/history_exporter.py +0 -0
  148. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/__init__.py +0 -0
  149. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  150. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/elicitation_state.py +0 -0
  151. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/form_fields.py +0 -0
  152. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/simple_form.py +0 -0
  153. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/human_input/types.py +0 -0
  154. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/interfaces.py +0 -0
  155. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/__init__.py +0 -0
  156. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/fastagent_llm.py +0 -0
  157. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/internal/passthrough.py +0 -0
  158. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/internal/playback.py +0 -0
  159. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/internal/silent.py +0 -0
  160. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/internal/slow.py +0 -0
  161. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/memory.py +0 -0
  162. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/model_database.py +0 -0
  163. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/model_factory.py +0 -0
  164. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/model_info.py +0 -0
  165. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/prompt_utils.py +0 -0
  166. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  167. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  168. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  169. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  170. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  171. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  172. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  173. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  174. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  175. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  176. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  177. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  178. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  179. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  180. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  181. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  182. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  183. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  184. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  185. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  186. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider_key_manager.py +0 -0
  187. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/provider_types.py +0 -0
  188. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/request_params.py +0 -0
  189. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/sampling_converter.py +0 -0
  190. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/llm/usage_tracking.py +0 -0
  191. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/__init__.py +0 -0
  192. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/common.py +0 -0
  193. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  194. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  195. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/gen_client.py +0 -0
  196. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  197. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  198. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  199. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/hf_auth.py +0 -0
  200. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/interfaces.py +0 -0
  201. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/logger_textio.py +0 -0
  202. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  203. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/mcp_content.py +0 -0
  204. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/mime_utils.py +0 -0
  205. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompt.py +0 -0
  206. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  207. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompt_render.py +0 -0
  208. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  209. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  210. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  211. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  212. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  213. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  214. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  215. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  216. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/resource_utils.py +0 -0
  217. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/sampling.py +0 -0
  218. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/server/__init__.py +0 -0
  219. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/server/agent_server.py +0 -0
  220. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/ui_agent.py +0 -0
  221. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp/ui_mixin.py +0 -0
  222. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/mcp_server_registry.py +0 -0
  223. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/py.typed +0 -0
  224. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  225. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  226. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  227. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  228. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  229. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  230. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  231. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  232. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  233. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  234. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  235. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  236. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  237. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  238. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  239. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  240. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  241. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  242. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  243. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  244. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  245. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  246. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  247. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  248. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  249. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  250. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  251. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  252. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  253. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  254. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  255. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  256. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  257. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  258. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  259. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  260. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  261. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  262. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  263. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  264. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  265. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  266. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  267. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  268. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  269. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  270. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  271. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  272. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  273. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  274. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  275. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/tools/elicitation.py +0 -0
  276. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/types/__init__.py +0 -0
  277. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/types/llm_stop_reason.py +0 -0
  278. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/__init__.py +0 -0
  279. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/console.py +0 -0
  280. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/elicitation_form.py +0 -0
  281. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/elicitation_style.py +0 -0
  282. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  283. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/mermaid_utils.py +0 -0
  284. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/progress_display.py +0 -0
  285. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/src/fast_agent/ui/rich_progress.py +0 -0
  286. {fast_agent_mcp-0.3.4 → fast_agent_mcp-0.3.6}/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.4
3
+ Version: 0.3.6
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>
6
6
  License: Apache License
@@ -208,7 +208,7 @@ License-File: LICENSE
208
208
  Classifier: License :: OSI Approved :: Apache Software License
209
209
  Classifier: Operating System :: OS Independent
210
210
  Classifier: Programming Language :: Python :: 3
211
- Requires-Python: >=3.13.7
211
+ Requires-Python: >=3.13.5
212
212
  Requires-Dist: a2a-sdk>=0.3.0
213
213
  Requires-Dist: aiohttp>=3.11.13
214
214
  Requires-Dist: anthropic>=0.66.0
@@ -218,6 +218,7 @@ Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
220
  Requires-Dist: google-genai>=1.33.0
221
+ Requires-Dist: keyring>=24.3.1
221
222
  Requires-Dist: mcp==1.14.0
222
223
  Requires-Dist: openai>=1.106.1
223
224
  Requires-Dist: opentelemetry-distro>=0.55b0
@@ -380,6 +381,42 @@ uv run workflow/chaining.py --agent post_writer --message "<url>"
380
381
 
381
382
  Add the `--quiet` switch to disable progress and message display and return only the final response - useful for simple automations.
382
383
 
384
+ ## MCP OAuth (v2.1)
385
+
386
+ For SSE and HTTP MCP servers, OAuth is enabled by default with minimal configuration. A local callback server is used to capture the authorization code, with a paste-URL fallback if the port is unavailable.
387
+
388
+ - Minimal per-server settings in `fastagent.config.yaml`:
389
+
390
+ ```yaml
391
+ mcp:
392
+ servers:
393
+ myserver:
394
+ transport: http # or sse
395
+ url: http://localhost:8001/mcp # or /sse for SSE servers
396
+ auth:
397
+ oauth: true # default: true
398
+ redirect_port: 3030 # default: 3030
399
+ redirect_path: /callback # default: /callback
400
+ # scope: "user" # optional; if omitted, server defaults are used
401
+ ```
402
+
403
+ - The OAuth client uses PKCE and in-memory token storage (no tokens written to disk).
404
+ - Token persistence: by default, tokens are stored securely in your OS keychain via `keyring`. If a keychain is unavailable (e.g., headless container), in-memory storage is used for the session.
405
+ - To force in-memory only per server, set:
406
+
407
+ ```yaml
408
+ mcp:
409
+ servers:
410
+ myserver:
411
+ transport: http
412
+ url: http://localhost:8001/mcp
413
+ auth:
414
+ oauth: true
415
+ persist: memory
416
+ ```
417
+
418
+ - To disable OAuth for a specific server , set `auth.oauth: false` for that server.
419
+
383
420
  ## Workflows
384
421
 
385
422
  ### Chain
@@ -142,6 +142,42 @@ uv run workflow/chaining.py --agent post_writer --message "<url>"
142
142
 
143
143
  Add the `--quiet` switch to disable progress and message display and return only the final response - useful for simple automations.
144
144
 
145
+ ## MCP OAuth (v2.1)
146
+
147
+ For SSE and HTTP MCP servers, OAuth is enabled by default with minimal configuration. A local callback server is used to capture the authorization code, with a paste-URL fallback if the port is unavailable.
148
+
149
+ - Minimal per-server settings in `fastagent.config.yaml`:
150
+
151
+ ```yaml
152
+ mcp:
153
+ servers:
154
+ myserver:
155
+ transport: http # or sse
156
+ url: http://localhost:8001/mcp # or /sse for SSE servers
157
+ auth:
158
+ oauth: true # default: true
159
+ redirect_port: 3030 # default: 3030
160
+ redirect_path: /callback # default: /callback
161
+ # scope: "user" # optional; if omitted, server defaults are used
162
+ ```
163
+
164
+ - The OAuth client uses PKCE and in-memory token storage (no tokens written to disk).
165
+ - Token persistence: by default, tokens are stored securely in your OS keychain via `keyring`. If a keychain is unavailable (e.g., headless container), in-memory storage is used for the session.
166
+ - To force in-memory only per server, set:
167
+
168
+ ```yaml
169
+ mcp:
170
+ servers:
171
+ myserver:
172
+ transport: http
173
+ url: http://localhost:8001/mcp
174
+ auth:
175
+ oauth: true
176
+ persist: memory
177
+ ```
178
+
179
+ - To disable OAuth for a specific server , set `auth.oauth: false` for that server.
180
+
145
181
  ## Workflows
146
182
 
147
183
  ### Chain
@@ -22,3 +22,9 @@ fastagent.jsonl
22
22
  # Editors (optional)
23
23
  .idea/
24
24
  .vscode/
25
+
26
+ # Packaging metadata
27
+ *.dist-info/
28
+ *.egg-info/
29
+ dist/
30
+ build/
@@ -6,8 +6,15 @@ from fast_agent import FastAgent
6
6
  fast = FastAgent("fast-agent example")
7
7
 
8
8
 
9
+ default_instruction = """You are a helpful AI Agent.
10
+
11
+ {{serverInstructions}}
12
+
13
+ The current date is {{currentDate}}."""
14
+
15
+
9
16
  # Define the agent
10
- @fast.agent(instruction="You are a helpful AI Agent")
17
+ @fast.agent(instruction=default_instruction)
11
18
  async def main():
12
19
  # use the --model command line switch or agent arguments to change model
13
20
  async with fast.run() as agent:
@@ -41,5 +41,4 @@ mcp:
41
41
  command: "npx"
42
42
  args: ["-y", "@modelcontextprotocol/server-filesystem", "."]
43
43
  huggingface:
44
- transport: "http"
45
- url: "https://huggingface.co/mcp"
44
+ url: "https://huggingface.co/mcp?login"
@@ -15,3 +15,9 @@ package = true
15
15
  [project.scripts]
16
16
  fast-agent-app = "agent:main"
17
17
 
18
+ [build-system]
19
+ requires = ["setuptools>=64", "wheel"]
20
+ build-backend = "setuptools.build_meta"
21
+
22
+ [tool.setuptools]
23
+ py-modules = ["agent"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.4"
3
+ version = "0.3.6"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -12,7 +12,7 @@ classifiers = [
12
12
  "License :: OSI Approved :: Apache Software License",
13
13
  "Operating System :: OS Independent"
14
14
  ]
15
- requires-python = ">=3.13.7"
15
+ requires-python = ">=3.13.5"
16
16
  dependencies = [
17
17
  "fastapi>=0.115.6",
18
18
  "mcp==1.14.0",
@@ -39,6 +39,7 @@ dependencies = [
39
39
  "a2a-sdk>=0.3.0",
40
40
  "email-validator>=2.2.0",
41
41
  "pyperclip>=1.9.0",
42
+ "keyring>=24.3.1",
42
43
  ]
43
44
 
44
45
  # For Azure OpenAI with DefaultAzureCredential support, install with: pip install fast-agent-mcp[azure]
@@ -137,10 +137,24 @@ class LlmAgent(LlmDecorator):
137
137
  display_name = name if name is not None else self.name
138
138
  display_model = model if model is not None else (self.llm.model_name if self._llm else None)
139
139
 
140
+ # Convert highlight_items to highlight_index
141
+ highlight_index = None
142
+ if highlight_items and bottom_items:
143
+ if isinstance(highlight_items, str):
144
+ try:
145
+ highlight_index = bottom_items.index(highlight_items)
146
+ except ValueError:
147
+ pass
148
+ elif isinstance(highlight_items, list) and len(highlight_items) > 0:
149
+ try:
150
+ highlight_index = bottom_items.index(highlight_items[0])
151
+ except ValueError:
152
+ pass
153
+
140
154
  await self.display.show_assistant_message(
141
155
  message_text,
142
156
  bottom_items=bottom_items,
143
- highlight_items=highlight_items,
157
+ highlight_index=highlight_index,
144
158
  max_item_length=max_item_length,
145
159
  name=display_name,
146
160
  model=display_model,
@@ -156,6 +156,9 @@ class McpAgent(ABC, ToolAgent):
156
156
  """
157
157
  await self.__aenter__()
158
158
 
159
+ # Apply template substitution to the instruction with server instructions
160
+ await self._apply_instruction_templates()
161
+
159
162
  async def shutdown(self) -> None:
160
163
  """
161
164
  Shutdown the agent and close all MCP server connections.
@@ -174,6 +177,67 @@ class McpAgent(ABC, ToolAgent):
174
177
  self._initialized = value
175
178
  self._aggregator.initialized = value
176
179
 
180
+ async def _apply_instruction_templates(self) -> None:
181
+ """
182
+ Apply template substitution to the instruction, including server instructions.
183
+ This is called during initialization after servers are connected.
184
+ """
185
+ if not self.instruction:
186
+ return
187
+
188
+ # Gather server instructions if the template includes {{serverInstructions}}
189
+ if "{{serverInstructions}}" in self.instruction:
190
+ try:
191
+ instructions_data = await self._aggregator.get_server_instructions()
192
+ server_instructions = self._format_server_instructions(instructions_data)
193
+ except Exception as e:
194
+ self.logger.warning(f"Failed to get server instructions: {e}")
195
+ server_instructions = ""
196
+
197
+ # Replace the template variable
198
+ self.instruction = self.instruction.replace("{{serverInstructions}}", server_instructions)
199
+
200
+
201
+ # Update default request params to match
202
+ if self._default_request_params:
203
+ self._default_request_params.systemPrompt = self.instruction
204
+
205
+ self.logger.debug(f"Applied instruction templates for agent {self._name}")
206
+
207
+ def _format_server_instructions(self, instructions_data: Dict[str, tuple[str | None, List[str]]]) -> str:
208
+ """
209
+ Format server instructions with XML tags and tool lists.
210
+
211
+ Args:
212
+ instructions_data: Dict mapping server name to (instructions, tool_names)
213
+
214
+ Returns:
215
+ Formatted string with server instructions
216
+ """
217
+ if not instructions_data:
218
+ return ""
219
+
220
+ formatted_parts = []
221
+ for server_name, (instructions, tool_names) in instructions_data.items():
222
+ # Skip servers with no instructions
223
+ if instructions is None:
224
+ continue
225
+
226
+ # Format tool names with server prefix
227
+ prefixed_tools = [f"{server_name}-{tool}" for tool in tool_names]
228
+ tools_list = ", ".join(prefixed_tools) if prefixed_tools else "No tools available"
229
+
230
+ formatted_parts.append(
231
+ f"<mcp-server name=\"{server_name}\">\n"
232
+ f"<tools>{tools_list}</tools>\n"
233
+ f"<instructions>\n{instructions}\n</instructions>\n"
234
+ f"</mcp-server>"
235
+ )
236
+
237
+ if formatted_parts:
238
+ return "\n\n".join(formatted_parts)
239
+ return ""
240
+
177
241
  async def __call__(
178
242
  self,
179
243
  message: Union[
@@ -549,12 +613,20 @@ class McpAgent(ABC, ToolAgent):
549
613
  namespaced_tool = self._aggregator._namespaced_tool_map.get(tool_name)
550
614
  display_tool_name = namespaced_tool.tool.name if namespaced_tool else tool_name
551
615
 
616
+ # Find the index of the current tool in available_tools for highlighting
617
+ highlight_index = None
618
+ try:
619
+ highlight_index = available_tools.index(display_tool_name)
620
+ except ValueError:
621
+ # Tool not found in list, no highlighting
622
+ pass
623
+
552
624
  self.display.show_tool_call(
553
625
  name=self._name,
554
626
  tool_args=tool_args,
555
627
  bottom_items=available_tools,
556
628
  tool_name=display_tool_name,
557
- highlight_items=tool_name,
629
+ highlight_index=highlight_index,
558
630
  max_item_length=12,
559
631
  )
560
632
 
@@ -128,11 +128,21 @@ class ToolAgent(LlmAgent):
128
128
  for correlation_id, tool_request in request.tool_calls.items():
129
129
  tool_name = tool_request.params.name
130
130
  tool_args = tool_request.params.arguments or {}
131
+
132
+ # Find the index of the current tool in available_tools for highlighting
133
+ highlight_index = None
134
+ try:
135
+ highlight_index = available_tools.index(tool_name)
136
+ except ValueError:
137
+ # Tool not found in list, no highlighting
138
+ pass
139
+
131
140
  self.display.show_tool_call(
132
141
  name=self.name,
133
142
  tool_args=tool_args,
134
143
  bottom_items=available_tools,
135
144
  tool_name=tool_name,
145
+ highlight_index=highlight_index,
136
146
  max_item_length=12,
137
147
  )
138
148
 
@@ -300,10 +300,18 @@ class RouterAgent(LlmAgent):
300
300
  if response.reasoning:
301
301
  routing_message += f" ({response.reasoning})"
302
302
 
303
+ # Convert highlight_items to highlight_index
304
+ agent_keys = list(self.agent_map.keys())
305
+ highlight_index = None
306
+ try:
307
+ highlight_index = agent_keys.index(response.agent)
308
+ except ValueError:
309
+ pass
310
+
303
311
  await self.display.show_assistant_message(
304
312
  routing_message,
305
- bottom_items=list(self.agent_map.keys()),
306
- highlight_items=[response.agent],
313
+ bottom_items=agent_keys,
314
+ highlight_index=highlight_index,
307
315
  name=self.name,
308
316
  )
309
317
 
@@ -13,14 +13,17 @@ def main():
13
13
  # Check if first arg is not already a subcommand
14
14
  first_arg = sys.argv[1]
15
15
 
16
- if first_arg not in KNOWN_SUBCOMMANDS and any(
17
- arg in sys.argv or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
18
- for arg in sys.argv
19
- ):
16
+ # Only auto-route if any known go-specific options are present
17
+ has_go_options = any(
18
+ (arg in GO_SPECIFIC_OPTIONS) or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
19
+ for arg in sys.argv[1:]
20
+ )
21
+
22
+ if first_arg not in KNOWN_SUBCOMMANDS and has_go_options:
20
23
  # Find where to insert 'go' - before the first go-specific option
21
24
  insert_pos = 1
22
25
  for i, arg in enumerate(sys.argv[1:], 1):
23
- if arg in GO_SPECIFIC_OPTIONS or any(
26
+ if (arg in GO_SPECIFIC_OPTIONS) or any(
24
27
  arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS
25
28
  ):
26
29
  insert_pos = i