fast-agent-mcp 0.0.9__py3-none-any.whl → 0.0.12__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 (37) hide show
  1. {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/METADATA +17 -11
  2. {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/RECORD +36 -28
  3. mcp_agent/app.py +4 -4
  4. mcp_agent/cli/commands/bootstrap.py +2 -5
  5. mcp_agent/cli/commands/setup.py +1 -1
  6. mcp_agent/cli/main.py +4 -4
  7. mcp_agent/core/enhanced_prompt.py +315 -0
  8. mcp_agent/core/fastagent.py +520 -388
  9. mcp_agent/event_progress.py +5 -2
  10. mcp_agent/human_input/handler.py +6 -2
  11. mcp_agent/logging/rich_progress.py +10 -5
  12. mcp_agent/mcp/mcp_aggregator.py +2 -1
  13. mcp_agent/mcp/mcp_connection_manager.py +67 -37
  14. mcp_agent/resources/examples/internal/agent.py +17 -0
  15. mcp_agent/resources/examples/internal/job.py +83 -0
  16. mcp_agent/resources/examples/mcp_researcher/researcher-eval.py +1 -1
  17. mcp_agent/resources/examples/researcher/fastagent.config.yaml +53 -0
  18. mcp_agent/resources/examples/researcher/researcher-eval.py +53 -0
  19. mcp_agent/resources/examples/researcher/researcher.py +38 -0
  20. mcp_agent/resources/examples/workflows/agent.py +17 -0
  21. mcp_agent/resources/examples/workflows/agent_build.py +61 -0
  22. mcp_agent/resources/examples/workflows/chaining.py +0 -1
  23. mcp_agent/resources/examples/workflows/evaluator.py +6 -3
  24. mcp_agent/resources/examples/workflows/fastagent.py +22 -0
  25. mcp_agent/resources/examples/workflows/orchestrator.py +1 -1
  26. mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py +91 -92
  27. mcp_agent/workflows/llm/augmented_llm.py +14 -3
  28. mcp_agent/workflows/llm/augmented_llm_anthropic.py +8 -5
  29. mcp_agent/workflows/llm/augmented_llm_openai.py +20 -9
  30. mcp_agent/workflows/llm/model_factory.py +25 -11
  31. mcp_agent/workflows/orchestrator/orchestrator.py +68 -7
  32. mcp_agent/workflows/orchestrator/orchestrator_prompts.py +11 -6
  33. mcp_agent/workflows/router/router_llm.py +13 -2
  34. mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -9
  35. {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/WHEEL +0 -0
  36. {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/entry_points.txt +0 -0
  37. {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.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.0.9
3
+ Version: 0.0.12
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
@@ -217,6 +217,7 @@ Requires-Dist: numpy>=2.2.1
217
217
  Requires-Dist: openai>=1.63.2
218
218
  Requires-Dist: opentelemetry-distro>=0.50b0
219
219
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.29.0
220
+ Requires-Dist: prompt-toolkit>=3.0.50
220
221
  Requires-Dist: pydantic-settings>=2.7.0
221
222
  Requires-Dist: pydantic>=2.10.4
222
223
  Requires-Dist: pyyaml>=6.0.2
@@ -246,27 +247,32 @@ Description-Content-Type: text/markdown
246
247
 
247
248
  ## Overview
248
249
 
249
- **`fast-agent`** lets you define, test and compose agents and tools in minutes.
250
+ **`fast-agent`** lets you define, test and interact with agents, tools and workflows in minutes.
250
251
 
251
- ### Get started:
252
-
253
- Install the [uv package manager](https://docs.astral.sh/uv/).
252
+ The simple declarative syntax lets you concentrate on the prompts, MCP Servers and compositions to build effective agents.
254
253
 
255
- `uv pip install fast-agent-mcp` - download and install fast-agent
254
+ Quickly compare how different models perform at Agent and MCP Server calling tasks, and build mixed multi-model workflows using the best provider for each task.
256
255
 
257
- `fast-agent setup` - setup an agent and configuration files.
256
+ ### Get started:
258
257
 
259
- `uv run agent.py` - run and interact with your first agent.
258
+ Start by installing the [uv package manager](https://docs.astral.sh/uv/) for Python. Then:
260
259
 
261
- `fast-agent bootstrap workflow` - generate example agents and workflows demonstrating each of the patterns from Anthropic's "[Building Effective Agents](https://www.anthropic.com/research/building-effective-agents)" paper.
260
+ ```bash
261
+ uv pip install fast-agent-mcp # install fast-agent
262
+ fast-agent setup # create an example agent and config files
263
+ uv run agent.py # run your first agent
264
+ uv run agent.py --model=o3-mini.low # specify a model
265
+ fast-agent bootstrap workflow # create "building effective agents" examples
266
+ ```
262
267
 
263
- `fast-agent bootstrap` -
268
+ Other bootstrap examples include a Researcher (with Evaluator-Optimizer workflow) and Data Analysis (similar to ChatGPT experience), demonstrating MCP Roots support.
264
269
 
265
- It's built on top of [mcp-agent](todo).
270
+ > Windows Users - there are a couple of configuration changes needed for the Filesystem and Docker MCP Servers - necessary changes are detailed within the configuration files.
266
271
 
267
272
  ### llmindset.co.uk fork:
268
273
 
269
274
  - "FastAgent" style prototyping, with per-agent models
275
+ - Api keys through Environment Variables
270
276
  - Warm-up / Post-Workflow Agent Interactions
271
277
  - Quick Setup
272
278
  - Interactive Prompt Mode
@@ -1,24 +1,25 @@
1
1
  mcp_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- mcp_agent/app.py,sha256=LJ8-9_hTnDOjX0KxRYRu9OPqDcj-fAQSSfS4Oo2m0D8,10550
2
+ mcp_agent/app.py,sha256=0_C1xmNZlk9qZoewnNI_mC7sSfO9oJgkOyiKkQ62MHU,10606
3
3
  mcp_agent/config.py,sha256=mShpoyIAGeyQKMH9gUCAXBZ2HNF3SM2KoMjSMpPQnmg,10210
4
4
  mcp_agent/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
5
5
  mcp_agent/context.py,sha256=qzwUrexZXVBzFiNkYI4xjztdGxuuiDWZbWrQgVhA-vE,8126
6
6
  mcp_agent/context_dependent.py,sha256=TGqRLzYCOnsWGoaD1HtrliYtWo8MeaWCQk6ePUmyYCw,1446
7
- mcp_agent/event_progress.py,sha256=uolrsdEuXQ8_8iAspb_w3HHp_yY22QfVyysuQaAhnOg,2641
7
+ mcp_agent/event_progress.py,sha256=25iz0yyg-O4glMmtijcYpDdUmtUIKsCmR_8A52GgeC4,2716
8
8
  mcp_agent/mcp_server_registry.py,sha256=5x30L1IlmC18JASl7NQbZYHMqPWS3ay0f_3U3uleaMM,9884
9
9
  mcp_agent/progress_display.py,sha256=GeJU9VUt6qKsFVymG688hCMVCsAygG9ifiiEb5IcbN4,361
10
10
  mcp_agent/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  mcp_agent/agents/agent.py,sha256=utMR_QWKD1_MqWE_fYY-xqUMKtGlekW0laJfduU6Ckw,9831
12
12
  mcp_agent/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  mcp_agent/cli/__main__.py,sha256=bhxe66GYqy0q78OQhi7dkuubY1Tn0bQL6hU5Nn47E34,73
14
- mcp_agent/cli/main.py,sha256=wyOvUg0BihD1NpoiFcIaOruevgaHxs1-Xy_bnwb1Ik4,2449
14
+ mcp_agent/cli/main.py,sha256=h_TqBlpIMGhsJr6pp_oxUl00x3F9d1R-JQVwJ9uAreA,2449
15
15
  mcp_agent/cli/terminal.py,sha256=5fqrKlJvIpKEuvpvZ653OueQSYFFktBEbosjr2ucMUc,1026
16
- mcp_agent/cli/commands/bootstrap.py,sha256=5OAxs1IsWarFNX1IoTRbVyjMqktxJ3pweM3LwGOVAhk,10768
16
+ mcp_agent/cli/commands/bootstrap.py,sha256=Q55I2gL-K3Ja8c6MmbLZMVQQ_MaOTxnEC5se09XTI2s,10742
17
17
  mcp_agent/cli/commands/config.py,sha256=32YTS5jmsYAs9QzAhjkG70_daAHqOemf4XbZBBSMz6g,204
18
- mcp_agent/cli/commands/setup.py,sha256=Km4-EFJljjMU5XjsSa-srg_7lbPuH5e40sx4lQDkia4,6198
18
+ mcp_agent/cli/commands/setup.py,sha256=dI_01B5nye707Rcd15gvZZCYlZGSiKajlnuLf6hJf2A,6197
19
19
  mcp_agent/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ mcp_agent/core/enhanced_prompt.py,sha256=U4hbAbm5WFUwTiwmBlNR7nadbMD9oHYgKuNNQVrGdvc,11047
20
21
  mcp_agent/core/exceptions.py,sha256=xDdhYh83ni3t0NiXQTEL0_Yyx0qQxBPQL1gSwRToeaw,1469
21
- mcp_agent/core/fastagent.py,sha256=THy6lDg3CjgF_nMKq8GtWkFT03r6-8VKFFhjjECx6aE,42699
22
+ mcp_agent/core/fastagent.py,sha256=Wn5uHR6DIzMXu4S93Ll8oFD7VJUcSBH4wMm4c0aofpw,48858
22
23
  mcp_agent/core/server_validation.py,sha256=_59cn16nNT4HGPwg19HgxMtHK4MsdWYDUw_CuL-5xek,1696
23
24
  mcp_agent/eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
25
  mcp_agent/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -29,14 +30,14 @@ mcp_agent/executor/temporal.py,sha256=U-wyltgWlVmzJoyivT6rR0Z1U3S6TbMXpeCxyuXako
29
30
  mcp_agent/executor/workflow.py,sha256=lA6r7PNEvxCVFHp4XkEJkaR0QCTf-J6iw9JwNx-tzNY,6727
30
31
  mcp_agent/executor/workflow_signal.py,sha256=3PWwSgXhz3PhkA8SRX3u0BDVoSlQqRGqC9d1qLC25vE,11210
31
32
  mcp_agent/human_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- mcp_agent/human_input/handler.py,sha256=__DtS3LDGMwrDHOFnE8a0d2EnEupN0fQNSrovAAkn_U,1688
33
+ mcp_agent/human_input/handler.py,sha256=_gVIyvjDo53Aj8NFoKCiM8nBdQIuCxiStvgEtRBwYv8,1812
33
34
  mcp_agent/human_input/types.py,sha256=ZvuDHvI0-wO2tFoS0bzrv8U5B83zYdxAG7g9G9jCxug,1489
34
35
  mcp_agent/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
36
  mcp_agent/logging/events.py,sha256=qfYJnrqgXdujV-nl-iOwBEBh6HMraowBI4zeAWPPU4A,3461
36
37
  mcp_agent/logging/json_serializer.py,sha256=pa_mf0i0YKpLsGq3THuITFUdAbmae-dv1OPOLbcS0to,5782
37
38
  mcp_agent/logging/listeners.py,sha256=lx2Pq_SE0rsG3nF3TwDSxkmsWzdXxIUjuaWct-KOtJ8,6631
38
39
  mcp_agent/logging/logger.py,sha256=Tr009BnfGUKuZcdinnSin0Z_zIsfDNGdcnamw2rDHRQ,10604
39
- mcp_agent/logging/rich_progress.py,sha256=ExVCEPfk01BaspOy60o5rnsfnr1aT6UKO0OWGDXYT5s,4560
40
+ mcp_agent/logging/rich_progress.py,sha256=IEVFdFGA0nwg6pSt9Ydni5LCNYZZPKYMe-6DCi9pO4Y,4851
40
41
  mcp_agent/logging/tracing.py,sha256=jQivxKYl870oXakmyUk7TXuTQSvsIzpHwZlSQfy4b0c,5203
41
42
  mcp_agent/logging/transport.py,sha256=Oo7Rx5t7REZTnH-uVljK0JlehnBj-wInc_fx0zhd_zY,16139
42
43
  mcp_agent/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -44,19 +45,26 @@ mcp_agent/mcp/gen_client.py,sha256=u0HwdJiw9YCerS5JC7JDuGgBh9oTcLd7vv9vPjwibXc,3
44
45
  mcp_agent/mcp/mcp_activity.py,sha256=CajXCFWZ2cKEX9s4-HfNVAj471ePTVs4NOkvmIh65tE,592
45
46
  mcp_agent/mcp/mcp_agent_client_session.py,sha256=NtWcQhjmnnaR3yYcYj2d2lh-m563NexZUa57K1tAjeM,9477
46
47
  mcp_agent/mcp/mcp_agent_server.py,sha256=xP09HZTeguJi4Fq0p3fjLBP55uSYe5AdqM90xCgn9Ho,1639
47
- mcp_agent/mcp/mcp_aggregator.py,sha256=SQNErk20jTT_5cHTQ9zQBYEsAedd6QEweQj-YSzkdOo,14602
48
- mcp_agent/mcp/mcp_connection_manager.py,sha256=tdz2B2BxmO2gBDPe4r6eEnUp4QpwD0p0-ag5J_hle-w,11750
48
+ mcp_agent/mcp/mcp_aggregator.py,sha256=RVsgNnSJ1IPBkqKgF_Gp-Cpv97FVBIdppPey6FRoHB0,14751
49
+ mcp_agent/mcp/mcp_connection_manager.py,sha256=LH9ZmK-fXC-_7exAFclzWEjfFjwwdPqO_ZERqoHI_JM,13166
49
50
  mcp_agent/mcp/stdio.py,sha256=tW075R5rQ-UlflXWFKIFDgCbWbuhKqxhiYolWvyEkFs,3985
50
51
  mcp_agent/resources/examples/data-analysis/analysis.py,sha256=Sp-umPPfwVjG3yNrHdQA6blGtG6jc5of1e_0oS4njYc,1379
51
52
  mcp_agent/resources/examples/data-analysis/fastagent.config.yaml,sha256=eTKGbjnTHhDTeNRPQvG_fr9OQpEZ5Y9v7X2NyCj0V70,530
52
53
  mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv,sha256=pcMeOL1_r8m8MziE6xgbBrQbjl5Ijo98yycZn7O-dlk,227977
53
- mcp_agent/resources/examples/mcp_researcher/researcher-eval.py,sha256=NI1vujVuLeTrcF8dM_ipZZ3Tg-1AL35CaltmuzxWrU4,1807
54
+ mcp_agent/resources/examples/internal/agent.py,sha256=f-jTgYabV3nWCQm0ZP9NtSEWjx3nQbRngzArRufcELg,384
55
+ mcp_agent/resources/examples/internal/job.py,sha256=WEKIAANMEAuKr13__rYf3PqJeTAsNB_kqYqbqVYQlUM,4093
56
+ mcp_agent/resources/examples/mcp_researcher/researcher-eval.py,sha256=kNPjIU-JwE0oIBQKwhv6lZsUF_SPtYVkiEEbY1ZVZxk,1807
54
57
  mcp_agent/resources/examples/mcp_researcher/researcher.py,sha256=jPRafm7jbpHKkX_dQiYGG3Sw-e1Dm86q-JZT-WZDhM0,1425
55
- mcp_agent/resources/examples/workflows/chaining.py,sha256=o9vf45BtJP6PT7kCYfIyNTcJrVGnMeKCUD37vI0cepw,770
56
- mcp_agent/resources/examples/workflows/evaluator.py,sha256=ByILFY7PsA8UXtmNa4YtLIGSsnVfZVjKlHGH9G0ie2I,3069
57
- mcp_agent/resources/examples/workflows/fastagent.config.yaml,sha256=s8USBUpEymJbOLVp-NiFuo86h4sCxL9TB5H-Ub8i0hQ,234
58
+ mcp_agent/resources/examples/researcher/fastagent.config.yaml,sha256=2_VXZneckR6zk6RWzzL-smV_oWmgg4uSkLWqZv8jF0I,1995
59
+ mcp_agent/resources/examples/researcher/researcher-eval.py,sha256=kNPjIU-JwE0oIBQKwhv6lZsUF_SPtYVkiEEbY1ZVZxk,1807
60
+ mcp_agent/resources/examples/researcher/researcher.py,sha256=jPRafm7jbpHKkX_dQiYGG3Sw-e1Dm86q-JZT-WZDhM0,1425
61
+ mcp_agent/resources/examples/workflows/agent.py,sha256=f-jTgYabV3nWCQm0ZP9NtSEWjx3nQbRngzArRufcELg,384
62
+ mcp_agent/resources/examples/workflows/agent_build.py,sha256=vdjS02rZR88RU53WYzXxPscfFNEFFe_niHYE_i49I8Q,2396
63
+ mcp_agent/resources/examples/workflows/chaining.py,sha256=QD_r_PKIoDedWqOTzg7IBnTY8OVoDSMot5WnArJubnc,751
64
+ mcp_agent/resources/examples/workflows/evaluator.py,sha256=kC8uBcCMoeDROip4B_X6jLr-1QXXvcUB0fZ6elun7k4,3147
65
+ mcp_agent/resources/examples/workflows/fastagent.py,sha256=lkO3waYLt_zQtAVqGjirmIsG73jpHA5ad1WSm4BXv2I,532
58
66
  mcp_agent/resources/examples/workflows/human_input.py,sha256=c8cBdLEPbaMXddFwsfN3Z7RFs5PZXsdrjANfvq1VTPM,605
59
- mcp_agent/resources/examples/workflows/orchestrator.py,sha256=LaV5rzBy6NvnlFd91f96bKFrle6voxDA1TFa8hVxQ9Y,2550
67
+ mcp_agent/resources/examples/workflows/orchestrator.py,sha256=kHUDDALqjA8TRjkbsDP2MwspEj1a5DdSUOPAiI17izQ,2545
60
68
  mcp_agent/resources/examples/workflows/parallel.py,sha256=cNYcIcsdo0-KK-S7KEPCc11aWELeVlQJdJ2LIC9xgDs,3090
61
69
  mcp_agent/resources/examples/workflows/router.py,sha256=XT_ewCrxPxdUTMCYQGw34qZQ3GGu8TYY_v5Lige8By4,1707
62
70
  mcp_agent/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -67,7 +75,7 @@ mcp_agent/workflows/embedding/embedding_base.py,sha256=-c20ggQ8s7XhMxRX-WEhOgHE7
67
75
  mcp_agent/workflows/embedding/embedding_cohere.py,sha256=OKTJvKD_uEafd4c2uhR5tBjprea1nyvlJOO-3FDqOnk,1540
68
76
  mcp_agent/workflows/embedding/embedding_openai.py,sha256=dntjJ5P-FSMGYuyPZC8MuCU_ehwjXw9wDfzZZuSQN1E,1480
69
77
  mcp_agent/workflows/evaluator_optimizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py,sha256=njAJiLK-0zQ79Kdc39Rh548n9pbfA_52s-XVpC0FZK8,13399
78
+ mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py,sha256=r0ATtuc8JouBZz6iPc_dQ6g5oUZc7JXfbI9adKd2Wg8,13572
71
79
  mcp_agent/workflows/intent_classifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
80
  mcp_agent/workflows/intent_classifier/intent_classifier_base.py,sha256=zTbOmq6EY_abOlme4zl28HM4RWNNS6bbHl3tF7SshJ0,4004
73
81
  mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py,sha256=_bWZGukc_q9LdA_Q18UoAMSzhN8tt4K_bRHNUhy7Crw,3997
@@ -77,15 +85,15 @@ mcp_agent/workflows/intent_classifier/intent_classifier_llm.py,sha256=WSLUv2Casb
77
85
  mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py,sha256=Hp4454IniWFxV4ml50Ml8ip9rS1La5FBn5pd7vm1FHA,1964
78
86
  mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py,sha256=zj76WlTYnSCYjBQ_IDi5vFBQGmNwYaoUq1rT730sY98,1940
79
87
  mcp_agent/workflows/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
- mcp_agent/workflows/llm/augmented_llm.py,sha256=o5Vdn1sAgVBhmetilbiYJuVz5BAtEhNcwGMEBGNzU_A,22960
81
- mcp_agent/workflows/llm/augmented_llm_anthropic.py,sha256=rcaFn4ZhxJgBuTsRCKCcCx4U8UYqAhJNh3EK5M5hgew,21118
82
- mcp_agent/workflows/llm/augmented_llm_openai.py,sha256=RqsbX0Fc5By1AvQ2N85hxzz0d84mVwuPggslxwqSJVM,24190
88
+ mcp_agent/workflows/llm/augmented_llm.py,sha256=AjYxTn2XdBDHnibmjlCKwaVfQQlQRES9sRBMIU6NaPQ,23258
89
+ mcp_agent/workflows/llm/augmented_llm_anthropic.py,sha256=yrOv1V6rOfm2TTDR58fnf8YU8hBnTIpOZhB2sUgZw6o,21246
90
+ mcp_agent/workflows/llm/augmented_llm_openai.py,sha256=5PwTh0QJSQ29EtK0UuiltgX6snRSBoau75C35S4xQcQ,24477
83
91
  mcp_agent/workflows/llm/llm_selector.py,sha256=G7pIybuBDwtmyxUDov_QrNYH2FoI0qFRu2JfoxWUF5Y,11045
84
- mcp_agent/workflows/llm/model_factory.py,sha256=cAjG8UxzUC_wcB6mPaMfEhwnGnVS4-IOmOXDabO1_0g,6119
92
+ mcp_agent/workflows/llm/model_factory.py,sha256=5JrMXZ5jbE8isiteF2A912gGuCyomGpjtC_BCVSAM9s,6806
85
93
  mcp_agent/workflows/orchestrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
- mcp_agent/workflows/orchestrator/orchestrator.py,sha256=BMGToWE-C2WiL74U5s0oT5wKoHWWxhWZ_lRfHm-8ryg,12494
94
+ mcp_agent/workflows/orchestrator/orchestrator.py,sha256=Fn5r0uUGNAiUq5NLFDjaJ04t19MnGEgr9iknbUj0DSA,14733
87
95
  mcp_agent/workflows/orchestrator/orchestrator_models.py,sha256=UWn7_HFLcqFGlcjZ1Rn2SYQfm5k9seS6QJN_FRST5Kc,4513
88
- mcp_agent/workflows/orchestrator/orchestrator_prompts.py,sha256=AQ9-1WyMIl6l36yAMh1dtJ6Vhi1jPrvGXF2CNNAtlpA,3946
96
+ mcp_agent/workflows/orchestrator/orchestrator_prompts.py,sha256=-ogkjDoCXBDOyYE9yk3qhjqq0LofsSpRvRZfWVzrVTE,4396
89
97
  mcp_agent/workflows/parallel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
98
  mcp_agent/workflows/parallel/fan_in.py,sha256=EivpUL5-qftctws-tlfwmYS1QeSwr07POIbBUbwvwOk,13184
91
99
  mcp_agent/workflows/parallel/fan_out.py,sha256=J-yezgjzAWxfueW_Qcgwoet4PFDRIh0h4m48lIbFA4c,7023
@@ -95,13 +103,13 @@ mcp_agent/workflows/router/router_base.py,sha256=1Qr3Fx9_KxpotMV-eaNT79etayAxWuQ
95
103
  mcp_agent/workflows/router/router_embedding.py,sha256=wEU49li9OqTX-Xucm0HDUFLZjlND1WuewOcQVAo0s2E,7944
96
104
  mcp_agent/workflows/router/router_embedding_cohere.py,sha256=aKZVzzQfBuz0by9k0zWLAA0Db_unDIMYL4ynVzzx8C4,1975
97
105
  mcp_agent/workflows/router/router_embedding_openai.py,sha256=KqW2IFLdQoAJ2lIz1X18WQJFjXF-YSFSTtsqVnp1JeI,1975
98
- mcp_agent/workflows/router/router_llm.py,sha256=ySyYvpsMOgDpWmbBG7l0z0vxbKFo4kVi9Bw54Vvz9KM,10099
106
+ mcp_agent/workflows/router/router_llm.py,sha256=xRLzFt8UvJT9PZNHIVDr8DguWqHFi-MJ-uGALL5Ahzw,10639
99
107
  mcp_agent/workflows/swarm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
108
  mcp_agent/workflows/swarm/swarm.py,sha256=-lAIeSWDqbGHGRPTvjiP9nIKWvxxy9DAojl9yQzO1Pw,11050
101
109
  mcp_agent/workflows/swarm/swarm_anthropic.py,sha256=pW8zFx5baUWGd5Vw3nIDF2oVOOGNorij4qvGJKdYPcs,1624
102
110
  mcp_agent/workflows/swarm/swarm_openai.py,sha256=wfteywvAGkT5bLmIxX_StHJq8144whYmCRnJASAjOes,1596
103
- fast_agent_mcp-0.0.9.dist-info/METADATA,sha256=KBbUbJ7Sx0c9ZvVd9j2zJCdgr1BIDUwvfqN6nAzMjew,15966
104
- fast_agent_mcp-0.0.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
105
- fast_agent_mcp-0.0.9.dist-info/entry_points.txt,sha256=2IXtSmDK9XjWN__RWuRIJTgWyW17wJnJ_h-pb0pZAxo,174
106
- fast_agent_mcp-0.0.9.dist-info/licenses/LICENSE,sha256=cN3FxDURL9XuzE5mhK9L2paZo82LTfjwCYVT7e3j0e4,10939
107
- fast_agent_mcp-0.0.9.dist-info/RECORD,,
111
+ fast_agent_mcp-0.0.12.dist-info/METADATA,sha256=mgH0wJrtVRReqKTn2a-ANc_reC_quUXY-texT2zGdVI,16583
112
+ fast_agent_mcp-0.0.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
113
+ fast_agent_mcp-0.0.12.dist-info/entry_points.txt,sha256=2IXtSmDK9XjWN__RWuRIJTgWyW17wJnJ_h-pb0pZAxo,174
114
+ fast_agent_mcp-0.0.12.dist-info/licenses/LICENSE,sha256=cN3FxDURL9XuzE5mhK9L2paZo82LTfjwCYVT7e3j0e4,10939
115
+ fast_agent_mcp-0.0.12.dist-info/RECORD,,
mcp_agent/app.py CHANGED
@@ -135,8 +135,8 @@ class MCPApp:
135
135
  "MCPAgent initialized",
136
136
  data={
137
137
  "progress_action": "Running",
138
- "target": self.name,
139
- "agent_name": "mcp_application_loop",
138
+ "target": self.name or "mcp_application",
139
+ "agent_name": self.name or "fastagent loop",
140
140
  },
141
141
  )
142
142
 
@@ -150,8 +150,8 @@ class MCPApp:
150
150
  "MCPAgent cleanup",
151
151
  data={
152
152
  "progress_action": ProgressAction.FINISHED,
153
- "target": self.name,
154
- "agent_name": "mcp_application_loop",
153
+ "target": self.name or "mcp_application",
154
+ "agent_name": self.name or "fastagent loop",
155
155
  },
156
156
  )
157
157
  try:
@@ -19,6 +19,7 @@ EXAMPLE_TYPES = {
19
19
  "'Building Effective Agents' paper. Some agents use the 'fetch'\n"
20
20
  "and filesystem MCP Servers.",
21
21
  "files": [
22
+ "agent_build.py",
22
23
  "chaining.py",
23
24
  "evaluator.py",
24
25
  "human_input.py",
@@ -32,11 +33,7 @@ EXAMPLE_TYPES = {
32
33
  "description": "Research agent example with additional evaluation/optimization\n"
33
34
  "example. Uses Brave Search and Docker MCP Servers.\n"
34
35
  "Creates examples in a 'researcher' subdirectory.",
35
- "files": [
36
- "researcher.py",
37
- "researcher-eval.py",
38
- "mcp_agent.secrets.yaml.example",
39
- ],
36
+ "files": ["researcher.py", "researcher-eval.py", "fastagent.config.yaml"],
40
37
  "create_subdir": True,
41
38
  },
42
39
  "data-analysis": {
@@ -19,7 +19,7 @@ FASTAGENT_CONFIG_TEMPLATE = """
19
19
  # If not specified, defaults to "haiku".
20
20
  # Can be overriden with a command line switch --model=<model>, or within the Agent constructor.
21
21
 
22
- default_model: sonnet
22
+ default_model: haiku
23
23
 
24
24
  # Logging and Console Configuration:
25
25
  logger:
mcp_agent/cli/main.py CHANGED
@@ -40,11 +40,11 @@ def show_welcome():
40
40
 
41
41
  console.print("\n[bold]Getting Started:[/bold]")
42
42
  console.print("1. Set up a new project:")
43
- console.print(" mcp-agent setup")
43
+ console.print(" fastagent setup")
44
44
  console.print("\n2. Try an example:")
45
- console.print(" mcp-agent bootstrap create decorator")
45
+ console.print(" fastagent bootstrap create decorator")
46
46
  console.print("\nUse --help with any command for more information")
47
- console.print("Example: mcp-agent bootstrap --help")
47
+ console.print("Example: fastagent bootstrap --help")
48
48
 
49
49
 
50
50
  @app.callback(invoke_without_command=True)
@@ -56,7 +56,7 @@ def main(
56
56
  True, "--color/--no-color", help="Enable/disable color output"
57
57
  ),
58
58
  ):
59
- """MCP Agent CLI - Build effective agents using Model Context Protocol (MCP).
59
+ """FastAgent CLI - Build effective agents using Model Context Protocol (MCP).
60
60
 
61
61
  Use --help with any command for detailed usage information.
62
62
  """
@@ -0,0 +1,315 @@
1
+ """
2
+ Enhanced prompt functionality with advanced prompt_toolkit features.
3
+ """
4
+
5
+ from typing import List
6
+ from prompt_toolkit import PromptSession
7
+ from prompt_toolkit.formatted_text import HTML
8
+ from prompt_toolkit.history import InMemoryHistory
9
+ from prompt_toolkit.key_binding import KeyBindings
10
+ from prompt_toolkit.completion import Completer, Completion
11
+ from prompt_toolkit.lexers import PygmentsLexer
12
+ from prompt_toolkit.filters import Condition
13
+ from pygments.lexers.python import PythonLexer
14
+ from rich import print as rich_print
15
+
16
+ # Map of agent names to their history
17
+ agent_histories = {}
18
+
19
+ # Store available agents for auto-completion
20
+ available_agents = set()
21
+
22
+ # Keep track of multi-line mode state
23
+ in_multiline_mode = False
24
+
25
+ # Track which agents have already shown welcome messages
26
+ agent_messages_shown = set()
27
+
28
+
29
+ class AgentCompleter(Completer):
30
+ """Provide completion for agent names and common commands."""
31
+
32
+ def __init__(self, agents: List[str], commands: List[str] = None, agent_types: dict = None):
33
+ self.agents = agents
34
+ self.commands = commands or ["help", "clear", "STOP"]
35
+ self.agent_types = agent_types or {}
36
+
37
+ def get_completions(self, document, complete_event):
38
+ """Synchronous completions method - this is what prompt_toolkit expects by default"""
39
+ text = document.text_before_cursor.lower()
40
+
41
+ # Complete commands
42
+ if text.startswith("/"):
43
+ cmd = text[1:]
44
+ for command in self.commands:
45
+ if command.lower().startswith(cmd):
46
+ yield Completion(
47
+ command,
48
+ start_position=-len(cmd),
49
+ display=command,
50
+ display_meta="Command",
51
+ )
52
+
53
+ # Complete agent names for agent-related commands
54
+ elif text.startswith("@"):
55
+ agent_name = text[1:]
56
+ for agent in self.agents:
57
+ if agent.lower().startswith(agent_name.lower()):
58
+ # Get agent type or default to "Agent"
59
+ agent_type = self.agent_types.get(agent, "Agent")
60
+ yield Completion(
61
+ agent,
62
+ start_position=-len(agent_name),
63
+ display=agent,
64
+ display_meta=agent_type,
65
+ )
66
+
67
+
68
+ def create_keybindings(on_toggle_multiline=None, app=None):
69
+ """Create custom key bindings."""
70
+ kb = KeyBindings()
71
+
72
+ @kb.add("c-m", filter=Condition(lambda: not in_multiline_mode))
73
+ def _(event):
74
+ """Enter: accept input when not in multiline mode."""
75
+ event.current_buffer.validate_and_handle()
76
+
77
+ @kb.add("c-m", filter=Condition(lambda: in_multiline_mode))
78
+ def _(event):
79
+ """Enter: insert newline when in multiline mode."""
80
+ event.current_buffer.insert_text("\n")
81
+
82
+ @kb.add("escape", "enter")
83
+ def _(event):
84
+ """Alt+Enter: always submit even in multiline mode."""
85
+ event.current_buffer.validate_and_handle()
86
+
87
+ @kb.add("c-t")
88
+ def _(event):
89
+ """Ctrl+T: Toggle multiline mode."""
90
+ global in_multiline_mode
91
+ in_multiline_mode = not in_multiline_mode
92
+
93
+ # Force redraw the app to update toolbar
94
+ if event.app:
95
+ event.app.invalidate()
96
+ elif app:
97
+ app.invalidate()
98
+
99
+ # Call the toggle callback if provided
100
+ if on_toggle_multiline:
101
+ on_toggle_multiline(in_multiline_mode)
102
+
103
+ # Instead of printing, we'll just update the toolbar
104
+ # The toolbar will show the current mode
105
+
106
+ @kb.add("c-l")
107
+ def _(event):
108
+ """Ctrl+L: Clear input."""
109
+ event.current_buffer.text = ""
110
+
111
+ return kb
112
+
113
+
114
+ async def get_enhanced_input(
115
+ agent_name: str,
116
+ default: str = "",
117
+ show_default: bool = False,
118
+ show_stop_hint: bool = False,
119
+ multiline: bool = False,
120
+ available_agent_names: List[str] = None,
121
+ syntax: str = None,
122
+ agent_types: dict = None,
123
+ ) -> str:
124
+ """
125
+ Enhanced input with advanced prompt_toolkit features.
126
+
127
+ Args:
128
+ agent_name: Name of the agent (used for prompt and history)
129
+ default: Default value if user presses enter
130
+ show_default: Whether to show the default value in the prompt
131
+ show_stop_hint: Whether to show the STOP hint
132
+ multiline: Start in multiline mode
133
+ available_agent_names: List of agent names for auto-completion
134
+ syntax: Syntax highlighting (e.g., 'python', 'sql')
135
+ agent_types: Dictionary mapping agent names to their types for display
136
+
137
+ Returns:
138
+ User input string
139
+ """
140
+ global in_multiline_mode, available_agents
141
+
142
+ # Update global state
143
+ in_multiline_mode = multiline
144
+ if available_agent_names:
145
+ available_agents = set(available_agent_names)
146
+
147
+ # Get or create history object for this agent
148
+ if agent_name not in agent_histories:
149
+ agent_histories[agent_name] = InMemoryHistory()
150
+
151
+ # Define callback for multiline toggle
152
+ def on_multiline_toggle(enabled):
153
+ nonlocal session
154
+ if hasattr(session, "app") and session.app:
155
+ session.app.invalidate()
156
+
157
+ # Define toolbar function that will update dynamically
158
+ def get_toolbar():
159
+ if in_multiline_mode:
160
+ mode_style = "ansired" # More noticeable for multiline mode
161
+ mode_text = "MULTILINE"
162
+ toggle_text = "Normal Editing"
163
+ else:
164
+ mode_style = "ansigreen"
165
+ mode_text = "NORMAL"
166
+ toggle_text = "Multiline Editing"
167
+
168
+ shortcuts = [
169
+ ("Ctrl+T", toggle_text),
170
+ ("Alt+Enter", "Submit" if in_multiline_mode else ""),
171
+ ("Ctrl+L", "Clear"),
172
+ ("↑/↓", "History"),
173
+ ]
174
+ # Only show relevant shortcuts based on mode
175
+ shortcuts = [(k, v) for k, v in shortcuts if v]
176
+
177
+ shortcut_text = " | ".join(f"{key}:{action}" for key, action in shortcuts)
178
+ return HTML(
179
+ f" <b>Agent:</b> <ansiblue> {agent_name} </ansiblue> | <b>Mode:</b> <{mode_style}> {mode_text} </{mode_style}> | {shortcut_text}"
180
+ )
181
+
182
+ # Create session with history and completions
183
+ session = PromptSession(
184
+ history=agent_histories[agent_name],
185
+ completer=AgentCompleter(
186
+ agents=list(available_agents) if available_agents else [],
187
+ agent_types=agent_types or {},
188
+ ),
189
+ complete_while_typing=True,
190
+ lexer=PygmentsLexer(PythonLexer) if syntax == "python" else None,
191
+ multiline=Condition(lambda: in_multiline_mode),
192
+ complete_in_thread=True,
193
+ mouse_support=True,
194
+ bottom_toolbar=get_toolbar, # Pass the function here
195
+ )
196
+
197
+ # Create key bindings with a reference to the app
198
+ bindings = create_keybindings(
199
+ on_toggle_multiline=on_multiline_toggle, app=session.app
200
+ )
201
+ session.app.key_bindings = bindings
202
+
203
+ # Create formatted prompt text
204
+ prompt_text = f"<ansicyan>{agent_name}</ansicyan> > "
205
+
206
+ # Add default value display if requested
207
+ if show_default and default and default != "STOP":
208
+ prompt_text = f"{prompt_text} [<ansigreen>{default}</ansigreen>] "
209
+
210
+ # Only show hints at startup if requested
211
+ if show_stop_hint:
212
+ if default == "STOP":
213
+ rich_print("[yellow]Press <ENTER> to finish.[/yellow]")
214
+ else:
215
+ rich_print("Enter a prompt, or [red]STOP[/red] to finish")
216
+ if default:
217
+ rich_print(
218
+ f"Press <ENTER> to use the default prompt:\n[cyan]{default}[/cyan]"
219
+ )
220
+
221
+ # Mention available features but only on first usage for this agent
222
+ if agent_name not in agent_messages_shown:
223
+ rich_print(
224
+ "[dim]Tip: Type /help for commands, press F1 for keyboard shortcuts. Ctrl+T toggles multiline mode. @Agent to switch agent[/dim]"
225
+ )
226
+ agent_messages_shown.add(agent_name)
227
+
228
+ # Process special commands
229
+ def pre_process_input(text):
230
+ # Command processing
231
+ if text and text.startswith("/"):
232
+ cmd = text[1:].strip().lower()
233
+ if cmd == "help":
234
+ return "HELP"
235
+ elif cmd == "clear":
236
+ return "CLEAR"
237
+ elif cmd == "agents":
238
+ return "LIST_AGENTS"
239
+
240
+ # Agent switching
241
+ if text and text.startswith("@"):
242
+ return f"SWITCH:{text[1:].strip()}"
243
+
244
+ return text
245
+
246
+ # Get the input - using async version
247
+ try:
248
+ result = await session.prompt_async(HTML(prompt_text), default=default)
249
+ return pre_process_input(result)
250
+ except KeyboardInterrupt:
251
+ # Handle Ctrl+C gracefully
252
+ return "STOP"
253
+ except EOFError:
254
+ # Handle Ctrl+D gracefully
255
+ return "STOP"
256
+ except Exception as e:
257
+ # Log and gracefully handle other exceptions
258
+ print(f"\nInput error: {type(e).__name__}: {e}")
259
+ return "STOP"
260
+
261
+
262
+ async def handle_special_commands(command, agent_app=None):
263
+ """Handle special input commands."""
264
+ # Quick guard for empty or None commands
265
+ if not command:
266
+ return False
267
+
268
+ # Check for special commands
269
+ if command == "HELP":
270
+ rich_print("\n[bold]Available Commands:[/bold]")
271
+ rich_print(" /help - Show this help")
272
+ rich_print(" /clear - Clear screen")
273
+ rich_print(" /agents - List available agents")
274
+ rich_print(" @agent_name - Switch to agent")
275
+ rich_print(" STOP - End session")
276
+ rich_print("\n[bold]Keyboard Shortcuts:[/bold]")
277
+ rich_print(
278
+ " Enter - Submit (normal mode) / New line (multiline mode)"
279
+ )
280
+ rich_print(" Alt+Enter - Always submit (even in multiline mode)")
281
+ rich_print(" Ctrl+T - Toggle multiline mode")
282
+ rich_print(" Ctrl+L - Clear input")
283
+ rich_print(" Up/Down - Navigate history")
284
+ rich_print(" F1 - Show help")
285
+ return True
286
+
287
+ elif command == "CLEAR":
288
+ # Clear screen (ANSI escape sequence)
289
+ print("\033c", end="")
290
+ return True
291
+
292
+ elif command == "LIST_AGENTS":
293
+ if available_agents:
294
+ rich_print("\n[bold]Available Agents:[/bold]")
295
+ for agent in sorted(available_agents):
296
+ rich_print(f" @{agent}")
297
+ else:
298
+ rich_print("[yellow]No agents available[/yellow]")
299
+ return True
300
+
301
+ elif isinstance(command, str) and command.startswith("SWITCH:"):
302
+ agent_name = command.split(":", 1)[1]
303
+ if agent_name in available_agents:
304
+ if agent_app:
305
+ rich_print(f"[green]Switching to agent: {agent_name}[/green]")
306
+ return {"switch_agent": agent_name}
307
+ else:
308
+ rich_print(
309
+ "[yellow]Agent switching not available in this context[/yellow]"
310
+ )
311
+ else:
312
+ rich_print(f"[red]Unknown agent: {agent_name}[/red]")
313
+ return True
314
+
315
+ return False