fast-agent-mcp 0.2.39__py3-none-any.whl → 0.2.41__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.

Potentially problematic release.


This version of fast-agent-mcp might be problematic. Click here for more details.

Files changed (41) hide show
  1. {fast_agent_mcp-0.2.39.dist-info → fast_agent_mcp-0.2.41.dist-info}/METADATA +1 -1
  2. {fast_agent_mcp-0.2.39.dist-info → fast_agent_mcp-0.2.41.dist-info}/RECORD +41 -37
  3. {fast_agent_mcp-0.2.39.dist-info → fast_agent_mcp-0.2.41.dist-info}/entry_points.txt +2 -2
  4. mcp_agent/cli/__main__.py +29 -3
  5. mcp_agent/cli/commands/check_config.py +140 -81
  6. mcp_agent/cli/commands/go.py +151 -38
  7. mcp_agent/cli/commands/quickstart.py +8 -4
  8. mcp_agent/cli/commands/server_helpers.py +106 -0
  9. mcp_agent/cli/constants.py +25 -0
  10. mcp_agent/cli/main.py +1 -1
  11. mcp_agent/config.py +94 -44
  12. mcp_agent/core/agent_app.py +104 -15
  13. mcp_agent/core/agent_types.py +1 -0
  14. mcp_agent/core/direct_decorators.py +9 -0
  15. mcp_agent/core/direct_factory.py +18 -4
  16. mcp_agent/core/enhanced_prompt.py +165 -13
  17. mcp_agent/core/fastagent.py +4 -0
  18. mcp_agent/core/interactive_prompt.py +37 -37
  19. mcp_agent/core/usage_display.py +11 -1
  20. mcp_agent/core/validation.py +21 -2
  21. mcp_agent/human_input/elicitation_form.py +55 -22
  22. mcp_agent/llm/augmented_llm.py +28 -9
  23. mcp_agent/llm/augmented_llm_silent.py +48 -0
  24. mcp_agent/llm/model_database.py +20 -0
  25. mcp_agent/llm/model_factory.py +12 -0
  26. mcp_agent/llm/provider_key_manager.py +22 -8
  27. mcp_agent/llm/provider_types.py +19 -12
  28. mcp_agent/llm/providers/augmented_llm_anthropic.py +7 -2
  29. mcp_agent/llm/providers/augmented_llm_azure.py +7 -1
  30. mcp_agent/llm/providers/augmented_llm_google_native.py +4 -1
  31. mcp_agent/llm/providers/augmented_llm_openai.py +9 -2
  32. mcp_agent/llm/providers/augmented_llm_xai.py +38 -0
  33. mcp_agent/llm/usage_tracking.py +28 -3
  34. mcp_agent/mcp/mcp_agent_client_session.py +2 -0
  35. mcp_agent/mcp/mcp_aggregator.py +38 -44
  36. mcp_agent/mcp/sampling.py +15 -11
  37. mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -6
  38. mcp_agent/resources/examples/workflows/router.py +9 -0
  39. mcp_agent/ui/console_display.py +125 -13
  40. {fast_agent_mcp-0.2.39.dist-info → fast_agent_mcp-0.2.41.dist-info}/WHEEL +0 -0
  41. {fast_agent_mcp-0.2.39.dist-info → fast_agent_mcp-0.2.41.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.2.39
3
+ Version: 0.2.41
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  mcp_agent/__init__.py,sha256=18T0AG0W9sJhTY38O9GFFOzliDhxx9p87CvRyti9zbw,1620
2
2
  mcp_agent/app.py,sha256=3mtHP1nRQcRaKhhxgTmCOv00alh70nT7UxNA8bN47QE,5560
3
- mcp_agent/config.py,sha256=QzApCp2DaSchi11Hv_BrGAAbLixHuGGMDlDyWre_tdo,16669
3
+ mcp_agent/config.py,sha256=3XjoGlBzL7nItt6oxzsJb1pEKXWB-bHkdkc8F0hDX7o,18394
4
4
  mcp_agent/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
5
5
  mcp_agent/context.py,sha256=9s1F1-UfcI8rz9Yxm6EXHZ4cInuE_cOl_HFu8N8k3yc,7497
6
6
  mcp_agent/context_dependent.py,sha256=QXfhw3RaQCKfscEEBRGuZ3sdMWqkgShz2jJ1ivGGX1I,1455
@@ -19,66 +19,70 @@ mcp_agent/agents/workflow/orchestrator_prompts.py,sha256=EXKEI174sshkZyPPEnWbwwN
19
19
  mcp_agent/agents/workflow/parallel_agent.py,sha256=JaQFp35nmAdoBRLAwx8BfnK7kirVq9PMw24LQ3ZEzoc,7705
20
20
  mcp_agent/agents/workflow/router_agent.py,sha256=6tvI5D_ssKNZ6-tNxYHmw6r6DAQMYgqz3PZKZz2rC44,9466
21
21
  mcp_agent/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- mcp_agent/cli/__main__.py,sha256=AVZ7tQFhU_sDOGuUGJq8ujgKtcxsYJBJwHbVaaiRDlI,166
23
- mcp_agent/cli/main.py,sha256=XjrgXMBaPKkVqAFo8T9LJz6Tp1-ivrKDOuNYWke99YA,3090
22
+ mcp_agent/cli/__main__.py,sha256=KyZnfXkml0KsOnfy8T9JDYNVNynKix9cslwuafmKNbc,1089
23
+ mcp_agent/cli/constants.py,sha256=KawdkaN289nVB02DKPB4IVUJ8-fohIUD0gLfOp0P7B8,551
24
+ mcp_agent/cli/main.py,sha256=Hfa6yn47gfx_d6TUEbzDz68k2gaIS9vvN0yDbVOUgnc,3181
24
25
  mcp_agent/cli/terminal.py,sha256=GRwD-RGW7saIz2IOWZn5vD6JjiArscELBThm1GTFkuI,1065
25
- mcp_agent/cli/commands/check_config.py,sha256=JKOHniuMlU1bJ5vmyY7g05HDP7ZYGSQktl19bNx5I4Y,18775
26
- mcp_agent/cli/commands/go.py,sha256=LIsOJQuTdfCUcNm7JT-NQDU8cI-GCnYwYjN2VOWxvqs,8658
27
- mcp_agent/cli/commands/quickstart.py,sha256=RBqlvKZVpF_dcmtVGpUXzzpWQ_B7ZypXXSg6Him-iuQ,16313
26
+ mcp_agent/cli/commands/check_config.py,sha256=15YK0mtDQbVopnMm3HBjOeY2-00FUHj6tt8RvaemKmI,21081
27
+ mcp_agent/cli/commands/go.py,sha256=mVNtupzDr-qb95cv2rp9JLC2_5-QQgv8x7uyTwYH7wY,13240
28
+ mcp_agent/cli/commands/quickstart.py,sha256=lcozUGP9RRO8xZaayJg4pQNeY5zDQs-eg-ABm0A15cI,16471
29
+ mcp_agent/cli/commands/server_helpers.py,sha256=x5tD_qhf1W4D2li09sfOyfRWCOCa6lmpumYAPsEfIQs,3649
28
30
  mcp_agent/cli/commands/setup.py,sha256=eOEd4TL-b0DaDeSJMGOfNOsTEItoZ67W88eTP4aP-bo,6482
29
31
  mcp_agent/cli/commands/url_parser.py,sha256=5VdtcHRHzi67YignStVbz7u-rcvNNErw9oJLAUFOtEY,5855
30
32
  mcp_agent/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- mcp_agent/core/agent_app.py,sha256=KJdx0Qbh7Gb4wA8_LwKriogc27SraRIrvMqHsOCVVt0,12119
32
- mcp_agent/core/agent_types.py,sha256=HYeX4tleNs3yqsDpRah6KWUefSoMqn8lsHgUu_0_R6Y,1505
33
- mcp_agent/core/direct_decorators.py,sha256=_-kV5UmRf5Juq6-4w27DH-bh3zx-MrI1fGhNxO5zRck,17539
34
- mcp_agent/core/direct_factory.py,sha256=2qmIYYpHseiGoVf-IyrSrzYq1qi97KmuywZtvRj1jA8,19167
35
- mcp_agent/core/enhanced_prompt.py,sha256=5i676U9IUret8aLJ034jdCaetkGmKCcsGpOH8KVAGCY,26058
33
+ mcp_agent/core/agent_app.py,sha256=mMWfScEylf1l-rKzmRdoA7WIIBRvSypfZONDBYdo1M8,15919
34
+ mcp_agent/core/agent_types.py,sha256=LbSXolCIqXDt7p7AGCNO0MykgobT2IFjPy3jDEEJClk,1536
35
+ mcp_agent/core/direct_decorators.py,sha256=VutR9hO2dkWIWMRHXmPUeW2ZpfSZVOW2NaiVTcWEa3c,17824
36
+ mcp_agent/core/direct_factory.py,sha256=d_HvbAxyv2WrM07zyCpLXFVn7eArXk1LZmLKS49hzJo,19537
37
+ mcp_agent/core/enhanced_prompt.py,sha256=3TBSwDUBE_dRd46sZnDvuInptdF9MU2sYwCNbr2QY4E,32769
36
38
  mcp_agent/core/error_handling.py,sha256=xoyS2kLe0eG0bj2eSJCJ2odIhGUve2SbDR7jP-A-uRw,624
37
39
  mcp_agent/core/exceptions.py,sha256=ENAD_qGG67foxy6vDkIvc-lgopIUQy6O7zvNPpPXaQg,2289
38
- mcp_agent/core/fastagent.py,sha256=jbk4lNKTWZqqLgxUqXPZU8mBkjtFz3YjoK5VoRCh7oA,24653
39
- mcp_agent/core/interactive_prompt.py,sha256=J4MGENnBSmTFIv09kRAevTJutGbCdQsX2fqRwjDuK8s,30669
40
+ mcp_agent/core/fastagent.py,sha256=tAxapB3sjNyK6FqsJdOZt-IN5uYAi8DL1B9RHcGu55g,24849
41
+ mcp_agent/core/interactive_prompt.py,sha256=1XXtX8HnBt04hqfkCjPiVQP4OZegfuDa6hEQEwCUQRY,30493
40
42
  mcp_agent/core/mcp_content.py,sha256=2D7KHY9mG_vxoDwFLKvsPQV9VRIzHItM7V-jcEnACh8,8878
41
43
  mcp_agent/core/prompt.py,sha256=qnintOUGEoDPYLI9bu9G2OlgVMCe5ZPUZilgMzydXhc,7919
42
44
  mcp_agent/core/request_params.py,sha256=qmFWZXeYEJyYw2IwonyrTnZWxQG7qX6bKpOPcqETa60,1603
43
- mcp_agent/core/usage_display.py,sha256=_slMP6bkQSH0n8fgF6l8eehr5nYsvTNyqaUpAc-8XYQ,6884
44
- mcp_agent/core/validation.py,sha256=RIBKFlh0GJg4rTcFQXoXp8A0sK1HpsCigKcYSK3gFaY,12090
45
+ mcp_agent/core/usage_display.py,sha256=VeVhlNRoTH109Yv3tokfWUKgxD4s_a2cFuvoNUbVEGU,7338
46
+ mcp_agent/core/validation.py,sha256=8D6d3mQanvzC2dXx5yc8-5bkoWEh9cxuT6-YSthSGFk,12676
45
47
  mcp_agent/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
48
  mcp_agent/executor/executor.py,sha256=E44p6d-o3OMRoP_dNs_cDnyti91LQ3P9eNU88mSi1kc,9462
47
49
  mcp_agent/executor/task_registry.py,sha256=PCALFeYtkQrPBg4RBJnlA0aDI8nHclrNkHGUS4kV3W8,1242
48
50
  mcp_agent/executor/workflow_signal.py,sha256=Cg1uZBk3fn8kXhPOg-wINNuVaf3v9pvLD6NbqWy5Z6E,11142
49
51
  mcp_agent/human_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- mcp_agent/human_input/elicitation_form.py,sha256=fb95helmK8X2ahaS-Vpjs5_5NxKDj57gEChV-mLhjWo,27016
52
+ mcp_agent/human_input/elicitation_form.py,sha256=s9rrX-qKxKZ91Uf-wjmrRIKgqDP-gdn6_1xOwizyJno,28158
51
53
  mcp_agent/human_input/elicitation_forms.py,sha256=w8XQ1GfZX8Jw-VB4jnDI0Im4mF-T9Ts8mT2zRZBtL6M,3824
52
54
  mcp_agent/human_input/elicitation_handler.py,sha256=YfVhIhSBc9wuszPS4zoHho4n1pwmIoq13huN4MSRkIs,3305
53
55
  mcp_agent/human_input/elicitation_state.py,sha256=Unl9uhEybUqACCUimnETdfUprJNpYDMq3DdbbHw5oAw,1175
54
56
  mcp_agent/human_input/handler.py,sha256=s712Z5ssTCwjL9-VKoIdP5CtgMh43YvepynYisiWTTA,3144
55
57
  mcp_agent/human_input/types.py,sha256=RtWBOVzy8vnYoQrc36jRLn8z8N3C4pDPMBN5vF6qM5Y,1476
56
58
  mcp_agent/llm/__init__.py,sha256=d8zgwG-bRFuwiMNMYkywg_qytk4P8lawyld_meuUmHI,68
57
- mcp_agent/llm/augmented_llm.py,sha256=25LGtrHSxXJWhQC7imXQ46xxxvOMfHtTAs7vmNGaNO4,26875
59
+ mcp_agent/llm/augmented_llm.py,sha256=QMrNcyP-D5yfdUEhuHKtSDDg-_YnYaw8krGbafu0QTI,27567
58
60
  mcp_agent/llm/augmented_llm_passthrough.py,sha256=F8KifmTwoQ7zyncjmoRek8SBfGdgc9yc5LRXwMQH-bg,8640
59
61
  mcp_agent/llm/augmented_llm_playback.py,sha256=BQeBXRpO-xGAY9wIJxyde6xpHmZEdQPLd32frF8t3QQ,4916
62
+ mcp_agent/llm/augmented_llm_silent.py,sha256=IUnK_1Byy4D9TG0Pj46LFeNezgSTQ8d6MQIHWAImBwE,1846
60
63
  mcp_agent/llm/augmented_llm_slow.py,sha256=DDSD8bL2flmQrVHZm-UDs7sR8aHRWkDOcOW-mX_GPok,2067
61
64
  mcp_agent/llm/memory.py,sha256=pTOaTDV3EA3X68yKwEtUAu7s0xGIQQ_cKBhfYUnfR0w,8614
62
- mcp_agent/llm/model_database.py,sha256=mfy039QZP_8-f0aHWR0Fpj2qnlys5430haSzrA86aXw,8485
63
- mcp_agent/llm/model_factory.py,sha256=u60O4SWe22wN6CpmIfaF4C5aUziJs8O3N0Jo7erPjp8,10753
65
+ mcp_agent/llm/model_database.py,sha256=YgqltGMDcmuoVrx-jiRj7Z5NCzKz2bshk7Rgkng2tsM,9401
66
+ mcp_agent/llm/model_factory.py,sha256=NY9FQJZ9oLnFNyt8RjSQha9dlCEUKDsCP76H73dBl3s,11225
64
67
  mcp_agent/llm/prompt_utils.py,sha256=yWQHykoK13QRF7evHUKxVF0SpVLN-Bsft0Yixzvn0g0,4825
65
- mcp_agent/llm/provider_key_manager.py,sha256=usMWozSMhek_FIlM1MeVDwAbs-P96SrEVPGd3YwF9E4,2833
66
- mcp_agent/llm/provider_types.py,sha256=AkQl1r67wZ0gSIY6CXsiZiS3uw5DBF9E5yhIn3THayk,633
68
+ mcp_agent/llm/provider_key_manager.py,sha256=LSWIgcXlrUS4sfBvQBCya82qC6NcXQPYLtDHwHNOXR4,3394
69
+ mcp_agent/llm/provider_types.py,sha256=pY67LJGhaUv0VtkgyWo8l0Lpia10JhQo0aML8-2-B3M,1054
67
70
  mcp_agent/llm/sampling_converter.py,sha256=C7wPBlmT0eD90XWabC22zkxsrVHKCrjwIwg6cG628cI,2926
68
71
  mcp_agent/llm/sampling_format_converter.py,sha256=xGz4odHpOcP7--eFaJaFtUR8eR9jxZS7MnLH6J7n0EU,1263
69
- mcp_agent/llm/usage_tracking.py,sha256=HdBehPMt0bZzEgRmTnbMdgpLVuTp6L_VJTQx5Z25zCM,15321
72
+ mcp_agent/llm/usage_tracking.py,sha256=rF6v8QQDam8QbvlP4jzHljKqvuNHExeYDLkUMI86czY,16073
70
73
  mcp_agent/llm/providers/__init__.py,sha256=heVxtmuqFJOnjjxHz4bWSqTAxXoN1E8twC_gQ_yJpHk,265
71
74
  mcp_agent/llm/providers/anthropic_utils.py,sha256=vYDN5G5jKMhD2CQg8veJYab7tvvzYkDMq8M1g_hUAQg,3275
72
75
  mcp_agent/llm/providers/augmented_llm_aliyun.py,sha256=XylkJKZ9theSVUxJKOZkf1244hgzng4Ng4Dr209Qb-w,1101
73
- mcp_agent/llm/providers/augmented_llm_anthropic.py,sha256=Ve5Fy-cORgntFQQan3oajdQixA5a8y_q4n9ir6SvcY0,23942
74
- mcp_agent/llm/providers/augmented_llm_azure.py,sha256=amhDGnFL9m8Jj_Eze5C98DVwC7Gm6s25WdGPdepH3fU,5903
76
+ mcp_agent/llm/providers/augmented_llm_anthropic.py,sha256=dKXP8d36jzqThV8E404PUYbTuQbRz9x7uQScW4_BU6U,24060
77
+ mcp_agent/llm/providers/augmented_llm_azure.py,sha256=sBVWgY88F4OsdRSHl71BAT2p3XPvuZp844z1ubwcV7U,6098
75
78
  mcp_agent/llm/providers/augmented_llm_deepseek.py,sha256=zI9a90dwT4r6E1f_xp4K50Cj9sD7y7kNRgjo0s1pd5w,3804
76
79
  mcp_agent/llm/providers/augmented_llm_generic.py,sha256=5Uq8ZBhcFuQTt7koP_5ykolREh2iWu8zKhNbh3pM9lQ,1210
77
- mcp_agent/llm/providers/augmented_llm_google_native.py,sha256=pv-fgxvl8Wpyyeo6mQMYgxKNYQ4jIexh2pjhBRdWOKc,22309
80
+ mcp_agent/llm/providers/augmented_llm_google_native.py,sha256=meWvjiNny2T8Map_TuLl8gx9JX8Ly8orHMFUCx3gtFU,22389
78
81
  mcp_agent/llm/providers/augmented_llm_google_oai.py,sha256=cO4dvjTl9ymqEurCOo5nP09ATfXVjgkuk1yZAlWpS1s,1137
79
- mcp_agent/llm/providers/augmented_llm_openai.py,sha256=CvtJ4t2RZHkwr-6n7R8ELbmJqMYvCuqUgCDEuE0H3hs,24094
82
+ mcp_agent/llm/providers/augmented_llm_openai.py,sha256=R3w_XPg9hegcq-bM-W2HKivEPVJPvr5ipYKr-4mJeDQ,24264
80
83
  mcp_agent/llm/providers/augmented_llm_openrouter.py,sha256=V_TlVKm92GHBxYIo6gpvH_6cAaIdppS25Tz6x5T7LW0,2341
81
84
  mcp_agent/llm/providers/augmented_llm_tensorzero.py,sha256=Mol_Wzj_ZtccW-LMw0oFwWUt1m1yfofloay9QYNP23c,20729
85
+ mcp_agent/llm/providers/augmented_llm_xai.py,sha256=fJiO9Vkgi32pEMijxMbqoKrPCCNJmR_3YEnX0UCqOVs,1332
82
86
  mcp_agent/llm/providers/google_converter.py,sha256=zsqxJJ636WzCL2K6w-yB94O8bdNR6mo8f5mQEnUJFyg,16831
83
87
  mcp_agent/llm/providers/multipart_converter_anthropic.py,sha256=t5lHYGfFUacJldnrVtMNW-8gEMoto8Y7hJkDrnyZR-Y,16650
84
88
  mcp_agent/llm/providers/multipart_converter_openai.py,sha256=kCvtTFOcOejg2BVI3_-F9OCFxAoShSj2i0hdCajHCIw,15955
@@ -102,15 +106,15 @@ mcp_agent/mcp/gen_client.py,sha256=fAVwFVCgSamw4PwoWOV4wrK9TABx1S_zZv8BctRyF2k,3
102
106
  mcp_agent/mcp/hf_auth.py,sha256=YwEt7hMDJODFUIc6Zi1HLYsfVnvANGvyhpQwcPCMAgI,3379
103
107
  mcp_agent/mcp/interfaces.py,sha256=NxUDi4eI-qWfaOS1QHWr3EjAweV-CX_CBJeBCwTwr7g,7102
104
108
  mcp_agent/mcp/logger_textio.py,sha256=vljC1BtNTCxBAda9ExqNB-FwVNUZIuJT3h1nWmCjMws,3172
105
- mcp_agent/mcp/mcp_agent_client_session.py,sha256=34gQozI87Rw3HwpphbLRv9NMLP9EKRLRsKmWlcyW624,8886
106
- mcp_agent/mcp/mcp_aggregator.py,sha256=kVLzNjik7VIlu60ci4iNO_VvseX2G16E8DAjPxK232I,49072
109
+ mcp_agent/mcp/mcp_agent_client_session.py,sha256=nEHrSalG5z47BKGwE9ooOmlSTc4Gb7qdEut071Dwepo,8987
110
+ mcp_agent/mcp/mcp_aggregator.py,sha256=Q2hHT_fcm6QIJ96si88AWaHxPh4NB50g3nr2lfGGZV0,48753
107
111
  mcp_agent/mcp/mcp_connection_manager.py,sha256=dJxjnv2IRzlFIxrbPFl39-pmGcZHgyeMXVlMfqpREhE,17974
108
112
  mcp_agent/mcp/mime_utils.py,sha256=difepNR_gpb4MpMLkBRAoyhDk-AjXUHTiqKvT_VwS1o,1805
109
113
  mcp_agent/mcp/prompt_message_multipart.py,sha256=BDwRdNwyWHb2q2bccDb2iR2VlORqVvkvoG3xYzcMpCE,4403
110
114
  mcp_agent/mcp/prompt_render.py,sha256=k3v4BZDThGE2gGiOYVQtA6x8WTEdOuXIEnRafANhN1U,2996
111
115
  mcp_agent/mcp/prompt_serialization.py,sha256=MQY6QxnhQTiq0oBDsyRzFtX8sBiovUjzUFX78As8q60,17974
112
116
  mcp_agent/mcp/resource_utils.py,sha256=K4XY8bihmBMleRTZ2viMPiD2Y2HWxFnlgIJi6dd_PYE,6588
113
- mcp_agent/mcp/sampling.py,sha256=kge2r-a72fRY2ncsvQSXHr6ahYjV_fJJvkoapPQT_V4,6388
117
+ mcp_agent/mcp/sampling.py,sha256=PpUtLDvu9K3U8445z6m_esHeKstdSr-JBTyn9d8ppJM,6665
114
118
  mcp_agent/mcp/helpers/__init__.py,sha256=sKqwlUR3jSsd9PVJKjXtxHgZA1YOdzPtsSW4xVey77Q,52
115
119
  mcp_agent/mcp/helpers/content_helpers.py,sha256=fOrRq6sIHR0Zn18k9GRRn9PWBB5WosPLhvK0yVXg2Vg,4191
116
120
  mcp_agent/mcp/helpers/server_config_helpers.py,sha256=MkyZB2ZzfsBNsqyGd0LfUOoXxhAMS28VF-f747cJJpY,978
@@ -132,7 +136,7 @@ mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py,sha256
132
136
  mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py,sha256=z9kHdNc6XWjAWkvet7inVBIcYxfWoxU6n9iHrsEqU7A,6206
133
137
  mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml,sha256=HPe0cuFL4-rzS4hHNgZiLMPEv0jYXOp7iSsrUliAaqs,1080
134
138
  mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example,sha256=1vkBmh9f4mnQZm6-2B7vyU1OepImviPW5MNAJkvUIPE,394
135
- mcp_agent/resources/examples/mcp/elicitations/forms_demo.py,sha256=Yorh2SPZ0xUiLcMv_oQPGLerO-wSPlBj3V9Z1bS7DqQ,4482
139
+ mcp_agent/resources/examples/mcp/elicitations/forms_demo.py,sha256=0msJAZ6Pha_y3hcUxn_QIkXhbMxA7sa_6kag7iqYu0U,4335
136
140
  mcp_agent/resources/examples/mcp/elicitations/game_character.py,sha256=forNICa8SzrvrVuwzDa9HcpjauByQHbkryO2yavxqc4,2372
137
141
  mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py,sha256=tOp8rFJ0ZDrzR5siATZT_RUh7wyRpicGwcOcfTeCd2c,11211
138
142
  mcp_agent/resources/examples/mcp/elicitations/tool_call.py,sha256=1JWeN5YnbsuASu5eQxY9yvur4KLWtUs7j0c5jSeiq9A,530
@@ -151,13 +155,13 @@ mcp_agent/resources/examples/workflows/graded_report.md,sha256=QVF38xEtDIO1a2P-x
151
155
  mcp_agent/resources/examples/workflows/human_input.py,sha256=_I6nS6xYo8IHAmvzsUYOxqVGb4G6BTyJXPAmS3fNcBU,621
152
156
  mcp_agent/resources/examples/workflows/orchestrator.py,sha256=5Jxfe0s3ai4qRpVXm3DaqtkDvjeWD2CcysW36J6JA-M,2521
153
157
  mcp_agent/resources/examples/workflows/parallel.py,sha256=OTWhX33uum_rspAzrSf3uCTj7b67Kvw3UUU8nsosz4g,1839
154
- mcp_agent/resources/examples/workflows/router.py,sha256=E4x_-c3l4YW9w1i4ARcDtkdeqIdbWEGfsMzwLYpdbVc,1677
158
+ mcp_agent/resources/examples/workflows/router.py,sha256=56FX7JhZ6ERafWGoVhspoalT1kkfkfbb5P-6MTFDamA,2032
155
159
  mcp_agent/resources/examples/workflows/short_story.md,sha256=XN9I2kzCcMmke3dE5F2lyRH5iFUZUQ8Sy-hS3rm_Wlc,1153
156
160
  mcp_agent/resources/examples/workflows/short_story.txt,sha256=X3y_1AyhLFN2AKzCKvucJtDgAFIJfnlbsbGZO5bBWu0,1187
157
161
  mcp_agent/tools/tool_definition.py,sha256=L3Pxl-uLEXqlVoo-bYuFTFALeI-2pIU44YgFhsTKEtM,398
158
- mcp_agent/ui/console_display.py,sha256=UKqax5V2TC0hkZZORmmd6UqUk0DGX7A25E3h1k9f42k,10982
159
- fast_agent_mcp-0.2.39.dist-info/METADATA,sha256=mPpLsSUqm-YhTA_5J1Ix3rQOuqlVCNPOOaBbNsNlDSs,30983
160
- fast_agent_mcp-0.2.39.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
161
- fast_agent_mcp-0.2.39.dist-info/entry_points.txt,sha256=oKQeSUVn87pJv8_k1NQ7Ak8cXaaXHCnPAOJRCV_uUVg,230
162
- fast_agent_mcp-0.2.39.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
163
- fast_agent_mcp-0.2.39.dist-info/RECORD,,
162
+ mcp_agent/ui/console_display.py,sha256=U9ZWzeu3dUGNCDcyFVSTqX_rpxXbn3uNmuvJ4SIlzi0,15730
163
+ fast_agent_mcp-0.2.41.dist-info/METADATA,sha256=SbuDturRmLzPWvatrCfSzeNkiOwrvLvZuK_u0jnn-uY,30983
164
+ fast_agent_mcp-0.2.41.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
165
+ fast_agent_mcp-0.2.41.dist-info/entry_points.txt,sha256=QaX5kLdI0VdMPRdPUF1nkG_WdLUTNjp_icW6e3EhNYU,232
166
+ fast_agent_mcp-0.2.41.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
167
+ fast_agent_mcp-0.2.41.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  [console_scripts]
2
- fast-agent = mcp_agent.cli.__main__:app
3
- fast-agent-mcp = mcp_agent.cli.__main__:app
2
+ fast-agent = mcp_agent.cli.__main__:main
3
+ fast-agent-mcp = mcp_agent.cli.__main__:main
4
4
  fastagent = mcp_agent.cli.__main__:app
5
5
  prompt-server = mcp_agent.mcp.prompts.__main__:main
6
6
  silsila = mcp_agent.cli.__main__:app
mcp_agent/cli/__main__.py CHANGED
@@ -1,7 +1,33 @@
1
+ import sys
2
+
3
+ from mcp_agent.cli.constants import GO_SPECIFIC_OPTIONS, KNOWN_SUBCOMMANDS
1
4
  from mcp_agent.cli.main import app
2
5
 
3
- # This must be here for the console entry points defined in pyproject.toml
4
- # DO NOT REMOVE!
6
+ # if the arguments would work with "go" we'll just route to it
7
+
8
+
9
+ def main():
10
+ """Main entry point that handles auto-routing to 'go' command."""
11
+ # Check if we should auto-route to 'go'
12
+ if len(sys.argv) > 1:
13
+ # Check if first arg is not already a subcommand
14
+ first_arg = sys.argv[1]
15
+
16
+ if first_arg not in KNOWN_SUBCOMMANDS and any(
17
+ arg in sys.argv or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
18
+ for arg in sys.argv
19
+ ):
20
+ # Find where to insert 'go' - before the first go-specific option
21
+ insert_pos = 1
22
+ for i, arg in enumerate(sys.argv[1:], 1):
23
+ if arg in GO_SPECIFIC_OPTIONS or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS):
24
+ insert_pos = i
25
+ break
26
+ # Auto-route to go command
27
+ sys.argv.insert(insert_pos, "go")
5
28
 
6
- if __name__ == "__main__":
7
29
  app()
30
+
31
+
32
+ if __name__ == "__main__":
33
+ main()
@@ -23,30 +23,14 @@ console = Console()
23
23
 
24
24
 
25
25
  def find_config_files(start_path: Path) -> dict[str, Optional[Path]]:
26
- """Find FastAgent configuration files in current directory or parents."""
27
- results = {
28
- "config": None,
29
- "secrets": None,
30
- }
31
-
32
- current = start_path
33
- while current != current.parent: # Stop at root directory
34
- config_path = current / "fastagent.config.yaml"
35
- secrets_path = current / "fastagent.secrets.yaml"
36
-
37
- if config_path.exists() and results["config"] is None:
38
- results["config"] = config_path
39
-
40
- if secrets_path.exists() and results["secrets"] is None:
41
- results["secrets"] = secrets_path
26
+ """Find FastAgent configuration files, preferring secrets file next to config file."""
27
+ from mcp_agent.config import find_fastagent_config_files
42
28
 
43
- # Stop searching if we found both files
44
- if results["config"] is not None and results["secrets"] is not None:
45
- break
46
-
47
- current = current.parent
48
-
49
- return results
29
+ config_path, secrets_path = find_fastagent_config_files(start_path)
30
+ return {
31
+ "config": config_path,
32
+ "secrets": secrets_path,
33
+ }
50
34
 
51
35
 
52
36
  def get_system_info() -> dict:
@@ -109,13 +93,23 @@ def check_api_keys(secrets_summary: dict, config_summary: dict) -> dict:
109
93
  secrets_status = secrets_summary.get("status", "not_found")
110
94
  # Get config if available
111
95
  config = config_summary if config_summary.get("status") == "parsed" else {}
96
+
112
97
  config_azure = {}
113
98
  if config and "azure" in config.get("config", {}):
114
99
  config_azure = config["config"]["azure"]
115
100
 
116
- for provider_value in results:
101
+ for provider in results:
102
+ # Always check environment variables first
103
+ env_key_name = ProviderKeyManager.get_env_key_name(provider)
104
+ env_key_value = os.environ.get(env_key_name)
105
+ if env_key_value:
106
+ if len(env_key_value) > 5:
107
+ results[provider]["env"] = f"...{env_key_value[-5:]}"
108
+ else:
109
+ results[provider]["env"] = "...***"
110
+
117
111
  # Special handling for Azure: support api_key and DefaultAzureCredential
118
- if provider_value == "azure":
112
+ if provider == "azure":
119
113
  # Prefer secrets if present, else fallback to config
120
114
  azure_cfg = {}
121
115
  if secrets_status == "parsed" and "azure" in secrets:
@@ -125,40 +119,18 @@ def check_api_keys(secrets_summary: dict, config_summary: dict) -> dict:
125
119
 
126
120
  use_default_cred = azure_cfg.get("use_default_azure_credential", False)
127
121
  base_url = azure_cfg.get("base_url")
128
- api_key = azure_cfg.get("api_key")
129
- # DefaultAzureCredential mode
130
122
  if use_default_cred and base_url:
131
- results[provider_value]["config"] = "DefaultAzureCredential"
132
- # API key mode (retrocompatible)
133
- if api_key and api_key != API_KEY_HINT_TEXT:
134
- if len(api_key) > 5:
135
- if results[provider_value]["config"]:
136
- results[provider_value]["config"] += " + api_key"
137
- else:
138
- results[provider_value]["config"] = f"...{api_key[-5:]}"
123
+ results[provider]["config"] = "DefaultAzureCredential"
124
+ continue
125
+
126
+ # Check secrets file if it was parsed successfully
127
+ if secrets_status == "parsed":
128
+ config_key = ProviderKeyManager.get_config_file_key(provider, secrets)
129
+ if config_key and config_key != API_KEY_HINT_TEXT:
130
+ if len(config_key) > 5:
131
+ results[provider]["config"] = f"...{config_key[-5:]}"
139
132
  else:
140
- if results[provider_value]["config"]:
141
- results[provider_value]["config"] += " + api_key"
142
- else:
143
- results[provider_value]["config"] = "...***"
144
- else:
145
- # Check environment variables using ProviderKeyManager
146
- env_key_name = ProviderKeyManager.get_env_key_name(provider_value)
147
- env_key_value = os.environ.get(env_key_name)
148
- if env_key_value:
149
- if len(env_key_value) > 5:
150
- results[provider_value]["env"] = f"...{env_key_value[-5:]}"
151
- else:
152
- results[provider_value]["env"] = "...***"
153
-
154
- # Check secrets file if it was parsed successfully
155
- if secrets_status == "parsed":
156
- config_key = ProviderKeyManager.get_config_file_key(provider_value, secrets)
157
- if config_key and config_key != API_KEY_HINT_TEXT:
158
- if len(config_key) > 5:
159
- results[provider_value]["config"] = f"...{config_key[-5:]}"
160
- else:
161
- results[provider_value]["config"] = "...***"
133
+ results[provider]["config"] = "...***"
162
134
 
163
135
  return results
164
136
 
@@ -173,11 +145,24 @@ def get_fastagent_version() -> str:
173
145
 
174
146
  def get_config_summary(config_path: Optional[Path]) -> dict:
175
147
  """Extract key information from the configuration file."""
148
+ from mcp_agent.config import Settings
149
+
150
+ # Get actual defaults from Settings class
151
+ default_settings = Settings()
152
+
176
153
  result = {
177
154
  "status": "not_found", # Default status: not found
178
155
  "error": None,
179
- "default_model": "haiku (system default)",
180
- "logger": {},
156
+ "default_model": default_settings.default_model,
157
+ "logger": {
158
+ "level": default_settings.logger.level,
159
+ "type": default_settings.logger.type,
160
+ "progress_display": default_settings.logger.progress_display,
161
+ "show_chat": default_settings.logger.show_chat,
162
+ "show_tools": default_settings.logger.show_tools,
163
+ "truncate_tools": default_settings.logger.truncate_tools,
164
+ "enable_markup": default_settings.logger.enable_markup,
165
+ },
181
166
  "mcp_servers": [],
182
167
  }
183
168
 
@@ -207,11 +192,19 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
207
192
  if "logger" in config:
208
193
  logger_config = config["logger"]
209
194
  result["logger"] = {
210
- "level": logger_config.get("level", "info (default)"),
211
- "type": logger_config.get("type", "console (default)"),
212
- "progress_display": str(logger_config.get("progress_display", True)),
213
- "show_chat": str(logger_config.get("show_chat", True)),
214
- "show_tools": str(logger_config.get("show_tools", True)),
195
+ "level": logger_config.get("level", default_settings.logger.level),
196
+ "type": logger_config.get("type", default_settings.logger.type),
197
+ "progress_display": logger_config.get(
198
+ "progress_display", default_settings.logger.progress_display
199
+ ),
200
+ "show_chat": logger_config.get("show_chat", default_settings.logger.show_chat),
201
+ "show_tools": logger_config.get("show_tools", default_settings.logger.show_tools),
202
+ "truncate_tools": logger_config.get(
203
+ "truncate_tools", default_settings.logger.truncate_tools
204
+ ),
205
+ "enable_markup": logger_config.get(
206
+ "enable_markup", default_settings.logger.enable_markup
207
+ ),
215
208
  }
216
209
 
217
210
  # Get MCP server info
@@ -228,10 +221,11 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
228
221
  if "url" in server_config:
229
222
  url = server_config.get("url", "")
230
223
  server_info["url"] = url
231
-
224
+
232
225
  # Use URL path to determine transport type
233
226
  try:
234
227
  from .url_parser import parse_server_url
228
+
235
229
  _, transport_type, _ = parse_server_url(url)
236
230
  server_info["transport"] = transport_type.upper()
237
231
  except Exception:
@@ -288,7 +282,9 @@ def show_check_summary() -> None:
288
282
  system_table.add_row("Python Version", ".".join(system_info["python_version"].split(".")[:3]))
289
283
  system_table.add_row("Python Path", system_info["python_path"])
290
284
 
291
- console.print(Panel(system_table, title="System Information", border_style="blue"))
285
+ console.print(
286
+ Panel(system_table, title="System Information", title_align="left", border_style="blue")
287
+ )
292
288
 
293
289
  # Configuration files panel
294
290
  config_path = config_files["config"]
@@ -327,25 +323,59 @@ def show_check_summary() -> None:
327
323
  "Default Model", config_summary.get("default_model", "haiku (system default)")
328
324
  )
329
325
 
330
- # Add logger settings if available
331
- logger = config_summary.get("logger", {})
332
- if logger:
333
- files_table.add_row("Logger Level", logger.get("level", "info (default)"))
334
- files_table.add_row("Logger Type", logger.get("type", "console (default)"))
335
- files_table.add_row("Progress Display", logger.get("progress_display", "True"))
336
- files_table.add_row("Show Chat", logger.get("show_chat", "True"))
337
- files_table.add_row("Show Tools", logger.get("show_tools", "True"))
326
+ console.print(
327
+ Panel(files_table, title="Configuration Files", title_align="left", border_style="blue")
328
+ )
329
+
330
+ # Logger Settings panel with two-column layout
331
+ logger = config_summary.get("logger", {})
332
+ logger_table = Table(show_header=True, box=None)
333
+ logger_table.add_column("Setting", style="cyan")
334
+ logger_table.add_column("Value")
335
+ logger_table.add_column("Setting", style="cyan")
336
+ logger_table.add_column("Value")
337
+
338
+ def bool_to_symbol(value):
339
+ return "[bold green]✓[/bold green]" if value else "[bold red]✗[/bold red]"
340
+
341
+ # Prepare all settings as pairs
342
+ settings_data = [
343
+ ("Logger Level", logger.get("level", "warning (default)")),
344
+ ("Logger Type", logger.get("type", "file (default)")),
345
+ ("Progress Display", bool_to_symbol(logger.get("progress_display", True))),
346
+ ("Show Chat", bool_to_symbol(logger.get("show_chat", True))),
347
+ ("Show Tools", bool_to_symbol(logger.get("show_tools", True))),
348
+ ("Truncate Tools", bool_to_symbol(logger.get("truncate_tools", True))),
349
+ ("Enable Markup", bool_to_symbol(logger.get("enable_markup", True))),
350
+ ]
351
+
352
+ # Add rows in two-column layout
353
+ for i in range(0, len(settings_data), 2):
354
+ left_setting, left_value = settings_data[i]
355
+ if i + 1 < len(settings_data):
356
+ right_setting, right_value = settings_data[i + 1]
357
+ logger_table.add_row(left_setting, left_value, right_setting, right_value)
358
+ else:
359
+ # Odd number of settings - fill right column with empty strings
360
+ logger_table.add_row(left_setting, left_value, "", "")
338
361
 
339
- console.print(Panel(files_table, title="Configuration Files", border_style="blue"))
362
+ console.print(
363
+ Panel(logger_table, title="Logger Settings", title_align="left", border_style="blue")
364
+ )
340
365
 
341
- # API keys panel
366
+ # API keys panel with two-column layout
342
367
  keys_table = Table(show_header=True, box=None)
343
368
  keys_table.add_column("Provider", style="cyan")
344
369
  keys_table.add_column("Env", justify="center")
345
370
  keys_table.add_column("Config", justify="center")
346
371
  keys_table.add_column("Active Key", style="green")
372
+ keys_table.add_column("Provider", style="cyan")
373
+ keys_table.add_column("Env", justify="center")
374
+ keys_table.add_column("Config", justify="center")
375
+ keys_table.add_column("Active Key", style="green")
347
376
 
348
- for provider, status in api_keys.items():
377
+ def format_provider_row(provider, status):
378
+ """Format a single provider's status for display."""
349
379
  # Environment key indicator
350
380
  if status["env"] and status["config"]:
351
381
  # Both exist but config takes precedence (env is present but not active)
@@ -379,10 +409,35 @@ def show_check_summary() -> None:
379
409
  # No key available for other providers
380
410
  active = "[dim]Not configured[/dim]"
381
411
 
382
- keys_table.add_row(provider.capitalize(), env_status, config_status, active)
412
+ # Get the proper display name for the provider
413
+ from mcp_agent.llm.provider_types import Provider
414
+
415
+ provider_enum = Provider(provider)
416
+ display_name = provider_enum.display_name
417
+
418
+ return display_name, env_status, config_status, active
419
+
420
+ # Split providers into two columns
421
+ providers_list = list(api_keys.items())
422
+ mid_point = (len(providers_list) + 1) // 2 # Round up for odd numbers
423
+
424
+ for i in range(mid_point):
425
+ # Left column
426
+ left_provider, left_status = providers_list[i]
427
+ left_data = format_provider_row(left_provider, left_status)
428
+
429
+ # Right column (if exists)
430
+ if i + mid_point < len(providers_list):
431
+ right_provider, right_status = providers_list[i + mid_point]
432
+ right_data = format_provider_row(right_provider, right_status)
433
+ # Add row with both columns
434
+ keys_table.add_row(*left_data, *right_data)
435
+ else:
436
+ # Add row with only left column (right column empty)
437
+ keys_table.add_row(*left_data, "", "", "", "")
383
438
 
384
439
  # Print the API Keys panel (fix: this was missing)
385
- keys_panel = Panel(keys_table, title="API Keys", border_style="blue", subtitle_align="left")
440
+ keys_panel = Panel(keys_table, title="API Keys", title_align="left", border_style="blue")
386
441
  console.print(keys_panel)
387
442
 
388
443
  # MCP Servers panel (shown after API Keys)
@@ -406,12 +461,16 @@ def show_check_summary() -> None:
406
461
  command_url = server["url"] or "[dim]Not configured[/dim]"
407
462
  servers_table.add_row(name, transport, command_url)
408
463
 
409
- console.print(Panel(servers_table, title="MCP Servers", border_style="blue"))
464
+ console.print(
465
+ Panel(servers_table, title="MCP Servers", title_align="left", border_style="blue")
466
+ )
410
467
 
411
468
  # Show help tips
412
469
  if config_status == "not_found" or secrets_status == "not_found":
413
470
  console.print("\n[bold]Setup Tips:[/bold]")
414
- console.print("Run [cyan]fast-agent setup[/cyan] to create configuration files")
471
+ console.print(
472
+ "Run [cyan]fast-agent setup[/cyan] to create configuration files. Visit [cyan][link=https://fast-agent.ai]fast-agent.ai[/link][/cyan] for configuration guides. "
473
+ )
415
474
  elif config_status == "error" or secrets_status == "error":
416
475
  console.print("\n[bold]Config File Issues:[/bold]")
417
476
  console.print("Fix the YAML syntax errors in your configuration files")