o
    i1)                     @  s  d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddl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&m'Z'm(Z(m)Z) ertddl*m+Z+ e,e-Z.G dd dZ/dS )zyExperimental handlers for the low-level MCP server.

WARNING: These APIs are experimental and may change without notice.
    )annotationsN)	AwaitableCallable)TYPE_CHECKING)TaskSupport)create_call_wrapper)McpError)cancel_task)InMemoryTaskStore)InMemoryTaskMessageQueueTaskMessageQueue)	TaskStore)INVALID_PARAMSCancelTaskRequestCancelTaskResult	ErrorDataGetTaskPayloadRequestGetTaskPayloadResultGetTaskRequestGetTaskResultListTasksRequestListTasksResultServerCapabilitiesServerResultServerTasksCapabilityServerTasksRequestsCapabilityTasksCancelCapabilityTasksListCapabilityTasksToolsCapability)Serverc                   @  st   e Zd ZdZd)dd	Zed*ddZd+ddZ		d,d-ddZd.ddZ	d/ddZ
d0d!d"Zd1d$d%Zd2d'd(ZdS )3ExperimentalHandlerszyExperimental request/notification handlers.

    WARNING: These APIs are experimental and may change without notice.
    serverr   request_handlers2dict[type, Callable[..., Awaitable[ServerResult]]]notification_handlers*dict[type, Callable[..., Awaitable[None]]]c                 C  s   || _ || _|| _d | _d S N)_server_request_handlers_notification_handlers_task_support)selfr!   r"   r$    r,   T/home/ubuntu/.local/lib/python3.10/site-packages/mcp/server/lowlevel/experimental.py__init__3   s   
zExperimentalHandlers.__init__returnTaskSupport | Nonec                 C  s   | j S )z/Get the task support configuration, if enabled.)r*   r+   r,   r,   r-   task_support>   s   z!ExperimentalHandlers.task_supportcapabilitiesr   Nonec                   sf   t  fddttttfD sd S t |_t jv rt |j_	t jv r)t
 |j_tt d|j_d S )Nc                 3  s    | ]}| j v V  qd S r&   )r(   ).0req_typer1   r,   r-   	<genexpr>E   s
    
z;ExperimentalHandlers.update_capabilities.<locals>.<genexpr>)tools)anyr   r   r   r   r   tasksr(   r   listr   cancelr   r   requests)r+   r3   r,   r1   r-   update_capabilitiesC   s   




z(ExperimentalHandlers.update_capabilitiesNstoreTaskStore | NonequeueTaskMessageQueue | Noner   c                 C  s8   |du rt  }|du rt }t||d| _|   | jS )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.
        N)r?   rA   )r
   r   r   r*   _register_default_task_handlers)r+   r?   rA   r,   r,   r-   enable_tasksU   s   z!ExperimentalHandlers.enable_tasksc                   s    j dusJ  j t jvrdfdd}| jt< t jvr-d fd	d
}| jt< t jvr>dfdd}| jt< t jvrQdfdd}| jt< dS dS )z.Register default handlers for task operations.Nreqr   r/   r   c              
     sb    j | jjI d H }|d u rtttd| jj dtt|j|j	|j
|j|j|j|jdS )NzTask not found: )codemessage)taskIdstatusstatusMessage	createdAtlastUpdatedAtttlpollInterval)r?   get_taskparamsrH   r   r   r   r   r   rI   rJ   rK   rL   rM   rN   )rE   tasksupportr,   r-   _default_get_task   s(   zOExperimentalHandlers._register_default_task_handlers.<locals>._default_get_taskr   c                   s,    j j}j| |j|jI d H }t|S r&   )r'   request_contexthandlerhandlesession
request_idr   )rE   ctxresultr+   rS   r,   r-   _default_get_task_result   s   zVExperimentalHandlers._register_default_task_handlers.<locals>._default_get_task_resultr   c                   s:   | j r| j jnd } j|I d H \}}tt||dS )N)r:   
nextCursor)rP   cursorr?   
list_tasksr   r   )rE   r_   r:   next_cursorrR   r,   r-   _default_list_tasks   s   zQExperimentalHandlers._register_default_task_handlers.<locals>._default_list_tasksr   c                   s    t  j| jjI d H }t|S r&   )r	   r?   rP   rH   r   rE   r[   rR   r,   r-   _default_cancel_task   s   zRExperimentalHandlers._register_default_task_handlers.<locals>._default_cancel_taskrE   r   r/   r   rE   r   r/   r   rE   r   r/   r   rE   r   r/   r   )r*   r   r(   r   r   r   )r+   rT   r]   rb   rd   r,   r\   r-   rC      s   






z4ExperimentalHandlers._register_default_task_handlers~Callable[[Callable[[ListTasksRequest], Awaitable[ListTasksResult]]], Callable[[ListTasksRequest], Awaitable[ListTasksResult]]]c                      d fdd}|S )zxRegister a handler for listing tasks.

        WARNING: This API is experimental and may change without notice.
        func8Callable[[ListTasksRequest], Awaitable[ListTasksResult]]r/   c                   0   t d t| t d fdd}|jt< | S )	Nz(Registering handler for ListTasksRequestrE   r   r/   r   c                       | I d H }t |S r&   r   rc   wrapperr,   r-   rV         zCExperimentalHandlers.list_tasks.<locals>.decorator.<locals>.handlerrg   )loggerdebugr   r   r(   rk   rV   r1   rp   r-   	decorator   
   


z2ExperimentalHandlers.list_tasks.<locals>.decoratorN)rk   rl   r/   rl   r,   r+   rv   r,   r1   r-   r`         zExperimentalHandlers.list_tasksvCallable[[Callable[[GetTaskRequest], Awaitable[GetTaskResult]]], Callable[[GetTaskRequest], Awaitable[GetTaskResult]]]c                   rj   )z~Register a handler for getting task status.

        WARNING: This API is experimental and may change without notice.
        rk   4Callable[[GetTaskRequest], Awaitable[GetTaskResult]]r/   c                   rm   )	Nz&Registering handler for GetTaskRequestrE   r   r/   r   c                   rn   r&   ro   rc   rp   r,   r-   rV      rr   zAExperimentalHandlers.get_task.<locals>.decorator.<locals>.handlerre   )rs   rt   r   r   r(   ru   r1   rp   r-   rv      rw   z0ExperimentalHandlers.get_task.<locals>.decoratorN)rk   r{   r/   r{   r,   rx   r,   r1   r-   rO      s   
zExperimentalHandlers.get_taskCallable[[Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]], Callable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]]c                   rj   )zRegister a handler for getting task results/payload.

        WARNING: This API is experimental and may change without notice.
        rk   BCallable[[GetTaskPayloadRequest], Awaitable[GetTaskPayloadResult]]r/   c                   rm   )	Nz-Registering handler for GetTaskPayloadRequestrE   r   r/   r   c                   rn   r&   ro   rc   rp   r,   r-   rV      rr   zHExperimentalHandlers.get_task_result.<locals>.decorator.<locals>.handlerrf   )rs   rt   r   r   r(   ru   r1   rp   r-   rv      rw   z7ExperimentalHandlers.get_task_result.<locals>.decoratorN)rk   r}   r/   r}   r,   rx   r,   r1   r-   get_task_result   ry   z$ExperimentalHandlers.get_task_resultCallable[[Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]], Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]]c                   rj   )z{Register a handler for cancelling tasks.

        WARNING: This API is experimental and may change without notice.
        rk   :Callable[[CancelTaskRequest], Awaitable[CancelTaskResult]]r/   c                   rm   )	Nz)Registering handler for CancelTaskRequestrE   r   r/   r   c                   rn   r&   ro   rc   rp   r,   r-   rV     rr   zDExperimentalHandlers.cancel_task.<locals>.decorator.<locals>.handlerrh   )rs   rt   r   r   r(   ru   r1   rp   r-   rv     rw   z3ExperimentalHandlers.cancel_task.<locals>.decoratorN)rk   r   r/   r   r,   rx   r,   r1   r-   r	     ry   z ExperimentalHandlers.cancel_task)r!   r   r"   r#   r$   r%   )r/   r0   )r3   r   r/   r4   )NN)r?   r@   rA   rB   r/   r   )r/   r4   )r/   ri   )r/   rz   )r/   r|   )r/   r   )__name__
__module____qualname____doc__r.   propertyr2   r>   rD   rC   r`   rO   r~   r	   r,   r,   r,   r-   r    -   s    


*
<

r    )0r   
__future__r   loggingcollections.abcr   r   typingr   $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_queuer   r   #mcp.shared.experimental.tasks.storer   	mcp.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mcp.server.lowlevel.serverr   	getLoggerr   rs   r    r,   r,   r,   r-   <module>   s"    L
