fast-agent-mcp 0.2.55__tar.gz → 0.2.57__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.2.55 → fast_agent_mcp-0.2.57}/PKG-INFO +3 -17
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/pyproject.toml +3 -7
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/agent.py +10 -3
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/base_agent.py +15 -7
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/go.py +3 -3
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/agent_app.py +18 -6
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/enhanced_prompt.py +11 -2
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/fastagent.py +2 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/request_params.py +5 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/event_progress.py +3 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm.py +15 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +1 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_groq.py +58 -29
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_openai.py +4 -5
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_agent_client_session.py +105 -2
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_aggregator.py +97 -35
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_connection_manager.py +19 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/ui/console_display.py +105 -15
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/.gitignore +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/LICENSE +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/README.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/hatch_build.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/iterative_planner.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/app.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/__main__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/check_config.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/constants.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/main.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/config.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/console.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/context.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/agent_types.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/direct_decorators.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/interactive_prompt.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/mcp_content.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/mermaid_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/usage_display.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/executor.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_form.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/form_fields.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/handler.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/simple_form.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/memory.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/model_database.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/model_factory.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/provider_key_manager.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/provider_types.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_tensorzero_openai.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/google_converter.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/events.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/listeners.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/logger.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/rich_progress.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/logging/transport.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/interfaces.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/sampling.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server/__init__.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server/agent_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/progress_display.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/py.typed +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/tools/tool_definition.py +0 -0
- {fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/ui/console_display_legacy.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fast-agent-mcp
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.57
|
|
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
|
|
@@ -211,7 +211,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
211
211
|
Requires-Python: >=3.13
|
|
212
212
|
Requires-Dist: a2a-sdk>=0.3.0
|
|
213
213
|
Requires-Dist: aiohttp>=3.11.13
|
|
214
|
-
Requires-Dist: anthropic>=0.
|
|
214
|
+
Requires-Dist: anthropic>=0.63.0
|
|
215
215
|
Requires-Dist: azure-identity>=1.14.0
|
|
216
216
|
Requires-Dist: boto3>=1.35.0
|
|
217
217
|
Requires-Dist: deprecated>=1.2.18
|
|
@@ -219,7 +219,7 @@ Requires-Dist: email-validator>=2.2.0
|
|
|
219
219
|
Requires-Dist: fastapi>=0.115.6
|
|
220
220
|
Requires-Dist: google-genai>=1.27.0
|
|
221
221
|
Requires-Dist: mcp==1.12.4
|
|
222
|
-
Requires-Dist: openai>=1.
|
|
222
|
+
Requires-Dist: openai>=1.99.9
|
|
223
223
|
Requires-Dist: opentelemetry-distro>=0.55b0
|
|
224
224
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
|
|
225
225
|
Requires-Dist: opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'
|
|
@@ -234,20 +234,6 @@ Requires-Dist: pyyaml>=6.0.2
|
|
|
234
234
|
Requires-Dist: rich>=14.1.0
|
|
235
235
|
Requires-Dist: tensorzero>=2025.7.5
|
|
236
236
|
Requires-Dist: typer>=0.15.1
|
|
237
|
-
Provides-Extra: azure
|
|
238
|
-
Requires-Dist: azure-identity>=1.14.0; extra == 'azure'
|
|
239
|
-
Provides-Extra: dev
|
|
240
|
-
Requires-Dist: anthropic>=0.42.0; extra == 'dev'
|
|
241
|
-
Requires-Dist: pre-commit>=4.0.1; extra == 'dev'
|
|
242
|
-
Requires-Dist: pydantic>=2.10.4; extra == 'dev'
|
|
243
|
-
Requires-Dist: pytest-asyncio>=0.21.1; extra == 'dev'
|
|
244
|
-
Requires-Dist: pytest-cov; extra == 'dev'
|
|
245
|
-
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
246
|
-
Requires-Dist: pyyaml>=6.0.2; extra == 'dev'
|
|
247
|
-
Requires-Dist: ruff>=0.8.4; extra == 'dev'
|
|
248
|
-
Requires-Dist: tomli>=2.2.1; extra == 'dev'
|
|
249
|
-
Provides-Extra: openai
|
|
250
|
-
Requires-Dist: openai>=1.58.1; extra == 'openai'
|
|
251
237
|
Description-Content-Type: text/markdown
|
|
252
238
|
|
|
253
239
|
<p align="center">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fast-agent-mcp"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.57"
|
|
4
4
|
description = "Define, Prompt and Test MCP enabled Agents and Workflows"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -23,8 +23,8 @@ dependencies = [
|
|
|
23
23
|
"pyyaml>=6.0.2",
|
|
24
24
|
"rich>=14.1.0",
|
|
25
25
|
"typer>=0.15.1",
|
|
26
|
-
"anthropic>=0.
|
|
27
|
-
"openai>=1.
|
|
26
|
+
"anthropic>=0.63.0",
|
|
27
|
+
"openai>=1.99.9",
|
|
28
28
|
"azure-identity>=1.14.0",
|
|
29
29
|
"boto3>=1.35.0",
|
|
30
30
|
"prompt-toolkit>=3.0.51",
|
|
@@ -41,10 +41,6 @@ dependencies = [
|
|
|
41
41
|
"pyperclip>=1.9.0",
|
|
42
42
|
]
|
|
43
43
|
|
|
44
|
-
[project.optional-dependencies]
|
|
45
|
-
openai = [
|
|
46
|
-
"openai>=1.58.1",
|
|
47
|
-
]
|
|
48
44
|
# For Azure OpenAI with DefaultAzureCredential support, install with: pip install fast-agent-mcp[azure]
|
|
49
45
|
azure = [
|
|
50
46
|
"azure-identity>=1.14.0"
|
|
@@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, TypeVar
|
|
|
10
10
|
from mcp_agent.agents.base_agent import BaseAgent
|
|
11
11
|
from mcp_agent.core.agent_types import AgentConfig
|
|
12
12
|
from mcp_agent.core.interactive_prompt import InteractivePrompt
|
|
13
|
+
from mcp_agent.core.request_params import RequestParams
|
|
13
14
|
from mcp_agent.human_input.types import HumanInputCallback
|
|
14
15
|
from mcp_agent.logging.logger import get_logger
|
|
15
16
|
from mcp_agent.mcp.interfaces import AugmentedLLMProtocol
|
|
@@ -51,13 +52,19 @@ class Agent(BaseAgent):
|
|
|
51
52
|
**kwargs,
|
|
52
53
|
)
|
|
53
54
|
|
|
54
|
-
async def prompt(
|
|
55
|
+
async def prompt(
|
|
56
|
+
self,
|
|
57
|
+
default_prompt: str = "",
|
|
58
|
+
agent_name: Optional[str] = None,
|
|
59
|
+
request_params: RequestParams | None = None
|
|
60
|
+
) -> str:
|
|
55
61
|
"""
|
|
56
62
|
Start an interactive prompt session with this agent.
|
|
57
63
|
|
|
58
64
|
Args:
|
|
59
65
|
default: Default message to use when user presses enter
|
|
60
66
|
agent_name: Ignored for single agents, included for API compatibility
|
|
67
|
+
request_params: Optional request parameters
|
|
61
68
|
|
|
62
69
|
Returns:
|
|
63
70
|
The result of the interactive session
|
|
@@ -66,14 +73,14 @@ class Agent(BaseAgent):
|
|
|
66
73
|
agent_name_str = str(self.name)
|
|
67
74
|
|
|
68
75
|
# Create agent_types dictionary with just this agent
|
|
69
|
-
agent_types = {agent_name_str: self.agent_type
|
|
76
|
+
agent_types = {agent_name_str: self.agent_type}
|
|
70
77
|
|
|
71
78
|
# Create the interactive prompt
|
|
72
79
|
prompt = InteractivePrompt(agent_types=agent_types)
|
|
73
80
|
|
|
74
81
|
# Define wrapper for send function
|
|
75
82
|
async def send_wrapper(message, agent_name):
|
|
76
|
-
return await self.send(message)
|
|
83
|
+
return await self.send(message, request_params)
|
|
77
84
|
|
|
78
85
|
# Start the prompt loop with just this agent
|
|
79
86
|
return await prompt.prompt_loop(
|
|
@@ -208,7 +208,11 @@ class BaseAgent(MCPAggregator, AgentProtocol):
|
|
|
208
208
|
result: PromptMessageMultipart = await self.generate([Prompt.user(message)], request_params)
|
|
209
209
|
return result.first_text()
|
|
210
210
|
|
|
211
|
-
async def send(
|
|
211
|
+
async def send(
|
|
212
|
+
self,
|
|
213
|
+
message: Union[str, PromptMessage, PromptMessageMultipart],
|
|
214
|
+
request_params: RequestParams | None = None
|
|
215
|
+
) -> str:
|
|
212
216
|
"""
|
|
213
217
|
Send a message to the agent and get a response.
|
|
214
218
|
|
|
@@ -217,6 +221,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
|
|
|
217
221
|
- String: Converted to a user PromptMessageMultipart
|
|
218
222
|
- PromptMessage: Converted to PromptMessageMultipart
|
|
219
223
|
- PromptMessageMultipart: Used directly
|
|
224
|
+
- request_params: Optional request parameters
|
|
220
225
|
|
|
221
226
|
Returns:
|
|
222
227
|
The agent's response as a string
|
|
@@ -225,7 +230,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
|
|
|
225
230
|
prompt = self._normalize_message_input(message)
|
|
226
231
|
|
|
227
232
|
# Use the LLM to generate a response
|
|
228
|
-
response = await self.generate([prompt],
|
|
233
|
+
response = await self.generate([prompt], request_params)
|
|
229
234
|
return response.all_text()
|
|
230
235
|
|
|
231
236
|
def _normalize_message_input(
|
|
@@ -364,12 +369,15 @@ class BaseAgent(MCPAggregator, AgentProtocol):
|
|
|
364
369
|
if self.config.tools is not None:
|
|
365
370
|
filtered_tools = []
|
|
366
371
|
for tool in result.tools:
|
|
367
|
-
# Extract server name from tool name
|
|
368
|
-
|
|
369
|
-
|
|
372
|
+
# Extract server name from tool name, handling server names with hyphens
|
|
373
|
+
server_name = None
|
|
374
|
+
for configured_server in self.config.tools.keys():
|
|
375
|
+
if tool.name.startswith(f"{configured_server}-"):
|
|
376
|
+
server_name = configured_server
|
|
377
|
+
break
|
|
370
378
|
|
|
371
|
-
|
|
372
|
-
|
|
379
|
+
# Check if this server has tool filters
|
|
380
|
+
if server_name and server_name in self.config.tools:
|
|
373
381
|
# Check if tool matches any pattern for this server
|
|
374
382
|
for pattern in self.config.tools[server_name]:
|
|
375
383
|
if self._matches_pattern(tool.name, pattern, server_name):
|
|
@@ -121,9 +121,9 @@ async def _run_agent(
|
|
|
121
121
|
print(response)
|
|
122
122
|
elif prompt_file:
|
|
123
123
|
prompt = load_prompt_multipart(Path(prompt_file))
|
|
124
|
-
response = await agent.generate(prompt)
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
response = await agent.agent.generate(prompt)
|
|
125
|
+
print(f"\nLoaded {len(prompt)} messages from prompt file '{prompt_file}'")
|
|
126
|
+
await agent.interactive()
|
|
127
127
|
else:
|
|
128
128
|
await agent.interactive()
|
|
129
129
|
|
|
@@ -11,6 +11,7 @@ from rich import print as rich_print
|
|
|
11
11
|
from mcp_agent.agents.agent import Agent
|
|
12
12
|
from mcp_agent.core.agent_types import AgentType
|
|
13
13
|
from mcp_agent.core.interactive_prompt import InteractivePrompt
|
|
14
|
+
from mcp_agent.core.request_params import RequestParams
|
|
14
15
|
from mcp_agent.mcp.prompt_message_multipart import PromptMessageMultipart
|
|
15
16
|
from mcp_agent.progress_display import progress_display
|
|
16
17
|
|
|
@@ -53,6 +54,7 @@ class AgentApp:
|
|
|
53
54
|
message: Union[str, PromptMessage, PromptMessageMultipart] | None = None,
|
|
54
55
|
agent_name: str | None = None,
|
|
55
56
|
default_prompt: str = "",
|
|
57
|
+
request_params: RequestParams | None = None,
|
|
56
58
|
) -> str:
|
|
57
59
|
"""
|
|
58
60
|
Make the object callable to send messages or start interactive prompt.
|
|
@@ -65,19 +67,21 @@ class AgentApp:
|
|
|
65
67
|
- PromptMessageMultipart: Used directly
|
|
66
68
|
agent_name: Optional name of the agent to send to (defaults to first agent)
|
|
67
69
|
default_prompt: Default message to use in interactive prompt mode
|
|
70
|
+
request_params: Optional request parameters including MCP metadata
|
|
68
71
|
|
|
69
72
|
Returns:
|
|
70
73
|
The agent's response as a string or the result of the interactive session
|
|
71
74
|
"""
|
|
72
75
|
if message:
|
|
73
|
-
return await self._agent(agent_name).send(message)
|
|
76
|
+
return await self._agent(agent_name).send(message, request_params)
|
|
74
77
|
|
|
75
|
-
return await self.interactive(agent_name=agent_name, default_prompt=default_prompt)
|
|
78
|
+
return await self.interactive(agent_name=agent_name, default_prompt=default_prompt, request_params=request_params)
|
|
76
79
|
|
|
77
80
|
async def send(
|
|
78
81
|
self,
|
|
79
82
|
message: Union[str, PromptMessage, PromptMessageMultipart],
|
|
80
83
|
agent_name: Optional[str] = None,
|
|
84
|
+
request_params: RequestParams | None = None,
|
|
81
85
|
) -> str:
|
|
82
86
|
"""
|
|
83
87
|
Send a message to the specified agent (or to all agents).
|
|
@@ -88,11 +92,12 @@ class AgentApp:
|
|
|
88
92
|
- PromptMessage: Converted to PromptMessageMultipart
|
|
89
93
|
- PromptMessageMultipart: Used directly
|
|
90
94
|
agent_name: Optional name of the agent to send to
|
|
95
|
+
request_params: Optional request parameters including MCP metadata
|
|
91
96
|
|
|
92
97
|
Returns:
|
|
93
98
|
The agent's response as a string
|
|
94
99
|
"""
|
|
95
|
-
return await self._agent(agent_name).send(message)
|
|
100
|
+
return await self._agent(agent_name).send(message, request_params)
|
|
96
101
|
|
|
97
102
|
def _agent(self, agent_name: str | None) -> Agent:
|
|
98
103
|
if agent_name:
|
|
@@ -233,17 +238,23 @@ class AgentApp:
|
|
|
233
238
|
)
|
|
234
239
|
|
|
235
240
|
@deprecated
|
|
236
|
-
async def prompt(
|
|
241
|
+
async def prompt(
|
|
242
|
+
self,
|
|
243
|
+
agent_name: str | None = None,
|
|
244
|
+
default_prompt: str = "",
|
|
245
|
+
request_params: RequestParams | None = None
|
|
246
|
+
) -> str:
|
|
237
247
|
"""
|
|
238
248
|
Deprecated - use interactive() instead.
|
|
239
249
|
"""
|
|
240
|
-
return await self.interactive(agent_name=agent_name, default_prompt=default_prompt)
|
|
250
|
+
return await self.interactive(agent_name=agent_name, default_prompt=default_prompt, request_params=request_params)
|
|
241
251
|
|
|
242
252
|
async def interactive(
|
|
243
253
|
self,
|
|
244
254
|
agent_name: str | None = None,
|
|
245
255
|
default_prompt: str = "",
|
|
246
256
|
pretty_print_parallel: bool = False,
|
|
257
|
+
request_params: RequestParams | None = None,
|
|
247
258
|
) -> str:
|
|
248
259
|
"""
|
|
249
260
|
Interactive prompt for sending messages with advanced features.
|
|
@@ -252,6 +263,7 @@ class AgentApp:
|
|
|
252
263
|
agent_name: Optional target agent name (uses default if not specified)
|
|
253
264
|
default: Default message to use when user presses enter
|
|
254
265
|
pretty_print_parallel: Enable clean parallel results display for parallel agents
|
|
266
|
+
request_params: Optional request parameters including MCP metadata
|
|
255
267
|
|
|
256
268
|
Returns:
|
|
257
269
|
The result of the interactive session
|
|
@@ -285,7 +297,7 @@ class AgentApp:
|
|
|
285
297
|
|
|
286
298
|
# Define the wrapper for send function
|
|
287
299
|
async def send_wrapper(message, agent_name):
|
|
288
|
-
result = await self.send(message, agent_name)
|
|
300
|
+
result = await self.send(message, agent_name, request_params)
|
|
289
301
|
|
|
290
302
|
# Show parallel results if enabled and this is a parallel agent
|
|
291
303
|
if pretty_print_parallel:
|
|
@@ -428,9 +428,14 @@ def create_keybindings(on_toggle_multiline=None, app=None, agent_provider=None,
|
|
|
428
428
|
"""Enter: accept input when not in multiline mode."""
|
|
429
429
|
event.current_buffer.validate_and_handle()
|
|
430
430
|
|
|
431
|
+
@kb.add("c-j", filter=Condition(lambda: not in_multiline_mode))
|
|
432
|
+
def _(event) -> None:
|
|
433
|
+
"""Ctrl+J: Insert newline when in normal mode."""
|
|
434
|
+
event.current_buffer.insert_text("\n")
|
|
435
|
+
|
|
431
436
|
@kb.add("c-m", filter=Condition(lambda: in_multiline_mode))
|
|
432
437
|
def _(event) -> None:
|
|
433
|
-
"""Enter:
|
|
438
|
+
"""Enter: Insert newline when in multiline mode."""
|
|
434
439
|
event.current_buffer.insert_text("\n")
|
|
435
440
|
|
|
436
441
|
# Use c-j (Ctrl+J) as an alternative to represent Ctrl+Enter in multiline mode
|
|
@@ -581,13 +586,15 @@ async def get_enhanced_input(
|
|
|
581
586
|
|
|
582
587
|
shortcuts = [
|
|
583
588
|
("Ctrl+T", toggle_text),
|
|
589
|
+
("Ctrl+J", "Newline" if not in_multiline_mode else None),
|
|
584
590
|
("Ctrl+E", "External"),
|
|
585
591
|
("Ctrl+Y", "Copy"),
|
|
586
592
|
("Ctrl+L", "Clear"),
|
|
587
593
|
("↑/↓", "History"),
|
|
594
|
+
("EXIT", "Exit")
|
|
588
595
|
]
|
|
589
596
|
|
|
590
|
-
newline = "Ctrl
|
|
597
|
+
newline = "Ctrl+J:Submit" if in_multiline_mode else "<Enter>:Submit"
|
|
591
598
|
|
|
592
599
|
# Only show relevant shortcuts based on mode
|
|
593
600
|
shortcuts = [(k, v) for k, v in shortcuts if v]
|
|
@@ -669,6 +676,8 @@ async def get_enhanced_input(
|
|
|
669
676
|
def pre_process_input(text):
|
|
670
677
|
# Command processing
|
|
671
678
|
if text and text.startswith("/"):
|
|
679
|
+
if text == "/":
|
|
680
|
+
return ""
|
|
672
681
|
cmd_parts = text[1:].strip().split(maxsplit=1)
|
|
673
682
|
cmd = cmd_parts[0].lower()
|
|
674
683
|
|
|
@@ -87,6 +87,7 @@ class FastAgent:
|
|
|
87
87
|
ignore_unknown_args: bool = False,
|
|
88
88
|
parse_cli_args: bool = True,
|
|
89
89
|
quiet: bool = False, # Add quiet parameter
|
|
90
|
+
**kwargs
|
|
90
91
|
) -> None:
|
|
91
92
|
"""
|
|
92
93
|
Initialize the fast-agent application.
|
|
@@ -203,6 +204,7 @@ class FastAgent:
|
|
|
203
204
|
self.app = MCPApp(
|
|
204
205
|
name=name,
|
|
205
206
|
settings=config.Settings(**self.config) if hasattr(self, "config") else None,
|
|
207
|
+
**kwargs
|
|
206
208
|
)
|
|
207
209
|
|
|
208
210
|
# Stop progress display immediately if quiet mode is requested
|
|
@@ -52,3 +52,8 @@ class RequestParams(CreateMessageRequestParams):
|
|
|
52
52
|
"""
|
|
53
53
|
Optional dictionary of template variables for dynamic templates. Currently only works for TensorZero inference backend
|
|
54
54
|
"""
|
|
55
|
+
|
|
56
|
+
mcp_metadata: Dict[str, Any] | None = None
|
|
57
|
+
"""
|
|
58
|
+
Metadata to pass through to MCP tool calls via the _meta field.
|
|
59
|
+
"""
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from abc import abstractmethod
|
|
2
|
+
from contextvars import ContextVar
|
|
2
3
|
from typing import (
|
|
3
4
|
TYPE_CHECKING,
|
|
4
5
|
Any,
|
|
@@ -61,6 +62,9 @@ if TYPE_CHECKING:
|
|
|
61
62
|
# TODO -- move this to a constant
|
|
62
63
|
HUMAN_INPUT_TOOL_NAME = "__human_input__"
|
|
63
64
|
|
|
65
|
+
# Context variable for storing MCP metadata
|
|
66
|
+
_mcp_metadata_var: ContextVar[Dict[str, Any] | None] = ContextVar('mcp_metadata', default=None)
|
|
67
|
+
|
|
64
68
|
|
|
65
69
|
def deep_merge(dict1: Dict[Any, Any], dict2: Dict[Any, Any]) -> Dict[Any, Any]:
|
|
66
70
|
"""
|
|
@@ -232,6 +236,11 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
|
|
|
232
236
|
|
|
233
237
|
self._precall(multipart_messages)
|
|
234
238
|
|
|
239
|
+
# Store MCP metadata in context variable
|
|
240
|
+
final_request_params = self.get_request_params(request_params)
|
|
241
|
+
if final_request_params.mcp_metadata:
|
|
242
|
+
_mcp_metadata_var.set(final_request_params.mcp_metadata)
|
|
243
|
+
|
|
235
244
|
assistant_response: PromptMessageMultipart = await self._apply_prompt_provider_specific(
|
|
236
245
|
multipart_messages, request_params
|
|
237
246
|
)
|
|
@@ -275,6 +284,12 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
|
|
|
275
284
|
multipart_messages = PromptMessageMultipart.to_multipart(multipart_messages)
|
|
276
285
|
|
|
277
286
|
self._precall(multipart_messages)
|
|
287
|
+
|
|
288
|
+
# Store MCP metadata in context variable
|
|
289
|
+
final_request_params = self.get_request_params(request_params)
|
|
290
|
+
if final_request_params.mcp_metadata:
|
|
291
|
+
_mcp_metadata_var.set(final_request_params.mcp_metadata)
|
|
292
|
+
|
|
278
293
|
result, assistant_response = await self._apply_prompt_provider_specific_structured(
|
|
279
294
|
multipart_messages, model, request_params
|
|
280
295
|
)
|
{fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_groq.py
RENAMED
|
@@ -49,35 +49,22 @@ class GroqAugmentedLLM(OpenAIAugmentedLLM):
|
|
|
49
49
|
if "object" == json_mode:
|
|
50
50
|
request_params.response_format = {"type": "json_object"}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
format_description += "}"
|
|
69
|
-
|
|
70
|
-
multipart_messages[-1].add_text(
|
|
71
|
-
f"""YOU MUST RESPOND WITH A JSON OBJECT IN EXACTLY THIS FORMAT:
|
|
72
|
-
{format_description}
|
|
73
|
-
|
|
74
|
-
IMPORTANT RULES:
|
|
75
|
-
- Respond ONLY with the JSON object, no other text
|
|
76
|
-
- Do NOT include "properties" or "schema" wrappers
|
|
77
|
-
- Do NOT use code fences or markdown
|
|
78
|
-
- The response must be valid JSON that matches the format above
|
|
79
|
-
- All required fields must be included"""
|
|
80
|
-
)
|
|
52
|
+
# Create a cleaner format description from full schema
|
|
53
|
+
full_schema = model.model_json_schema()
|
|
54
|
+
format_description = self._schema_to_json_object(
|
|
55
|
+
full_schema, full_schema.get("$defs")
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
multipart_messages[-1].add_text(
|
|
59
|
+
f"""YOU MUST RESPOND WITH A JSON OBJECT IN EXACTLY THIS FORMAT:
|
|
60
|
+
{format_description}
|
|
61
|
+
|
|
62
|
+
IMPORTANT RULES:
|
|
63
|
+
- Respond ONLY with the JSON object, no other text
|
|
64
|
+
- Do NOT include "properties" or "schema" wrappers
|
|
65
|
+
- Do NOT use code fences or markdown
|
|
66
|
+
- The response must be valid JSON that matches the format above
|
|
67
|
+
- All required fields must be included""")
|
|
81
68
|
|
|
82
69
|
result: PromptMessageMultipart = await self._apply_prompt_provider_specific(
|
|
83
70
|
multipart_messages, request_params
|
|
@@ -101,3 +88,45 @@ class GroqAugmentedLLM(OpenAIAugmentedLLM):
|
|
|
101
88
|
base_url = self.context.config.groq.base_url
|
|
102
89
|
|
|
103
90
|
return base_url if base_url else GROQ_BASE_URL
|
|
91
|
+
|
|
92
|
+
def _schema_to_json_object(
|
|
93
|
+
self, schema: dict, defs: dict | None = None, visited: set | None = None
|
|
94
|
+
) -> str:
|
|
95
|
+
visited = visited or set()
|
|
96
|
+
|
|
97
|
+
if id(schema) in visited:
|
|
98
|
+
return '"<recursive>"'
|
|
99
|
+
visited.add(id(schema))
|
|
100
|
+
|
|
101
|
+
if "$ref" in schema:
|
|
102
|
+
ref = schema.get("$ref", "")
|
|
103
|
+
if ref.startswith("#/$defs/"):
|
|
104
|
+
target = ref.split("/")[-1]
|
|
105
|
+
if defs and target in defs:
|
|
106
|
+
return self._schema_to_json_object(defs[target], defs, visited)
|
|
107
|
+
return f'"<ref:{ref}>"'
|
|
108
|
+
|
|
109
|
+
schema_type = schema.get("type")
|
|
110
|
+
description = schema.get("description", "")
|
|
111
|
+
required = schema.get("required", [])
|
|
112
|
+
|
|
113
|
+
if schema_type == "object":
|
|
114
|
+
props = schema.get("properties", {})
|
|
115
|
+
result = "{\n"
|
|
116
|
+
for prop_name, prop_schema in props.items():
|
|
117
|
+
is_required = prop_name in required
|
|
118
|
+
prop_str = self._schema_to_json_object(prop_schema, defs, visited)
|
|
119
|
+
if is_required:
|
|
120
|
+
prop_str += " // REQUIRED"
|
|
121
|
+
result += f' "{prop_name}": {prop_str},\n'
|
|
122
|
+
result += "}"
|
|
123
|
+
return result
|
|
124
|
+
elif schema_type == "array":
|
|
125
|
+
items = schema.get("items", {})
|
|
126
|
+
items_str = self._schema_to_json_object(items, defs, visited)
|
|
127
|
+
return f"[{items_str}]"
|
|
128
|
+
elif schema_type:
|
|
129
|
+
comment = f" // {description}" if description else ""
|
|
130
|
+
return f'"{schema_type}"' + comment
|
|
131
|
+
|
|
132
|
+
return '"<unknown>"'
|
{fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/llm/providers/augmented_llm_openai.py
RENAMED
|
@@ -171,7 +171,6 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
|
|
|
171
171
|
async def _process_stream_manual(self, stream, model: str):
|
|
172
172
|
"""Manual stream processing for providers like Ollama that may not work with ChatCompletionStreamState."""
|
|
173
173
|
from openai.types.chat import ChatCompletionMessageToolCall
|
|
174
|
-
from openai.types.chat.chat_completion_message_tool_call import Function
|
|
175
174
|
|
|
176
175
|
# Track estimated output tokens by counting text chunks
|
|
177
176
|
estimated_tokens = 0
|
|
@@ -249,10 +248,10 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
|
|
|
249
248
|
ChatCompletionMessageToolCall(
|
|
250
249
|
id=tool_call_data["id"],
|
|
251
250
|
type=tool_call_data["type"],
|
|
252
|
-
function=
|
|
253
|
-
name
|
|
254
|
-
arguments
|
|
255
|
-
|
|
251
|
+
function={
|
|
252
|
+
"name": tool_call_data["function"]["name"],
|
|
253
|
+
"arguments": tool_call_data["function"]["arguments"],
|
|
254
|
+
},
|
|
256
255
|
)
|
|
257
256
|
)
|
|
258
257
|
|
{fast_agent_mcp-0.2.55 → fast_agent_mcp-0.2.57}/src/mcp_agent/mcp/mcp_agent_client_session.py
RENAMED
|
@@ -14,8 +14,17 @@ from mcp.shared.session import (
|
|
|
14
14
|
SendRequestT,
|
|
15
15
|
)
|
|
16
16
|
from mcp.types import (
|
|
17
|
+
CallToolRequest,
|
|
18
|
+
CallToolRequestParams,
|
|
19
|
+
CallToolResult,
|
|
20
|
+
GetPromptRequest,
|
|
21
|
+
GetPromptRequestParams,
|
|
22
|
+
GetPromptResult,
|
|
17
23
|
Implementation,
|
|
18
24
|
ListRootsResult,
|
|
25
|
+
ReadResourceRequest,
|
|
26
|
+
ReadResourceRequestParams,
|
|
27
|
+
ReadResourceResult,
|
|
19
28
|
Root,
|
|
20
29
|
ToolListChangedNotification,
|
|
21
30
|
)
|
|
@@ -180,8 +189,17 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
|
|
|
180
189
|
)
|
|
181
190
|
return result
|
|
182
191
|
except Exception as e:
|
|
183
|
-
|
|
184
|
-
|
|
192
|
+
# Handle connection errors cleanly
|
|
193
|
+
from anyio import ClosedResourceError
|
|
194
|
+
|
|
195
|
+
if isinstance(e, ClosedResourceError):
|
|
196
|
+
# Show clean offline message and convert to ConnectionError
|
|
197
|
+
from mcp_agent import console
|
|
198
|
+
console.console.print(f"[dim red]MCP server {self.session_server_name} offline[/dim red]")
|
|
199
|
+
raise ConnectionError(f"MCP server {self.session_server_name} offline") from e
|
|
200
|
+
else:
|
|
201
|
+
logger.error(f"send_request failed: {str(e)}")
|
|
202
|
+
raise
|
|
185
203
|
|
|
186
204
|
async def _received_notification(self, notification: ServerNotification) -> None:
|
|
187
205
|
"""
|
|
@@ -226,3 +244,88 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
|
|
|
226
244
|
await self._tool_list_changed_callback(server_name)
|
|
227
245
|
except Exception as e:
|
|
228
246
|
logger.error(f"Error in tool list changed callback: {e}")
|
|
247
|
+
|
|
248
|
+
async def call_tool(
|
|
249
|
+
self,
|
|
250
|
+
name: str,
|
|
251
|
+
arguments: dict | None = None,
|
|
252
|
+
_meta: dict | None = None,
|
|
253
|
+
**kwargs
|
|
254
|
+
) -> CallToolResult:
|
|
255
|
+
"""Call a tool with optional metadata support."""
|
|
256
|
+
if _meta:
|
|
257
|
+
from mcp.types import RequestParams
|
|
258
|
+
|
|
259
|
+
# Safe merge - preserve existing meta fields like progressToken
|
|
260
|
+
existing_meta = kwargs.get('meta')
|
|
261
|
+
if existing_meta:
|
|
262
|
+
meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
|
|
263
|
+
meta_dict.update(_meta)
|
|
264
|
+
meta_obj = RequestParams.Meta(**meta_dict)
|
|
265
|
+
else:
|
|
266
|
+
meta_obj = RequestParams.Meta(**_meta)
|
|
267
|
+
|
|
268
|
+
# Create CallToolRequestParams without meta, then add _meta via model_dump
|
|
269
|
+
params = CallToolRequestParams(name=name, arguments=arguments)
|
|
270
|
+
params_dict = params.model_dump(by_alias=True)
|
|
271
|
+
params_dict["_meta"] = meta_obj.model_dump()
|
|
272
|
+
|
|
273
|
+
# Create request with proper types
|
|
274
|
+
request = CallToolRequest(
|
|
275
|
+
method="tools/call",
|
|
276
|
+
params=CallToolRequestParams.model_validate(params_dict)
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
return await self.send_request(request, CallToolResult)
|
|
280
|
+
else:
|
|
281
|
+
return await super().call_tool(name, arguments, **kwargs)
|
|
282
|
+
|
|
283
|
+
async def read_resource(self, uri: str, _meta: dict | None = None, **kwargs) -> ReadResourceResult:
|
|
284
|
+
"""Read a resource with optional metadata support."""
|
|
285
|
+
if _meta:
|
|
286
|
+
from mcp.types import RequestParams
|
|
287
|
+
|
|
288
|
+
# Safe merge - preserve existing meta fields like progressToken
|
|
289
|
+
existing_meta = kwargs.get('meta')
|
|
290
|
+
if existing_meta:
|
|
291
|
+
meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
|
|
292
|
+
meta_dict.update(_meta)
|
|
293
|
+
meta_obj = RequestParams.Meta(**meta_dict)
|
|
294
|
+
else:
|
|
295
|
+
meta_obj = RequestParams.Meta(**_meta)
|
|
296
|
+
|
|
297
|
+
request = ReadResourceRequest(
|
|
298
|
+
method="resources/read",
|
|
299
|
+
params=ReadResourceRequestParams(uri=uri, meta=meta_obj)
|
|
300
|
+
)
|
|
301
|
+
return await self.send_request(request, ReadResourceResult)
|
|
302
|
+
else:
|
|
303
|
+
return await super().read_resource(uri, **kwargs)
|
|
304
|
+
|
|
305
|
+
async def get_prompt(
|
|
306
|
+
self,
|
|
307
|
+
name: str,
|
|
308
|
+
arguments: dict | None = None,
|
|
309
|
+
_meta: dict | None = None,
|
|
310
|
+
**kwargs
|
|
311
|
+
) -> GetPromptResult:
|
|
312
|
+
"""Get a prompt with optional metadata support."""
|
|
313
|
+
if _meta:
|
|
314
|
+
from mcp.types import RequestParams
|
|
315
|
+
|
|
316
|
+
# Safe merge - preserve existing meta fields like progressToken
|
|
317
|
+
existing_meta = kwargs.get('meta')
|
|
318
|
+
if existing_meta:
|
|
319
|
+
meta_dict = existing_meta.model_dump() if hasattr(existing_meta, 'model_dump') else {}
|
|
320
|
+
meta_dict.update(_meta)
|
|
321
|
+
meta_obj = RequestParams.Meta(**meta_dict)
|
|
322
|
+
else:
|
|
323
|
+
meta_obj = RequestParams.Meta(**_meta)
|
|
324
|
+
|
|
325
|
+
request = GetPromptRequest(
|
|
326
|
+
method="prompts/get",
|
|
327
|
+
params=GetPromptRequestParams(name=name, arguments=arguments, meta=meta_obj)
|
|
328
|
+
)
|
|
329
|
+
return await self.send_request(request, GetPromptResult)
|
|
330
|
+
else:
|
|
331
|
+
return await super().get_prompt(name, arguments, **kwargs)
|