Xj4<dZddlmZddlZddlmZmZddlmZddl m Z m Z ddl m Z ddlmZdd lmZdd lmZdd lmZdd lmZmZdd lmZddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.erddl/m0Z0ejbe2Z3GddZ4y)zyExperimental handlers for the low-level MCP server. WARNING: These APIs are experimental and may change without notice. ) annotationsN) AwaitableCallable) TYPE_CHECKING)task_in_session_scopetask_listable_in_session_scope) TaskSupport)create_call_wrapper)McpError) cancel_task)InMemoryTaskStore)InMemoryTaskMessageQueueTaskMessageQueue) TaskStore)INVALID_PARAMSCancelTaskRequestCancelTaskResult ErrorDataGetTaskPayloadRequestGetTaskPayloadResultGetTaskRequest GetTaskResultListTasksRequestListTasksResultServerCapabilities ServerResultServerTasksCapabilityServerTasksRequestsCapabilityTaskTasksCallCapabilityTasksCancelCapabilityTasksListCapabilityTasksToolsCapability)ServerceZdZdZ ddZeddZddZ d ddZddZ ddZ dd Z dd Z dd Z dd Z dd Zy)ExperimentalHandlerszyExperimental request/notification handlers. WARNING: These APIs are experimental and may change without notice. c<||_||_||_d|_yN)_server_request_handlers_notification_handlers _task_support)selfserverrequest_handlersnotification_handlerss t/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/mcp/server/lowlevel/experimental.py__init__zExperimentalHandlers.__init__6s#  !1&;#15c|jS)z/Get the task support configuration, if enabled.)r,)r-s r1 task_supportz!ExperimentalHandlers.task_supportAs!!!r3c|tfdttttfDsyt |_tjvrt|j _ tjvrt|j _ ttt|j _y)Nc3:K|]}|jvywr()r*).0req_typer-s r1 z;ExperimentalHandlers.update_capabilities..Hs$  .. . s)call)tools)anyrrrrrtasksr*r"listr!cancelrr#r requests)r- capabilitiess` r1update_capabilitiesz(ExperimentalHandlers.update_capabilitiesFs +-=?PRgh   24  t55 5&9&;L   #  6 6 6(=(?L   %&C&,?,AB' #r3Nc| t}| t}t|||_|j |jS)a] Enable experimental task support. This sets up the task infrastructure and auto-registers default handlers for tasks/get, tasks/result, tasks/list, and tasks/cancel. Args: store: Custom TaskStore implementation (defaults to InMemoryTaskStore) queue: Custom TaskMessageQueue implementation (defaults to InMemoryTaskMessageQueue) Returns: The TaskSupport configuration object Example: # Simple in-memory setup server.experimental.enable_tasks() # Custom store/queue for distributed systems server.experimental.enable_tasks( store=RedisTaskStore(redis_url), queue=RedisTaskMessageQueue(redis_url), ) WARNING: This API is experimental and may change without notice. )storequeue)r rr r,_register_default_task_handlers)r-rErFs r1 enable_tasksz!ExperimentalHandlers.enable_tasksXsG< =%'E =,.E(uEB ,,.!!!r3cn|jjj}|jjS)zHReturn the task session scope of the session making the current request.)r)request_contextsession _experimentaltask_session_scope)r-rKs r1_requestor_session_scopez-ExperimentalHandlers._requestor_session_scopes),,..66$$777r3crt||jstttd|y)aReject task IDs that belong to a different session. Task IDs generated by `run_task()` embed the creating session's scope. The default handlers treat a task created by another session exactly like a task that does not exist, so a requestor cannot tell whether such a task exists. Task IDs without an embedded scope are accepted from any session. Raises: McpError: With INVALID_PARAMS if the task belongs to another session. Task not found: codemessageN)rrNr rr)r-task_ids r1 _require_task_in_requestor_scopez5ExperimentalHandlers._require_task_in_requestor_scopes?%Wd.K.K.MN'.wi8 Or3cjJjtjvrdfd }|jt<tjvrdfd }|jt<tjvrdfd }|jt<t jvrd fd }|jt <yy) a7Register default handlers for task operations. Each default handler only operates on tasks created by the requesting session (see `_require_task_in_requestor_scope`), and tasks/list only returns the requesting session's own tasks (see `task_listable_in_session_scope`). Nc Kj|jjjj |jjd{}|1t t td|jjtt|j|j|j|j|j|j|jS7w)NrPrQ)taskIdstatus statusMessage createdAt lastUpdatedAtttl pollInterval)rUparamsrXrEget_taskr rrrrrYrZr[r\r]r^)reqtaskr-supports r1_default_get_taskzOExperimentalHandlers._register_default_task_handlers.._default_get_tasks55cjj6G6GH$]]33CJJ4E4EFF<"!!/&6szz7H7H6I$J $!#{{#{{&*&8&8"&..&*&8&8 HH%)%6%6  GsAC6C4BC6cKj|jjjj}j j ||j|jd{}t|S7wr() rUr_rXr)rJhandlerhandlerK request_idr)ractxresultr-rcs r1_default_get_task_resultzVExperimentalHandlers._register_default_task_handlers.._default_get_task_resultsb55cjj6G6GHll22&55c3;;WW#F++XsA0B3B4BcKjttgSg}d} jj |d{\}}|j fd|D|tt|SX79w)N)r>c3PK|]}t|js|ywr()rrX)r8rbrequestor_scopes r1r:zdExperimentalHandlers._register_default_task_handlers.._default_list_tasks..s(%!%1OPTP[P[]l1m%s&&)rNrrrE list_tasksextend)ra own_taskscursorpagernr-rcs @r1_default_list_taskszQExperimentalHandlers._register_default_task_handlers.._default_list_taskss"&"?"?"A"*(b(ABB)+ %))0)A)A&)I#ILD&$$%)-%~+O),LMM #IsA B B :B cKj|jjtj|jjd{}t |S7wr()rUr_rXr rEr)rarjr-rcs r1_default_cancel_taskzRExperimentalHandlers._register_default_task_handlers.._default_cancel_tasksM55cjj6G6GH*7==#**:K:KLL#F++MsAA(A&A(rarreturnrrarrxrrarrxrrarrxr)r,rr*rrr)r-rdrkrtrvrcs` @r1rGz4ExperimentalHandlers._register_default_task_handlerss!!---$$ !7!7 7 ,6GD " "> 2 !(>(> > , =UD " "#8 9 4#9#9 9 N,8KD " "#3 4 D$:$: : , 9MD " "#4 5 ;r3c dfd }|S)zxRegister a handler for listing tasks. WARNING: This API is experimental and may change without notice. ctjdt|tdfd }|jt<|S)Nz(Registering handler for ListTasksRequestcFK|d{}t|S7wr(rrarjwrappers r1rfzCExperimentalHandlers.list_tasks..decorator..handler#&s|+#F++, !!rz)loggerdebugr rr*funcrfrr-s @r1 decoratorz2ExperimentalHandlers.list_tasks..decorators< LLC D)$0@AG ,8?D " "#3 4Kr3)r8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]rxrr-rs` r1rozExperimentalHandlers.list_taskss  J  E r3c dfd }|S)z~Register a handler for getting task status. WARNING: This API is experimental and may change without notice. ctjdt|tdfd }|jt<|S)Nz&Registering handler for GetTaskRequestcFK|d{}t|S7wr(rrs r1rfzAExperimentalHandlers.get_task..decorator..handlerrrrw)rrr rr*rs @r1rz0ExperimentalHandlers.get_task..decorators: LLA B)$?G ,6=D " "> 2Kr3)r4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]rxrrrs` r1r`zExperimentalHandlers.get_task s  F  A r3c dfd }|S)zRegister a handler for getting task results/payload. WARNING: This API is experimental and may change without notice. ctjdt|tdfd }|jt<|S)Nz-Registering handler for GetTaskPayloadRequestcFK|d{}t|S7wr(rrs r1rfzHExperimentalHandlers.get_task_result..decorator..handler5rrry)rrr rr*rs @r1rz7ExperimentalHandlers.get_task_result..decorator/s= LLH I)$0EFG ,=DD " "#8 9Kr3)rBCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]rxrrrs` r1get_task_resultz$ExperimentalHandlers.get_task_result$s  T  O r3c dfd }|S)z{Register a handler for cancelling tasks. WARNING: This API is experimental and may change without notice. ctjdt|tdfd }|jt<|S)Nz)Registering handler for CancelTaskRequestcFK|d{}t|S7wr(rrs r1rfzDExperimentalHandlers.cancel_task..decorator..handlerOrrr{)rrr rr*rs @r1rz3ExperimentalHandlers.cancel_task..decoratorIs= LLD E)$0ABG ,9@D " "#4 5Kr3)r:Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]rxrrrs` r1r z ExperimentalHandlers.cancel_task>s  L  G r3)r.r$r/z2dict[type, Callable[..., Awaitable[ServerResult]]]r0z*dict[type, Callable[..., Awaitable[None]]])rxzTaskSupport | None)rBrrxNone)NN)rEzTaskStore | NonerFzTaskMessageQueue | Nonerxr )rxz str | None)rTstrrxr)rxr)rxz~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]])rxzvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]])rxzCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]])rxzCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]])__name__ __module__ __qualname____doc__r2propertyr5rCrHrNrUrGror`rr rr3r1r&r&0s 6 6M 6 J 6"" (#')-("("'("  ("T8 (TMl 4 2 4 r3r&)5r __future__rloggingcollections.abcrrtypingr"mcp.server.experimental.task_scoperr$mcp.server.experimental.task_supportr #mcp.server.lowlevel.func_inspectionr mcp.shared.exceptionsr %mcp.shared.experimental.tasks.helpersr 2mcp.shared.experimental.tasks.in_memory_task_storer +mcp.shared.experimental.tasks.message_queuerr#mcp.shared.experimental.tasks.storer mcp.typesrrrrrrrrrrrrrrrr r!r"r#mcp.server.lowlevel.serverr$ getLoggerrrr&rr3r1rst #/ d<C*=Pb9,1   8 $ffr3