Skip to main content
Glama

ConnectWise API Gateway MCP Server

server.cpython-313.pyc30.3 kB
� Ta�gp]�� �SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK r SSK J r J r J r JrJr SSKJr SSKJr SSKJr \R,R/\R,R1\55r\R,R7\S5r\ R:"\ R<S\ R>"\5\ R@"5/S 9 \ RB"S 5r"\"S 5r#Sq$Sq%Sq&Sq'Sq(\R,R7\R,R/\R,R1\55S 5r)\R,R7\R,R/\R,R1\55S 5r*Sq+Sq,S q-"SS\.5r/Sr0Sr1Sr2Sr3S1S\4S\4S\ \ \4\4S\ \ \4\4S\ \ \4\44S\ \4\44 Sjjr5S\4S\4S\ \ \4\44Sjr6\#Ro5S2S\4S\8S\44Sjj5r9\#Ro5S3S\4S\4S\44S jj5r:\#Ro5S4S\4S\4S\ \ \4\4S\ \ \4\4S\44 S!jj5r;\#Ro5S5S\4S\8S\44S"jj5r<\#Ro5S\44S#j5r=\#Ro5S6S$\4S\8S\44S%jj5r>\#Ro5S&\4S\44S'j5r?\#Ro5S7S\4S\4S(\4S\ \ \4\4S\ \ \4\4S\44 S)jj5r@\#Ro5S8S*\ \4S\44S+jj5rA\#Ro5S,\8S\44S-j5rB\#Ro5S\44S.j5rCS/rD\ES0:Xa\D"5 gg)9a API Gateway MCP Server Implementation This module implements a Model Context Protocol server that allows: 1. Searching for ConnectWise API endpoints 2. Executing API calls with parameters 3. Sending raw API requests 4. Storing and retrieving frequently used API queries in Fast Memory �N)�Dict�List�Optional�Any�Union)�FastMCP)� APIDatabase)� FastMemoryDBzapi_gateway.logz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)�level�format�handlers� api_gatewayzconnectwise_api.dbzfast_memory_api.dbFc�0^�\rSrSrSrSU4SjjrSrU=r$)�APIError�8zException raised for API errorsc�\>�XlX lX0l[TU]UR5 g�N)�message� status_code�response�super�__init__)�selfrrr� __class__s ��8C:\MCP-Servers\CWM-API-Gateway-MCP\api_gateway\server.pyr�APIError.__init__:s$���� �&�� � � ������&�)rrr�NN)�__name__� __module__� __qualname__�__firstlineno__�__doc__r�__static_attributes__� __classcell__)rs@rrr8s���)�'�'rrc�$�[RRS5q[RRS5q[RRS5q[RRS5q[RRSS5q[RS5 [RS[35 [RS [35 [RS [ 35 [RS [ (aS [[ 5-OS 35 [RS[35 [[[[ [ /5(d[RS5 gg)z3Set up API configuration from environment variables�CONNECTWISE_API_URL�CONNECTWISE_COMPANY_ID�CONNECTWISE_PUBLIC_KEY�CONNECTWISE_PRIVATE_KEY�CONNECTWISE_AUTH_PREFIXz microtech+zConnectWise API Configuration:z API_URL: z COMPANY_ID: z PUBLIC_KEY: z PRIVATE_KEY: �*�Missingz AUTH_PREFIX: zMConnectWise API configuration incomplete. Please check environment variables.FT) �os�environ�get�API_URL� COMPANY_ID� PUBLIC_KEY� PRIVATE_KEY� AUTH_PREFIX�logger�info�len�all�error�rr� setup_configr<Bs ���j�j�n�n�2�3�G������ 8�9�J������ 8�9�J��*�*�.�.�!:�;�K��*�*�.�.�!:�L�I�K� �K�K�0�1� �K�K�)�G�9�%�&� �K�K�,�z�l�+�,� �K�K�,�z�l�+�,� �K�K�-�+�+��c�+�&6� 6�9�U�V�W� �K�K�-� �}�-�.� ���Z��=� >� >�� � �d�e�� rc�t�[RR[5(d2[R S[35 [R S5 g[ [5q[RS5 g![Ra"n[R SU35 SnAgSnAff=f)z&Initialize the API database connectionzDatabase file not found at zBPlease run build_database.py script first to generate the databaseFzConnected to API database.TzError connecting to database: N) r.�path�exists�DB_PATHr6r:r �api_dbr7�sqlite3�Error��es r�initialize_databaserFXs��� �7�7�>�>�'� "� "�� � �2�7�)�<�=�� � �Y�Z����W�%��� � �0�1��� �=�=��� � �5�a�S�9�:����s�$B�B7�B2�2B7c���[[5q[R S5 g![ R a"n[RSU35 SnAgSnAff=f)z.Initialize the Fast Memory database connectionz"Connected to Fast Memory database.Tz*Error connecting to Fast Memory database: NF)r �FAST_MEMORY_DB_PATH�fast_memory_dbr6r7rBrCr:rDs r�initialize_fast_memoryrJksM���%�&9�:��� � �8�9��� �=�=��� � �A�!��E�F����s�$'�A�A�Ac��[[[[/5(d [ S5e[ [3n[nUSU3n[ R"UR55R5nSU3[SS.nU$)z/Create authorization header for ConnectWise APIzFConnectWise API configuration incomplete. Check environment variables.�:zBasic zapplication/json)� Authorization�clientIdz Content-Type) r9r2r3r4rr5�base64� b64encode�encode�decode)�username�password� credentials�encoded_credentials�headerss r�get_auth_headerrXws��� � �J� �4� 5� 5��_�`�`���z�l�+�H��H��J�a��z�*�K� �*�*�;�+=�+=�+?�@�G�G�I��"�"5�!6�7��*��G� �Nr�method�endpoint�params�datarW�returnc��h# �[(d[5(d [S5e[U3nU(d [5n[R SUSU35 U(a,[R S[ R"U535 U(a,[R S[ R"U535 [R"SS9IShv�N nUR5S :XaURXTUS 9IShv�N nO�UR5S :XaURXTUS 9IShv�N nO�UR5S :XaURXTUS 9IShv�N nOgUR5S:XaURXTUS 9IShv�N nO:UR5S:XaURXTS9IShv�N nO[SU35e[R SUR 35 UR#5 UR$(aUR 5O0sSSS5IShv�N $GN[GN1GNN�N�N�N![R&arnSUR(R SUR(R*3n [R-U 5 [X�R(R UR(S9eSnAf[R.a! [R-S5 [S5e[R0a=n[R-S[3U535 [S[3U535eSnAf[4a=n[R-S[3U535 [S[3U535eSnAff=f!,IShv�N (df  g=f7f)z. Make a request to the ConnectWise Manage API z@ConnectWise API URL not configured. Check environment variables.zMaking z request to: zParams: zData: g>@)�timeoutN�GET)rWr[�POST)rW�json�PUT�PATCH�DELETE)rWzUnsupported HTTP method: zResponse status: z HTTP error z: )rrz:Request timed out. ConnectWise API may be slow to respond.zAPI request error: zAPI request failed: zUnknown error: )r1r<rrXr6r7rb�dumps�httpx� AsyncClient�upperr0�post�put�patch�deleter�raise_for_status�content�HTTPStatusErrorr�textr:�TimeoutException� RequestError�str� Exception) rYrZr[r\rW�url�clientrrE� error_messages r�make_api_requestry�s���� �7��~�~��]�^� ^� �I�h�Z� �C� �!�#�� �K�K�'�&���s�e�4�5� �� � �h�t�z�z�&�1�2�3�4� �� � �f�T�Z�Z��-�.�/�0�� � ��.�.�&� 7��|�|�~��&�!'���C���!P�P������6�)�!'���S���!M�M������5�(�!'���C�t��!L�L������7�*�!'���c���!N�N������8�+�!'���s��!D�D���!:�6�(�C�D�D� �K�K�+�H�,@�,@�+A�B� C� � %� %� '�&.�&6�&6�8�=�=�?�B� >�%/�.�.�Q�M�L�N�D�/��(�$�$� c�)�!�*�*�*@�*@�)A��A�J�J�O�O�CT�U�M� �L�L�� '��=�j�j�6L�6L�WX�Wa�Wa�b� b���%�%� Y� �L�L�U� V��W�X� X��!�!� <� �L�L�.�s�1�v�h�7� 8��1�#�a�&��:�;� ;��� 7� �L�L�?�3�q�6�(�3� 4��_�S��V�H�5�6� 6�� 7��=/�.�.�s��CN2�H7�N2� N�"'I� H:� ,I�6H=�7,I�#I�$,I�I�+I�<I�=A'I�% N2�1I�2N2�:I�=I�I�I�I�N2�N�A-K � A N�8M � N�8N�N�N�N/�N! � N/�+N2r>c��[(d%[5(d[RS5 g[R X5nU(a7Sq[R US5 [RSUSU35 U$Sqg)z� Check if a query exists in Fast Memory. Args: path: API endpoint path method: HTTP method Returns: The query if found, None otherwise z*Failed to initialize Fast Memory database.NT�idzFound query in Fast Memory: � F)rIrJr6r:� find_query�current_query_from_fast_memory�increment_usager7)r>rY�querys r�check_fast_memoryr��su�� �>�%�'�'� �L�L�E� F�� � %� %�d� 3�E� �)-�&��&�&�u�T�{�3�� � �2�4�&��&��B�C�� �%*�"� rr�� max_resultsc ��t# �[(d[5(dg[RU5nU(dg/n[USUS5HeupEUR SS5R 5nUR SS5nUR SS 5nUR US US US U35 Mg S n U SRU5- n [U5U:�aU SUS[U5S3- n U $![a9n [RS[U 535 S[U 53sSn A $Sn A ff=f7f)z� Search for available API endpoints based on a query. Args: query: Search string to find matching endpoints max_results: Maximum number of results to return �)Error: Failed to initialize API database.�+No API endpoints found matching your query.N�rY�r>� description�No description available�. r|� z$Found the following API endpoints: � � Showing � of z7 results. Refine your search for more specific results.�Error searching API endpoints: ) rArF�search_endpoints� enumerater0ri�append�joinr8rur6r:rt) r�r��results�formatted_results�irZrYr>r�rrEs r�search_api_endpointsr��s4��� �6�"�$�$�>�:��)�)�%�0���@���$�W�\�k�%:�A�>�K�A��\�\�(�B�/�5�5�7�F��<�<���+�D�"�,�,�}�6P�Q�K� � $� $��s�"�V�H�A�d�V�5�� �%N� O� ?�<���F�K�K� 1�2�2�� �w�<�+� %� �,�{�m�4��G� �~�E|�}� }�H���� �:�� � �6�s�1�v�h�?�@�0��Q���9�9��:�s?�D8�C2�D8�B5C2�1D8�2 D5�<.D0�*D5�+D8�0D5�5D8c��F# �[(d[5(dg[RX5nU(d SUSUS3$[RU5nU$![a9n[ R S[U535 S[U53sSnA$SnAff=f7f)z� Get detailed information about a specific API endpoint. Args: path: API path (e.g., /service/tickets) method: HTTP method (GET, POST, PUT, PATCH, DELETE) r�zNo API endpoint found for r|�.z$Error getting API endpoint details: N)rArF�find_endpoint_by_path_method�format_endpoint_for_displayrur6r:rt)r>rYrZ�formatted_detailsrEs r�get_api_endpoint_detailsr�s���� �6�"�$�$�>� ?��6�6�t�D���/��x�q���a�@� @�"�>�>�x�H�� � �� �?�� � �;�C��F�8�D�E�5�c�!�f�X�>�>��?�s@�B!�$A�B!�A�B!� B�%.B�B�B!�B�B!c��`# �[(d[5(dg[X5nU(a�UcASU;a;US(a1USn[R S[ R "U535 UcASU;a;US(a1USn[R S[ R "U535 [RX5nU(d SUSUS 3$[XX#5IShv�N nS n[U[5(aa[U5S :�a<S [U5S 3n[ R "USS SS9n USU S[U5S3nO+[ R "USS9nO[ R "USS9n[(dUS- nU$Sq SUSS3U-nU$N�![a;n Sq SU R(a U ROSSU R3sSn A $Sn A f[ a;n Sq [R#S[%U 535 S[%U 53sSn A $Sn A ff=f7f)a Execute an API call to the ConnectWise API. Args: path: API endpoint path (e.g., /service/tickets) method: HTTP method (GET, POST, PUT, PATCH, DELETE) params: Query parameters for the request data: Request body data (for POST, PUT, PATCH) r�Nr[z#Using parameters from Fast Memory: r\zUsing data from Fast Memory: z.Warning: No documented API endpoint found for r|z. Proceeding with caution.r�� z Retrieved z items. Showing first 10:���indentr�z/ (Response truncated. Full response contained z items.)z Would you like to save this query to Fast Memory for quicker access in the future? Reply 'yes' with a description to save it.Fz[Using query from Fast Memory: r�z] z API Error (�Unknownz): zError executing API call: )rArFr�r6r7rbrfr�ry� isinstance�listr8r~rrrrur:rt) r>rYr[r\�fast_memory_entryrZ�resultr�summary�formatted_datarEs r�execute_api_callr�(s<���$ �6�"�$�$�>�*�$�7��� �>�h�*;�;�@Q�RZ�@[�&�x�0�F� �K�K�=�d�j�j��>P�=Q�R� S� �<�F�&7�7�<M�f�<U�$�V�,�D� �K�K�7�� � �4�8H�7I�J� K�)5��6�6�t�D���C�F�8�1�T�F�Rl�m� m�(��f�C�C���� �f�d� #� #��6�{�R��&�s�6�{�m�3L�M��!%���F�3�B�K��!B��%�Y�d�>�*:�:k�lo�pv�lw�kx�yA�B���:�:�f�Q�7���z�z�&��3�H�.�-� �\� \�H��� .3� *�9�9J�=�9Y�8Z�Z_�`�ck�k�H���1D��4 �[�).�&��a�m�m�Q�]�]��K�3�q�y�y�k�Z�Z�� �5�).�&�� � �1�#�a�&��:�;�+�C��F�8�4�4�� 5�sy�B6H.�9$F#�H.�F#�-F!�.B"F#�H.�F#� H.�!F#�# H+�-0G#�H+�H.�# H+�00H&� H+�!H.�&H+�+H.c ��Z# �[(d[5(dg[RX5nU(dg/n[US5HzupEUR SS5R 5nUR SS5nUR SS5nUR S S 5n UR US US US U SU3 5 M| Sn U SRU5- n U S- n U $![a9n [RS[U 535 S[U 53sSn A $Sn A ff=f7f)z� Search for API endpoints using natural language. Args: query: Natural language description of what you're looking for max_results: Maximum number of results to return r�r�r�rYr�r>r�r��categoryr�r�r|z Category: z Description: z@Based on your query, here are the most relevant API endpoints: r�zg To get more details about a specific endpoint, use get_api_endpoint_details with the path and method.r�N) rArF�search_by_natural_languager�r0rir�r�rur6r:rt) r�r�r�r�r�rZrYr>r�r�rrEs r�natural_language_api_searchr�vs4��� �6�"�$�$�>�:��3�3�E�G���@���$�W�a�0�K�A��\�\�(�B�/�5�5�7�F��<�<���+�D�"�,�,�}�6P�Q�K��|�|�J� �:�H� � $� $��#�R��x�q���' � (�z�*#�#.�-�1� � 1�X���F�K�K� 1�2�2�� ������� �:�� � �6�s�1�v�h�?�@�0��Q���9�9��:�s?�D+�C%�D+�B(C%�$D+�% D(�/.D#�D(�D+�#D(�(D+c��h# �[(d[5(dg[R5nU(dgSnUSRUVs/sHnSU3PM sn5- nU$s snf![a9n[ R S[U535 S[U53sSnA$SnAff=f7f)z$ List all available API categories. r�zNo API categories found.zAvailable API categories: � z- zError listing API categories: N)rArF�get_categoriesr�rur6r:rt)� categoriesrr�rEs r�list_api_categoriesr��s���� �6�"�$�$�>� 9��*�*�,� ��-�2���D�I�I�z�J�z�8��H�:��z�J�K�K�����K�� �9�� � �5�c�!�f�X�>�?�/��A��x�8�8��9�sP�B2�A,�B2�A,� A' � A,�&B2�'A,�, B/�6.B*�$B/�%B2�*B/�/B2r�c ��# �[(d[5(dg[RU5nU(dSU3$/n[USUS5HeupEUR SS5R 5nUR SS5nUR SS 5nUR US US US U35 Mg S US3n U SRU5- n [U5U:�aU SUS[U5S3- n U $![a9n [RS[U 535 S[U 53sSn A $Sn A ff=f7f)z� Get all endpoints for a specific API category. Args: category: Category name (use list_api_categories to see available categories) max_results: Maximum number of results to return r�z!No endpoints found for category: Nr�rYr�r>r�zNo summary availabler�r|r�zEndpoints in category 'z': r�r�r�z7 endpoints. Use a higher max_results value to see more.z"Error getting category endpoints: ) rArF�get_endpoints_by_categoryr�r0rir�r�r8rur6r:rt) r�r�� endpointsr�r�rZrYr>r�rrEs r�get_category_endpointsr��sI��� �6�"�$�$�>�=��4�4�X�>� ��6�x�j�A� A���$�Y�|� �%<�a�@�K�A��\�\�(�B�/�5�5�7�F��<�<���+�D��l�l�9�.D�E�G� � $� $��s�"�V�H�A�d�V�5�� �%J� K� A�-�X�J�f�=���F�K�K� 1�2�2�� �y�>�K� '� �,�{�m�4��I��7G�G~�� �H���� �=�� � �9�#�a�&��B�C�3�C��F�8�<�<��=�s@�E� C:�E�B9C:�9E�: D=�.D8�2D=�3E�8D=�=E� raw_requestc���# �[5(dgUR5RSS5n[U5S:agUSR 5nUSnSU;aSURSS5upE0nURS5H'nS U;aURS S5up�X�U'M#S Xg'M) OUn0nS n [U5S:�a[ R "US5n [XBXj5IS hv�N $![ Ra S US3s$f=fN&![a9n [RS [U 535 S [U 53sS n A $S n A ff=f7f)a& Send a raw API request to the ConnectWise API. Args: raw_request: Raw API request in the format "METHOD /path?params [JSON body]" Example: "GET /service/tickets?conditions=status/name='Open'" Example: "POST /service/tickets { "summary": "Test ticket" }" z.Error: Failed to initialize API configuration.r|r�z=Error: Invalid request format. Use 'METHOD /path [JSON body]'rr��?�&�=r�NzError: Invalid JSON body: z!Error executing raw API request: ) r<�strip�splitr8rirb�loads�JSONDecodeErrorr�rur6r:rt) r��partsrY�path_with_paramsr>� query_stringr[�param�key�valuer\rEs r�send_raw_api_requestr��sg��� �>�>�?�&<��!�!�#�)�)�#�q�1�� �u�:��>�R��q����!�� ��8�� �"� "�!1�!7�!7��Q�!?� �D��F�%�+�+�C�0���%�<�!&���S�!�!4�J�C�"'�3�K�$&�F�M� 1�$�D��F��� �u�:��>� ?��z�z�%��(�+�� &�d�F�A�A�A�� �'�'� ?�3�E�!�H�:�>�>� ?�� B�� �<�� � �8��Q���A�B�2�3�q�6�(�;�;��<�sw�E"�/D�E"�BD� C8�$D�3D�4D�7E"�8D�D�E"�D�D� E�&.E�E�E"�E�E"r�c��# �[(d[5(dg[RX XU5nSUS3$![a9n[R S[ U535 S[ U53sSnA$SnAff=f7f)z� Save an API query to Fast Memory. Args: path: API endpoint path method: HTTP method description: User-friendly description of the query params: Query parameters data: Request body data �1Error: Failed to initialize Fast Memory database.z0Successfully saved query to Fast Memory with ID r�z#Error saving query to Fast Memory: N)rIrJ� save_queryrur6r:rt)r>rYr�r[r\�query_idrEs r�save_to_fast_memoryr�sy���$ �>�%�'�'�F�>�!�,�,�[��PT�U��A�(��1�M�M�� �>�� � �:�3�q�6�(�C�D�4�S��V�H�=�=��>�s1�B�<�B� A?�.A:�4A?�5B�:A?�?B� search_termc��# �[(d[5(dgU(a#[RU5nU(dSUS3$O[R5nU(dg/n[ US5H�up4UR S5(a%[ R"UR S05SS9OS nUR S 5(a%[ R"UR S 05SS9OS n[U5S :�aUS S S -n[U5S :�aUS S S -nURUSUSSUSR5SUSSUSSUSU3 5 M� SnUSRU5- nUS- nU$![a9n[RS[U535 S[U53sS nA$S nAff=f7f)zc List queries saved in Fast Memory. Args: search_term: Optional search term to filter queries r�z*No queries found in Fast Memory matching 'z'.z$No queries saved in Fast Memory yet.r�r[r�r��Noner\�dNz... (truncated)r�r�z Path: rYr|r>z Usage Count: � usage_countz Parameters: z Data: zQueries saved in Fast Memory: r�zV To use a query from Fast Memory, use execute_api_call with the same path and method.z#Error listing Fast Memory queries: )rIrJ�search_queries�get_all_queriesr�r0rbrfr8r�rir�rur6r:rt) r��queries�formatted_queriesr�r�� params_str�data_strrrEs r�list_fast_memoryr�5s���� �>�%�'�'�F�(>� �$�3�3�K�@�G��C�K�=�PR�S�S��%�4�4�6�G��=���!�'�1�-�H�A�JO�)�)�T\�J]�J]����E�I�I�h��$;�A�F�ci�J�FK�i�i�PV�FW�FW�t�z�z�%�)�)�F�B�"7��B�]c�H��:���$�'���-�0A�A� ��8�}�s�"�#�D�S�>�,=�=�� � $� $��#�R��m�,�-�.�!�(�O�1�1�3�4�A�e�F�m�_�E#�#(��#7�"8�9"�",��.�$�:� '� �.�&7���F�K�K� 1�2�2���n�n����� �>�� � �:�3�q�6�(�C�D�4�S��V�H�=�=��>�sM�G�(F�G�F�$G�%DF�?G� G� .F>�8G�9G�>G�Gr�c��# �[(d[5(dg[RU5nU(aSUS3$SUS3$![a9n[R S[ U535 S[ U53sSnA$SnAff=f7f)zQ Delete a query from Fast Memory. Args: query_id: ID of the query to delete r�z#Successfully deleted query with ID z from Fast Memory.zNo query found with ID r�z'Error deleting query from Fast Memory: N)rIrJ� delete_queryrur6r:rt)r��successrEs r�delete_from_fast_memoryr�ks���� �>�%�'�'�F�B� �-�-�h�7�� �8�� �BT�U� U�,�X�J�a�8� 8�� �B�� � �>�s�1�v�h�G�H�8��Q���A�A��B�s@�B �!A�B �A�B � B �.B�?B �B �B � B c��# �[(d[5(dg[R5nSUS3$![a9n[R S[ U535 S[ U53sSnA$SnAff=f7f)z% Clear all queries from Fast Memory. r�zSuccessfully cleared z queries from Fast Memory.zError clearing Fast Memory: N)rIrJ� clear_allrur6r:rt)�countrEs r�clear_fast_memoryr��ss��� �>�%�'�'�F�7��(�(�*��&�u�g�-G�H�H�� �7�� � �3�C��F�8�<�=�-�c�!�f�X�6�6��7�s1�A?�9�A?� A<�.A7�1A<�2A?�7A<�<A?c��[RS5 [5 [5 [ 5 [ R SS9 g)zMain entry point for the serverz.Starting ConnectWise API Gateway MCP Server...�stdio)� transportN)r6r7r<rFrJ�mcp�runr;rr�mainr��s.�� �K�K�@�A��N������G�G�g�G�r�__main__)NNN)r�)r`)r`NN)�)�rr)Fr#r.�sysrb�rerg�asynciorOrB�logging�typingrrrrr�mcp.server.fastmcpr�api_gateway.api_db_utilsr �api_gateway.fast_memory_dbr r>�dirname�abspath�__file__�log_dirr��log_file� basicConfig�INFO� FileHandler� StreamHandler� getLoggerr6r�r1r2r3r4r5r@rHrArIr~rurr<rFrJrXrtryr��tool�intr�r�r�r�r�r�r�r�r�r�r�r�rr;rr�<module>r�s���� � � � � �� ���3�3�&�0�3� �'�'�/�/�"�'�'�/�/�(�3� 4�� �7�7�<�<��!2� 3����� �,�,� A����H�%������� � � �=� )���m��� �� � � � �� �� � �'�'�,�,�r�w�w���r�w�w���x�'@�A�CW� X���g�g�l�l�2�7�7�?�?�2�7�7�?�?�8�3L�#M�Oc�d�� ����"'��'�y�'��,�& ��0(,�%)�(,� 87� �87��87� �T�#�s�(�^� $�87� �4��S��>� "� 87� �d�3��8�n� %� 87�  �#�s�(�^� 87�x�C�����$�s�C�x�.�1I��@����$:�c�$:��$:�S�$:� �$:�L����?��?�c�?�c�?� �?�0�����'+�%)� K5� �K5� �K5� �T�#�s�(�^� $�K5� �4��S��>� "� K5�  � K5� �K5�Z����):�S�):�s�):�3�):� �):�V����9�3�9� �9�.����$=�3�$=�S�$=�#�$=� �$=�L����4<��4<��4<� �4<�l���� (,�%)� >� �>� �>��>� �T�#�s�(�^� $� >� �4��S��>� "� >�  � >� �>�8����3>��� �3>��3>� �3>�j����B�C�B�C�B� �B�*���� 7�� 7� � 7�� �z���F�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/jasondsmith72/CWM-API-Gateway-MCP'

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