Skip to main content
Glama

MCP Starter for Puch AI

by Kulraj69
mcp_starter.cpython-311.pyc26.9 kB
� %�h�D��( �ddlZddlmZmZddlZddlmZddlmZddl m Z m Z ddl m Z mZddlmZddlmZmZmZmZdd lmZmZmZddlZddlZddlZddlZddlZej�ej� ej�!e"��d d ����dd l#m$Z$dd l%m%Z%e��ej&�'d��Z(ej&�'d��Z)e(� Jd���e)� Jd���Gd�de ��Z*Gd�de��Z+Gd�d��Z,ede*e(�����Z e j-de.fd���Z/e+ddd���Z0e �-e0�1��� �� dQd"ee.ed#� ��fd$ee.dzed%� ��fd&eedzed'� ��fd(ee2ed)� ��fde.f d*���Z3e+d+d,d-���Z4e �-e4�1��� �� dRd.ee.ed/� ��fde5eezfd0���Z6e �-d1� �� dRd2ee.ed3� ��fd4ee.ed5� ��fd6ee5e.dzed7� ��fde.fd8���Z7e �-d9� ��d2ee.ed3� ��fde.fd:���Z8e �-d;� �� dRd2ee.ed3� ��fd<ee9ed=� ��fd>eee.dzed?� ��fde.fd@���Z:e �-dA� �� dSd2ee.ed3� ��fd<ee9edC� ��fdDee.edE� ��fde.fdF���Z;e �-dG� �� dRd2ee.ed3� ��fd<ee9edC� ��fdHee.edI� ��fdJee.dzedK� ��fde.f dL���Z<e �-dM� ��d2ee.ed3� ��fde.fdN���Z=dO�Z>e?dPkrej@e>����dSdS)T�N)� Annotated�List)� load_dotenv)�FastMCP)�BearerAuthProvider� RSAKeyPair)� ErrorData�McpError)� AccessToken)� TextContent� ImageContent�INVALID_PARAMS�INTERNAL_ERROR)� BaseModel�Field�AnyUrlz..�data)�create_db_and_tables)�visibility_service� AUTH_TOKEN� MY_NUMBERz'Please set AUTH_TOKEN in your .env filez&Please set MY_NUMBER in your .env filec�:��eZdZdef�fd� Zdededzfd�Z�xZS)�SimpleBearerAuthProvider�tokenc���tj��}t���|jddd���||_dS)N)� public_key�jwks_uri�issuer�audience)r�generate�super�__init__rr)�selfr�k� __class__s ��mcp-bearer-token/mcp_starter.pyr"z!SimpleBearerAuthProvider.__init__$s@��� � � !� !�� �����A�L�4��W[��\�\�\��� � � ��returnNc��HK�||jkrt|ddgd���SdS)Nz puch-client�*)r� client_id�scopes� expires_at)rr )r#rs r&�load_access_tokenz*SimpleBearerAuthProvider.load_access_token)s?���� �D�J� � ���'��u�� ��� � �tr')�__name__� __module__� __qualname__�strr"r r.� __classcell__)r%s@r&rr#sk��������c������� �S��[�4�5G��������r'rc�8�eZdZUeed<eed<dZedzed<dS)�RichToolDescription� description�use_whenN� side_effects)r/r0r1r2�__annotations__r8�r'r&r5r54s;������������M�M�M�#�L�#��*�#�#�#�#�#r'r5c ��eZdZdZe ddedededeeeffd���Ze dedefd ���Z e dd ed e de efd ���Z dS)�FetchzPuch/1.0 (Autonomous)F�url� user_agent� force_rawr(c ��JK�tj��4�d{V��} |�|dd|id����d{V��}n@#tj$r.}t t t d|�d|��������d}~wwxYw|jdkr.t t t d|�d |j��������|j}ddd���d{V��n#1�d{V��swxYwY|j �d d ��}d |v} | r|s|� |��d fS|d |�d�fS)NT� User-Agent�)�follow_redirects�headers�timeoutzFailed to fetch �: ��code�messagei�z - status code z content-type�z text/htmlz Content type z@ cannot be simplified to markdown, but here is the raw content: ) �httpx� AsyncClient�get� HTTPErrorr r r� status_code�textrD�extract_content_from_html) �clsr=r>r?�client�response�e�page_raw� content_type� is_page_htmls r&� fetch_urlzFetch.fetch_url=sB�����$�&�&� %� %� %� %� %� %� %�&� h�!'����%)�)�:�6�� ",�"�"���������� �?� h� h� h��y�n�Fe�Y\�Fe�Fe�`a�Fe�Fe�f�f�f�g�g�g����� h�����#�s�*�*��y�n�GD�Y\�GD�GD�mu�nB�GD�GD� E� E� E�F�F�F��}�H� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %� %���� %� %� %� %�  �'�+�+�N�B�?�?� �"�l�2� � � ?� � ?��0�0��:�:�B�>� >� � k�L� k� k� k� � s4�C�!A�C�A=�)A8�8A=�=AC� C�C�htmlc���tj�|d���}|r|�d��sdSt j|dtj���}|S)z4Extract and convert HTML content to Markdown format.T)�use_readability�contentz5<error>Page failed to be simplified from HTML</error>)� heading_style)� readabilipy� simple_json�simple_json_from_html_stringrM� markdownify�ATX)rZ�retr]s r&rQzFetch.extract_content_from_html_sc���%�B�B�4�Y]�B�^�^��� K�#�'�'�)�,�,� K�J�J��)�#�i�.� ��X�X�X���r'��query� num_resultsc��$K�d|�dd����}g}tj��4�d{V��}|�|dtji����d{V��}|jdkrdgcddd���d{V��S ddd���d{V��n#1�d{V��swxYwYd d lm}||j d ��}|� d d d���D]8}|d} d| vr|� | ��t|��|krn�9|pdgS)z� Perform a scoped DuckDuckGo search and return a list of job posting URLs. (Using DuckDuckGo because Google blocks most programmatic scraping.) z$https://html.duckduckgo.com/html/?q=� �+NrA)rD��z(<error>Failed to perform search.</error>r)� BeautifulSoupz html.parser�a� result__aT)�class_�hrefrp�httpz <error>No results found.</error>) �replacerKrLrMr<� USER_AGENTrO�bs4rlrP�find_all�append�len) rfrg�ddg_url�linksrS�resprl�souprmrps r&�google_search_linkszFetch.google_search_linkshs8���� S����s�C�9P�9P�R�R�����$�&�&� D� D� D� D� D� D� D�&����G�l�E�DT�5U��V�V�V�V�V�V�V�V�D���3�&�&�B�C� D� D� D� D� D� D� D� D� D� D� D� D� D� D�&� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D� D���� D� D� D� D� &�%�%�%�%�%��}�T�Y� �6�6�����s�;�T��B�B� � �A��V�9�D���~�~�� � �T�"�"�"��5�z�z�[�(�(���)��<�;�<�<s�7B� B�!BN)F)re)r/r0r1rs� classmethodr2�bool�tuplerY� staticmethodrQ�int�listr|r:r'r&r<r<:s�������(�J��  �  � � � �� ��  � �s�C�x��  � � ��[� �B���������\���=�=��=�3�=�t�C�y�=�=�=��\�=�=�=r'r<zJob Finder MCP Server)�authr(c��K�tS�N)rr:r'r&�validater��s ���� �r'zTSmart job tool: analyze descriptions, fetch URLs, or search jobs based on free text.zNUse this to evaluate job descriptions or search for jobs using freeform goals.zBReturns insights, fetched job descriptions, or relevant job links.)r6r7r8)r6F� user_goalzAThe user's goal (can be a description, intent, or freeform query)�job_descriptionz(Full job description text, if available.�job_urlz&A URL to fetch a job description from.�rawzReturn raw HTML content if Truec��$K�|rd|����d|�d�S|r[t�t|��tj|����d{V��\}}d|�d|����d|�d�Sd |���vsd |���vrFt�|���d{V��}d |�d �d �d�|D����zStttd������)zj Handles multiple job discovery methods: direct description, URL fetch, or freeform search query. u'📝 **Job Description Analysis** --- z --- User Goal: **ud** 💡 Suggestions: - Tailor your resume. - Evaluate skill match. - Consider applying if relevant.)r?Nu'🔗 **Fetched Job Posting from URL**: z --- z**zlook for�findu🔍 **Search Results for**: _z_ � c3� K�|] }d|��V�� dS)z- Nr:)�.0�links r&� <genexpr>zjob_finder.<locals>.<genexpr>�s(����4�4�d�k�4�k�k�4�4�4�4�4�4r'zSPlease provide either a job description, a job URL, or a search query in user_goal.rG) �stripr<rYr2rs�lowerr|�joinr r r)r�r�r�r�r]�_rys r&� job_finderr��s������ � s�#�)�)�+�+� s� s�%� s� s� s� �� � �?�?�3�w�<�<��9I�UX�?�Y�Y�Y�Y�Y�Y�Y�Y� ��� *�g� *� *��M�M�O�O� *� *�%� *� *� *� � �Y�_�_�&�&�&�&�&�I�O�O�4E�4E�*E�*E��/�/� �:�:�:�:�:�:�:�:�� =�Y� =� =� =� �I�I�4�4�e�4�4�4� 4� 4� 5� � �9�.�;P�Q�Q�Q� R� R�Rr'z0Convert an image to black and white and save it.zeUse this tool when the user provides an image URL and requests it to be converted to black and white.zBThe image will be processed and saved in a black and white format.�puch_image_dataz7Base64-encoded image data to convert to black and whitec ��@K�ddl}ddl}ddlm} |�|��}|�|�|����}|�d��}|���}|�|d���|� ��}|� |��� d��} tdd| � ��gS#t$r5} ttt t#| ��� �����d} ~ wwxYw) Nr)�Image�L�PNG)�formatzutf-8�imagez image/png)�type�mimeTyperrG)�base64�io�PILr�� b64decode�open�BytesIO�convert�save�getvalue� b64encode�decoder � Exceptionr r rr2) r�r�r�r�� image_bytesr��bw_image�buf�bw_bytes� bw_base64rUs r&�make_img_black_and_whiter��s �����M�M�M� �I�I�I������� G��&�&��7�7� �� � �2�:�:�k�2�2�3�3���=�=��%�%���j�j�l�l��� � �c�%� �(�(�(��<�<�>�>���$�$�X�.�.�5�5�g�>�>� ��'�K�i�P�P�P�Q�Q�� �G�G�G��y�n�c�!�f�f�E�E�E�F�F�F�����G���s�C C� D�(0D�Dz;Add or update a tracked query for LLM visibility monitoring� bearer_tokenzAuthentication tokenrfzThe search query to track� competitorsz$List of competitor brands to monitorc ��FK�|tkr#tttd������ t jt ||���d{V��}d|d��S#t$r8}tttdt|����������d}~wwxYw)z7Add or update a tracked query for visibility monitoring�Invalid bearer tokenrGNu*✅ Query tracked successfully! Query ID: �query_idzFailed to add tracking query: ) �TOKENr r rr�add_tracking_queryrr�rr2)r�rfr��resultrUs r&r�r��s������u����y�n�>T�U�U�U�V�V�V�j�)�<�Y��{�[�[�[�[�[�[�[�[��P�F�:�<N�P�P�P�� �j�j�j��y�n�>g�_b�cd�_e�_e�>g�>g�h�h�h�i�i�i�����j���s�+A� B �(3B�B �%List all tracked queries for the userc ��K�|tkr#tttd������ t jt ��}|dsdSd�d�|dD����}d|��S#t$r8}tttdt|����������d }~wwxYw) r�r�rG�queriesuJ📝 No tracked queries found. Use add_tracking_query to start monitoring.r�c ��g|]E}d|d�d|d�d|drd�|d��nd�d|d ����FS) u• **� query_textz** (ID: �idz) Competitors: r��, z Auto-detectz Created: � created_at)r�)r��qs r&� <listcomp>z(list_tracked_queries.<locals>.<listcomp>�s���" �" �" �� l�Q�|�_� l� l�a��g� l� l�hi�jw�hx�JL����ST�Ub�Sc�Id�Id�Id�L� l� l�[\�]i�[j� l� l�" �" �" r'u📊 **Tracked Queries:** zFailed to list queries: N) r�r r rr�list_tracked_queriesrr�r�rr2)r�r�� queries_textrUs r&r�r��s����� �u����y�n�>T�U�U�U�V�V�V� d�#�8��C�C���i� � `�_�_��y�y�" �" ��I�&�" �" �" � � � �>�|�=�=�=�� �d�d�d��y�n�>a�Y\�]^�Y_�Y_�>a�>a�b�b�b�c�c�c�����d���s�!A?�)A?�? C� 3B<�<Cz>Run visibility check for a specific query across LLM platformsr�z ID of the tracked query to check� platformsz>List of platforms to check (default: azure_openai, perplexity)c ��dK�|tkr#tttd������ t jt ||���d{V��}d|vr d|d��S|d}d|d�d �}|d z }|d D]T}|d d krdnd}||�d|d�d|d ��z }|�d��r|d|d�d�z }|dz }�U|dr"|dd�|d���d�z }|dr)|dz }|dD]}|d|d�d|dd�d�z }�|d r0|d!z }|d dd"�D]} |d| d#�d| d$�d%�z }�|S#t$r8} tttd&t| ����������d} ~ wwxYw)'z)Run visibility check for a specific queryr�rGN�error� ❌ Error: �summaryu+🔍 **Visibility Check Results** (Run ID: �run_idz) z**Platform Status:** r��status�ok�✅�❌ri�platformrF�last_latency_msz (zms)r�� top_brandsz **Top Brands Mentioned:** r��share_of_voicez **Share of Voice:** �• �brand�overall�.1%�top_citation_domains� **Top Citation Domains:** re�domain�count� citations z Failed to run visibility check: ) r�r r rr�run_visibility_checkrrMr�r�rr2) r�r�r�r�r�rTr�� status_emoji�sovr�rUs r&r�r��s������u����y�n�>T�U�U�U�V�V�V�&l�)�>�y�(�T]�^�^�^�^�^�^�^�^�� �f� � �2����2�2� 2���#��Y���AQ�X�X�X�� �,�,��� �,� � �H�$,�X�$6�$�$>�$>�5�5�E�L� �<�V�V�(�:�*>�V�V�(�8�BT�V�V� V�H��|�|�-�.�.� B��A��*;�!<�A�A�A�A�� �� �H�H� �<� � \� �[�t�y�y���AV�7W�7W�[�[�[� [�H� �#� $� J� �1� 1�H��/�0� J� J���I�3�w�<�I�I�3�y�>�I�I�I�I�I��� �)� *� U� �7� 7�H�!�"8�9�"�1�"�=� U� U���T�6�(�#3�T�T�v�g��T�T�T�T������ �l�l�l��y�n�>i�ad�ef�ag�ag�>i�>i�j�j�j�k�k�k�����l���s�/E-�"D E-�- F/�73F*�*F/z9Fetch comprehensive visibility report for a tracked query�7dzID of the tracked query� range_dayszTime range: 7d, 30d, or allc ��vK�|tkr#tttd������ t jt ||��}d|vr d|d��Sd}|d|d�d�z }|d |d �d �z }|d r)|d z }|d D]}|d|d�d|dd�d�z }�|drE|dz }|dD]7}|d}|d}|d} |d} |d|�d|d�d| d�d| d�d� z }�8|dr0|dz }|ddd�D]} |d| d�d| d �d!�z }�|d"r:|d#z }|d"D],} | d$d%krd&nd'} || �d(| d)�d| d$�d�z }�-|S#t$r8}tttd*t|����������d}~wwxYw)+z#Fetch visibility report for a queryr�rGr�r�u📊 **Visibility Report** � **Query:** rfr�z **Period:** �period� r�z**Share of Voice:** r�r�rFr�r�� sentimentz **Sentiment Analysis:** �positive�neutral�negativeu: 😊u 😐u 😞r�r�Nrer�r�r��platform_statusz **Platform Status:** r�r�r�r�rir�zFailed to fetch report: ) r�r r rr�fetch_visibility_reportrr�rr2)r�r�r�r�rTr�r�r��pos�neu�negr�r�r�rUs r&r�r�0s������u����y�n�>T�U�U�U�V�V�V�)d�#�;�I�x�Q[�\�\�� �f� � �2����2�2� 2�4���5�&��/�5�5�5�5���9�6�(�#3�9�9�9�9�� �"� #� J� �/� /�H��.�/� J� J���I�3�w�<�I�I�3�y�>�I�I�I�I�I��� �+� � X� �5� 5�H�#�K�0� X� X� �!�'�*��� �+��� �*��� �+���W�5�W�W��W�W�W�c�W�W�W�C�W�W�W�W�W��� �(� )� U� �7� 7�H� �!7�8��!��<� U� U���T�6�(�#3�T�T�v�g��T�T�T�T��� �#� $� ]� �2� 2�H�"�#4�5� ]� ]��(0��(:�d�(B�(B�u�u�� ��|�\�\�h�z�.B�\�\�h�x�FX�\�\�\�\������ �d�d�d��y�n�>a�Y\�]^�Y_�Y_�>a�>a�b�b�b�c�c�c�����d���s�)E6�DE6�6 F8�3F3�3F8�7Get platform snapshot for a specific query and platformr�z(Platform name (azure_openai, perplexity)�datez$Date in YYYY-MM-DD format (optional)c ��K�|tkr#tttd������ t jt |||��}d|vr d|d��Sd}|d|d�d�z }|d |d �d�z }|d |d �d �z }|d|ddd��d�z }|dr1|dz }|dD]#}|d|d�d|d�d|d�d�z }�$|dr0|dz }|ddd�D]}|d|d�d|d�d �z }�|S#t$r8}tttd!t|����������d}~wwxYw)"r�r�rGr�r�u📸 **Platform Snapshot** r�rfr�z**Platform:** r�z **Date:** r�r�z**Raw Answer:** � raw_answerNi�z... �mentionsz**Brand Mentions:** r�r�rFr�z mentions (first at position � first_indexz) � citationsz **Citations:** rer�r�zFailed to get snapshot: ) r�r r rr�get_platform_snapshotrr�rr2) r�r�r�r�r�rT�mention�citationrUs r&r�r�es"�����u����y�n�>T�U�U�U�V�V�V�d�#�9�)�X�x�Y]�^�^�� �f� � �2����2�2� 2�4���5�&��/�5�5�5�5���;�V�J�%7�;�;�;�;���5����5�5�5�5�� �K��|�(<�T�c�T�(B�K�K�K�K�� �*� � B� �/� /�H�!�*�-� B� B���B�7�7�#3�B�B�w�w�7G�B�B�fm�n{�f|�B�B�B�B��� �+� � Y� �,� ,�H�"�;�/����3� Y� Y���X�8�H�#5�X�X��'�9J�X�X�X�X������ �d�d�d��y�n�>a�Y\�]^�Y_�Y_�>a�>a�b�b�b�c�c�c�����d���s�*D�B8D� E� 3E�EzDRun visibility check for all tracked queries (helper for automation)c ���K�|tkr#tttd������ t jt ���d{V��}|drGdt|d���dd�tt|d������SdS#t$r8}tttd t|����������d}~wwxYw) z,Run visibility check for all tracked queriesr�rGN�run_idsu✅ Successfully ran z visibility checks. Run IDs: r�u<ℹ️ No tracked queries found to run visibility checks on.zFailed to run all checks: ) r�r r rr� run_all_todayrrwr��mapr2r�r)r�r�rUs r&r�r��s+���� �u����y�n�>T�U�U�U�V�V�V�f�)�7� �B�B�B�B�B�B�B�B�� �)� � R�I�3�v�i�/@�+A�+A�I�I�`d�`i�`i�jm�nq�sy�{D�tE�kF�kF�aG�aG�I�I� I�Q�Q�� �f�f�f��y�n�>c�[^�_`�[a�[a�>c�>c�d�d�d�e�e�e�����f���s�A-B"�" C$�,3C�C$c���K�td��td��t��td��t�ddd����d{V��dS)Nu/🚀 Starting MCP server on http://0.0.0.0:8086u📊 Initializing database...u&✅ Database initialized successfully!zstreamable-httpz0.0.0.0i�)�host�port)�printr�mcp� run_asyncr:r'r&�mainr�sr���� � ;�<�<�<� � )�*�*�*����� � 2�3�3�3� �-�-�)� ��-� E� E�E�E�E�E�E�E�E�E�Er'�__main__)NNFr�)r�)A�asyncio�typingrr�os�dotenvr�fastmcpr�$fastmcp.server.auth.providers.bearerrrrr r �mcp.server.auth.providerr � mcp.typesr r rr�pydanticrrrrbrKr_�sys�pathrvr��dirname�__file__�databaserr�environrMr�rrr5r<�toolr2r��JobFinderDescription�model_dump_jsonr~r��$MAKE_IMG_BLACK_AND_WHITE_DESCRIPTIONr�r�r�r�r�r�r�r�r�rr/�runr:r'r&�<module>rsT������"�"�"�"�"�"�"�"� � � � �������������O�O�O�O�O�O�O�O�#�#�#�#�#�#�#�#�0�0�0�0�0�0�O�O�O�O�O�O�O�O�O�O�O�O�-�-�-�-�-�-�-�-�-�-����� � � � ����� � � � � � � � ������� � �R�W�_�_�X�6�6��f�E�E�F�F�F�*�)�)�)�)�)�1�1�1�1�1�1� � � � � � � ���|�$�$�� �J�N�N�;� '� '� � ���C�������F���������1����"$�$�$�$�$�)�$�$�$� E=�E=�E=�E=�E=�E=�E=�E=�P�g�� !� !�%� (� (����� ������� ���+�*�f� ]�U����� ���*�:�:�<�<��=�=�mq�ei�QV� R� R���e�e�0s�t�t�t�t�u� R��s�T�z�5�5�=g�+h�+h�+h�h�i� R��v��}�e�e�8`�&a�&a�&a�a� b� R� �4���+L�M�M�M�M� N� R�  � R� R� R�>�=� R�J(;�':�B� t�U�(�(�(�$� ���:�J�J�L�L��M�M�tx�G�G��s�E�E�6o�$p�$p�$p�p�q�G� �+� � $�%�G�G�G�N�M�G�2���S��T�T�ko� j� j��C���3I�!J�!J�!J�J�K� j� �S�%�%�,G�H�H�H�H� I� j��4��9�t�+�U�U�?e�-f�-f�-f�f�g� j� � j� j� j�U�T� j����=��>�>�d��C���3I�!J�!J�!J�J�K�d��d�d�d�?�>�d�(���V��W�W�CG�/l�/l��C���3I�!J�!J�!J�J�K�/l���U�U�/Q�R�R�R�R�S�/l���c��T�)�5�5�=}�+~�+~�+~�~��/l� � /l�/l�/l�X�W�/l�b���Q��R�R�TX�2d�2d��C���3I�!J�!J�!J�J�K�2d���U�U�/H�I�I�I�I�J�2d��#�u�u�1N�O�O�O�O�P�2d� � 2d�2d�2d�S�R�2d�h���O��P�P� ^b� &d�&d��C���3I�!J�!J�!J�J�K�&d���U�U�/H�I�I�I�I�J�&d���U�U�/Y�Z�Z�Z�Z�[�&d� �C�$�J���2X� Y� Y� Y�Y� Z� &d�  � &d�&d�&d�Q�P�&d�P���\��]�]�f��C���3I�!J�!J�!J�J�K�f��f�f�f�^�]�f�$F�F�F� �z����G�K�����������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/Kulraj69/mcp-llm'

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