Skip to main content
Glama
tos_mcp_server.cpython-312.pyc24.7 kB
� ��h�m��V�dZddlZddlZddlZddlZddlmZmZmZddl Z ddl Z ddl Z ddl m Z ddlmZmZe j"e j$��e j&e�Ze d�Zej.dd �Zej.d d e�d ��Zej.d �Zej.d�Zeres#ej9d�ej:d�e j<eeee��ZejA�deefd��Z ejC�de"dee"efdeefd��Z!dee"efdeefd�Z#dee"efdeefd�Z$dee"efdeefd�Z%dee"efdeefd�Z&dee"efdeefd�Z'dee"efdeefd�Z(dee"efdeefd�Z)dee"efdeefd �Z*dee"efdeefd!�Z+dee"efdeefd"�Z,dee"efdeefd#�Z-dee"efdeefd$�Z.dee"efdeefd%�Z/d&�Z0ed'k(re jbe0��yy)(u] TOS (火山引擎对象存储) MCP Server 提供 TOS 对象存储服务的 MCP 工具集成 �N)�Any�Dict�List)�Server)�Tool� TextContent)�levelztos-mcp� TOS_REGIONz cn-beijing� TOS_ENDPOINTz https://tos-z .volces.com�TOS_ACCESS_KEY�TOS_SECRET_KEYu:TOS_ACCESS_KEY 和 TOS_SECRET_KEY 环境变量必须设置�)�ak�sk�endpoint�region�returnc��VK�tdddddd�ddgd�d d �d �d gd ���tdddid���tdddd ddd�id gd ���tdddd ddd�id gd ���tdddddd�ddd�ddd�dddd�dddd�d �gd!�d ���td"d#dddd�ddd�dd$dd�d%�d d&gd ���td'd(dddd�dd)d*d�dd+d*d�d,d-d.d�d/�d gd ���td0d1dddd�ddd�d2�d d&gd ���td3d4dddd�ddd�dd5gd6�d7d �d,d8d9d�d:�d d&gd ���td;d<dddd�dd=d�d2�d d&gd ���td>d?dddd�dd=d�dd@d�ddAd�ddBd�dC�gdC�d ���tdDdEdddd�ddFd�dGdHdId�ddJdKdLgdKd �ddMd�ddNd�dO�gdP�d ���tdQdRdddd�ddFd�d2�d d&gd ���g S�w)Su列出所有可用的工具�tos_create_bucketu创建 TOS 存储桶�object�stringu存储桶名称)�type� descriptionu访问控制权限)�private� public-readzpublic-read-writer)rr�enum�default)� bucket_name�aclr)r� properties�required)�namer� inputSchema�tos_list_bucketsu列举 TOS 存储桶)rr �tos_get_bucket_meta�获取存储桶元数据�tos_delete_bucketu删除 TOS 存储桶�tos_put_objectu上传对象到 TOSu 对象键名u-文件内容(base64编码)或文本内容u 内容类型�application/octet-stream)rrr�booleanu内容是否为base64编码F)r� object_key�content� content_type� is_base64)rr+r,�tos_get_objectu从 TOS 下载对象u!是否以base64格式返回内容)rr+�return_as_base64r+�tos_list_objectsu列举 TOS 对象u对象键前缀�u 分隔符�integeru最大返回对象数量��)r�prefix� delimiter�max_keys�tos_delete_objectu删除 TOS 对象)rr+�tos_presigned_url�生成预签名 URLu HTTP方法)�GET�PUT�POST�DELETEr;u过期时间(秒)�)rr+�method�expires�tos_image_info�获取图片信息u图片对象键名�tos_image_processu9图片处理(组合操作,支持多种处理参数)u�图片处理参数。参数格式通常为 'image/操作,参数',如: 'image/resize,h_100' 或 'image/format,jpg'。常用操作包括:resize(缩放),format(格式转换),quality(质量),crop(裁剪),rotate(旋转)等。u保存的存储桶名称u保存的对象键名)rr+�process� save_bucket�save_key�tos_video_snapshot�!视频截帧(支持持久化)u视频对象键名�numberu6截帧时间点(毫秒),如300表示第300毫秒�,u 输出格式�jpg�pngu$保存截帧图片的存储桶名称u!保存截帧图片的对象键名)rr+�time�formatrFrG)rr+rFrG�tos_video_info�获取视频信息)r���tos_mcp_server.py� list_toolsrU,s���� �$�.� �!)�'8�$� !)�';� O�#,� � �+�O�� �( �#�.� � �� � �&�2� �!� (�'8�$�� +�O� � � �$�.� �!� (�'8�$�� +�O� � � �!�-� �!)�'8�$� !)�'5�#� !)�'V� � !)�'5�#=�%� !*�'D�#(�"�%�0E�5� �@ �!�.� �!)�'8�$� !)�'5�#� !*�'J�#(�)��+�L�9�#� �. �#�+� �!)�'8�$� !)�'8�#%�� !)�'2�#%�"� !*�'A�#'�!��*+�O�/� �: �$�+� �!)�'8�$� !)�'5�#� �+�L�9� � �( �$�-� �!)�'8�$� !)�'5�#� !)�'3� @�#(� �!*�'>�#'� ��*+�L�9�/� �< �!�,� �!)�'8�$� !)�';�#� �+�L�9� � �& �$�S� �!)�'8�$� !)�';�#� !)�(J� � !)�'A�$� !)�'>�!�#�,`�1� �@ �%�;� �!)�'8�$� !)�';�#� !)�'_�#&�� !)�'5�!&���#(� �!)�'M�$� !)�'J�!�1�:U�? �$ �J �!�,� �!)�'8�$� !)�';�#� �+�L�9� � �ul �l�s�F'F)r"� argumentsc ��K� |dk(rt|��d{���S|dk(rt|��d{���S|dk(rt|��d{���S|dk(rt|��d{���S|dk(rt |��d{���S|dk(rt |��d{���S|dk(rt |��d{���S|d k(rt|��d{���S|d k(rt|��d{���S|d k(rt|��d{���S|d k(rt|��d{���S|d k(rt|��d{���S|dk(rt|��d{���Stdd|����gS7��67��!7�� 7��7��7��7��7��7��7�r7�\7�F7�0#t$rH}tj!d|�dt#|����tddt#|�����gcYd}~Sd}~wwxYw�w)u处理工具调用rNr$r%r'r(r/r1r8r9rDrBrHrP�textu未知工具: �rrXu工具调用错误 z: u错误: )� create_bucket� list_buckets�get_bucket_meta� delete_bucket� put_object� get_object� list_objects� delete_object� presigned_url� image_process� image_info�video_snapshot� video_infor� Exception�logger�error�str)r"rV�es rT� call_toolrl]s�����D� �&� &�&�y�1�1� 1� �'� '�%�i�0�0� 0� �*� *�(��3�3� 3� �(� (�&�y�1�1� 1� �%� %�#�I�.�.� .� �%� %�#�I�.�.� .� �'� '�%�i�0�0� 0� �(� (�&�y�1�1� 1� �(� (�&�y�1�1� 1� �(� (�&�y�1�1� 1� �%� %�#�I�.�.� .� �)� )�'� �2�2� 2� �%� %�#�I�.�.� .��V�N�4�&�2I�J�K� K�52��0��3��1��.��.��0��1��1��1��.��2��.�� �D�� � �*�4�&��3�q�6�(�;�<�����Q���.A�B�C�C��D�s��F>�E*�E �E*�F>�E*�E�E*�F>�E*�E�E*� F>� E*�E� E*�#F>�$E*�7E�8E*�;F>�<E*�E�E*�F>�E*�'E�(E*�+F>�,E*�?E�E*�F>�E*�E �E*�F>�E*�/E"�0E*�3F>�4E*�E$�E*� F>� E*�E&� E*�#F>�$E*�7E(�8E*�;F>�<E*� F>� E*�E*�E*�E*�E*�E*�E*�E*� E*�"E*�$E*�&E*�(E*�* F;�3=F6�0F;�1F>�6F;�;F>�argsc��K�|d}|jdd�} tj||dk(rtjj n8|dk(rtjj ntjj�tdd|����gS#t$r$}tddt|�����gcYd }~Sd }~wwxYw�w) u创建存储桶rrrrrXu成功创建存储桶: rYu创建存储桶失败: N) �get� tos_clientrZ�tos�ACLType� ACL_Private�ACL_Public_Read�ACL_Public_Read_Writerrgrj)rmrrrks rTrZrZ�s������}�%�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)r"� creation_date�locationrX�F��indent� ensure_asciirYu列举存储桶失败: ) rpr[�buckets�appendr"rxrjryr�json�dumpsrg)rv�respr~�bucketrks rTr[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) r&rN)rr� storage_classrXrzFr{rYu 获取存储桶元数据失败: ) rp� head_bucketrr�rjrr�r�rg)rmrr��metarks rTr\r\�s������}�%�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删除存储桶rrXu成功删除存储桶: rYu删除存储桶失败: N)rpr]rrgrj)rmrrks rTr]r]�si�����}�%�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 上传对象rr+r,r-r)r.F�utf-8)r,r-�content_lengthrXu成功上传对象: z (ETag: �)rYu上传对象失败: N) ro�base64� b64decode�encoderpr^�lenr�etagrgrj) rmrr+r,r-r.� content_bytesr�rks rTr^r^�s������}�%�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+r0Fr�r�)r,r-r��encodingrXrzr{rYu下载对象失败: N)rorpr_�readr�� b64encode�decoder-r��UnicodeDecodeErrorrr�r�rgrj) rmrr+r0r�r,� content_str�resultrks rTr_r_�sW�����}�%�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 列举对象rr5r2r6r7r4)r5r6r7)�objects�common_prefixes� is_truncated�next_continuation_tokenr�N)�key� last_modified�sizer�r�r�rXrzFr{rYu列举对象失败: )rorp�list_objects_type2r�r��contentsrr�r�rjr�r�r�r�r5rr�r�rg) rmrr5r6r7r�r��objrks rTr`r`�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+rXu成功删除对象: rYu删除对象失败: N)rprarrgrj)rmrr+rks rTrarasu�����}�%�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)r:rr+r@r;rAr?r<r=r>rXu不支持的HTTP方法: rY)�urlr@� expires_inr�r�rzFr{u生成预签名URL失败: N)rorp�pre_signed_urlrq�HttpMethodType�Http_Method_Get�Http_Method_Put�Http_Method_Post�Http_Method_Deleter� signed_urlr�r�rgrj)rmrr+r@rAr�r�rks rTrbrb#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+rErFrGr��r�r�rErF� save_objectrN��?r?� processed) rb� source_bucket� source_keyrFrGrE�processed_sizer��statusrXrzFr{rYu图片处理失败: )rpr_r�r�r�r�r�rN�sleepr�rqr�r�r�r�rr�r�rgrj) rmrr+rErFrGr��processed_datarN� download_urlr�rks rTrcrcBsa�����}�%�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)rCrr+z image/info�rEr��success)r�r�rdr��返回原始格式数据)r�r�rdr��noterXrzFr{rYu获取图片信息失败: N� rpr_r�r�r��loads�JSONDecodeErrorrr�rgrj)rmrr+r��image_info_data�image_info_jsonr�rks rTrdrdm�������}�%�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)rIrr+rNrKrOrLrFrGzvideo/snapshot,t_z,f_r�r�rNr�r?r�) rbr�r�rFrGrNrOr�r�r�rXrzFr{rYu视频截帧失败: )ro�intrpr_r�r�r�r�r�rNr�r�rqr�r�r�r�rr�r�rgrj)rmrr+rNrOrFrGrEr�r�� time_moduler�r�rks rTrere�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)rQrr+z video/infor�r�r�)r�r�rfr�r�)r�r�rfr�r�rXrzFr{rYu获取视频信息失败: Nr�)rmrr+r��video_info_data�video_info_jsonr�rks rTrfrf�r�r�c��"K� ddlm}|�4�d{���\}}tj ||tj ���d{���ddd��d{���y#t$r ddlm}Y�fwxYw7�^7�,7�#1�d{���7swYyxYw�w)u 主函数r)� stdio_serverN)�mcp.server.stdior�� ImportError� mcp.server�server�run�create_initialization_options)r�� read_stream� write_streams rT�mainr��s�����,�1��~� � �!<�+�|��j�j� � � � 0� 0� 2� � � � � � �� �,�+�,�� �� �� �� � � �sx�B�A� B�A4�B�0A:� A6� A:� B�A8�B�A1�.B�0A1�1B�6A:�8B�:B �B �B �B�__main__)2�__doc__�os�sysr�r��typingrrr�asyncio�loggingrqr�r� mcp.typesrr� basicConfig�INFO� getLogger�__name__rhr��getenvr r r r ri�exit� TosClientV2rprUrlrjrZr[r\r]r^r_r`rarbrcrdrerfr�r�rRrSrT�<module>r�sQ���  � � � �"�"��� ��'�����'�,�,�'� �� � �8� $�� � � ���R�Y�Y�|�\� 2� ��r�y�y��<� �|�;�)O�P� �����+�,������+�,���^� �L�L�M�N� �C�H�H�Q�K��S�_�_��� � � � �����n�$�t�*�n��n�` ����!D�#�!D�$�s�C�x�.�!D�T�+�=N�!D��!D�H 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�;�.?� V�D  � �z���G�K�K����rS

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