Skip to main content
Glama

Puch AI MCP Starter

by VipulGhodke
mcp_starter.cpython-313.pyc30.7 kB
� ���h�s� ���SSKrSSKJr SSKrSSKJr SSKJr SSKJ r J r SSK J r J r SSKJr SSKJrJrJrJr SS KJrJr SSKrSSKrSSKrSSKr\"5 \R8R;S 5r\R8R;S 5r\R8R;S S 5r \cS5e\cS5e"SS5r!"SS5r"\""5r#"SS\ 5r$"SS\5r%\"S\$"\5S9r \ RLS\'4Sj5r(\%"SSSS9r)\%"S S!S"9r*\ RM\*RW5S#9SPS$\\'\"S%S#94S&\\'S-\"S'S#94S(\\'S-\"S)S#94S\'4S*jj5r,\ RMS+S#9S,\\'\"S-S#94S\'4S.j5r-\ RMS/S#9SQS0\\'\"S1S#94S2\\'S-\"S3S#94S\'4S4jj5r.\ RMS5S#9S$\\'\"S%S#94S6\\'\"S7S#94S8\\'\"S9S#94S\'4S:j5r/\ RMS;S#9S$\\'\"S%S#94S\'4S<j5r0\ RMS=S#9SRS$\\'\"S%S#94S>\\1S-\"S?S#94S\'4S@jj5r2\ RMSAS#9SQS$\\'\"S%S#94S(\\'S-\"SBS#94S\'4SCjj5r3\ RMSDS#9S$\\'\"S%S#94S6\\'\"S7S#94S8\\'\"S9S#94S\'4SEj5r4\ RMSFS#9S$\\'\"S%S#94S\'4SGj5r5\ RMSHS#9S$\\'\"S%S#94SI\\'\"SJS#94S\'4SKj5r6\ RMSLS#9S$\\'\"S%S#94S\'4SMj5r7SNr8\9SO:Xa\Rt"\8"55 gg)S�N)� Annotated)� load_dotenv)�FastMCP)�BearerAuthProvider� RSAKeyPair)� ErrorData�McpError)� AccessToken)� TextContent� ImageContent�INVALID_PARAMS�INTERNAL_ERROR)� BaseModel�Field� AUTH_TOKEN� MY_NUMBER� BACKEND_URLzhttp://localhost:8090z'Please set AUTH_TOKEN in your .env filez&Please set MY_NUMBER in your .env filec�@�\rSrSrS\4SjrSr\S\4Sj5r Sr g) � UserProfile��user_idc��XlSUlSUlSUlSUlSUlSUlSUlSUlg)Nr��) r�xp�hearts� streak_count� last_active�learning_language�current_difficulty�correct_streak�hearts_last_refill��selfrs �ZC:\Users\Anushka\OneDrive\Desktop\puch_hackathon\mcpServer\mcp-bearer-token\mcp_starter.py�__init__�UserProfile.__init__sE��� ������ �������!%���"#������"&���c ���URURURURUR(aURR 5OSUR URURS.$)N)rrrrrrr r!) rrrrr� isoformatrr r!�r$s r%�to_dict�UserProfile.to_dict(sb���|�|��'�'��k�k� �-�-�;?�;K�;K�4�+�+�5�5�7�QU�!%�!7�!7�"&�"9�"9�"�1�1�  � r(�datac�"�U"US5nURSS5UlURSS5UlURSS5UlURSS5UlURS S5UlURS 5UlURS 5(a'[RRUS 5Ul URS 5(a'[RRUS 5Ul U$) Nrrrrrrr rr!rrr") �getrrrr r!r�datetime� fromisoformatrr")�clsr.�profiles r%� from_dict�UserProfile.from_dict4s����d�9�o�&���X�X�d�A�&�� ����(�A�.���#�x�x���:���%)�X�X�.B�A�%F��"�!%���*:�A�!>���$(�H�H�-@�$A��!� �8�8�M� "� "�"*�"3�"3�"A�"A�$�}�BU�"V�G� � �8�8�(� )� )�)1�):�):�)H�)H��Nb�Ic�)d�G� &��r() r!r rr"rrrrrN) �__name__� __module__� __qualname__�__firstlineno__�strr&r,� classmethod�dictr5�__static_attributes__�r(r%rrs.�� '�� '�  ���T���r(rc��\rSrSrSrSrS\S\4SjrSS\S\S \ 4S jjr S\S \S \S\ 4S jr S\ S \S\ 4SjrS\4SjrS\4SjrSrg)�StandaloneGamification�Ec�<�0UlUR5Ulg�N)�users�_create_default_exercises� exercisesr+s r%r&�StandaloneGamification.__init__Fs���� ��7�7�9��r(c ���SSSSSSS.SSS S SSS.S S S SS/SQS.SSSSSSS.SSSSSSS./SSSSSSS.SSSSSSS.SS SSS/S QS.S!SS"S#SSS.S$SS%S&SSS./S'SSS(SSS.S)SS S*SSS.S+S S,S-S/S.QS./S/.nU$)0z:Create a set of built-in exercises for different languages�es_1� translatezTranslate: Hello�holarN)�id�type�prompt� answer_key� difficulty�choices�es_2zTranslate: Thank you�gracias�es_3�mcqzSelect 'Good morning'� buenos días)z buenas nochesrW�adiós�es_4� fill_blankuFill: ¿Cómo ____?uestás��es_5zTranslate: GoodbyerX�de_1zTranslate: Good morningz guten morgen�de_2zauf wiedersehen�de_3zSelect 'Hello'�hallo)utschüssr`�bitte�de_4zFill: Wie ____ du?uheißt�de_5zTranslate: Pleasera�fr_1�bonjour�fr_2�merci�fr_3zSelect 'Good evening'�bonsoir)reriz au revoir)�es�de�frr?)r$rGs r%rF�0StandaloneGamification._create_default_exercisesJsl�� !�'�0�"(�"#�#� �!�'�4�"+�"#�#� �!�!�5�"0�"#�J� �!�(�3�"*�"#�#� �!�'�2�"*�"#�#� �C)�X!�'�7�"0�"#�#� �!�'�2�"3�"#�#� �!�!�.�")�"#�=� �!�(�2�"*�"#�#� �!�'�1�")�"#�#� �C)�X!�'�0�"+�"#�#� �!�'�4�")�"#�#� �!�!�5�"+�"#�B� �#�ko � �`�r(r�returnc�n�XR;a[U5URU'URU$rD)rErr#s r%�get_user_profile�'StandaloneGamification.get_user_profile�s.�� �*�*� $�"-�g�"6�D�J�J�w� ��z�z�'�"�"r(N�language�limitc���URU5nU(dUR=(d SnX R;a/$URUR5n[R "U5 USU$)Nrj)rprrG�copy�random�shuffle)r$rrrrsr4� availables r%�get_available_exercises�.StandaloneGamification.get_available_exercises�sd���'�'��0����0�0�8�D�H� �>�>� )��I��N�N�8�,�1�1�3� ����y�!���%� � r(� exercise_id�answerc���URU5nSnURR5H"nUHnUSU:XdMUn O U(dM" O U(dSS0$URXS5nU(abSn U=RU - slU=R S- slUR S:�a%[ SURS-5UlSUlOESn [SURS- 5Ul SUl[SURS- 5UlURU5 UU U(aS OS US 3URURURURS .$) NrM�errorzExercise not found� r�rr�Correct!zIncorrect. The answer was: rP)� is_correct� awarded_xp�feedback�new_xprrr ) rprG�values� _grade_answerrr!�minr �maxr�_update_streakr) r$rr{r|r4�exercise�lang_exercises�exr�r�s r%� submit_answer�$StandaloneGamification.submit_answer�so���'�'��0����"�n�n�3�3�5�N�$���d�8�{�*�!�H��%��x�� 6���1�2� 2��'�'��9� � ��J� �J�J�*� $�J� � "� "�a� '� "��%�%��*�-0��G�4N�4N�QR�4R�-S��*�)*��&���J� ��G�N�N�Q�$6�7�G�N�%&�G� "�),�Q��0J�0J�Q�0N�)O�G� &� ���G�$�%�$�&0� �8S�T\�]i�Tj�Sk�6l��j�j��n�n�#�0�0�")�"<�"<� � r(r�c�`�UR5R5nUSR5R5nX4:XagUSS:XaPUS(aF[U5S- nSUs=::a[US5:aO gUSUR5U:H$gg![a gf=f) zGrade the user's answerrPTrNrVrRrrF)�strip�lower�int�len� ValueError)r$r�r|� user_answer�correct_answer� choice_indexs r%r��$StandaloneGamification._grade_answers����l�l�n�*�*�,� �!�,�/�5�5�7�=�=�?�� � (�� �F� �u� $��)�)<� �"�;�/�!�3� �� �?�s�8�I�+>�'?�?� � $�I�.�|�<�B�B�D��V�V�@� ��� ��� �s�)B �B � B-�,B-r4c��[RR5nURU:XagURcSUlOAX!R- R nUS:XaU=RS- slO US:�aSUlX!lg)zUpdate the user's streakNr)r1�date�todayrr�days)r$r4r��deltas r%r��%StandaloneGamification._update_streaksz��� � �#�#�%�� � � �%� '� � � � � &�#$�G� ��0�0�0�6�6�E���z��$�$��)�$����'(��$�#�r(c��URU5n[RR5nURS:�agURcX2lg[ X2R- R 5S-5n[SUR- US-5nUS:�a>[SURU-5UlU[R"US-S9- Ulgg)zRegenerate hearts over timerN�<�r)�minutes) rpr1�nowrr"r�� total_secondsr�� timedelta)r$rr4r��minutes_passed� hearts_to_adds r%�maybe_regen_hearts�)StandaloneGamification.maybe_regen_hearts&s����'�'��0�����#�#�%�� �>�>�Q� � � � %� %� -�),� &� ��c�$>�$>�>�M�M�O�SU�U�V���A����.��"�0D�E� � �1� � ��G�N�N�]�$B�C�G�N�),�x�/A�/A�>�\^�K^�/`�)`�G� &� r()rGrE)Nr)r7r8r9r:r&rFr;rrpr�ryr=r��boolr�r�r�r>r?r(r%rArAEs���:�r�h#��#� �#� !�s� !�c� !�QT� !�. �S�. �s�. �C�. �D�. �`�d��C��D��($�k�$�$a�#�ar(rAc�H^�\rSrSrS\4U4SjjrS\S\S-4SjrSrU=r $)�SimpleBearerAuthProvideri>�tokenc�p>�[R"5n[TU] URSSSS9 Xlg)N)� public_key�jwks_uri�issuer�audience)r�generate�superr&r�r�)r$r��k� __class__s �r%r&�!SimpleBearerAuthProvider.__init__?s1��� � � � !�� ���A�L�L�4��W[��\�� r(rnNc��D# �XR:Xa [USS/SS9$g7f)Nz puch-client�*)r�� client_id�scopes� expires_at)r�r )r$r�s r%�load_access_token�*SimpleBearerAuthProvider.load_access_tokenDs/��� �J�J� ���'��u�� � � �s� )r�) r7r8r9r:r;r&r r�r>� __classcell__)r�s@r%r�r�>s,����c�� �S��[�4�5G��r(r�c�>�\rSrSr%\\S'\\S'Sr\S-\S'Srg)�RichToolDescriptioniO� description�use_whenN� side_effectsr?)r7r8r9r:r;�__annotations__r�r>r?r(r%r�r�Os�����M�#�L�#��*�#r(r�zChatLingo MCP Server)�authrnc��# �[$7frD)rr?r(r%�validater�`s ��� ��s� 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.)r�r�r�zlChatLingo tools: start a session, submit an answer, check your daily goals and streak, and review due vocab.zcUse to drive a structured language learning flow with XP, hearts, streaks, and adaptive difficulty.)r�r�)r�rzUser identifier� lesson_idz&Optional lesson id to focus session onrz3Optional target learning language, e.g., 'de', 'es'c��0# �[XS9IShv�N $N7f)N)rr)� start_session)rr�rs r%� session_startr�ys����w�T� T�T� T�s � ��zSAnalyze a user-provided image (base64) for OCR/metadata; returns suggested replies.�puch_image_datazBase64-encoded image to analyzec ��# �[R"5IShv�N nUR[S3SU0S9IShv�N nURS:�a$[ [ [SUR3S95eSSS .S S S .S S S ./nUR[S3SS[U50S.S9IShv�N nURS-SUS3-sSSS5IShv�N $N�N�N/![a N9f=fN!,IShv�N (df  g=f7f)Nz/media/image/analyze� image_b64��json��Backend error: ��code�message�Next�next��titlerM�Explain�explainz Try another� try_another� /media/event�image_analyze_tool�size�� event_type�meta� �<suggested_replies>�</suggested_replies>� �httpx� AsyncClient�postr� status_coder rr�textr�� Exception)r��client�resp� suggestions�_s r%� image_analyzer��s1���� � �"�"�f��[�[��m�/� 0���/�!� � �� � � �s� "��9�.�O�TX�T]�T]�S^�B_�`�a� a��F� +��y� 1�#�=� 9� � �  ��k�k�[�M��">�Th�sy�{~�@O�|P�sQ�FR�k�S�S�A��y�y�6�!�&9�+��FZ�$[�[�##�"�"� �S��� � � ��#�"�"�"�s��D �C�D �C1�C�AC1�(C�-C�.C�2C1� D �C/�D �C1�C� C,�)C1�+C,�,C1�/D �1D�7C: �8 D�D zNTranscribe a voice note (base64 audio) and return text with suggested actions.�puch_audio_datazBase64-encoded audio data� mime_typez'Optional audio MIME type e.g. audio/oggc��# �[R"5IShv�N nUR[S3XS.S9IShv�N nURS:�a$[ [ [SUR3S95eSSS .S S S .S S S ./nUR[S3S[U5US.S.S9IShv�N nURS-SUS3-sSSS5IShv�N $N�N�N/![a N9f=fN!,IShv�N (df  g=f7f)Nz/media/audio/transcribe)� audio_b64r�r�r�r�r�z Play again� play_againr��Slower�slowerr�r�r��audio_transcribe_tool)r�r�r�r�r�r�r�)r�r�r�r�r�r�s r%�transcribe_audior��s7��� � � �"�"�f��[�[��m�2� 3�.�G�!� � �� � � �s� "��9�.�O�TX�T]�T]�S^�B_�`�a� a�"�,� 7��h� /��F� +� � �  ��k�k�[�M��">�Tk�B�CR�S�bk�vl�Fm�k�n�n�A��y�y�6�!�&9�+��FZ�$[�[�!#�"�"� �n��� � � ��#�"�"�"�s��D �C�D �C2�C�AC2�)C �.C�/C �3C2� D �C0�D �C2�C � C-�*C2�,C-�-C2�0D �2D �8C; �9 D �D z>Submit an answer for grading and XP/streak updates via backendr{z Exercise idr|z User's answerc��# �[R"5IShv�N nUR[S3XUS.S9IShv�N nURS:�a$[ [ [SUR3S95eUR5nU(a[U[5(d5SSS .S S S .S S S ./nURS-SUS3-sSSS5IShv�N $[URS55nURS5=(d U(aSOSnURS5n URS5n URS5n U(a4S/n [U [5(aU S:�aU R!SU S35 OU/n SR#U 5n SSS .S S S .S S S ./nXyX�S.nU S-SUS3-S-SUS3-sSSS5IShv�N $GN�GN�![a SnGN`f=fGNN!!,IShv�N (df  g=f7f) Nz/sessions/submit)rr{r|r�r�r�r�r��next_exr�r�r��Repeat�repeatr�r�r�r�r�r�z Incorrect.r�rru Correct! 🎉r�+� XP� )�correctr�r�streakz <result_meta>z</result_meta>)r�r�r�rr�r rrr�r�r�� isinstancer=r�r0r��append�join)rr{r|r�r�r.r�r�r��awardedrr�parts�summaryr�s r%�submit_answer_backendr �s��� � � �"�"�f��[�[��m�+� ,�$�F�S�!� � �� � � �s� "��9�.�O�TX�T]�T]�S^�B_�`�a� a� ��9�9�;�D��:�d�D�1�1�!� �2�#�9�5�"�(�3��K� �9�9�v�%�*=�k�]�J^�(_�_�)#�"�"�,�$�(�(�<�0�1� ��8�8�J�'�W�*�J�,���(�(�<�(�����(�#�����.�)�� �$�%�E��'�3�'�'�G�a�K�� � �q�� ��-�.���J�E��(�(�5�/���I� .��y� 1��h� /� � �&��a�� �� ��d�V�>�2� 3�� �$�K�=�0D�E�  F� �[#�"�"� ��� ��D� ��#�"�"�"�s��H �G�H �G1�G�8G1�8G�?G1� H �G,�H �C(G1� H � G/�H �G1� G)�%G1�(G)�)G1�,H �/H �1H�7G: �8 H�H zFFetch daily goals and gamification status (xp, hearts, streak, quests)c��# �[R"5IShv�N nUR[S3SU0S9IShv�N nURS:�a$[ [ [SUR3S95eSSS .S S S .S S S ./nURS-SUS3-sSSS5IShv�N $N�NoN !,IShv�N (df  g=f7f)Nz/gamification/statusr��paramsr�r�r�z Daily goal� daily_goalr�z Start sessionr�z Due cards� due_cardsr�r�r�� r�r�r0rr�r rrr�)rr�r�r�s r%�gamification_statusr�s����� � �"�"�f��Z�Z�;�-�/C� D�i�Y`�Ma�Z�b�b�� � � �s� "��9�.�O�TX�T]�T]�S^�B_�`�a� a�"�,� 7�%�_� =�!�� 5� � � �y�y�6�!�&9�+��FZ�$[�[�#�"�"�b�#�"�"�"��U�C �B+�C �B1�B-�AB1� C �%B/�&C �-B1�/C �1C�7B: �8 C�C z$Get due SRS vocab items for the userrszOptional limit of due itemsc��# �[R"5IShv�N nUR[S3XS.S9IShv�N nURS:�a$[ [ [SUR3S95eSSS .S S S .S S S ./nURS-SUS3-sSSS5IShv�N $N�NoN !,IShv�N (df  g=f7f)Nz/srs/due)rrsrr�r�r�z Start review� start_reviewr��Skip�skip�Back�backr�r�r�r)rrsr�r�r�s r%�srs_duers���� � � �"�"�f��Z�Z�;�-�x� 8�W�Ae�Z�f�f�� � � �s� "��9�.�O�TX�T]�T]�S^�B_�`�a� a�$�N� ;��F� +��F� +� � � �y�y�6�!�&9�+��FZ�$[�[�#�"�"�f�#�"�"�"�rz9Start a language learning session with built-in exercisesz-Target learning language: 'es', 'de', or 'fr'c���# �[RU5nU(aXlUR(dSSS.SSS.SSS./nSUS 3$[RXRS S 9nU(dS S S.SSS./nSUS 3$USnUSS:XaPUS(aFSR [ US5VVs/sHupgUS -SU3PM snn5nUSSUS3n OUSS:Xa USS3n OUSS3n SSS.SS S.SSS./nUS!USS".n S#URR 5S$URS%URS&URS'URS(U S)U S*US 3$s snnf7f)+Nz Learn Spanish� set_lang_esr�z Learn German� set_lang_dez Learn French� set_lang_fruOWelcome to ChatLingo! 🎉 Here's how it works: - Earn XP for correct answers and build your streak - Hearts represent your lives; wrong answers cost a heart - Hearts regenerate every 15 minutes - Difficulty adapts to your performance Please choose a language to learn: - Spanish (es) - German (de) - French (fr) <suggested_replies>r�r�rs�Change Language� change_lang� View Profile� view_profilezBNo exercises available for this language yet. <suggested_replies>rrNrVrR� �. rOr��5 Reply with the number (1, 2, 3) or the answer text.rZ�* Fill in the blank with the correct word.� Type your answer.� Submit Answerr�r� skip_exerciserM�r{rN�🌍 Language: � 💪 Difficulty: �/5 ❤️ Hearts: � /5 ⭐ XP: � 🔥 Streak: � days **Exercise:** � <exercise_meta>�%</exercise_meta> <suggested_replies>� � gamificationrprryr� enumerate�upperr rrr) rrr4r�rGr��i�choice� choices_textrOr�s r%r�r�s��� �+�+�G�4�G��$5�!� � $� $�%�]� ;�$�M� :�$�M� :� � � "�#.��.B� D� ��4�4�W�>W�>W�_`�4�a�I� �'�}� =�$�N� ;� � �  "�"-��.B� D� � ��|�H����5� �X�i�%8��y�y�i�PX�Yb�Pc�Fd�!e�Fd���Q�q�S�E��F�8�"4�Fd�!e�f� ��X�&�'�t�L�>�9p�q�� �&� �\� )��X�&�'�'S�T���X�&�'�'<�=��"��9���0� ��7��K� $�D�>�8�F�3C� D�D� �'�3�3�9�9�;�<�=�#�6�6�7�8�!�.�.�)�*��:�:�,���,�,�-�.� ��"��� �)�]�*>� @� ��"f�s�B1E1�3E+ � B(E1z2Submit an answer for grading and XP/streak updatesc ��d# �[RXU5nSU;aSSS.SSS./nSUSSUS 3$[RU5nUS (a S US S 3nOSUS3nSSS.SSS.SSS./nUSURSURSUR SUR SUS 3 $7f)Nr~� Start Sessionr�r�r#r$zError: � <suggested_replies>r�r�u🎉 Correct! +r�ru❌ r�z Next Exercise� next_exerciser!�change_languageu+ 📊 **Your Progress:** 💪 Difficulty: r/r0r1z days <suggested_replies>)r6r�rpr rrr)rr{r|�resultr�r4r�s r%r�r�\s��� � '� '��f� E�F��&��%�_� =�$�N� ;� � �����)�)@�� �Ma�b�b��+�+�G�4�G� �l��#�F�<�$8�#9��=���� �+�,�-��"��9� ��7�#�+<�=��K� �)��#�6�6�7�8�!�.�.�)�*��:�:�,���,�,�-�.�)�]�*>�  @��s�B.B0z+View your gamification profile and progressc��# �[RU5n[RU5 URS-S-nSURS-- nSSS.SSS.SS S./nS US URS US URSUR SUR SUR(aURR5OSSUS3$7f)N�drr=r�r�z Daily Goalrr!r@u#👤 **Your Profile** 🏆 Level: u ⭐ XP: z (Next level in u XP) ❤️ Hearts: u/5 🔥 Streak: u days 💪 Difficulty: u/5 🌍 Learning: zNot setr>r�) r6rpr�rrrr rr8)rr4�level� xp_to_nextr�s r%r$r$�s�����+�+�G�4�G��#�#�G�,��Z�Z�3� �!� #�E��� � �S�(�)�J�"��9��l�3�#�+<�=��K� ��g���:�:�,�.�z�l�;�!�.�.�)�*��,�,�-�.�#�6�6�7�8�?F�?X�?X�'�3�3�9�9�;�^g�h�i�)�]�*>� @� �s�C C z$Set or change your learning languagerrz"Language code: 'es', 'de', or 'fr'c��# �[RU5nXlSSS.SSS./nSUR5SUS3$7f) Nr=r�r�r#r$u🌍 Language set to z\! Ready to start learning? Begin a session to get your first exercise. <suggested_replies>r�)r6rprr8)rrrr4r�s r%� set_languagerG�s_��� �+�+�G�4�G� (��"��9� ��7��K� ���� 0�1�2�)�]�*>� @��s�=?zGet your next exercisec���# �[RU5nUR(dSSS.SSS./nSUS3$[RXRSS 9nU(dS S S.SSS./nS US3$US nUSS:XaPUS(aFSR [ US5VVs/sHupVUS-SU3PM snn5nUSSUS3nOUSS:Xa USS3nOUSS3nSSS.SSS.SSS./nUSUSS.n SURR 5S URS!URS"URS#URS$US%U S&US3$s snnf7f)'Nz Set LanguagerGr�r#r$z:Please set a learning language first. <suggested_replies>r�rr r!r@zCNo more exercises available for this language. <suggested_replies>rrNrVrRr%r&rOr�r'rZr(r)r*r�rr+rMr,r-r.r/r0r1r2r3r4r5) rr4r�rGr�r9r:r;rOr�s r%r?r?�s ����+�+�G�4�G� � $� $�$�N� ;�$�N� ;� � �  "�"-��.B� D� � �4�4�W�>W�>W�_`�4�a�I� �'�/@� A�$�N� ;� � �  "�"-��.B� D� � ��|�H����5� �X�i�%8��y�y�i�PX�Yb�Pc�Fd�!e�Fd���Q�q�S�E��F�8�"4�Fd�!e�f� ��X�&�'�t�L�>�9p�q�� �&� �\� )��X�&�'�'S�T���X�&�'�'<�=��"��9���0� ��7��K� $�D�>�8�F�3C� D�D� �'�3�3�9�9�;�<�=�#�6�6�7�8�!�.�.�)�*��:�:�,���,�,�-�.� ��"��� �)�]�*>� @� ��"f�s�B E �"E �8B(E c��# �[S5 [S5 [S5 [S5 [RSSSS9IShv�N gN7f) Nu/🚀 Starting MCP server on http://0.0.0.0:8086u)🎮 ChatLingo Gamification System Ready!u@📚 Available languages: Spanish (es), German (de), French (fr)u)💡 Use start_session to begin learning!zstreamable-httpz0.0.0.0i�)�host�port)�print�mcp� run_asyncr?r(r%�mainrO�sB��� � ;�<� � 5�6� � L�M� � 5�6� �-�-�)� ��-� E�E�E�s�AA�A �A�__main__)NNrD)�);�asyncio�typingr�os�dotenvr�fastmcpr�$fastmcp.server.auth.providers.bearerrrrMrr �mcp.server.auth.providerr � mcp.typesr r r r�pydanticrrr�r1rvr��environr0�TOKENrrrrAr6r�r��toolr;r��$MAKE_IMG_BLACK_AND_WHITE_DESCRIPTION�DuolingoToolDescription�model_dump_jsonr�r�r�r rr�rr�r�r$rGr?rOr7�runr?r(r%�<module>rbsz���� ���O�#�0�O�O�%� �� � � � � � � ���|�$�� �J�J�N�N�;� '� ��j�j�n�n�]�,C�D� � ��C�C�C����F�F�F��'�'�Rsa�sa�l&�'� ��1��"$�)�$��� !�%� (��������� ��(;�B� t�U�(�$�.�~� r��� ���-�=�=�?��@�ei�y}�U� �s�E�.?�@�@� A�U���t��U�7_�%`�`�a�U�!��t��U�?t�-u�!u�v�U� � U�A�U����k��l�\��s�E�6W�$X�X�Y�\��\�m�\�.���f��g�dh�\��s�E�6Q�$R�R�S�\���t��U�7`�%a�a�b�\� �\�h�\�.���V��W�8 � �s�E�.?�@�@� A�8 ��3��-� @�@�A�8 � �c�5�_�=�=� >�8 � � 8 �X�8 �v���^��_� \� �s�E�.?�@�@� A� \�� \�`� \����<��=�VX� \� �s�E�.?�@�@� A� \� �S�4�Z��3P�!Q�Q� R� \� � \�>� \� ���Q��R�tx�H� �s�E�.?�@�@� A�H� ��t��U�?n�-o�!o�p�H� �H�S�H�T���J��K�#� �s�E�.?�@�@� A�#��3��-� @�@�A�#� �c�5�_�=�=� >�#� � #�L�#�J���C��D�� �s�E�.?�@�@� A����E��6���<��=�� �s�E�.?�@�@� A����U�/S�T�T�U�� ��>��$���.��/�7� �s�E�.?�@�@� A�7��7�0�7�tF� �z�� �K�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/VipulGhodke/mcpServer'

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