fast-agent-mcp 0.1.8__tar.gz → 0.1.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/PKG-INFO +26 -4
  2. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/README.md +24 -2
  3. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/pyproject.toml +15 -3
  4. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/agents/agent.py +5 -11
  5. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/agent_app.py +89 -13
  6. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/fastagent.py +13 -3
  7. fast_agent_mcp-0.1.9/src/mcp_agent/core/mcp_content.py +222 -0
  8. fast_agent_mcp-0.1.9/src/mcp_agent/core/prompt.py +132 -0
  9. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/proxies.py +41 -36
  10. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/transport.py +30 -3
  11. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/mcp_aggregator.py +11 -10
  12. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/mime_utils.py +69 -0
  13. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompt_message_multipart.py +64 -0
  14. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompt_serialization.py +447 -0
  15. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompts/__main__.py +10 -0
  16. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompts/prompt_server.py +508 -0
  17. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompts/prompt_template.py +469 -0
  18. fast_agent_mcp-0.1.9/src/mcp_agent/mcp/resource_utils.py +203 -0
  19. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/agent.py +1 -1
  20. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/fastagent.config.yaml +2 -2
  21. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/sizer.py +0 -5
  22. fast_agent_mcp-0.1.9/src/mcp_agent/resources/examples/prompting/__init__.py +3 -0
  23. fast_agent_mcp-0.1.9/src/mcp_agent/resources/examples/prompting/agent.py +23 -0
  24. fast_agent_mcp-0.1.9/src/mcp_agent/resources/examples/prompting/fastagent.config.yaml +44 -0
  25. fast_agent_mcp-0.1.9/src/mcp_agent/resources/examples/prompting/image_server.py +56 -0
  26. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/anthropic_utils.py +101 -0
  27. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/augmented_llm.py +139 -66
  28. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/augmented_llm_anthropic.py +127 -251
  29. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/augmented_llm_openai.py +149 -305
  30. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/augmented_llm_passthrough.py +43 -0
  31. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/augmented_llm_playback.py +109 -0
  32. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/model_factory.py +20 -3
  33. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/openai_utils.py +65 -0
  34. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/__init__.py +8 -0
  35. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/multipart_converter_anthropic.py +348 -0
  36. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/multipart_converter_openai.py +426 -0
  37. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/openai_multipart.py +197 -0
  38. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/sampling_converter_anthropic.py +258 -0
  39. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/providers/sampling_converter_openai.py +229 -0
  40. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm/sampling_format_converter.py +39 -0
  41. fast_agent_mcp-0.1.9/src/mcp_agent/workflows/swarm/__init__.py +0 -0
  42. fast_agent_mcp-0.1.8/src/mcp_agent/core/server_validation.py +0 -44
  43. fast_agent_mcp-0.1.8/src/mcp_agent/core/simulator_registry.py +0 -22
  44. fast_agent_mcp-0.1.8/src/mcp_agent/workflows/llm/enhanced_passthrough.py +0 -70
  45. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/.gitignore +0 -0
  46. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/LICENSE +0 -0
  47. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/__init__.py +0 -0
  48. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/agents/__init__.py +0 -0
  49. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/app.py +0 -0
  50. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/__init__.py +0 -0
  51. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/__main__.py +0 -0
  52. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/commands/bootstrap.py +0 -0
  53. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/commands/config.py +0 -0
  54. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/commands/setup.py +0 -0
  55. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/main.py +0 -0
  56. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/cli/terminal.py +0 -0
  57. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/config.py +0 -0
  58. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/console.py +0 -0
  59. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/context.py +0 -0
  60. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/context_dependent.py +0 -0
  61. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/__init__.py +0 -0
  62. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/agent_types.py +0 -0
  63. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/agent_utils.py +0 -0
  64. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/decorators.py +0 -0
  65. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/enhanced_prompt.py +0 -0
  66. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/error_handling.py +0 -0
  67. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/exceptions.py +0 -0
  68. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/factory.py +0 -0
  69. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/types.py +0 -0
  70. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/core/validation.py +0 -0
  71. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/eval/__init__.py +0 -0
  72. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/event_progress.py +0 -0
  73. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/__init__.py +0 -0
  74. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/decorator_registry.py +0 -0
  75. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/executor.py +0 -0
  76. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/task_registry.py +0 -0
  77. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/temporal.py +0 -0
  78. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/workflow.py +0 -0
  79. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/executor/workflow_signal.py +0 -0
  80. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/human_input/__init__.py +0 -0
  81. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/human_input/handler.py +0 -0
  82. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/human_input/types.py +0 -0
  83. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/__init__.py +0 -0
  84. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/events.py +0 -0
  85. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/json_serializer.py +0 -0
  86. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/listeners.py +0 -0
  87. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/logger.py +0 -0
  88. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/rich_progress.py +0 -0
  89. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/logging/tracing.py +0 -0
  90. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/__init__.py +0 -0
  91. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/gen_client.py +0 -0
  92. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/mcp_activity.py +0 -0
  93. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  94. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/mcp_agent_server.py +0 -0
  95. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  96. {fast_agent_mcp-0.1.8/src/mcp_agent/telemetry → fast_agent_mcp-0.1.9/src/mcp_agent/mcp/prompts}/__init__.py +0 -0
  97. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp/stdio.py +0 -0
  98. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp_server/__init__.py +0 -0
  99. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  100. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/mcp_server_registry.py +0 -0
  101. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/progress_display.py +0 -0
  102. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  103. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  104. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  105. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  106. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/job.py +0 -0
  107. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/prompt_category.py +0 -0
  108. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/prompt_sizing.py +0 -0
  109. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/internal/social.py +0 -0
  110. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/mcp_researcher/researcher-eval.py +0 -0
  111. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  112. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  113. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  114. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  115. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/agent_build.py +0 -0
  116. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  117. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  118. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  119. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  120. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  121. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  122. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  123. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/resources/examples/workflows/sse.py +0 -0
  124. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows → fast_agent_mcp-0.1.9/src/mcp_agent/telemetry}/__init__.py +0 -0
  125. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/telemetry/usage_tracking.py +0 -0
  126. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/ui/console_display.py +0 -0
  127. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/embedding → fast_agent_mcp-0.1.9/src/mcp_agent/workflows}/__init__.py +0 -0
  128. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/evaluator_optimizer → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/embedding}/__init__.py +0 -0
  129. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/embedding/embedding_base.py +0 -0
  130. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/embedding/embedding_cohere.py +0 -0
  131. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/embedding/embedding_openai.py +0 -0
  132. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/intent_classifier → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/evaluator_optimizer}/__init__.py +0 -0
  133. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py +0 -0
  134. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/llm → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/intent_classifier}/__init__.py +0 -0
  135. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_base.py +0 -0
  136. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py +0 -0
  137. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding_cohere.py +0 -0
  138. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding_openai.py +0 -0
  139. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm.py +0 -0
  140. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py +0 -0
  141. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py +0 -0
  142. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/orchestrator → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/llm}/__init__.py +0 -0
  143. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/llm_selector.py +0 -0
  144. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/llm/prompt_utils.py +0 -0
  145. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/parallel → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/orchestrator}/__init__.py +0 -0
  146. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/orchestrator/orchestrator.py +0 -0
  147. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/orchestrator/orchestrator_models.py +0 -0
  148. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/orchestrator/orchestrator_prompts.py +0 -0
  149. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/router → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/parallel}/__init__.py +0 -0
  150. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/parallel/fan_in.py +0 -0
  151. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/parallel/fan_out.py +0 -0
  152. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/parallel/parallel_llm.py +0 -0
  153. {fast_agent_mcp-0.1.8/src/mcp_agent/workflows/swarm → fast_agent_mcp-0.1.9/src/mcp_agent/workflows/router}/__init__.py +0 -0
  154. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/router/router_base.py +0 -0
  155. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/router/router_embedding.py +0 -0
  156. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/router/router_embedding_cohere.py +0 -0
  157. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/router/router_embedding_openai.py +0 -0
  158. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/router/router_llm.py +0 -0
  159. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/swarm/swarm.py +0 -0
  160. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/swarm/swarm_anthropic.py +0 -0
  161. {fast_agent_mcp-0.1.8 → fast_agent_mcp-0.1.9}/src/mcp_agent/workflows/swarm/swarm_openai.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>, Sarmad Qadri <sarmad@lastmileai.dev>
6
6
  License: Apache License
@@ -212,7 +212,7 @@ Requires-Python: >=3.10
212
212
  Requires-Dist: aiohttp>=3.11.13
213
213
  Requires-Dist: anthropic>=0.49.0
214
214
  Requires-Dist: fastapi>=0.115.6
215
- Requires-Dist: mcp==1.2.1
215
+ Requires-Dist: mcp>=1.4.1
216
216
  Requires-Dist: numpy>=2.2.1
217
217
  Requires-Dist: openai>=1.63.2
218
218
  Requires-Dist: opentelemetry-distro>=0.50b0
@@ -259,6 +259,10 @@ The simple declarative syntax lets you concentrate on composing your Prompts and
259
259
 
260
260
  Evaluate how different models handle Agent and MCP Server calling tasks, then build multi-model workflows using the best provider for each task.
261
261
 
262
+ `fast-agent` is now multi-modal, supporting Images and PDFs for both Anthropic and OpenAI endpoints (for supported models), via Prompts and MCP Tool Call results.
263
+
264
+ > [!TIP] > `fast-agent` is now MCP Native! Coming Soon - Full Documentation Site.
265
+
262
266
  ### Agent Application Development
263
267
 
264
268
  Prompts and configurations that define your Agent Applications are stored in simple files, with minimal boilerplate, enabling simple management and version control.
@@ -588,6 +592,19 @@ agent["greeter"].send("Good Evening!") # Dictionary access is supported
588
592
  )
589
593
  ```
590
594
 
595
+ ### Multimodal Support
596
+
597
+ Add Resources to prompts using either the inbuilt `prompt-server` or MCP Types directly. Convenience class are made available to do so simply, for example:
598
+
599
+ #### MCP Tool Result Conversion
600
+
601
+ LLM APIs have restrictions on the content types that can be returned as Tool Calls/Function results via their Chat Completions API's:
602
+
603
+ - OpenAI supports Text
604
+ - Anthropic supports Text and Image
605
+
606
+ For MCP Tool Results, `ImageResources` and `EmbeddedResources` are converted to User Messages and added to the conversation.
607
+
591
608
  ### Prompts
592
609
 
593
610
  MCP Prompts are supported with `apply_prompt(name,arguments)`, which always returns an Assistant Message. If the last message from the MCP Server is a 'User' message, it is sent to the LLM for processing. Prompts applied to the Agent's Context are retained - meaning that with `use_history=False`, Agents can act as finely tuned responders.
@@ -605,8 +622,9 @@ Prompts can also be applied interactively through the interactive interface by u
605
622
 
606
623
  ### llmindset.co.uk fork:
607
624
 
625
+ - Addition of MCP Prompts including Prompt Server and agent save/replay ability.
608
626
  - Overhaul of Eval/Opt for Conversation Management
609
- - Remove instructor use for Orchestrator
627
+ - Removed instructor/double-llm calling - native structured outputs for OAI.
610
628
  - Improved handling of Parallel/Fan-In and respose option
611
629
  - XML based generated prompts
612
630
  - "FastAgent" style prototyping, with per-agent models
@@ -625,4 +643,8 @@ Prompts can also be applied interactively through the interactive interface by u
625
643
  - Declarative workflows
626
644
  - Numerous defect fixes
627
645
 
628
- ### Features to add.
646
+ ### Features to add (Commmitted)
647
+
648
+ - Run Agent as MCP Server, with interop
649
+ - Multi-part content types supporing Vision, PDF and multi-part Text.
650
+ - Improved test automation (supported by prompt_server.py and augmented_llm_playback.py)
@@ -16,6 +16,10 @@ The simple declarative syntax lets you concentrate on composing your Prompts and
16
16
 
17
17
  Evaluate how different models handle Agent and MCP Server calling tasks, then build multi-model workflows using the best provider for each task.
18
18
 
19
+ `fast-agent` is now multi-modal, supporting Images and PDFs for both Anthropic and OpenAI endpoints (for supported models), via Prompts and MCP Tool Call results.
20
+
21
+ > [!TIP] > `fast-agent` is now MCP Native! Coming Soon - Full Documentation Site.
22
+
19
23
  ### Agent Application Development
20
24
 
21
25
  Prompts and configurations that define your Agent Applications are stored in simple files, with minimal boilerplate, enabling simple management and version control.
@@ -345,6 +349,19 @@ agent["greeter"].send("Good Evening!") # Dictionary access is supported
345
349
  )
346
350
  ```
347
351
 
352
+ ### Multimodal Support
353
+
354
+ Add Resources to prompts using either the inbuilt `prompt-server` or MCP Types directly. Convenience class are made available to do so simply, for example:
355
+
356
+ #### MCP Tool Result Conversion
357
+
358
+ LLM APIs have restrictions on the content types that can be returned as Tool Calls/Function results via their Chat Completions API's:
359
+
360
+ - OpenAI supports Text
361
+ - Anthropic supports Text and Image
362
+
363
+ For MCP Tool Results, `ImageResources` and `EmbeddedResources` are converted to User Messages and added to the conversation.
364
+
348
365
  ### Prompts
349
366
 
350
367
  MCP Prompts are supported with `apply_prompt(name,arguments)`, which always returns an Assistant Message. If the last message from the MCP Server is a 'User' message, it is sent to the LLM for processing. Prompts applied to the Agent's Context are retained - meaning that with `use_history=False`, Agents can act as finely tuned responders.
@@ -362,8 +379,9 @@ Prompts can also be applied interactively through the interactive interface by u
362
379
 
363
380
  ### llmindset.co.uk fork:
364
381
 
382
+ - Addition of MCP Prompts including Prompt Server and agent save/replay ability.
365
383
  - Overhaul of Eval/Opt for Conversation Management
366
- - Remove instructor use for Orchestrator
384
+ - Removed instructor/double-llm calling - native structured outputs for OAI.
367
385
  - Improved handling of Parallel/Fan-In and respose option
368
386
  - XML based generated prompts
369
387
  - "FastAgent" style prototyping, with per-agent models
@@ -382,4 +400,8 @@ Prompts can also be applied interactively through the interactive interface by u
382
400
  - Declarative workflows
383
401
  - Numerous defect fixes
384
402
 
385
- ### Features to add.
403
+ ### Features to add (Commmitted)
404
+
405
+ - Run Agent as MCP Server, with interop
406
+ - Multi-part content types supporing Vision, PDF and multi-part Text.
407
+ - Improved test automation (supported by prompt_server.py and augmented_llm_playback.py)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.1.8"
3
+ version = "0.1.9"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -16,7 +16,7 @@ classifiers = [
16
16
  requires-python = ">=3.10"
17
17
  dependencies = [
18
18
  "fastapi>=0.115.6",
19
- "mcp==1.2.1",
19
+ "mcp>=1.4.1",
20
20
  "opentelemetry-distro>=0.50b0",
21
21
  "opentelemetry-exporter-otlp-proto-http>=1.29.0",
22
22
  "pydantic-settings>=2.7.0",
@@ -72,9 +72,20 @@ include = [
72
72
  "src/mcp_agent/resources/**/*.csv",
73
73
  ]
74
74
 
75
+ [tool.pytest.ini_options]
76
+ asyncio_mode = "strict"
77
+ asyncio_default_fixture_loop_scope = "function"
78
+ markers = [
79
+ "e2e: tests that connect to external resources (llms)",
80
+ "integration: marks tests as integration tests",
81
+ "simulated_endpoints: marks tests that use simulated external endpoints"
82
+ ]
83
+ # Other pytest options can go here too
84
+ testpaths = ["test", "integration_tests"]
85
+
75
86
  [dependency-groups]
76
87
  dev = [
77
- "anthropic>=0.42.0",
88
+ "anthropic>=0.49.0",
78
89
  "pre-commit>=4.0.1",
79
90
  "pydantic>=2.10.4",
80
91
  "pyyaml>=6.0.2",
@@ -89,6 +100,7 @@ fast-agent = "mcp_agent.cli.__main__:app"
89
100
  fast_agent = "mcp_agent.cli.__main__:app"
90
101
  fastagent = "mcp_agent.cli.__main__:app"
91
102
  silsila = "mcp_agent.cli.__main__:app"
103
+ prompt-server = "mcp_agent.mcp.prompts.__main__:main"
92
104
 
93
105
  [tool.setuptools.package-data]
94
106
  mcp_agent = [
@@ -320,18 +320,20 @@ class Agent(MCPAggregator):
320
320
  ],
321
321
  )
322
322
 
323
- async def apply_prompt(self, prompt_name: str, arguments: dict[str, str] = None) -> str:
323
+ async def apply_prompt(
324
+ self, prompt_name: str, arguments: dict[str, str] = None
325
+ ) -> str:
324
326
  """
325
327
  Apply an MCP Server Prompt by name and return the assistant's response.
326
328
  Will search all available servers for the prompt if not namespaced.
327
-
329
+
328
330
  If the last message in the prompt is from a user, this will automatically
329
331
  generate an assistant response to ensure we always end with an assistant message.
330
332
 
331
333
  Args:
332
334
  prompt_name: The name of the prompt to apply
333
335
  arguments: Optional dictionary of string arguments to pass to the prompt template
334
-
336
+
335
337
  Returns:
336
338
  The assistant's response or error message
337
339
  """
@@ -357,11 +359,3 @@ class Agent(MCPAggregator):
357
359
  # The LLM will automatically generate a response if needed
358
360
  result = await self._llm.apply_prompt_template(prompt_result, display_name)
359
361
  return result
360
-
361
- # For backward compatibility
362
- async def load_prompt(self, prompt_name: str, arguments: dict[str, str] = None) -> str:
363
- """
364
- Legacy method - use apply_prompt instead.
365
- This is maintained for backward compatibility.
366
- """
367
- return await self.apply_prompt(prompt_name, arguments)
@@ -2,9 +2,10 @@
2
2
  Main application wrapper for interacting with agents.
3
3
  """
4
4
 
5
- from typing import Optional, Dict, TYPE_CHECKING
5
+ from typing import Optional, Dict, Union, TYPE_CHECKING
6
6
 
7
7
  from mcp_agent.app import MCPApp
8
+ from mcp_agent.mcp.prompt_message_multipart import PromptMessageMultipart
8
9
  from mcp_agent.progress_display import progress_display
9
10
  from mcp_agent.workflows.orchestrator.orchestrator import Orchestrator
10
11
  from mcp_agent.workflows.parallel.parallel_llm import ParallelLLM
@@ -37,16 +38,80 @@ class AgentApp:
37
38
  # Optional: set default agent for direct calls
38
39
  self._default = next(iter(agents)) if agents else None
39
40
 
40
- async def send(self, agent_name: str, message: Optional[str]) -> str:
41
- """Core message sending"""
42
- if agent_name not in self._agents:
43
- raise ValueError(f"No agent named '{agent_name}'")
41
+ async def send_prompt(
42
+ self, prompt: PromptMessageMultipart, agent_name: Optional[str] = None
43
+ ) -> str:
44
+ """
45
+ Send a PromptMessageMultipart to an agent
46
+
47
+ Args:
48
+ prompt: The PromptMessageMultipart to send
49
+ agent_name: The name of the agent to send to (uses default if None)
50
+
51
+ Returns:
52
+ The agent's response as a string
53
+ """
54
+ target = agent_name or self._default
55
+ if not target:
56
+ raise ValueError("No default agent available")
57
+
58
+ if target not in self._agents:
59
+ raise ValueError(f"No agent named '{target}'")
60
+
61
+ proxy = self._agents[target]
62
+ return await proxy.send_prompt(prompt)
63
+
64
+ async def send(
65
+ self,
66
+ message: Union[str, PromptMessageMultipart] = None,
67
+ agent_name: Optional[str] = None,
68
+ ) -> str:
69
+ """
70
+ Send a message to the default agent or specified agent
71
+
72
+ Args:
73
+ message: Either a string message or a PromptMessageMultipart object
74
+ agent_name: The name of the agent to send to (uses default if None)
75
+
76
+ Returns:
77
+ The agent's response as a string
78
+ """
79
+ target = agent_name or self._default
80
+ if not target:
81
+ raise ValueError("No default agent available")
82
+
83
+ if target not in self._agents:
84
+ raise ValueError(f"No agent named '{target}'")
44
85
 
45
- if not message or "" == message:
46
- return await self.prompt(agent_name)
86
+ proxy = self._agents[target]
87
+ return await proxy.send(message)
88
+
89
+ async def apply_prompt(
90
+ self,
91
+ prompt_name: str,
92
+ arguments: Optional[dict[str, str]] = None,
93
+ agent_name: Optional[str] = None,
94
+ ) -> str:
95
+ """
96
+ Apply an MCP Server Prompt by name and return the assistant's response
47
97
 
48
- proxy = self._agents[agent_name]
49
- return await proxy.generate_str(message)
98
+ Args:
99
+ prompt_name: The name of the prompt to apply
100
+ arguments: Optional dictionary of string arguments to pass to the prompt template
101
+ agent_name: The name of the agent to use (uses default if None)
102
+
103
+ Returns:
104
+ The assistant's response as a string
105
+ """
106
+ target = agent_name or self._default
107
+ if not target:
108
+ raise ValueError("No default agent available")
109
+
110
+ if target not in self._agents:
111
+ raise ValueError(f"No agent named '{target}'")
112
+
113
+ proxy = self._agents[target]
114
+ return await proxy.apply_prompt(prompt_name, arguments)
50
115
 
51
116
  async def prompt(self, agent_name: Optional[str] = None, default: str = "") -> str:
52
117
  """
@@ -506,7 +571,7 @@ class AgentApp:
506
571
  if user_input == "":
507
572
  continue
508
573
 
509
- result = await self.send(agent, user_input)
574
+ result = await self.send(user_input, agent)
510
575
 
511
576
  # Check if current agent is a chain that should continue with final agent
512
577
  if agent_types.get(agent) == "Chain":
@@ -532,10 +597,21 @@ class AgentApp:
532
597
  return self._agents[name]
533
598
 
534
599
  async def __call__(
535
- self, message: Optional[str] = "", agent_name: Optional[str] = None
600
+ self,
601
+ message: Optional[Union[str, PromptMessageMultipart]] = None,
602
+ agent_name: Optional[str] = None,
536
603
  ) -> str:
537
- """Support: agent('message')"""
604
+ """
605
+ Support: agent('message') or agent(Prompt.user('message'))
606
+
607
+ Args:
608
+ message: Either a string message or a PromptMessageMultipart object
609
+ agent_name: The name of the agent to use (uses default if None)
610
+
611
+ Returns:
612
+ The agent's response as a string
613
+ """
538
614
  target = agent_name or self._default
539
615
  if not target:
540
616
  raise ValueError("No default agent available")
541
- return await self.send(target, message)
617
+ return await self.send(message, target)
@@ -70,7 +70,12 @@ class FastAgent(ContextDependent):
70
70
  Provides a simplified way to create and manage agents using decorators.
71
71
  """
72
72
 
73
- def __init__(self, name: str, config_path: Optional[str] = None):
73
+ def __init__(
74
+ self,
75
+ name: str,
76
+ config_path: Optional[str] = None,
77
+ ignore_unknown_args: bool = False,
78
+ ):
74
79
  """
75
80
  Initialize the decorator interface.
76
81
 
@@ -101,7 +106,12 @@ class FastAgent(ContextDependent):
101
106
  action="store_true",
102
107
  help="Disable progress display, tool and message logging for cleaner output",
103
108
  )
104
- self.args = parser.parse_args()
109
+
110
+ if ignore_unknown_args:
111
+ known_args, _ = parser.parse_known_args()
112
+ self.args = known_args
113
+ else:
114
+ self.args = parser.parse_args()
105
115
 
106
116
  # Quiet mode will be handled in _load_config()
107
117
 
@@ -372,7 +382,7 @@ class FastAgent(ContextDependent):
372
382
 
373
383
  # Create wrapper with all agents
374
384
  wrapper = AgentApp(agent_app, active_agents)
375
-
385
+
376
386
  # Store reference to AgentApp in MCPApp for proxies to access
377
387
  agent_app._agent_app = wrapper
378
388
 
@@ -0,0 +1,222 @@
1
+ """
2
+ Helper functions for creating MCP content types with minimal code.
3
+
4
+ This module provides simple functions to create TextContent, ImageContent,
5
+ EmbeddedResource, and other MCP content types with minimal boilerplate.
6
+ """
7
+
8
+ import base64
9
+ from pathlib import Path
10
+ from typing import Literal, Optional, Union, List, Any
11
+
12
+ from mcp.types import (
13
+ TextContent,
14
+ ImageContent,
15
+ EmbeddedResource,
16
+ TextResourceContents,
17
+ BlobResourceContents,
18
+ )
19
+
20
+ from mcp_agent.mcp.mime_utils import (
21
+ guess_mime_type,
22
+ is_binary_content,
23
+ is_image_mime_type,
24
+ )
25
+
26
+
27
+ def MCPText(
28
+ text: str,
29
+ role: Literal["user", "assistant"] = "user",
30
+ annotations: Optional[dict] = None,
31
+ ) -> dict:
32
+ """
33
+ Create a message with text content.
34
+
35
+ Args:
36
+ text: The text content
37
+ role: Role of the message, defaults to "user"
38
+ annotations: Optional annotations
39
+
40
+ Returns:
41
+ A dictionary with role and content that can be used in a prompt
42
+ """
43
+ return {
44
+ "role": role,
45
+ "content": TextContent(type="text", text=text, annotations=annotations),
46
+ }
47
+
48
+
49
+ def MCPImage(
50
+ path: Union[str, Path] = None,
51
+ data: bytes = None,
52
+ mime_type: Optional[str] = None,
53
+ role: Literal["user", "assistant"] = "user",
54
+ annotations: Optional[dict] = None,
55
+ ) -> dict:
56
+ """
57
+ Create a message with image content.
58
+
59
+ Args:
60
+ path: Path to the image file
61
+ data: Raw image data bytes (alternative to path)
62
+ mime_type: Optional mime type, will be guessed from path if not provided
63
+ role: Role of the message, defaults to "user"
64
+ annotations: Optional annotations
65
+
66
+ Returns:
67
+ A dictionary with role and content that can be used in a prompt
68
+ """
69
+ if path is None and data is None:
70
+ raise ValueError("Either path or data must be provided")
71
+
72
+ if path is not None and data is not None:
73
+ raise ValueError("Only one of path or data can be provided")
74
+
75
+ if path is not None:
76
+ path = Path(path)
77
+ if not mime_type:
78
+ mime_type = guess_mime_type(str(path))
79
+ with open(path, "rb") as f:
80
+ data = f.read()
81
+
82
+ if not mime_type:
83
+ mime_type = "image/png" # Default
84
+
85
+ b64_data = base64.b64encode(data).decode("ascii")
86
+
87
+ return {
88
+ "role": role,
89
+ "content": ImageContent(
90
+ type="image", data=b64_data, mimeType=mime_type, annotations=annotations
91
+ ),
92
+ }
93
+
94
+
95
+ def MCPFile(
96
+ path: Union[str, Path],
97
+ mime_type: Optional[str] = None,
98
+ role: Literal["user", "assistant"] = "user",
99
+ annotations: Optional[dict] = None,
100
+ ) -> dict:
101
+ """
102
+ Create a message with an embedded resource from a file.
103
+
104
+ Args:
105
+ path: Path to the resource file
106
+ mime_type: Optional mime type, will be guessed from path if not provided
107
+ role: Role of the message, defaults to "user"
108
+ annotations: Optional annotations
109
+
110
+ Returns:
111
+ A dictionary with role and content that can be used in a prompt
112
+ """
113
+ path = Path(path)
114
+ uri = f"file://{path.absolute()}"
115
+
116
+ if not mime_type:
117
+ mime_type = guess_mime_type(str(path))
118
+
119
+ # Determine if this is text or binary content
120
+ is_binary = is_binary_content(mime_type)
121
+
122
+ if is_binary:
123
+ # Read as binary
124
+ binary_data = path.read_bytes()
125
+ b64_data = base64.b64encode(binary_data).decode("ascii")
126
+
127
+ resource = BlobResourceContents(uri=uri, blob=b64_data, mimeType=mime_type)
128
+ else:
129
+ # Read as text
130
+ try:
131
+ text_data = path.read_text(encoding="utf-8")
132
+ resource = TextResourceContents(uri=uri, text=text_data, mimeType=mime_type)
133
+ except UnicodeDecodeError:
134
+ # Fallback to binary if text read fails
135
+ binary_data = path.read_bytes()
136
+ b64_data = base64.b64encode(binary_data).decode("ascii")
137
+ resource = BlobResourceContents(
138
+ uri=uri, blob=b64_data, mimeType=mime_type or "application/octet-stream"
139
+ )
140
+
141
+ return {
142
+ "role": role,
143
+ "content": EmbeddedResource(
144
+ type="resource", resource=resource, annotations=annotations
145
+ ),
146
+ }
147
+
148
+
149
+
150
+ def MCPPrompt(
151
+ *content_items, role: Literal["user", "assistant"] = "user"
152
+ ) -> List[dict]:
153
+ """
154
+ Create one or more prompt messages with various content types.
155
+
156
+ This function intelligently creates different content types:
157
+ - Strings become TextContent
158
+ - File paths with image mime types become ImageContent
159
+ - File paths with text mime types or other mime types become EmbeddedResource
160
+ - Dicts with role and content are passed through unchanged
161
+ - Raw bytes become ImageContent
162
+
163
+ Args:
164
+ *content_items: Content items of various types
165
+ role: Role for all items (user or assistant)
166
+
167
+ Returns:
168
+ List of messages that can be used in a prompt
169
+ """
170
+ result = []
171
+
172
+ for item in content_items:
173
+ if isinstance(item, dict) and "role" in item and "content" in item:
174
+ # Already a fully formed message
175
+ result.append(item)
176
+ elif isinstance(item, str) and not Path(item).exists():
177
+ # Simple text content (that's not a file path)
178
+ result.append(MCPText(item, role=role))
179
+ elif isinstance(item, Path) or isinstance(item, str):
180
+ # File path - determine the content type based on mime type
181
+ path_str = str(item)
182
+ mime_type = guess_mime_type(path_str)
183
+
184
+ if is_image_mime_type(mime_type):
185
+ # Image files (except SVG which is handled as text)
186
+ result.append(MCPImage(path=item, role=role))
187
+ else:
188
+ # All other file types (text documents, PDFs, SVGs, etc.)
189
+ result.append(MCPFile(path=item, role=role))
190
+ elif isinstance(item, bytes):
191
+ # Raw binary data, assume image
192
+ result.append(MCPImage(data=item, role=role))
193
+ else:
194
+ # Try to convert to string
195
+ result.append(MCPText(str(item), role=role))
196
+
197
+ return result
198
+
199
+
200
+ def User(*content_items) -> List[dict]:
201
+ """Create user message(s) with various content types."""
202
+ return MCPPrompt(*content_items, role="user")
203
+
204
+
205
+ def Assistant(*content_items) -> List[dict]:
206
+ """Create assistant message(s) with various content types."""
207
+ return MCPPrompt(*content_items, role="assistant")
208
+
209
+
210
+ def create_message(content: Any, role: Literal["user", "assistant"] = "user") -> dict:
211
+ """
212
+ Create a single prompt message from content of various types.
213
+
214
+ Args:
215
+ content: Content of various types (str, Path, bytes, etc.)
216
+ role: Role of the message
217
+
218
+ Returns:
219
+ A dictionary with role and content that can be used in a prompt
220
+ """
221
+ messages = MCPPrompt(content, role=role)
222
+ return messages[0] if messages else {}