Skip to main content
Glama
handlers.cpython-312.pyc17 kB
� ��h�8���dZddlZddlZddlZddlmZmZmZddlZddl m Z ddl m Z eje�Zej e j"e j$e j&e j(��Zdeeefd ee fd �Zd eeefd ee fd �Zdeeefd ee fd �Zdeeefd ee fd�Zdeeefd ee fd�Zdeeefd ee fd�Zdeeefd ee fd�Zdeeefd ee fd�Zdeeefd ee fd�Zdeeefd ee fd�Z deeefd ee fd�Z!deeefd ee fd�Z"deeefd ee fd�Z#y)u TOS MCP Server 功能处理器 �N)�Any�Dict�List)� TextContent�)� tos_config)�ak�sk�endpoint�region�args�returnc��K�|d}|jdd�} tj||dk(rtjj n8|dk(rtjj ntjj�tdd|����gS#t$r$}tddt|�����gcYd }~Sd }~wwxYw�w) u创建存储桶� bucket_name�acl�privatez public-read�textu成功创建存储桶: ��typeru创建存储桶失败: N) �get� tos_client� create_bucket�tos�ACLType� ACL_Private�ACL_Public_Read�ACL_Public_Read_Writer� Exception�str)r rr�es �A/Users/bytedance/Documents/tos-mcp/src/tos_mcp_server/handlers.pyrrs������}�%�K� �(�(�5�)� $�C�S�� � ���PY�IY�c�k�k�.E�.E�KN�R_�K_�C�K�K�,G�,G�,/�K�K�,M�,M� O���0G� �}�.U�V�W�W�� �S���0G��A��x�.P�Q�R�R��S�s5�C�A<B�C� C�!C�:C�;C�C�C�_argsc��K� tj�}g}|jD]L}|j|j|j rt |j �nd|jd���Ntdtj|dd����gS#t$r$}tddt |�����gcYd}~Sd}~wwxYw�w) u列举存储桶N)�name� creation_date�locationr�F��indent� ensure_asciiru列举存储桶失败: ) r� list_buckets�buckets�appendr$r%rr&r�json�dumpsr)r"�respr,�bucketr s r!r+r+'s����� S��&�&�(�����l�l� �F� �N�N�� � �>D�>R�>R��V�%9�%9�!:�X\�"�O�O�� � � ��d�j�j���Y^�._�`�a�a�� �S���0G��A��x�.P�Q�R�R��S�s5�C �BB�C � C�"C�;C�<C �C�C c��JK�|d} tj|�}||j|jrt |j�ndd�}t dt j|dd����gS#t$r$}t dd t |�����gcYd}~Sd}~wwxYw�w) u获取存储桶元数据rN)rr � storage_classrr'Fr(ru 获取存储桶元数据失败: ) r� head_bucketr r3rrr.r/r)r rr0�metar s r!�get_bucket_metar66s������}�%�K� \��%�%�k�2��&��k�k�8<�8J�8J�S��!3�!3�4�PT� �� ��d�j�j��a�V[�.\�]�^�^�� �\���0P�QT�UV�QW�PX�.Y�Z�[�[��\�s5�B#�A)A3�2B#�3 B �<B�B �B#�B � B#c���K�|d} tj|�tdd|����gS#t$r$}tddt |�����gcYd}~Sd}~wwxYw�w)u删除存储桶rru成功删除存储桶: ru删除存储桶失败: N)r� delete_bucketrrr)r rr s r!r8r8Esi�����}�%�K�S�� � ��-���0G� �}�.U�V�W�W�� �S���0G��A��x�.P�Q�R�R��S�s0�A�%/�A� A�A�A�A�A�Ac ��K�|d}|d}|d}|jdd�}|jdd�} |rtj|�}n|jd�}tj ||||t |�� �}td d |�d |j�d ���gS#t$r$}td dt|�����gcYd}~Sd}~wwxYw�w)u 上传对象r� object_key�content� content_typezapplication/octet-stream� is_base64F�utf-8)r;r<�content_lengthru成功上传对象: z (ETag: �)ru上传对象失败: N) r�base64� b64decode�encoder� put_object�lenr�etagrr) r rr:r;r<r=� content_bytesr0r s r!rDrDPs������}�%�K��l�#�J��9�o�G��8�8�N�,F�G�L�����e�,�I� P� �"�,�,�W�5�M�#�N�N�7�3�M��$�$�[�*�+8�0<�25�m�2D�%�F����0D�Z�L�PX�Y]�Yb�Yb�Xc�cd�.e�f�g�g�� �P���0D�S��V�H�.M�N�O�O��P�s5�4C�A*B"�!C�" C�+C �C�C� C�Cc��K�|d}|d}|jdd�} tj||�}|j�}|r@t j |�j d�}||j|jdd�}n- |j d�}||j|jdd�}tdtj|d d� �� �gS#t$rBt j |�j d�}||j|jdd�}Y�nwxYw#t$r$}tdd t|���� �gcYd }~Sd }~wwxYw�w)u 下载对象rr:�return_as_base64Fr>rA)r;r<r?�encodingrr'r(ru下载对象失败: N)rr� get_object�readrA� b64encode�decoder<r?�UnicodeDecodeErrorrr.r/rr) r rr:rIr0r;� content_str�resultr s r!rKrKfsW�����}�%�K��l�#�J��x�x� 2�E�:�� P��$�$�[�*�=���)�)�+�� � �*�*�7�3�:�:�7�C�K�&� $� 1� 1�"&�"5�"5�$� �F� �%�n�n�W�5� �*�$(�$5�$5�&*�&9�&9� '� ����d�j�j���X]�.^�_�`�`��&� �$�.�.�w�7�>�>�w�G� �*�$(�$5�$5�&*�&9�&9� (� �� �� �P���0D�S��V�H�.M�N�O�O��P�sZ�E�A(D'� ,C�5#D'�E�AD$�!D'�#D$�$D'�' E�0E� E� E�E�Ec ��K�|d}|jdd�}|jdd�}|jdd�} tj||||��}gg|j|jd�}|j D]|}|d j |j|jrt|j�nd |j|j|jrt|j�nd d ���~|jD] }|d j |j��"td t!j"|dd����gS#t$$r$}td dt|�����gcYd }~Sd }~wwxYw�w)u 列举对象r�prefix�� delimiter�max_keysi�)rSrUrV)�objects�common_prefixes� is_truncated�next_continuation_tokenrWN)�key� last_modified�sizerFr3rXrr'Fr(ru列举对象失败: )rr�list_objects_type2rYrZ�contentsr-r[r\rr]rFr3rXrSrr.r/r) r rrSrUrVr0rQ�objr s r!� list_objectsra�sr�����}�%�K� �X�X�h�� #�F�����b�)�I��x�x� �D�)�H�P��,�,�[��S\�go�,�p���!� �-�-�'+�'C�'C�  ���=�=� �C� �9� � $� $��w�w�;>�;L�;L��S�%6�%6�!7�RV�������;>�;L�;L��S�%6�%6�!7�RV� &� � ��*�*� <�F� �$� %� ,� ,�V�]�]� ;� <���d�j�j���X]�.^�_�`�`�� �P���0D�S��V�H�.M�N�O�O��P�s5�<F�DE�F� E>�E9�3E>�4F�9E>�>Fc���K�|d}|d} tj||�tdd|����gS#t$r$}tddt |�����gcYd}~Sd}~wwxYw�w)u 删除对象rr:ru成功删除对象: ru删除对象失败: N)r� delete_objectrrr)r rr:r s r!rcrc�su�����}�%�K��l�#�J�P�� � ��j�9���0D�Z�L�.Q�R�S�S�� �P���0D�S��V�H�.M�N�O�O��P�s0� A%�&5�A%� A"�A�A"�A%�A"�"A%c��K�|d}|d}|jdd�}|jdd�} |dk(r1tjtjj |||�}n�|dk(r1tjtjj |||�}n}|dk(r1tjtjj|||�}nG|d k(r1tjtjj|||�}ntd d |��� �gS|j||||d �}td tj|dd��� �gS#t$r$}td dt|���� �gcYd}~Sd}~wwxYw�w)u生成预签名 URLrr:�method�GET�expires��PUT�POST�DELETEru不支持的HTTP方法: r)�urlre� expires_inr1r[r'Fr(u生成预签名URL失败: N)rr�pre_signed_urlr�HttpMethodType�Http_Method_Get�Http_Method_Put�Http_Method_Post�Http_Method_Deleter� signed_urlr.r/rr)r rr:rergrlrQr s r!� presigned_urlru�ss�����}�%�K��l�#�J� �X�X�h�� &�F��h�h�y�$�'�G�V� �U�?��+�+�C�,>�,>�,N�,N�P[�]g�ip�q�C� �u�_��+�+�C�,>�,>�,N�,N�P[�]g�ip�q�C� �v� ��+�+�C�,>�,>�,O�,O�Q\�^h�jq�r�C� �x� ��+�+�C�,>�,>�,Q�,Q�S^�`j�ls�t�C��V�4L�V�H�2U�V�W� W��>�>��!�!��  ����d�j�j���X]�.^�_�`�`�� �V���0J�3�q�6�(�.S�T�U�U��V�sA�/F�C(E�F�5E�F� E>�E9�3E>�4F�9E>�>Fc ���K�|d}|d}|d}|d}|d} tj|||tj|j d��j d�tj|j d��j d���}|j �}dd l}|jd �tjtjj||d �} | j|||||t|�d d d � } tdt!j"| dd����gS#t$$r$} tddt'| �����gcYd } ~ Sd } ~ wwxYw�w)u!图片处理(支持持久化)rr:�process� save_bucket�save_keyr>�r1r[rwrx� save_objectrN��?rh� processed) ru� source_bucket� source_keyrxryrw�processed_sizerm�statusrr'Fr(ru图片处理失败: )rrKrArMrCrNrL�time�sleeprnrrorprtrErr.r/rr) r rr:rwrxryr0�processed_datar�� download_urlrQr s r!� image_processr��sa�����}�%�K��l�#�J��9�o�G��}�%�K��J��H�!P��$�$�����(�(��);�);�G�)D�E�L�L�W�U��(�(�����)A�B�I�I�'�R� %� ������� � � � �3��"�0�0��1C�1C�1S�1S�U`�bj�lp�q� �*�4�4�(�$�&� ��!�.�1��!�  ����d�j�j���X]�.^�_�`�`�� �P���0D�S��V�H�.M�N�O�O��P�s5�E!�DD1�0E!�1 E�:E�E�E!�E�E!c��K�|d}|d} tj||d��}|j�jd�} t j |�}|||dd�}td t j|d d � ���gS#tj $r |||ddd �}Y�AwxYw#t$r$}td dt|�����gcYd}~Sd}~wwxYw�w)u获取图片信息rr:z image/info�rwr>�success)r1r[� image_infor��返回原始格式数据)r1r[r�r��noterr'Fr(ru获取图片信息失败: N� rrKrLrNr.�loads�JSONDecodeErrorrr/rr)r rr:r0�image_info_data�image_info_jsonrQr s r!r�r��������}�%�K��l�#�J�V��$�$�[�*�l�$�S���)�)�+�,�,�W�5�� �"�j�j��9�O�%�!�-�#� �F� ��d�j�j���X]�.^�_�`�`���#�#� �&�!�-�#�2� �F� �� �V���0J�3�q�6�(�.S�T�U�U��V��X� C�7B'�B�"#B'�C�B$�!B'�#B$�$B'�' C�0C� C� C�C�Cc ��(K�|d}|d}|jdd�}|jdd�}|d}|d} d t|��d |��}tj|||t j |j d ��jd �t j |j d ��jd �� �}|j�} d dl } | jd�tjtjj||d�} | j||||||t!| �ddd� } t#dt%j&| dd����gS#t($r$} t#ddt+| �����gcYd} ~ Sd} ~ wwxYw�w)u!视频截帧(支持持久化)rr:r�i,�format�jpgrxryzvideo/snapshot,t_z,f_r>rzrNr|rhr}) rur~rrxryr�r�r�rmr�rr'Fr(ru视频截帧失败: )r�intrrKrArMrCrNrLr�r�rnrrorprtrErr.r/rr)r rr:r�r�rxryrwr0r�� time_moduler�rQr s r!�video_snapshotr�)s������}�%�K��l�#�J� �8�8�F�C� �D� �X�X�h�� &�F��}�%�K��J��H�%P�%�c�$�i�[��F�8�<���$�$�����(�(��);�);�G�)D�E�L�L�W�U��(�(�����)A�B�I�I�'�R� %� ������� #����#��"�0�0��1C�1C�1S�1S�U`�bj�lp�q� �*�4�4�(�$�&� ���!�.�1��!�  ����d�j�j���X]�.^�_�`�`�� �P���0D�S��V�H�.M�N�O�O��P�s5�9F�D%E"�!F�" F�+F �F�F� F�Fc��K�|d}|d} tj||d��}|j�jd�} t j |�}|||dd�}td t j|d d � ���gS#tj $r |||ddd �}Y�AwxYw#t$r$}td dt|�����gcYd}~Sd}~wwxYw�w)u获取视频信息rr:z video/infor�r>r�)r1r[� video_infor�r�)r1r[r�r�r�rr'Fr(ru获取视频信息失败: Nr�)r rr:r0�video_info_data�video_info_jsonrQr s r!r�r�Yr�r�)$�__doc__r.rA�logging�typingrrrr� mcp.typesr�configr� getLogger�__name__�logger� TosClientV2� access_key� secret_keyr r rrrr+r6r8rDrKrarcrur�r�r�r���r!�<module>r�s8��� � ��"�"� �!�� �� � �8� $���S�_�_������� � � � � � � � � S�d�3��8�n� S��k�1B� S� S�d�3��8�n� S��k�1B� S� \��S�#�X�� \�4� �3D� \�S�d�3��8�n�S��k�1B�S�P�4��S��>�P�d�;�.?�P�,&P�4��S��>�&P�d�;�.?�&P�PP�T�#�s�(�^�P��[�0A�P�B P�d�3��8�n� P��k�1B� P�V�d�3��8�n�V��k�1B�V�>)P�d�3��8�n�)P��k�1B�)P�V V�4��S��>� V�d�;�.?� V�H.P�t�C��H�~�.P�$�{�2C�.P�` V�4��S��>� V�d�;�.?� Vr�

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/jneless/tos-mcp'

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