Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
server.cpython-312.pyc67.4 kB
� !I1h�����ddlmZddlmZmZmZmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl m Z mZddlmZmZmZmZmZmZmZddlmZmZmZddlmZmZddlmZm Z m!Z!m"Z"m#Z#m$Z$ddl%Z%dd l&m'Z'dd l(m)Z)Gd �d ejT�Z+ejXejZd ej\e j^��g��ej`jbD]-Z2e3e2ej\�s�e2jie+d ���/ejjd�Z6ed�Z7e'ee�Z&e)e�Z(e7jq� d�dee9dee9dee9dee9deee9eff d��Z:e7jq� d�de9de9de9de9de9de9de9de9de9de9dee9effd ��Z;e7jq�d!e9deee9effd"��Z<e7jq� d�d!e9de9de9de9de9de9de9de9de9deee9effd#��Z=e7jq�d!e9de>fd$��Z?e7jq� d�de9d%e9d&e9d'e9d(ee@d)e9d*e9dee9effd+��ZAe7jq�deee9effd,��ZBe7jq�d!e9d-e9dee9effd.��ZCe7jq�d!e9d-e9dee9effd/��ZDe7jq� d�d!e9d-e9d0e9d1e@dee9eff d2��ZEe7jq� d�d!e9d-e9d3e9d1e@deee9eff d4��ZFe7jq�deee9effd5��ZGe7jq�d6e9dee9effd7��ZHe7jq�dee9effd8��ZIe7jq�dee9effd9��ZJe7jq�d!e9dee9effd:��ZKe7jq�d!e9dee9effd;��ZLe7jq�dee9effd<��ZMe7jq� d�d>e9d1eNd?e@d@e>dAe>dBe>dCe>dee9effdD��ZOe7jq� d�dee9dEe>dee9effdF��ZPe7jq�dee9effdG��ZQe7jq� d�dHeeNdIe9dJee9dKee9dee9eff dL��ZRe7jq�dee9effdM��ZSe7jq� d�de9d1eNdAe>dBe>dee9eff dN��ZTe7jq�deee9effdO��ZUe7jq�d�dPe9dQe>dee9effdR��ZVe7jq�d�dPee9dee9effdS��ZWe7jq�deee9effdT��ZXe7jq� d�dUe9dVe9dWe9dee9effdX��ZYej�dYej��de9de9fdZ��Z\ej�d[ej��d!e9dee9effd\��Z^ej�d]ej��d!e9dee9effd^��Z`ej�d_ej��d!e9dee9effd`��Zaej�daej��d!e9dee9effdb��Zbej�dcej��dee9effdd��Zdej�deej��dee9effdf��Zeej�dgej��dee9effdh��Zgej�diej��dee9effdj��Zhej�dkej��d!e9dee9effdl��Ziej�dmej��dee9effdn��Zkej�doej��dee9effdp��Zlej�dqej��de9dee9effdr��Zme7j�ds�dPe9defdt��Zoe7j�du�de9de9fdv��Zqe7jq� d�dwe9d%e9d&e9de9d(e@d'e9d*ee9dxe@dee9effdy��Zre7jq� d�dwe9d%e9d&e9de9d(e@dxe@dee9effdz��Zse7jq� d�d!e9d-e9d0e9d1e@dee9eff d{��Zteud|k(r�ddl Z ddl Z d}j�e j��Zxe j�j�d~d�d�k(xs d�exvxsd�exvZ{e{rd�e j�d~<ddl|Z|ddl}Z}d��Z~e|j�e~d=���Z�e��j�e�d��e{re�d��e7�j�yy)��)�FastMCP)�Dict�List�Optional�AnyN)� tool_manager� ToolCategory)�device_manager� NetworkDevice�DeviceCredential� DeviceVendor� DeviceType� DeviceStatus�ConnectionProtocol)�connection_manager� CommandResult�SCRAPLI_IMPORT_SUCCESS)�resource_manager� ResourceType)�template_manager�render_template_with_resources�Message� UserMessage�AssistantMessage� SystemMessage)�create_topology_discovery)�create_network_scannerc�*��eZdZd�fd� Z�fd�Z�xZS)� JsonFormatterc�(��t�|�|||�y�N)�super�__init__)�self�fmt�datefmt�style� __class__s ��F:\NetBrainMCP\server.pyr#zJsonFormatter.__init__-s��� ����g�u�-�c�f��t�|�|�}|jdd��jd�S)Nzutf-8�replace)�errors)r"�format�encode�decode)r$�record� log_recordr(s �r)r.zJsonFormatter.format0s2����W�^�F�+� �� � ��� �;�B�B�7�K�Kr*)NN�%)�__name__� __module__� __qualname__r#r.� __classcell__)r(s@r)rr,s���.�L�Lr*rz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�stream)�levelr.�handlers� netbrain_mcpz NetBrain MCP�vendor� device_type�status�tag�returnc���K�|r t|�nd}|r t|�nd}|r t|�nd}tj||||��}|D�cgc]}|j ���c}Scc}w�w)u� 列出网络设备,支持过滤 Args: vendor: 设备厂商,可选值:cisco, huawei, h3c, juniper, arista, fortinet, checkpoint, other device_type: 设备类型,可选值:router, switch, firewall, load_balancer, wireless_controller, access_point, other status: 设备状态,可选值:online, offline, unreachable, maintenance, unknown tag: 标签过滤 Returns: 设备列表 N)r<r=r>r?)r rrr � list_devices�to_dict) r<r=r>r?� vendor_enum�device_type_enum� status_enum�devices�devices r)rBrBNsr����(+1�,�v�&�d�K�2=�z�+�.�4��*0�,�v�&�d�K��)�)��$�� � �G�,3� 3�7��F�N�N� �7� 3�3�� 3�s�A A,� A'�$A,�name� ip_address�platform�model� os_version�location� description�tagsc �� K�t|�} t|�} |si|j�dk(rd}nS|j�dk(rd}n=|j�dk(rd}n'|j�dk(rd}n|j��}g} | r=| jd �D� cgc]#} | j �s�| j ���%} } t ||| | |||||| � � }t j|�}|j�Scc} w�w) u� 添加新的网络设备 Args: name: 设备名称 ip_address: 设备IP地址 device_type: 设备类型,可选值:router, switch, firewall, load_balancer, wireless_controller, access_point, other vendor: 设备厂商,可选值:cisco, huawei, h3c, juniper, arista, fortinet, checkpoint, other platform: 设备平台(scrapli平台类型),如 cisco_iosxe, huawei_vrp, juniper_junos 等 model: 设备型号 os_version: 操作系统版本 location: 设备位置 description: 设备描述 tags: 设备标签,使用逗号分隔多个标签 Returns: 新添加的设备信息 �cisco� cisco_iosxe�huawei� huawei_vrp�juniper� juniper_junos�arista� arista_eos�,) rIrJr=r<rKrLrMrNrOrP) rr �lower�split�stripr r � add_devicerC)rIrJr=r<rKrLrMrNrOrPrErD�tag_listr?rH� device_ids r)r^r^qs����@"�+�.���v�&�K� � �<�<�>�W� $�$�H� �\�\�^�x� '�#�H� �\�\�^�y� (�&�H� �\�\�^�x� '�#�H� �,�,�.�)�H��H� �+/�:�:�c�?�J�?�C�c�i�i�k�C�I�I�K�?��J�� ��$������� � �F��)�)�&�1�I� �>�>� ���'K�s�BD�C?�1C?�ADr`c��ZK�tj|�}|r|j�Sy�w)u 获取设备详细信息 Args: device_id: 设备ID Returns: 设备信息或None N�r � get_devicerC�r`rHs r)rcrc�s+����� &� &�y� 1�F� ��~�~��� �s�)+c ��fK�i} |r|| d<|r|| d<|r|| d<|r|| d<|rt|�| d<|r|| d<|r|| d<|rB|jd�D� cgc]#} | j�s�| j���%} } | | d <tj|fi| ��} | r| j �Sy cc} w�w) u� 更新设备信息 Args: device_id: 设备ID name: 设备名称 ip_address: 设备IP地址 model: 设备型号 os_version: 操作系统版本 status: 设备状态,可选值:online, offline, unreachable, maintenance, unknown location: 设备位置 description: 设备描述 tags: 设备标签,使用逗号分隔多个标签 Returns: 更新后的设备信息或None rIrJrLrMr>rNrOrZrPN)rr\r]r � update_devicerC) r`rIrJrLrMr>rNrOrP� update_kwargsr?r_rHs r)rfrf�s�����<�M� � $� �f���&0� �l�#� �!&� �g���&0� �l�#� �".�v�"6� �h���$,� �j�!��'2� �m�$� �+/�:�:�c�?�J�?�C�c�i�i�k�C�I�I�K�?��J� (� �f��� )� )�)� E�}� E�F� ��~�~��� ��K�s�AB1�B,�*B,�<5B1c��4K�tj|�S�w)ur 删除设备 Args: device_id: 设备ID Returns: 是否删除成功 )r � delete_device)r`s r)riris���� � '� '� � 2�2�s��username�password�protocol�port�enable_password� ssh_key_filec ��RK�|j�dk(r |s|sddd�S|j�dk7r|sd|j��d�d�St|j��}|�Z|tjk(rd}nD|tjk(rd}n.|tj k(rd}n|tj k(rd }nd }tjd |�d |�d |�d|���|rtjd|���t|||||||��}tj|�} d| |d�S�w)u� 添加设备凭据 Args: name: 凭据名称 username: 用户名 password: 密码 protocol: 连接协议,可选值:ssh, telnet, snmp, http, https, netconf port: 端口号,可选(默认SSH=22, Telnet=23) enable_password: 特权模式密码(思科设备) ssh_key_file: SSH密钥文件路径 Returns: 凭据ID �sshFu-SSH连接需要提供密码或SSH密钥文件��success�messageu连接需要提供密码���Pi�ru添加凭据: name=� , username=� , protocol=�, port=u使用SSH密钥文件: )rIrjrkrlrmrnroT)rs�idrI) r[�upperr�SSH�TELNET�HTTP�HTTPS�logger�infor r �add_credential) rIrjrkrlrmrnro� protocol_enum� credential� credential_ids r)r�r�sD����4�~�~��5� ��,� �-\�]�]� ��� �U� "�8� ����0@�/A�AY�-Z�[�[�'�x�~�~�'7�8�M� �|� �.�2�2� 2��D� �0�7�7� 7��D� �0�5�5� 5��D� �0�6�6� 6��D��D� �K�K�%�d�V�;�x�j� �H�:�U\�]a�\b�c�d��� � �-�l�^�<�=�"� ���� �'�!��J�#�1�1�*�=�M��=�$� ?�?�s�D%D'c �� K�tj�}|D�cgc]\}|j|j|j|j |j j|j|jd���^c}Scc}w�w)�I 列出所有设备凭据 Returns: 凭据列表 �r{rIrjrkrlrmro� r �list_credentialsr{rIrjrkrl�valuermro�� credentials�creds r)r�r�Ss|����!�1�1�3�K� � � �D��'�'��I�I�� � �� � �� � �+�+��I�I� �-�-� � � � �� �s�B�A!A?�<Br�c�� K�tj|�}tj|�}|sdd|��d�S|sdd|��d�Stj d|j �d|j �d|j ���tj d|jj�d |jxsd ���tj||��d {���\}}|�r�d }d } |�d |��}tjj|�} | �rv| j�rit| jd�r�t!j"| jj$�r#| jj%��d {���}n1t!j&| jj$��d {���}tj d|��� ddlm} t|d�r|j,r |j,nd } d| j/�vrd} nd| j/�vrd} nd} tj d| �d| ���t| jd��rt!j0d��d {���t!j"| jj2�rH| jj3| ��d {���} t| d�r | j4}nbt7| �}nVt!j&| jj2| ��d {���} t| d�r | j4}n t7| �}tj dt9|����t9|�dkDr |d ddz}ntj;d�d }d(d)|j �d|j �d*�|jj||d+�StjCd,|j �d|j �d-|���dd,|��d�S7�� 7���7��R7���7��L7��#t<$r�}tj;d!t7|���� tj2|| d"�#��d {���7\}}|r/|j>r#|j@}t9|�dkDr |d ddz}nd$}n9#t<$r-}tjCd%t7|����d$}Yd }~nd }~wwxYwYd }~��Ed }~wwxYw#t<$r.}tj;d&t7|����d'}Yd }~��d }~wwxYw�w).u� 连接到网络设备 Args: device_id: 设备ID credential_id: 凭据ID Returns: 连接结果 F�设备不存在: rr�凭据不存在: u尝试连接设备: � (u) 使用凭据: u连接协议: u , 端口: u默认N��_� get_promptu成功获取设备提示符: r��ScraplirKrT�display versionrR� show versionu#尝试获取版本信息,平台: u ,命令: � send_command��resultu#成功获取版本信息,长度: i��...u$连接对象没有send_command方法u<无法获取版本信息:连接对象不支持发送命令u获取版本信息时出错: �<�r`r��command�timeout�无法获取版本信息u)备用方法获取版本信息也失败: u#获取设备详细信息时出错: u获取版本信息时出错Tu成功连接到设备: �))rsrtrl�prompt� version_info�连接设备失败: u ), 错误: )"r rc�get_credentialr�r�rIrJrlr�rmr�connect_device�active_connections�get� connection�hasattr�asyncio�iscoroutinefunctionr�� to_thread�scraplir�rKr[�sleepr�r��str�len�warning� Exceptionrs�output�error)r`r�rHr�rsr�r�r��connection_key� connectorr�rKr��resp�er�r��e2s r)r�r�js������ &� &�y� 1�F��.�.�}�=�J� � �/@�� �-L�M�M� � �/@���-P�Q�Q� �K�K�&�v�{�{�m�2�f�6G�6G�5H�HX�Yc�Yh�Yh�Xi�j�k� �K�K�.��!4�!4�!:�!:� ;�:�j�o�o�Fa�Ya�Eb�c�d�.�<�<�V�Z�P�P�N�G�U����� �P 9� )�{�!�M�?�;�N�*�=�=�A�A�.�Q�I��Y�1�1��9�/�/��>��2�2�9�3G�3G�3R�3R�S�'0�';�';�'F�'F�'H�!H��'.�'8�'8��9M�9M�9X�9X�'Y�!Y���K�K�"?��x� H�I�>B�/�3:�&�*�2M�RX�Ra�Ra�v���gi�H� �8�>�>�#3�3�"3�� �H�N�N�$4�4�"0��"0���K�K�"E�h�Z�{�[b�Zc� d�e��y�3�3�^�D�%�m�m�A�.�.�.�"�6�6�y�7K�7K�7X�7X�Y�)2�)=�)=�)J�)J�7�)S�#S�D�&�t�X�6�/3�{�{� �/2�4�y� �*1�):�):�9�;O�;O�;\�;\�^e�)f�#f�D�&�t�X�6�/3�{�{� �/2�4�y� �� � �&I�#�l�J[�I\�$]�^��|�,�s�2�+7���+=��+E�L����'M�N�'e� �4�0���� �R��@Q�@Q�?R�RS�T�"�+�+�1�1��(�  � � � � �+�F�K�K�=��6�;L�;L�:M�[�Y^�X_�`�a� �/C�E�7�-K�L�L�EQ�� "I��!Y��./��$T��$g��!�B��N�N�%B�3�q�6�(�#K�L�B�*<�*I�*I�&/�*7�$+�$&� +�%�%� ���"�f�n�n�+1�=�=�L�"�<�0�3�6�/;�D�S�/A�E�/I� �+E�L��$�B�� � �'P�QT�UW�QX�PY�%Z�[�'A� ��B���#B��(� 9� �N�N�@��Q���I� J�8�L�� 9�s��CT �O3�T �#BS�5O6�61S�'O9�(S�B"P�'O<�(A P�3O?�4AP� P� A7P�A2T �6S�9S�<P�?P�P� S � !S�/R� Q� ;R�S� R>�#R9�4S�9R>�>S�S�S � S� T�#T�;T �T�T c��nK�tj||��d{���\}}|rddd�Sdd|��d�S7��w)u� 断开与网络设备的连接 Args: device_id: 设备ID credential_id: 凭据ID Returns: 断开连接结果 NTu成功断开连接rrFu断开连接失败: )r�disconnect_device)r`r�rsr�s r)r�r��sI����.�?�?� �=�Y�Y�N�G�U���,@�A�A� �/C�E�7�-K�L�L� Z�s �5�3�5r�r�c���K�tj||||���d{���\}}|rH|j|j|j|j |j j�d�Sd|d|dd�S7�Y�w)u� 向网络设备发送命令 Args: device_id: 设备ID credential_id: 凭据ID command: 要执行的命令 timeout: 命令超时时间(秒) Returns: 命令执行结果 r�N�rsr�r�� error_message�execution_timeFr�)rr�rsr�r�r�r�� isoformat)r`r�r�r�r�r�s r)r�r��s�����(-�9�9��#��� ��M�F�E���~�~��~�~��m�m�#�1�1�$�3�3�=�=�?�  � ����"�"�  � �!�s�A;�A9�AA;�commandsc ���K�|jd�D�cgc]#}|j�s�|j���%}}|sddd�gStj||||���d{���\}}|rV|D�cgc]J}|j|j |j |j|jj�d���Lc}S|D� cgc] } d| d|dd��� c} Scc}w7�zcc}wcc} w�w) u2 向网络设备发送多个命令 Args: device_id: 设备ID credential_id: 凭据ID commands: 要执行的命令列表,使用分号(;)分隔多个命令 timeout: 每个命令的超时时间(秒) Returns: 命令执行结果列表 �;Fu未提供有效的命令rr)r`r�r�r�Nr�r�) r\r]r� send_commandsrsr�r�r�r�r�) r`r�r�r��cmd� command_list�resultsr�r�r�s r)r�r�)s����(,4�>�>�#�+>�N�+>�C�#�)�)�+�C�I�I�K�+>�L�N� �!�.H�I�J�J�.�;�;��#��� ��N�G�U��"�  �"�� "�>�>�!�>�>� �-�-�!'�!5�!5�"(�"7�"7�"A�"A�"C�  �"�  � �&(�  �(�� !�"��!&�"&�  �(�  � ��3O� ��  ��  �s?�C+�C�C�&C+�$C�% C+�2AC!�C+�C&� C+�! C+c��2K�tj�S�w)uU 获取活动连接列表 Returns: 活动连接信息列表 )r�get_active_connections�r*r)r�r�as���� � 4� 4� 6�6���� device_idsc���K� t|t�r>|jd�D�cgc]#}|j�s�|j���%}}n|}|sddd�Stj d|���g}|D]C}t j|�}|r|j|��,tjd|����E|sddd�Stj|��d{���}d d t|j��d t|j��d �|j�d �Scc}w7�J#t $r3}tj#d|���ddt|���d�cYd}~Sd}~wwxYw�w)u� 从指定设备开始发现网络拓扑 Args: device_ids: 设备ID列表,用逗号分隔,如"device1,device2" Returns: 拓扑发现结果 rZFu请提供至少一个设备IDrru#开始拓扑发现,设备列表: r�u没有找到有效的设备NTu拓扑发现完成,发现u 个节点,u 条链路)rsrt�topologyu拓扑发现失败: )� isinstancer�r\r]r�r�r rc�appendr��topology_discovery�discover_topology_from_devicesr��nodes�linksrCr�r�)r�r`�device_id_list� valid_devicesrHr�r�s r)�discover_topologyr�lsp����"N� �j�#� &�AK�AQ�AQ�RU�AV�l�AV�I�Zc�Zi�Zi�Zk�i�o�o�/�AV�N�l�'�N��$�1P�Q� Q�� � �9�.�9I�J�K�� �'�I�#�.�.�y�9�F���$�$�Y�/����!2�9�+�>�?� (��$�1N�O� O�,�J�J�=�Y�Y���4�S����5H�4I��VY�Zb�Zh�Zh�Vi�Uj�js�t� �(�(�*� � ��1m�,Z�� �N�� � �+�A�3�/�0� �/C�C��F�8�-L�M�M��N�sp�E(�#D)�D"�D"� D)�E(�A(D)�E(�D)�D'�AD)�!E(�"D)�) E%�2(E �E%�E(� E%�%E(c���K� tj�}d|j�d�S#t$r3}tj d|���ddt |���d�cYd}~Sd}~wwxYw�w)uO 获取当前网络拓扑 Returns: 当前拓扑信息 T)rsr�u获取拓扑失败: FrrN�r�� get_topologyrCr�r�r�r��r�r�s r)r�r��sq����N�%�2�2�4��� �(�(�*� � �� �N�� � �+�A�3�/�0� �/C�C��F�8�-L�M�M��N�s0�A*�&+�A*� A'�(A"�A'�A*�"A'�'A*c��K� tj�ddd�S#t$r3}tj d|���ddt |���d�cYd}~Sd}~wwxYw�w)uC 清空拓扑数据 Returns: 操作结果 Tu拓扑数据已清空rru清空拓扑失败: FN)r��clear_topologyr�r�r�r��r�s r)r�r��s`����N��)�)�+��,C�D�D�� �N�� � �+�A�3�/�0� �/C�C��F�8�-L�M�M��N��0�A��A� A�(A�A�A�A�Ac��`K� tj�}|j|�}g}|D]9}tj|�}|s�|j |j ���;d||d�S#t$r3}tjd|���ddt|���d�cYd}~Sd}~wwxYw�w)u� 获取指定设备的邻居设备 Args: device_id: 设备ID Returns: 邻居设备列表 T)rsr`� neighborsu获取设备邻居失败: FrrN) r�r��get_device_neighborsr rcr�rCr�r�r�r��r`r�r��neighbor_details� neighbor_idrHr�s r)r�r��s�����T�%�2�2�4���1�1�)�<� ���$�K�#�.�.�{�;�F�� �'�'����(8�9�%� �"�)� � �� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�s;�B.�AA/�&A/�.B.�/ B+�8(B&� B+�!B.�&B+�+B.c ���K� tj|�}|sdd|��d�Stjd|j�d��t j |��d{���\}}d||j||D�cgc]}|j���c}t|�t|�d�S7�Icc}w#t$r3}tjd |���dd t|���d�cYd}~Sd}~wwxYw�w) u� 发现单个设备的邻居(实时发现) Args: device_id: 设备ID Returns: 发现的邻居信息 Fr�rru开始发现设备 u 的邻居NT)rsr`� device_namer�� interfaces�neighbor_count�interface_countu发现设备邻居失败: ) r rcr�r�rIr��discover_device_neighborsrCr�r�r�r�)r`rHr�r��ifacer�s r)r�r��s�����T��*�*�9�5���$�3D�Y�K�1P�Q� Q�� � �)�&�+�+��j�A�B�'9�&R�&R�SY�&Z� Z�� �:��"�!�;�;�"�8B�C� �u�5�=�=�?� �C�!�)�n�"�:�� � �![��D�� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�sb�C.�B/�C.�;B/�B(�B/�8B* �B/�'C.�(B/�*B/�/ C+�8(C&� C+�!C.�&C+�+C.c��~K� tj�}i}|jD]0}|jj}|j |d�dz||<�2i}|j j�D]&}|j}|j |d�dz||<�(dt|j �t|j�|||jr|jj�nd|jd�S#t$r3}tjd|���ddt!|���d�cYd}~Sd}~wwxYw�w) uO 获取拓扑统计信息 Returns: 拓扑统计数据 rr�TN)rs� total_nodes� total_links�protocol_distribution�vendor_distribution�last_discovery�discovery_scopeu获取拓扑统计失败: Frr�r�r�r�rlr�r�r��valuesr<r�r�r�r�r�r�r�r��r��protocol_stats�linkrl� vendor_stats�noder<r�s r)�get_topology_statisticsr��s.����T�%�2�2�4�����N�N�D��}�}�*�*�H�'5�'9�'9�(�A�'F��'J�N�8� $�#� � ��N�N�)�)�+�D��[�[�F�#/�#3�#3�F�A�#>��#B�L�� �,� ��x�~�~�.��x�~�~�.�%3�#/�EM�E\�E\�h�5�5�?�?�A�bf�'�7�7� � �� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�s5�D=�C9C>�=D=�> D:�(D5�/D:�0D=�5D:�:D=T�network�max_concurrent� ping_enabled�port_scan_enabled� snmp_enabled�auto_create_devicesc ��@K� ddlm}||||||��}tjd|���tj ||��d{���} g} |rtj | d���d{���} ddt | ��d �|t | �| D� cgc]} | j���c} t | �| D� cgc]} | j���c} d �S7��7�gcc} wcc} w#t$r3} tjd | ���d d t| ���d �cYd} ~ Sd} ~ wwxYw�w)u� 扫描指定网络范围内的活跃设备 Args: network: 网络范围,如 "192.168.1.0/24" 或 "10.0.0.0/16" timeout: 扫描超时时间(秒) max_concurrent: 最大并发扫描数 ping_enabled: 是否启用ping扫描 port_scan_enabled: 是否启用端口扫描 snmp_enabled: 是否启用SNMP扫描 auto_create_devices: 是否自动创建发现的设备 Returns: 扫描结果 r��ScanConfiguration)r�rrrru开始网络扫描: NT�� auto_createu网络扫描完成,发现 u 个活跃主机)rsrt� network_range� alive_hosts� scan_results�auto_created_devices�discovered_devicesu网络扫描失败: Frr) �network_scannerrr�r��scan_network_range�discover_devices_from_scanr�rCr�r�r�)rr�rrrrrr�configr rr�rHr�s r)rr"s9����2!N�5�#��)�%�/�%�  �� � � �*�7�)�4�5�-�?�?���P�P� � �� �'6�'Q�'Q�R^�lp�'Q�'q�!q� ��5�c�,�6G�5H�HX�Y�$��|�,�<H�I�L�&�V�^�^�-�L�I�$'�(:�$;�BT�"U�BT��6�>�>�#3�BT�"U� � �Q�� "r��J��"U�� �N�� � �+�A�3�/�0� �/C�C��F�8�-L�M�M��N�sw�D�AC�C� "C�+C�,"C�C �%C�5C� C�D�C�C� C� D�((D�D�D�D�D� alive_onlyc���K� |r=tjj|�}|rd|j�d�Sdd|�d�d�St tjj ��}|r|D�cgc]}|j s�|��}}dt|�|D�cgc]}|j���c}d�Scc}wcc}w#t$r3}tjd|���ddt|���d�cYd }~Sd }~wwxYw�w) u� 获取网络扫描结果 Args: ip_address: 特定IP地址,如果不提供则返回所有结果 alive_only: 是否只返回活跃主机 Returns: 扫描结果 T)rs� scan_resultF� 未找到IP � 的扫描结果rr)rs� total_resultsr u获取扫描结果失败: N) rr r�rC�listr��is_aliver�r�r�r�r�)rJrr�r��rr�s r)�get_scan_resultsr^s����T� �$�1�1�5�5�j�A�F��#�#)�>�>�#3��� $)�|�J�<�O_�5`�a�a��?�7�7�>�>�@�A�G��&-�<�g�����1�g��<� �!$�W��@G� H��f����!1�� H�� ��=�� !I�� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�sn�C<�5B=�C<�B=�C<�-B=�0B3�B3�B=�B8�.B=�2C<�3 B=�= C9�(C4�.C9�/C<�4C9�9C<c��K� tj�}d|d�S#t$r3}tj d|���ddt |���d�cYd}~Sd}~wwxYw�w)uU 获取网络扫描统计信息 Returns: 扫描统计数据 T)rs� statisticsu获取扫描统计失败: FrrN�r�get_scan_statisticsr�r�r�r���statsr�s r)r!r!�sh����T��3�3�5���� � �� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�r��min_response_time�required_ports� vendor_filter�device_type_filterc ��(� K� tjj�D�cgc]}|js�|��}}g}|D�]� |r� jr� j|kDr�"|ri|j d�D�cgc]:}|j �j�s�"t|j ����<}}t� fd�|D��s��|r7� jr+|j�� jj�vr��|r7� jr+|j�� jj�vr��|j� ���tj|d���d{���} ddt|��dt| ��d�t|�t| �| D� cgc]} | j!���c} d �Scc}wcc}w7�]cc} w#t"$r3} t$j'd | ���d d t)| ���d �cYd} ~ Sd} ~ wwxYw�w) u� 从扫描结果中发现并创建设备 Args: min_response_time: 最小响应时间过滤(毫秒) required_ports: 必需的开放端口,使用逗号分隔,如"22,23,161" vendor_filter: 厂商过滤,如"cisco"、"huawei" device_type_filter: 设备类型过滤,如"switch"、"router" Returns: 发现和创建的设备信息 rZc3�:�K�|]}|�jv���y�wr!)� open_ports)�.0rmr�s �r)� <genexpr>z5discover_devices_from_scan_results.<locals>.<genexpr>�s�����T�AS��4�6�#4�#4�4�AS�s�Tr Nu从 u 个扫描结果中创建了 u 个设备)rsrt�filtered_results_count�created_devices_count�created_devicesu#从扫描结果创建设备失败: Frr)rr r�r� response_timer\r]�isdigit�int�allr<r[r=r�rr�rCr�r�r�r�) r$r%r&r'r� all_results�filtered_results�p�required_port_listrrHr�r�s @r)�"discover_devices_from_scan_resultsr8�s������&)]�"1�">�">�"E�"E�"G�V�"G�Q�1�:�:�q�"G� �V���!�F� �V�%9�%9�f�>R�>R�Uf�>f���>L�>R�>R�SV�>W�%o�>W��[\�[b�[b�[d�[l�[l�[n�c�!�'�'�)�n�>W�"�%o��T�AS�T�T������ �&�&�(�� � �0C�0C�0E�E��"�f�&8�&8�%�+�+�-�V�5G�5G�5M�5M�5O�O�� � #� #�F� +�+"�0$3�#M�#M�N^�lp�#M�#q�q����c�"2�3�4�4Q�RU�Vh�Ri�Qj�jt�u�&)�*:�&;�%(�);�%<�?Q�R�?Q�V���� 0�?Q�R�  � ��=W��&p�"r�� S�� �]�� � �:�1�#�>�?� �/R�SV�WX�SY�RZ�-[�\�\��]�sz�H� G�G�G�=G�8#G�G�7B7G�.G �/7G�&G �=G�H� G�G� H�(H �H�H� H�Hc��K� tj�ddd�S#t$r3}tj d|���ddt |���d�cYd}~Sd}~wwxYw�w)uI 清空网络扫描结果 Returns: 操作结果 Tu扫描结果已清空rru清空扫描结果失败: FN)r�clear_scan_resultsr�r�r�r�r�s r)r:r:�s`����T��*�*�,��,C�D�D�� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�r�c��K� ddlm}||||��}tjd|���tj ||��d{���}|tj |<tj �dd|��|j|j�d�S7�M#t$r3}tjd |���d d t|���d �cYd}~Sd}~wwxYw�w) u 扫描单个主机 Args: ip_address: 目标IP地址 timeout: 扫描超时时间(秒) port_scan_enabled: 是否启用端口扫描 snmp_enabled: 是否启用SNMP扫描 Returns: 单个主机扫描结果 rr)r�rru开始扫描单个主机: NTu主机扫描完成: )rsrtrru扫描单个主机失败: Frr) rrr�r��scan_single_hostr �save_scan_resultsrrCr�r�r�)rJr�rrrrrr�s r)r<r<�s�����&T�5�#��/�%� �� � � �0�� �=�>�,�<�<�Z��P�P� �4?��$�$�Z�0��)�)�+��-�j�\�:�#�,�,�&�.�.�0�  � � Q�� �T�� � �1�!��5�6� �/I�#�a�&��-R�S�S��T�sH�C�AB�B�A B�C�B� C�(C �C�C� C�Cc��2K�tj�S�w)uI 列出可用的MCP资源 Returns: 资源列表 )r�list_available_resourcesr�r*r)�list_resourcesr@s���� � 4� 4� 6�6�r��uri� use_cachec��JK�tj||��d{���S7��w)u� 获取指定URI的资源 Args: uri: 资源URI use_cache: 是否使用缓存 Returns: 资源内容 N)r� get_resource)rArBs r)rDrD"s!����"�.�.�s�I�>� >�>� >�s �#�!�#c��`K�tj|�}|r|rdd|��d�Sddd�Sddd�S�w)u� 清除资源缓存 Args: uri: 要清除的特定资源URI,如果为None则清除所有缓存 Returns: 操作结果 Tu已清除资源缓存: rru已清除所有资源缓存Fu清除缓存失败)r� clear_cache)rArss r)�clear_resource_cacherG0sI�����*�*�3�/�G�� �#�2I�#��0O�P� P�#�0M�N� N� �-A�B�B�s�,.c��2K�tj�S�w)uL 列出可用的提示模板 Returns: 模板列表 )r�list_templatesr�r*r)rIrIFs���� � *� *� ,�,�r�� template_name�context� resource_urisc��PK� i}|j�r( tj|�}t|t�si}i}|j�rS|jd�}|D]=}d|vs�|jdd�\}}|j�||j�<�?|rt|||t���d {���} ntj||�} | r@t| t�r+| D� cgc]} | j| jd ���} } d | d �Sd | d �Sdd|��d�S#tj $r t jd|���ddd�cYSwxYw7��cc} w#t $r<} t j#dt%| ����ddt%| ���d�cYd } ~ Sd } ~ wwxYw�w)u  渲染提示模板 Args: template_name: 模板名称 context: JSON格式的渲染上下文,如 {"name": "value"} resource_uris: 资源URI映射,格式为 "key1=uri1,key2=uri2" Returns: 渲染结果 u无法解析context JSON: Fu无效的JSON上下文格式rrrZ�=r�)rJrKrLrN)�role�contentT)rs�messages)rs�rendered_templateu渲染模板失败: u渲染模板异常: )r]�json�loadsr��dict�JSONDecodeErrorr�r�r\rrr�render_templaterrOrPr�r�r�) rJrKrL� context_dict� resource_dict� uri_pairs�pair�keyrAr��msgrQr�s r)rWrWPs�����"2N�� � �=�=�?� U�#�z�z�'�2� �!�,��5�#%�L� � � � � � �%�+�+�C�0�I�!���$�;�#�z�z�#�q�1�H�C��14����M�#�)�)�+�.�"� �9�+�$�+�!1� ��F�&�5�5�m�\�R�F� ��&�$�'� "(� �"(�#�!$���#&�;�;��"(� �� $(�X�>�>�$(�f�E�E�$�3G� ��1W�X� X��O�'�'� U����!;�G�9�E�F�#(�5S�T�T� U������ �N�� � �+�C��F�8�4�5� �/C�C��F�8�-L�M�M��N�s��F&�E�'D!�,E�+AE�;E�<1E�- E� E�F&�E�F&�E� F&�!0E�E�F&�E�E�E� F#�'1F�F#�F&�F#�#F&zgreeting/{name}c��K�d|�d�S�w)u获取个性化问候语u 你好,u!欢迎使用NetBrain MCP!r�)rIs r)� get_greetingr_�s�����t�f�:� ;�;�s� zdevice/{device_id}c��fK�tj|�}|r|j�Sdd|��iS�w)u获取设备资源r�r�rbrds r)�get_device_resourcera�s;����� &� &�y� 1�F� ��~�~��� �(�� �4� 5�5�s�/1zdevice/{device_id}/configc��K�tj|�}|sdd|��iStj�}|sddiS|jxs|dj}tj |�}|j tjk(rd}nb|j tjk(rd}nB|j tjk(rd}n"|j tjk(rd}nd} tj||��d{���\}}|sdd |��iStj|||d � ��d{���\}}tj||��d{���|r@|j r4||j"d |j$|j&j)�d �Sdd|xsd��iS7��7�t7�U#t*$r} ddt-| ���icYd} ~ Sd} ~ wwxYw�w)u获取设备配置资源r�r��没有可用的凭据rzshow running-configzdisplay current-configurationzshow configurationNr�r�r��running)r`r�� config_type�config_content� timestampu获取配置失败: � 未知错误u获取配置时发生错误: �r rcr�r�r{r�r<r �CISCO�HUAWEI�H3C�JUNIPERrr�r�r�rsrIr�r�r�r�r�� r`rHr�r�r�r�rsr�r�r�s r)�get_device_configro�s������ &� &�y� 1�F� ��,�Y�K�8�9�9�!�1�1�3�K� ��0�1�1��(�(�=�K��N�,=�,=�M��.�.�}�=�J��}�}� �*�*�*�'�� ���,�-�-� -�1�� ���,�*�*� *�1�� ���,�.�.� .�&��'��C�1�@�@���T�T������3�E�7�;�<� <�1�=�=��'���  � � ���!�2�2�9�m�L�L�L� �f�n�n�&�%�{�{�(�"(�-�-�#�2�2�<�<�>� � ��3�E�4K�^�3L�M�N� N�1U��  �� M�� �C��8��Q���A�B�B��C�s��C-G�0F/� F)� F/�G�F/�6F+�7 F/�F-�AF/�G� F/�(G�)F/�+F/�-F/�/ G�8G �G�G� G�Gzdevice/{device_id}/interfacesc��K�tj|�}|sdd|��iStj�}|sddiS|jxs|dj}tj |�}|j tjk(rd}nb|j tjk(rd}nB|j tjk(rd}n"|j tjk(rd}nd} tj||��d{���\}}|sdd |��iStj|||d � ��d{���\}}tj||��d{���|r?|j r3||j"|j$|j&j)�d �Sdd |xsd��iS7��7�s7�T#t*$r} ddt-| ���icYd} ~ Sd} ~ wwxYw�w)u获取设备接口资源r�r�rcrzshow interfaceszdisplay interfacezshow interfaces detailNr��r�)r`r��interfaces_outputrgu获取接口信息失败: rhu#获取接口信息时发生错误: rirns r)�get_device_interfacesrs�s������ &� &�y� 1�F� ��,�Y�K�8�9�9�!�1�1�3�K� ��0�1�1��(�(�=�K��N�,=�,=�M��.�.�}�=�J��}�}� �*�*�*�#�� ���,�-�-� -�%�� ���,�*�*� *�%�� ���,�.�.� .�*��#��I�1�@�@���T�T������3�E�7�;�<� <�1�=�=��'���  � � ���!�2�2�9�m�L�L�L� �f�n�n�&�%�{�{�%+�]�]�#�2�2�<�<�>� � ��9�%�:Q�>�9R�S�T� T�/U��  �� M�� �I��>�s�1�v�h�G�H�H��I���C-G�0F.� F(� F.�G�F.�6F*�7 F.�F,�AF.�G� F.�'G�(F.�*F.�,F.�. G�7G �G�G� G�Gzdevice/{device_id}/routesc��K�tj|�}|sdd|��iStj�}|sddiS|jxs|dj}tj |�}|j tjk(rd}nb|j tjk(rd}nB|j tjk(rd}n"|j tjk(rd}nd} tj||��d{���\}}|sdd |��iStj|||d � ��d{���\}}tj||��d{���|r?|j r3||j"|j$|j&j)�d �Sdd |xsd��iS7��7�s7�T#t*$r} ddt-| ���icYd} ~ Sd} ~ wwxYw�w)u获取设备路由表资源r�r�rcrz show ip routezdisplay ip routing-tablez show routeNr�rqr�)r`r�� routes_outputrgu获取路由表失败: rhu 获取路由表时发生错误: rirns r)�get_device_routesrws������ &� &�y� 1�F� ��,�Y�K�8�9�9�!�1�1�3�K� ��0�1�1��(�(�=�K��N�,=�,=�M��.�.�}�=�J��}�}� �*�*�*�!�� ���,�-�-� -�,�� ���,�*�*� *�,�� ���,�.�.� .���!��F�1�@�@���T�T������3�E�7�;�<� <�1�=�=��'���  � � ���!�2�2�9�m�L�L�L� �f�n�n�&�%�{�{�!'���#�2�2�<�<�>� � ��6�u�7N��6O�P�Q� Q�/U��  �� M�� �F��;�C��F�8�D�E�E��F�rtr�c ��K�tj�}d|D�cgc]\}|j|j|j|j |j j|j|jd���^c}iScc}w�w)r�r�r�r�r�s r)�list_credentials_resourceryOs�����!�1�1�3�K��$�  �$���g�g�� � � �M�M� �M�M� �M�M�/�/�� � � $� 1� 1� �$�  � � ��  �s�B�A!B�= Bz system/statusc���K�ttj��}ttj��}tt j ��}d|||dd�S�w)u获取系统状态资源rdz0.1.0)r>� devices_count�credentials_countr��version)r�r rBr�rr�)r{r|r�s r)�get_system_statusr~gs_������3�3�5�6�M��N�;�;�=�>���/�F�F�H�I���&�.�0��  ��s�A A"r�c���K� tj�}|j�S#t$r2}tj d|���ddt |���icYd}~Sd}~wwxYw�w)u获取网络拓扑资源u获取拓扑资源失败: r�Nr�r�s r)�get_topology_resourcer�vse����@�%�2�2�4�����!�!�� �@�� � �1�!��5�6��5�c�!�f�X�>�?�?��@�s0�A&�#(�A&� A#�'A�A#�A&�A#�#A&ztopology/statisticsc��zK� tj�}i}|jD]0}|jj}|j |d�dz||<�2i}|j j�D]&}|j}|j |d�dz||<�(t|j �t|j�|||jr|jj�nd|jd�S#t$r2}tjd|���ddt!|���icYd}~Sd}~wwxYw�w)u获取拓扑统计资源rr�N)r�r�r�r�r�r�u 获取拓扑统计资源失败: r�r�r�s r)� get_topology_statistics_resourcer��s+����F�%�2�2�4�����N�N�D��}�}�*�*�H�'5�'9�'9�(�A�'F��'J�N�8� $�#� � ��N�N�)�)�+�D��[�[�F�#/�#3�#3�F�A�#>��#B�L�� �,� �x�~�~�.��x�~�~�.�%3�#/�EM�E\�E\�h�5�5�?�?�A�bf�'�7�7�  � �� �F�� � �7��s�;�<��;�C��F�8�D�E�E��F�s5�D;�C8C=�<D;�= D8�'D3�-D8�.D;�3D8�8D;zdevice/{device_id}/neighborsc��pK� tj�}|j|�}g}|D]9}tj|�}|s�|j |j ���;||t|�d�S#t$r2}tjd|���ddt|���icYd}~Sd}~wwxYw�w)u获取设备邻居资源)r`r�r�u 获取设备邻居资源失败: r�N) r�r�r�r rcr�rCr�r�r�r�r�r�s r)�get_device_neighbors_resourcer��s�����F�%�2�2�4���1�1�)�<� ���$�K�#�.�.�{�;�F�� �'�'����(8�9�%� #�)�!�"2�3� � �� �F�� � �7��s�;�<��;�C��F�8�D�E�E��F�s;�B6�AA8�/A8�7B6�8 B3�'B.�(B3�)B6�.B3�3B6z scan/resultsc��`K� tjj�D�cgc]}|js�|��}}t |�|D�cgc]}|j ���c}d�Scc}wcc}w#t $r2}tjd|���ddt|���icYd}~Sd}~wwxYw�w)u获取网络扫描结果资源)rr � 获取扫描结果资源失败: r�N) rr r�rr�rCr�r�r�r�)rr�r�r�s r)�get_scan_results_resourcer��s�����F�-�:�:�A�A�C�R�C��q�z�z�1�C��R� ��\�<C�D�G�&�V�^�^�-�G�D� � ��S��E�� �F�� � �7��s�;�<��;�C��F�8�D�E�E��F�sU�B.� A0�A&�A&�A0� A+�!A0�%B.�& A0�0 B+�9'B&� B+�!B.�&B+�+B.zscan/statisticsc��K� tj�}|S#t$r2}tj d|���ddt |���icYd}~Sd}~wwxYw�w)u获取网络扫描统计资源u 获取扫描统计资源失败: r�Nr r"s r)�get_scan_statistics_resourcer��s[����F��3�3�5��� �� �F�� � �7��s�;�<��;�C��F�8�D�E�E��F�s0�A��A� A�'A� A� A�A�Azscan/result/{ip_address}c���K� tjj|�}|r|j�Sdd|�d�iS#t$r2}t j d|���ddt|���icYd}~Sd}~wwxYw�w)u#获取特定IP的扫描结果资源r�rrr�N)rr r�rCr�r�r�r�)rJr�r�s r)�get_scan_result_resourcer��s�����F� �-�-�1�1�*�=�� ��>�>�#� #��|�J�<�7G�H�I� I�� �F�� � �7��s�;�<��;�C��F�8�D�E�E��F�s:�A;�0=�A;�=�A;� A8�'A3�-A8�.A;�3A8�8A;z{uri}c��xK�tjd|���tj|��d{���S7��w)u-MCP资源处理器,处理所有资源请求u处理资源请求: N)r�r�rrD)rAs r)�mcp_resource_handlerr��s3���� �K�K�&�s�e�,�-�!�.�.�s�3� 3�3� 3�s �1:�8�:z{name}c��K�tjd|���tj|�}|r|jxs |j Sd|�d�S�w)u3MCP提示模板处理器,处理所有模板请求u处理模板请求: u错误: 未找到模板 '�')r�r�r� get_templaterOrI)rI�templates r)�mcp_prompt_handlerr��sS���� �K�K�&�t�f�-�.��,�,�T�2�H���#�#�4�x�}�}�4� &�t�f�A� .�.�s�AA�host�connect_timeoutc ���K�tsddd�S ddlm}|j�dk(rd}|j�dk(} | r|d k(rd }tj d |�d |�d |�d|�d|�� �|rAtj dt |��dtt|�����t|�}||d||||dzd�} | rd| d<tj d�nd| d<tj d�| s?|r=tjj|�r|| d<tj d|���n"|r|| d<tj d�nddd�S| j�} d| vrd| d<d| vr d|�d�| d<tj d | ���|d1i| ��} | j�| j�} d|vrd!}n d"|vrd#}nd#}| j|�}t|j �d$kDr|j d%d$d&zn |j }| j'�d)d*| ��| |d+�S#t"$r-}tj%d't|����d(}Yd%}~�Kd%}~wwxYw#t($r}dd,t|���d�cYd%}~Sd%}~wt"$rR}t |�j*}t|�}tj-d-|�d.|���dd/|�d.|��||d0�cYd%}~Sd%}~wwxYw�w)2u  测试Scrapli连接(直接使用Scrapli) Args: host: 设备主机名或IP地址 username: 用户名 password: 密码(与ssh_key_file至少提供一个) platform: 平台类型,如cisco_iosxe, huawei_vrp等 port: 端口号(默认22,Telnet使用23) protocol: 连接协议,ssh或telnet ssh_key_file: SSH密钥文件路径,可选 connect_timeout: 连接超时时间(秒) Returns: 连接测试结果 FuRScrapli库导入失败,请确保已安装: pip install scrapli scrapli-communityrrrr�rTrU�telnetrurvu连接参数: host=rxz , platform=rzryu密码类型: u , 长度: �)r�� auth_username�auth_strict_keyrKrm�timeout_socket�timeout_transport� transportu使用Telnet连接�paramikou使用SSH连接 (paramiko)�auth_private_keyu使用SSH密钥认证: � auth_passwordu使用密码认证u$必须提供密码或SSH密钥文件z******u[使用密钥文件: �]uScrapli测试连接参数: r�rRr���Nr�u获取版本信息失败: r�Tu 连接成功!设备提示符: )rsrtr�r�uScrapli库未安装: uScrapli连接测试失败: z - u连接失败: )rsrt� error_type� error_detailsr�)rr�r�r[r�r��typer�r��os�path�exists�copy�openr�r�r�r�r��close� ImportErrorr4r�)r�rjrkrKrmrlror�r�� is_telnet� device_params� safe_params�connr�r�r�r�r�r�� error_msgs r)�test_scrapli_connectionr��s1����8 "��k� � � e �#� �>�>� �x� '�#�H��N�N�$��0� � �����D�� � �)�$��{�8�*�K�PX�z�Y`�ae�`f�fq�rz�q{�|�}� � �K�K�.��h��(8� �3�s�8�}�CU�BV�W� X��8�}�H��%�$� ��-�!0�1�!4� � � �)1�M�+� &� �K�K�,� -�*4�M�+� &� �K�K�4� 5��\�b�g�g�n�n�\�.J�0<�M�,� -� �K�K�1�,��@� A� �-5�M�/� *� �K�K�,� -�$�1W�X� X�$�(�(�*� � �k� )�+3�K�� (� �� ,�0E�l�^�ST�.U�K�*� +�� � �1�+��?�@��'��'�� � � � ����"�� 6��8�#�+���H�$�(��(���$�$�W�-�D�8;�D�K�K�8H�3�8N�4�;�;�t��,�u�4�TX�T_�T_�L� � � � ��9�&��B��(�  � ��� 6� �N�N�7��A��x�@� A�5�L�� 6�� �O� �/D�S��V�H�-M�N�N�� �  ��!�W�%�%� ���F� �� � �2�:�,�c�)��M�N��'� �|�3�y�k�B�$�&�  � ��  �s�� K%�EI%�K%�A&I%�;AH,�I%�+K%�, I"�5#I�I%�I"�"I%�% K"�.J�>K"�?K%� K"�AK�K"�K%�K"�"K%c ��BK�t|||||d|���d{���S7��w)uf 测试Telnet连接(快速测试) Args: host: 设备主机名或IP地址 username: 用户名 password: 密码 platform: 平台类型,如cisco_iosxe, huawei_vrp等 port: 端口号(默认23) connect_timeout: 连接超时时间(秒) Returns: 连接测试结果 r�)r�rjrkrKrmrlr�N)r�)r�rjrkrKrmr�s r)�test_telnet_connectionr�us4����0)� ���� ��'�� �� �s ���c��bK�tj|�}tj|�}|sdd|��d�S|sdd|��d�S|jtj k7rdd|jj ��d�Stjd|j�d|j�d|���tjd |�d ��tj||||� ��d {���\}}|r�|jr,tjd t|j����n"tj!d|j"���|j|j$|j|j"|j&j)�d�Stj+d|���d|d|d d�S7�˭w)u@ 向Telnet连接的网络设备发送命令(使用更长的超时时间) Args: device_id: 设备ID credential_id: 凭据ID command: 要执行的命令 timeout: 命令超时时间(秒,默认比普通命令更长) Returns: 命令执行结果 Fr�rrr�u8此函数仅支持Telnet连接,当前凭据协议为: u通过Telnet向设备 r�u) 发送命令: u超时设置: u秒r�Nu#命令执行成功,输出长度: u命令执行失败: r�u执行命令失败: r�)r rcr�rlrr~r�r�r�rIrJrr�rsr�r�r�r�r�r�r�r�)r`r�r�r�rHr�r�r�s r)�send_telnet_commandr��s�����(� &� &�y� 1�F��.�.�}�=�J� � �/@�� �-L�M�M� � �/@���-P�Q�Q����0�7�7�7� �/g�hr�h{�h{�iB�iB�hC�.D�E� E� �K�K�(���� �R��8I�8I�7J�JZ�[b�Zc�d�e� �K�K�.�� ��-�.�-�9�9��#��� ��M�F�E�� �>�>� �K�K�=�c�&�-�-�>P�=Q�R� S� �N�N�1�&�2F�2F�1G�H� I��~�~��~�~��m�m�#�1�1�$�3�3�=�=�?�  � � � � �+�E�7�3�4����"�"�  � �/�s�CF/�!F-�"C F/�__main__� � MCP_CLI_RUN�0�1zmcp devzmcp runc�@�ddlm}tj|dd��y)u启动Web服务器r��appz0.0.0.0i�)r�rmN)�web.appr��uvicorn�runr�s r)�start_web_serverr��s���� � �C�i�d�3r*)�target�daemonu>NetBrain MCP Web界面已启动,访问 http://localhost:8088uMCP CLI模式已检测到)NNNN)r�r�r�r�r�r�)r�r�r�r�r�r�r�r�)r�rqNr�r�)rq)�@�2TTTF)NT)Nr�NN)r�TT)Tr!)z{}r�)NrSrurqN�)rSrvr�)r�)��mcp.server.fastmcpr�typingrrrrr��logging�sysr��globrSrr �network_devicesr r r r rrr�device_connectorrrr� mcp_resourcesrr�template_systemrrrrrr�device_promptsr�rrr� Formatterr� basicConfig�INFO� StreamHandler�stdout�rootr:�handlerr�� setFormatter� getLoggerr��mcp�toolr�rBr^rcrf�boolrir2r�r�r�r�r�r�r�r�r�r�r�r�r��floatrrr!r8r:r<r@rDrGrIrW�register_resource�SYSTEMr_�DEVICEra�CONFIGrorsrw� CREDENTIALryr~�TOPOLOGYr�r�r��SCANr�r�r��resourcer�r�r�r�r�r�r4�join�argv� command_args�environr�� is_mcp_cli� threadingr�r��Thread� web_thread�start�printr�r�r*r)�<module>r�si��&�,�,��� � � � �4����W�V�� ���8�2�L�G�%�%�L����� �,�,� A�����S�Z�Z�0����|�|�$�$�G��'�7�0�0�1����]�+a�b�c�%� �� � �>� *���n���/�~�?Q�R��)��8������ �!%� �� 4� �S�M� 4��#�� 4� �S�M� 4� �#�� 4�  �$�s�C�x�.�� 4� � 4�D���� ������E� �E��E��E� � E� � E� � E��E��E��E� �E� �#�s�(�^�E� �E�N���� �� ���c�3�h��(@� � � �������������5��5� �5��5� � 5� � 5� � 5��5��5� �5��d�3��8�n��5� �5�n���� 3�3� 3�4� 3� � 3����������A@� �A@��A@��A@�� A@� �3�-� A@� � A@��A@� �#�s�(�^�A@� �A@�F������T�#�s�(�^� 4�� ��,����|M�C�|M��|M��S�#�X��|M� �|M�|����M�s�M�3�M�4��S��>�M� �M�&���� � ) ��) ��) ��) �� ) �  �#�s�(�^� ) � �) �V���� � 5 ��5 ��5 ��5 �� 5 �  �$�s�C�x�.�� 5 � �5 �n����7�d�4��S��>�&:�7� �7�����,N��,N��S�#�X��,N� �,N�\����N�D��c��N�N� �N�"���� N�d�3��8�n� N� � N�����T�#�T�$�s�C�x�.�T� �T�<����T�s�T�t�C��H�~�T� �T�B����!T�t�C��H�~�!T� �!T�H�������"�� %�9N� �9N� �9N��9N�� 9N� � 9N� � 9N��9N� �#�s�(�^�9N� �9N�v���� $��&T��� �&T��&T� �#�s�(�^�&T� �&T�P����T�4��S��>�T� �T�"����)-��#'�(,� ;]����;]��;]��C�=�;]�!�� � ;]�  �#�s�(�^� ;]� �;]�z���� T�$�s�C�x�.� T� � T������"�� -T��-T� �-T��-T�� -T�  �#�s�(�^� -T� �-T�b����7�d�4��S��>�2�7� �7����� ?�C� ?�D� ?�D��c��N� ?� � ?�����C�H�S�M�C�T�#�s�(�^�C� �C�*����-�d�4��S��>�2�-� �-�������BN��BN� �BN��BN� �#�s�(�^� BN� �BN�N$��#�#�$5�|�7J�7J�K�<�S�<�S�<�L�<�$��#�#�$8�,�:M�:M�N�6��6��c�3�h��6�O�6�$��#�#�$?��AT�AT�U�7C�s�7C�t�C��H�~�7C�V�7C�r$��#�#�$C�\�EX�EX�Y�5I�3�5I�4��S��>�5I�Z�5I�n$��#�#�$?��AT�AT�U�5F�s�5F�t�C��H�~�5F�V�5F�n$��#�#�M�<�3J�3J�K���c�3�h���L��.$��#�#�O�\�5H�5H�I� ��c�3�h�� �J� �$��#�#�J� �0E�0E�F�@�T�#�s�(�^�@�G�@�$��#�#�$9�<�;P�;P�Q�F��S�#�X��F�R�F�:$��#�#�$B�L�DY�DY�Z�F�3�F�4��S��>�F�[�F�,$��#�#�N�L�4E�4E�F� F��c�3�h�� F�G� F�$��#�#�$5�|�7H�7H�I�F�D��c��N�F�J�F�$��#�#�$>� �@Q�@Q�R� F�s� F�t�C��H�~� F�S� F����g��4�C�4�C�4��4� ���H��/�3�/�3�/��/������!���"&��F � �F ��F ��F �� F � � F � � F ��3�-�F ��F � �#�s�(�^�F � �F �P���� "��� � ������� � � � � � �#�s�(�^�� ��B���� � B ��B ��B ��B �� B �  �#�s�(�^� B � �B �J �z�� ���8�8�C�H�H�%�L������ �s�3�s�:�t�i�<�>W�t�[d�ht�[t�J��$'�� � �=�!���4� "��!�!�)9�$�G�J����� � J�K�� �)�*��G�G�I�Er*

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