Skip to main content
Glama

ERPNext MCP Server

by Zero056
server.cpython-313.pyc22 kB
� N��hV`� ��SSKrSSKrSSKrSSKJr SSKJrJrJrJ r \R"\RS9 \R"\ 5rSSKJrJr SSKJr SSKJr SSKJrJrJrJr S rS SK J!r! S SK"J#r# \"\$5RJRJS- S- r&\'"\&S5r(\RR"\(5r*\RWS\&35 SSS5 \!"\*SS\*SS\*SS\*S9r \#"\*5r-\"S5r.\.R_5S\4Sj5r/\.Ra5S\1S\\1\4S\4Sj5r0S \1S\1S\4S!jr2S \1S"\ \S#\ \\1S$\3S\4 S%jr4S \1S&\S\4S'jr5S \1S\1S&\S\4S(jr6S\1S\\1\4S\4S)jr7S*r8\ S+:Xa\Rr"\8"55 gg!\aV SS KJr SSKJr SSKJr SSKJrJrJrJr S rGNg!\a(r\R=S \35 \"S 5 SrCGN�SrCff=ff=f!,(df  GND=f!\,a'r\R=S\35 \"S 5 SrCGNoSrCff=f!\:a \;"S,5 g\,a*r\;"S-\35 SSK<r<\<Rz"5 SrCgSrCff=f).�N)�Path)�Any�Dict�List�Optional)�level)�Server�NotificationOptions)�InitializationOptions)� stdio_server)�Tool� TextContent�CallToolResult�ListToolsResultT)r FzMCP import failed: �)� ERPNextClient)�PermissionManager�configz config.json�r�Config loaded from: zFailed to load config: �erpnext�url�api_key� api_secret)rrrr�erpnext-mcp-server�returnc��R# �/nUR[SSS0S.S9[SSS0S.S9[SS S0S.S9[S S SS S SS.0S /S.S9/5 [R5nUGHn[R U5nSU;a�UR [SUR 5RSS5S3SUS3SSSS.SSS 0SS.SSSS S!.S".S.S95 UR [S#UR 5RSS5S$3S%US&3SS'S S(US)3S.0S'/S.S95 UR [S*UR 5RSS5S3S+US,3SS S-S.SS.SS/S!.S0.S1/S.S95 S2U;aNUR [S3UR 5RSS5S$3S4US)3SS5SS6US)3S.0S5/S.S95 S7U;aSUR [S8UR 5RSS5S$3S9US)3SS S(US:3S.SS;S.S<.S'S5/S.S95 S=U;dGM�UR [S>UR 5RSS5S$3S?US)3SS S(US@3S.SASBS.SC.S'SD/S.S95 GM UR[SESFSS SGS.S SHS.SI.S S'/S.S9[SJSKSS SGS.SSLS.SSS 0SM.SSS SN.SO.S /S.S9[SPSQSS SGS.SSRS.SS.S S5/S.S9[STSUSS SGS.S SHS.SSVS.SW./SWQS.S9[SXSYSS S SGS.0S /S.S9/5 [USZ9$7f)[z/List all available tools for ERPNext operations�test_connectionz!Test connection to ERPNext server�object)�type� properties)�name� description� inputSchema�get_system_infozGet ERPNext system information� list_doctypesz2List all configured doctypes and their permissions�get_doctype_permissionsz/Get detailed permissions for a specific doctype�doctype�stringz,Name of the doctype to check permissions for)r r#)r r!�required�read�list_� �_� _documentszList z documents with optional filterszFilters to apply to the query�arrayr zSpecific fields to retrieve)r �itemsr#�integerz'Maximum number of results (default: 20)r�d)r r#�minimum�maximum)�filters�fields�limit�get_� _documentz Get specific z document by namer"zName/ID of the z document�search_zSearch z documents by textz$Text to search for in document namesz'Maximum number of results (default: 10)�2)� search_termr8r=�create�create_z Create new �datazData for the new �update�update_zUpdate existing z document to updatezUpdated data for the document)r"r@�delete�delete_zDelete z document to delete�booleanzConfirmation flag for deletion)r"�confirmrF�get_generic_documentz$Get any document by doctype and namez Document typezDocument name/ID)r(r"�list_generic_documentszList documents for any doctypezFilters to apply)r r1)r r4r5)r(r6r7r8�create_generic_documentzCreate document for any doctypez Document data)r(r@�update_generic_documentzUpdate document for any doctypez Updated data)r(r"r@�get_doctype_schemaz#Get schema/metadata for any doctype)�tools) �extendr �permission_manager�get_all_doctypes�get_allowed_operations�append�lower�replacer)rL�configured_doctypesr(� allowed_opss �8C:\Users\hazem\OneDrive\Desktop\mcp_server\src\server.py� list_toolsrW:s���� �E� �L�L� �"�;�!)��<� � �"�8�!)��<� � � �L�!)��<� � �*�I� �� (�'U� �� '�K� � �!��@-�=�=�?��&��(�?�?��H� � �[� � �L�L���W�]�]�_�4�4�S�#�>�?�z�J�#�G�9�,L�M�$�%-�+J�$� %,�&,�h�%7�+H�#� %.�+T�'(�'*� "�#��� �4 �L�L���G�M�M�O�3�3�C��=�>�i�H�+�G�9�4E�F�$��$,�-<�W�I�Y�+O�!�#� "(�� � � � �L�L���w�}�}��6�6�s�C�@�A��L�%�g�Y�.@�A�$�%-�+Q�(� %.�+T�'(�')� "� #�"/���� �* �{� "� �L�L���w�}�}��6�6�s�C�@�A��K�)�'��)�<�$��$,�->�w�i�y�+Q�!�#� "(�� � � � �{� "� �L�L���w�}�}��6�6�s�C�@�A��K�.�w�i�y�A�$�%-�-<�W�I�EX�+Y�!� %-�+J�!� #�"(�� 0� �� �& �{� "� �L�L���w�}�}��6�6�s�C�@�A��K�%�g�Y�i�8�$�%-�-<�W�I�EX�+Y�!� %.�+K�$� #�"(�� 3� �� �S'�x �L�L� �'�>� �(0��Q�%-�>P�Q��'��/� � � �)�8� �(0��Q�(0�AS�T�'.�&�(�9K�L�&/�A�#�N� � '�K� � � �*�9� �(0��Q�%-�o�N��'��/� � � �*�9� �(0��Q�%-�>P�Q�%-�n�M�� 8�� � �%�=� ����Q��'�K� � �i?�?�B �� '�'�s �H(L'�/C8L'r"� argumentsc ���# �US:Xa:[R5IShv�N n[[SSU(aSOS3S9/S9$US :XaD[R 5IShv�N n[[SS [ R "US S 93S9/S9$US :Xam[R5n/nUH)n[RU5nURU5 M+ [[SS[ R "US S 93S9/S9$US:XakURS5nU(d[[SSS9/SS9$[RU5n[[SSUS[ R "US S 93S9/S9$US:Xa2[URS5URS55IShv�N $US:XaS[URS5URS5URS5URSS55IShv�N $US:Xa2[URS5URS55IShv�N $US:XaB[URS5URS5URS55IShv�N $US :XasURS5nU(d[[SSS9/SS9$[R!U5IShv�N n[[SS!US[ R "US S 93S9/S9$[#X5IShv�N $GN�GN�GNpGNN�N�NRN![$aAn [&R)S"U 35 [[SS#[+U 53S9/SS9sSn A $Sn A ff=f7f)$z,Handle all tool calls for ERPNext operationsrN�textzERPNext connection: u ✅ Connectedu ❌ Failed�r rZ��contentr%zERPNext System Info: ���indentr&zConfigured DocTypes: r'r(�❌ DocType parameter requiredT�r]�isErrorzPermissions for �: rGr"rHr6r7r8�rIr@rJrKz Schema for zTool execution error: u ❌ Error: )�erpnext_clientrrrr%�json�dumpsrNrO�get_doctype_summaryrQ�get�handle_get_document�handle_list_documents�handle_create_document�handle_update_document�get_doctype_meta�handle_dynamic_tool� Exception�logger�error�str) r"rX� connected�info�doctypes� summariesr(�summary�schema�es rV� call_toolr|!s����d � �$� $�,�<�<�>�>�I�!�$��/�9��R^�/_�`���� ��&� &�'�7�7�9�9�D�!�$��1�$�*�*�T�!�2L�1M�N���� ��_� $�)�:�:�<�H��I�#��,�@�@��I��� � ��)�$�"�$��1�$�*�*�Y�q�2Q�1R�S���� ��.� .��m�m�I�.�G��%�(�f�;[�\�]� ��� )�<�<�W�E�G�!�$��+�G�9�C�� � �7�ST�8U�7V�W���� ��+� +�,�� � �i�(�� � �f�%��� � �-� -�.�� � �i�(�� � �i�(�� � �h�'�� � �g�r�*� �� ��.� .�/�� � �i�(�� � �f�%��� � �.� .�/�� � �i�(�� � �f�%�� � �f�%��� � �)� )��m�m�I�.�G��%�(�f�;[�\�]� ��� *�:�:�7�C�C�F�!�$��&�w�i�s�4�:�:�f�Q�3O�2P�Q���� �-�T�=�=� =�w?�:�N� �� �D�>�� � �� � �-�a�S�1�2�� �f�[��Q���3I�J�K�� � �� �sI�M1�L#�L�!L#�M1�L#�!L�"+L#� M1�A2L#�M1�0L#�1M1�2?L#�1M1�23L#�%L�&L#�)M1�*AL#�>L�?L#�M1�3L#�6L�7L#�:M1�;AL#�>L�?L#�M1�0L#�3M1�4L#� L� .L#�;M1�<L#� L!� L#�M1�L#�L#�L#�L#�L#�L#�L#�!L#�# M.�-6M)�#M.�$M1�)M.�.M1r(c��# �U(aU(d[[SSS9/SS9$[RSU5up#U(d[[SSU3S9/SS9$[R X5IShv�N nUR S5(a[RUSU5nXTS'[[SUS US [R"US S 93S9/S 9$Nd7f)NrZu&❌ Both doctype and name are requiredr[Trbr+�❌ r@� document 'z': r^r_r\) rrrN�validate_operationrf�get_doctype_docrj�filter_allowed_fieldsrgrh)r(r"�allowed�reason�result� filtered_datas rVrkrk�s���� �$�� �f�3[�\�]�� � � )�;�;�F�G�L�O�G� �� �f�T�&��?�C�D�� � � "�1�1�'�@� @�F� �z�z�&���*�@�@����QX�Y� �&�v�� ����9�K��v�T�$�*�*�V�A�2N�1O�P� � � �� A�s�A/C�1C�2A%Cr6r7r8c��# �U(d[[SSS9/SS9$[RSU5upEU(d[[SSU3S9/SS9$U(a.[R U5nUVs/sH owU;dM UPM nn[ R XX#5IShv�N nURS 5(a8/n US H)n [RX�5n U RU 5 M+ X�S '[URS /55n [[SS U S US [R"US S93S9/S9$s snfN�7f)zHandle list documents operationrZrar[Trbr+r~Nr@zFound r-z documents: r^r_r\) rrrNr��get_allowed_fieldsrf�get_doctype_listrjr�rQ�lenrgrh) r(r6r7r8r�r��allowed_fields�fr�r��item� filtered_item�counts rVrlrl�sO��� �� �f�3S�T�U�� � � )�;�;�F�G�L�O�G� �� �f�T�&��?�C�D�� � � �+�>�>�w�G��#�;�V��N�':�!�V��;�!�2�2�7�V�S� S�F��z�z�&���� ��6�N�D�.�D�D�T�S�M� � � �� /�#�'�v�� �� � �6�2�&� '�E� ����%���'��-�� � �6�RS�8T�7U�V� � � ���<� S�s%�A0E�2 D<�?D<�E� E�!B!Er@c ��t# �U(aU(d[[SSS9/SS9$[RSX5up#U(d[[SSU3S9/SS9$[R X5n[ R X5IShv�N n[[SS US [R"US S 93S9/S 9$N/7f)z Handle create document operationrZu&❌ Both doctype and data are requiredr[Trbr>r~N�✅ z document created successfully: r^r_r\) rrrNr�r�rf�create_doctype_docrgrh)r(r@r�r�r�r�s rVrmrm�s���� �$�� �f�3[�\�]�� � � )�;�;�H�g�T�O�G� �� �f�T�&��?�C�D�� � � '�<�<�T�K�M�!�4�4�W�L� L�F� �����y� A�$�*�*�V�\]�B^�A_�`� � � ��M�s�BB8�B6�0B8c��# �U(aU(aU(d[[SSS9/SS9$[RSXU5up4U(d[[SSU3S9/SS9$[R X 5n[ R XU5IShv�N n[[SS US US [R"US S 93S9/S9$N27f)z Handle update document operationrZu,❌ DocType, name, and data are all requiredr[TrbrAr~Nr�rz' updated successfully: r^r_r\) rrrNr�r�rf�update_doctype_docrgrh)r(r"r@r�r�r�r�s rVrnrn�s���� �$�d�� �f�3a�b�c�� � � )�;�;�H�g�UY�Z�O�G� �� �f�T�&��?�C�D�� � � '�<�<�T�K�M�!�4�4�W�M�R� R�F� �����y� �D�6�1J�4�:�:�V\�ef�Kg�Jh�i� � � ��S�s�B C�C�3Cc���# �URS5n[U5S:a[[SSU3S9/SS9$USnUS S nS R S U55nUS :XaMUS S:XaD[ UUR S5UR S5UR SS55IShv�N $US:Xa+US S:Xa"[XQR S55IShv�N $US:Xa�US S:Xa�UR S5nUR SS5nU(d[[SSS9/SS9$[RXVU5IShv�N n[[SSUSUS[R"USS93S9/S 9$US!:Xa+US S:Xa"[XQR S"55IShv�N $US#:Xa<US S:Xa3[UUR S5UR S"55IShv�N $US$:Xa�US S:Xa�UR S5nUR S%S&5n U(aU (d[[SS'S9/SS9$[RS$XPS(9up�U (d[[SS)U 3S9/SS9$[R!XP5IShv�N n[[SS*US+US,[R"USS93S9/S 9$[[SS-U3S9/SS9$GN(GN�GN�GN7N�NV7f).z3Handle dynamically generated doctype-specific toolsr.�rZu❌ Invalid tool name: r[Trbrr�����r-c3�@# �UHoR5v� M g7f)N)� capitalize)�.0�words rV� <genexpr>�&handle_dynamic_tool.<locals>.<genexpr>s���C�]�T���(�(�]�s��list� documentsr6r7r8reNrj�documentr"�searchr=� u❌ Search term requiredzSearch results for 'z' in rdr^r_r\r>r@rArCrFFu8❌ Document name and confirmation required for deletion)� document_namer~r�rz' deleted successfully: u❌ Unknown tool: )�splitr�rr�joinrlrjrkrf�search_doctypesrgrhrmrnrNr��delete_doctype_doc) r"rX�parts� operation� doctype_partsr(r=r8r�rFr�r�s rVrprps8��� �J�J�s�O�E� �5�z�A�~�� �f�5L�T�F�3S�T�U�� � � �a��I��!�B�K�M��h�h�C�]�C�C�G��F��u�R�y�K�7�*� � �M�M�)� $� �M�M�(� #� �M�M�'�2� &�  � � � �e� ��b� �Z� 7�(��-�-��2G�H�H�H� �h� �5��9� �#;��m�m�M�2� �� � �g�r�*���!�$�&�7Q�R�S��� � &�5�5�g�E�R�R��� ��+�K�=��g�Y�c�$�*�*�U[�de�Jf�Ig�h��� � � �h� �5��9� �#:�+�G�]�]�6�5J�K�K�K� �h� �5��9� �#:�+� � �M�M�&� !� �M�M�&� !� � � � �h� �5��9� �#:��}�}�V�$���-�-� �5�1���7�!�$�&�7q�r�s��� � -�?�?��'�?�f����!�$�&��f�X��G�H��� � &�8�8��G�G��� ���G�9�K��v�5N�t�z�z�Z`�ij�Ok�Nl�m��� � �� �f�5G��v�3N�O�P�� � �C �I�S�L� �0H�sq�B'K!�)K�*0K!�K�A)K!�K�AK!�#K�$AK!�%K�&B"K!�K� A K!�K!�K!�K!�K!�K!c ���# �SSKnSSKn[S5 [S[35 [S5 [R 5IShv�N nU(a [S5 O [S5 [ R5n[SS RU535 [S 5 [5IShv�N upE[(a[5n[RU0S 9nO[R5n[RUU[!S S US95IShv�N SSS5IShv�N gN�N�![a [R5nN]f=fN=N/!,IShv�N (df  g=f!["a [S5 g[$aEn[SU35 [S5 UR&"5 UR)S5 SnAgSnAff=f7f)z,Main entry point for the enhanced MCP serverrNz'Starting Enhanced ERPNext MCP Server...rzTesting ERPNext connection...zERPNext connection successfulz7ERPNext connection failed, but server will start anywayzConfigured doctypes: z, z+Server ready and waiting for connections...)�notification_options�experimental_capabilitiesrz2.0.0)� server_name�server_version� capabilitiesz Server stopped by userzServer error: zFull traceback:r)�sys� traceback�print� config_pathrfrrNrOr�r �HAS_NOTIFICATION_OPTIONSr �app�get_capabilities� TypeError�runr �KeyboardInterruptrq� print_exc�exit) r�r�rurw� read_stream� write_streamr�r�r{s rV�mainr�bs������-� �7�8� �$�[�M�2�3� �-�.�(�8�8�:�:� � � �1� 2� �K� L�%�6�6�8�� �%�d�i�i��&9�%:�;�<� �;�<��>�>�%@�k� 6�+�+�+>�+@�(�#&�#7�#7�-A�24�$8�$�L� $'�#7�#7�#9�L��'�'���%� 4�#*�!-��� � �"�>�>�;�"��� 6�"�3�3�5� � 6�� �"�>�>�>��. �*� �(�)� �� ��q�c�"�#� �� ����� ���� � �� �s�� G&�?E>� D8� A,E>�8D:�9E>�<E$�)D<�)E$�*D<�>$E$�"E �#E$�' E>�2E"�3E>�7G&�8E>�:E>�<E�E$�E�E$�"E>�$E;�*E- �+ E;�7E>�:G&�;E>�>G#�G&� G#�;G�G&�G#�#G&�__main__z Goodbye!zFailed to start server: )>rg�asyncio�logging�pathlibr�typingrrrr� basicConfig�INFO� getLogger�__name__rr� mcp.serverr r �mcp.server.modelsr �mcp.server.stdior � mcp.typesr rrrr�� ImportErrorr{rsr�rfr� permissionsr�__file__�parentr��openr��load�CONFIGrvrqrNr�rWr|rtrk�intrlrmrnrpr�r�r�r�r�r���rV�<module>r�s�� ����,�,����'�,�,�'� � � �8� $���6�7�-��� $��*�*��8�n�#�#�*�*�X�5� �E� � � �k�3� �1����1���� � �*�;�-�8�9� ���y��%� � �9� �i� (��i� ��.� � �� '�v�.�� � !�"������c(�/�c(��c(�L����g �#�g �$�s�C�x�.�g �^�g ��g �T�s��#��.��8%��%�x��~�%�'/��S� �':�%�CF�%�KY�%�P�#��T��n��8�#��S������8W �C�W �D��c��N�W �~�W �t2�j �z���� � �D�F����E� ��%�;�1�P�P�#(� �� ��� � �*�1�#�.�/� �Q������ ��" � ��� � �L�L�*�1�#�.�/���G�G�� ��b �� �m�� �� �(���,�-���������s�� "F+� H�&'H � H�I �+H�2 G�H�G>�7H�>H�H� H�H�H�I �"I�I � J �J �! J�J 

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