Skip to main content
Glama
lab_management.cpython-313.pyc14.4 kB
� F�?hL+��j�SrSSKrSSKrSSKJrJrJr SSKJr SSK J r J r J r SSK JrJr S\4S jrg) zW Lab Management Handler Handles creation, deletion, listing, and control of CML labs. �N)�Dict�Any�Union)�FastMCP�)� get_client� set_client�CMLAuth)� check_auth�handle_api_error�mcpc �6^^ �UR5SS[S[S[S[S[4 Sjj5nUR5S[4Sj5nUR5SS[S [S[[[44S jj5nUR5S [S[[[44S j5mUR5S [S[4UU 4S jj5nUR5S [S[4Sj5nUR5S [S[4Sj5m UR5SS [S[ S[4U4Sjjj5nUR5S[ [[[4[44Sj5ng)z1Register lab management tools with the MCP server�base_url�username�password� verify_ssl�returnc���# �URS5(dSU3n[SU3[RS9 [ XX#5nUR 5IShv�N n[SUSSS3[RS9 [ U5 U(aS OS nS US US 3$NB![a<n[S[U53[RS9 S[U53sSnA$SnAff=f7f)a� Initialize the CML client with authentication credentials Args: base_url: Base URL of the CML server (e.g., https://cml-server) username: Username for CML authentication password: Password for CML authentication verify_ssl: Whether to verify SSL certificates (set to False for self-signed certificates) Returns: A success message if authentication is successful )zhttp://�https://rz'Initializing CML client with base_url: ��fileNzToken received: � z...�enabledz-disabled (accepting self-signed certificates)z'Successfully authenticated with CML at z (SSL verification: �)zError connecting to CML: ) � startswith�print�sys�stderrr � authenticater � Exception�str)rrrr�cml_auth�token� ssl_status�es �\C:\Users\jscon\Documents\Python_Projects\Claude-Modeling-Labs\src\handlers\lab_management.py�initialize_client�8register_lab_management_tools.<locals>.initialize_clients�����"�"�#:�;�;�!�(��,�H� �7��z�B����T��8�x�D�� 8�"�/�/�1�1�E� �$�U�3�B�Z�L��4�3�:�:� F� �x� �&0��6e�J�<�X�J�FZ�[e�Zf�fg�h� h� 2�� � 8� �-�c�!�f�X�6�S�Z�Z� H�.�s�1�v�h�7� 7�� 8�sI�AC'�B�B�AB�C'�B� C$�(1C�C$�C'�C$�$C'c��\# �[5nU(aUS$[S[RS9 [ 5R SS5IShv�N nUR 5n[S[U5S3[RS9 U(dg S nUR5H\upEUS URS S 5SUS3- nURS5(a USUSS3- nUSURSS5S3- nM^ U$N�![anS[U53sSnA$SnAff=f7f)zK List all labs in CML Returns: A formatted list of all available labs �errorzAttempting to list labs...r�GET� /api/v0/labsNzFound z labszNo labs found in CML.zAvailable Labs: z- �title�Untitledz (ID: z) � descriptionz Description: � z State: �state�unknownzError listing labs: ) r rrrr�request�json�len�items�getr r!)� auth_check�response�labs�result�lab_id�lab_infor%s r&� list_labs�0register_lab_management_tools.<locals>.list_labs2s(��� �\� � ��g�&� &� 3� �.�S�Z�Z� @�'�\�1�1�%��H�H�H��=�=�?�D� �F�3�t�9�+�U�+�#�*�*� =��.�+�F�$(�J�J�L� ���B�x�|�|�G�Z�@�A���x�s�S�S���<�<� �.�.�����0G�/H��K�K�F��I�h�l�l�7�I�&F�%G�r�J�J�� %1� �M�!I��"� 3�)�#�a�&��2� 2�� 3�sT�D,�5D�D�AD�D,�A3D�D,�D� D)� D$�D)�D,�$D)�)D,r-r/c��# �[5nU(aU$[SU3[RS9 [ 5R SSXS.S9IShv�N nUR 5n[SU3[RS9 URS 5nU(dS S 0$US US U3SS.$NW![an[SU5sSnA$SnAff=f7f)z� Create a new lab in CML Args: title: Title of the new lab description: Optional description for the lab Returns: Dictionary containing lab ID and confirmation message zCreating lab with title: r�POSTr,)r-r/)r4NzLab creation response: �idr*z(Failed to create lab, no lab ID returnedz Created lab 'z ' with ID: �success)r<�message�status� create_lab) r rrrrr3r4r7r r )r-r/r8r9�lab_datar<r%s r&rF�1register_lab_management_tools.<locals>.create_labTs���� �\� � �� � 5� �-�e�W�5�C�J�J� G�'�\�1�1���$�A�2���H�  �}�}��H� �+�H�:�6�S�Z�Z� H��\�\�$�'�F���!K�L�L�!�*�5�'��V�H�E�#�� ���&� 5�#�L�!�4� 4�� 5�sS�C �9B*�B(�A B*�C � B*�'C �(B*�* C �4 C�?C �C �C � C r<c���# �[5nU(aU$[5RSSU35IShv�N nUR5nU$N![an[ SU5sSnA$SnAff=f7f)z� Get detailed information about a specific lab Args: lab_id: ID of the lab to get details for Returns: Dictionary containing lab details r+� /api/v0/labs/N�get_lab_details)r rr3r4r r )r<r8r9� lab_detailsr%s r&rK�6register_lab_management_tools.<locals>.get_lab_details}sp��� �\� � �� � :�'�\�1�1�%�=���9Q�R�R�H�"�-�-�/�K�� �S��� :�#�$5�q�9� 9�� :�sD�A3� A�A�A� A3�A� A0� A+�%A0�&A3�+A0�0A3c��># �[5nU(aUS$T"U5IShv�N n[U[5(aCURS5S:Xa.T"U5IShv�N [R "S5IShv�N [ 5RSSU35IShv�N nSUS 3$N�NON3N![anS [U53sSnA$SnAff=f7f) ze Delete a lab from CML Args: lab_id: ID of the lab to delete Returns: Confirmation message r*Nr1�STARTEDr�DELETErJ�Lab z deleted successfullyzError deleting lab: ) r � isinstance�dictr7�asyncio�sleeprr3r r!)r<r8rLr9r%rK�stop_labs ��r&� delete_lab�1register_lab_management_tools.<locals>.delete_lab�s����� �\� � ��g�&� &� 3� /�� 7�7�K��+�t�,�,�����1I�Y�1V��v�&�&�&��m�m�A�&�&�&�'�\�1�1�(�m�F�8�<T�U�U�H��&��!6�7� 7�8�'�&�U��� 3�)�#�a�&��2� 2�� 3�sz�C� B6�B.�9B6� B0�!B6�>B2�?$B6�#B4�$ B6�-C�.B6�0B6�2B6�4B6�6 C� C� C�C�C�Cc���# �[5nU(aUS$[5RSSUS35IShv�N nSUS3$N ![anS[ U53sSnA$SnAff=f7f) zf Start the specified lab Args: lab_id: ID of the lab to start Returns: Confirmation message r*�PUTrJz/startNrQz started successfullyzError starting lab: �r rr3r r!�r<r8r9r%s r&� start_lab�0register_lab_management_tools.<locals>.start_lab�sx��� �\� � ��g�&� &� 3�'�\�1�1�%�=���PV�9W�X�X�H��&��!6�7� 7�Y��� 3�)�#�a�&��2� 2�� 3��D�A-�!A�A� A�A-�A� A*� A%�A*� A-�%A*�*A-c���# �[5nU(aUS$[5RSSUS35IShv�N nSUS3$N ![anS[ U53sSnA$SnAff=f7f) zd Stop the specified lab Args: lab_id: ID of the lab to stop Returns: Confirmation message r*rZrJz/stopNrQz stopped successfullyzError stopping lab: r[r\s r&rV�/register_lab_management_tools.<locals>.stop_lab�sx��� �\� � ��g�&� &� 3�'�\�1�1�%�=���PU�9V�W�W�H��&��!6�7� 7�X��� 3�)�#�a�&��2� 2�� 3�r_�timeoutc��># �[5nU(aUS$SSKJn T"U5IShv�N n[U[5(aUR S5S:wag[ SUS 3[RS 9 U"U5IShv�N n[U[5(aS U;aU$[R"5R5nS nU(Gd[R"5R5U- U:a�S nUR5H�up�[5RSSUSU35IShv�N n U R!5n U R SS5n [ SU R SS5SU 3[RS 9 U S:wdM�S nM� U(d[R""S5IShv�N U(d,[R"5R5U- U:aM�U(agSUS3$GN�GNN�NM![$a<n [ S[U 53[RS 9 S[U 53sSn A $Sn A ff=f7f)z� Wait for all nodes in a lab to reach the STARTED state Args: lab_id: ID of the lab timeout: Maximum time to wait in seconds (default: 60) Returns: Status message r*�)� get_lab_nodesNr1rOz1Lab is not in STARTED state. Start the lab first.zWaiting for nodes in lab z to initialize...r�ErrorFTr+rJz/nodes/�UNKNOWNzNode �labelr2z state: �z.All nodes in the lab are initialized and readyzTimeout reached (z3 seconds). Some nodes may not be fully initialized.zError waiting for nodes: )r �topologyrerRrSr7rrrr!rT�get_event_loop�timer6rr3r4rUr )r<rbr8rerL�nodes� start_time� all_ready�node_id�node� node_info� node_datar1r%rKs �r&�wait_for_lab_nodes�9register_lab_management_tools.<locals>.wait_for_lab_nodes�s ���� �\� � ��g�&� &�) 8� /�!0�� 7�7�K��k�4�0�0�K�O�O�G�4L�PY�4Y�J� �-�f�X�5F�G�c�j�j� Y�(��/�/�E��%��%�%�'�U�*:�� � �/�/�1�6�6�8�J��I��W�%;�%;�%=�%B�%B�%D�z�%Q�U\�$\� � �%*�[�[�]�M�G�&0�l�&:�&:�5�M�RX�QY�Y`�ah�`i�Bj�&k� k�I� )��� 0�I�%�M�M�'�9�=�E��E�)�-�-���"C�!D�H�U�G�T�[^�[e�[e�f�� �)�$)� �&3�!�!�-�-��*�*�*� �W�%;�%;�%=�%B�%B�%D�z�%Q�U\�$\� �G�*�7�)�3f�g�g�C8�0�!l�+�� � 8� �-�c�!�f�X�6�S�Z�Z� H�.�s�1�v�h�7� 7�� 8�s��I�H �G?�.H �I�'H �H� H �$I�%BH �6H�7AH �&H �9H�:5H �1H �8I�9H �>I�?H �H �H �H � I�1I �I�I� I�Ic��D# �[5nU(aUS$[5RSS5IShv�N nUR5n[ U[ 5(aC[ S[RS9 0nUH!nURS5nU(dMXCU'M# U$0nUR5H=upVURSS 5URS S 5URS /5S .X5'M? U$N�![anS [U53sSnA$SnAff=f7f)zt List all available node definitions in CML Returns: Dictionary of available node definitions or error message r*r+z/api/v0/node_definitionsNz.Converting node definitions list to dictionaryrrBr/��type� interfaces)r/rxryz Error listing node definitions: ) r rr3r4rR�listrrrr7r6r r!)r8r9� node_defsr;�node_defrprrr%s r&�list_node_definitions�<register_lab_management_tools.<locals>.list_node_definitionss��� �\� � ��g�&� &� ?�'�\�1�1�%�9S�T�T�H� � � ��I��)�T�*�*��F�c�j�j�Y��� )�H�&�l�l�4�0�G��w�*2�w��!*�� ��F�&/�o�o�&7�"��#,�=�=���#C�%�M�M�&�"�5�"+�-�-� �b�"A�#���'8��M�-U��.� ?�5�c�!�f�X�>� >�� ?�sX�D �C;�C9�AC;� C;�#D �$AC;�8D �9C;�; D� D�D�D �D�D N)T)rw)�<)�toolr!�boolrr�intr) r r'r>rFrWr]rtr}rKrVs @@r&�register_lab_management_toolsr�s���� �X�X�Z�8�#�8��8��8�Y]�8�il�8��8�< �X�X�Z�3�S�3��3�B �X�X�Z�&5��&5�#�&5�t�C��H�~�&5��&5�P �X�X�Z�:�c�:�d�3��8�n�:��:�* �X�X�Z�3��3��3��3�8 �X�X�Z�3��3��3��3�( �X�X�Z�3�s�3�s�3��3�( �X�X�Z�88��88�s�88�C�88��88�t �X�X�Z�$?��t�C��H�~�s�/B�)C�$?��$?�)�__doc__rrT�typingrrr�fastmcpr�clientrr r �utilsr r r��r�r&�<module>r�s2���  ��#�#��4�4�0�j?�w�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/MediocreTriumph/claude-cml-toolkit'

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