Skip to main content
Glama
server.cpython-312.pyc22.6 kB
� ��h�L� ���ddlZddlmZmZmZmZddlZddlmZde fd�Z e �Z ed�Z e j�de dee effd��Ze j�d!d e d ee dee effd ��Ze j�d e dee effd ��Ze j�d e dee effd��Ze j�de de dee effd��Ze j�de de dee effd��Ze j�de de dee effd��Ze j�de de d e de dee eff d��Ze j�d"de de de dee effd��Ze j�d#de d e de dee effd��Ze j�d$de de de dee effd��Ze j�de dee effd��Zed k(re j7�yy)%�N)�Any�Dict�List�Optional)�FastMCP�returnc�J�tjd�}|s td��|S)z4Get the Amap Maps API key from environment variables�AMAP_MAPS_API_KEYz2AMAP_MAPS_API_KEY environment variable is required)�os�getenv� ValueError)�api_keys �?/Users/wyang14/github/amap-mcp-server/amap_mcp_server/server.py� get_api_keyrs%���i�i�+�,�G� ��M�N�N� �N�z amap-maps�locationc�� tjdt|d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iS|d d d |d d d |d d dd�S#tj j $r}ddt|���icYd}~Sd}~wwxYw)u?将一个高德经纬度坐标转换为行政区划地址信息z)https://restapi.amap.com/v3/geocode/regeo)�keyr��params�status�1�errorzRGeocoding failed: �info�infocode� regeocode�addressComponent�province�city�district)rrr �Request failed: N��requests�getr �raise_for_status�json� exceptions�RequestException�str)r�response�data�es r�maps_regeocoder-s���6��<�<� 7�(�$�� �� �!�!�#��}�}��� ��>�S� ��2�4�8�8�F�3C�3[�t�x�x�PZ�G[�2\�]�^� ^��[�)�*<�=�j�I���%�&8�9�&�A��[�)�*<�=�j�I� � �� � � � /� /�6��+�C��F�8�4�5�5��6�s$�A.B�1 B�C �/C�>C �C �addressrc� � t|d�}|r||d<tjd|��}|j�|j �}|ddk7r)dd|jd �xs|jd ���iS|jd g�}g}|D]�}|j |jd �|jd �|jd�|jd�|jd�|jd�|jd�|jd�|jd�|jd�d� ���d|iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)u~将详细的结构化地址转换为经纬度坐标。支持对地标性名胜景区、建筑物名称解析为经纬度坐标)rr.rz'https://restapi.amap.com/v3/geocode/georrrrzGeocoding failed: rr�geocodes�countryr�citycoder �street�number�adcoder�level) r1rrr2r r3r4r5rr6rr!N) r r#r$r%r&�appendr'r(r)) r.rrr*r+r0�results�geor,s r�maps_geor:*sr��#6�$�� �� �!�F�6�N��<�<� 5�� �� �!�!�#��}�}��� ��>�S� ��1�$�(�(�6�2B�2Z�d�h�h�z�FZ�1[�\�]� ]��8�8�J��+����� �C� �N�N��7�7�9�-��G�G�J�/�������G�G�J�/��G�G�J�/��'�'�(�+��'�'�(�+��'�'�(�+��G�G�J�/�����)� � � ��'�"�"�� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A7E �:CE � F�(E=�7F�=F�ipc��� tjdt|d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iS|jd �|jd �|jd �|jd �d�S#tj j $r}ddt|���icYd}~Sd}~wwxYw)uDIP 定位根据用户输入的 IP 地址,定位 IP 的所在位置zhttps://restapi.amap.com/v3/ip)rr;rrrrzIP Location failed: rrrrr5� rectangle)rrr5r=r!Nr")r;r*r+r,s r�maps_ip_locationr>Rs���6��<�<� ,�(��� �� �!�!�#��}�}��� ��>�S� ��3�D�H�H�V�4D�4\����Q[�H\�3]�^�_� _�����,��H�H�V�$��h�h�x�(����+�.�  � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A.B4�1AB4�4C+�C&� C+�&C+c�� tjdt|dd���}|j�|j �}|ddk7r)dd|jd �xs|jd ���iS|jd g�}|sdd iS|d d|d dd�S#tj j $r}ddt|���icYd}~Sd}~wwxYw)u?根据城市名称或者标准adcode查询指定城市的天气z/https://restapi.amap.com/v3/weather/weatherInfo�all)rr� extensionsrrrrzGet weather failed: rr� forecastszNo forecast data availablerr�casts)rrBr!Nr")rr*r+rBr,s r� maps_weatherrDls���6��<�<� =�(��#�� �� �!�!�#��}�}��� ��>�S� ��3�D�H�H�V�4D�4\����Q[�H\�3]�^�_� _��H�H�[�"�-� ���9�:� :��a�L��(�"�1��g�.� � �� � � � /� /�6��+�C��F�8�4�5�5��6�s*�A/B�2B� B�C�8C �C� C�origin� destinationc ��� tjdt||d���}|j�|j �}|jd�dk7r)dd|jd�xs|jd ���iSg}|d d D]�}g}|d D]d}|j |jd �|jd�|jd�|jd�|jd�d���f|j |jd�|jd�|d����d |d d|d d|d�iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)u�骑行路径规划用于规划骑行通勤方案,规划时会考虑天桥、单行线、封路等情况。最大支持 500km 的骑行路线规划z/https://restapi.amap.com/v4/direction/bicycling�rrErFr�errcoderrzDirection bicycling failed: rrr+�paths�steps� instruction�road�distance� orientation�duration�rLrMrNrOrP�rNrPrKrErF�rErFrJr!N� r#r$r r%r&r7r'r(r)� rErFr*r+rJ�pathrK�stepr,s r�maps_bicyclingrX�s���(6��<�<� =�(� �*�� �� �!�!�#��}�}��� �8�8�I� �!� #��;�D�H�H�V�<L�<d�PT�PX�PX�Yc�Pd�;e�f�g� g�����L��)� �D��E��W� � ��� � �#'�8�8�M�#:� �H�H�V�,� $���� 4�#'�8�8�M�#:� $���� 4� �� � �L�L� �H�H�Z�0� �H�H�Z�0��� � �" ��v�,�x�0�#�F�|�M�:��� � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A;E�>CE�E9�E4�.E9�4E9c ��� tjdt||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|d d D]�}g}|d D]d}|j |jd �|jd�|jd�|jd�|jd�d���f|j |jd�|jd�|d����d |d d|d d|d�iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)u�步行路径规划 API 可以根据输入起点终点经纬度坐标规划100km 以内的步行通勤方案,并且返回通勤方案的数据z-https://restapi.amap.com/v3/direction/walkingrHrrrrzDirection Walking failed: rr�routerJrKrLrMrNrOrPrQrRrErFrSr!NrTrUs r�maps_direction_walkingr[�s���(6��<�<� ;�(� �*�� �� �!�!�#��}�}��� ��>�S� ��9�$�(�(�6�:J�:b�d�h�h�Wa�Nb�9c�d�e� e�����M�'�*� �D��E��W� � ��� � �#'�8�8�M�#:� �H�H�V�,� $���� 4�#'�8�8�M�#:� $���� 4� �� � �L�L� �H�H�Z�0� �H�H�Z�0��� � �" ��w�-��1�#�G�}�]�;��� � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A/D6�2CD6�6E-�E(�"E-�(E-c �� tjdt||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|d d D]�}g}|d D]d}|j |jd �|jd�|jd�|jd�|jd�d���f|j |jd�|jd�|jd�|d����d |d d|d d|d�iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)u�驾车路径规划 API 可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案,并且返回通勤方案的数据z-https://restapi.amap.com/v3/direction/drivingrHrrrrzDirection Driving failed: rrrZrJrKrLrMrNrOrPrQrV)rVrNrPrKrErFrSr!NrTrUs r�maps_direction_drivingr]�s���)6��<�<� ;�(� �*�� �� �!�!�#��}�}��� ��>�S� ��9�$�(�(�6�:J�:b�d�h�h�Wa�Nb�9c�d�e� e�����M�'�*� �D��E��W� � ��� � �#'�8�8�M�#:� �H�H�V�,� $���� 4�#'�8�8�M�#:� $���� 4� �� � �L�L�����(� �H�H�Z�0� �H�H�Z�0�� � � �$ ��w�-��1�#�G�}�]�;��� � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A/E�2CE�E=�#E8�2E=�8E=�citydc ��� tjdt||||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|d jd ��r|d d D�]�}g}|jd ��r�|d D�]�} g} | jd i�jd�ro| d dD]d} | j | jd�| jd�| jd�| jd�| jd�d���fg} | jdi�jd�r�| ddD]�} g}| jd�r,| dD]$}|j d|jd�i��&| j | jd�d| jdi�jd�id| jdi�jd�i| jd�| jd�|d����|j | jd i�jd�| jd i�jd�| jd i�jd�| jd i�jd�| d�d| id| jd i�jd�id| jd!i�jd�i| jd"i�jd�| jd"i�jd#�d$�d%�����|j |jd�|jd&�|d'�����d |d d|d d|d jd�|d(�iS#tj j$r}dd)t|���icYd*}~Sd*}~wwxYw)+u�根据用户起终点经纬度坐标规划综合各类公共(火车、公交、地铁)交通方式的通勤方案,并且返回通勤方案的数据,跨城场景下必须传起点城市与终点城市z8https://restapi.amap.com/v3/direction/transit/integrated)rrErFrr^rrrrz%Direction Transit Integrated failed: rrrZ�transits�segments�walkingrKrLrMrN�action�assistant_action)rLrMrNrcrd�bus�buslines� via_stops�name�departure_stop� arrival_stoprP)rhrirjrNrPrgrErF)rErFrNrPrK�entrance�exit�railway�trip)rhrn)rbrerkrlrm�walking_distance)rProra)rErFrNr`r!NrT)rErFrr^r*r+r`�transitra�segment� walking_stepsrWrf�buslinerg�stopr,s r�!maps_direction_transit_integratedrus���S6��<�<� F�(� �*��� �  �� �!�!�#��}�}��� ��>�S� ��D�T�X�X�f�EU�Em�Y]�Ya�Ya�bl�Ym�Dn�o�p� p��� ��=� � �Z� (���=��4�5 �����;�;�z�*�#*�:�#6�,��(*� �"�;�;�y�"�5�9�9�'�B�(/� �(:�7�(C�#�� -� 4� 4�37�8�8�M�3J�,0�H�H�V�,<�04����0D�.2�h�h�x�.@�8<���AS�8T� 6"�!#�#�$&��"�;�;�u�b�1�5�5�j�A�+2�5�>�*�+E� #��,.� �#*�;�;�{�#;�07� �0D�%U��(1�(8�(8�&�$�(�(�6�BR�9S�(T�%U�!)���,3�K�K��,?�7=�w�{�{�K[�]_�?`�?d�?d�ek�?l�6m�5;�W�[�[��Y[�=\�=`�=`�ag�=h�4i�07� � �J�0G�07� � �J�0G�1:� 1"�!#� #�!���*1�+�+�i��*D�*H�*H��*R�/6�{�{�9�b�/I�/M�/M�m�/\�,3�K�K� �2�,F�,J�,J�:�,V�,3�K�K� �2�,F�,J�,J�:�,V�)6� (�%/��#9�)/����Z��1L�1P�1P�QW�1X�(Y�%+�W�[�[���-D�-H�-H��-P�$Q�(/� � �I�r�(B�(F�(F�v�(N�(/� � �I�r�(B�(F�(F�v�(N�(�)��;,�\��� '� � �J� 7�(/� � �4F�(G� (�!��c5 �p ��w�-��1�#�G�}�]�;� ��M�-�-�j�9�$� � � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A1N:�4MN:�:O1�O,�&O1�,O1�origins�typec �� tjdt|||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|d D]T}|j |jd �|jd �|jd �|jd�d���Vd |iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)uX测量两个经纬度坐标之间的距离,支持驾车、步行以及球面距离测量z$https://restapi.amap.com/v3/distance)rrvrFrwrrrrzDirection Distance failed: rrr8� origin_id�dest_idrNrP)ryrzrNrPr!NrT)rvrFrwr*r+r8�resultr,s r� maps_distancer|is��6��<�<� 2�(�"�*�� � �� �!�!�#��}�}��� ��>�S� ��:�4�8�8�F�;K�;c�t�x�x�Xb�Oc�:d�e�f� f����9�o� �F� �N�N�#�Z�Z� �4�!�:�:�i�0�"�J�J�z�2�"�J�J�z�2� � � ��7�#�#�� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A0C�3A!C�D �2D�D �D �keywords� citylimitc �"� tjdt|||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|jd i�jd �r/|d d D]$}|j d |jd �i��&g}|jd g�D]T}|j |jd�|jd �|jd�|jd�d���V|jd i�jd�|d�|d�S#tj j$r}ddt|���icYd}~Sd}~wwxYw)u^关键词搜索 API 根据用户输入的关键字进行 POI 搜索,并返回相关的信息z&https://restapi.amap.com/v3/place/text)rr}rr~rrrrzText Search failed: rr� suggestion�citiesrh�pois�idr.�typecode�r�rhr.r�r})r}r�)r�r�r!NrT) r}rr~r*r+�suggestion_citiesr��poir,s r�maps_text_searchr��s���&6��<�<� 4�(�$��&� � �� �!�!�#��}�}��� ��>�S� ��3�D�H�H�V�4D�4\����Q[�H\�3]�^�_� _��� �8�8�L�"� %� )� )�(� 3��\�*�8�4� E��!�(�(�&�$�(�(�6�2B�)C�D� E����8�8�F�B�'� �C� �K�K��g�g�d�m�������7�7�9�-��G�G�J�/� � � �!�H�H�\�2�6�:�:�:�F�+���  � �� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A0E�3C#E�F�4F �F� F�radiusc �8� tjdt|||d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iSg}|jd g�D]T}|j |jd �|jd �|jd �|jd�d���Vd |iS#tj j$r}ddt|���icYd}~Sd}~wwxYw)u_周边搜,根据用户传入关键词以及坐标location,搜索出radius半径范围的POIz(https://restapi.amap.com/v3/place/around)rrr�r}rrrrzAround Search failed: rrr�r�rhr.r�r�r!NrT)rr�r}r*r+r�r�r,s r�maps_around_searchr��s��6��<�<� 6�(�$� �$� � �� �!�!�#��}�}��� ��>�S� ��5�d�h�h�v�6F�6^�$�(�(�S]�J^�5_�`�a� a����8�8�F�B�'� �C� �K�K��g�g�d�m�������7�7�9�-��G�G�J�/� � � ���~��� � � � /� /�6��+�C��F�8�4�5�5��6�s%�A0C"�3A.C"�"D�?D�D�Dr�c ��� tjdt|d���}|j�|j �}|ddk7r)dd|jd�xs|jd ���iS|jd �sdd iS|d d }|jd �|jd�|jd�|jd�|jd�|jd�|jd�|jd�d�}|jd�r|j |d�|S#tj j$r}ddt|���icYd}~Sd}~wwxYw)uB查询关键词搜或者周边搜获取到的POI ID的详细信息z(https://restapi.amap.com/v3/place/detail)rr�rrrrzGet poi detail failed: rrr�z No POI foundrr�rhrr.� business_area�citynamerw�alias)r�rhrr.r�rrwr��biz_extr!N) r#r$r r%r&�updater'r(r))r�r*r+r�r{r,s r�maps_search_detailr��sR��#6��<�<� 6�(��� �� �!�!�#��}�}��� ��>�S� ��6�t�x�x��7G�7_�4�8�8�T^�K_�6`�a�b� b��x�x����^�,� ,��6�l�1�o���'�'�$�-��G�G�F�O���� �+��w�w�y�)� �W�W�_�5��G�G�J�'��G�G�F�O��W�W�W�%�  �� �7�7�9� � �M�M�#�i�.� )�� �� � � � /� /�6��+�C��F�8�4�5�5��6�s+�A.D8�1D8�B1D8�8E/�E*�$E/�*E/�__main__)N)r)��false)�1000r�)r �typingrrrrr#�mcp.server.fastmcprr)rr �mcp�toolr-r:r>rDrXr[r]rur|r�r�r��__name__�run�rr�<module>r�s�� �,�,��&��S�� �M�� �k�������6�S�6�T�#�s�(�^�6� �6�0����%6�c�%6��#��%6�$�s�C�x�.�%6� �%6�N����6��6��c�3�h��6� �6�2����6�s�6�t�C��H�~�6� �6�8����*6�3�*6�S�*6�T�#�s�(�^�*6� �*6�X����*6�3�*6�S�*6�T�#�s�(�^�*6� �*6�X����+6�3�+6�S�+6�T�#�s�(�^�+6� �+6�Z����U6�c�U6��U6�3�U6�WZ�U6�_c�dg�il�dl�_m�U6� �U6�n����6�3�6�S�6��6�d�3�PS�8�n�6� �6�>����(6�s�(6�#�(6�s�(6�QU�VY�[^�V^�Q_�(6� �(6�T����6��6�c�6�c�6�SW�X[�]`�X`�Sa�6� �6�>����%6�3�%6�4��S��>�%6� �%6�N �z���G�G�I�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/sugarforever/amap-mcp-server'

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