Skip to main content
Glama
config_ui.cpython-312.pyc15.4 kB
� �'�g,��L�dZddlZddlZddlZddlmZmZmZmZddl m Z m Z m Z m Z ddlmZmZddlmZddlmZddlmZddlZddlZe d � �Zej5d ed � �d ��ed� �ZGd�de�ZGd�de�ZGd�de�ZGd�de�ZdZ ejBejDjGe �d��ejIde��d��Z%ejMde��defd��Z'ejMd �d!efd"��Z(ejSd#�d$e*fd%��Z+ejMd&�d'��Z,ejMd(�d)e-fd*��Z.ej_d+�d,e fd-��Z0ejId.e�/�d,e fd0��Z1d2d1�Z2y)3zY HTTP-4-MCP Server Configuration Tool UI Provides visual interface for API configuration �N)�Dict�List�Optional�Union)�FastAPI� HTTPException�Request�Response)� HTMLResponse� JSONResponse)� StaticFiles)�Jinja2Templates)� BaseModelzHTTP-4-MCP Configuration Tool)�titlez/static�static)� directory)�namezstatic/templatesc�D�eZdZUeed<eed<dZeed<dZeeed<y)� ApiParamModel�type�descF�requiredN�default) �__name__� __module__� __qualname__�str�__annotations__r�boolrr���*E:\data\mcp-server\http-4-mcp\config_ui.pyrrs$�� �I� �I��H�d��!�G�X�c�]�!r!rc�,�eZdZUeed<dZeeed<y)�ApiResponseFieldModel�pathNr)rrrrrrrr r!r"r$r$%s�� �I��D�(�3�-�r!r$c��eZdZUeed<eed<eed<dZeed<iZeeefed<iZ eeefed<iZ eee ee ffed<d Z eed <y ) � ApiToolModelr� description�url�GET�method�params�headers�response�metadata� response_modeN)rrrrrr+r,rrr-r.rr$r0r r!r"r'r')sk�� �I��� �H��F�C��')�F�D��m�#� $�)� �G�T�#�s�(�^� �=?�H�d�3��c�#8�8�9�9�:�?�#�M�3�#r!r'c��eZdZUeeed<y)�ApiConfigModel�toolsN)rrrrr'rr r!r"r2r23s �� � � �r!r2zconfig/apis.jsonT��exist_okz /api/config)�response_modelc��K� tjjt�sdgiSt tdd��5}t j |�}ddd�|S#1swYSxYw#t$rL}dt|��dtj���}t|�tdd t|���� ��d}~wwxYw�w) zGet current API configurationr3�r�utf-8��encodingNzFailed to read configuration: � ��u读取配置失败: �� status_code�detail) �osr%�exists�API_CONFIG_PATH�open�json�load� Exceptionr� traceback� format_exc�printr)�f�config�e� error_details r"� get_configrO=s����� U��w�w�~�~�o�.��R�=� � �/�3�� 9�Q��Y�Y�q�\�F�:�� �:�� �� �U�7��A��x�r�)�BV�BV�BX�AY�Z� � �l����6J�3�q�6�(�4S�T�T��U�sV�C�&A*�C�A*�A� A*�C�A'�"A*�&C�'A*�* B?�3AB:�:B?�?CrLc���K� tjtjjt�d��t tdd��5}t j|j�|dd��d d d �|S#1swY|SxYw#t$rL}d t|��d tj���}t|�td d t|������d }~wwxYw�w)zSave API configurationTr4�wr9r:F��� ensure_ascii�indentNzFailed to save configuration: r<r=u保存配置失败: r>)rA�makedirsr%�dirnamerCrDrE�dump�dictrGrrHrIrJr)rLrKrMrNs r"� save_configrZMs����� U� � � �B�G�G�O�O�O�4�t�D��/�3�� 9�Q� �I�I�f�k�k�m�Q�U�1� E�:�� �:�� �� �U�7��A��x�r�)�BV�BV�BX�AY�Z� � �l����6J�3�q�6�(�4S�T�T��U�sN�C%�A B �(B�6 B �?C%�B �B � C%� B � C"�AC�C"�"C%z /api/tool�toolc���K� tjtjjt�d��tjj t�r=t tdd��5} tj|�}tdi|��}ddd�n tg��}jD]6}|j|jk(s�tdd |j�d �� ��|jj|�t td d��5}tj|j!�|d d��ddd�dd |j�d�d�S#tj$rtg��}Y��wxYw#1swY��xYw#1swY�MxYw#t$r�t"$rL}dt%|��dt'j(���}t+|�tddt%|���� ��d}~wwxYw�w)z Add new toolTr4r8r9r:)r3N��工具 'u ' 已存在r>rQFrRrS�successu ' 已添加��status�messagezFailed to add tool: r<r=u添加工具失败: r )rArVr%rWrCrBrDrErFr2�JSONDecodeErrorr3rr�appendrXrYrGrrHrIrJ)r[rK� config_data�current_config� existing_toolrMrNs r"�add_toolrh^s�����#U� � � �B�G�G�O�O�O�4�t�D� �7�7�>�>�/� *��o�s�W�=��>�"&�)�)�A�,�K�%3�%B�k�%B�N�>�=�,�"�5�N�,�1�1�M��!�!�T�Y�Y�.�#��h�t�y�y�k�Q\�<]�^�^�2� ���#�#�D�)��/�3�� 9�Q� �I�I�n�)�)�+�Q�U�1� M�:�$�(�4�9�9�+�[�0Q�R�R��'�+�+�>�%3�"�%=�N�>�� >�=��(:� 9�� �� � �U�-�c�!�f�X�R� �8L�8L�8N�7O�P� � �l����6J�3�q�6�(�4S�T�T��U�s�G;�A-F�1F�3 E�=F�A F�(F�F�G;�E?�<F�>E?�?F�F �F�F�F�G8�,AG3�3G8�8G;z/api/tool/{tool_name}� tool_namec��NK� tjjt�s t dd���t tdd��5}t j|�}tdi|��}ddd�tj�}|jD�cgc]}|j|k7s�|��c}|_ t|j�|k(rt dd|�d ����t td d��5}t j|j�|d d � �ddd�dd|�d�d�S#1swY��xYwcc}w#1swY�#xYw#t$r�t$rL}dt|��dt!j"���}t%|�t ddt|������d}~wwxYw�w)z Delete tooli�u配置文件不存在r>r8r9r:Nr^u ' 不存在rQFrRrSr_u ' 已删除r`zFailed to delete tool: r<r=u删除工具失败: r )rAr%rBrCrrDrErFr2�lenr3rrXrYrGrrHrIrJ)rirKrerf�original_lengthr[rMrNs r"� delete_toolrm�sz����U��w�w�~�~�o�.��C�8O�P� P��/�3�� 9�Q��)�)�A�,�K�+�:�k�:�N�:� �n�2�2�3��1?�1E�1E�`�1E�����V_�I_��1E�`��� �~�#�#� $�� 7��C�(�9�+�[�8Y�Z� Z��/�3�� 9�Q� �I�I�n�)�)�+�Q�U�1� M�:�$�(�9�+�[�0Q�R�R�:� 9�� a� :� 9�� �� � �U�0��Q����9�;O�;O�;Q�:R�S� � �l����6J�3�q�6�(�4S�T�T��U�sm�F%�AE�!D'�'+E�D3�'D3�+AE�.(D8�E�&F%�'D0�, E�8E�=E�F"�AF�F"�"F%z /api/reloadc ���K� tjd��4�d{���} |jd��d{���}|j�|j �cddd��d{���S7�O7�77� #tj $r=}t |jjd|jj�����d}~wtj$r}t ddt|������d}~wwxYw#1�d{���7swYyxYw#t$rL}d t|��d tj���}t|�t dd t|������d}~wwxYw�w) z%Notify server to reload configuration�$@��timeoutNz"http://localhost:8000/admin/reloadu服务器返回错误: r>r=u无法连接到MCP服务器: z Failed to reload configuration: r<u重载配置失败: )�httpx� AsyncClient�get�raise_for_statusrE�HTTPStatusErrorrr.r?�text� RequestErrorrrGrHrIrJ)�clientr.rMrNs r"� reload_configrz�s7����U��$�$�T�2�2�f� T�!'���,P�!Q�Q���)�)�+��}�}�� 3�2�2��Q��3�� �(�(� W�#�� � �0F�0F�,C�A�J�J�O�O�CT�*U�W�W���%�%� T�#��,I�#�a�&��*R�T�T�� T��3�2�2�� �U�9�#�a�&���I�DX�DX�DZ�C[�\� � �l����6J�3�q�6�(�4S�T�T��U�s��E#�D �A.�D �C6�A4�A0�#A4� D �(A2�)D �-E#�.D �0A4�2D �4C3�8B?�?C3�C.�.C3�3C6�6D�<C? �=D�D �E#�D � E �AE�E � E#z/api/test_request� request_datac ��0K� |jd�}|jdd�}|jdi�}|jdi�}|jdi�}|s tdd� ��|||d �}|dk(rn |d vr|r||d <tjd ��4�d{���} t d|�d|���t d|���|rt d|���|j d i|���d{���}t d|j �d|j��� |j�} d|j | d�cddd��d{���S7��7�]7� #d|j |jdd�d�cYcddd��d{���7SxYw#tj$rC} tddd| jj ��d���cYd} ~ cddd��d{���7Sd} ~ wtj$r8} tdddt| ���d���cYd} ~ cddd��d{���7Sd} ~ wwxYw#1�d{���7swYyxYw#t$rT} dt| ��dtj ���} t | �tdddt| ���d���cYd} ~ Sd} ~ wwxYw�w)!Nr)r+r*r-r,�bodyr]uURL不能为空r>)r+r)r-)�POST�PUT�PATCHrErorpu发送API测试请求: � u 请求头: u 请求体: uAPI测试请求响应: T)r_r?�data)�content� raw_responser=FuHTTP错误: 状态码 )r_�error�r?r�u请求错误: zTest request failed: r<u测试请求失败: r )rtrrrrsrJ�requestr?rwrErvr r.rxrrGrHrI) r{r)r+r-r,r}�request_kwargsryr.�resultrMrNs r"� test_requestr��s�����H ����u�%���!�!�(�E�2���"�"�9�b�1���!�!�(�B�/�������+����C�8I�J� J���� �� �U�?� � �/� /��)-��v�&��$�$�T�2�2�f�$ ��/��x�q���>�?�� �G�9�-�.���K��v�.�/�!/����!A�.�!A�A���/��0D�0D�/E�Q�x�}�}�o�V�W��%�]�]�_�F�#'�'/�';�';� &��3�2�2��B��3��$ �$(�'/�';�';�'/�}�}�,0�!���)3�2�2��8�(�(� �#� #�(-�:P�QR�Q[�Q[�Qg�Qg�Ph�8i�j���;3�2�2��B�%�%� �#� #�(-�.��Q���8Q�R���E3�2�2��B ��C3�2�2��N � �.�s�1�v�h�b��9M�9M�9O�8P�Q� � �l���� %�2F�s�1�v�h�0O�P� � �� �s?�J�BH6�E�H6�!H!�#AE?�'E�()E?�E �1 H6�=E�>H6�J�H6�E?�H6� E<�(E?�) H6�5E8�6H6�;J�<E?�?H�&G�8H�9H!�= H6� G � H6�J�H�&H�H�H!� H6�H�H6�J�H�H!�!H3�'H* �(H3�/H6�2J�3H6�6 J�?A J�J� J�J�J�httpr�c ��^K� ||��d{���S7�#t$r�}dt|��dtj���}t |�t |t �r(t|jd|ji��cYd}~Stdddt|���i��cYd}~Sd}~wwxYw�w)NzUnhandled exception: r<r@r�r=u服务器内部错误: ) rGrrHrIrJ� isinstancerr r?r@)r�� call_nextrMrNs r"�error_handling_middlewarer� s����� ��w�'�'�'�'�� �  �.�s�1�v�h�b��9M�9M�9O�8P�Q� � �l�� �a�� '���M�M�!�1�8�8�,�� � ���!8��Q���A�B� � ��  �sO�B-� ���B-�� B*�A B%�?B*�B-�B%�B*� B-�%B*�*B-�/)�response_classc��:K�tjdd|i�S�w)zDConfiguration tool homepage with Apple Design + Pixel style + emojisz index.htmlr�)� templates�TemplateResponse)r�s r"� read_rootr�s ���� � %� %�l�Y��4H� I�I�s�c�<�ddl}|jt||��y)z Run configuration tool UI serverrN)�host�port)�uvicorn�run�app)r�r�r�s r"� run_config_uir�#s��� �K�K��$�T�K�*r!)z0.0.0.0iA)3�__doc__rErArH�typingrrrr�fastapirrr r �fastapi.responsesr r �fastapi.staticfilesr �fastapi.templatingr�pydanticrrr�asyncior��mountr�rr$r'r2rCrVr%rWrtrO�postrZrh�deleterrmrzrYr�� middlewarer�r�r�r r!r"�<module>r�s����  � ��.�.�=�=�8�+�.�� ���3�4��� � �)�[�8�4�8� �D� �&8� 9� �"�I�"� �I��$�9�$��Y��%�� �� � �B�G�G�O�O�O� ,�t�<�����~��6� U�7� U����-���7�U�n�U�8�U� ���+��%U��%U��%U�N��� #�$�U��U�%�U�>���-��U��U�*��� ��I �T�I ��I �X����� �W� �� �&����\��*�J�W�J�+�J� +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