fast-agent-mcp 0.1.11__py3-none-any.whl → 0.1.13__py3-none-any.whl
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.
- {fast_agent_mcp-0.1.11.dist-info → fast_agent_mcp-0.1.13.dist-info}/METADATA +1 -1
- fast_agent_mcp-0.1.13.dist-info/RECORD +164 -0
- mcp_agent/agents/agent.py +37 -102
- mcp_agent/app.py +16 -27
- mcp_agent/cli/commands/bootstrap.py +22 -52
- mcp_agent/cli/commands/config.py +4 -4
- mcp_agent/cli/commands/setup.py +11 -26
- mcp_agent/cli/main.py +6 -9
- mcp_agent/cli/terminal.py +2 -2
- mcp_agent/config.py +1 -5
- mcp_agent/context.py +13 -26
- mcp_agent/context_dependent.py +3 -7
- mcp_agent/core/agent_app.py +46 -122
- mcp_agent/core/agent_types.py +29 -2
- mcp_agent/core/agent_utils.py +3 -5
- mcp_agent/core/decorators.py +6 -14
- mcp_agent/core/enhanced_prompt.py +25 -52
- mcp_agent/core/error_handling.py +1 -1
- mcp_agent/core/exceptions.py +8 -8
- mcp_agent/core/factory.py +30 -72
- mcp_agent/core/fastagent.py +48 -88
- mcp_agent/core/mcp_content.py +10 -19
- mcp_agent/core/prompt.py +8 -15
- mcp_agent/core/proxies.py +34 -25
- mcp_agent/core/request_params.py +46 -0
- mcp_agent/core/types.py +6 -6
- mcp_agent/core/validation.py +16 -16
- mcp_agent/executor/decorator_registry.py +11 -23
- mcp_agent/executor/executor.py +8 -17
- mcp_agent/executor/task_registry.py +2 -4
- mcp_agent/executor/temporal.py +28 -74
- mcp_agent/executor/workflow.py +3 -5
- mcp_agent/executor/workflow_signal.py +17 -29
- mcp_agent/human_input/handler.py +4 -9
- mcp_agent/human_input/types.py +2 -3
- mcp_agent/logging/events.py +1 -5
- mcp_agent/logging/json_serializer.py +7 -6
- mcp_agent/logging/listeners.py +20 -23
- mcp_agent/logging/logger.py +15 -17
- mcp_agent/logging/rich_progress.py +10 -8
- mcp_agent/logging/tracing.py +4 -6
- mcp_agent/logging/transport.py +24 -24
- mcp_agent/mcp/gen_client.py +4 -12
- mcp_agent/mcp/interfaces.py +107 -88
- mcp_agent/mcp/mcp_agent_client_session.py +11 -19
- mcp_agent/mcp/mcp_agent_server.py +8 -10
- mcp_agent/mcp/mcp_aggregator.py +49 -122
- mcp_agent/mcp/mcp_connection_manager.py +16 -37
- mcp_agent/mcp/prompt_message_multipart.py +12 -18
- mcp_agent/mcp/prompt_serialization.py +13 -38
- mcp_agent/mcp/prompts/prompt_load.py +99 -0
- mcp_agent/mcp/prompts/prompt_server.py +21 -128
- mcp_agent/mcp/prompts/prompt_template.py +20 -42
- mcp_agent/mcp/resource_utils.py +8 -17
- mcp_agent/mcp/sampling.py +62 -64
- mcp_agent/mcp/stdio.py +11 -8
- mcp_agent/mcp_server/__init__.py +1 -1
- mcp_agent/mcp_server/agent_server.py +10 -17
- mcp_agent/mcp_server_registry.py +13 -35
- mcp_agent/resources/examples/data-analysis/analysis-campaign.py +1 -1
- mcp_agent/resources/examples/data-analysis/analysis.py +1 -1
- mcp_agent/resources/examples/data-analysis/slides.py +110 -0
- mcp_agent/resources/examples/internal/agent.py +2 -1
- mcp_agent/resources/examples/internal/job.py +2 -1
- mcp_agent/resources/examples/internal/prompt_category.py +1 -1
- mcp_agent/resources/examples/internal/prompt_sizing.py +3 -5
- mcp_agent/resources/examples/internal/sizer.py +2 -1
- mcp_agent/resources/examples/internal/social.py +2 -1
- mcp_agent/resources/examples/mcp_researcher/researcher-eval.py +1 -1
- mcp_agent/resources/examples/prompting/__init__.py +1 -1
- mcp_agent/resources/examples/prompting/agent.py +2 -1
- mcp_agent/resources/examples/prompting/image_server.py +5 -11
- mcp_agent/resources/examples/researcher/researcher-eval.py +1 -1
- mcp_agent/resources/examples/researcher/researcher-imp.py +3 -4
- mcp_agent/resources/examples/researcher/researcher.py +2 -1
- mcp_agent/resources/examples/workflows/agent_build.py +2 -1
- mcp_agent/resources/examples/workflows/chaining.py +2 -1
- mcp_agent/resources/examples/workflows/evaluator.py +2 -1
- mcp_agent/resources/examples/workflows/human_input.py +2 -1
- mcp_agent/resources/examples/workflows/orchestrator.py +2 -1
- mcp_agent/resources/examples/workflows/parallel.py +2 -1
- mcp_agent/resources/examples/workflows/router.py +2 -1
- mcp_agent/resources/examples/workflows/sse.py +1 -1
- mcp_agent/telemetry/usage_tracking.py +2 -1
- mcp_agent/ui/console_display.py +17 -41
- mcp_agent/workflows/embedding/embedding_base.py +1 -4
- mcp_agent/workflows/embedding/embedding_cohere.py +2 -2
- mcp_agent/workflows/embedding/embedding_openai.py +4 -13
- mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py +23 -57
- mcp_agent/workflows/intent_classifier/intent_classifier_base.py +5 -8
- mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py +7 -11
- mcp_agent/workflows/intent_classifier/intent_classifier_embedding_cohere.py +4 -8
- mcp_agent/workflows/intent_classifier/intent_classifier_embedding_openai.py +4 -8
- mcp_agent/workflows/intent_classifier/intent_classifier_llm.py +11 -22
- mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py +3 -3
- mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py +4 -6
- mcp_agent/workflows/llm/anthropic_utils.py +8 -29
- mcp_agent/workflows/llm/augmented_llm.py +94 -332
- mcp_agent/workflows/llm/augmented_llm_anthropic.py +43 -76
- mcp_agent/workflows/llm/augmented_llm_openai.py +46 -100
- mcp_agent/workflows/llm/augmented_llm_passthrough.py +42 -20
- mcp_agent/workflows/llm/augmented_llm_playback.py +8 -6
- mcp_agent/workflows/llm/memory.py +103 -0
- mcp_agent/workflows/llm/model_factory.py +9 -21
- mcp_agent/workflows/llm/openai_utils.py +1 -1
- mcp_agent/workflows/llm/prompt_utils.py +39 -27
- mcp_agent/workflows/llm/providers/multipart_converter_anthropic.py +246 -184
- mcp_agent/workflows/llm/providers/multipart_converter_openai.py +212 -202
- mcp_agent/workflows/llm/providers/openai_multipart.py +19 -61
- mcp_agent/workflows/llm/providers/sampling_converter_anthropic.py +11 -212
- mcp_agent/workflows/llm/providers/sampling_converter_openai.py +13 -215
- mcp_agent/workflows/llm/sampling_converter.py +117 -0
- mcp_agent/workflows/llm/sampling_format_converter.py +12 -29
- mcp_agent/workflows/orchestrator/orchestrator.py +24 -67
- mcp_agent/workflows/orchestrator/orchestrator_models.py +14 -40
- mcp_agent/workflows/parallel/fan_in.py +17 -47
- mcp_agent/workflows/parallel/fan_out.py +6 -12
- mcp_agent/workflows/parallel/parallel_llm.py +9 -26
- mcp_agent/workflows/router/router_base.py +29 -59
- mcp_agent/workflows/router/router_embedding.py +11 -25
- mcp_agent/workflows/router/router_embedding_cohere.py +2 -2
- mcp_agent/workflows/router/router_embedding_openai.py +2 -2
- mcp_agent/workflows/router/router_llm.py +12 -28
- mcp_agent/workflows/swarm/swarm.py +20 -48
- mcp_agent/workflows/swarm/swarm_anthropic.py +2 -2
- mcp_agent/workflows/swarm/swarm_openai.py +2 -2
- fast_agent_mcp-0.1.11.dist-info/RECORD +0 -160
- mcp_agent/workflows/llm/llm_selector.py +0 -345
- {fast_agent_mcp-0.1.11.dist-info → fast_agent_mcp-0.1.13.dist-info}/WHEEL +0 -0
- {fast_agent_mcp-0.1.11.dist-info → fast_agent_mcp-0.1.13.dist-info}/entry_points.txt +0 -0
- {fast_agent_mcp-0.1.11.dist-info → fast_agent_mcp-0.1.13.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: fast-agent-mcp
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.13
|
4
4
|
Summary: Define, Prompt and Test MCP enabled Agents and Workflows
|
5
5
|
Author-email: Shaun Smith <fastagent@llmindset.co.uk>, Sarmad Qadri <sarmad@lastmileai.dev>
|
6
6
|
License: Apache License
|
@@ -0,0 +1,164 @@
|
|
1
|
+
mcp_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
mcp_agent/app.py,sha256=Y2KymSrh3TcTOGD-oS_QPYyNJ6YpOUTSmP_V-hN74bs,10246
|
3
|
+
mcp_agent/config.py,sha256=IHVhC5fsFklY6lta6z2OI2cGyoT-WDF1_d4NU1sj8Mw,10826
|
4
|
+
mcp_agent/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
|
5
|
+
mcp_agent/context.py,sha256=najrCONqeQOI5dFZbne1pHTwzGhV5gdksrddmkO87Aw,7806
|
6
|
+
mcp_agent/context_dependent.py,sha256=m6QqoEoEen2M3Z1ZU3vNqC2x-MypYIqs8gUSadPh21A,1425
|
7
|
+
mcp_agent/event_progress.py,sha256=25iz0yyg-O4glMmtijcYpDdUmtUIKsCmR_8A52GgeC4,2716
|
8
|
+
mcp_agent/mcp_server_registry.py,sha256=8zlO87oTDg7UecQ9-MZriQN34OHTKyQxaTQcILOZbmk,9658
|
9
|
+
mcp_agent/progress_display.py,sha256=GeJU9VUt6qKsFVymG688hCMVCsAygG9ifiiEb5IcbN4,361
|
10
|
+
mcp_agent/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
+
mcp_agent/agents/agent.py,sha256=0_7AqR3ZjKJEIP7b65I_XLpEUrAal8rHtK22UXlUfws,16350
|
12
|
+
mcp_agent/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
+
mcp_agent/cli/__main__.py,sha256=AVZ7tQFhU_sDOGuUGJq8ujgKtcxsYJBJwHbVaaiRDlI,166
|
14
|
+
mcp_agent/cli/main.py,sha256=D4EGpUvmyZzqeKfcczOyELzRjXsnB05Cu0otbEv3V2A,2742
|
15
|
+
mcp_agent/cli/terminal.py,sha256=-bUWq21i-hshmvTPAA1eryy12O0LvvoXe9LQJq7k1Sk,1042
|
16
|
+
mcp_agent/cli/commands/bootstrap.py,sha256=TVzruKtO9L3J0tNvqAxkwyMjNd9AAxnUPNKws9StSmQ,10462
|
17
|
+
mcp_agent/cli/commands/config.py,sha256=jU2gl4d5YESrdUboh3u6mxf7CxVT-_DT_sK8Vuh3ajw,231
|
18
|
+
mcp_agent/cli/commands/setup.py,sha256=RsQNWgCLwZokrj15ACEDkTpR4RHtvUzk28WqDcZ5YNY,6233
|
19
|
+
mcp_agent/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
+
mcp_agent/core/agent_app.py,sha256=zwfQLZrdF6AYQOeUzIGOxfmn3BQWxjYvxMvJ59UZmNQ,27843
|
21
|
+
mcp_agent/core/agent_types.py,sha256=dVOImGJY5xbDFpzLk2Ib4daFsqnm7j06fJN6l34Zwg4,1255
|
22
|
+
mcp_agent/core/agent_utils.py,sha256=4hYdeOml5nX52VCeW7f6KgmfzIh8hHDPPl4QqUMHx3c,1882
|
23
|
+
mcp_agent/core/decorators.py,sha256=hqjMDyApLOZZojXyiBW5KsfhONMcd9QbfHNEYMNko6Y,16072
|
24
|
+
mcp_agent/core/enhanced_prompt.py,sha256=nqny3CG1tgIxR0zQwM-YWS70LFZ8u4uigx5ctD7zXpQ,18518
|
25
|
+
mcp_agent/core/error_handling.py,sha256=xoyS2kLe0eG0bj2eSJCJ2odIhGUve2SbDR7jP-A-uRw,624
|
26
|
+
mcp_agent/core/exceptions.py,sha256=ENAD_qGG67foxy6vDkIvc-lgopIUQy6O7zvNPpPXaQg,2289
|
27
|
+
mcp_agent/core/factory.py,sha256=oNt6WzzCFlQPCRM6NckqCNaeElKgmvbCucJsYpklAw0,18321
|
28
|
+
mcp_agent/core/fastagent.py,sha256=YpK1jO5vpkV50Sb9oV0yIlUvE1Co5mcfzJWLffenbZI,19092
|
29
|
+
mcp_agent/core/mcp_content.py,sha256=-FPG8mDKKuPaw2N-zWlnYFwh7_oAu5RQxKzNdMJ6lhs,6766
|
30
|
+
mcp_agent/core/prompt.py,sha256=wFyJt6J7n-uhJsVCQwaN4ZkzjxA2xFgP5GimN9BTVOc,4238
|
31
|
+
mcp_agent/core/proxies.py,sha256=sMInee2OOb1mTSPwk5jkBUOpXIEqbv66nysOv7k-siU,11072
|
32
|
+
mcp_agent/core/request_params.py,sha256=bEjWo86fqxdiWm2U5nPDd1uCUpcIQO9oiCinhB8lQN0,1185
|
33
|
+
mcp_agent/core/types.py,sha256=GerFhHpupkklPq_w6nGkNyytzTTP9ZJu0fvJIWugEbM,821
|
34
|
+
mcp_agent/core/validation.py,sha256=LZE4OYqUqOYnpv01yxu14V-_nTW2jS6J7WrVK5-Yu7E,8274
|
35
|
+
mcp_agent/eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
36
|
+
mcp_agent/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
|
+
mcp_agent/executor/decorator_registry.py,sha256=LXlmBOSm7QoQV61JIa48qolt2AY0IJy9Tm8Ov6y43VA,3796
|
38
|
+
mcp_agent/executor/executor.py,sha256=MzLSnW9nHrLHYChR3oQa5B8dajQGX26q6-S2BJCxv0o,9507
|
39
|
+
mcp_agent/executor/task_registry.py,sha256=PCALFeYtkQrPBg4RBJnlA0aDI8nHclrNkHGUS4kV3W8,1242
|
40
|
+
mcp_agent/executor/temporal.py,sha256=V-zu1EQxSKpONGzKxlBO8r09cVVW05rLlGa0msKr59s,14576
|
41
|
+
mcp_agent/executor/workflow.py,sha256=T2RzVZ2zD2024zPgQgXERW8zZ3XUv-3dwEeBDZCUkBg,6721
|
42
|
+
mcp_agent/executor/workflow_signal.py,sha256=aOmdkvFbki4hjF0rJZMenvpTYO4jcGAkmV6v-qHcwhw,11116
|
43
|
+
mcp_agent/human_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
+
mcp_agent/human_input/handler.py,sha256=8D8trAEPDDFZZ_JliZhhY47ALbTgtWEbsYcINWtVb_c,3128
|
45
|
+
mcp_agent/human_input/types.py,sha256=RtWBOVzy8vnYoQrc36jRLn8z8N3C4pDPMBN5vF6qM5Y,1476
|
46
|
+
mcp_agent/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
47
|
+
mcp_agent/logging/events.py,sha256=iHTSgrxK3BWnRoej6NhxVL5899MIHr-ktsA7hxMoo9k,3437
|
48
|
+
mcp_agent/logging/json_serializer.py,sha256=qkfxnR9ka6OgvwSpM2CggELbEtzzkApm0s_KYz11RDY,5791
|
49
|
+
mcp_agent/logging/listeners.py,sha256=_S4Jp5_KWp0kUfrx4BxDdNCeQK3MNT3Zi9AaolPri7A,6648
|
50
|
+
mcp_agent/logging/logger.py,sha256=me1Qt-0qqphpE0zKGQ1zs7Li4FvJERBxrey0C47Y14U,10708
|
51
|
+
mcp_agent/logging/rich_progress.py,sha256=oY9fjb4Tyw6887v8sgO6EGIK4lnmIoR3NNxhA_-Ln_M,4893
|
52
|
+
mcp_agent/logging/tracing.py,sha256=d5lSXakzzi5PtQpUkVkOnYaGX8NduGPq__S7vx-Ln8U,5187
|
53
|
+
mcp_agent/logging/transport.py,sha256=m8YsLLu5T8eof_ndpLQs4gHOzqqEL98xsVwBwDsBfxI,17335
|
54
|
+
mcp_agent/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
|
+
mcp_agent/mcp/gen_client.py,sha256=ANLTXPerv4srmrED-8y2MeZIB2kMNBLXPmYrYr7_M40,2964
|
56
|
+
mcp_agent/mcp/interfaces.py,sha256=Xxejrr0RV83ghxv75KBkkxI4bU7LWv5ZLv2KCcaKxRY,5251
|
57
|
+
mcp_agent/mcp/mcp_activity.py,sha256=CajXCFWZ2cKEX9s4-HfNVAj471ePTVs4NOkvmIh65tE,592
|
58
|
+
mcp_agent/mcp/mcp_agent_client_session.py,sha256=YSRcXk1dEekOiG6x7YErPQTXGS_VdnyfMvhUz-qaSSQ,4109
|
59
|
+
mcp_agent/mcp/mcp_agent_server.py,sha256=kmXvJQIXbDbeGelcuLqJpJiToFGMQvOD9R_Lju0D_vQ,1613
|
60
|
+
mcp_agent/mcp/mcp_aggregator.py,sha256=VGpnhrSq9IwFHymh4PYIO2cPvhpT177QccNfr2Yx6LM,36596
|
61
|
+
mcp_agent/mcp/mcp_connection_manager.py,sha256=9b5_GCN4LEg-OYbCpgwiP7HLjKAb9ZAZI_2lPmIk1DI,13379
|
62
|
+
mcp_agent/mcp/mime_utils.py,sha256=difepNR_gpb4MpMLkBRAoyhDk-AjXUHTiqKvT_VwS1o,1805
|
63
|
+
mcp_agent/mcp/prompt_message_multipart.py,sha256=qNSQfabqAMUTgfJpKmqtlwyywsNiE_3qrlfdop7xpgI,1930
|
64
|
+
mcp_agent/mcp/prompt_serialization.py,sha256=VtIZU3YCMgbR_PquflncIJZmGTC_8Z3JUuLWPAOovUA,15658
|
65
|
+
mcp_agent/mcp/resource_utils.py,sha256=E8uuIPG1XAA2HSHHJr0Y74bP-l-THryNpgnZRbRL_IA,6582
|
66
|
+
mcp_agent/mcp/sampling.py,sha256=nwd_hvWaOQvhUVvuEgw0IDz6A-7JtpZvPoW8BFu4wys,4457
|
67
|
+
mcp_agent/mcp/stdio.py,sha256=lh2IIqjn4cJ8OE_fyN-HgExjpq5baArOLfbHwHASO9Q,4530
|
68
|
+
mcp_agent/mcp/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
69
|
+
mcp_agent/mcp/prompts/__main__.py,sha256=gr1Tdz9fcK0EXjEuZg_BOnKUmvhYq5AH2lFZicVyNb0,237
|
70
|
+
mcp_agent/mcp/prompts/prompt_load.py,sha256=3iIg1cDRd9Dw-HdcZ66r1TmsbZEW_AkB7oIh1wCtsO4,3798
|
71
|
+
mcp_agent/mcp/prompts/prompt_server.py,sha256=wydIsaiS7QrZUwpqzFLrH42PRnEeWybRxBL_LsIegPs,13958
|
72
|
+
mcp_agent/mcp/prompts/prompt_template.py,sha256=-iU_QCsnbX86d1yYGqwGfn8O_bpMepf-ouAJL5qRn14,16015
|
73
|
+
mcp_agent/mcp_server/__init__.py,sha256=zBU51ITHIEPScd9nRafnhEddsWqXRPAAvHhkrbRI2_4,155
|
74
|
+
mcp_agent/mcp_server/agent_server.py,sha256=lk22tNYJDSGZj5lb8ypyb0S0z194XK0VFFZFs16i4t4,4422
|
75
|
+
mcp_agent/resources/examples/data-analysis/analysis-campaign.py,sha256=BxNSupMPbX5SyKmSTIE4Ze8t6wEoCfkun29QwbqS9Ww,7277
|
76
|
+
mcp_agent/resources/examples/data-analysis/analysis.py,sha256=F2jjJErQZz1GV95M8KF5SlxLUuyqtFm4ZZ87vNeqoJc,2619
|
77
|
+
mcp_agent/resources/examples/data-analysis/fastagent.config.yaml,sha256=ini94PHyJCfgpjcjHKMMbGuHs6LIj46F1NwY0ll5HVk,1609
|
78
|
+
mcp_agent/resources/examples/data-analysis/slides.py,sha256=uFPdVjfhNJvDn9k2TGI3-jzS8n4POORTpQHgnQEOUoU,4914
|
79
|
+
mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv,sha256=pcMeOL1_r8m8MziE6xgbBrQbjl5Ijo98yycZn7O-dlk,227977
|
80
|
+
mcp_agent/resources/examples/internal/agent.py,sha256=pdVfIhD8rRE7058R-aNGlo7bx7aX0LNptWgo04aGBYs,415
|
81
|
+
mcp_agent/resources/examples/internal/fastagent.config.yaml,sha256=U2s0Asc06wC04FstKnBMeB3J5gIa3xa-Rao-1-74XTk,1935
|
82
|
+
mcp_agent/resources/examples/internal/job.py,sha256=ANF3c01gHJ4O4pIxaAtC3rdgYqVObMySaCUBS4dApW4,4102
|
83
|
+
mcp_agent/resources/examples/internal/prompt_category.py,sha256=kMvqNX_zu0sV-kTaAR3skc_tsq9t8QSEofciK0m4aJc,551
|
84
|
+
mcp_agent/resources/examples/internal/prompt_sizing.py,sha256=bskgxulN57hVkc0V9W0fnjnqSRCK5Tkw9Ggf2MmGIVU,1989
|
85
|
+
mcp_agent/resources/examples/internal/sizer.py,sha256=xP1TBJkp4xIdtJnyk2MP4BufThauzULaMmgnt5Y5Iw4,365
|
86
|
+
mcp_agent/resources/examples/internal/social.py,sha256=pTKcpHAcvA-vQYgjVfDuU1FivCR004Nq4N2GXd5OMs0,1716
|
87
|
+
mcp_agent/resources/examples/mcp_researcher/researcher-eval.py,sha256=C1Oz01CP7JlqkWRkHVEt5EJGHTMUqGKEH3AVhTLfyFY,1815
|
88
|
+
mcp_agent/resources/examples/prompting/__init__.py,sha256=2GSrs9MSDIKo-uDrUI0O311F0UH0RW02ZNdvItJzjfI,50
|
89
|
+
mcp_agent/resources/examples/prompting/agent.py,sha256=yuONn6xkQfk6hjanC9j5_zsIK6JtRP7N-tlgVYiKJnE,616
|
90
|
+
mcp_agent/resources/examples/prompting/fastagent.config.yaml,sha256=UR6LtCpeSIzkHsCrHJW1z-wE7AgmgKozS_IYcfcSAkc,1270
|
91
|
+
mcp_agent/resources/examples/prompting/image_server.py,sha256=yuM8ialpKJHD4GKfqoWAsaWjdCjhA4lS77rt7pIGGAk,1661
|
92
|
+
mcp_agent/resources/examples/researcher/fastagent.config.yaml,sha256=bNOnID9OgdSBTUEhdimKB8LjaZLa1B6igmp-nxx8nr4,2271
|
93
|
+
mcp_agent/resources/examples/researcher/researcher-eval.py,sha256=BUUjHDftelmXfnmhNBNijX82-h-RTaVpFl6d3e0ceGE,1826
|
94
|
+
mcp_agent/resources/examples/researcher/researcher-imp.py,sha256=VczElIn-qSOTY9Npi-YypVV9hMz8im-5qfE6-bSxntQ,7872
|
95
|
+
mcp_agent/resources/examples/researcher/researcher.py,sha256=sPYqmBOSopfMQgJZkpo8oFnXMqF7d7XU94BHugwmjQY,1440
|
96
|
+
mcp_agent/resources/examples/workflows/agent_build.py,sha256=uhCvhD9Qb_IxF0UoAzMOtClbi_0YePVifrFncqrXnn8,2864
|
97
|
+
mcp_agent/resources/examples/workflows/chaining.py,sha256=h5o2bQ1vvycmLfnpi0D1gHgSKk0zJPspntWgJ6b8mME,1217
|
98
|
+
mcp_agent/resources/examples/workflows/evaluator.py,sha256=EburhzPFemZCR-5ofFhbWD1aVoL6eZl2CtvOYCrkSgg,3118
|
99
|
+
mcp_agent/resources/examples/workflows/fastagent.config.yaml,sha256=k2AiapOcK42uqG2nWDVvnSLqN4okQIQZK0FTbZufBpY,809
|
100
|
+
mcp_agent/resources/examples/workflows/human_input.py,sha256=-pSiV12fEKupSESI02fH3PuKgisb4dd-bca6sO9G-1A,614
|
101
|
+
mcp_agent/resources/examples/workflows/orchestrator.py,sha256=kBFU-v6cW26RRlOiEiH6TMLL2KvYDBa_BSwJgHHKoao,2605
|
102
|
+
mcp_agent/resources/examples/workflows/parallel.py,sha256=TJ4MnAf9vNuDhLfSgJ-66n7jV2kO-Xhr-rWufKukpnQ,3105
|
103
|
+
mcp_agent/resources/examples/workflows/router.py,sha256=E4x_-c3l4YW9w1i4ARcDtkdeqIdbWEGfsMzwLYpdbVc,1677
|
104
|
+
mcp_agent/resources/examples/workflows/sse.py,sha256=iv6hpdLiMdGUaw3pu8ceR1PV7nTItN3nUkTkQ_HN85Q,578
|
105
|
+
mcp_agent/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
106
|
+
mcp_agent/telemetry/usage_tracking.py,sha256=aa-me9jusF7ovBSn9PG_RxvDnMRblsGKGn-AgNA8RkQ,510
|
107
|
+
mcp_agent/ui/console_display.py,sha256=bldOSYv0RtbN-QyxtKAodNLqTZW6pxY91pKUj81SWio,9368
|
108
|
+
mcp_agent/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
109
|
+
mcp_agent/workflows/embedding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
110
|
+
mcp_agent/workflows/embedding/embedding_base.py,sha256=DoanBbdoQFOFvv_aNihLJ5yXG2xizi9KHaOnP72UY50,1674
|
111
|
+
mcp_agent/workflows/embedding/embedding_cohere.py,sha256=sZWoL7ZOkyakpkzZTFbKzXzfuyyFKwLNn7n5WZY0uDA,1548
|
112
|
+
mcp_agent/workflows/embedding/embedding_openai.py,sha256=RHqJsEpG3v1cxhupo1BINoFasHfxUTZt0T9ZMIbxtUk,1384
|
113
|
+
mcp_agent/workflows/evaluator_optimizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
|
+
mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py,sha256=yil4pzjnj5OCA6JerMSQTHDdpNr86hDjcz54iWYlo5U,17640
|
115
|
+
mcp_agent/workflows/intent_classifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
116
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_base.py,sha256=e2iNZOnHvP5rjYMs60L9PgyDJyHuhF_IgG6iUTZQlAU,3993
|
117
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py,sha256=WcZB76E-Zpcy6cPlUUvq_n3O0YxsvmApRH3whJYiRQo,3969
|
118
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_embedding_cohere.py,sha256=GC3d0pg0ic21tLsegeJ7MDfuYJbOGn6RTE-2vh2fYHo,1504
|
119
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_embedding_openai.py,sha256=QTZ69JNoIqGACz_2ejbByQkVsciZwWB6W5LzSdZoqZo,1504
|
120
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_llm.py,sha256=ghKMNL1Pgm4bcQe5KK31atE_fDF_n2utckQqCVtapOs,5034
|
121
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py,sha256=PkCUeUGJ3fV3_UI1_utmIE3CKi0Fr7RXi0CgZFBh-Ik,1972
|
122
|
+
mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py,sha256=vK-VfU36Sp_TxUcOSVYBlMBFQ7GzlP3QFXAYanIUX-c,1926
|
123
|
+
mcp_agent/workflows/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
124
|
+
mcp_agent/workflows/llm/anthropic_utils.py,sha256=xHQ7Dt0co88m02lvGiKZdj3p75dVPyI8SQvWe71HBe0,3195
|
125
|
+
mcp_agent/workflows/llm/augmented_llm.py,sha256=47bBW-Nwx_GHp6zsw524L_A5KIpg4coUI9IilFZYquE,23411
|
126
|
+
mcp_agent/workflows/llm/augmented_llm_anthropic.py,sha256=pS245nFqA2fiHk7a0Y1NcMg3fx3ckqRAfpC8uMbCm54,19593
|
127
|
+
mcp_agent/workflows/llm/augmented_llm_openai.py,sha256=5Nay-3fPLqWNSuhKWf3Rs-q9uStloEupkujfqfKHAsE,20177
|
128
|
+
mcp_agent/workflows/llm/augmented_llm_passthrough.py,sha256=2qJusYzoFK0kTsF7G0KFJiHDfcOK1o_nhIeO9RQwB8o,8862
|
129
|
+
mcp_agent/workflows/llm/augmented_llm_playback.py,sha256=XdxGwuNJKFyvVt1WhnbrwX0Ax9Wg5Hs1TuzJ6WAScJw,4362
|
130
|
+
mcp_agent/workflows/llm/memory.py,sha256=UakoBCJBf59JBtB6uyZM0OZjlxDW_VHtSfDs08ibVEc,3312
|
131
|
+
mcp_agent/workflows/llm/model_factory.py,sha256=tngHscO1-pTZPspHju_I_O7trypyR25k13RFOyc3tUw,7571
|
132
|
+
mcp_agent/workflows/llm/openai_utils.py,sha256=nJpyaYdS5Ovmcj73es7t4LpE4ontxjDYbwqNcmEWR6w,1895
|
133
|
+
mcp_agent/workflows/llm/prompt_utils.py,sha256=yWQHykoK13QRF7evHUKxVF0SpVLN-Bsft0Yixzvn0g0,4825
|
134
|
+
mcp_agent/workflows/llm/sampling_converter.py,sha256=KlR6jnmkbDy_o8uDuAdS2kzIv8a8MKJ3_RithPs5MSc,3591
|
135
|
+
mcp_agent/workflows/llm/sampling_format_converter.py,sha256=7FrJi2HaV9czrL4H2wkfF8TsR-Xn119RPNP-aa8QDE8,767
|
136
|
+
mcp_agent/workflows/llm/providers/__init__.py,sha256=qirdqAKIbw3BY1NBdGytH9tvpjOu0QNOqKAG2deD_U4,285
|
137
|
+
mcp_agent/workflows/llm/providers/multipart_converter_anthropic.py,sha256=5MkuEVI86WwSg6wfOrFY-6_d2LKQMZnHEQolnOfrHxk,15727
|
138
|
+
mcp_agent/workflows/llm/providers/multipart_converter_openai.py,sha256=hy9rsq320nct36mXzZ5tYdN5RGrMtw9E4OCVe4pPsik,16459
|
139
|
+
mcp_agent/workflows/llm/providers/openai_multipart.py,sha256=cvosYOI1dPI6p9lrk5D-TpgRrXcHFy9PD_lKE9wIgHg,6589
|
140
|
+
mcp_agent/workflows/llm/providers/sampling_converter_anthropic.py,sha256=h3j6np65p1eW86XiEsnjLcc7V2KAz3pzT-ayvrJZyf8,1632
|
141
|
+
mcp_agent/workflows/llm/providers/sampling_converter_openai.py,sha256=Wqxy7eXNx3oJKfNKG9BiJiqR14S8xaz9y1YygfjN1io,841
|
142
|
+
mcp_agent/workflows/orchestrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
143
|
+
mcp_agent/workflows/orchestrator/orchestrator.py,sha256=1HDOtOonfCsqeK_Bqp3G5JwWClCEzEN22-oNcfcLU2w,21483
|
144
|
+
mcp_agent/workflows/orchestrator/orchestrator_models.py,sha256=M5sFH6JlneNaBXiD7L-rQYKn8yJgM8vDsX6ampmXz5U,7113
|
145
|
+
mcp_agent/workflows/orchestrator/orchestrator_prompts.py,sha256=EXKEI174sshkZyPPEnWbwwNafzSPuA39MXL7iqG9cWc,9106
|
146
|
+
mcp_agent/workflows/parallel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
147
|
+
mcp_agent/workflows/parallel/fan_in.py,sha256=IKxQGvzR6oE-Z3KZ2a5AndaOwIH87JcbYTpZ15LFZnE,12804
|
148
|
+
mcp_agent/workflows/parallel/fan_out.py,sha256=LSOjwUaQj-mB3ldjtpR6LNHjsspvdxGSCn1AiIO-OO0,6957
|
149
|
+
mcp_agent/workflows/parallel/parallel_llm.py,sha256=VRcBXW_TvT-PAGniffzVAtZZPKgl1mIBBH4bgI59DtY,5601
|
150
|
+
mcp_agent/workflows/router/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
151
|
+
mcp_agent/workflows/router/router_base.py,sha256=9D5W9_rqB_nnPU1S1YpGcFjsrBlagGY0T2MA7kLIznc,13908
|
152
|
+
mcp_agent/workflows/router/router_embedding.py,sha256=GBCakhNIQL3GJhHPsCOqm4EfR7G27Ijw3Pyk-7hyHtI,7814
|
153
|
+
mcp_agent/workflows/router/router_embedding_cohere.py,sha256=xZImdyymuYvP08z304Z1CoUkCvAKL4xOS5TW7IOwB9M,1983
|
154
|
+
mcp_agent/workflows/router/router_embedding_openai.py,sha256=w7qoOc8jM1XxP6-1GAK3ZI1Noy4B00vYrw_R9zmKiuU,1983
|
155
|
+
mcp_agent/workflows/router/router_llm.py,sha256=JwtEoKiEmnoY08ue8vV_6kJY0FdlbbnzgUWVmEsbHBs,10778
|
156
|
+
mcp_agent/workflows/swarm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
157
|
+
mcp_agent/workflows/swarm/swarm.py,sha256=y3TiH_leHPDDOxFmynfBxs1N2NkB_4wwXYur4TYr400,10774
|
158
|
+
mcp_agent/workflows/swarm/swarm_anthropic.py,sha256=tgbG9lERqAcRPSFBB85ewxlz1C01KZsCEkFUoGvPbw0,1624
|
159
|
+
mcp_agent/workflows/swarm/swarm_openai.py,sha256=653ILzYcJUnlequKDv03_wCRt83AH5sn2QKPAC60opE,1596
|
160
|
+
fast_agent_mcp-0.1.13.dist-info/METADATA,sha256=5_QyvfF957PGwZPdrO8I5FXyQut0KkXoOthPdRpQgSU,29678
|
161
|
+
fast_agent_mcp-0.1.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
162
|
+
fast_agent_mcp-0.1.13.dist-info/entry_points.txt,sha256=qPM7vwtN1_KmP3dXehxgiCxUBHtqP7yfenZigztvY-w,226
|
163
|
+
fast_agent_mcp-0.1.13.dist-info/licenses/LICENSE,sha256=cN3FxDURL9XuzE5mhK9L2paZo82LTfjwCYVT7e3j0e4,10939
|
164
|
+
fast_agent_mcp-0.1.13.dist-info/RECORD,,
|
mcp_agent/agents/agent.py
CHANGED
@@ -1,30 +1,30 @@
|
|
1
1
|
import asyncio
|
2
2
|
import uuid
|
3
|
-
from
|
4
|
-
from typing import Callable, Dict, List, Optional, TypeVar, Union, TYPE_CHECKING
|
3
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, TypeVar, Union
|
5
4
|
|
6
5
|
from mcp.server.fastmcp.tools import Tool as FastTool
|
7
6
|
from mcp.types import (
|
8
7
|
CallToolResult,
|
8
|
+
EmbeddedResource,
|
9
9
|
ListToolsResult,
|
10
|
+
ReadResourceResult,
|
10
11
|
TextContent,
|
11
12
|
Tool,
|
12
|
-
EmbeddedResource,
|
13
|
-
ReadResourceResult,
|
14
13
|
)
|
15
|
-
from mcp_agent.mcp.prompt_message_multipart import PromptMessageMultipart
|
16
14
|
|
15
|
+
from mcp_agent.core.agent_types import AgentConfig
|
17
16
|
from mcp_agent.core.exceptions import PromptExitError
|
18
|
-
from mcp_agent.
|
19
|
-
from mcp_agent.workflows.llm.augmented_llm import RequestParams
|
17
|
+
from mcp_agent.core.request_params import RequestParams
|
20
18
|
from mcp_agent.human_input.types import (
|
19
|
+
HUMAN_INPUT_SIGNAL_NAME,
|
21
20
|
HumanInputCallback,
|
22
21
|
HumanInputRequest,
|
23
22
|
HumanInputResponse,
|
24
|
-
HUMAN_INPUT_SIGNAL_NAME,
|
25
23
|
)
|
26
|
-
from mcp_agent.workflows.llm.augmented_llm import AugmentedLLM
|
27
24
|
from mcp_agent.logging.logger import get_logger
|
25
|
+
from mcp_agent.mcp.mcp_aggregator import MCPAggregator
|
26
|
+
from mcp_agent.mcp.prompt_message_multipart import PromptMessageMultipart
|
27
|
+
from mcp_agent.workflows.llm.augmented_llm import AugmentedLLMProtocol
|
28
28
|
|
29
29
|
if TYPE_CHECKING:
|
30
30
|
from mcp_agent.context import Context
|
@@ -33,33 +33,11 @@ import traceback
|
|
33
33
|
logger = get_logger(__name__)
|
34
34
|
|
35
35
|
# Define a TypeVar for AugmentedLLM and its subclasses
|
36
|
-
LLM = TypeVar("LLM", bound=
|
36
|
+
LLM = TypeVar("LLM", bound=AugmentedLLMProtocol)
|
37
37
|
|
38
38
|
HUMAN_INPUT_TOOL_NAME = "__human_input__"
|
39
39
|
|
40
40
|
|
41
|
-
@dataclass
|
42
|
-
class AgentConfig:
|
43
|
-
"""Configuration for an Agent instance"""
|
44
|
-
|
45
|
-
name: str
|
46
|
-
instruction: Union[str, Callable[[Dict], str]]
|
47
|
-
servers: List[str]
|
48
|
-
model: Optional[str] = None
|
49
|
-
use_history: bool = True
|
50
|
-
default_request_params: Optional[RequestParams] = None
|
51
|
-
human_input: bool = False
|
52
|
-
|
53
|
-
def __post_init__(self):
|
54
|
-
"""Ensure default_request_params exists with proper history setting"""
|
55
|
-
|
56
|
-
if self.default_request_params is None:
|
57
|
-
self.default_request_params = RequestParams(use_history=self.use_history)
|
58
|
-
else:
|
59
|
-
# Override the request params history setting if explicitly configured
|
60
|
-
self.default_request_params.use_history = self.use_history
|
61
|
-
|
62
|
-
|
63
41
|
class Agent(MCPAggregator):
|
64
42
|
"""
|
65
43
|
An Agent is an entity that has access to a set of MCP servers and can interact with them.
|
@@ -68,17 +46,15 @@ class Agent(MCPAggregator):
|
|
68
46
|
|
69
47
|
def __init__(
|
70
48
|
self,
|
71
|
-
config: Union[
|
72
|
-
AgentConfig, str
|
73
|
-
], # Can be AgentConfig or backward compatible str name
|
49
|
+
config: Union[AgentConfig, str], # Can be AgentConfig or backward compatible str name
|
74
50
|
instruction: Optional[Union[str, Callable[[Dict], str]]] = None,
|
75
51
|
server_names: Optional[List[str]] = None,
|
76
52
|
functions: Optional[List[Callable]] = None,
|
77
53
|
connection_persistence: bool = True,
|
78
54
|
human_input_callback: Optional[HumanInputCallback] = None,
|
79
55
|
context: Optional["Context"] = None,
|
80
|
-
**kwargs,
|
81
|
-
):
|
56
|
+
**kwargs: dict[str, Any],
|
57
|
+
) -> None:
|
82
58
|
# Handle backward compatibility where first arg was name
|
83
59
|
if isinstance(config, str):
|
84
60
|
self.config = AgentConfig(
|
@@ -117,14 +93,12 @@ class Agent(MCPAggregator):
|
|
117
93
|
if self.context.human_input_handler:
|
118
94
|
self.human_input_callback = self.context.human_input_handler
|
119
95
|
|
120
|
-
async def initialize(self):
|
96
|
+
async def initialize(self) -> None:
|
121
97
|
"""
|
122
98
|
Initialize the agent and connect to the MCP servers.
|
123
99
|
NOTE: This method is called automatically when the agent is used as an async context manager.
|
124
100
|
"""
|
125
|
-
await (
|
126
|
-
self.__aenter__()
|
127
|
-
) # This initializes the connection manager and loads the servers
|
101
|
+
await self.__aenter__() # This initializes the connection manager and loads the servers
|
128
102
|
|
129
103
|
for function in self.functions:
|
130
104
|
tool: FastTool = FastTool.from_function(function)
|
@@ -142,11 +116,9 @@ class Agent(MCPAggregator):
|
|
142
116
|
Returns:
|
143
117
|
An instance of AugmentedLLM or one of its subclasses.
|
144
118
|
"""
|
145
|
-
return llm_factory(
|
146
|
-
agent=self, default_request_params=self._default_request_params
|
147
|
-
)
|
119
|
+
return llm_factory(agent=self, default_request_params=self._default_request_params)
|
148
120
|
|
149
|
-
async def shutdown(self):
|
121
|
+
async def shutdown(self) -> None:
|
150
122
|
"""
|
151
123
|
Shutdown the agent and close all MCP server connections.
|
152
124
|
NOTE: This method is called automatically when the agent is used as an async context manager.
|
@@ -176,8 +148,9 @@ class Agent(MCPAggregator):
|
|
176
148
|
request.metadata = {"agent_name": self.name}
|
177
149
|
self.logger.debug("Requesting human input:", data=request)
|
178
150
|
|
179
|
-
async def call_callback_and_signal():
|
151
|
+
async def call_callback_and_signal() -> None:
|
180
152
|
try:
|
153
|
+
assert self.human_input_callback is not None
|
181
154
|
user_input = await self.human_input_callback(request)
|
182
155
|
|
183
156
|
self.logger.debug("Received human input:", data=user_input)
|
@@ -190,9 +163,7 @@ class Agent(MCPAggregator):
|
|
190
163
|
payload={"exit_requested": True, "error": str(e)},
|
191
164
|
)
|
192
165
|
except Exception as e:
|
193
|
-
await self.executor.signal(
|
194
|
-
request_id, payload=f"Error getting human input: {str(e)}"
|
195
|
-
)
|
166
|
+
await self.executor.signal(request_id, payload=f"Error getting human input: {str(e)}")
|
196
167
|
|
197
168
|
asyncio.create_task(call_callback_and_signal())
|
198
169
|
|
@@ -209,9 +180,7 @@ class Agent(MCPAggregator):
|
|
209
180
|
)
|
210
181
|
|
211
182
|
if isinstance(result, dict) and result.get("exit_requested", False):
|
212
|
-
raise PromptExitError(
|
213
|
-
result.get("error", "User requested to exit FastAgent session")
|
214
|
-
)
|
183
|
+
raise PromptExitError(result.get("error", "User requested to exit FastAgent session"))
|
215
184
|
self.logger.debug("Received human input signal", data=result)
|
216
185
|
return result
|
217
186
|
|
@@ -249,9 +218,7 @@ class Agent(MCPAggregator):
|
|
249
218
|
return result
|
250
219
|
|
251
220
|
# todo would prefer to use tool_name to disambiguate agent name
|
252
|
-
async def call_tool(
|
253
|
-
self, name: str, arguments: dict | None = None
|
254
|
-
) -> CallToolResult:
|
221
|
+
async def call_tool(self, name: str, arguments: dict | None = None) -> CallToolResult:
|
255
222
|
if name == HUMAN_INPUT_TOOL_NAME:
|
256
223
|
# Call the human input tool
|
257
224
|
return await self._call_human_input_tool(arguments)
|
@@ -263,9 +230,7 @@ class Agent(MCPAggregator):
|
|
263
230
|
else:
|
264
231
|
return await super().call_tool(name, arguments)
|
265
232
|
|
266
|
-
async def _call_human_input_tool(
|
267
|
-
self, arguments: dict | None = None
|
268
|
-
) -> CallToolResult:
|
233
|
+
async def _call_human_input_tool(self, arguments: dict | None = None) -> CallToolResult:
|
269
234
|
# Handle human input request
|
270
235
|
try:
|
271
236
|
# Make sure arguments is not None
|
@@ -287,17 +252,9 @@ class Agent(MCPAggregator):
|
|
287
252
|
result = await self.request_human_input(request=request)
|
288
253
|
|
289
254
|
# Use response attribute if available, otherwise use the result directly
|
290
|
-
response_text = (
|
291
|
-
result.response
|
292
|
-
if isinstance(result, HumanInputResponse)
|
293
|
-
else str(result)
|
294
|
-
)
|
255
|
+
response_text = result.response if isinstance(result, HumanInputResponse) else str(result)
|
295
256
|
|
296
|
-
return CallToolResult(
|
297
|
-
content=[
|
298
|
-
TextContent(type="text", text=f"Human response: {response_text}")
|
299
|
-
]
|
300
|
-
)
|
257
|
+
return CallToolResult(content=[TextContent(type="text", text=f"Human response: {response_text}")])
|
301
258
|
|
302
259
|
except PromptExitError:
|
303
260
|
raise
|
@@ -316,21 +273,10 @@ class Agent(MCPAggregator):
|
|
316
273
|
|
317
274
|
return CallToolResult(
|
318
275
|
isError=True,
|
319
|
-
content=[
|
320
|
-
TextContent(
|
321
|
-
type="text", text=f"Error requesting human input: {str(e)}"
|
322
|
-
)
|
323
|
-
],
|
276
|
+
content=[TextContent(type="text", text=f"Error requesting human input: {str(e)}")],
|
324
277
|
)
|
325
278
|
|
326
|
-
async def
|
327
|
-
self, server_name: str, resource_name: str
|
328
|
-
) -> ReadResourceResult:
|
329
|
-
return None
|
330
|
-
|
331
|
-
async def apply_prompt(
|
332
|
-
self, prompt_name: str, arguments: dict[str, str] = None
|
333
|
-
) -> str:
|
279
|
+
async def apply_prompt(self, prompt_name: str, arguments: dict[str, str] | None) -> str:
|
334
280
|
"""
|
335
281
|
Apply an MCP Server Prompt by name and return the assistant's response.
|
336
282
|
Will search all available servers for the prompt if not namespaced.
|
@@ -354,9 +300,7 @@ class Agent(MCPAggregator):
|
|
354
300
|
prompt_result = await self.get_prompt(prompt_name, arguments)
|
355
301
|
|
356
302
|
if not prompt_result or not prompt_result.messages:
|
357
|
-
error_msg =
|
358
|
-
f"Prompt '{prompt_name}' could not be found or contains no messages"
|
359
|
-
)
|
303
|
+
error_msg = f"Prompt '{prompt_name}' could not be found or contains no messages"
|
360
304
|
self.logger.warning(error_msg)
|
361
305
|
return error_msg
|
362
306
|
|
@@ -395,16 +339,10 @@ class Agent(MCPAggregator):
|
|
395
339
|
resource_result = await server.get_resource(resource_name)
|
396
340
|
return resource_result
|
397
341
|
except Exception as e:
|
398
|
-
self.logger.error(
|
399
|
-
|
400
|
-
)
|
401
|
-
raise ValueError(
|
402
|
-
f"Failed to retrieve resource '{resource_name}' from server '{server_name}': {str(e)}"
|
403
|
-
)
|
342
|
+
self.logger.error(f"Error retrieving resource '{resource_name}' from server '{server_name}': {str(e)}")
|
343
|
+
raise ValueError(f"Failed to retrieve resource '{resource_name}' from server '{server_name}': {str(e)}")
|
404
344
|
|
405
|
-
async def get_embedded_resources(
|
406
|
-
self, server_name: str, resource_name: str
|
407
|
-
) -> List[EmbeddedResource]:
|
345
|
+
async def get_embedded_resources(self, server_name: str, resource_name: str) -> List[EmbeddedResource]:
|
408
346
|
"""
|
409
347
|
Get a resource from an MCP server and return it as a list of embedded resources ready for use in prompts.
|
410
348
|
|
@@ -419,20 +357,19 @@ class Agent(MCPAggregator):
|
|
419
357
|
ValueError: If the server doesn't exist or the resource couldn't be found
|
420
358
|
"""
|
421
359
|
# Get the raw resource result
|
422
|
-
result: ReadResourceResult = await super().get_resource(
|
423
|
-
server_name, resource_name
|
424
|
-
)
|
360
|
+
result: ReadResourceResult = await super().get_resource(server_name, resource_name)
|
425
361
|
|
426
362
|
# Convert each resource content to an EmbeddedResource
|
427
363
|
embedded_resources: List[EmbeddedResource] = []
|
428
364
|
for resource_content in result.contents:
|
429
|
-
embedded_resource = EmbeddedResource(
|
430
|
-
type="resource", resource=resource_content, annotations=None
|
431
|
-
)
|
365
|
+
embedded_resource = EmbeddedResource(type="resource", resource=resource_content, annotations=None)
|
432
366
|
embedded_resources.append(embedded_resource)
|
433
367
|
|
434
368
|
return embedded_resources
|
435
369
|
|
370
|
+
async def apply_prompt_messages(self, prompts: List[PromptMessageMultipart], request_params: RequestParams | None) -> str:
|
371
|
+
return self._llm.apply_prompt_messages(prompts, request_params)
|
372
|
+
|
436
373
|
async def with_resource(
|
437
374
|
self,
|
438
375
|
prompt_content: Union[str, PromptMessageMultipart],
|
@@ -451,9 +388,7 @@ class Agent(MCPAggregator):
|
|
451
388
|
The agent's response as a string
|
452
389
|
"""
|
453
390
|
# Get the embedded resources
|
454
|
-
embedded_resources: List[EmbeddedResource] = await self.get_embedded_resources(
|
455
|
-
server_name, resource_name
|
456
|
-
)
|
391
|
+
embedded_resources: List[EmbeddedResource] = await self.get_embedded_resources(server_name, resource_name)
|
457
392
|
|
458
393
|
# Create or update the prompt message
|
459
394
|
prompt: PromptMessageMultipart
|
mcp_agent/app.py
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
-
from typing import Any, Dict, Optional, Type, TypeVar, Callable
|
2
|
-
from datetime import timedelta
|
3
1
|
import asyncio
|
4
2
|
from contextlib import asynccontextmanager
|
3
|
+
from datetime import timedelta
|
4
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Type, TypeVar
|
5
5
|
|
6
|
-
from mcp import ServerSession
|
7
|
-
from mcp_agent.context import Context, initialize_context, cleanup_context
|
8
6
|
from mcp_agent.config import Settings
|
7
|
+
from mcp_agent.context import Context, cleanup_context, initialize_context
|
9
8
|
from mcp_agent.event_progress import ProgressAction
|
10
|
-
from mcp_agent.logging.logger import get_logger
|
11
9
|
from mcp_agent.executor.workflow_signal import SignalWaitCallback
|
12
|
-
from mcp_agent.human_input.types import HumanInputCallback
|
13
10
|
from mcp_agent.human_input.handler import console_input_callback
|
14
|
-
from mcp_agent.
|
11
|
+
from mcp_agent.human_input.types import HumanInputCallback
|
12
|
+
from mcp_agent.logging.logger import get_logger
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from mcp import ServerSession
|
15
16
|
|
16
17
|
R = TypeVar("R")
|
17
18
|
|
@@ -44,8 +45,7 @@ class MCPApp:
|
|
44
45
|
human_input_callback: Optional[HumanInputCallback] = console_input_callback,
|
45
46
|
signal_notification: Optional[SignalWaitCallback] = None,
|
46
47
|
upstream_session: Optional["ServerSession"] = None,
|
47
|
-
|
48
|
-
):
|
48
|
+
) -> None:
|
49
49
|
"""
|
50
50
|
Initialize the application with a name and optional settings.
|
51
51
|
Args:
|
@@ -55,7 +55,6 @@ class MCPApp:
|
|
55
55
|
human_input_callback: Callback for handling human input
|
56
56
|
signal_notification: Callback for getting notified on workflow signals/events.
|
57
57
|
upstream_session: Optional upstream session if the MCPApp is running as a server to an MCP client.
|
58
|
-
initialize_model_selector: Initializes the built-in ModelSelector to help with model selection. Defaults to False.
|
59
58
|
"""
|
60
59
|
self.name = name
|
61
60
|
|
@@ -64,7 +63,6 @@ class MCPApp:
|
|
64
63
|
self._human_input_callback = human_input_callback
|
65
64
|
self._signal_notification = signal_notification
|
66
65
|
self._upstream_session = upstream_session
|
67
|
-
self._model_selector = model_selector
|
68
66
|
|
69
67
|
self._workflows: Dict[str, Type] = {} # id to workflow class
|
70
68
|
self._logger = None
|
@@ -74,9 +72,7 @@ class MCPApp:
|
|
74
72
|
@property
|
75
73
|
def context(self) -> Context:
|
76
74
|
if self._context is None:
|
77
|
-
raise RuntimeError(
|
78
|
-
"MCPApp not initialized, please call initialize() first, or use async with app.run()."
|
79
|
-
)
|
75
|
+
raise RuntimeError("MCPApp not initialized, please call initialize() first, or use async with app.run().")
|
80
76
|
return self._context
|
81
77
|
|
82
78
|
@property
|
@@ -100,7 +96,7 @@ class MCPApp:
|
|
100
96
|
return self._context.upstream_session
|
101
97
|
|
102
98
|
@upstream_session.setter
|
103
|
-
def upstream_session(self, value):
|
99
|
+
def upstream_session(self, value) -> None:
|
104
100
|
self._context.upstream_session = value
|
105
101
|
|
106
102
|
@property
|
@@ -117,7 +113,7 @@ class MCPApp:
|
|
117
113
|
self._logger = get_logger(f"mcp_agent.{self.name}")
|
118
114
|
return self._logger
|
119
115
|
|
120
|
-
async def initialize(self):
|
116
|
+
async def initialize(self) -> None:
|
121
117
|
"""Initialize the application."""
|
122
118
|
if self._initialized:
|
123
119
|
return
|
@@ -128,7 +124,6 @@ class MCPApp:
|
|
128
124
|
self._context.human_input_handler = self._human_input_callback
|
129
125
|
self._context.signal_notification = self._signal_notification
|
130
126
|
self._context.upstream_session = self._upstream_session
|
131
|
-
self._context.model_selector = self._model_selector
|
132
127
|
|
133
128
|
self._initialized = True
|
134
129
|
self.logger.info(
|
@@ -140,7 +135,7 @@ class MCPApp:
|
|
140
135
|
},
|
141
136
|
)
|
142
137
|
|
143
|
-
async def cleanup(self):
|
138
|
+
async def cleanup(self) -> None:
|
144
139
|
"""Cleanup application resources."""
|
145
140
|
if not self._initialized:
|
146
141
|
return
|
@@ -178,9 +173,7 @@ class MCPApp:
|
|
178
173
|
finally:
|
179
174
|
await self.cleanup()
|
180
175
|
|
181
|
-
def workflow(
|
182
|
-
self, cls: Type, *args, workflow_id: str | None = None, **kwargs
|
183
|
-
) -> Type:
|
176
|
+
def workflow(self, cls: Type, *args, workflow_id: str | None = None, **kwargs) -> Type:
|
184
177
|
"""
|
185
178
|
Decorator for a workflow class. By default it's a no-op,
|
186
179
|
but different executors can use this to customize behavior
|
@@ -192,9 +185,7 @@ class MCPApp:
|
|
192
185
|
"""
|
193
186
|
decorator_registry = self.context.decorator_registry
|
194
187
|
execution_engine = self.engine
|
195
|
-
workflow_defn_decorator = decorator_registry.get_workflow_defn_decorator(
|
196
|
-
execution_engine
|
197
|
-
)
|
188
|
+
workflow_defn_decorator = decorator_registry.get_workflow_defn_decorator(execution_engine)
|
198
189
|
|
199
190
|
if workflow_defn_decorator:
|
200
191
|
return workflow_defn_decorator(cls, *args, **kwargs)
|
@@ -216,9 +207,7 @@ class MCPApp:
|
|
216
207
|
|
217
208
|
decorator_registry = self.context.decorator_registry
|
218
209
|
execution_engine = self.engine
|
219
|
-
workflow_run_decorator = decorator_registry.get_workflow_run_decorator(
|
220
|
-
execution_engine
|
221
|
-
)
|
210
|
+
workflow_run_decorator = decorator_registry.get_workflow_run_decorator(execution_engine)
|
222
211
|
|
223
212
|
if workflow_run_decorator:
|
224
213
|
return workflow_run_decorator(fn)
|