Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
mcp_templates.cpython-312.pyc23.5 kB
� �mh�T� ��dZddlZddlZddlZddlZddlmZmZmZm Z m Z m Z ddl m Z ddlZddlmZmZmZmZej&d�ZGd�de �ZGd �d e �ZGd �d �Z dd edeeefdeeefde efd�Zej4j7ej4j9e�d�Zee�ay)u� mcp_templates.py - MCP提示模板系统 该模块提供提示模板的管理、注册和渲染功能。 支持Jinja2风格的模板语法和Handlebars风格的条件渲染。 �N)�Dict�List�Any�Optional�Callable�Union)�Enum)�Template� Environment�FileSystemLoader�select_autoescape� mcp_templatesc� �eZdZdZdZdZdZdZy)�TemplateFormatu模板格式枚举�text�markdown�json�htmlN)�__name__� __module__� __qualname__�__doc__�TEXT�MARKDOWN�JSON�HTML���F:\NetBrainMCP\mcp_templates.pyrrs��� �D��H� �D� �Drrc�0�eZdZdZdZdZdZdZdZdZ dZ d Z y ) �TemplateCategoryu模板类别枚举�device�config� diagnosis�analysis�report�task�system�otherN) rrrr�DEVICE� CONFIGURATION� DIAGNOSIS�ANALYSIS�REPORT�TASK�SYSTEM�OTHERrrrr!r!s-��� �F��M��I��H� �F� �D� �F� �Err!c��eZdZdZddefd�Zd�Zd�Zddeje jddfded e gefd ed ed e d ede edefd�Zeje jddfdeded ed e d ede edefd�Zdedeefd�Zddedeeefdeefd�Zde eeeffd�Zd ee efde eeeffd�Zdede eeeffd�Zdedeeefdefd�Zy)�TemplateManageru9模板管理器类,负责管理、注册和渲染模板N� templates_dirc�n�i|_||_|rXtjj |�r9t t |�tddg�dd��|_|j�nt dd��|_|j�tjdt|j����y)u� 初始化模板管理器 Args: templates_dir: 模板文件目录,如果提供,将从该目录加载文件模板 r�xmlT)�loader� autoescape� trim_blocks� lstrip_blocks)r9r:u8模板管理器初始化完成,已注册模板数量: N)� templatesr4�os�path�existsr r r � jinja_env�_load_templates_from_directory�_add_custom_filters�logger�info�len)�selfr4s r�__init__zTemplateManager.__init__)s���57���*��� �R�W�W�^�^�M�:�(�'� �6�,�f�e�_�=� �"� �D�N� � /� /� 1�)� �"��D�N� � � �"�� � �N�s�SW�Sa�Sa�Ob�Nc�d�erc���dd�}||jjd<d d���|jjd<d �fd� }||jjd<y) u添加自定义Jinja2过滤器c�2�tj|d|��S)NF)� ensure_ascii�indent)r�dumps)�objrJs r�jsonifyz4TemplateManager._add_custom_filters.<locals>.jsonifyLs���:�:�c��f�E� ErrMc�8��dj�fd�|D��S)N� c3�*�K�|] }��|����� y�w�Nr)�.0�item�bullets �r� <genexpr>zKTemplateManager._add_custom_filters.<locals>.format_list.<locals>.<genexpr>Ss�����A�5�4��x��v�.�5�s�)�join)�itemsrTs `r� format_listz8TemplateManager._add_custom_filters.<locals>.format_listRs����9�9�A�5�A�A� ArrXNc ����|sy|s/t|dt�rt|dj��}|s�|�Sddj |�zdz}|ddj dgt |�z�zdzz }|D]a}t|t�r)|D�cgc]}t |j|d����}}n t |�g}|ddj |�zdzz }�c|Scc}w)N�rz| z | z | z---)� isinstance�dict�list�keysrVrD�str�get)�data�headers�table�row�h�valuesrXs �r� format_tablez9TemplateManager._add_custom_filters.<locals>.format_tableXs�������z�$�q�'�4�8��t�A�w�|�|�~�.���"�4�(�(��5�:�:�g�.�.��7�E� �T�E�J�J��w��W��'=�>�>��G� G�E����c�4�(�;B�C�7�a�c�#�'�'�!�R�.�1�7�F�C�!�#�h�Z�F���� � �6� 2�2�V�;�;�� ��L�� Ds�"C&rg)�)z- rQ)r?�filters)rErMrgrXs @rrAz#TemplateManager._add_custom_filtersIsV��� F�-4������y�)� B�1<������}�-� �02>������~�.rc ���|jr)tjj|j�s#tj d|j���yg}tj |j�D]N\}}}|D]C}|jd�s�|jtjj||���E�P|D�]b} tjj||j�}tjj|�djdd�jdd�}tjj|�dj�} | d k(rtj} n<| d k(rtj } n&| d k(rtj"} ntj$} t&j(} t&D]"} | j*|j�vs� | } n|j-||| | d |��� �tj/d|�d|�d����ey#t0$r/} tj3d|�dt5| ����Yd} ~ ���d} ~ wwxYw)u!从模板目录加载模板文件u模板目录不存在: N)z.txt�.mdz.j2z.jinja�.json�.htmlr�\�/�.�rkrlrmu从文件加载的模板: )�name� file_path�format�category� descriptionu已加载模板文件: z (�)u加载模板文件失败: � , 错误: )r4r<r=r>rB�warning�walk�endswith�appendrV�relpath�splitext�replace�lowerrrrrrr!r1�value�register_file_template�debug� Exception�errorr_)rE�template_files�root�_�files�filers�rel_path� template_name�ext�template_formatru�cat�es rr@z.TemplateManager._load_templates_from_directoryrs���!�!�������8J�8J�)K� �N�N�4�T�5G�5G�4H�I� J� ��� �g�g�d�&8�&8�9�N�D�!�U����=�=�!S�T�"�)�)�"�'�'�,�,�t�T�*B�C��:� (�I�! Y��7�7�?�?�9�d�6H�6H�I�� "��� 0� 0�� :�1� =� E� E�d�C� P� X� X�Y\�^a� b� ��g�g�&�&�y�1�!�4�:�:�<���%�<�&4�&=�&=�O��G�^�&4�&9�&9�O��G�^�&4�&9�&9�O�&4�&9�&9�O�,�1�1��+�C��y�y�M�$7�$7�$9�9�#&���,� �+�+�&�&�*�%�"<�X�J� G� ,��� � �6�}�o�R��z�QR�S�T�A(��B� Y�� � �9�)��J�s�ST�v�h�W�X�X�� Y�s�D#H4�6:H4�4 I,�=$I'�'I,rZrr�template_content_func�contentrtrurv�tags�returnc �*�||jvrtjd|���|�|�tjd|���y|}|� |�} |j j|�} ||| ||||xsgdd�|j|<tjd |���y #t$r.} tjd|�dt | ����Yd} ~ yd} ~ wwxYw#t$r.} tjd |�dt | ����Yd} ~ yd} ~ wwxYw) u� 注册内联模板 Args: name: 模板名称 template_content_func: 返回模板内容的函数 content: 模板内容字符串 format: 模板格式 category: 模板类别 description: 模板描述 tags: 模板标签 Returns: 是否注册成功 � 模板已存在,将被覆盖: NuL注册模板失败: 必须提供模板内容函数或模板内容字符串: F�获取模板内容失败: rx�inline)rrr��jinja_templatertrurvr��typeu已注册内联模板: Tu注册模板失败: ) r;rBryr�r�r_r?� from_stringrC) rErrr�r�rtrurvr��template_contentr�r�s r�register_templatez!TemplateManager.register_template�s'��& �4�>�>� !� �N�N�=�d�V�D� E� � (�W�_� �L�L�g�hl�gm�n� o��"�� � ,� �#8�#:� �  �!�^�^�7�7�8H�I�N��+�"0� �$�*�� �� � $�D�N�N�4� � �K�K�1�$��8� 9���'� �� � �9�$��z�#�a�&��R�S��� ��(� � �L�L�/��v�Z��A��x�H� I��� �s1� B!�AC�! C�*$C�C� D�$$D � Drsc �v�|jstjd|���y||jvrtj d|��� ||||||xsgdd�|j|<tj d|���y#t $r.}tjd|�d t|����Yd }~yd }~wwxYw) uf 注册基于文件的模板 Args: name: 模板名称 file_path: 相对于templates_dir的文件路径 format: 模板格式 category: 模板类别 description: 模板描述 tags: 模板标签 Returns: 是否注册成功 u1注册文件模板失败: 未设置模板目录: Fr�r�)rrrsrtrurvr�r�u已注册文件模板: Tu注册文件模板失败: rxN)r4rBr�r;ryrCr�r_)rErrrsrtrurvr�r�s rr�z&TemplateManager.register_file_template�s���$�!�!� �L�L�L�T�F�S� T�� �4�>�>� !� �N�N�=�d�V�D� E� ��&� �$�*�� ���$�D�N�N�4� � �K�K�1�$��8� 9���� � �L�L�5�d�V�:�c�!�f�X�N� O��� �s� 3B� B8� $B3�3B8c �Z�||jvrtjd|���y|j|}|ddk(r|dS |jj |d�}|j �S#t $r.}tjd|�dt|����Yd}~yd}~wwxYw) u� 获取模板内容 Args: name: 模板名称 Returns: 模板内容,如果模板不存在则返回None �模板不存在: Nr�r�r�rsu 获取文件模板内容失败: rx) r;rBryr?� get_template�renderr�r�r_)rErr�templater�r�s rr�zTemplateManager.get_templates��� �t�~�~� %� �N�N�.�t�f�5� 6���>�>�$�'�� �F� �x� '��I�&� &� �!%���!<�!<�X�k�=R�!S��%�,�,�.�.��� �� � �?��v�Z�PS�TU�PV�x�X�Y��� �s�-A3�3 B*�<$B%�%B*�contextc ��||jvrtjd|���y|j|}|xsi} |ddk(r|djd i|��S|jj |d�}|jd i|��S#t $r.}tjd|�dt|����Yd}~yd}~wwxYw) u� 渲染模板 Args: name: 模板名称 context: 渲染上下文 Returns: 渲染后的内容,如果渲染失败则返回None r�Nr�r�r�rs�渲染模板失败: rxr) r;rBryr�r?r�r�r�r_)rErrr�r�r�r�s r�render_templatezTemplateManager.render_templates��� �t�~�~� %� �N�N�.�t�f�5� 6���>�>�$�'���-�R�� ����8�+�8�x� 0�1�8�8�C�7�C�C�"&���!<�!<�X�k�=R�!S��,�~�,�,�7�w�7�7��� � �L�L�/��v�Z��A��x�H� I��� �s�B �/B � C�$B=�=Cc��|jj�D��cgc]�\}}||jdd�|jdtj�j |jdt j�j |jdd�dj|jdg��d ����c}}Scc}}w) uf 列出所有可用的模板 Returns: 模板信息列表 rvrZrtrur�r��, r��rrrvrtrur�r�� r;rWr`rrr�r!r1rV)rErrr�s r�list_templateszTemplateManager.list_templates:s��� #'�.�.�"6�"6�"8�  �#9���h��'�|�|�M�2�>�"�,�,�x��1D�1D�E�K�K�$�L�L��5E�5K�5K�L�R�R� � � �V�X�6�� � �(�,�,�v�r�":�;�  �#9�  � ��  s�B"Cc��t|t�r t|�}|j j�D��cgc]�\}}|jdtj�|k(ro||jdd�|jdtj�j|jdd�dj|jd g��d ����c}}S#t$rtj d|���gcYSwxYwcc}}w) u� 获取指定类别的模板列表 Args: category: 模板类别 Returns: 指定类别的模板列表 u无效的模板类别: rurvrZrtr�r�r�r�)rrrvrtr�r�)r[r_r!� ValueErrorrBryr;rWr`r1rrr�rV)rErurrr�s r�get_templates_by_categoryz)TemplateManager.get_templates_by_categoryMs��� �h�� $� �+�H�5��#'�.�.�"6�"6�"8�  �#9���h��|�|�J�(8�(>�(>�?�8�K��'�|�|�M�2�>�"�,�,�x��1D�1D�E�K�K� � � �V�X�6�� � �(�,�,�v�r�":�;�  �#9�  � �� � ����!8�� �C�D�� � ��  s� C�BD�#D�?D�tagc��|jj�D��cgc]�\}}||jdg�vr�||jdd�|jdtj�j |jdt j�j |jdd�dj|jdg��d ����c}}Scc}}w) u� 获取包含指定标签的模板列表 Args: tag: 标签 Returns: 包含指定标签的模板列表 r�rvrZrtrur�r�r�r�r�)rEr�rrr�s r�get_templates_by_tagz$TemplateManager.get_templates_by_tagjs���&#'�.�.�"6�"6�"8�  �#9���h��h�l�l�6�2�.�.��'�|�|�M�2�>�"�,�,�x��1D�1D�E�K�K�$�L�L��5E�5K�5K�L�R�R� � � �V�X�6�� � �(�,�,�v�r�":�;�  �#9�  � ��  s�B6Cr�c����fd�}�fd�}�fd�}d}tj|||tj��}d}tj|||tj��}d}tj|||tj��}|S)u� 处理模板中的Handlebars风格条件语句 Args: template_content: 模板内容 context: 渲染上下文 Returns: 处理后的模板内容 c�~��|jd�j�}|jd�}|jd�r|jd�nd}d}d|vrC|jd�}�}|D]}t|t�r ||vr||}�d}nt |�}nt �j |��}|r|S|S)Nrqrh�rZFrp��group�strip�splitr[r\�boolr`) �match� condition_var� if_content� else_content�is_true�partsr��partr�s �r�process_if_conditionzJTemplateManager.render_handlebars_conditions.<locals>.process_if_condition�s����!�K�K��N�0�0�2�M����Q��J�-2�[�[��^�5�;�;�q�>��L��G��m�#�%�+�+�C�0����!�D�!�%��.�4�5�=� %�d� �� $��� "� �u�+���w�{�{�=�9�:��!(�:� :�l� :rc�:��|jd�j�}|jd�}d}d|vrD|jd�}�}|D]}t|t�r ||vr||}�d}nt |� }nt �j |�� }|r|SdS)NrqrhTrprZr�)r�r�r��is_falser�r�r�r�s �r�process_unless_conditionzNTemplateManager.render_handlebars_conditions.<locals>.process_unless_condition�s����!�K�K��N�0�0�2�M��k�k�!�n�G��H��m�#�%�+�+�C�0����!�D�!�%��.�4�5�=� %�d� �� $��� "� $�E�{�?�� $�G�K�K� �$>�?�?��&�7� .�B� .rc����|jd�j�}|jd�}g}d|vrJ|jd�}� }|D]}t|t�r ||vr||}�d}nt|t �r'|}n$� j |g�}t|t �sg}g}t|�D]�\}} |} tjdt| �| �} tjdt|�| �} t| t�r>| j�D]+\} }tjd| zdzt|�| �} �-|j| ���dj|�S) Nrqrhrpz \{\{this\}\}z\{\{@index\}\}z \{\{this\.z\}\}rZ)r�r�r�r[r\r]r`� enumerate�re�subr_rWr|rV) r�� items_var� loop_contentrWr�r�r��result�irS� item_content�propr�s �r�process_each_loopzGTemplateManager.render_handlebars_conditions.<locals>.process_each_loop�sQ���� � �A��,�,�.�I� �;�;�q�>�L��E��i��!����,����!�D�!�%��.�4�5�=� %�d� �� $��� "� �e�T�*�!�E� � � �I�r�2��!�%��.��E��F�$�U�+���4�+� �!�v�v�o�s�4�y�,�O� �!�v�v�&7��Q���N� ��d�D�)�'+�z�z�|� ��e�')�v�v�m�d�.B�W�.L�c�RW�j�Zf�'g� �(4�� � �l�+�,��7�7�6�?� "rz@\{\{#if\s+([^}]+)\}\}(.*?)(?:\{\{else\}\}(.*?))?(?:\{\{\/if\}\}))�flagsz2\{\{#unless\s+([^}]+)\}\}(.*?)(?:\{\{\/unless\}\})z.\{\{#each\s+([^}]+)\}\}(.*?)(?:\{\{\/each\}\}))r�r��DOTALL) rEr�r�r�r�r�� if_pattern�unless_pattern� each_patterns ` r�render_handlebars_conditionsz,TemplateManager.render_handlebars_conditions�s���� ;�2 /�0' #�TY� ��6�6�*�.B�DT�\^�\e�\e�f��O���6�6�.�2J�L\�df�dm�dm�n��I� ��6�6�,�0A�CS�[]�[d�[d�e���rrQ)rrrrr_rFrAr@rrr!r1rrr�r�r�rr�rrr�r�rr�r�r�rrrr3r3&s���C�f�c�f�@'>�R.Y�`W[�(,�~�GZ�GZ�6F�6L�6L�,.�$�4�c�4�(�2�s�7�BS�4�"%�4�6D�4�#3�4�'*�4�7;�3�i�4�LP�4�n7E�6I�6I�:J�:P�:P�02�d�(�3�(�3�(�%3�(�'7�(�+.�(�;?�s�)�(�PT�(�T����#���4�C��$�s�C�x�.��H�UX�M��< ��T�#�s�(�^� 4� �& �%�8H�#�8M�2N� �SW�X\�]`�be�]e�Xf�Sg� �: �� ��T�#�s�(�^�0D� �.r �S�r �4�PS�UX�PX�>�r �^a�r rr3r�r�� resource_urisr�c ��|�ddlm}|�t}|j|�}|stj d|���y|j �}|j�D]/\}} ddl} | j|j|��} | ||<�1|j||�} t|�} | jd i|��S#t$rA} tj d|�dt| ����ddt| ���i||<Yd} ~ ��d} ~ wwxYw#t$r.} tj d|�dt| ����Yd} ~ yd} ~ wwxYw) u� 渲染带有资源引用的模板 Args: template_name: 模板名称 context: 渲染上下文 resource_uris: 资源URI映射,格式为 {上下文键名: 资源URI} template_manager: 模板管理器实例,如果未提供则使用全局模板管理器 resource_manager: 资源管理器实例,如果未提供则使用全局资源管理器 Returns: 渲染后的内容,如果渲染失败则返回None Nr)�resource_managerr�u加载资源失败: rxr�r�r)� mcp_resourcesr��template_manager_instancer�rBr��copyrW�asyncio�run� get_resourcer�r_r�r r�) r�r�r��template_managerr�r��extended_context� context_key�urir�� resource_datar�r�s r�render_template_with_resourcesr��sY��$��2���4��(�4�4�]�C�� �� � �1�-��A�B���|�|�~��)�/�/�1�� �S� W� �#�K�K�(8�(E�(E�c�(J�K�M�,9� �[� )� 2�(�D�D�EU�Wg�h����,�-���x���2�!1�2�2��� W� �L�L�/��u�J�s�1�v�h�G� H�-4�8L�S�QR�V�H�6U�,V� �[� )�� W�� ��� � �+�M�?�*�S��V�H�M�N����s0�$)B?�"D �? D �7D�D � E�$D>�>Er;)NN) r�loggingr<r�r�typingrrrrrr�enumr �jinja2r r r r � getLoggerrBrr!r3r_r�r=rV�dirname�__file__r4r�rrr�<module>r�s����� � � �=�=�� �M�M� �� � �?� +���T�� �t� �M �M �b48�37�5�#�5��S�#�X��5�15�c�3�h��5�=E�S�M�5�p��� � �R�W�W�_�_�X�6� �D� �+�M�:�r

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/NorthLaneMS/NetBrain_MCP'

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