flock-core 0.5.0b28__py3-none-any.whl → 0.5.56b0__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 flock-core might be problematic. Click here for more details.
- flock/__init__.py +12 -217
- flock/agent.py +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/{core/util → helper}/cli_helper.py +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkside.toml +1 -1
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +1 -1
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.56b0.dist-info/METADATA +747 -0
- flock_core-0.5.56b0.dist-info/RECORD +398 -0
- flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -118
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_streaming_results_container.html +0 -195
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
|
@@ -14,15 +14,14 @@ from mcp.shared.message import SessionMessage
|
|
|
14
14
|
from opentelemetry import trace
|
|
15
15
|
from pydantic import Field
|
|
16
16
|
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.
|
|
19
|
-
from flock.
|
|
20
|
-
from flock.core.mcp.mcp_client_manager import FlockMCPClientManager
|
|
21
|
-
from flock.core.mcp.mcp_config import (
|
|
17
|
+
from flock.logging.logging import get_logger
|
|
18
|
+
from flock.mcp.client import FlockMCPClient
|
|
19
|
+
from flock.mcp.config import (
|
|
22
20
|
FlockMCPConfiguration,
|
|
23
21
|
FlockMCPConnectionConfiguration,
|
|
24
22
|
)
|
|
25
|
-
from flock.
|
|
23
|
+
from flock.mcp.types import SseServerParameters
|
|
24
|
+
|
|
26
25
|
|
|
27
26
|
logger = get_logger("mcp.sse.server")
|
|
28
27
|
tracer = trace.get_tracer(__name__)
|
|
@@ -33,9 +32,7 @@ class FlockSSEConnectionConfig(FlockMCPConnectionConfiguration):
|
|
|
33
32
|
|
|
34
33
|
# Only thing we need to override here is the concrete transport_type
|
|
35
34
|
# and connection_parameters fields.
|
|
36
|
-
transport_type: Literal["sse"] = Field(
|
|
37
|
-
default="sse", description="Use the sse transport type."
|
|
38
|
-
)
|
|
35
|
+
transport_type: Literal["sse"] = Field(default="sse", description="Use the sse transport type.")
|
|
39
36
|
|
|
40
37
|
connection_parameters: SseServerParameters = Field(
|
|
41
38
|
..., description="SSE Server Connection Parameters."
|
|
@@ -56,7 +53,7 @@ class FlockSSEConfig(FlockMCPConfiguration):
|
|
|
56
53
|
class FlockSSEClient(FlockMCPClient):
|
|
57
54
|
"""Client for SSE Servers."""
|
|
58
55
|
|
|
59
|
-
config:
|
|
56
|
+
config: FlockMCPConfiguration = Field(..., description="Client configuration.")
|
|
60
57
|
|
|
61
58
|
async def create_transport(
|
|
62
59
|
self,
|
|
@@ -73,22 +70,14 @@ class FlockSSEClient(FlockMCPClient):
|
|
|
73
70
|
param_copy = copy.deepcopy(params)
|
|
74
71
|
|
|
75
72
|
if additional_params:
|
|
76
|
-
override_headers = bool(
|
|
77
|
-
additional_params.get("override_headers", False)
|
|
78
|
-
)
|
|
73
|
+
override_headers = bool(additional_params.get("override_headers", False))
|
|
79
74
|
if "headers" in additional_params:
|
|
80
75
|
if override_headers:
|
|
81
|
-
param_copy.headers = additional_params.get(
|
|
82
|
-
"headers", params.headers
|
|
83
|
-
)
|
|
76
|
+
param_copy.headers = additional_params.get("headers", params.headers)
|
|
84
77
|
else:
|
|
85
|
-
param_copy.headers.update(
|
|
86
|
-
additional_params.get("headers", {})
|
|
87
|
-
)
|
|
78
|
+
param_copy.headers.update(additional_params.get("headers", {}))
|
|
88
79
|
if "read_timeout_seconds" in additional_params:
|
|
89
|
-
param_copy.timeout =
|
|
90
|
-
"read_timeout_seconds", params.timeout
|
|
91
|
-
)
|
|
80
|
+
param_copy.timeout = additional_params.get("read_timeout_seconds", params.timeout)
|
|
92
81
|
|
|
93
82
|
if "sse_read_timeout" in additional_params:
|
|
94
83
|
param_copy.sse_read_timeout = additional_params.get(
|
|
@@ -113,34 +102,3 @@ class FlockSSEClient(FlockMCPClient):
|
|
|
113
102
|
timeout=float(param_copy.timeout),
|
|
114
103
|
sse_read_timeout=float(param_copy.sse_read_timeout),
|
|
115
104
|
)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class FlockSSEClientManager(FlockMCPClientManager):
|
|
119
|
-
"""Manager for handling SSE Clients."""
|
|
120
|
-
|
|
121
|
-
client_config: FlockSSEConfig = Field(
|
|
122
|
-
..., description="Configuration for clients."
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
async def make_client(
|
|
126
|
-
self, additional_params: dict[str, Any]
|
|
127
|
-
) -> FlockSSEClient:
|
|
128
|
-
"""Create a new client instance."""
|
|
129
|
-
new_client = FlockSSEClient(
|
|
130
|
-
config=self.client_config, additional_params=additional_params
|
|
131
|
-
)
|
|
132
|
-
return new_client
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
class FlockSSEServer(FlockMCPServer):
|
|
136
|
-
"""Class which represents a MCP Server using the SSE Transport type."""
|
|
137
|
-
|
|
138
|
-
config: FlockSSEConfig = Field(..., description="Config for the server.")
|
|
139
|
-
|
|
140
|
-
async def initialize(self) -> FlockSSEClientManager:
|
|
141
|
-
"""Called when initializing the server."""
|
|
142
|
-
client_manager = FlockSSEClientManager(
|
|
143
|
-
client_config=self.config,
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
return client_manager
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"""Default Stdio Server Implementation for
|
|
1
|
+
"""Default Stdio Server Implementation for flock."""
|
|
@@ -13,15 +13,14 @@ from mcp.types import JSONRPCMessage
|
|
|
13
13
|
from opentelemetry import trace
|
|
14
14
|
from pydantic import Field
|
|
15
15
|
|
|
16
|
-
from flock.
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.
|
|
19
|
-
from flock.core.mcp.mcp_client_manager import FlockMCPClientManager
|
|
20
|
-
from flock.core.mcp.mcp_config import (
|
|
16
|
+
from flock.logging.logging import get_logger
|
|
17
|
+
from flock.mcp.client import FlockMCPClient
|
|
18
|
+
from flock.mcp.config import (
|
|
21
19
|
FlockMCPConfiguration,
|
|
22
20
|
FlockMCPConnectionConfiguration,
|
|
23
21
|
)
|
|
24
|
-
from flock.
|
|
22
|
+
from flock.mcp.types import StdioServerParameters
|
|
23
|
+
|
|
25
24
|
|
|
26
25
|
logger = get_logger("mcp.stdio.server")
|
|
27
26
|
tracer = trace.get_tracer(__name__)
|
|
@@ -56,7 +55,7 @@ class FlockStdioConfig(FlockMCPConfiguration):
|
|
|
56
55
|
class FlockStdioClient(FlockMCPClient):
|
|
57
56
|
"""Client for Stdio Servers."""
|
|
58
57
|
|
|
59
|
-
config:
|
|
58
|
+
config: FlockMCPConfiguration = Field(..., description="Client Configuration.")
|
|
60
59
|
|
|
61
60
|
async def create_transport(
|
|
62
61
|
self,
|
|
@@ -78,9 +77,7 @@ class FlockStdioClient(FlockMCPClient):
|
|
|
78
77
|
if additional_params:
|
|
79
78
|
# If it is present, then modify server parameters based on certain keys.
|
|
80
79
|
if "command" in additional_params:
|
|
81
|
-
param_copy.command = additional_params.get(
|
|
82
|
-
"command", params.command
|
|
83
|
-
)
|
|
80
|
+
param_copy.command = additional_params.get("command", params.command)
|
|
84
81
|
if "args" in additional_params:
|
|
85
82
|
param_copy.args = additional_params.get("args", params.command)
|
|
86
83
|
if "env" in additional_params:
|
|
@@ -90,9 +87,7 @@ class FlockStdioClient(FlockMCPClient):
|
|
|
90
87
|
param_copy.cwd = additional_params.get("cwd", params.env)
|
|
91
88
|
|
|
92
89
|
if "encoding" in additional_params:
|
|
93
|
-
param_copy.encoding = additional_params.get(
|
|
94
|
-
"encoding", params.encoding
|
|
95
|
-
)
|
|
90
|
+
param_copy.encoding = additional_params.get("encoding", params.encoding)
|
|
96
91
|
|
|
97
92
|
if "encoding_error_handler" in additional_params:
|
|
98
93
|
param_copy.encoding_error_handler = additional_params.get(
|
|
@@ -101,38 +96,3 @@ class FlockStdioClient(FlockMCPClient):
|
|
|
101
96
|
|
|
102
97
|
# stdio_client already is an AsyncContextManager
|
|
103
98
|
return stdio_client(server=param_copy)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# Not really needed but kept here as an example.
|
|
107
|
-
class FlockStdioClientManager(FlockMCPClientManager):
|
|
108
|
-
"""Manager for handling Stdio Clients."""
|
|
109
|
-
|
|
110
|
-
client_config: FlockStdioConfig = Field(
|
|
111
|
-
..., description="Configuration for clients."
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
async def make_client(
|
|
115
|
-
self, additional_params: dict[str, Any] | None = None
|
|
116
|
-
):
|
|
117
|
-
"""Create a new client instance with any additional parameters."""
|
|
118
|
-
new_client = FlockStdioClient(
|
|
119
|
-
config=self.client_config,
|
|
120
|
-
additional_params=additional_params,
|
|
121
|
-
)
|
|
122
|
-
return new_client
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class FlockMCPStdioServer(FlockMCPServer):
|
|
126
|
-
"""Class which represents a MCP Server using the Stdio Transport type.
|
|
127
|
-
|
|
128
|
-
This means (most likely) that the server is a locally
|
|
129
|
-
executed script.
|
|
130
|
-
"""
|
|
131
|
-
|
|
132
|
-
config: FlockStdioConfig = Field(..., description="Config for the server.")
|
|
133
|
-
|
|
134
|
-
async def initialize(self) -> FlockStdioClientManager:
|
|
135
|
-
"""Called when initializing the server."""
|
|
136
|
-
client_manager = FlockStdioClientManager(client_config=self.config)
|
|
137
|
-
|
|
138
|
-
return client_manager
|
|
@@ -16,18 +16,17 @@ from mcp.shared.message import SessionMessage
|
|
|
16
16
|
from opentelemetry import trace
|
|
17
17
|
from pydantic import Field
|
|
18
18
|
|
|
19
|
-
from flock.
|
|
20
|
-
from flock.
|
|
21
|
-
from flock.
|
|
22
|
-
from flock.core.mcp.mcp_client_manager import FlockMCPClientManager
|
|
23
|
-
from flock.core.mcp.mcp_config import (
|
|
19
|
+
from flock.logging.logging import get_logger
|
|
20
|
+
from flock.mcp.client import FlockMCPClient
|
|
21
|
+
from flock.mcp.config import (
|
|
24
22
|
FlockMCPConfiguration,
|
|
25
23
|
FlockMCPConnectionConfiguration,
|
|
26
24
|
)
|
|
27
|
-
from flock.
|
|
25
|
+
from flock.mcp.types import (
|
|
28
26
|
StreamableHttpServerParameters,
|
|
29
27
|
)
|
|
30
28
|
|
|
29
|
+
|
|
31
30
|
logger = get_logger("mcp.streamable_http.server")
|
|
32
31
|
tracer = trace.get_tracer(__name__)
|
|
33
32
|
|
|
@@ -63,48 +62,38 @@ class FlockStreamableHttpConfig(FlockMCPConfiguration):
|
|
|
63
62
|
class FlockStreamableHttpClient(FlockMCPClient):
|
|
64
63
|
"""Client for StreamableHttpServers."""
|
|
65
64
|
|
|
66
|
-
config:
|
|
67
|
-
..., description="Client configuration."
|
|
68
|
-
)
|
|
65
|
+
config: FlockMCPConfiguration = Field(..., description="Client configuration.")
|
|
69
66
|
|
|
70
67
|
async def create_transport(
|
|
71
68
|
self,
|
|
72
69
|
params: StreamableHttpServerParameters,
|
|
73
70
|
additional_params: dict[str, Any] | None = None,
|
|
74
71
|
) -> AbstractAsyncContextManager[
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
]:
|
|
72
|
+
tuple[
|
|
73
|
+
MemoryObjectReceiveStream[SessionMessage | Exception],
|
|
74
|
+
MemoryObjectSendStream[SessionMessage],
|
|
75
|
+
GetSessionIdCallback,
|
|
76
|
+
],
|
|
77
|
+
None,
|
|
78
|
+
]:
|
|
82
79
|
"""Return an async context manager whose __aenter__ method yields (read_stream, send_stream)."""
|
|
83
80
|
param_copy = copy.deepcopy(params)
|
|
84
81
|
|
|
85
82
|
if additional_params:
|
|
86
|
-
override_headers = bool(
|
|
87
|
-
additional_params.get("override_headers", False)
|
|
88
|
-
)
|
|
83
|
+
override_headers = bool(additional_params.get("override_headers", False))
|
|
89
84
|
|
|
90
85
|
if "headers" in additional_params:
|
|
91
86
|
if override_headers:
|
|
92
|
-
param_copy.headers = additional_params.get(
|
|
93
|
-
"headers", params.headers
|
|
94
|
-
)
|
|
87
|
+
param_copy.headers = additional_params.get("headers", params.headers)
|
|
95
88
|
else:
|
|
96
|
-
param_copy.headers.update(
|
|
97
|
-
additional_params.get("headers", {})
|
|
98
|
-
)
|
|
89
|
+
param_copy.headers.update(additional_params.get("headers", {}))
|
|
99
90
|
if "auth" in additional_params and isinstance(
|
|
100
91
|
additional_params.get("auth"), httpx.Auth
|
|
101
92
|
):
|
|
102
93
|
param_copy.auth = additional_params.get("auth", param_copy.auth)
|
|
103
94
|
|
|
104
95
|
if "read_timeout_seconds" in additional_params:
|
|
105
|
-
param_copy.timeout = additional_params.get(
|
|
106
|
-
"read_timeout_seconds", params.timeout
|
|
107
|
-
)
|
|
96
|
+
param_copy.timeout = additional_params.get("read_timeout_seconds", params.timeout)
|
|
108
97
|
|
|
109
98
|
if "sse_read_timeout" in additional_params:
|
|
110
99
|
param_copy.sse_read_timeout = additional_params.get(
|
|
@@ -133,37 +122,3 @@ class FlockStreamableHttpClient(FlockMCPClient):
|
|
|
133
122
|
terminate_on_close=param_copy.terminate_on_close,
|
|
134
123
|
auth=param_copy.auth,
|
|
135
124
|
)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
class FlockStreamableHttpClientManager(FlockMCPClientManager):
|
|
139
|
-
"""Manager for handling StreamableHttpClients."""
|
|
140
|
-
|
|
141
|
-
client_config: FlockStreamableHttpConfig = Field(
|
|
142
|
-
..., description="Configuration for clients."
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
async def make_client(
|
|
146
|
-
self, additional_params: dict[str, Any] | None = None
|
|
147
|
-
) -> FlockStreamableHttpClient:
|
|
148
|
-
"""Create a new client instance."""
|
|
149
|
-
new_client = FlockStreamableHttpClient(
|
|
150
|
-
config=self.client_config,
|
|
151
|
-
additional_params=additional_params,
|
|
152
|
-
)
|
|
153
|
-
return new_client
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
class FlockStreamableHttpServer(FlockMCPServer):
|
|
157
|
-
"""Class which represents a MCP Server using the streamable Http Transport type."""
|
|
158
|
-
|
|
159
|
-
config: FlockStreamableHttpConfig = Field(
|
|
160
|
-
..., description="Config for the server."
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
async def initialize(self) -> FlockStreamableHttpClientManager:
|
|
164
|
-
"""Called when initializing the server."""
|
|
165
|
-
client_manager = FlockStreamableHttpClientManager(
|
|
166
|
-
client_config=self.config
|
|
167
|
-
)
|
|
168
|
-
|
|
169
|
-
return client_manager
|
|
@@ -13,15 +13,14 @@ from mcp.shared.message import SessionMessage
|
|
|
13
13
|
from opentelemetry import trace
|
|
14
14
|
from pydantic import Field
|
|
15
15
|
|
|
16
|
-
from flock.
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.
|
|
19
|
-
from flock.core.mcp.mcp_client_manager import FlockMCPClientManager
|
|
20
|
-
from flock.core.mcp.mcp_config import (
|
|
16
|
+
from flock.logging.logging import get_logger
|
|
17
|
+
from flock.mcp.client import FlockMCPClient
|
|
18
|
+
from flock.mcp.config import (
|
|
21
19
|
FlockMCPConfiguration,
|
|
22
20
|
FlockMCPConnectionConfiguration,
|
|
23
21
|
)
|
|
24
|
-
from flock.
|
|
22
|
+
from flock.mcp.types import WebsocketServerParameters
|
|
23
|
+
|
|
25
24
|
|
|
26
25
|
logger = get_logger("mcp.ws.server")
|
|
27
26
|
tracer = trace.get_tracer(__name__)
|
|
@@ -59,7 +58,7 @@ class FlockWSConfig(FlockMCPConfiguration):
|
|
|
59
58
|
class FlockWSClient(FlockMCPClient):
|
|
60
59
|
"""Client for Websocket servers."""
|
|
61
60
|
|
|
62
|
-
config:
|
|
61
|
+
config: FlockMCPConfiguration = Field(..., description="Client Configuration")
|
|
63
62
|
|
|
64
63
|
# This one we HAVE to specify. This tells Flock
|
|
65
64
|
# how to create the underlying connection.
|
|
@@ -84,36 +83,4 @@ class FlockWSClient(FlockMCPClient):
|
|
|
84
83
|
# If present, then apply the changes in "url" to the create_transport logic.
|
|
85
84
|
param_copy.url = additional_params.get("url", params.url)
|
|
86
85
|
|
|
87
|
-
return websocket_client(
|
|
88
|
-
url=param_copy.url
|
|
89
|
-
) # return the async context manager
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
# not really needed, but kept for type hints and as an example.
|
|
93
|
-
class FlockWSClientManager(FlockMCPClientManager):
|
|
94
|
-
"""Manager for handling websocket clients."""
|
|
95
|
-
|
|
96
|
-
client_config: FlockWSConfig = Field(
|
|
97
|
-
..., description="Configuration for clients."
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
async def make_client(self, additional_params=None):
|
|
101
|
-
"""Create a new client instance."""
|
|
102
|
-
new_client = FlockWSClient(
|
|
103
|
-
config=self.client_config,
|
|
104
|
-
additional_params=additional_params,
|
|
105
|
-
)
|
|
106
|
-
return new_client
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class FlockWSServer(FlockMCPServer):
|
|
110
|
-
"""Class which represents an MCP Server using the websocket transport type."""
|
|
111
|
-
|
|
112
|
-
config: FlockWSConfig = Field(..., description="Config for the server.")
|
|
113
|
-
|
|
114
|
-
# Specify the concrete type for the server.
|
|
115
|
-
async def initialize(self) -> FlockWSClientManager:
|
|
116
|
-
"""Called when initializing the server."""
|
|
117
|
-
client_manager = FlockWSClientManager(client_config=self.config)
|
|
118
|
-
|
|
119
|
-
return client_manager
|
|
86
|
+
return websocket_client(url=param_copy.url) # return the async context manager
|
|
@@ -8,8 +8,10 @@ from mcp import Tool
|
|
|
8
8
|
from mcp.types import CallToolResult, TextContent, ToolAnnotations
|
|
9
9
|
from opentelemetry import trace
|
|
10
10
|
from pydantic import BaseModel, Field
|
|
11
|
+
from typing_extensions import Self
|
|
12
|
+
|
|
13
|
+
from flock.logging.logging import get_logger
|
|
11
14
|
|
|
12
|
-
from flock.core.logging.logging import get_logger
|
|
13
15
|
|
|
14
16
|
logger = get_logger("mcp.tool")
|
|
15
17
|
tracer = trace.get_tracer(__name__)
|
|
@@ -31,17 +33,11 @@ class FlockMCPTool(BaseModel):
|
|
|
31
33
|
|
|
32
34
|
name: str = Field(..., description="Name of the tool")
|
|
33
35
|
|
|
34
|
-
agent_id: str = Field(
|
|
35
|
-
..., description="Associated agent_id. Used for internal tracking."
|
|
36
|
-
)
|
|
36
|
+
agent_id: str = Field(..., description="Associated agent_id. Used for internal tracking.")
|
|
37
37
|
|
|
38
|
-
run_id: str = Field(
|
|
39
|
-
..., description="Associated run_id. Used for internal tracking."
|
|
40
|
-
)
|
|
38
|
+
run_id: str = Field(..., description="Associated run_id. Used for internal tracking.")
|
|
41
39
|
|
|
42
|
-
description: str | None = Field(
|
|
43
|
-
..., description="A human-readable description of the tool"
|
|
44
|
-
)
|
|
40
|
+
description: str | None = Field(..., description="A human-readable description of the tool")
|
|
45
41
|
|
|
46
42
|
input_schema: dict[str, Any] = Field(
|
|
47
43
|
...,
|
|
@@ -53,9 +49,7 @@ class FlockMCPTool(BaseModel):
|
|
|
53
49
|
)
|
|
54
50
|
|
|
55
51
|
@classmethod
|
|
56
|
-
def from_mcp_tool(
|
|
57
|
-
cls: type[T], tool: Tool, agent_id: str, run_id: str
|
|
58
|
-
) -> T:
|
|
52
|
+
def from_mcp_tool(cls, tool: Tool, agent_id: str, run_id: str) -> Self:
|
|
59
53
|
"""Convert MCP Tool to Flock Tool."""
|
|
60
54
|
return cls(
|
|
61
55
|
name=tool.name,
|
|
@@ -67,7 +61,7 @@ class FlockMCPTool(BaseModel):
|
|
|
67
61
|
)
|
|
68
62
|
|
|
69
63
|
@classmethod
|
|
70
|
-
def to_mcp_tool(cls
|
|
64
|
+
def to_mcp_tool(cls, instance: Self) -> Tool | None:
|
|
71
65
|
"""Convert a flock mcp tool into a mcp tool."""
|
|
72
66
|
return Tool(
|
|
73
67
|
name=instance.name,
|
|
@@ -77,17 +71,17 @@ class FlockMCPTool(BaseModel):
|
|
|
77
71
|
)
|
|
78
72
|
|
|
79
73
|
# Use DSPy's converter for JSON Schema → Tool args to stay aligned with DSPy.
|
|
80
|
-
def _convert_input_schema_to_tool_args(
|
|
74
|
+
def _convert_input_schema_to_tool_args(
|
|
75
|
+
self, input_schema: dict[str, Any]
|
|
76
|
+
) -> tuple[dict[str, Any], dict[str, Any], dict[str, str]]:
|
|
81
77
|
try:
|
|
82
78
|
return convert_input_schema_to_tool_args(input_schema)
|
|
83
79
|
except Exception as e: # pragma: no cover - defensive
|
|
84
|
-
logger.
|
|
80
|
+
logger.exception("Failed to convert MCP tool schema to DSPy tool args: %s", e)
|
|
85
81
|
# Fallback to empty definitions to avoid breaking execution
|
|
86
82
|
return {}, {}, {}
|
|
87
83
|
|
|
88
|
-
def _convert_mcp_tool_result(
|
|
89
|
-
self, call_tool_result: CallToolResult
|
|
90
|
-
) -> str | list[Any]:
|
|
84
|
+
def _convert_mcp_tool_result(self, call_tool_result: CallToolResult) -> str | list[Any]:
|
|
91
85
|
text_contents: list[TextContent] = []
|
|
92
86
|
non_text_contents = []
|
|
93
87
|
|
|
@@ -114,9 +108,7 @@ class FlockMCPTool(BaseModel):
|
|
|
114
108
|
|
|
115
109
|
def as_dspy_tool(self, server: Any) -> DSPyTool:
|
|
116
110
|
"""Wrap this tool as a DSPyTool for downstream."""
|
|
117
|
-
args, arg_type, args_desc = self._convert_input_schema_to_tool_args(
|
|
118
|
-
self.input_schema
|
|
119
|
-
)
|
|
111
|
+
args, arg_type, args_desc = self._convert_input_schema_to_tool_args(self.input_schema)
|
|
120
112
|
|
|
121
113
|
async def func(*args, **kwargs):
|
|
122
114
|
with tracer.start_as_current_span(f"tool.{self.name}.call") as span:
|
|
@@ -128,9 +120,7 @@ class FlockMCPTool(BaseModel):
|
|
|
128
120
|
logger.debug(
|
|
129
121
|
f"Tool: {self.name}: got client for server '{server_name}' for agent {self.agent_id} on run {self.run_id}"
|
|
130
122
|
)
|
|
131
|
-
logger.debug(
|
|
132
|
-
f"Tool: {self.name}: calling server '{server_name}'"
|
|
133
|
-
)
|
|
123
|
+
logger.debug(f"Tool: {self.name}: calling server '{server_name}'")
|
|
134
124
|
result = await server.call_tool(
|
|
135
125
|
agent_id=self.agent_id,
|
|
136
126
|
run_id=self.run_id,
|
|
@@ -142,7 +132,7 @@ class FlockMCPTool(BaseModel):
|
|
|
142
132
|
)
|
|
143
133
|
return self._convert_mcp_tool_result(result)
|
|
144
134
|
except Exception as e:
|
|
145
|
-
logger.
|
|
135
|
+
logger.exception(
|
|
146
136
|
f"Tool: Exception ocurred when calling tool '{self.name}': {e}"
|
|
147
137
|
)
|
|
148
138
|
span.record_exception(e)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""MCP Type Definitions for Flock-Flow."""
|
|
2
|
+
|
|
3
|
+
from flock.mcp.types.factories import (
|
|
4
|
+
default_flock_mcp_list_roots_callback_factory,
|
|
5
|
+
default_flock_mcp_logging_callback_factory,
|
|
6
|
+
default_flock_mcp_message_handler_callback_factory,
|
|
7
|
+
default_flock_mcp_sampling_callback_factory,
|
|
8
|
+
)
|
|
9
|
+
from flock.mcp.types.types import (
|
|
10
|
+
FlockListRootsMCPCallback,
|
|
11
|
+
FlockLoggingMCPCallback,
|
|
12
|
+
FlockLoggingMessageNotificationParams,
|
|
13
|
+
FlockMessageHandlerMCPCallback,
|
|
14
|
+
FlockSamplingMCPCallback,
|
|
15
|
+
MCPRoot,
|
|
16
|
+
ServerNotification,
|
|
17
|
+
ServerParameters,
|
|
18
|
+
SseServerParameters,
|
|
19
|
+
StdioServerParameters,
|
|
20
|
+
StreamableHttpServerParameters,
|
|
21
|
+
WebsocketServerParameters,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
__all__ = [
|
|
26
|
+
"FlockListRootsMCPCallback",
|
|
27
|
+
"FlockLoggingMCPCallback",
|
|
28
|
+
"FlockLoggingMessageNotificationParams",
|
|
29
|
+
"FlockMessageHandlerMCPCallback",
|
|
30
|
+
"FlockSamplingMCPCallback",
|
|
31
|
+
"MCPRoot",
|
|
32
|
+
"ServerNotification",
|
|
33
|
+
"ServerParameters",
|
|
34
|
+
"SseServerParameters",
|
|
35
|
+
"StdioServerParameters",
|
|
36
|
+
"StreamableHttpServerParameters",
|
|
37
|
+
"WebsocketServerParameters",
|
|
38
|
+
"default_flock_mcp_list_roots_callback_factory",
|
|
39
|
+
"default_flock_mcp_logging_callback_factory",
|
|
40
|
+
"default_flock_mcp_message_handler_callback_factory",
|
|
41
|
+
"default_flock_mcp_sampling_callback_factory",
|
|
42
|
+
]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""MCP Callbacks."""
|
|
2
2
|
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
3
5
|
from mcp.shared.context import RequestContext
|
|
4
6
|
from mcp.shared.session import RequestResponder
|
|
5
7
|
from mcp.types import (
|
|
@@ -13,9 +15,8 @@ from mcp.types import (
|
|
|
13
15
|
ServerRequest,
|
|
14
16
|
)
|
|
15
17
|
|
|
16
|
-
from flock.
|
|
17
|
-
from flock.
|
|
18
|
-
from flock.core.mcp.types.handlers import (
|
|
18
|
+
from flock.logging.logging import FlockLogger
|
|
19
|
+
from flock.mcp.types.handlers import (
|
|
19
20
|
handle_incoming_exception,
|
|
20
21
|
handle_incoming_request,
|
|
21
22
|
handle_incoming_server_notification,
|
|
@@ -27,14 +28,12 @@ async def default_sampling_callback(
|
|
|
27
28
|
ctx: RequestContext, params: CreateMessageRequestParams, logger: FlockLogger
|
|
28
29
|
) -> ErrorData:
|
|
29
30
|
"""Default Callback for Sampling."""
|
|
30
|
-
logger.info(
|
|
31
|
+
logger.info("Rejecting Sampling Request.")
|
|
31
32
|
return ErrorData(code=INVALID_REQUEST, message="Sampling not supported.")
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
async def default_message_handler(
|
|
35
|
-
req: RequestResponder[ServerRequest, ClientResult]
|
|
36
|
-
| ServerNotification
|
|
37
|
-
| Exception,
|
|
36
|
+
req: RequestResponder[ServerRequest, ClientResult] | ServerNotification | Exception,
|
|
38
37
|
logger: FlockLogger,
|
|
39
38
|
associated_client: Any,
|
|
40
39
|
) -> None:
|
|
@@ -65,12 +64,9 @@ async def default_list_roots_callback(
|
|
|
65
64
|
) -> ListRootsResult | ErrorData:
|
|
66
65
|
"""Default List Roots Callback."""
|
|
67
66
|
if associated_client.config.feature_config.roots_enabled:
|
|
68
|
-
current_roots = await associated_client.
|
|
67
|
+
current_roots = await associated_client.get_roots()
|
|
69
68
|
return ListRootsResult(roots=current_roots)
|
|
70
|
-
|
|
71
|
-
return ErrorData(
|
|
72
|
-
code=INVALID_REQUEST, message="List roots not supported."
|
|
73
|
-
)
|
|
69
|
+
return ErrorData(code=INVALID_REQUEST, message="List roots not supported.")
|
|
74
70
|
|
|
75
71
|
|
|
76
72
|
async def default_logging_callback(
|
|
@@ -79,6 +75,4 @@ async def default_logging_callback(
|
|
|
79
75
|
server_name: str,
|
|
80
76
|
) -> None:
|
|
81
77
|
"""Default Logging Handling Callback."""
|
|
82
|
-
await handle_logging_message(
|
|
83
|
-
params=params, logger=logger, server_name=server_name
|
|
84
|
-
)
|
|
78
|
+
await handle_logging_message(params=params, logger=logger, server_name=server_name)
|
|
@@ -7,14 +7,14 @@ from mcp.types import (
|
|
|
7
7
|
CreateMessageRequestParams,
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
-
from flock.
|
|
11
|
-
from flock.
|
|
10
|
+
from flock.logging.logging import FlockLogger, get_logger
|
|
11
|
+
from flock.mcp.types.callbacks import (
|
|
12
12
|
default_list_roots_callback,
|
|
13
13
|
default_logging_callback,
|
|
14
14
|
default_message_handler,
|
|
15
15
|
default_sampling_callback,
|
|
16
16
|
)
|
|
17
|
-
from flock.
|
|
17
|
+
from flock.mcp.types.types import (
|
|
18
18
|
FlockListRootsMCPCallback,
|
|
19
19
|
FlockLoggingMCPCallback,
|
|
20
20
|
FlockLoggingMessageNotificationParams,
|
|
@@ -23,6 +23,7 @@ from flock.core.mcp.types.types import (
|
|
|
23
23
|
ServerNotification,
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
+
|
|
26
27
|
default_logging_callback_logger = get_logger("mcp.callback.logging")
|
|
27
28
|
default_sampling_callback_logger = get_logger("mcp.callback.sampling")
|
|
28
29
|
default_list_roots_callback_logger = get_logger("mcp.callback.roots")
|
|
@@ -45,6 +46,8 @@ def default_flock_mcp_logging_callback_factory(
|
|
|
45
46
|
server_name=associated_client.config.name,
|
|
46
47
|
)
|
|
47
48
|
|
|
49
|
+
return _method
|
|
50
|
+
|
|
48
51
|
|
|
49
52
|
def default_flock_mcp_sampling_callback_factory(
|
|
50
53
|
associated_client: Any,
|
|
@@ -60,9 +63,7 @@ def default_flock_mcp_sampling_callback_factory(
|
|
|
60
63
|
logger_to_use.info(
|
|
61
64
|
f"SAMPLING_REQUEST: server '{associated_client.config.name}' sent a sampling request: {params}"
|
|
62
65
|
)
|
|
63
|
-
await default_sampling_callback(
|
|
64
|
-
ctx=ctx, params=params, logger=logger_to_use
|
|
65
|
-
)
|
|
66
|
+
await default_sampling_callback(ctx=ctx, params=params, logger=logger_to_use)
|
|
66
67
|
|
|
67
68
|
return _method
|
|
68
69
|
|