fast-agent-mcp 0.3.9__tar.gz → 0.3.10__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 (298) hide show
  1. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/mcp_aggregator.py +32 -28
  4. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/transport_tracking.py +3 -1
  5. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/elicitation_style.py +7 -7
  6. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/mcp_display.py +160 -88
  7. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/.gitignore +0 -0
  8. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/LICENSE +0 -0
  9. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/README.md +0 -0
  10. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/a2a/agent_executor.py +0 -0
  11. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/a2a/server.py +0 -0
  12. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/azure-openai/fastagent.config.yaml +0 -0
  13. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/bedrock/fast-agent.config.yaml +0 -0
  14. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/custom-agents/agent.py +0 -0
  15. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/custom-agents/fastagent.config.yaml +0 -0
  16. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/data-analysis/analysis-campaign.py +0 -0
  17. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/data-analysis/analysis.py +0 -0
  18. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/data-analysis/fastagent.config.yaml +0 -0
  19. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  20. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/fastapi/fastapi-advanced.py +0 -0
  21. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/fastapi/fastapi-simple.py +0 -0
  22. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/fastapi/pyproject.toml +0 -0
  23. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/fastapi/readme.md +0 -0
  24. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  25. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  26. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  27. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  28. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  29. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/forms_demo.py +0 -0
  30. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/game_character.py +0 -0
  31. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/game_character_handler.py +0 -0
  32. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/elicitations/tool_call.py +0 -0
  33. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  34. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  35. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  36. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  37. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/state-transfer/agent_one.py +0 -0
  38. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/state-transfer/agent_two.py +0 -0
  39. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  40. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  41. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/vision-examples/cat.png +0 -0
  42. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/vision-examples/example1.py +0 -0
  43. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/vision-examples/example2.py +0 -0
  44. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/vision-examples/example3.py +0 -0
  45. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  46. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/new-api/display_check.py +0 -0
  47. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/new-api/simple_llm.py +0 -0
  48. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/new-api/simple_llm_advanced.py +0 -0
  49. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/new-api/simple_mcp.py +0 -0
  50. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/agent.py +0 -0
  51. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/openapi_mcp_server.py +0 -0
  53. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/petstore.yaml +0 -0
  54. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/pyproject.toml +0 -0
  55. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/openapi/run-as-server.sh +0 -0
  56. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/otel/agent.py +0 -0
  57. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/otel/agent2.py +0 -0
  58. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/otel/docker-compose.yaml +0 -0
  59. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/otel/fastagent.config.yaml +0 -0
  60. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/researcher/fastagent.config.yaml +0 -0
  61. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/researcher/researcher-eval.py +0 -0
  62. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/researcher/researcher-imp.py +0 -0
  63. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/researcher/researcher.py +0 -0
  64. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/setup/.gitignore +0 -0
  65. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/setup/agent.py +0 -0
  66. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/setup/fastagent.config.yaml +0 -0
  67. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/setup/fastagent.secrets.yaml.example +0 -0
  68. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/setup/pyproject.toml.tmpl +0 -0
  69. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/.env.sample +0 -0
  70. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/Makefile +0 -0
  71. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/README.md +0 -0
  72. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/agent.py +0 -0
  73. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/demo_images/clam.jpg +0 -0
  74. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/demo_images/crab.png +0 -0
  75. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/demo_images/shrimp.png +0 -0
  76. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/docker-compose.yml +0 -0
  77. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/fastagent.config.yaml +0 -0
  78. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/image_demo.py +0 -0
  79. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  80. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  81. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  82. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  83. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/simple_agent.py +0 -0
  84. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  85. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  86. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  87. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/chaining.py +0 -0
  88. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/evaluator.py +0 -0
  89. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/fastagent.config.yaml +0 -0
  90. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/graded_report.md +0 -0
  91. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/human_input.py +0 -0
  92. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/orchestrator.py +0 -0
  93. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/parallel.py +0 -0
  94. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/router.py +0 -0
  95. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/short_story.md +0 -0
  96. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/examples/workflows/short_story.txt +0 -0
  97. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/hatch_build.py +0 -0
  98. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/__init__.py +0 -0
  99. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/__init__.py +0 -0
  100. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/agent_types.py +0 -0
  101. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/llm_agent.py +0 -0
  102. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/llm_decorator.py +0 -0
  103. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/mcp_agent.py +0 -0
  104. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/tool_agent.py +0 -0
  105. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  106. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  107. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  108. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  109. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  110. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  111. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  112. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/__init__.py +0 -0
  113. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/__main__.py +0 -0
  114. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/auth.py +0 -0
  115. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/check_config.py +0 -0
  116. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/go.py +0 -0
  117. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/quickstart.py +0 -0
  118. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  119. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/setup.py +0 -0
  120. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/commands/url_parser.py +0 -0
  121. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/constants.py +0 -0
  122. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/main.py +0 -0
  123. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/cli/terminal.py +0 -0
  124. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/config.py +0 -0
  125. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/constants.py +0 -0
  126. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/context.py +0 -0
  127. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/context_dependent.py +0 -0
  128. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/__init__.py +0 -0
  129. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/agent_app.py +0 -0
  130. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/core_app.py +0 -0
  131. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/direct_decorators.py +0 -0
  132. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/direct_factory.py +0 -0
  133. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/error_handling.py +0 -0
  134. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/exceptions.py +0 -0
  135. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/executor/__init__.py +0 -0
  136. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/executor/executor.py +0 -0
  137. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/executor/task_registry.py +0 -0
  138. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  139. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/fastagent.py +0 -0
  140. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/__init__.py +0 -0
  141. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/events.py +0 -0
  142. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/json_serializer.py +0 -0
  143. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/listeners.py +0 -0
  144. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/logger.py +0 -0
  145. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/logging/transport.py +0 -0
  146. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/prompt.py +0 -0
  147. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/core/validation.py +0 -0
  148. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/event_progress.py +0 -0
  149. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/history/history_exporter.py +0 -0
  150. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/__init__.py +0 -0
  151. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  152. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/elicitation_state.py +0 -0
  153. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/form_fields.py +0 -0
  154. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/simple_form.py +0 -0
  155. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/human_input/types.py +0 -0
  156. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/interfaces.py +0 -0
  157. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/__init__.py +0 -0
  158. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/fastagent_llm.py +0 -0
  159. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/internal/passthrough.py +0 -0
  160. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/internal/playback.py +0 -0
  161. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/internal/silent.py +0 -0
  162. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/internal/slow.py +0 -0
  163. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/memory.py +0 -0
  164. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/model_database.py +0 -0
  165. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/model_factory.py +0 -0
  166. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/model_info.py +0 -0
  167. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/prompt_utils.py +0 -0
  168. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  169. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  170. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  171. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  172. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  173. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  174. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
  175. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  176. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  177. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  178. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  179. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  180. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  181. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
  182. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  183. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  184. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  185. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  186. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  187. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  188. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider_key_manager.py +0 -0
  189. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/provider_types.py +0 -0
  190. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/request_params.py +0 -0
  191. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/sampling_converter.py +0 -0
  192. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/llm/usage_tracking.py +0 -0
  193. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/__init__.py +0 -0
  194. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/common.py +0 -0
  195. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  196. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  197. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/gen_client.py +0 -0
  198. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  199. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  200. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  201. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/hf_auth.py +0 -0
  202. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/interfaces.py +0 -0
  203. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/logger_textio.py +0 -0
  204. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  205. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
  206. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/mcp_content.py +0 -0
  207. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/mime_utils.py +0 -0
  208. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/oauth_client.py +0 -0
  209. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompt.py +0 -0
  210. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  211. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompt_render.py +0 -0
  212. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  213. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  214. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  215. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  216. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  217. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  218. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  219. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  220. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/resource_utils.py +0 -0
  221. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/sampling.py +0 -0
  222. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/server/__init__.py +0 -0
  223. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/server/agent_server.py +0 -0
  224. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  225. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  226. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/ui_agent.py +0 -0
  227. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp/ui_mixin.py +0 -0
  228. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/mcp_server_registry.py +0 -0
  229. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/py.typed +0 -0
  230. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  231. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  232. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  233. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  234. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  235. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  236. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  237. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  238. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  239. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  240. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  241. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  242. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  243. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  244. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  245. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  246. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  247. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  248. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  249. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  250. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  251. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  252. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  253. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  254. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  255. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  256. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  257. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  258. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  259. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  260. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  261. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  262. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  263. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  264. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  265. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  266. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  267. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  268. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  269. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  270. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  271. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  272. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  273. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  274. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  275. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  276. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  277. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  278. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  279. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  280. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/setup/.gitignore +0 -0
  281. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/setup/agent.py +0 -0
  282. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
  283. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  284. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  285. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/tools/elicitation.py +0 -0
  286. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/types/__init__.py +0 -0
  287. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/types/llm_stop_reason.py +0 -0
  288. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/__init__.py +0 -0
  289. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/console.py +0 -0
  290. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/console_display.py +0 -0
  291. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/elicitation_form.py +0 -0
  292. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/enhanced_prompt.py +0 -0
  293. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/interactive_prompt.py +0 -0
  294. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  295. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/mermaid_utils.py +0 -0
  296. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/progress_display.py +0 -0
  297. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/src/fast_agent/ui/rich_progress.py +0 -0
  298. {fast_agent_mcp-0.3.9 → fast_agent_mcp-0.3.10}/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.9
3
+ Version: 0.3.10
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.9"
3
+ version = "0.3.10"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -334,6 +334,9 @@ class MCPAggregator(ContextDependent):
334
334
  server_name, client_session_factory=self._create_session_factory(server_name)
335
335
  )
336
336
 
337
+ # Record the initialize call that happened during connection setup
338
+ await self._record_server_call(server_name, "initialize", True)
339
+
337
340
  logger.info(
338
341
  f"MCP Servers initialized for agent '{self.agent_name}'",
339
342
  data={
@@ -342,27 +345,39 @@ class MCPAggregator(ContextDependent):
342
345
  },
343
346
  )
344
347
 
345
- async def fetch_tools(client: ClientSession, server_name: str) -> List[Tool]:
348
+ async def fetch_tools(server_name: str) -> List[Tool]:
346
349
  # Only fetch tools if the server supports them
347
350
  if not await self.server_supports_feature(server_name, "tools"):
348
351
  logger.debug(f"Server '{server_name}' does not support tools")
349
352
  return []
350
353
 
351
354
  try:
352
- result: ListToolsResult = await client.list_tools()
355
+ result: ListToolsResult = await self._execute_on_server(
356
+ server_name=server_name,
357
+ operation_type="tools/list",
358
+ operation_name="",
359
+ method_name="list_tools",
360
+ method_args={},
361
+ )
353
362
  return result.tools or []
354
363
  except Exception as e:
355
364
  logger.error(f"Error loading tools from server '{server_name}'", data=e)
356
365
  return []
357
366
 
358
- async def fetch_prompts(client: ClientSession, server_name: str) -> List[Prompt]:
367
+ async def fetch_prompts(server_name: str) -> List[Prompt]:
359
368
  # Only fetch prompts if the server supports them
360
369
  if not await self.server_supports_feature(server_name, "prompts"):
361
370
  logger.debug(f"Server '{server_name}' does not support prompts")
362
371
  return []
363
372
 
364
373
  try:
365
- result = await client.list_prompts()
374
+ result = await self._execute_on_server(
375
+ server_name=server_name,
376
+ operation_type="prompts/list",
377
+ operation_name="",
378
+ method_name="list_prompts",
379
+ method_args={},
380
+ )
366
381
  return getattr(result, "prompts", [])
367
382
  except Exception as e:
368
383
  logger.debug(f"Error loading prompts from server '{server_name}': {e}")
@@ -372,20 +387,9 @@ class MCPAggregator(ContextDependent):
372
387
  tools: List[Tool] = []
373
388
  prompts: List[Prompt] = []
374
389
 
375
- if self.connection_persistence:
376
- server_connection = await self._persistent_connection_manager.get_server(
377
- server_name, client_session_factory=self._create_session_factory(server_name)
378
- )
379
- tools = await fetch_tools(server_connection.session, server_name)
380
- prompts = await fetch_prompts(server_connection.session, server_name)
381
- else:
382
- async with gen_client(
383
- server_name,
384
- server_registry=self.context.server_registry,
385
- client_session_factory=self._create_session_factory(server_name),
386
- ) as client:
387
- tools = await fetch_tools(client, server_name)
388
- prompts = await fetch_prompts(client, server_name)
390
+ # Use _execute_on_server for consistent tracking regardless of connection mode
391
+ tools = await fetch_tools(server_name)
392
+ prompts = await fetch_prompts(server_name)
389
393
 
390
394
  return server_name, tools, prompts
391
395
 
@@ -978,7 +982,7 @@ class MCPAggregator(ContextDependent):
978
982
 
979
983
  return await self._execute_on_server(
980
984
  server_name=server_name,
981
- operation_type="tool",
985
+ operation_type="tools/call",
982
986
  operation_name=local_tool_name,
983
987
  method_name="call_tool",
984
988
  method_args={
@@ -1071,7 +1075,7 @@ class MCPAggregator(ContextDependent):
1071
1075
 
1072
1076
  result = await self._execute_on_server(
1073
1077
  server_name=server_name,
1074
- operation_type="prompt",
1078
+ operation_type="prompts/get",
1075
1079
  operation_name=local_prompt_name or "default",
1076
1080
  method_name="get_prompt",
1077
1081
  method_args=method_args,
@@ -1119,7 +1123,7 @@ class MCPAggregator(ContextDependent):
1119
1123
 
1120
1124
  result = await self._execute_on_server(
1121
1125
  server_name=s_name,
1122
- operation_type="prompt",
1126
+ operation_type="prompts/get",
1123
1127
  operation_name=local_prompt_name,
1124
1128
  method_name="get_prompt",
1125
1129
  method_args=method_args,
@@ -1167,7 +1171,7 @@ class MCPAggregator(ContextDependent):
1167
1171
 
1168
1172
  result = await self._execute_on_server(
1169
1173
  server_name=s_name,
1170
- operation_type="prompt",
1174
+ operation_type="prompts/get",
1171
1175
  operation_name=local_prompt_name,
1172
1176
  method_name="get_prompt",
1173
1177
  method_args=method_args,
@@ -1190,7 +1194,7 @@ class MCPAggregator(ContextDependent):
1190
1194
  try:
1191
1195
  prompt_list_result = await self._execute_on_server(
1192
1196
  server_name=s_name,
1193
- operation_type="prompts-list",
1197
+ operation_type="prompts/list",
1194
1198
  operation_name="",
1195
1199
  method_name="list_prompts",
1196
1200
  error_factory=lambda _: None,
@@ -1264,7 +1268,7 @@ class MCPAggregator(ContextDependent):
1264
1268
  # Fetch from server
1265
1269
  result = await self._execute_on_server(
1266
1270
  server_name=server_name,
1267
- operation_type="prompts-list",
1271
+ operation_type="prompts/list",
1268
1272
  operation_name="",
1269
1273
  method_name="list_prompts",
1270
1274
  error_factory=lambda _: None,
@@ -1303,7 +1307,7 @@ class MCPAggregator(ContextDependent):
1303
1307
  try:
1304
1308
  result = await self._execute_on_server(
1305
1309
  server_name=s_name,
1306
- operation_type="prompts-list",
1310
+ operation_type="prompts/list",
1307
1311
  operation_name="",
1308
1312
  method_name="list_prompts",
1309
1313
  error_factory=lambda _: None,
@@ -1489,7 +1493,7 @@ class MCPAggregator(ContextDependent):
1489
1493
  # Use the _execute_on_server method to call read_resource on the server
1490
1494
  result = await self._execute_on_server(
1491
1495
  server_name=server_name,
1492
- operation_type="resource",
1496
+ operation_type="resources/read",
1493
1497
  operation_name=resource_uri,
1494
1498
  method_name="read_resource",
1495
1499
  method_args={"uri": uri},
@@ -1540,7 +1544,7 @@ class MCPAggregator(ContextDependent):
1540
1544
  # Use the _execute_on_server method to call list_resources on the server
1541
1545
  result = await self._execute_on_server(
1542
1546
  server_name=s_name,
1543
- operation_type="resources-list",
1547
+ operation_type="resources/list",
1544
1548
  operation_name="",
1545
1549
  method_name="list_resources",
1546
1550
  method_args={}, # Empty dictionary instead of None
@@ -1593,7 +1597,7 @@ class MCPAggregator(ContextDependent):
1593
1597
  # Use the _execute_on_server method to call list_tools on the server
1594
1598
  result = await self._execute_on_server(
1595
1599
  server_name=s_name,
1596
- operation_type="tools-list",
1600
+ operation_type="tools/list",
1597
1601
  operation_name="",
1598
1602
  method_name="list_tools",
1599
1603
  method_args={},
@@ -243,7 +243,9 @@ class TransportChannelMetrics:
243
243
  self._get_last_error = event.detail
244
244
  self._get_last_event = "error"
245
245
  self._get_last_event_at = now
246
- self._record_history("get", "error", now)
246
+ # Record 405 as "disabled" in timeline, not "error"
247
+ timeline_state = "disabled" if event.status_code == 405 else "error"
248
+ self._record_history("get", timeline_state, now)
247
249
 
248
250
  def _handle_resumption_event(self, event: ChannelEvent, now: datetime) -> None:
249
251
  if event.event_type == "message" and event.message is not None:
@@ -7,16 +7,16 @@ ELICITATION_STYLE = Style.from_dict(
7
7
  {
8
8
  # Dialog structure - use ansidefault for true black, remove problematic shadow
9
9
  "dialog": "bg:ansidefault", # True black dialog using ansidefault
10
- "dialog.body": "bg:ansidefault fg:ansiwhite", # True black dialog body
10
+ "dialog.body": "bg:ansidefault fg:ansidefault", # True black dialog body with default text color
11
11
  "dialog shadow": "bg:ansidefault", # Set shadow background to match application
12
12
  "dialog.border": "bg:ansidefault", # True black border background
13
13
  # Set application background to true black
14
14
  "application": "bg:ansidefault", # True black application background
15
15
  # Title styling with better contrast
16
- "title": "fg:ansibrightmagenta bold", # Bright magenta text
16
+ "title": "fg:ansidefault bold", # Default color title for terminal compatibility
17
17
  # Buttons - only define focused state to preserve focus highlighting
18
18
  "button.focused": "bg:ansibrightgreen fg:ansiblack bold", # Bright green with black text for contrast
19
- "button.arrow": "fg:ansiwhite bold", # White arrows for visibility
19
+ "button.arrow": "fg:ansidefault bold", # Default color arrows for terminal compatibility
20
20
  # Form elements with consistent green/yellow theme
21
21
  # Checkboxes - green when checked, yellow when focused
22
22
  "checkbox": "fg:ansidefault", # Default color unchecked checkbox (dimmer)
@@ -34,15 +34,15 @@ ELICITATION_STYLE = Style.from_dict(
34
34
  # Frame styling with ANSI colors - make borders visible
35
35
  "frame.border": "fg:ansibrightblack", # Bright black borders for subtlety
36
36
  "frame.label": "fg:ansigray", # Gray frame labels (less prominent)
37
- # Labels and text - use white for good visibility
38
- "label": "fg:ansiwhite", # White labels for good readability
37
+ # Labels and text - use default color for terminal compatibility
38
+ "label": "fg:ansidefault", # Default color labels for terminal compatibility
39
39
  "message": "fg:ansibrightcyan", # Bright cyan messages (no bold)
40
40
  # Agent and server names - make them match
41
41
  "agent-name": "fg:ansibrightblue bold",
42
42
  "server-name": "fg:ansibrightblue bold", # Same color as agent
43
43
  # Validation errors - better contrast
44
- "validation-toolbar": "bg:ansibrightred fg:ansiwhite bold",
45
- "validation-toolbar.text": "bg:ansibrightred fg:ansiwhite",
44
+ "validation-toolbar": "bg:ansibrightred fg:ansidefault bold",
45
+ "validation-toolbar.text": "bg:ansibrightred fg:ansidefault",
46
46
  "validation.border": "fg:ansibrightred",
47
47
  "validation-error": "fg:ansibrightred bold", # For status line errors
48
48
  # Separator styling
@@ -14,6 +14,67 @@ if TYPE_CHECKING:
14
14
  from fast_agent.mcp.transport_tracking import ChannelSnapshot
15
15
 
16
16
 
17
+ # Centralized color configuration
18
+ class Colours:
19
+ """Color constants for MCP status display elements."""
20
+
21
+ # Timeline activity colors (Option A: Mixed Intensity)
22
+ ERROR = "bright_red" # Keep error bright
23
+ DISABLED = "bright_blue" # Keep disabled bright
24
+ RESPONSE = "blue" # Normal blue instead of bright
25
+ REQUEST = "yellow" # Normal yellow instead of bright
26
+ NOTIFICATION = "cyan" # Normal cyan instead of bright
27
+ PING = "dim green" # Keep ping dim
28
+ IDLE = "white dim"
29
+ NONE = "dim"
30
+
31
+ # Channel arrow states
32
+ ARROW_ERROR = "bright_red"
33
+ ARROW_DISABLED = "bright_yellow" # For explicitly disabled/off
34
+ ARROW_METHOD_NOT_ALLOWED = "cyan" # For 405 method not allowed (notification color)
35
+ ARROW_OFF = "black dim"
36
+ ARROW_IDLE = "bright_cyan" # Connected but no activity
37
+ ARROW_ACTIVE = "bright_green" # Connected with activity
38
+
39
+ # Capability token states
40
+ TOKEN_ERROR = "bright_red"
41
+ TOKEN_WARNING = "bright_cyan"
42
+ TOKEN_DISABLED = "dim"
43
+ TOKEN_HIGHLIGHTED = "bright_yellow"
44
+ TOKEN_ENABLED = "bright_green"
45
+
46
+ # Text elements
47
+ TEXT_DIM = "dim"
48
+ TEXT_DEFAULT = "default" # Use terminal's default text color
49
+ TEXT_BRIGHT = "bright_white"
50
+ TEXT_ERROR = "bright_red"
51
+ TEXT_WARNING = "bright_yellow"
52
+ TEXT_SUCCESS = "bright_green"
53
+ TEXT_INFO = "bright_blue"
54
+ TEXT_CYAN = "cyan"
55
+
56
+
57
+ # Color mappings for different contexts
58
+ TIMELINE_COLORS = {
59
+ "error": Colours.ERROR,
60
+ "disabled": Colours.DISABLED,
61
+ "response": Colours.RESPONSE,
62
+ "request": Colours.REQUEST,
63
+ "notification": Colours.NOTIFICATION,
64
+ "ping": Colours.PING,
65
+ "none": Colours.IDLE,
66
+ }
67
+
68
+ TIMELINE_COLORS_STDIO = {
69
+ "error": Colours.ERROR,
70
+ "request": Colours.TOKEN_ENABLED, # All activity shows as bright green
71
+ "response": Colours.TOKEN_ENABLED,
72
+ "notification": Colours.TOKEN_ENABLED,
73
+ "ping": Colours.PING,
74
+ "none": Colours.IDLE,
75
+ }
76
+
77
+
17
78
  def _format_compact_duration(seconds: float | None) -> str | None:
18
79
  if seconds is None:
19
80
  return None
@@ -58,7 +119,7 @@ def _format_session_id(session_id: str | None) -> Text:
58
119
 
59
120
 
60
121
  def _build_aligned_field(
61
- label: str, value: Text | str, *, label_width: int = 9, value_style: str = "white"
122
+ label: str, value: Text | str, *, label_width: int = 9, value_style: str = Colours.TEXT_DEFAULT
62
123
  ) -> Text:
63
124
  field = Text()
64
125
  field.append(f"{label:<{label_width}}: ", style="dim")
@@ -153,14 +214,14 @@ def _format_capability_shorthand(
153
214
 
154
215
  def token_style(supported, highlighted) -> str:
155
216
  if supported == "red":
156
- return "bright_red"
217
+ return Colours.TOKEN_ERROR
157
218
  if supported == "blue":
158
- return "bright_cyan"
219
+ return Colours.TOKEN_WARNING
159
220
  if not supported:
160
- return "dim"
221
+ return Colours.TOKEN_DISABLED
161
222
  if highlighted:
162
- return "bright_yellow"
163
- return "bright_green"
223
+ return Colours.TOKEN_HIGHLIGHTED
224
+ return Colours.TOKEN_ENABLED
164
225
 
165
226
  tokens = [
166
227
  (label, token_style(supported, highlighted)) for label, supported, highlighted in entries
@@ -198,19 +259,16 @@ def _format_label(label: str, width: int = 10) -> str:
198
259
 
199
260
  def _build_inline_timeline(buckets: Iterable[str]) -> str:
200
261
  """Build a compact timeline string for inline display."""
201
- color_map = {
202
- "error": "bright_red",
203
- "disabled": "bright_blue",
204
- "response": "bright_blue",
205
- "request": "bright_yellow",
206
- "notification": "bright_cyan",
207
- "ping": "bright_green",
208
- "none": "dim",
209
- }
210
262
  timeline = " [dim]10m[/dim] "
211
263
  for state in buckets:
212
- color = color_map.get(state, "dim")
213
- timeline += f"[bold {color}]●[/bold {color}]"
264
+ color = TIMELINE_COLORS.get(state, Colours.NONE)
265
+ if state in {"idle", "none"}:
266
+ symbol = "·"
267
+ elif state == "request":
268
+ symbol = "◆" # Diamond for requests - rare and important
269
+ else:
270
+ symbol = "●" # Circle for other activity
271
+ timeline += f"[bold {color}]{symbol}[/bold {color}]"
214
272
  timeline += " [dim]now[/dim]"
215
273
  return timeline
216
274
 
@@ -298,45 +356,25 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
298
356
  # Collect any errors to show at bottom
299
357
  errors = []
300
358
 
301
- # Build timeline color map
302
- if is_stdio:
303
- # Simplified color map for stdio: bright green for activity, dim for idle
304
- timeline_color_map = {
305
- "error": "bright_red", # Keep error as red
306
- "request": "bright_green", # All activity shows as bright green
307
- "response": "bright_green", # (not used in stdio but just in case)
308
- "notification": "bright_green", # (not used in stdio but just in case)
309
- "ping": "bright_green", # (not used in stdio but just in case)
310
- "none": "white dim",
311
- }
312
- else:
313
- # Full color map for HTTP channels
314
- timeline_color_map = {
315
- "error": "bright_red",
316
- "disabled": "bright_blue",
317
- "response": "bright_blue",
318
- "request": "bright_yellow",
319
- "notification": "bright_cyan",
320
- "ping": "bright_green",
321
- "none": "white dim",
322
- }
359
+ # Get appropriate timeline color map
360
+ timeline_color_map = TIMELINE_COLORS_STDIO if is_stdio else TIMELINE_COLORS
323
361
 
324
362
  for label, arrow, channel in entries:
325
363
  line = Text(indent)
326
364
  line.append("│ ", style="dim")
327
365
 
328
366
  # Determine arrow color based on state
329
- arrow_style = "black dim" # default no channel
367
+ arrow_style = Colours.ARROW_OFF # default no channel
330
368
  if channel:
331
369
  state = (channel.state or "open").lower()
332
370
 
333
- # Check for 405 status code (method not allowed = disabled endpoint)
371
+ # Check for 405 status code (method not allowed = not an error, just unsupported)
334
372
  if channel.last_status_code == 405:
335
- arrow_style = "bright_yellow"
336
- # Don't add 405 to errors list - it's just disabled, not an error
373
+ arrow_style = Colours.ARROW_METHOD_NOT_ALLOWED
374
+ # Don't add 405 to errors list - it's not an error, just method not supported
337
375
  # Error state (non-405 errors)
338
376
  elif state == "error":
339
- arrow_style = "bright_red"
377
+ arrow_style = Colours.ARROW_ERROR
340
378
  if channel.last_error and channel.last_status_code != 405:
341
379
  error_msg = channel.last_error
342
380
  if channel.last_status_code:
@@ -347,20 +385,27 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
347
385
  errors.append((label.split()[0], error_msg))
348
386
  # Explicitly disabled or off
349
387
  elif state in {"off", "disabled"}:
350
- arrow_style = "black dim"
388
+ arrow_style = Colours.ARROW_OFF
351
389
  # No activity (idle)
352
390
  elif channel.request_count == 0 and channel.response_count == 0:
353
- arrow_style = "bright_cyan"
391
+ arrow_style = Colours.ARROW_IDLE
354
392
  # Active/connected with activity
355
393
  elif state in {"open", "connected"}:
356
- arrow_style = "bright_green"
394
+ arrow_style = Colours.ARROW_ACTIVE
357
395
  # Fallback for other states
358
396
  else:
359
- arrow_style = "bright_cyan"
397
+ arrow_style = Colours.ARROW_IDLE
360
398
 
361
399
  # Arrow and label with better spacing
362
- line.append(arrow, style=arrow_style)
363
- line.append(f" {label:<13}", style="bright_white")
400
+ # Use hollow arrow for 405 Method Not Allowed
401
+ if channel and channel.last_status_code == 405:
402
+ # Convert solid arrows to hollow for 405
403
+ hollow_arrows = {"◀": "◁", "▶": "▷", "⇄": "⇄"} # bidirectional stays same
404
+ display_arrow = hollow_arrows.get(arrow, arrow)
405
+ else:
406
+ display_arrow = arrow
407
+ line.append(display_arrow, style=arrow_style)
408
+ line.append(f" {label:<13}", style=Colours.TEXT_DEFAULT)
364
409
 
365
410
  # Always show timeline (dim black dots if no data)
366
411
  line.append("10m ", style="dim")
@@ -368,11 +413,17 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
368
413
  # Show actual activity
369
414
  for bucket_state in channel.activity_buckets:
370
415
  color = timeline_color_map.get(bucket_state, "dim")
371
- line.append("", style=f"bold {color}")
416
+ if bucket_state in {"idle", "none"}:
417
+ symbol = "·"
418
+ elif bucket_state == "request":
419
+ symbol = "◆" # Diamond for requests - rare and important
420
+ else:
421
+ symbol = "●" # Circle for other activity
422
+ line.append(symbol, style=f"bold {color}")
372
423
  else:
373
- # Show dim black dots for no activity
424
+ # Show dim dots for no activity
374
425
  for _ in range(20):
375
- line.append("", style="black dim")
426
+ line.append("·", style="black dim")
376
427
  line.append(" now", style="dim")
377
428
 
378
429
  # Metrics - different layouts for stdio vs HTTP
@@ -380,26 +431,41 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
380
431
  # Simplified activity column for stdio
381
432
  if channel and channel.message_count > 0:
382
433
  activity = str(channel.message_count).rjust(8)
383
- activity_style = "bright_white"
434
+ activity_style = Colours.TEXT_DEFAULT
384
435
  else:
385
436
  activity = "-".rjust(8)
386
- activity_style = "dim"
437
+ activity_style = Colours.TEXT_DIM
387
438
  line.append(f" {activity}", style=activity_style)
388
439
  else:
389
440
  # Original HTTP columns
390
441
  if channel:
391
- req = str(channel.request_count).rjust(5)
392
- resp = str(channel.response_count).rjust(5)
393
- notif = str(channel.notification_count).rjust(5)
394
- ping = str(channel.ping_count if channel.ping_count else "-").rjust(5)
442
+ # Show "-" for shut/disabled channels (405, off, disabled states)
443
+ channel_state = (channel.state or "open").lower()
444
+ is_shut = (
445
+ channel.last_status_code == 405 or
446
+ channel_state in {"off", "disabled"} or
447
+ (channel_state == "error" and channel.last_status_code == 405)
448
+ )
449
+
450
+ if is_shut:
451
+ req = "-".rjust(5)
452
+ resp = "-".rjust(5)
453
+ notif = "-".rjust(5)
454
+ ping = "-".rjust(5)
455
+ metrics_style = Colours.TEXT_DIM
456
+ else:
457
+ req = str(channel.request_count).rjust(5)
458
+ resp = str(channel.response_count).rjust(5)
459
+ notif = str(channel.notification_count).rjust(5)
460
+ ping = str(channel.ping_count if channel.ping_count else "-").rjust(5)
461
+ metrics_style = Colours.TEXT_DEFAULT
395
462
  else:
396
463
  req = "-".rjust(5)
397
464
  resp = "-".rjust(5)
398
465
  notif = "-".rjust(5)
399
466
  ping = "-".rjust(5)
400
- line.append(
401
- f" {req} {resp} {notif} {ping}", style="bright_white" if channel else "dim"
402
- )
467
+ metrics_style = Colours.TEXT_DIM
468
+ line.append(f" {req} {resp} {notif} {ping}", style=metrics_style)
403
469
 
404
470
  console.console.print(line)
405
471
 
@@ -416,13 +482,13 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
416
482
 
417
483
  for channel_type, error_msg in errors:
418
484
  error_line = Text(indent)
419
- error_line.append("│ ", style="dim")
420
- error_line.append("⚠ ", style="bright_yellow")
421
- error_line.append(f"{channel_type}: ", style="bright_white")
485
+ error_line.append("│ ", style=Colours.TEXT_DIM)
486
+ error_line.append("⚠ ", style=Colours.TEXT_WARNING)
487
+ error_line.append(f"{channel_type}: ", style=Colours.TEXT_DEFAULT)
422
488
  # Truncate long error messages
423
489
  if len(error_msg) > 60:
424
490
  error_msg = error_msg[:57] + "..."
425
- error_line.append(error_msg, style="bright_red")
491
+ error_line.append(error_msg, style=Colours.TEXT_ERROR)
426
492
  console.console.print(error_line)
427
493
 
428
494
  # Legend if any timelines shown
@@ -444,24 +510,30 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
444
510
  if is_stdio:
445
511
  # Simplified legend for stdio: just activity vs idle
446
512
  legend_map = [
447
- ("activity", "bright_green"),
448
- ("idle", "white dim"),
513
+ ("activity", f"bold {Colours.TOKEN_ENABLED}"),
514
+ ("idle", Colours.IDLE),
449
515
  ]
450
516
  else:
451
517
  # Full legend for HTTP channels
452
518
  legend_map = [
453
- ("error", "bright_red"),
454
- ("response", "bright_blue"),
455
- ("request", "bright_yellow"),
456
- ("notification", "bright_cyan"),
457
- ("ping", "bright_green"),
458
- ("idle", "white dim"),
519
+ ("error", f"bold {Colours.ERROR}"),
520
+ ("response", f"bold {Colours.RESPONSE}"),
521
+ ("request", f"bold {Colours.REQUEST}"),
522
+ ("notification", f"bold {Colours.NOTIFICATION}"),
523
+ ("ping", Colours.PING),
524
+ ("idle", Colours.IDLE),
459
525
  ]
460
526
 
461
527
  for i, (name, color) in enumerate(legend_map):
462
528
  if i > 0:
463
529
  footer.append(" ", style="dim")
464
- footer.append("●", style=f"bold {color}")
530
+ if name == "idle":
531
+ symbol = "·"
532
+ elif name == "request":
533
+ symbol = "◆" # Diamond for requests
534
+ else:
535
+ symbol = "●"
536
+ footer.append(symbol, style=f"{color}")
465
537
  footer.append(f" {name}", style="dim")
466
538
 
467
539
  console.console.print(footer)
@@ -526,10 +598,10 @@ async def render_mcp_status(agent, indent: str = "") -> None:
526
598
  version_display = version_display[:9] + "..."
527
599
 
528
600
  header_label = Text(indent)
529
- header_label.append("▎", style="cyan")
530
- header_label.append("●", style="dim cyan")
531
- header_label.append(f" [{index:2}] ", style="cyan")
532
- header_label.append(server, style="bright_blue bold")
601
+ header_label.append("▎", style=Colours.TEXT_CYAN)
602
+ header_label.append("●", style=f"dim {Colours.TEXT_CYAN}")
603
+ header_label.append(f" [{index:2}] ", style=Colours.TEXT_CYAN)
604
+ header_label.append(server, style=f"{Colours.TEXT_INFO} bold")
533
605
  render_header(header_label)
534
606
 
535
607
  # First line: name and version
@@ -571,22 +643,22 @@ async def render_mcp_status(agent, indent: str = "") -> None:
571
643
 
572
644
  duration = _format_compact_duration(status.staleness_seconds)
573
645
  if duration:
574
- last_text = Text("last activity: ", style="dim")
575
- last_text.append(duration, style="bright_white")
576
- last_text.append(" ago", style="dim")
646
+ last_text = Text("last activity: ", style=Colours.TEXT_DIM)
647
+ last_text.append(duration, style=Colours.TEXT_DEFAULT)
648
+ last_text.append(" ago", style=Colours.TEXT_DIM)
577
649
  state_segments.append(last_text)
578
650
 
579
651
  if status.error_message and status.is_connected is False:
580
- state_segments.append(Text(status.error_message, style="bright_red"))
652
+ state_segments.append(Text(status.error_message, style=Colours.TEXT_ERROR))
581
653
 
582
654
  instr_available = bool(status.instructions_available)
583
655
  if instr_available and status.instructions_enabled is False:
584
- state_segments.append(Text("instructions disabled", style="bright_red"))
656
+ state_segments.append(Text("instructions disabled", style=Colours.TEXT_ERROR))
585
657
  elif instr_available and not template_expected:
586
- state_segments.append(Text("template missing", style="bright_yellow"))
658
+ state_segments.append(Text("template missing", style=Colours.TEXT_WARNING))
587
659
 
588
660
  if status.spoofing_enabled:
589
- state_segments.append(Text("client spoof", style="bright_yellow"))
661
+ state_segments.append(Text("client spoof", style=Colours.TEXT_WARNING))
590
662
 
591
663
  # Main status line (without transport and connected)
592
664
  if state_segments:
@@ -601,8 +673,8 @@ async def render_mcp_status(agent, indent: str = "") -> None:
601
673
  calls = _summarise_call_counts(status.call_counts)
602
674
  if calls:
603
675
  calls_line = Text(indent + " ")
604
- calls_line.append("mcp calls: ", style="dim")
605
- calls_line.append(calls, style="bright_white")
676
+ calls_line.append("mcp calls: ", style=Colours.TEXT_DIM)
677
+ calls_line.append(calls, style=Colours.TEXT_DEFAULT)
606
678
  console.console.print(calls_line)
607
679
  _render_channel_summary(status, indent, total_width)
608
680
 
File without changes