Skip to main content
Glama
Mulan Permissive Software License, Version 2
14
mcp_server.cpython-312.pyc14.3 kB
� �D�g�*���ddlZddlZddlZddlmZmZmZmZmZddl Z ddl Z ddl m Z m Z ddlmZddlmZmZddlmZddlmZmZej0ej2d� �ej4d �ZGd �d e�ZGd �de�ZGd�de�ZGd�de�Zd�Z d�Z!dd�Z"dd�Z#d�Z$d�Z%Gd�d�Z&y)�N)�Any�Dict�List�Optional�Union)�FastMCP�Server)�SseServerTransport)� BaseModel�Field)� Starlette)�Route�Mountz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�level�format� mcp_serverc�>�eZdZUeed<eed<dZeed<dZeed<y)�ApiParam�type�descF�requiredN�default) �__name__� __module__� __qualname__�str�__annotations__r�boolrr���+E:\data\mcp-server\http-4-mcp\mcp_server.pyrrs �� �I� �I��H�d���G�S�r rc�,�eZdZUeed<dZeeed<y)�ApiResponseField�pathNr)rrrrrrrrr r!r#r#s�� �I��D�(�3�-�r r#c���eZdZUeed<eed<eed<dZeed<eeefed<ee ��Z eeefed<ee ��Z eee ee ffed <d Zeeeefed <d Zeed <y )�ApiTool�name� description�url�GET�method�params)�default_factory�headers�responseN�response_transform�metadata� response_mode)rrrrrr+rrr �dictr.r/rr#r0rrr2rr r!r&r&#s��� �I��� �H��F�C�� ��h�� ��#�D�9�G�T�#�s�(�^�9�8=�d�8S�H�d�3��c�#3�3�4�4�5�S�37����c�3�h��0�7�#�M�3�#r r&c��eZdZUeeed<y)� ApiConfig�toolsN)rrrrr&rrr r!r5r5.s �� ��=�r r5c�p�|jd�}|}|D]}t|t�r ||vr||}�y|S)N�.)�split� isinstancer3)�datar$�keys�result�keys r!�get_nested_valuer?2sA�� �:�:�c�?�D� �F��� �f�d� #��v� ��C�[�F�� � �Mr c��� t|dd��5}tj|�}ddd�tdi��S#1swY�xYw#t$r}t j d|����d}~wwxYw)N�r�utf-8��encodingz"Failed to load API configuration: r)�open�json�loadr5� Exception�logger�error)� config_path�f� config_data�es r!�load_api_configrO<sf��� �+�s�W� 5���)�)�A�,�K�6��'�;�'�'�6� 5�� ��� � �9�!��=�>� ���s*�A�9�A�A�A� A,�A'�'A,c��K�i}|jj�D]H\}}||vr ||||<�|j�|j||<�/|js�<t d|����|j j �}tj�4�d{���} |jj�dk(r(|j|j|||���d{���}n�|jj�dk(r(|j|j|||���d{���}n�|jj�dk(r(|j|j|||���d{���}n]|jj�dk(r(|j|j|||���d{���}nt d|j����|j!�|j#�cddd��d{���S7��c7��!7��7��7�X7�#t$$r} t&j)d | ����d} ~ wwxYw#1�d{���7swYyxYw�w) NzMissing required parameter: r*)r,r.�timeout�POST)rFr.rQ�PUT�DELETEzUnsupported HTTP method: zHTTP request error: )r,�itemsrr� ValueErrorr.�copy�httpx� AsyncClientr+�upper�getr)�post�put�delete�raise_for_statusrFrHrIrJ) �toolr,rQ�processed_paramsr'� param_configr.�clientr/rNs r!�make_http_requestrdEs+������"�k�k�/�/�1���l� �6�>�%+�D�\� �T� "� � !� !� -�%1�%9�%9� �T� "� � "� "��;�D�6�B�C� C� 2��l�l���!�G�� � �"�"�f�$ ��{�{� � �"�e�+�!'����H�H�+�#�#� ",�"��� ���"�"�$��.�!'����H�H�)�#�#� "-�"��� ���"�"�$��-�!'����H�H�)�#�#� ",�"��� ���"�"�$��0�!'����H�H�+�#�#� "/�"���!�#<�T�[�[�M�!J�K�K� � %� %� '��=�=�?�E#�"�"����������1#��F� � �L�L�/��s�3� 4� �� ��G#�"�"�s��AI �AI �G?�I � H7�"?H �!H�"AH �&H�'AH �+H�,AH �0H �1<H �- I �9H �:I �H �H �H � H � I � H4�H/�/H4�4H7�7I �=I �>I �I c���|s|S|dk(r t||�Si}|j�D]3\}}t|t�r|}n |j}t ||�||<�5|S)Nr1)�create_metadata_responserUr:rr$r?)r;�mappingr2r=� output_key�sourcer$s r!�transform_responserj{sm�� �� �� �"�'��g�6�6��F�%�m�m�o�� �F� �f�c� "��D��;�;�D�-�d�D�9��z��.� �Mr c��dii}|j�D] \}}|||<� |j�D]T\}}t|t�r|}|}n&|j}|j� |jn|}t ||�} ||d| <�Vd|iS)uF 将原始数据和映射转换为包含元数据的新格式 � field_paths� __metadata__)rUr:rr$r�normalize_path) r;rgr1r>�valuerhrir$r�normalized_paths r!rfrf�s��� �r��H� �j�j�l� ��U���� �#�&�m�m�o�� �F� �f�c� "��D��D��;�;�D�"(�+�+�"9�6�;�;�z�D�)��z�:��48�����0�.�" �� �r c��d|vr d|vr|�d�Sd|vr1|jd�}|d}dj|dd�}|�d|��S|S)uq 将路径格式从data.items@arr和data.items@arr_property转换为data.items[]和data.items[].property z@arrz@arr_z[]r8�����Nz[].)r9�join)r$rh�parts� property_name� base_paths r!rnrn�si�� ����z� 9���r�{�� �J� �� � �3����b� � ��H�H�U�3�B�Z�(� ���C� ��/�/�� r c�4�eZdZdd�Zd�Zd�Zd�Zd�Zd d�Zy) � HttpMcpServerc���||_||_|j�|_t |�|_t d�|_|j�|j�|_ y)N�http_mcp_server) rK� apis_path� _load_config�configrO� api_configr�mcp�_register_tools�_create_starlette_app�app)�selfrKr{s r!�__init__zHttpMcpServer.__init__�sZ��&���"����'�'�)�� �)�)�4����,�-��� �����-�-�/��r c��� t|jdd��5}tj|�cddd�S#1swYyxYw#t$r+}t j d|���ddddd d d �cYd}~Sd}~wwxYw) NrArBrCzFailed to load config: �0.0.0.0�@F�info� �)�host�port�debug� log_level� max_workersrQ)rErKrFrGrHrIrJ)r�rLrNs r!r|zHttpMcpServer._load_config�sq�� ��d�&�&��g�>�!��y�y��|�?�>�>��� � �L�L�2�1�#�6� 7�!���#�!�� � �� �s6�A�9� A�A�A�A� A9� A4�.A9�4A9c�\�|jjD]}|j|��y�N)r~r6�_register_tool)r�� tool_configs r!r�zHttpMcpServer._register_tools�s$���?�?�0�0�K� � � � � ,�1r c������fd�}d}d}dt�j�zdz}�jj�j�j |z|z|z��|�t jd�j�d��y) Nc���K� tjd�j�d|���t�|�jj dd����d{���}�j r$t|�j �j��}|S|S7�6#t$r<}tjd�j�d|���d t|�icYd}~Sd}~wwxYw�w) Nu📢 HTTP-4-MCP Tool ✨【u】✨ called with kwargs: rQr�)rQ)r2u❌ HTTP-4-MCP Tool ✨【u】✨ execution failed: rJ) rIr�r'rdr}r[r/rjr2rHrJr)�kwargs� response_data�transformed_datarNr�r�s ��r!� tool_handlerz2HttpMcpServer._register_tool.<locals>.tool_handler�s������ )�� � �9�+�:J�:J�9K�Kf�gm�fn�o�p�&7��� �K�K�O�O�I�r�:�'�!� ��'�'�'9�%�#�,�,�&1�&?�&?�(�$� ,�+�$�$�!!��"� )�� � �9�+�:J�:J�9K�Kd�ef�dg�h�i���Q��(�(�� )�sS�C�AB�B �3B� C� B� C� B� C�1C�C� C�C�Cu�返回的数据是一个类似下面的json对象,请根据这个json对象生成对应的mcp工具的描述。field_paths是对下面的字段的描述,你需要从json中找出你需要的内容 u�{"__metadata__":{"field_paths":{"code":"响应码","location[]":"数组","location[].name":"名称",},"code":"200","location":[{"name":"杭州",}]}} u我的入参有:� )r'r(u(🐖 HTTP-4-MCP Registered API tool: ✨u✨)rr,rr`r'r(rIr�)r�r�r��base_description� base_template� base_paramss`` r!r�zHttpMcpServer._register_tool�s���� )�4h��K� �(�3�{�/A�/A�+B�B�T�I� � ���� � ��!�!�#�/�/�2B�B�]�R�U`�`� � � � � � � �>�{�?O�?O�>P�PS�T�Ur c ������jj�td����fd�}�fd�}t�jj dd�t d|��td�j��t d |��g� �}|S) Nz /messages/c��0�K��j|j|j|j�4�d{���\}}�j ||�j ���d{���ddd��d{���y7�A7�7� #1�d{���7swYyxYw�wr�)� connect_sse�scope�receive�_send�run�create_initialization_options)�request� read_stream� write_streamr�sses ��r!� handle_ssez7HttpMcpServer._create_starlette_app.<locals>.handle_sses���������� � ����� � ���-�+�|� �n�n�� ��<�<�>���� ���� �� �����sV�6B�A;�B�(B�%A=�&B�* B�5A?�6B�=B�?B�B�B �B�Bc����K� t�j��_�j�ddd�S#t$r0}t j d|���dt|�d�cYd}~Sd}~wwxYw�w)N�successz#Configuration reloaded successfully)�status�messagezFailed to reload config: rJ)rOr{r~r�rHrIrJr)r�rNr�s �r!� reload_configz:HttpMcpServer._create_starlette_app.<locals>.reload_configsf����� >�"1�$�.�.�"A����$�$�&�"+�8]�^�^��� >�� � �8���<�=�")�c�!�f�=�=�� >�s0�A0�.4�A0� A-�%A(�"A-�#A0�(A-�-A0r�Fz/mcp/sse)�endpoint)r�z /admin/reload)r��routes) r� _mcp_serverr r r}r[rr�handle_post_message)r�r�r�r�rr�s` @@r!r�z#HttpMcpServer._create_starlette_app st����X�X�)�)� � ��.�� � >���+�+�/�/�'�5�1��j�:�6��l��(?�(?�@��o� �>�� ��� r Nc �4�|xs|jjdd�}|xs|jjdd�}tjd|�d|���t j |j |||jjdd�� �y) Nr�r�r�r�z0Starting HTTP-4-MCP middleware server at http://�:r�r�)r�r�r�)r}r[rIr��uvicornr�r�)r�r�r�s r!r�zHttpMcpServer.run0sy���9�t�{�{���v�y�9���4�t�{�{���v�t�4��� � �F�t�f�A�d�V�T�U�� � � �H�H����k�k�o�o�k�6�:�  r )zconfig/config.jsonzconfig/apis.json)NN) rrrr�r|r�r�r�r�rr r!rxrx�s#�� 0� �-�$V�L"�H  r rx)r�)r1)'rF�logging�os�typingrrrrrrXr�� mcp.serverrr �mcp.server.sser �pydanticr r �starlette.applicationsr �starlette.routingrr� basicConfig�INFO� getLoggerrIrr#r&r5r?rOrdrjrfrnrxrr r!�<module>r�s��� �� �3�3� ��&�-�%�,�*����� �,�,� A�� �� � �<� (���y�� �y�� $�i� $�� ����4�l�* �D�&u �u r

Latest Blog Posts

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/Tght1211/http-4-mcp'

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