Skip to main content
Glama
pshempel

MCP Time Server Node

by pshempel
rate_limit_stress.cpython-311.pyc15 kB
� k�h�0���dZddlZddlZddlZddlZddlmZddlmZm Z m Z ddl Z ddl m Z ddl Z Gd�d��ZdS)zq Rate limiting stress tester for MCP Time Server Tests various rate limiting scenarios including bypass attempts �N)�Path)�Dict�Any�List)�datetimec�0�eZdZdZddedefd�Zdeeeffd�Z dd edeeeffd �Z dd edeeeffd�Z ddedeeeffd�Z deeefdefd�Z dejfd�Zdejfd�Zdeeefdejdeeeffd�ZdS)�RateLimitStressTesterz(Stress test rate limiting implementation�d�`�� rate_limit� window_msc��||_||_tt��jdz |_|j�d���dS)z#Initialize rate limit stress tester�resultsT)�exist_okN)r r r�__file__�parent� results_dir�mkdir)�selfr r s �H/home/pshempel/src/local/time-node_tdd/tests/stress/rate_limit_stress.py�__init__zRateLimitStressTester.__init__sF��$���"�����>�>�0�9�<��� ������-�-�-�-�-��returnc ��td|j�d���dtj�����|j|jddgd�}|���} t|jdz��D]�}|�d|dzdd id �d �|��}d |vrR|d � d ��dkr|dxxdz cc<�W|d� |d ���y|dxxdz cc<��td|d����td|d����td|j�d���|� |��n#|� |��wxYw|S)z8Test sending burst of requests at exactly the rate limitz Testing burst at limit (z requests)...�burst_at_limitr)�scenario� timestampr r �successful_requests�rate_limited_requests�errors��2.0� tools/call�get_current_time��name� arguments��jsonrpc�id�method�params�error�code����rr rz Successful: z Rate limited: z Expected: z successful, 1 rate limited) �printr r�now� isoformatr � _start_server�range� _send_request�get�append� _stop_server)r�result�server_process�i�responses r�test_burst_at_limitz)RateLimitStressTester.test_burst_at_limits��� �I�4�?�I�I�I�J�J�J�)�!����1�1�3�3��/���#$�%&�� � ���+�+�-�-�� .��4�?�Q�.�/�/� 7� 7���-�-�$��a�%�*� 2�%'��� /�/�"�#�#���h�&�&���(�,�,�V�4�4��>�>��6�7�7�7�1�<�7�7�7�7��x�(�/�/���0A�B�B�B�B��0�1�1�1�Q�6�1�1�1�1� �B�6�*?�#@�B�B� C� C� C� �F�V�,C�%D�F�F� G� G� G� �M���M�M�M� N� N� N� � � �n� -� -� -� -��D� � �n� -� -� -� -����� s �%C)E$�$E;��num_connectionsc �2�td|�d���dtj�����||jgddd�}g}t |��D]�}|���}|�|��|ddd�}t |j��D]g}|�d|d zd d id �d �|��}d|vr0|d� d��dkr|dxxd z cc<�W|dxxd z cc<�h|d�|��|dxx|dz cc<��|d|jkr6d|d<td|d�d���td|j�d���|D]}|� |���|S)z8Test multiple parallel connections to bypass rate limitsz Testing z parallel connections...�parallel_connectionsrF)rrr?r � connections�total_requests�bypass_detected)� connection_idrrr"r!r#r$r%r(r-r.r/rrrBrCTrDu ⚠️ Bypass detected: z total requestsz (Expected max: �)) r0rr1r2r r4r3r7r5r6r8) rr?r9�serversr;�server�connection_result�jr<s r�test_parallel_connectionsz/RateLimitStressTester.test_parallel_connectionsLs@�� �D�?�D�D�D�E�E�E�/�!����1�1�3�3�.��/���$� � ������'�'� Q� Q�A��'�'�)�)�F� �N�N�6� "� "� "�"#�'(�)*�!�!� ��4�?�+�+� B� B���-�-�$��a�%�*� 2�%'��� /�/������h�&�&�8�G�+<�+@�+@��+H�+H�F�+R�+R�%�&=�>�>�>�!�C�>�>�>�>�%�&;�<�<�<��A�<�<�<�<� �=� !� (� (�):� ;� ;� ;� �#� $� $� $�(9�:O�(P� P� $� $� $� $� �"� #�d�o� 5� 5�(,�F�$� %� �Y��7G�0H�Y�Y�Y� Z� Z� Z� �;���;�;�;� <� <� <�� &� &�F� � � �f� %� %� %� %�� r��duration_secondsc ���td|�d���|���}|j}tj|��}|���jdz dz }dtj��� ��||dddd�} tj ��}d}tj ��|z |kr{t|j dz ��D]5} |� d|d d id �d �|��} |dz }|d xxdz cc<�6tjd��tj ��|z |k�{|���jdz dz } | |d<| |z |d<td|d�d���td| d�d���td|dd�d���td|d ����|�|��n#|�|��wxYw|S)z=Test memory exhaustion by sending limit-1 requests repeatedlyz' Testing memory exhaustion prevention (zs)...i�memory_exhaustionr)rrrM�memory_start_mb� memory_end_mb�memory_growth_mb� requests_mader!r"r#r$r%r(rS皙�����?rQrRz Memory start: z.1fz MBz Memory end: z Growth: z Requests made: )r0r3�pid�psutil�Process� memory_info�rssrr1r2�timer4r r5�sleepr8) rrMr:� server_pid�process� memory_startr9� start_time� request_idr;r<� memory_ends r�test_memory_exhaustionz,RateLimitStressTester.test_memory_exhaustion�s^�� �P�9I�P�P�P�Q�Q�Q��+�+�-�-��$�'� ��.��,�,���*�*�,�,�0�4�7�$�>� �,�!����1�1�3�3� 0�+�� !�� � ��! .�����J��J��)�+�+� �*�-=�=�=��t���2�3�3� 1� 1�A�#�1�1�#(�(�".�$6�)+�#�#� 3�3�&� '� '�H��!�O�J��?�+�+�+�q�0�+�+�+�+�� �3����!�)�+�+� �*�-=�=�=�&!�,�,�.�.�2�T�9�D�@�J�&0�F�?� #�)3�l�)B�F�%� &� �:�\�:�:�:�:� ;� ;� ;� �6�:�6�6�6�6� 7� 7� 7� �B�v�&8�9�B�B�B�B� C� C� C� �?�f�_�&=�?�?� @� @� @� � � �n� -� -� -� -��D� � �n� -� -� -� -����� s �D0G�G-� num_cyclesc ���td|�d���dtj�����||jgdddd�}t |��D�]}|���}|dzddd�}t |jdz��D]g}|�d|dzd d id �d �|��}d |vr0|d �d��dkr|dxxdz cc<�W|dxxdz cc<�h|d� |��|dxx|dz cc<|dxx|dz cc<|� |��tj d����||d<td|d����td|d����td|d����|d|jkr td|d�d|j����|S)z5Test rapid disconnect/reconnect to bypass rate limitsz Testing rapid reconnect (z cycles)...�rapid_reconnectr)rrrcr �cyclesrC�expected_limited�actual_limitedr!)�cyclerrr"r#r$r%r(r-r.r/rrrfrCrhrTrgz Total requests: z Expected rate limited: z Actual rate limited: u ⚠️ Bypass via reconnect: z > ) r0rr1r2r r4r3r5r6r7r8rZr[)rrcr9rirH� cycle_resultr;r<s r�test_rapid_reconnectz*RateLimitStressTester.test_rapid_reconnect�s��� �C�J�C�C�C�D�D�D�*�!����1�1�3�3�$��/��� !��  �  ���:�&�&�# �# �E��'�'�)�)�F����'(�)*���L��4�?�Q�.�/�/� =� =���-�-�$��a�%�*� 2�%'��� /�/������h�&�&�8�G�+<�+@�+@��+H�+H�F�+R�+R� �!8�9�9�9�Q�>�9�9�9�9� �!6�7�7�7�1�<�7�7�7�7� �8� � #� #�L� 1� 1� 1� �#� $� $� $� �5J�(K� K� $� $� $� �#� $� $� $� �5L�(M� M� $� $� $� � � �f� %� %� %� �J�s�O�O�O�O�&0��!�"� �=�6�*:�#;�=�=�>�>�>� �F�&�1C�*D�F�F�G�G�G� �B��/?�(@�B�B�C�C�C� �"� #�d�o� 5� 5� �c�V�<L�5M�c�c�RV�Ra�c�c� d� d� d�� rrc� �tj���d��}d|�d�}|j|z }t |d��5}t j||d���ddd��n #1swxYwYt|��S)zSave test results to JSON filez %Y%m%d_%H%M%S�rate_limit_test_z.json�w�)�indentN)rr1�strftimer�open�json�dump�str)rrr�filename�filepath�fs r� save_resultsz"RateLimitStressTester.save_resultss����L�N�N�+�+�O�<�<� �6�i�6�6�6���#�h�.�� �(�C� � � ,�A� �I�g�q�� +� +� +� +� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,� ,���� ,� ,� ,� ,��8�}�}�s�A+�+A/�2A/c ��tj���}t|j��|d<t|j��|d<t j}tj |tj tj tj |dd���}tj d��dddd id d d �d �d�}|j �tj|��dz��|j ���|j���}|r0tj|��}d|vrt+d|d����|S)z0Start MCP server with custom rate limit settings� RATE_LIMIT�RATE_LIMIT_WINDOWTr)�stdin�stdout�stderr�env�text�bufsizer!r"� initializez 2024-11-05zrate-limit-stress-testerz1.0.0)r&�version)�protocolVersion� capabilities� clientInfor(� r-zInitialization error: )�os�environ�copyrur r �config�SERVER_COMMAND� subprocess�Popen�PIPErZr[r}�writers�dumps�flushr~�readline�loadsr0)rr��cmdr]� init_request� init_responser<s rr3z#RateLimitStressTester._start_server sP���j�o�o�������0�0��L��#&�t�~�#6�#6�� � ��#���"� ��/��?��?���� � � �� � �1� � � ���"�#/� "�6�&�����  �  � � � ���D�J�|�4�4�t�;�<�<�<�� ������ ��/�/�1�1� � � D��z�-�0�0�H��(�"�"��B�x��/@�B�B�C�C�C��rr]c��|r�|�����|j���|j���|j���|��� |�d���dS#tj$r,|� ��|���YdSwxYwdSdS)zStop MCP server gracefullyNro)�timeout) �pollr}�closer~r� terminate�waitr��TimeoutExpired�kill)rr]s rr8z"RateLimitStressTester._stop_server:s��� � �w�|�|�~�~�-� �M� � � !� !� !� �N� � � "� "� "� �N� � � "� "� "� � � � � � � �� � �Q� �'�'�'�'�'���,� � � �� � ����� � ������� ���� � �-�-s�7B�7C � C �requestc�Z� tj|��dz}|j�|��|j���|j���}|rtj|��Sdddd�iS#t$r}ddt|��d�icYd}~Sd}~wwxYw)zSend JSON-RPC request to serverr�r-i����z No response)r.�messageN) rsr�r}r�r�r~r�r�� Exceptionru)rr�r]� request_str� response_line�es rr5z#RateLimitStressTester._send_requestGs��� B��*�W�-�-��4�K� �M� � � � ,� ,� ,� �M� � � !� !� !�$�N�3�3�5�5�M�� M��z�-�0�0�0��&�]�!K�!K�L�L��� B� B� B��f��Q���@�@�A� A� A� A� A� A� A����� B���s$�A8B�;B� B*� B%�B*�%B*N)r r )r>)rL)�__name__� __module__� __qualname__�__doc__�intrrrurr=rKrbrkryr�r�r3r8r5�rrr r s�������2�2�.�.�3�.��.�.�.�.�.�T�#�s�(�^�.�.�.�.�`8�8��8�T�#�s�(�^�8�8�8�8�t8�8�s�8�4��S��>�8�8�8�8�t>�>�s�>�4��S��>�>�>�>�>�@ �D��c��N� �s� � � � �-�z�/�-�-�-�-�^ �J�$4� � � � �B�T�#�s�(�^�B�j�>N�B�SW�X[�]`�X`�Sa�B�B�B�B�B�Brr )r�rsrZr�r��pathlibr�typingrrrrVrr�r r�rr�<module>r�s�����  � � � � � � � ����� � � � �������"�"�"�"�"�"�"�"�"�"� � � � ������� � � � �DB�DB�DB�DB�DB�DB�DB�DB�DB�DBr

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/pshempel/mcp-time-server-node'

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