Skip to main content
Glama

ERPNext MCP Server

by Zero056
erpnext_client.cpython-313.pyc15.5 kB
� g��h(%����SSKrSSKrSSKrSSKrSSKJrJrJrJrJ r SSK J r SSK J r J r SSKr\R"\5r"SS5r"SS5r"S S 5rg) �N)�Dict�List�Optional�Any�Union)�urljoin)�datetime� timedeltac�0�\rSrSrSS\S\4SjjrSrSrg) � RateLimiter� �requests_per_minute�requests_per_hourc�8�XlX l/Ul/Ulg�N)� rpm_limit� rph_limit�minute_requests� hour_requests)�selfrrs �@C:\Users\hazem\OneDrive\Desktop\mcp_server\src\erpnext_client.py�__init__�RateLimiter.__init__s��,��*��!������c���# �[R"5nURVs/sHo!U- S:dM UPM snUlURVs/sHo!U- S:dM UPM snUl[UR5UR:�a8SXRS- - nUS:�a[ R "U5IShv�N [UR5UR:�a8SXRS- - nUS:�a[ R "U5IShv�N URRU5 URRU5 gs snfs snfN�NG7f)N�<ir) �timerr�lenr�asyncio�sleepr�append)r�now�t� sleep_times r�acquire�RateLimiter.acquires/����i�i�k��,0�+?�+?�P�+?�a��7�R�<��+?�P���)-�);�);�N�);�A�Q�w��~�a�);�N��� �t�#�#� $���� 6��s�%9�%9�!�%<�<�=�J��A�~��m�m�J�/�/�/� �t�!�!� "�d�n�n� 4���'9�'9�!�'<�!<�=�J��A�~��m�m�J�/�/�/� ���#�#�C�(� ���!�!�#�&��! Q��N� 0� 0�sG�$E+� E�E�E+� E"�"E"�(AE+�E'�AE+�!E)�"AE+�)E+)rrrrN)r��)�__name__� __module__� __qualname__�__firstlineno__�intrr%�__static_attributes__�rrr r s�� �C� �� � 'rr c�f�\rSrSrS S\S\4SjjrS\S\4SjrS\S\ \ 4Sjr S\S \ 4S jr S r g )� CacheManager�+�ttl�max_sizec�8�XlX l0Ul0Ulgr)r2r3�cache� timestamps)rr2r3s rr�CacheManager.__init__,s���� � ��� ���r�key�returnc��XR;ag[R"5URU- UR:$)NF)r6rr2�rr8s r� _is_valid�CacheManager._is_valid2s2�� �o�o� %���y�y�{�T�_�_�S�1�1�D�H�H�<�<rc��URU5(aURRU5$XR;aURU URU gr)r<r5�getr6r;s rr?�CacheManager.get7sH�� �>�>�#� � ��:�:�>�>�#�&� &� �J�J� �� � �3������$�r�valuec�.�[UR5UR:�aB[URURR S9nURU URU X RU'[ R "5URU'g)N)r8)rr5r3�minr6r?r)rr8rA� oldest_keys r�set�CacheManager.set?sg�� �t�z�z�?�d�m�m� +��T�_�_�$�/�/�2E�2E�F�J�� � �:�&���� �+�� � �3��#�y�y�{�����r)r5r3r6r2N)�,r')r(r)r*r+r,r�str�boolr<rrr?rEr-r.rrr0r0+sR���C���� =�S�=�T�=� �s��x��}��+�s�+�3�+rr0c ��\rSrSrS%S\S\S\S\4SjjrS&S\S \S \\S \S \4 S jjr S'S\S\\S\\ \S\ S \4 Sjjr S\S\S \4Sjr S\S \S \4SjrS\S\S \S \4SjrS\S\S \4SjrS\S \4SjrS(S\S\S\ S \4SjjrS\S\S\S \4SjrS \4SjrS \4SjrS)S\\S\\S \4SjjrS \S \4S!jrS\S \S \4S"jrS\S \4S#jrS$rg)*� ERPNextClient�JN�url�api_key� api_secret�configc��URS5UlX lX0lU=(d 0UlSUSU3SSS.UlURR S05nUR SS5(a2[UR S S 5UR S S 55UlOSUlURR S 05nUR SS5(a2[UR SS5UR SS 55Ul OSUl URR S05R SS5Ul g)N�/ztoken �:zapplication/json)� Authorizationz Content-Type�Accept� rate_limiting�enabledTrrrr'r5r2rGr3�erpnext�timeout�) �rstriprMrNrOrP�headersr?r � rate_limiterr0r5rY)rrMrNrOrP� rate_config� cache_configs rr�ERPNextClient.__init__Ks"���:�:�c�?���� �$���l��� � &�g�Y�a� �|�<�.�(� �� ��k�k�o�o�o�r�:� � �?�?�9�d� +� +� +���� 5�r�:���� 3�T�:�!�D� � !%�D� ��{�{���w��3� � � � �I�t� ,� ,�%�� � ���,�� � ��T�2��D�J� �D�J��{�{���y�"�5�9�9�)�R�H�� r�method�endpoint�data� use_cacher9c ���# �UR(a"URR5IShv�N USUSU(a[R"USS9OS3nU(aaUR 5S:XaMUR (a<UR R U5nU(a[RSU35 U$[URS3URS55n[R"URS9IShv�N n[R"5n UR 5S:Xa#UR XpR US 9IShv�N n O�UR 5S :Xa#UR#XpR US 9IShv�N n O{UR 5S :Xa#UR%XpR US 9IShv�N n ODUR 5S :Xa"UR'XpR S9IShv�N n O[)SU35eU R+5 U R5n U(a@UR 5S:Xa,UR (aUR R-X[5 [R/USUSU R0S[R"5U - SS35 U sSSS5IShv�N $GN�GN�GNzGNFGNN�N![R2a�n [R5SU R6R0SUSUSU R6R835 [;SU R6R0SU R6R835eSn A f[:aCn [R5SUSUS[=U 535 [;S[=U 535eSn A ff=f!,IShv�N (df  g=f7f)NrST)� sort_keys��GETzCache hit for rR)rY)r\�params�POST)r\�json�PUT�DELETE)r\zUnsupported HTTP method: � z - z.2f�szHTTP z for z: zRequest failed for zRequest failed: )r]r%rk�dumps�upperr5r?�logger�debugrrM�lstrip�httpx� AsyncClientrYrr\�post�put�delete� ValueError�raise_for_statusrE�info� status_code�HTTPStatusError�error�response�text� ExceptionrH) rrarbrcrd� cache_key� cached_resultrM�client� start_timer��result�es r� _make_request�ERPNextClient._make_requestls��� � � ��#�#�+�+�-� -� -��h�a��z��t�4�:�:�d�d�+K�Y[�*\�]� � �����5�0�T�Z�Z� �J�J�N�N�9�5�M��� � �~�h�Z�8�9�$�$����� �!�n�h�o�o�c�&:�;���$�$�T�\�\�:�:�f� =�!�Y�Y�[� ��<�<�>�U�*�%+�Z�Z��\�\�RV�Z�%W�W�H��\�\�^�v�-�%+�[�[��l�l�QU�[�%V�V�H��\�\�^�u�,�%+�Z�Z��\�\�PT�Z�%U�U�H��\�\�^�x�/�%+�]�]�3� � �]�%M�M�H�$�'@���%I�J�J��)�)�+�!����������5�!8�T�Z�Z��J�J�N�N�9�5�� � �v�h�a��z��X�5I�5I�4J�#�d�i�i�k�\f�Nf�gj�Mk�kl�m�n��/;�:�:� .�;� X�V�U�M�;��2�(�(� U�� � �u�Q�Z�Z�%;�%;�$<�E�&���8�*�TV�WX�Wa�Wa�Wf�Wf�Vg�h�i��%�� � �(>�(>�'?�r�!�*�*�/�/�AR� S�T�T��� =�� � �2�6�(�!�H�:�R��A��x�P�Q��"2�3�q�6�(� ;�<�<�� =��9;�:�:�s��/O$�K�CO$�K�O$�O �AK!�K�6K!�K�6K!�K� 5K!�>K�?B=K!�< O$�K� O$�O$�K!�K!�K!�K!�O$�!O�5BM7�7 O�>O�O�O � O!�O � O!�O$�doctype�filters�fields�limitc���# �SU3nSU0nU(a[R"U5US'U(a[R"U5US'URSXV5IShv�N $N7f)z%Get list of documents for any doctype�/api/resource/�limit_page_lengthr�r�rhN�rkrpr�)rr�r�r�r�rbris r�get_doctype_list�ERPNextClient.get_doctype_list�sb���$�G�9�-��%�u�-�� � $� � �7� 3�F�9� � �#�z�z�&�1�F�8� ��'�'��x�@�@�@�@�s�AA(�!A&�"A(�namec��R# �SUSU3nURSU5IShv�N $N7f)Nr�rRrh�r��rr�r�rbs r�get_doctype_doc�ERPNextClient.get_doctype_doc�s0���#�G�9�A�d�V�4���'�'��x�8�8�8�8�s �'�%�'c��J# �SU3nURSX2SS9IShv�N $N7f)Nr�rjF�rdr�)rr�rcrbs r�create_doctype_doc� ERPNextClient.create_doctype_doc�s/���#�G�9�-���'�'���%�'�P�P�P�P�s �#�!�#c��P# �SUSU3nURSXCSS9IShv�N $N7f)Nr�rRrlFr�r�)rr�r�rcrbs r�update_doctype_doc� ERPNextClient.update_doctype_doc�s5���#�G�9�A�d�V�4���'�'��x��'�O�O�O�O�� �&�$�&c��P# �SUSU3nURSUSS9IShv�N $N7f)Nr�rRrmFr�r�r�s r�delete_doctype_doc� ERPNextClient.delete_doctype_doc�s5���#�G�9�A�d�V�4���'�'��(�e�'�L�L�L�L�r�c��L# �SU3nURSU5IShv�N $N7f)Nz/api/resource/DocType/rhr�)rr�rbs r�get_doctype_meta�ERPNextClient.get_doctype_meta�s*���+�G�9�5���'�'��x�8�8�8�8�s �$�"�$� search_termc��# �SU3nU[R"SSSUS3//5S.nURSXE5IShv�N $N7f)Nr�r��like�%)r�r�rhr�)rr�r�r�rbris r�search_doctypes�ERPNextClient.search_doctypes�sU���#�G�9�-��!&��z�z�F�F�a� �}�A�4F�#G�"H�I� ���'�'��x�@�@�@�@�s�<A�A�A� link_doctypec��# �SU3n[R"UR5RSS5U05SS.nUR SXE5IShv�N $N7f)Nr�rn�_�2)r�r�rh)rkrp�lower�replacer�)rr�r�r�rbris r�get_linked_documents�"ERPNextClient.get_linked_documents�sZ���#�L�>�2���z�z�7�=�=�?�#:�#:�3��#D�d�"K�L�!#� ���'�'��x�@�@�@�@�s�AA�A�Ac��d# �URSSSS9IShv�N gN![a gf=f7f)Nrhz'/api/method/frappe.auth.get_logged_userFr�T)r�r�)rs r�test_connection�ERPNextClient.test_connection�sA��� ��$�$�U�,U�af�$�g� g� g�� h��� �� �s(�0� �� �0� � -�0�-�0c��# �URSSSS9IShv�N $N![anS[U50sSnA$SnAff=f7f)Nrhz(/api/method/frappe.utils.get_system_infoFr�r)r�r�rH)rr�s r�get_system_info�ERPNextClient.get_system_info�sH��� %��+�+�E�3]�in�+�o�o� o�o��� %��S��V�$� $�� %�s8�A����A�� A� ;�A�A�A�Ac��# �U(aURSU5IShv�N $URSU5IShv�N $NN7f�N�Item)r�r�)rr�r�s r�get_item�ERPNextClient.get_item�s<��� ��-�-�f�d�;�;� ;��.�.�v�w�?�?� ?�<�?�s�A�>�A�A�A�A� item_datac��B# �URSU5IShv�N $N7fr�)r�)rr�s r� create_item�ERPNextClient.create_item�s����,�,�V�Y�?�?�?�?�� ���c��B# �URSX5IShv�N $N7fr�)r�)rr�r�s r� update_item�ERPNextClient.update_item�s����,�,�V�T�E�E�E�E�r�c��B# �URSU5IShv�N $N7fr�)r�)rr�s r� delete_item�ERPNextClient.delete_item�s����,�,�V�T�:�:�:�:�r�)rNrOr5rPr\r]rYrMr)NT)NN�)� )NN)r(r)r*r+rHrrrrIr�rr,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r-r.rrrKrKJs��I�C�I�#�I�3�I��I�BVZ�-1�/=�#�/=��/=�H�T�N�/=�&*�/=�6:�/=�bNR�OQ� A�c� A�H�T�N� A�&.�t�C�y�&9� A�IL� A�VZ� A�9�S�9��9��9�Q��Q�4�Q�D�Q�P��P�3�P�d�P�t�P�M��M�3�M�4�M�9�c�9�d�9�A�S�A�s�A�3�A�X\�A�A�#�A�S�A�PS�A�X\�A��t��%�t�%� @�8�C�=�@�(�4�.�@�\`�@� @�4�@�D�@�F�c�F�d�F�t�F�;�c�;�d�;rrK)rurkrr�typingrrrrr� urllib.parserr r �logging� getLoggerr(rrr r0rKr.rr�<module>r�sP�� � � ��3�3� �(�� � � �8� $��'�'�<+�+�>_;�_;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/Zero056/Mcp'

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