fast-agent-mcp 0.3.16__tar.gz → 0.3.18__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.
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/PKG-INFO +9 -1
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/README.md +8 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/textual_markdown_demo.py +4 -7
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/pyproject.toml +1 -1
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/mcp_agent.py +1 -1
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/go.py +78 -36
- fast_agent_mcp-0.3.18/src/fast_agent/cli/commands/serve.py +136 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/constants.py +3 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/main.py +5 -3
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/fastagent.py +102 -16
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/interfaces.py +4 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/model_database.py +4 -1
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/model_factory.py +4 -2
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/model_info.py +19 -43
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/google/llm_google_native.py +238 -7
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_openai.py +229 -32
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/server/agent_server.py +175 -41
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/skills/registry.py +17 -9
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/tools/shell_runtime.py +4 -4
- fast_agent_mcp-0.3.18/src/fast_agent/ui/console_display.py +1011 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/enhanced_prompt.py +26 -12
- fast_agent_mcp-0.3.18/src/fast_agent/ui/markdown_helpers.py +104 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/markdown_truncator.py +103 -45
- fast_agent_mcp-0.3.18/src/fast_agent/ui/message_primitives.py +50 -0
- fast_agent_mcp-0.3.18/src/fast_agent/ui/streaming.py +638 -0
- fast_agent_mcp-0.3.18/src/fast_agent/ui/tool_display.py +417 -0
- fast_agent_mcp-0.3.16/src/fast_agent/ui/console_display.py +0 -2227
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/.gitignore +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/LICENSE +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/a2a/agent_executor.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/a2a/server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/fastapi/fastapi-advanced.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/fastapi/fastapi-simple.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/fastapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/fastapi/readme.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/display_check.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/simple_llm.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/simple_llm_advanced.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/new-api/simple_mcp.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/openapi_mcp_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/petstore.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/openapi/run-as-server.sh +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/setup/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tool-use-agent/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/tool-use-agent/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/hatch_build.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/agent_types.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/llm_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/llm_decorator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/tool_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/agents/workflow/router_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/__main__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/auth.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/check_config.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/config.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/constants.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/context.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/agent_app.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/core_app.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/direct_decorators.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/executor/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/executor/executor.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/events.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/listeners.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/logger.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/logging/transport.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/event_progress.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/history/history_exporter.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/elicitation_handler.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/form_fields.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/simple_form.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/fastagent_llm.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/internal/passthrough.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/internal/playback.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/internal/silent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/internal/slow.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/memory.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider/openai/responses.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider_key_manager.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/provider_types.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/request_params.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/elicitation_factory.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/interfaces.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/mcp_aggregator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/mcp_content.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/oauth_client.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompt.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/sampling.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/server/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/skybridge.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/sse_tracking.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/transport_tracking.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/types.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/ui_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp/ui_mixin.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/py.typed +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/skills/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/tools/elicitation.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/types/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/types/llm_stop_reason.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/__init__.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/console.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/elicitation_form.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/elicitation_style.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/history_display.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/interactive_prompt.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/mcp_display.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/mermaid_utils.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/notification_tracker.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/plain_text_truncator.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/progress_display.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/rich_progress.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/src/fast_agent/ui/streaming_buffer.py +0 -0
- {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.18}/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.
|
|
3
|
+
Version: 0.3.18
|
|
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
|
|
@@ -261,6 +261,14 @@ The simple declarative syntax lets you concentrate on composing your Prompts and
|
|
|
261
261
|
|
|
262
262
|
Model support is comprehensive with native support for Anthropic, OpenAI and Google providers as well as Azure, Ollama, Deepseek and dozens of others via TensorZero. Structured Outputs, PDF and Vision support is simple to use and well tested. Passthrough and Playback LLMs enable rapid development and test of Python glue-code for your applications.
|
|
263
263
|
|
|
264
|
+
Recent features include:
|
|
265
|
+
- Agent Skills (SKILL.md)
|
|
266
|
+
- MCP-UI Support |
|
|
267
|
+
- OpenAI Apps SDK (Skybridge)
|
|
268
|
+
- Shell Mode
|
|
269
|
+
- Advanced MCP Transport Diagnsotics
|
|
270
|
+
- MCP Elicitations
|
|
271
|
+
|
|
264
272
|
<img width="800" alt="MCP Transport Diagnostics" src="https://github.com/user-attachments/assets/e26472de-58d9-4726-8bdd-01eb407414cf" />
|
|
265
273
|
|
|
266
274
|
|
|
@@ -20,6 +20,14 @@ The simple declarative syntax lets you concentrate on composing your Prompts and
|
|
|
20
20
|
|
|
21
21
|
Model support is comprehensive with native support for Anthropic, OpenAI and Google providers as well as Azure, Ollama, Deepseek and dozens of others via TensorZero. Structured Outputs, PDF and Vision support is simple to use and well tested. Passthrough and Playback LLMs enable rapid development and test of Python glue-code for your applications.
|
|
22
22
|
|
|
23
|
+
Recent features include:
|
|
24
|
+
- Agent Skills (SKILL.md)
|
|
25
|
+
- MCP-UI Support |
|
|
26
|
+
- OpenAI Apps SDK (Skybridge)
|
|
27
|
+
- Shell Mode
|
|
28
|
+
- Advanced MCP Transport Diagnsotics
|
|
29
|
+
- MCP Elicitations
|
|
30
|
+
|
|
23
31
|
<img width="800" alt="MCP Transport Diagnostics" src="https://github.com/user-attachments/assets/e26472de-58d9-4726-8bdd-01eb407414cf" />
|
|
24
32
|
|
|
25
33
|
|
|
@@ -20,12 +20,9 @@ from fast_agent import FastAgent
|
|
|
20
20
|
from fast_agent.constants import REASONING
|
|
21
21
|
from fast_agent.mcp.helpers.content_helpers import get_text
|
|
22
22
|
from fast_agent.types import PromptMessageExtended
|
|
23
|
-
from fast_agent.ui.console_display import
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
MessageType,
|
|
27
|
-
_prepare_markdown_content,
|
|
28
|
-
)
|
|
23
|
+
from fast_agent.ui.console_display import ConsoleDisplay
|
|
24
|
+
from fast_agent.ui.markdown_helpers import prepare_markdown_content
|
|
25
|
+
from fast_agent.ui.message_primitives import MESSAGE_CONFIGS, MessageType
|
|
29
26
|
|
|
30
27
|
if TYPE_CHECKING:
|
|
31
28
|
from mcp.types import CallToolResult
|
|
@@ -208,7 +205,7 @@ class ChatDisplay(RichLog):
|
|
|
208
205
|
if formatted:
|
|
209
206
|
segments.append(Markdown(formatted))
|
|
210
207
|
else:
|
|
211
|
-
prepared =
|
|
208
|
+
prepared = prepare_markdown_content(content, True) if content else ""
|
|
212
209
|
if prepared:
|
|
213
210
|
segments.append(Markdown(prepared))
|
|
214
211
|
|
|
@@ -157,7 +157,7 @@ class McpAgent(ABC, ToolAgent):
|
|
|
157
157
|
if skills_configured:
|
|
158
158
|
modes.append("skills")
|
|
159
159
|
if shell_flag_requested:
|
|
160
|
-
modes.append("
|
|
160
|
+
modes.append("switch")
|
|
161
161
|
self._shell_access_modes = tuple(modes)
|
|
162
162
|
self._bash_tool = self._shell_runtime.tool
|
|
163
163
|
if self._shell_runtime_enabled:
|
|
@@ -5,6 +5,7 @@ import logging
|
|
|
5
5
|
import shlex
|
|
6
6
|
import sys
|
|
7
7
|
from pathlib import Path
|
|
8
|
+
from typing import Literal
|
|
8
9
|
|
|
9
10
|
import typer
|
|
10
11
|
|
|
@@ -23,6 +24,50 @@ app = typer.Typer(
|
|
|
23
24
|
default_instruction = DEFAULT_AGENT_INSTRUCTION
|
|
24
25
|
|
|
25
26
|
|
|
27
|
+
def resolve_instruction_option(instruction: str | None) -> tuple[str, str]:
|
|
28
|
+
"""
|
|
29
|
+
Resolve the instruction option (file or URL) to the instruction string and agent name.
|
|
30
|
+
Returns (resolved_instruction, agent_name).
|
|
31
|
+
"""
|
|
32
|
+
resolved_instruction = default_instruction
|
|
33
|
+
agent_name = "agent"
|
|
34
|
+
|
|
35
|
+
if instruction:
|
|
36
|
+
try:
|
|
37
|
+
from pathlib import Path
|
|
38
|
+
|
|
39
|
+
from pydantic import AnyUrl
|
|
40
|
+
|
|
41
|
+
from fast_agent.core.direct_decorators import _resolve_instruction
|
|
42
|
+
|
|
43
|
+
if instruction.startswith(("http://", "https://")):
|
|
44
|
+
resolved_instruction = _resolve_instruction(AnyUrl(instruction))
|
|
45
|
+
else:
|
|
46
|
+
resolved_instruction = _resolve_instruction(Path(instruction))
|
|
47
|
+
instruction_path = Path(instruction)
|
|
48
|
+
if instruction_path.exists() and instruction_path.is_file():
|
|
49
|
+
agent_name = instruction_path.stem
|
|
50
|
+
except Exception as e:
|
|
51
|
+
typer.echo(f"Error loading instruction from {instruction}: {e}", err=True)
|
|
52
|
+
raise typer.Exit(1)
|
|
53
|
+
|
|
54
|
+
return resolved_instruction, agent_name
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def collect_stdio_commands(npx: str | None, uvx: str | None, stdio: str | None) -> list[str]:
|
|
58
|
+
"""Collect STDIO command definitions from convenience options."""
|
|
59
|
+
stdio_commands: list[str] = []
|
|
60
|
+
|
|
61
|
+
if npx:
|
|
62
|
+
stdio_commands.append(f"npx {npx}")
|
|
63
|
+
if uvx:
|
|
64
|
+
stdio_commands.append(f"uvx {uvx}")
|
|
65
|
+
if stdio:
|
|
66
|
+
stdio_commands.append(stdio)
|
|
67
|
+
|
|
68
|
+
return stdio_commands
|
|
69
|
+
|
|
70
|
+
|
|
26
71
|
def _set_asyncio_exception_handler(loop: asyncio.AbstractEventLoop) -> None:
|
|
27
72
|
"""Attach a detailed exception handler to the provided event loop."""
|
|
28
73
|
|
|
@@ -72,6 +117,12 @@ async def _run_agent(
|
|
|
72
117
|
agent_name: str | None = "agent",
|
|
73
118
|
skills_directory: Path | None = None,
|
|
74
119
|
shell_runtime: bool = False,
|
|
120
|
+
mode: Literal["interactive", "serve"] = "interactive",
|
|
121
|
+
transport: str = "http",
|
|
122
|
+
host: str = "0.0.0.0",
|
|
123
|
+
port: int = 8000,
|
|
124
|
+
tool_description: str | None = None,
|
|
125
|
+
instance_scope: str = "shared",
|
|
75
126
|
) -> None:
|
|
76
127
|
"""Async implementation to run an interactive agent."""
|
|
77
128
|
from fast_agent.mcp.prompts.prompt_load import load_prompt
|
|
@@ -84,6 +135,8 @@ async def _run_agent(
|
|
|
84
135
|
"ignore_unknown_args": True,
|
|
85
136
|
"parse_cli_args": False, # Don't parse CLI args, we're handling it ourselves
|
|
86
137
|
}
|
|
138
|
+
if mode == "serve":
|
|
139
|
+
fast_kwargs["quiet"] = True
|
|
87
140
|
if skills_directory is not None:
|
|
88
141
|
fast_kwargs["skills_directory"] = skills_directory
|
|
89
142
|
|
|
@@ -183,7 +236,16 @@ async def _run_agent(
|
|
|
183
236
|
await agent.interactive()
|
|
184
237
|
|
|
185
238
|
# Run the agent
|
|
186
|
-
|
|
239
|
+
if mode == "serve":
|
|
240
|
+
await fast.start_server(
|
|
241
|
+
transport=transport,
|
|
242
|
+
host=host,
|
|
243
|
+
port=port,
|
|
244
|
+
tool_description=tool_description,
|
|
245
|
+
instance_scope=instance_scope,
|
|
246
|
+
)
|
|
247
|
+
else:
|
|
248
|
+
await cli_agent()
|
|
187
249
|
|
|
188
250
|
|
|
189
251
|
def run_async_agent(
|
|
@@ -200,6 +262,12 @@ def run_async_agent(
|
|
|
200
262
|
agent_name: str | None = None,
|
|
201
263
|
skills_directory: Path | None = None,
|
|
202
264
|
shell_enabled: bool = False,
|
|
265
|
+
mode: Literal["interactive", "serve"] = "interactive",
|
|
266
|
+
transport: str = "http",
|
|
267
|
+
host: str = "0.0.0.0",
|
|
268
|
+
port: int = 8000,
|
|
269
|
+
tool_description: str | None = None,
|
|
270
|
+
instance_scope: str = "shared",
|
|
203
271
|
):
|
|
204
272
|
"""Run the async agent function with proper loop handling."""
|
|
205
273
|
server_list = servers.split(",") if servers else None
|
|
@@ -304,6 +372,12 @@ def run_async_agent(
|
|
|
304
372
|
agent_name=agent_name,
|
|
305
373
|
skills_directory=skills_directory,
|
|
306
374
|
shell_runtime=shell_enabled,
|
|
375
|
+
mode=mode,
|
|
376
|
+
transport=transport,
|
|
377
|
+
host=host,
|
|
378
|
+
port=port,
|
|
379
|
+
tool_description=tool_description,
|
|
380
|
+
instance_scope=instance_scope,
|
|
307
381
|
)
|
|
308
382
|
)
|
|
309
383
|
finally:
|
|
@@ -405,46 +479,13 @@ def go(
|
|
|
405
479
|
--stdio Command to run as STDIO MCP server (quoted)
|
|
406
480
|
"""
|
|
407
481
|
# Collect all stdio commands from convenience options
|
|
408
|
-
stdio_commands =
|
|
482
|
+
stdio_commands = collect_stdio_commands(npx, uvx, stdio)
|
|
409
483
|
shell_enabled = shell
|
|
410
484
|
|
|
411
|
-
if npx:
|
|
412
|
-
stdio_commands.append(f"npx {npx}")
|
|
413
|
-
|
|
414
|
-
if uvx:
|
|
415
|
-
stdio_commands.append(f"uvx {uvx}")
|
|
416
|
-
|
|
417
|
-
if stdio:
|
|
418
|
-
stdio_commands.append(stdio)
|
|
419
|
-
|
|
420
485
|
# When shell is enabled we don't add an MCP stdio server; handled inside the agent
|
|
421
486
|
|
|
422
487
|
# Resolve instruction from file/URL or use default
|
|
423
|
-
resolved_instruction =
|
|
424
|
-
agent_name = "agent"
|
|
425
|
-
|
|
426
|
-
if instruction:
|
|
427
|
-
try:
|
|
428
|
-
from pathlib import Path
|
|
429
|
-
|
|
430
|
-
from pydantic import AnyUrl
|
|
431
|
-
|
|
432
|
-
from fast_agent.core.direct_decorators import _resolve_instruction
|
|
433
|
-
|
|
434
|
-
# Check if it's a URL
|
|
435
|
-
if instruction.startswith(("http://", "https://")):
|
|
436
|
-
resolved_instruction = _resolve_instruction(AnyUrl(instruction))
|
|
437
|
-
else:
|
|
438
|
-
# Treat as file path
|
|
439
|
-
resolved_instruction = _resolve_instruction(Path(instruction))
|
|
440
|
-
# Extract filename without extension to use as agent name
|
|
441
|
-
instruction_path = Path(instruction)
|
|
442
|
-
if instruction_path.exists() and instruction_path.is_file():
|
|
443
|
-
# Get filename without extension
|
|
444
|
-
agent_name = instruction_path.stem
|
|
445
|
-
except Exception as e:
|
|
446
|
-
typer.echo(f"Error loading instruction from {instruction}: {e}", err=True)
|
|
447
|
-
raise typer.Exit(1)
|
|
488
|
+
resolved_instruction, agent_name = resolve_instruction_option(instruction)
|
|
448
489
|
|
|
449
490
|
run_async_agent(
|
|
450
491
|
name=name,
|
|
@@ -460,4 +501,5 @@ def go(
|
|
|
460
501
|
agent_name=agent_name,
|
|
461
502
|
skills_directory=skills_dir,
|
|
462
503
|
shell_enabled=shell_enabled,
|
|
504
|
+
instance_scope="shared",
|
|
463
505
|
)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Run FastAgent as an MCP server from the command line."""
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
|
|
8
|
+
from fast_agent.cli.commands.go import (
|
|
9
|
+
collect_stdio_commands,
|
|
10
|
+
resolve_instruction_option,
|
|
11
|
+
run_async_agent,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ServeTransport(str, Enum):
|
|
16
|
+
HTTP = "http"
|
|
17
|
+
SSE = "sse"
|
|
18
|
+
STDIO = "stdio"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class InstanceScope(str, Enum):
|
|
22
|
+
SHARED = "shared"
|
|
23
|
+
CONNECTION = "connection"
|
|
24
|
+
REQUEST = "request"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
app = typer.Typer(
|
|
28
|
+
help="Run FastAgent as an MCP server without writing an agent.py file",
|
|
29
|
+
context_settings={"allow_extra_args": True, "ignore_unknown_options": True},
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@app.callback(invoke_without_command=True, no_args_is_help=False)
|
|
34
|
+
def serve(
|
|
35
|
+
ctx: typer.Context,
|
|
36
|
+
name: str = typer.Option("fast-agent", "--name", help="Name for the MCP server"),
|
|
37
|
+
instruction: str | None = typer.Option(
|
|
38
|
+
None, "--instruction", "-i", help="Path to file or URL containing instruction for the agent"
|
|
39
|
+
),
|
|
40
|
+
config_path: str | None = typer.Option(None, "--config-path", "-c", help="Path to config file"),
|
|
41
|
+
servers: str | None = typer.Option(
|
|
42
|
+
None, "--servers", help="Comma-separated list of server names to enable from config"
|
|
43
|
+
),
|
|
44
|
+
urls: str | None = typer.Option(
|
|
45
|
+
None, "--url", help="Comma-separated list of HTTP/SSE URLs to connect to"
|
|
46
|
+
),
|
|
47
|
+
auth: str | None = typer.Option(
|
|
48
|
+
None, "--auth", help="Bearer token for authorization with URL-based servers"
|
|
49
|
+
),
|
|
50
|
+
model: str | None = typer.Option(
|
|
51
|
+
None, "--model", "--models", help="Override the default model (e.g., haiku, sonnet, gpt-4)"
|
|
52
|
+
),
|
|
53
|
+
skills_dir: Path | None = typer.Option(
|
|
54
|
+
None,
|
|
55
|
+
"--skills-dir",
|
|
56
|
+
"--skills",
|
|
57
|
+
help="Override the default skills directory",
|
|
58
|
+
),
|
|
59
|
+
npx: str | None = typer.Option(
|
|
60
|
+
None, "--npx", help="NPX package and args to run as MCP server (quoted)"
|
|
61
|
+
),
|
|
62
|
+
uvx: str | None = typer.Option(
|
|
63
|
+
None, "--uvx", help="UVX package and args to run as MCP server (quoted)"
|
|
64
|
+
),
|
|
65
|
+
stdio: str | None = typer.Option(
|
|
66
|
+
None, "--stdio", help="Command to run as STDIO MCP server (quoted)"
|
|
67
|
+
),
|
|
68
|
+
description: str | None = typer.Option(
|
|
69
|
+
None,
|
|
70
|
+
"--description",
|
|
71
|
+
"-d",
|
|
72
|
+
help="Description used for the exposed send tool (use {agent} to reference the agent name)",
|
|
73
|
+
),
|
|
74
|
+
transport: ServeTransport = typer.Option(
|
|
75
|
+
ServeTransport.HTTP,
|
|
76
|
+
"--transport",
|
|
77
|
+
help="Transport protocol to expose (http, sse, stdio)",
|
|
78
|
+
),
|
|
79
|
+
host: str = typer.Option(
|
|
80
|
+
"0.0.0.0",
|
|
81
|
+
"--host",
|
|
82
|
+
help="Host address to bind when using HTTP or SSE transport",
|
|
83
|
+
),
|
|
84
|
+
port: int = typer.Option(
|
|
85
|
+
8000,
|
|
86
|
+
"--port",
|
|
87
|
+
help="Port to use when running as a server with HTTP or SSE transport",
|
|
88
|
+
),
|
|
89
|
+
shell: bool = typer.Option(
|
|
90
|
+
False,
|
|
91
|
+
"--shell",
|
|
92
|
+
"-x",
|
|
93
|
+
help="Enable a local shell runtime and expose the execute tool (bash or pwsh).",
|
|
94
|
+
),
|
|
95
|
+
instance_scope: InstanceScope = typer.Option(
|
|
96
|
+
InstanceScope.SHARED,
|
|
97
|
+
"--instance-scope",
|
|
98
|
+
help="Control how MCP clients receive isolated agent instances (shared, connection, request)",
|
|
99
|
+
),
|
|
100
|
+
) -> None:
|
|
101
|
+
"""
|
|
102
|
+
Run FastAgent as an MCP server.
|
|
103
|
+
|
|
104
|
+
Examples:
|
|
105
|
+
fast-agent serve --model=haiku --instruction=./instruction.md --transport=http --port=8000
|
|
106
|
+
fast-agent serve --url=http://localhost:8001/mcp --auth=YOUR_API_TOKEN
|
|
107
|
+
fast-agent serve --stdio "python my_server.py --debug"
|
|
108
|
+
fast-agent serve --npx "@modelcontextprotocol/server-filesystem /path/to/data"
|
|
109
|
+
fast-agent serve --description "Interact with the {agent} assistant"
|
|
110
|
+
"""
|
|
111
|
+
stdio_commands = collect_stdio_commands(npx, uvx, stdio)
|
|
112
|
+
shell_enabled = shell
|
|
113
|
+
|
|
114
|
+
resolved_instruction, agent_name = resolve_instruction_option(instruction)
|
|
115
|
+
|
|
116
|
+
run_async_agent(
|
|
117
|
+
name=name,
|
|
118
|
+
instruction=resolved_instruction,
|
|
119
|
+
config_path=config_path,
|
|
120
|
+
servers=servers,
|
|
121
|
+
urls=urls,
|
|
122
|
+
auth=auth,
|
|
123
|
+
model=model,
|
|
124
|
+
message=None,
|
|
125
|
+
prompt_file=None,
|
|
126
|
+
stdio_commands=stdio_commands,
|
|
127
|
+
agent_name=agent_name,
|
|
128
|
+
skills_directory=skills_dir,
|
|
129
|
+
shell_enabled=shell_enabled,
|
|
130
|
+
mode="serve",
|
|
131
|
+
transport=transport.value,
|
|
132
|
+
host=host,
|
|
133
|
+
port=port,
|
|
134
|
+
tool_description=description,
|
|
135
|
+
instance_scope=instance_scope.value,
|
|
136
|
+
)
|
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
import typer
|
|
4
4
|
from rich.table import Table
|
|
5
5
|
|
|
6
|
-
from fast_agent.cli.commands import auth, check_config, go, quickstart, setup
|
|
6
|
+
from fast_agent.cli.commands import auth, check_config, go, quickstart, serve, setup
|
|
7
7
|
from fast_agent.cli.terminal import Application
|
|
8
8
|
from fast_agent.ui.console import console as shared_console
|
|
9
9
|
|
|
10
10
|
app = typer.Typer(
|
|
11
|
-
help="fast-agent
|
|
11
|
+
help="Use `fast-agent go --help` for interactive shell arguments and options.",
|
|
12
12
|
add_completion=False, # We'll add this later when we have more commands
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
# Subcommands
|
|
16
16
|
app.add_typer(go.app, name="go", help="Run an interactive agent directly from the command line")
|
|
17
|
+
app.add_typer(serve.app, name="serve", help="Run FastAgent as an MCP server")
|
|
17
18
|
app.add_typer(setup.app, name="setup", help="Set up a new agent project")
|
|
18
19
|
app.add_typer(check_config.app, name="check", help="Show or diagnose fast-agent configuration")
|
|
19
20
|
app.add_typer(auth.app, name="auth", help="Manage OAuth authentication for MCP servers")
|
|
@@ -62,7 +63,8 @@ def show_welcome() -> None:
|
|
|
62
63
|
table.add_column("Description", header_style="bold bright_white")
|
|
63
64
|
|
|
64
65
|
table.add_row("[bold]go[/bold]", "Start an interactive session")
|
|
65
|
-
table.add_row("go
|
|
66
|
+
table.add_row("go -x", "Start an interactive session with a local shell tool")
|
|
67
|
+
table.add_row("[bold]serve[/bold]", "Start fast-agent as an MCP server")
|
|
66
68
|
table.add_row("check", "Show current configuration")
|
|
67
69
|
table.add_row("auth", "Manage OAuth tokens and keyring")
|
|
68
70
|
table.add_row("setup", "Create agent template and configuration")
|
|
@@ -6,9 +6,11 @@ directly creates Agent instances without proxies.
|
|
|
6
6
|
|
|
7
7
|
import argparse
|
|
8
8
|
import asyncio
|
|
9
|
+
import inspect
|
|
9
10
|
import pathlib
|
|
10
11
|
import sys
|
|
11
12
|
from contextlib import asynccontextmanager
|
|
13
|
+
from dataclasses import dataclass
|
|
12
14
|
from importlib.metadata import version as get_version
|
|
13
15
|
from pathlib import Path
|
|
14
16
|
from typing import (
|
|
@@ -127,6 +129,9 @@ class FastAgent:
|
|
|
127
129
|
Path(skills_directory).expanduser() if skills_directory else None
|
|
128
130
|
)
|
|
129
131
|
self._default_skill_manifests: List[SkillManifest] = []
|
|
132
|
+
self._server_instance_factory = None
|
|
133
|
+
self._server_instance_dispose = None
|
|
134
|
+
self._server_managed_instances: List[AgentInstance] = []
|
|
130
135
|
|
|
131
136
|
# --- Wrap argument parsing logic ---
|
|
132
137
|
if parse_cli_args:
|
|
@@ -181,6 +186,12 @@ class FastAgent:
|
|
|
181
186
|
default="0.0.0.0",
|
|
182
187
|
help="Host address to bind to when running as a server with SSE transport",
|
|
183
188
|
)
|
|
189
|
+
parser.add_argument(
|
|
190
|
+
"--instance-scope",
|
|
191
|
+
choices=["shared", "connection", "request"],
|
|
192
|
+
default="shared",
|
|
193
|
+
help="Control MCP agent instancing behaviour (shared, connection, request)",
|
|
194
|
+
)
|
|
184
195
|
parser.add_argument(
|
|
185
196
|
"--skills",
|
|
186
197
|
help="Path to skills directory to use instead of default .claude/skills",
|
|
@@ -500,18 +511,34 @@ class FastAgent:
|
|
|
500
511
|
cli_model=cli_model_override, # Use the variable defined above
|
|
501
512
|
)
|
|
502
513
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
514
|
+
managed_instances: list[AgentInstance] = []
|
|
515
|
+
instance_lock = asyncio.Lock()
|
|
516
|
+
|
|
517
|
+
async def instantiate_agent_instance() -> AgentInstance:
|
|
518
|
+
async with instance_lock:
|
|
519
|
+
agents_map = await create_agents_in_dependency_order(
|
|
520
|
+
self.app,
|
|
521
|
+
self.agents,
|
|
522
|
+
model_factory_func,
|
|
523
|
+
)
|
|
524
|
+
validate_provider_keys_post_creation(agents_map)
|
|
525
|
+
instance = AgentInstance(AgentApp(agents_map), agents_map)
|
|
526
|
+
managed_instances.append(instance)
|
|
527
|
+
return instance
|
|
528
|
+
|
|
529
|
+
async def dispose_agent_instance(instance: AgentInstance) -> None:
|
|
530
|
+
async with instance_lock:
|
|
531
|
+
if instance in managed_instances:
|
|
532
|
+
managed_instances.remove(instance)
|
|
533
|
+
await instance.shutdown()
|
|
509
534
|
|
|
510
|
-
|
|
511
|
-
|
|
535
|
+
primary_instance = await instantiate_agent_instance()
|
|
536
|
+
wrapper = primary_instance.app
|
|
537
|
+
active_agents = primary_instance.agents
|
|
512
538
|
|
|
513
|
-
|
|
514
|
-
|
|
539
|
+
self._server_instance_factory = instantiate_agent_instance
|
|
540
|
+
self._server_instance_dispose = dispose_agent_instance
|
|
541
|
+
self._server_managed_instances = managed_instances
|
|
515
542
|
|
|
516
543
|
# Disable streaming if parallel agents are present
|
|
517
544
|
from fast_agent.agents.agent_types import AgentType
|
|
@@ -541,9 +568,18 @@ class FastAgent:
|
|
|
541
568
|
# Create the MCP server
|
|
542
569
|
from fast_agent.mcp.server import AgentMCPServer
|
|
543
570
|
|
|
571
|
+
tool_description = getattr(self.args, "tool_description", None)
|
|
572
|
+
server_description = getattr(self.args, "server_description", None)
|
|
573
|
+
server_name = getattr(self.args, "server_name", None)
|
|
574
|
+
instance_scope = getattr(self.args, "instance_scope", "shared")
|
|
544
575
|
mcp_server = AgentMCPServer(
|
|
545
|
-
|
|
546
|
-
|
|
576
|
+
primary_instance=primary_instance,
|
|
577
|
+
create_instance=self._server_instance_factory,
|
|
578
|
+
dispose_instance=self._server_instance_dispose,
|
|
579
|
+
instance_scope=instance_scope,
|
|
580
|
+
server_name=server_name or f"{self.name}-MCP-Server",
|
|
581
|
+
server_description=server_description,
|
|
582
|
+
tool_description=tool_description,
|
|
547
583
|
)
|
|
548
584
|
|
|
549
585
|
# Run the server directly (this is a blocking call)
|
|
@@ -647,11 +683,32 @@ class FastAgent:
|
|
|
647
683
|
pass
|
|
648
684
|
|
|
649
685
|
# Print usage report before cleanup (show for user exits too)
|
|
650
|
-
if
|
|
686
|
+
if (
|
|
687
|
+
getattr(self, "_server_managed_instances", None)
|
|
688
|
+
and not had_error
|
|
689
|
+
and not quiet_mode
|
|
690
|
+
and getattr(self.args, "server", False) is False
|
|
691
|
+
):
|
|
692
|
+
# Only show usage report for non-server interactive runs
|
|
693
|
+
if managed_instances:
|
|
694
|
+
instance = managed_instances[0]
|
|
695
|
+
self._print_usage_report(instance.agents)
|
|
696
|
+
elif active_agents and not had_error and not quiet_mode:
|
|
651
697
|
self._print_usage_report(active_agents)
|
|
652
698
|
|
|
653
699
|
# Clean up any active agents (always cleanup, even on errors)
|
|
654
|
-
if
|
|
700
|
+
if getattr(self, "_server_managed_instances", None) and getattr(
|
|
701
|
+
self, "_server_instance_dispose", None
|
|
702
|
+
):
|
|
703
|
+
# Dispose any remaining instances
|
|
704
|
+
remaining_instances = list(self._server_managed_instances)
|
|
705
|
+
for instance in remaining_instances:
|
|
706
|
+
try:
|
|
707
|
+
await self._server_instance_dispose(instance)
|
|
708
|
+
except Exception:
|
|
709
|
+
pass
|
|
710
|
+
self._server_managed_instances.clear()
|
|
711
|
+
elif active_agents:
|
|
655
712
|
for agent in active_agents.values():
|
|
656
713
|
try:
|
|
657
714
|
await agent.shutdown()
|
|
@@ -790,6 +847,8 @@ class FastAgent:
|
|
|
790
847
|
port: int = 8000,
|
|
791
848
|
server_name: Optional[str] = None,
|
|
792
849
|
server_description: Optional[str] = None,
|
|
850
|
+
tool_description: Optional[str] = None,
|
|
851
|
+
instance_scope: str = "shared",
|
|
793
852
|
) -> None:
|
|
794
853
|
"""
|
|
795
854
|
Start the application as an MCP server.
|
|
@@ -801,7 +860,9 @@ class FastAgent:
|
|
|
801
860
|
host: Host address for the server when using SSE
|
|
802
861
|
port: Port for the server when using SSE
|
|
803
862
|
server_name: Optional custom name for the MCP server
|
|
804
|
-
server_description: Optional description for the MCP server
|
|
863
|
+
server_description: Optional description/instructions for the MCP server
|
|
864
|
+
tool_description: Optional description template for the exposed send tool.
|
|
865
|
+
Use {agent} to reference the agent name.
|
|
805
866
|
"""
|
|
806
867
|
# This method simply updates the command line arguments and uses run()
|
|
807
868
|
# to ensure we follow the same initialization path for all operations
|
|
@@ -819,6 +880,10 @@ class FastAgent:
|
|
|
819
880
|
self.args.transport = transport
|
|
820
881
|
self.args.host = host
|
|
821
882
|
self.args.port = port
|
|
883
|
+
self.args.tool_description = tool_description
|
|
884
|
+
self.args.server_description = server_description
|
|
885
|
+
self.args.server_name = server_name
|
|
886
|
+
self.args.instance_scope = instance_scope
|
|
822
887
|
self.args.quiet = (
|
|
823
888
|
original_args.quiet if original_args and hasattr(original_args, "quiet") else False
|
|
824
889
|
)
|
|
@@ -842,6 +907,8 @@ class FastAgent:
|
|
|
842
907
|
port: int = 8000,
|
|
843
908
|
server_name: Optional[str] = None,
|
|
844
909
|
server_description: Optional[str] = None,
|
|
910
|
+
tool_description: Optional[str] = None,
|
|
911
|
+
instance_scope: str = "shared",
|
|
845
912
|
) -> None:
|
|
846
913
|
"""
|
|
847
914
|
Run the application and expose agents through an MCP server.
|
|
@@ -853,7 +920,8 @@ class FastAgent:
|
|
|
853
920
|
host: Host address for the server when using SSE
|
|
854
921
|
port: Port for the server when using SSE
|
|
855
922
|
server_name: Optional custom name for the MCP server
|
|
856
|
-
server_description: Optional description for the MCP server
|
|
923
|
+
server_description: Optional description/instructions for the MCP server
|
|
924
|
+
tool_description: Optional description template for the exposed send tool.
|
|
857
925
|
"""
|
|
858
926
|
await self.start_server(
|
|
859
927
|
transport=transport,
|
|
@@ -861,6 +929,8 @@ class FastAgent:
|
|
|
861
929
|
port=port,
|
|
862
930
|
server_name=server_name,
|
|
863
931
|
server_description=server_description,
|
|
932
|
+
tool_description=tool_description,
|
|
933
|
+
instance_scope=instance_scope,
|
|
864
934
|
)
|
|
865
935
|
|
|
866
936
|
async def main(self):
|
|
@@ -892,3 +962,19 @@ class FastAgent:
|
|
|
892
962
|
# Just check if the flag is set, no action here
|
|
893
963
|
# The actual server code will be handled by run()
|
|
894
964
|
return hasattr(self, "args") and self.args.server
|
|
965
|
+
@dataclass
|
|
966
|
+
class AgentInstance:
|
|
967
|
+
app: AgentApp
|
|
968
|
+
agents: Dict[str, "AgentProtocol"]
|
|
969
|
+
|
|
970
|
+
async def shutdown(self) -> None:
|
|
971
|
+
for agent in self.agents.values():
|
|
972
|
+
try:
|
|
973
|
+
shutdown = getattr(agent, "shutdown", None)
|
|
974
|
+
if shutdown is None:
|
|
975
|
+
continue
|
|
976
|
+
result = shutdown()
|
|
977
|
+
if inspect.isawaitable(result):
|
|
978
|
+
await result
|
|
979
|
+
except Exception:
|
|
980
|
+
pass
|