Skip to main content
Glama

ClickUp Operator

by noah-vh
server.cpython-310.pyc13.7 kB
o �LMg{f� @s�UddlZddlmZddlmZddlmZddlmZm Z ddl m Z ddl Z ddlmZddlZddlmZiZeeefed <e d �Zdaeejed <d d �Ze�e�e��deejfdd��Ze� �de defdd��Z!e�"�deej#fdd��Z$e�%�dedeeefdBdej&fdd��Z'e�(�deej)fdd��Z*e�+�dededBdeej,ej-Bej.Bfdd��Z/e0dkr�e�1e jj2�3e��dSdS)�N)�Optional)�InitializationOptions)�NotificationOptions�Server)�AnyUrl�)�clickup)� load_dotenv�noteszclickup-operator�clickup_clientc�s,�t�t�d�}|std��t�|�adS)z>Initialize the ClickUp client with API token from environment.�CLICKUP_API_TOKEN�.CLICKUP_API_TOKEN environment variable not setN)r �os�getenv� ValueErrorr� ClickUpAPIr )�api_key�r�OC:\Users\noahv\Documents\GitHub\clickup-operator\src\clickup_operator\server.py� initializes � r�returnc�s�dd�tD�S)zq List available note resources. Each note is exposed as a resource with a custom note:// URI scheme. cSs4g|]}tjtd|���d|��d|��dd��qS)znote://internal/zNote: zA simple note named z text/plain)�uri�name� descriptionZmimeType)�types�Resourcer)�.0rrrr� <listcomp>'s� ��z)handle_list_resources.<locals>.<listcomp>)r rrrr�handle_list_resources!s��rrc�sJ�|jdkrtd|j����|j}|dur|�d�}t|Std|����)zp Read a specific note's content by its URI. The note name is extracted from the URI host component. ZnotezUnsupported URI scheme: N�/zNote not found: )Zschemer�path�lstripr )rrrrr�handle_read_resource1s�  r"c�s"�tjddtjdddd�gd�gS)zh List available prompts. Each prompt can have optional arguments to customize its behavior. �summarize-noteszCreates a summary of all notes�stylez%Style of the summary (brief/detailed)F)rr�required)rr� arguments)r�PromptZPromptArgumentrrrr�handle_list_prompts@s�����r(rr&c �s|�|dkr td|����|pi�dd�}|dkrdnd}tjdtjd tjd d |�d �d �dd�t��D��d�d�gd�S)z� Generate a prompt by combining arguments with server state. The prompt includes all current notes and can be customized via arguments. r#zUnknown prompt: r$ZbriefZdetailedz Give extensive details.�zSummarize the current notes�user�textz(Here are the current notes to summarize:z � css$�|] \}}d|�d|��VqdS)�- z: Nr)rr�contentrrr� <genexpr>js �� �z$handle_get_prompt.<locals>.<genexpr>��typer+)Zroler.)rZmessages) r�getr�GetPromptResultZ PromptMessage� TextContent�joinr �items)rr&r$Z detail_promptrrr�handle_get_promptTs(�  ������r7c�s>�tjdddddiddiddd�ddd�ddd�d ddidd �d ddidd �d �d d gd�d�tjdddddiddd�ddd�ddd�ddd�ddd�d ddidd �d ddidd �d�d gd�d�tjddddddiidgd�d�tjdddddiddiddd�ddd�d�ddgd�d�tjdddddiddd�ddd�d�dgd�d�tjdd ddddiidgd�d�tjd!d"ddddiidgd�d�tjd#d$dddiddidd%d&gd'�d(�dd)gd�d�tjd*d+dddiddid,�dd-gd�d�tjd.d/ddddiidgd�d�tjd0d1dddiddiddd�ddd�d2�d3dgd�d�tjd4d5dd3ddiid3gd�d�tjd6d7dddiddid8�dd gd�d�tjd9d:dddiddid;�d<d gd�d�tjd=d>dd<ddiid<gd�d�tjd?d@dddiddiddd�ddd�dA�d<d gd�d�tjdBdCddDddiidDgd�d�tjdEdFdddiddiddd�ddd�dG�dDd gd�d�tjdHdIdidJ�d�tjdKdLdddiddiddd�ddd�ddd�dM�dDd gd�d�tjdNdOddDddiidDgd�d�tjdPdQdddiddd�dR�dgd�d�tjdSdTddddiidgd�d�tjdUdVdd ddiid gd�d�gS)WzList available ClickUp tools.� create-taskzCreate a new ClickUp task�objectr1�stringT)r1�optionalZintegerZarray)r1r6r;)�list_idrr�priority�due_date� assignees�tagsr<r)r1� propertiesr%)rrZ inputSchema� get-taskszGet tasks from a listZboolean)r<�archived�page�order_by�reverse�subtasks�statusesr?� get-spaceszGet spaces in a team/workspace�team_id�create-commentzCreate a comment on a task��task_id� comment_text�assignee� notify_allrMrNzget-taskzGet details of a specific task)rMZinclude_subtasksZinclude_dependenciesz delete-taskz Delete a task�get-task-dependencieszGet task dependencies�add-task-dependencyzAdd a dependency to a taskZblocks� waiting_on)r1�enum�rM� depends_on�dependency_typerV�remove-task-dependencyzRemove a dependency from a task�rM� dependency_idrZ� get-commentszGet comments on a task�update-commentzUpdate a comment�� comment_idrNrO�resolvedr^�delete-commentzDelete a commentzcreate-checklistzCreate a checklist in a task)rMrzedit-checklistzEdit a checklist)� checklist_idrrazdelete-checklistzDelete a checklistzcreate-checklist-itemzCreate an item in a checklist)rarrOr>zget-space-tagszGet all tags in a space�space_idzcreate-space-tagzCreate a new tag in a space)rbrZtag_fgZtag_bgz get-teamsz#Get all accessible teams/workspaces)r1rA� create-listzCreate a new list in a space�rbrr.r>r=� get-listszGet lists in a space� start-timezStart time tracking for a task�rM�billable� stop-timezStop time tracking for a task�get-custom-fieldsz&Get custom fields accessible in a list)r�Toolrrrr�handle_list_toolsss��� ��� ����� ������ ��� ���  ��� ��� ��� ������ ��� ��� ��� ������ ����������� ��� ��� ������rlc�s�tst�t�d�}|std��t�|�a|dkry|s td��tj|d|d|�d�|�d�|�d �|�d g�|�d g�|�d �|�d d�d� IdH}t j dd|d�d|d�d|�d i��d d��dd� dd�|�d g�D����d�gS|dkr�|s�td��tj |d|�dd�|�d�|�d�|�d �|�d!�|�d"g�|�d g�|�d#g�d$� IdH}d%� d&d'�|D��}t j dd(|r�|nd)��d�gS|d*k�r|s�td��|� d+�}tjd�d+|id,d-�|��D���IdH}t j dd.|d�d|d�d|�d i��d d��dd� d/d�|�d g�D����d�gS|d0k�rK|�s'td��t�|d1�IdH}d%� d2d'�|D��}t j dd3|�rD|nd4��d�gS|d5k�r�|�sWtd��tj|d1|d|�d6�|�d7i�d8�IdH} t j dd9| d�d| d�d:| �d;d���d�gS|d<k�r�|�s�td��t�|d=�IdH} d%� d>d'�| D��} t j dd?| �r�| nd@��d�gS|dAk�r�|�s�td��tj|d=|d|�dB�|�d �|�d�dC�IdH} t j ddD| d�d| d�dE| �dBdF���d�gS|dGk�r-|�std��tj|d+|�dHd�dI�IdH} t j ddJ|d+�dK| �ddL��dM| �dHd���d�gS|dNk�r^|�s9td��t�|d+�IdH} | �dOdP�}|dQ}t j ddR|d+�dS|�dT�d�gS|dUk�r�|�sjtd��tj|d+|dV|�dW�|�d d�dX�IdH}t j ddY|d+�dZ|�d��d[|�d\i��d]d^���d�gS|d_k�r�|�s�td��t�|d+�IdH}d%� d`d'�|D��}t j dda|d+�db|�r�|ndc��d�gS|ddk�r|�s�td��tj|de|dV|�dW�|�df�dg�IdH}t j ddh|d�di|�dV��dj|�dfd���d�gS|dkk�r3|�std��t�|de�IdHt j ddl|de��d�gS|dmk�rh|�s?td��t�|d+�IdH}d%� dnd'�|D��}t j ddo|d+�db|�ra|ndp��d�gS|dqk�r�|�sttd��tj|d+|dr|�dsdt�du�IdH}t j ddv|d+�dw|dr�dx|�dsdy���d�gS|dzk�r�|�s�td��tj|d+|d{d|�IdHt j dd}|d{�d~|d+��d�gS|dk�r|�s�td��t�|d�IdH}d%� d�d'�|D��}t j dd�|d�db|�r�|nd���d�gStd�|����)�z'Handle ClickUp tool execution requests.r r r8zMissing argumentsr<rrr=r>r?r@�statusrPF) r<rrr=r>r?r@rmrPNr+zCreated task: Name: z ID: �idz Status: �Not setz Assignees: �, cs� �|] }t|�dd��VqdS��usernamer)N��strr2�r�arrrr/���z#handle_call_tool.<locals>.<genexpr>r0rBrCrDrErFrGrHZincludes) r<rCrDrErFrGrHr?Zincluder,cSsXg|](}d|d�d|d�d|�di��dd��dd�d d �|�d g�D�����qS) r-r� (ID: rnz ) Status: rmroz Assignees: rpcsrqrrrtrvrrrr/�rxz.handle_call_tool.<locals>.<listcomp>.<genexpr>r?)r2r5)r�taskrrrr�s����z$handle_call_tool.<locals>.<listcomp>zTasks in list: zNo tasks foundz update-taskrMcSsi|]\}}||�qSrr)r�k�vrrr� <dictcomp>�sz$handle_call_tool.<locals>.<dictcomp>zUpdated task: Name: csrqrrrtrvrrrr/�rxrIrJcS�Dg|]}d|d�d|d�d|�dd��dt|�dg�����qS) r-rryrnz ) Private: �privateF� Status Count: rH�r2�len)r�spacerrrr��� ���zSpaces in team: zNo spaces foundz create-space�multiple_assignees�features)rJrr�r�zCreated space: Name: z Private: rrerbcSr~) r-rryrnz ) Content: r.� No contentr�rHr�)r�lstrrrr r�zLists in space: zNo lists foundrcr.rdzCreated list: Name: z Content: r�rfrhrgz Started time tracking: Task ID: z Timer ID: zN/Az Billable: ri�durationri`�z Stopped time tracking: Task ID: z Duration: z minutesrKrNrOrLzCreated comment: Task ID: z Comment ID: z Author: r*rs�Unknownr[c SsLg|]"}d|d�d|�di��dd��d|�dd��d |�d d ����qS) z- ID: rnz Author: r*rsr�z Text: rNzNo textz Resolved: r_F�r2)r�commentrrrrus �� � ��zComments on task z: zNo comments foundr\r^r_r]zUpdated comment: Comment ID: z New Text: z Resolved: r`zDeleted comment rQc Ss6g|]}d|�d��d|�d��d|�dd����qS)z- Task: rMz Name: r� Type: rWr�r�)rZdeprrrr�s�� ��zDependencies for task zNo dependencies foundrRrVrWrSrUzAdded dependency: Task: z Depends on: z Type: ZDefaultrXrZrYzRemoved dependency z from task rjc Ss6g|]}d|d�d|�dd��d|�dd����qS)z- Name: rr�r1r�z Required: r%Fr�)rZfieldrrrr�s � � ��zCustom fields in list zNo custom fields foundzUnknown tool: r)r r rrrrrZ create_taskr2rr4r5Z get_tasks�popZ update_taskr6Z get_spacesZ create_spaceZ get_listsZ create_listZstart_time_entryZstop_time_entryZcreate_task_commentZ get_commentsZupdate_commentZdelete_commentZget_task_dependenciesZadd_task_dependencyZremove_task_dependencyZget_accessible_custom_fields)rr&rrzZtasksZ task_listrMZspacesZ spaces_listr�ZlistsZ lists_textr�Z time_entryr�Zminutesr�ZcommentsZ comments_textZ dependenciesZ deps_textZ dependencyZfieldsZ fields_textrrr�handle_call_tool�s�      � ���     � ��  � ����  ��   � ��  ��  � ��   �� � ��  ���   �����  �  ��  ��� ��  �  �  ��   ��� ��  ��  �  ��r��__main__)4�asyncio�typingrZmcp.server.modelsrZ mcp.typesrZ mcp.serverrrZpydanticrZmcp.server.stdioZmcpr)rrZdotenvr r �dictru�__annotations__�serverr rrZ on_startupZlist_resources�listrrZ read_resourcer"Z list_promptsr'r(Z get_promptr3r7Z list_toolsrkrlZ call_toolr4Z ImageContentZEmbeddedResourcer��__name__�runZstdioZ run_stdiorrrr�<module>s\       �� �1�� �E�

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/noah-vh/mcp-server-clickup'

If you have feedback or need assistance with the MCP directory API, please join our Discord server