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

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.57
3
+ Version: 0.2.58
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
@@ -218,7 +218,7 @@ Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
220
  Requires-Dist: google-genai>=1.27.0
221
- Requires-Dist: mcp==1.12.4
221
+ Requires-Dist: mcp==1.13.1
222
222
  Requires-Dist: openai>=1.99.9
223
223
  Requires-Dist: opentelemetry-distro>=0.55b0
224
224
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
@@ -1,6 +1,6 @@
1
1
  mcp_agent/__init__.py,sha256=HWWxZeB-VxrUNNXZnu4duzKGwdfCdD2M_O6drN4kfs8,2389
2
2
  mcp_agent/app.py,sha256=3mtHP1nRQcRaKhhxgTmCOv00alh70nT7UxNA8bN47QE,5560
3
- mcp_agent/config.py,sha256=BjfZmhKnoGHH80puLY90RkZPx5PPm-yvgJEqPsvvNWY,19259
3
+ mcp_agent/config.py,sha256=hUdBh-o7apHpTodxYyMpF1d-QDwnuvivO-dt0PkwzeI,19466
4
4
  mcp_agent/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
5
5
  mcp_agent/context.py,sha256=lzz_Fyf9lz9BBAUt1bRVBlyyHjLkyeuyIziAi4qXYUk,7639
6
6
  mcp_agent/context_dependent.py,sha256=QXfhw3RaQCKfscEEBRGuZ3sdMWqkgShz2jJ1ivGGX1I,1455
@@ -52,7 +52,7 @@ mcp_agent/executor/executor.py,sha256=E44p6d-o3OMRoP_dNs_cDnyti91LQ3P9eNU88mSi1k
52
52
  mcp_agent/executor/task_registry.py,sha256=PCALFeYtkQrPBg4RBJnlA0aDI8nHclrNkHGUS4kV3W8,1242
53
53
  mcp_agent/executor/workflow_signal.py,sha256=Cg1uZBk3fn8kXhPOg-wINNuVaf3v9pvLD6NbqWy5Z6E,11142
54
54
  mcp_agent/human_input/__init__.py,sha256=RydNC10PhvTYFbLXXs0JMTnAt0ihPYeJZoRTnsq3eMg,909
55
- mcp_agent/human_input/elicitation_form.py,sha256=VgS-DXlwYTU4qDntok4Pqt8qfl1w_-Xby5PTlfNerug,28324
55
+ mcp_agent/human_input/elicitation_form.py,sha256=qckv7pqFSRgjqIpESX4C7OOBuG25R32wVTfyLaD-6wQ,29201
56
56
  mcp_agent/human_input/elicitation_forms.py,sha256=w8XQ1GfZX8Jw-VB4jnDI0Im4mF-T9Ts8mT2zRZBtL6M,3824
57
57
  mcp_agent/human_input/elicitation_handler.py,sha256=YfVhIhSBc9wuszPS4zoHho4n1pwmIoq13huN4MSRkIs,3305
58
58
  mcp_agent/human_input/elicitation_state.py,sha256=Unl9uhEybUqACCUimnETdfUprJNpYDMq3DdbbHw5oAw,1175
@@ -61,7 +61,7 @@ mcp_agent/human_input/handler.py,sha256=s712Z5ssTCwjL9-VKoIdP5CtgMh43YvepynYisiW
61
61
  mcp_agent/human_input/simple_form.py,sha256=u6iCo39IJftB1S1xljdQP3C18RuRCcwp7jKQTTDcLT4,3441
62
62
  mcp_agent/human_input/types.py,sha256=RtWBOVzy8vnYoQrc36jRLn8z8N3C4pDPMBN5vF6qM5Y,1476
63
63
  mcp_agent/llm/__init__.py,sha256=d8zgwG-bRFuwiMNMYkywg_qytk4P8lawyld_meuUmHI,68
64
- mcp_agent/llm/augmented_llm.py,sha256=ZJM3TXGV66aQ_zSDPrOG0r6EMVOOdeh1Equq8uNjDBM,28642
64
+ mcp_agent/llm/augmented_llm.py,sha256=ovJKfgDKtNFmIhT3pKKjsNsaTQicz07bLo4eoIFx3ik,28682
65
65
  mcp_agent/llm/augmented_llm_passthrough.py,sha256=bu0DJkjyFPzBZEU7f6MHnOp__9BCYl56tFd5nZVhSeY,8808
66
66
  mcp_agent/llm/augmented_llm_playback.py,sha256=rLzgai496e2RlxqQp_Bp0U-Y1FF1SGsWl9COx4GiCNE,5004
67
67
  mcp_agent/llm/augmented_llm_silent.py,sha256=IUnK_1Byy4D9TG0Pj46LFeNezgSTQ8d6MQIHWAImBwE,1846
@@ -78,18 +78,19 @@ mcp_agent/llm/usage_tracking.py,sha256=rF6v8QQDam8QbvlP4jzHljKqvuNHExeYDLkUMI86c
78
78
  mcp_agent/llm/providers/__init__.py,sha256=heVxtmuqFJOnjjxHz4bWSqTAxXoN1E8twC_gQ_yJpHk,265
79
79
  mcp_agent/llm/providers/anthropic_utils.py,sha256=vYDN5G5jKMhD2CQg8veJYab7tvvzYkDMq8M1g_hUAQg,3275
80
80
  mcp_agent/llm/providers/augmented_llm_aliyun.py,sha256=Th4qeyihOSfTrojPw8YsgzEyaDwhybk7hkXkFjH-1dY,1277
81
- mcp_agent/llm/providers/augmented_llm_anthropic.py,sha256=U8znA9HSCOx4FlhIjl-J29nbYc8Y-T6BXevtXuDafio,30352
81
+ mcp_agent/llm/providers/augmented_llm_anthropic.py,sha256=2IXAJVQOaMOGKLbZq5onwJ7E8baSsoIst7ffAZtyntw,30393
82
82
  mcp_agent/llm/providers/augmented_llm_azure.py,sha256=Xoo6dFst6L9SaGKurqptwwTUzr-sYsolZ-AFb_79puc,6098
83
- mcp_agent/llm/providers/augmented_llm_bedrock.py,sha256=lL_au5-QdVNFr7lxQQYk0HVQ3LKUieh2HHnBQsOWoro,82312
83
+ mcp_agent/llm/providers/augmented_llm_bedrock.py,sha256=gah6t-MSNJGgB-7OFVl7WAybNTh9Jygvgs0ABWyd69o,97313
84
84
  mcp_agent/llm/providers/augmented_llm_deepseek.py,sha256=vphkYMFyukaejBw8SkCN-MqcG9qsfXJfWKZYYtspqPY,3877
85
85
  mcp_agent/llm/providers/augmented_llm_generic.py,sha256=5Uq8ZBhcFuQTt7koP_5ykolREh2iWu8zKhNbh3pM9lQ,1210
86
- mcp_agent/llm/providers/augmented_llm_google_native.py,sha256=c6zczfs-Iw70j3OYELHJ4S7CRwAddkeXinex_yLMhmU,22194
86
+ mcp_agent/llm/providers/augmented_llm_google_native.py,sha256=QfxzDTZCfRLOE0XcV7rOw76hRgTZ_oGBg1Bn0m_PHVY,22235
87
87
  mcp_agent/llm/providers/augmented_llm_google_oai.py,sha256=g_g46h-YuxqbRZiO_dVo5zO2OkX1yx7nb6xDaQbOvWs,1137
88
88
  mcp_agent/llm/providers/augmented_llm_groq.py,sha256=w-R1N2B7790v9tXxRCPt2SKnaB-DRdEtN_51fpdYb_I,5355
89
- mcp_agent/llm/providers/augmented_llm_openai.py,sha256=v0iInSlPt939Dh2kGpGJ9_7qGpL7MhxQ7UNSc42dT6Q,25318
89
+ mcp_agent/llm/providers/augmented_llm_openai.py,sha256=RnwbzWMFWp2kHfmUhLTrx4rSTWkgJRc3XkN52_f3zt0,25359
90
90
  mcp_agent/llm/providers/augmented_llm_openrouter.py,sha256=m3wS83fabBOmaZJH9gQ9sFw_2TB4xTb44WCOPB-2NJ4,2001
91
91
  mcp_agent/llm/providers/augmented_llm_tensorzero_openai.py,sha256=D53Fry2AfBLOB5z9hM19U6_HMJeVNTpiBCAJb11ulNg,5503
92
92
  mcp_agent/llm/providers/augmented_llm_xai.py,sha256=MhlX91IUNynQ_NDknx4EQJLwg-NbR8lcHS1P4JuLOnA,1433
93
+ mcp_agent/llm/providers/bedrock_utils.py,sha256=Ok-nGQ4T4OuFhr5d6LhVY4hUiq481yaixDWBpwohu_Y,7734
93
94
  mcp_agent/llm/providers/google_converter.py,sha256=YmSfkkZR2YzR5DZduGaOW0v7BtjjindCIiuS8zOJ1VA,16941
94
95
  mcp_agent/llm/providers/multipart_converter_anthropic.py,sha256=QsgIwWJ14SNZsun3fKDQaUx5AYdk8X6UYeBgYlZgZN0,16607
95
96
  mcp_agent/llm/providers/multipart_converter_openai.py,sha256=8vBwX7PB62mV6pe4VvAj9YxzX1Dp1RJMZK1NWOMnioY,17998
@@ -138,7 +139,7 @@ mcp_agent/resources/examples/data-analysis/analysis.py,sha256=UaZk8RzsIj0TVXIM1k
138
139
  mcp_agent/resources/examples/data-analysis/fastagent.config.yaml,sha256=ini94PHyJCfgpjcjHKMMbGuHs6LIj46F1NwY0ll5HVk,1609
139
140
  mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv,sha256=pcMeOL1_r8m8MziE6xgbBrQbjl5Ijo98yycZn7O-dlk,227977
140
141
  mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py,sha256=ZrPcj0kv75QXvtN0J_vhCmwxycnAodv35adUBZ9_8Ss,2903
141
- mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py,sha256=n-qVogV2I0GYGwYe-8PG1DEvp4M3JzKHoYmemMEm6Ic,8831
142
+ mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py,sha256=JSRSZ2rKqsHB0gt7LvyyVR9whnhmi_8kbvc9V6jvx2M,9329
142
143
  mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py,sha256=z9kHdNc6XWjAWkvet7inVBIcYxfWoxU6n9iHrsEqU7A,6206
143
144
  mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml,sha256=HPe0cuFL4-rzS4hHNgZiLMPEv0jYXOp7iSsrUliAaqs,1080
144
145
  mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example,sha256=1vkBmh9f4mnQZm6-2B7vyU1OepImviPW5MNAJkvUIPE,394
@@ -185,8 +186,8 @@ mcp_agent/resources/examples/workflows/short_story.txt,sha256=X3y_1AyhLFN2AKzCKv
185
186
  mcp_agent/tools/tool_definition.py,sha256=L3Pxl-uLEXqlVoo-bYuFTFALeI-2pIU44YgFhsTKEtM,398
186
187
  mcp_agent/ui/console_display.py,sha256=ts2oPxxprzbT9rMqZhzwq6DQkNfbq8XNwbgEPPMi7nI,32083
187
188
  mcp_agent/ui/console_display_legacy.py,sha256=sm2v61-IPVafbF7uUaOyhO2tW_zgFWOjNS83IEWqGgI,14931
188
- fast_agent_mcp-0.2.57.dist-info/METADATA,sha256=8NJird91GzBusg3XcllAlxSRvG-fHS9KR7A2AFJowhw,30459
189
- fast_agent_mcp-0.2.57.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
190
- fast_agent_mcp-0.2.57.dist-info/entry_points.txt,sha256=QaX5kLdI0VdMPRdPUF1nkG_WdLUTNjp_icW6e3EhNYU,232
191
- fast_agent_mcp-0.2.57.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
192
- fast_agent_mcp-0.2.57.dist-info/RECORD,,
189
+ fast_agent_mcp-0.2.58.dist-info/METADATA,sha256=WRpwRbCBYX-Aqf2TBHNWgRVxsNJUxMKuwNELJ29_ooA,30459
190
+ fast_agent_mcp-0.2.58.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
191
+ fast_agent_mcp-0.2.58.dist-info/entry_points.txt,sha256=QaX5kLdI0VdMPRdPUF1nkG_WdLUTNjp_icW6e3EhNYU,232
192
+ fast_agent_mcp-0.2.58.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
193
+ fast_agent_mcp-0.2.58.dist-info/RECORD,,
mcp_agent/config.py CHANGED
@@ -276,6 +276,9 @@ class BedrockSettings(BaseModel):
276
276
  profile: str | None = None
277
277
  """AWS profile to use for authentication"""
278
278
 
279
+ reasoning_effort: Literal["minimal", "low", "medium", "high"] = "minimal"
280
+ """Default reasoning effort for Bedrock models. Can be overridden in model string (e.g., bedrock.claude-sonnet-4-0.high)"""
281
+
279
282
  model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
280
283
 
281
284
 
@@ -5,9 +5,7 @@ from typing import Any, Dict, Optional
5
5
 
6
6
  from mcp.types import ElicitRequestedSchema
7
7
  from prompt_toolkit import Application
8
- from prompt_toolkit.application.current import get_app
9
8
  from prompt_toolkit.buffer import Buffer
10
- from prompt_toolkit.filters import Condition
11
9
  from prompt_toolkit.formatted_text import FormattedText
12
10
  from prompt_toolkit.key_binding import KeyBindings
13
11
  from prompt_toolkit.key_binding.bindings.focus import focus_next, focus_previous
@@ -327,16 +325,21 @@ class ElicitationForm:
327
325
  def focus_previous_left(event):
328
326
  focus_previous(event)
329
327
 
330
- # Create filter for non-multiline fields
331
- not_in_multiline = Condition(lambda: not self._is_in_multiline_field())
332
-
333
- @kb.add("c-m", filter=not_in_multiline) # Enter to submit only when not in multiline
328
+ # Enter always submits
329
+ @kb.add("c-m")
334
330
  def submit(event):
335
331
  self._accept()
336
332
 
337
- @kb.add("c-j") # Ctrl+J as alternative submit for multiline fields
338
- def submit_alt(event):
339
- self._accept()
333
+ # Ctrl+J inserts newlines
334
+ @kb.add("c-j")
335
+ def insert_newline(event):
336
+ # Insert a newline at the cursor position
337
+ event.current_buffer.insert_text('\n')
338
+ # Mark this field as multiline when user adds a newline
339
+ for field_name, widget in self.field_widgets.items():
340
+ if isinstance(widget, Buffer) and widget == event.current_buffer:
341
+ self.multiline_fields.add(field_name)
342
+ break
340
343
 
341
344
  # ESC should ALWAYS cancel immediately, no matter what
342
345
  @kb.add("escape", eager=True, is_global=True)
@@ -353,7 +356,7 @@ class ElicitationForm:
353
356
  [
354
357
  (
355
358
  "class:bottom-toolbar.text",
356
- " <TAB> or ↑↓→← to navigate. <ENTER> submit (<Ctrl+J> in multiline). <ESC> to cancel. ",
359
+ " <TAB>/↑↓→← navigate. <ENTER> submit. <Ctrl+J> insert new line. <ESC> cancel. ",
357
360
  ),
358
361
  (
359
362
  "class:bottom-toolbar.text",
@@ -435,6 +438,7 @@ class ElicitationForm:
435
438
 
436
439
  return constraints
437
440
 
441
+
438
442
  def _create_field(self, field_name: str, field_def: Dict[str, Any]):
439
443
  """Create a field widget."""
440
444
 
@@ -510,7 +514,8 @@ class ElicitationForm:
510
514
  enum_names = field_def.get("enumNames", enum_values)
511
515
  values = [(val, name) for val, name in zip(enum_values, enum_names)]
512
516
 
513
- radio_list = RadioList(values=values)
517
+ default_value = field_def.get("default")
518
+ radio_list = RadioList(values=values, default=default_value)
514
519
  self.field_widgets[field_name] = radio_list
515
520
 
516
521
  return HSplit([label, Frame(radio_list, height=min(len(values) + 2, 6))])
@@ -541,23 +546,35 @@ class ElicitationForm:
541
546
  else:
542
547
  constraints = {}
543
548
 
544
- # Determine if field should be multiline based on max_length
549
+ default_value = field_def.get("default")
550
+
551
+ # Determine if field should be multiline based on max_length or default value length
545
552
  if field_type == "string":
546
553
  max_length = constraints.get("maxLength")
554
+ # Check default value length if maxLength not specified
555
+ if not max_length and default_value is not None:
556
+ max_length = len(str(default_value))
547
557
  else:
548
558
  max_length = None
549
- if max_length and max_length > 100:
559
+
560
+ # Check if default value contains newlines
561
+ if field_type == "string" and default_value is not None and '\n' in str(default_value):
562
+ multiline = True
563
+ self.multiline_fields.add(field_name) # Track multiline fields
564
+ # Set height to actual line count for fields with newlines in default
565
+ initial_height = str(default_value).count('\n') + 1
566
+ elif max_length and max_length > 100:
550
567
  # Use multiline for longer fields
551
568
  multiline = True
552
569
  self.multiline_fields.add(field_name) # Track multiline fields
553
570
  if max_length <= 300:
554
- height = 3
571
+ initial_height = 3
555
572
  else:
556
- height = 5
573
+ initial_height = 5
557
574
  else:
558
575
  # Single line for shorter fields
559
576
  multiline = False
560
- height = 1
577
+ initial_height = 1
561
578
 
562
579
  buffer = Buffer(
563
580
  validator=validator,
@@ -566,6 +583,8 @@ class ElicitationForm:
566
583
  complete_while_typing=False, # Disable completion for cleaner experience
567
584
  enable_history_search=False, # Disable history for cleaner experience
568
585
  )
586
+ if default_value is not None:
587
+ buffer.text = str(default_value)
569
588
  self.field_widgets[field_name] = buffer
570
589
 
571
590
  # Create dynamic style function for focus highlighting and validation errors
@@ -581,31 +600,24 @@ class ElicitationForm:
581
600
  else:
582
601
  return "class:input-field"
583
602
 
603
+ # Create a dynamic height function based on content
604
+ def get_dynamic_height():
605
+ if not buffer.text:
606
+ return initial_height
607
+ # Calculate height based on number of newlines in buffer
608
+ line_count = buffer.text.count('\n') + 1
609
+ # Use initial height as minimum, grow up to 20 lines
610
+ return min(max(line_count, initial_height), 20)
611
+
584
612
  text_input = Window(
585
613
  BufferControl(buffer=buffer),
586
- height=height,
614
+ height=get_dynamic_height, # Use dynamic height function
587
615
  style=get_field_style, # Use dynamic style function
588
616
  wrap_lines=True if multiline else False, # Enable word wrap for multiline
589
617
  )
590
618
 
591
619
  return HSplit([label, Frame(text_input)])
592
620
 
593
- def _is_in_multiline_field(self) -> bool:
594
- """Check if currently focused field is a multiline field."""
595
-
596
- focused = get_app().layout.current_control
597
-
598
- # Find which field this control belongs to
599
- # Only Buffer widgets can be multiline, so only check those
600
- for field_name, widget in self.field_widgets.items():
601
- if (
602
- isinstance(widget, Buffer)
603
- and hasattr(focused, "buffer")
604
- and widget == focused.buffer
605
- ):
606
- return field_name in self.multiline_fields
607
- return False
608
-
609
621
  def _validate_form(self) -> tuple[bool, Optional[str]]:
610
622
  """Validate the entire form."""
611
623
 
@@ -101,6 +101,7 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
101
101
  PARAM_USE_HISTORY = "use_history"
102
102
  PARAM_MAX_ITERATIONS = "max_iterations"
103
103
  PARAM_TEMPLATE_VARS = "template_vars"
104
+ PARAM_MCP_METADATA = "mcp_metadata"
104
105
 
105
106
  # Base set of fields that should always be excluded
106
107
  BASE_EXCLUDE_FIELDS = {PARAM_METADATA}
@@ -69,6 +69,7 @@ class AnthropicAugmentedLLM(AugmentedLLM[MessageParam, Message]):
69
69
  AugmentedLLM.PARAM_MAX_ITERATIONS,
70
70
  AugmentedLLM.PARAM_PARALLEL_TOOL_CALLS,
71
71
  AugmentedLLM.PARAM_TEMPLATE_VARS,
72
+ AugmentedLLM.PARAM_MCP_METADATA,
72
73
  }
73
74
 
74
75
  def __init__(self, *args, **kwargs) -> None: