Skip to main content
Glama
server.cpython-312.pyc18.1 kB
� �Kh�3���ddlZddlZddlmZddlmZddlmZddlm Z m Z ddl m Z ddl mZmZmZddlmZmZmZmZmZmZmZmZmZmZmZmZmZGd �d e �ZGd �d �Z e�e�Z!e"ejF�d kDr3ejFd Z$gd�Z%e$e%vre$e!_&e'de!jL���ed��Z(de fd�Z)e(jUddddh��de+e,eeffd��Z-e(jUdddh��dede+e,eeffd��Z.e(jUddd h��dede+e,eeffd!��Z/e(jUd"d#d$d%h��dede+e,eeffd&��Z0e(jUd'd(�)�d*e,de+e,eeffd+��Z1e(jUd,d-�)�de+e,eeeffd.��Z2e(jUd/d0�)�d*e,de+e,eeffd1��Z3e(jUd2d3�)�d*e,de+e,dffd4��Z4e(jUd5d6�)�d7e,de+e,eeffd8��Z5e(jUd9d:�)�d7e,de+e,dffd;��Z6e(jUd<d=d>h��de+e,eeeffd?��Z7d@�Z8e9dAk(re8�yy)B�N)�FastMCP)�get_http_headers)� load_dotenv)� BaseSettings�SettingsConfigDict)�Field)�Optional�List�Dict) �Grabba�Job� JobResult�JobStats�GetJobResponse�GetJobsResponse�JobExecutionStatus�GetJobResultResponse�JobExecutionResponse�JobCreationResponse�JobEstimatedCostResponse� PuppetRegion�JobStatsResponsec�|�eZdZUedd��Zeed<edd��Zeed<edd ��Z eed <e d d � �Z y)� ServerConfigi[ z&The PORT the MCP server should run on.)� description�PORTNz0The API key for accessing the Grabba python SDK.�API_KEY�stdioz'The transport protocol for the MCP mcp.�MCP_SERVER_TRANSPORTz.env�ignore)�env_file�extra) �__name__� __module__� __qualname__rr�int�__annotations__r�strrr� model_config���>/home/obaa/Documents/projects/grabba/v2/apps/mcp/src/server.pyrrsI���d�(P�Q�D�#�Q���+]�^�G�S�^� %�g�;d� e��#�e�%����Lr+rc�|�eZdZdefd�Zdeeeeffd�Zde deeee e ffd�Z de deeee ffd�Z de deeee ffd�Zd edeeee ffd �Zdeeee e ffd �Zd edeeee ffd �Zd edeed ffd�Zdedeeee ffd�Zdedeed ffd�Zdeeee e eefffd�Zy )� GrabbaService�api_keyc�>�|s td��t|�|_y)NzAPI Key cannot be empty.)� ValueErrorr �grabba)�selfr/s r,�__init__zGrabbaService.__init__s����7�8� 8��W�o�� r+�returnc��K� |jj�}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z(Fetch usage stats and user token balancezError fetching usage stats: N)r2� get_stats�message� job_stats� Exceptionr(�r3�result�errs r,�fetch_stats_datazGrabbaService.fetch_stats_data!sZ���� C�'+�{�{�'<�'<�'>�F��>�>�6�#3�#3�3� 3��� C�1�#�c�(��<�d�B� B�� C��0�A�16�A� A�A�A�A�A�A�extraction_datac���K� |jj|��}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z@Get the estimated cost of a job before creating or scheduling it��jobzError estimating job cost: N)r2�estimate_job_costr8�job_estimated_costr:r(�r3r@r<r=s r,rDzGrabbaService.estimate_job_cost)s`���� B�/3�{�{�/L�/L�Q`�/L�/a�F��>�>�6�#<�#<�<� <��� B�0��S�� �;�T�A� A�� B��1�A�38�A� A�A�A�A�A�Ac��.K� |jj|��}|jtjk(r|j }|j |fS|j |j fS#t$r}dt|���dfcYd}~Sd}~wwxYw�w)zUSchedule a new data extraction job. [Web Search Tool - when used with markdown tasks]rB�Error scheduling job: N) r2�extract�statusr�SUCCESS� job_resultr8r:r()r3r@r<rMr=s r,� extract_datazGrabbaService.extract_data1s����� =�+/�;�;�+>�+>�?�+>�+S�F��}�}� 2� :� :�:�(.�(9�(9� ��~�~�z�1�1��>�>�6�#4�#4�4� 4��� =�+�C��H�:�6��<� <�� =�sA�B�AA/�B�A/�.B�/ B�8B �B�B� B�Bc���K� |jj|��}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z8Create a new data extraction job (Without scheduling it)rBzError creating job: N)r2� create_jobr8rCr:r(rFs r,rPzGrabbaService.create_job<sZ���� ;�*.�+�+�*@�*@�_�*@�*U�F��>�>�6�:�:�-� -��� ;�)�#�c�(��4�d�:� :�� ;�rG�job_idc���K� |jj|��}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z+Schedule an existing job to run immediately)rQrIN)r2� schedule_jobr8rMr:r(�r3rQr<r=s r,rSzGrabbaService.schedule_jobDs\���� =�+/�;�;�+C�+C�6�+C�+R�F��>�>�6�#4�#4�4� 4��� =�+�C��H�:�6��<� <�� =�rGc��K� |jj�}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z#Fetch all jobs for the current user�Error fetching jobs: N)r2�get_jobsr8�jobsr:r(r;s r,�fetch_jobs_datazGrabbaService.fetch_jobs_dataLsU���� <�&*�k�k�&:�&:�&<�F��>�>�6�;�;�.� .��� <�*�3�s�8�*�5�t�;� ;�� <�r?c��K� |jj|�}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)zFetch details of a specific jobzError fetching job: N)r2�get_jobr8rCr:r(rTs r,�fetch_job_datazGrabbaService.fetch_job_dataTsW���� ;�%)�[�[�%8�%8��%@�F��>�>�6�:�:�-� -��� ;�)�#�c�(��4�d�:� :�� ;��1�A�27�A� A�A�A�A�A�ANc��K� |jj|�d|��dfS#t$r}dt|���dfcYd}~Sd}~wwxYw�w)zDelete a specific jobzSuccessfully deleted job NzError deleting job: )r2� delete_jobr:r()r3rQr=s r,�delete_job_datazGrabbaService.delete_job_data\sT���� ;� �K�K� "� "�6� *�.�v�h�7��=� =��� ;�)�#�c�(��4�d�:� :�� ;��.�A �!&�A � A �A�A �A �A � A � job_result_idc��K� |jj|�}|j|jfS#t$r}dt |���dfcYd}~Sd}~wwxYw�w)z Fetch results of a completed jobzError fetching job results: N)r2�get_job_resultr8rMr:r()r3rbr<r=s r,�fetch_job_result_dataz#GrabbaService.fetch_job_result_datads\���� C�+/�;�;�+E�+E�m�+T�F��>�>�6�#4�#4�4� 4��� C�1�#�c�(��<�d�B� B�� C�r]c��K� |jj|�d|��dfS#t$r}dt|���dfcYd}~Sd}~wwxYw�w)z!Delete results of a completed jobz Successfully deleted job result NzError deleting job results: )r2�delete_job_resultr:r()r3rbr=s r,�delete_job_result_dataz$GrabbaService.delete_job_result_datalsW���� C� �K�K� )� )�-� 8�5�m�_�E�t�K� K��� C�1�#�c�(��<�d�B� B�� C�rac��K� d|jj�fS#t$r}dt|���dfcYd}~Sd}~wwxYw�w)zSFetch all available puppet (web agent) regions for scheduling web data extractions.z&Fetched available regions successfullyrVN)r2�get_available_regionsr:r()r3r=s r,�fetch_available_regionsz%GrabbaService.fetch_available_regionstsH���� <�;�T�[�[�=^�=^�=`�`� `��� <�*�3�s�8�*�5�t�;� ;�� <�s,�A� �A� A�>�A�A�A�A)r#r$r%r(r4�tupler rr>r r rDr rNrPrSrYr\r`rerhrrkr*r+r,r.r.s���&��&� C��c�8�H�3E�.E�(F�C�B�s�B�u�S�(�SW�X[�S\�J]�E]�?^�B� =�#� =�%��X�d�^�@S�:T� =�;��;��c�8�C�=�>P�8Q�;�=��=��s�H�T�N�7J�1K�=�<�u�S�(�4��9�2E�-E�'F�<�;�3�;�5��h�s�m�9K�3L�;�;�C�;�E�#�t�)�4D�;�C��C��s�H�UY�N�GZ�A[�C�C�#�C�%��T� �BR�C�<�u�S�(�4��S�R^�M^�H_�C`�:a�5a�/b�<r+r.�)r�streamable-http�ssez1Overriding transport protocol from command line: z grabba-agent)�namer5c��K�t�}|jd�xstj}|s t d��t |��S�w)z� Resolves the GrabbaService dependency. This is called by each tool to get an authenticated GrabbaService instance. z x-api-keyzNAPI Key is missing. Provide it via X-API-Key header or GRABBA_API_KEY env var.�r/)r�get� server_config�GRABBA_API_KEYr1r.)�headersr/s r,�_get_grabba_service_instancerw�sC���� � �G��k�k�+�&�F�-�*F�*F�G� ��i�j�j� �� )�)�s�AA r>zXFetches usage statistics and current user token balance for Grabba. Takes no parameters.�billing�usage)rpr�tagsc��fK�t��d{���}|j��d{���S7�7��w�N)rwr>��grabba_services r,�fetch_stats_data_toolr�s.���� 8�9�9�N��0�0�2� 2�2�:�� 2���1�-�1�/�1�1rDzyEstimates the cost of a Grabba job before creation or scheduling. Requires a 'Job' object detailing the extraction tasks.r@c��hK�t��d{���}|j|��d{���S7�7��wr|)rwrD�r@r~s r,�estimate_job_cost_toolr��s0���� 8�9�9�N��1�1�/�B� B�B�:�� B���2�.�2�0�2�2rPz�Creates a new data extraction job in Grabba without immediately scheduling it for execution. Requires a 'Job' object detailing the extraction tasks.� managementc��hK�t��d{���}|j|��d{���S7�7��wr|)rwrPr�s r,�create_job_toolr��s0���� 8�9�9�N��*�*�?�;� ;�;�:�� ;�r�rNzhSchedules a new data extraction job with Grabba. Requires a 'Job' object detailing the extraction tasks.�catalog�searchc��K�t�}|jdtj�}t |��}|j |��d{���S7��w�Nr/rr)rrsrtrr.rN)r@rvr/r~s r,�extract_data_toolr��sG����� �G��k�k�)�]�%:�%:�;�G�"�7�3�N��,�,�_�=� =�=� =���A A� A�A�schedule_existing_jobz_Schedules an existing Grabba job to run immediately. Requires the 'job_id' of the existing job.)rprrQc��K�t�}|jdtj�}t |��}|j |��d{���S7��wr�)rrsrtrr.rS�rQrvr/r~s r,�schedule_job_toolr��sG���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��,�,�V�4� 4�4� 4�r��fetch_all_jobszBFetches all Grabba jobs for the current user. Takes no parameters.c��K�t�}|jdtj�}t |��}|j ��d{���S7��wr�)rrsrtrr.rY)rvr/r~s r,�fetch_jobs_data_toolr��sE���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��/�/�1� 1�1� 1�s�A A� A� A�fetch_specific_jobzUFetches details of a specific Grabba job by its ID. Requires the 'job_id' of the job.c��K�t�}|jdtj�}t |��}|j |��d{���S7��wr�)rrsrtrr.r\r�s r,�fetch_job_data_toolr��sG���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��.�.�v�6� 6�6� 6�r�r_zJDeletes a specific Grabba job. Requires the 'job_id' of the job to delete.c��K�t�}|jdtj�}t |��}|j |��d{���S7��wr�)rrsrtrr.r`r�s r,�delete_job_data_toolr��sG���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��/�/��7� 7�7� 7�r��fetch_job_resultzgFetches results of a completed Grabba job by its result ID. Requires the 'job_result_id' of the result.rbc��K�t�}|jdtj�}t |��}|j |��d{���S7��wr�)rrsrtrr.re�rbrvr/r~s r,�fetch_job_result_data_toolr�sG���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��5�5�m�D� D�D� D�r�rgz`Deletes results of a completed Grabba job. Requires the 'job_result_id' of the result to delete.c��K�t�}|jdtj�}t |��}|j |��d{���S7��wr�)rrsrtrr.rhr�s r,�delete_job_result_data_toolr�sG���� � �G��k�k�)�]�%:�%:�;�G�"�7�3�N��6�6�}�E� E�E� E�r�rkz�Fetches a list of all available puppet (web agent) regions that can be used for scheduling web data extractions. Takes no parameters.� configurationc��fK�t��d{���}|j��d{���S7�7��wr|)rwrkr}s r,�fetch_available_regions_toolr�s.���� 8�9�9�N��7�7�9� 9�9�:�� 9�r�c���tjdk(rEtd�tjt j dtjd���ytjdk(rEtd�tjt jdtjd���ytjs td��td �tjt j��y) Nrnz9Starting Grabba MCP server (streamable-http transport)...z0.0.0.0�/)�host�port�pathroz-Starting Grabba MCP server (sse transport)...z%API Key required for stdio transport.z/Starting Grabba MCP server (stdio transport)...) rtr�print�asyncio�run�mcp�run_streamable_http_asyncr� run_sse_asyncrr1�run_stdio_asyncr*r+r,�mainr�)s����)�)�->�>� �I�J�� � �C�1�1���#�#��2� � � � +� +�u� 4� �=�>�� � �C�%�%���#�#��&� � ��$�$��D�E� E� �?�@�� � �C�'�'�)�*r+�__main__):�sysr��fastmcpr�fastmcp.server.dependenciesr�dotenvr�pydantic_settingsrr�pydanticr�typingr r r r2r r rrrrrrrrrrrrr.rt�len�argv� transport�valid_transportsrr�r�rw�toolrlr(rr�r�r�r�r�r�r�r�r�r�r�r#r*r+r,�<module>r�s��� ���8��>��'�'������<��^<�^<�D � ��� ��s�x�x�=�1������ �I�:���$�$�-6� �*� �A�-�Bd�Bd�Ae�f�g��>�"�� *�M� *�(��� �j� �W� � �� 3�U�3���0B�+B�%C�3� � 3� ��� �L� �� �� C�#�C�%��X�d�^�@S�:T�C� � C� ��� �g� �� �� <�3�<�5��h�s�m�9K�3L�<� � <� ��� �z� �X� � �� >�S�>�U�3����;N�5O�>� � >���� �q� ��5�C�5�E�#�x��~�2E�,F�5� �5���� �T� ��2�E�#�x��S� �/B�*B�$C�2� �2���� �g� ��7�c�7�e�C��#��4F�.G�7� �7���� �\� ��8�s�8�u�S�$�Y�/?�8� �8���� �y� ��E�C�E�E�#�x�PT�~�BU�<V�E� �E���� �r� ��F�S�F�U�3��9�=M�F� �F���� "�X� � � �� :�E�#�x��\�@R�7S�2S�,T�:� � :� +�8 �z���F�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/grabba-dev/grabba-mcp'

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