Skip to main content
Glama

Hologres MCP Server

Official
by aliyun
� phdt����SSKrSSKrSSKrSSKrSSKrSSKJr SSKJr SSK J r J r J r J r SSKJr SSKJrJrJr \"S5r\R+5S\\ 4S j5rS r\R15S\\ 4S j5r\R35S \4S j5r\R55S\\ 4Sj5r\R75S\S\S\\ 4Sj5rSr\S:Xa\R@"\"55 gg)�N)�OperationalError)�Server)�Resource�Tool� TextContent�ResourceTemplate)�AnyUrl)�try_infer_view_comments�handle_read_resource�handle_call_toolzhologres-mcp-server�returnc��$# �[SSSSS9/$7f)zList basic Hologres resources.zhologres:///schemasz All Schemas in Hologres databasezWHologres is a PostgreSQL-compatible OLAP product. List all schemas in Hologres database� text/plain)�uri�name� description�mimeType)r���j/Users/timothyding/Documents/git_files/ali_inner_git/hologres-mcp-server/src/hologres_mcp_server/server.py�list_resourcesrs%��� �%�3�q�!�  � ��s�a$ System information in Hologres database, following are some common system_paths: 'hg_instance_version' Shows the hologres instance version. 'guc_value/<guc_name>' Shows the guc(Grand Unified Configuration) value. 'missing_stats_tables' Shows the tables that are missing statistics. 'stat_activity' Shows the information of current running queries. 'query_log/latest/<row_limits>' Get recent query log history with specified number of rows. 'query_log/user/<user_name>/<row_limits>' Get query log history for a specific user with row limits. 'query_log/application/<application_name>/<row_limits>' Get query log history for a specific application with row limits. 'query_log/failed/<interval>/<row_limits>' - Get failed query log history with interval and specified number of rows. c ��# �[SSSSS9[SSSSS9[SS S SS9[S S S SS9[SS[SS9/$7f)z4Define resource URI templates for dynamic resources.zhologres:///{schema}/tablesz9List all tables in a specific schema in Hologres databaser)� uriTemplaterrrz hologres:///{schema}/{table}/ddlzTable DDL in Hologres databasezGGet the DDL script of a table in a specific schema in Hologres databasez&hologres:///{schema}/{table}/statisticz%Table Statistics in Hologres databasez:Get statistics information of a table in Hologres databasez'hologres:///{schema}/{table}/partitionsz%Table Partitions in Hologres databasez?List all partitions of a partitioned table in Hologres databasezsystem:///{+system_path}z0System internal Information in Hologres database)r�HOLO_SYSTEM_DESCrrr�list_resource_templatesr5s}��� �5�L�S�!�  � �:�1�a�!�  � �@�8�T�!�  � �A�8�Y�!�  � �2�C�(�!�  �3 ��s�>Arc �� # �[U5nURS5(d$URS5(d[SU35eURS5(GaHUSSRS5nUSS:Xa2S n[ S U5nS R UVs/sHoUSPM sn5$[ U5S :XaaUS S:XaXUSnSUS3n[ SU5nS R UVs/sH$nSUSRSS5-S-US -PM& sn5$[ U5S:XaLUS S:XaCUSnUS nSUSUS3n[ SU5nS R UVs/sHowSPM sn5$[ U5S:XayUS S:XapUSnUS nSUSUS3n[ SU5SnU(a?US(a5SUS;a'USRS S!5n [XW5n X�-S -$US$S"US#U3$[ U5S:Xa�US S$:Xa�USnUS nS%US&US'3n[ S(U5n U (dS)US#U3$/S*Qn S+R U 5/n U H1nU RS+R [[U555 M3 S R U 5$GO�URS5(Ga�US,SRS5nUSS-:Xa*S.n[ S/U5SSnURS05S nU$USS1:Xa�S2n[ S3US4S59up�U (dg6S+R U 5/n U HCnUVs/sHnUb [U5OS7PM nnU RS+R U55 ME S R U 5$USS8:Xa�S9n[ S:US4S59up�U (dg;S+R U 5/n U HCnUVs/sHnUb [U5OS7PM nnU RS+R U55 ME S R U 5$USS<:XGa�Sn Sn US S=:Xa9[ U5S:Xa*[US 5nUS::ag>S?U3n[ S@US4S59up�GOUS SB:XaH[ U5SC:Xa9US nU(dgD[US5nUS::ag>SEUSFU3n[ SGUS4S59up�O�US SH:XaH[ U5SC:Xa9US nU(dgI[US5nUS::ag>SJUSFU3n[ SKUS4S59up�O_US SL:XaH[ U5SC:Xa9US nU(dgM[US5nUS::ag>SNUSFU3n[ SOUS4S59up�O[SPU35eU (dgQS+R U 5/n U HCnUVs/sHnUb [U5OS7PM nnU RS+R U55 ME S R U 5$USSR:Xag[ U5S :wa[SSU35eUS nU(dgTSUUSV3n[ SWU5n U (dSXU3$USYU SS3/n S R U 5$[SZU35es snfs snfs snfs snfs snf![a gAf=f![a gAf=f![a gAf=f![a gAf=fs snf7f)[z#Read resource content based on URI.z hologres:///z system:///zInvalid URI scheme: � N�/r�schemasa6 SELECT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema','hologres','hologres_statistic','hologres_streaming_mv') GROUP BY table_schema ORDER BY table_schema; � list_schemas� ���tablesa� SELECT tab.table_name, CASE WHEN tab.table_type = 'VIEW' THEN ' (view)' WHEN tab.table_type = 'FOREIGN' THEN ' (foreign table)' WHEN p.partrelid IS NOT NULL THEN ' (partitioned table)' ELSE '' END AS table_type_info FROM information_schema.tables AS tab LEFT JOIN pg_class AS cls ON tab.table_name = cls.relname LEFT JOIN pg_namespace AS ns ON tab.table_schema = ns.nspname LEFT JOIN pg_inherits AS inh ON cls.oid = inh.inhrelid LEFT JOIN pg_partitioned_table AS p ON cls.oid = p.partrelid WHERE tab.table_schema NOT IN ('pg_catalog', 'information_schema', 'hologres', 'hologres_statistic', 'hologres_streaming_mv') AND tab.table_schema = 'aP' AND (inh.inhrelid IS NULL OR NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inh.inhrelid = pg_inherits.inhrelid )) ORDER BY tab.table_name; �list_tables_in_schema�"z""�� partitionsa\ with inh as ( SELECT i.inhrelid, i.inhparent FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace LEFT JOIN pg_catalog.pg_inherits i on c.oid=i.inhparent where n.nspname='z' and c.relname='a�' ) select c.relname as table_name from inh join pg_catalog.pg_class c on inh.inhrelid = c.oid join pg_catalog.pg_namespace n on c.relnamespace = n.oid join pg_partitioned_table p on p.partrelid = inh.inhparent order by table_name; �get_table_partitions�ddl�SELECT hg_dump_script('"�"."�"')�list_ddlz Type: VIEWz END;�zNo DDL found for �.� statisticaK SELECT schema_name, table_name, schema_version, statistic_version, total_rows, analyze_timestamp FROM hologres_statistic.hg_table_statistic WHERE schema_name = 'z$' AND table_name = 'z?' ORDER BY analyze_timestamp DESC; �get_table_statisticszNo statistics found for )�Schema�TablezSchema Versionz Stats Versionz Total Rowsz Analyze Time� � �hg_instance_versionzSELECT HG_VERSION();�get_instance_version� �missing_stats_tablesa) SELECT * FROM hologres_statistic.hg_stats_missing WHERE schemaname NOT IN ('pg_catalog', 'information_schema','hologres','hologres_statistic','hologres_streaming_mv') ORDER BY schemaname, tablename; �get_holo_instance_versionT)� with_headersz'No tables found with missing statistics�NULL� stat_activityz� SELECT * FROM hg_stat_activity ORDER BY pid; �get_stat_activityz,No queries found with current running status� query_log�latestz%Row limits must be a positive integerzDSELECT * FROM hologres.hg_query_log ORDER BY query_start DESC LIMIT �get_latest_query_logz-Invalid row limits format, must be an integer�user�zUsername cannot be emptyz5SELECT * FROM hologres.hg_query_log WHERE usename = 'z"' ORDER BY query_start DESC LIMIT �get_user_query_log� applicationz Application name cannot be emptyz>SELECT * FROM hologres.hg_query_log WHERE application_name = '�get_application_query_log�failedzInterval cannot be emptyzaSELECT * FROM hologres.hg_query_log WHERE status = 'FAILED' AND query_start >= NOW() - INTERVAL '�get_failed_query_logzInvalid query log URI format: zNo query logs found� guc_valuezInvalid GUC URI format: zGUC name cannot be emptyzSHOW �;� get_guc_valuezNo GUC found with name z: zInvalid resource URI format: ) �str� startswith� ValueError�splitr �join�len�replacer �append�map�int)r�uri_str� path_parts�queryr�schemar$�tabler*� view_content�comments�rows�headers�result�row�version�version_number�val� formatted_row� row_limits� user_name�application_name�interval�guc_names r� read_resourcerkYs9����#�h�G� � � �~� .� .�'�2D�2D�\�2R�2R��/��y�9�:�:����.�)�)��R�S�\�'�'��,� � �a�=�I� %��E�+�>�5�A�G��9�9�g�>�g�F�Q�i�g�>�?� ?� ��_�� !�j��m�x�&?���]�F�1� 28��9�!�E�2*�*A�5�I�F��9�9�^d�e�^d�UZ�c�E�!�H�$4�$4�S�$�$?�?�#�E��a��P�^d�e�f� f� ��_�� !�j��m�|�&C���]�F��q�M�E�*� +1��1B�5�'�J� �E�*�*@�%�H�F��9�9�F�;�F�5�A�h�F�;�<� <� ��_�� !�j��m�u�&<���]�F��q�M�E�/��x�u�U�G�4�H�E�&�z�5�9�!�<�C��s�1�v��3�q�6�)�#&�q�6�>�>�*�b�#A�L�6�v�E�H�'�2�Z�?�?��q�6�M�*�6�(�!�E�7�;�;� ��_�� !�j��m�{�&B���]�F��q�M�E� &�'-�X�.#�#(�'�* � �E�(�(>��F�D��1�&���5�'�B�B�j�G��i�i��(�)�F���� � �d�i�i��C�� �6�7���9�9�V�$� $�� � � �L� )� )��R�S�\�'�'��,� � �a�=�1� 1�*�E�*�+A�5�I�!�L�Q�O�G�$�]�]�3�/��2�N�!� !� ��]�4� 4��E�1�1L�e�bf�g�M�D��@��i�i��(�)�F���TW� X�TW�S�S�_��S��&�!H�TW� � X�� � �d�i�i� �6�7���9�9�V�$� $� ��]�o� -��E�1�1D�e�Z^�_�M�D��E��i�i��(�)�F���TW� X�TW�S�S�_��S��&�!H�TW� � X�� � �d�i�i� �6�7���9�9�V�$� $� ��]�k� )��D��G��!�}��(�S��_��-A�K�!$�Z��]�!3�J�!�Q��F�b�cm�bn�o�E�$8�9O�QV�ei�$j�M�D�'��A��&�(�S��_��-A�&�q�M� � �5�K�!$�Z��]�!3�J�!�Q��F�S�T]�S^�_A�BL�AM�N�E�$8�9M�u�cg�$h�M�D�'��A��-�/�C� �O�q�4H�#-�a�=� �'�=�K�!$�Z��]�!3�J�!�Q��F�\�]m�\n�oQ�R\�Q]�^�E�$8�9T�V[�jn�$o�M�D�'��A��(�*�s�:��!�/C�%�a�=���5�K�!$�Z��]�!3�J�!�Q��F��AI�@J�Jl�mw�lx�y�E�$8�9O�QV�ei�$j�M�D�'� !�#A�'��!K�L�L��,��i�i��(�)�F���TW� X�TW�S�S�_��S��&�!H�TW� � X�� � �d�i�i� �6�7���9�9�V�$� $� ��]�k� )��:��!�#� �#;�G�9�!E�F�F�!�!�}�H��1��H�:�Q�'�E�'���?�D��0�� �;�;�!� �"�T�!�W�Q�Z�L�1�2�F��9�9�V�$� $� �4�W�I�>� ?�?��I?��@f��,<��V!Y��$!Y��"�K�J�K��"�K�J�K��"�K�J�K��"�K�J�K��!Y�s�BZ>�Y �'AZ>�,+Y%�A Z>�$Y*�2GZ>�Y/�A2Z>� Y4�&AZ>�Y9�Z>�Y9�+'Z>�Z �'Z>�(Z �=&Z>�$Z�8Z>�9Z�&Z>�5Z)� Z>� Z)�2Z>�Z9�+CZ>�9 Z�Z>�Z�Z>� Z�Z>�Z�Z>� Z&�#Z>�%Z&�&Z>�) Z6�3Z>�5Z6�6Z>c��(# �[SSSSSSS.0S/S.S 9[S S SSSS S.0S/S.S 9[S SSSSSS.0S/S.S 9[SSSSSSS.0S/S.S 9[SSSSSS.SSS.S.SS/S.S 9[SSSSSSS.0S/S.S 9[SSSSSSS.0S/S.S 9[SS SSS!S.S"S#S0S$S%.S&.S'/S.S 9[S(S)SSS*S.SS+S,S-.S"S#S0S.S%.SS/S0S-.S1.S2S3/S.S 9[S4S5S0/S.S 9[S6S7SSSS8S.0S/S.S 9[S9S:SSSS.SSS.S.SS/S.S 9/ $7f);zList available Hologres tools.�execute_hg_select_sqlz8Execute SELECT SQL to query data from Hologres database.�objectrY�stringz7The (SELECT) SQL query to execute in Hologres database.)�typer)rp� properties�required)rr� inputSchema�%execute_hg_select_sql_with_serverlessa6Use Serverless Computing resources to execute SELECT SQL to query data in Hologres database. When the error like "Total memory used by all existing queries exceeded memory limitation" occurs during execute_hg_select_sql execution, you can re-execute the SQL with the tool execute_hg_select_sql_with_serverless.zPThe (SELECT) SQL query to execute with serverless computing in Hologres database�execute_hg_dml_sqlz\Execute (INSERT, UPDATE, DELETE) SQL to insert, update, and delete data in Hologres databse.z1The DML SQL query to execute in Hologres database�execute_hg_ddl_sqlz�Execute (CREATE, ALTER, DROP) SQL statements to CREATE, ALTER, or DROP tables, views, procedures, GUCs etc. in Hologres databse.z1The DDL SQL query to execute in Hologres database�gather_hg_table_statisticszwExecute the ANALYZE TABLE command to have Hologres collect table statistics, enabling QO to generate better query plansz Schema name in Hologres databasezTable name in Hologres database)rZr[rZr[�get_hg_query_planz3Get query plan for a SQL query in Hologres databasez-The SQL query to analyze in Hologres database�get_hg_execution_planzVGet actual execution plan with runtime statistics for a SQL query in Hologres database�call_hg_procedurez-Call a stored procedure in Hologres database.z=The name of the stored procedure to call in Hologres database�arrayrpzBThe arguments to pass to the stored procedure in Hologres database)rp�itemsr)�procedure_name� argumentsr}�"create_hg_maxcompute_foreign_tablez`Create a MaxCompute foreign table in Hologres database to accelerate queries on MaxCompute data.z&The MaxCompute project name (required)�defaultz9The MaxCompute schema name (optional, default: 'default'))rpr�rz%The MaxCompute table names (required)�publicz?The local schema name in Hologres (optional, default: 'public'))�maxcompute_project�maxcompute_schema�maxcompute_tables� local_schemar�r��list_hg_schemaszLList all schemas in the current Hologres database, excluding system schemas.�list_hg_tables_in_a_schemaz�List all tables in a specific schema in the current Hologres database, including their types (table, view, foreign table, partitioned table).z4Schema name to list tables from in Hologres database�show_hg_table_ddlzIShow DDL script for a table, view, or foreign table in Hologres database.)rrrr� list_toolsr�Vs���� �(�R� �� (�'`��� %�I� � � �8�S� �� (�'y��� %�I� � � �%�v� �� (�'Z��� %�I� � � �%�[� �� (�'Z��� %�I� � � �-�R� �!)�'I�� !)�'H�� �&�w�/� � �$ �$�M� �� (�'V��� %�I� � � � $�l���$�#R��� !� �  � � � �C��%�#b�#� $����$h� � �*�*� ��* � 1�v��%�#K�'� %�(�#^�&� $����$K� &�%�'�#d�!�#�..�/B�C�3 ��@ � �b���� �� � )�d���$�#Y��� "� �  � � � �_��%�#E�� %�#D�� �"�7�+�  ��mH �H�s�DDrr~c ���^ # �SnUS:Xa�URS5m T (d [S5e[R"ST [R5(d6[R"ST [R5(d [S5eGO*US:XadURS5m T (d [S5eT R 5R 5RS 5(d [S 5eS nGO�US :XaJURS5m T (d [S5e[U 4S jS55(d [S5eGOpUS:XaJURS5m T (d [S5e[U 4SjS55(d [S5eGO US:XaHURS5nURS5n[X4/5(d [S5eSUSU3m GO�US:Xa*URS5m T (d [S5eST 3m GO�US:Xa*URS5m T (d [S5eST 3m GOrUS:XaNURS5nURS 5nU(d [S!5eS"US#S$RU5S%3m GOUS&:Xa�URS'5nURS(S)5nURS*5n URS+S,5n [Xy/5(d [S-5eS$RU 5n S.US/US0U S1U S23 m O�US3:XaS4m O�US5:Xa*URS5nU(d [S65eS7US83m O\US9:XaHURS5nURS5n[X4/5(d [S5eS:US;US<3m O[S=U35e[UT U5n [S>[U 5S?9/$7f)@zExecute SQL commands.FrmrYzQuery is requiredz^\s*WITH\s+.*?SELECT\bz ^\s*SELECT\bzRQuery must be a SELECT statement or start with WITH followed by a SELECT statementrt�SELECTz Query must be a SELECT statementTruc3�~># �UH2nTR5R5RU5v� M4 g7f�N��strip�upperrN��.0�keywordrYs �r� <genexpr>�call_tool.<locals>.<genexpr>:s0����k�Lj��5�;�;�=�&�&�(�3�3�G�<�<�Lj���:=)�INSERT�UPDATE�DELETEz6Query must be a DML statement (INSERT, UPDATE, DELETE)rvc3�~># �UH2nTR5R5RU5v� M4 g7fr�r�r�s �rr�r�@s0����v�Lu��5�;�;�=�&�&�(�3�3�G�<�<�Lu�r�)�CREATE�ALTER�DROPz COMMENT ONz?Query must be a DDL statement (CREATE, ALTER, DROP, COMMENT ON)rwrZr[zSchema and table are requiredzANALYZE r0rxzEXPLAIN ryzEXPLAIN ANALYZE rzr}r~zProcedure name are requiredzCALL �(z, �)rr�r�r�r�r�r�z5maxcompute_project and maxcompute_tables are requiredz$ IMPORT FOREIGN SCHEMA "�#z" LIMIT TO (z7) FROM SERVER odps_server INTO z ; r�a SELECT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema','hologres','hologres_statistic','hologres_streaming_mv') GROUP BY table_schema ORDER BY table_schema; r�zSchema name is requiredaq SELECT tab.table_name, CASE WHEN tab.table_type = 'VIEW' THEN ' (view)' WHEN tab.table_type = 'FOREIGN' THEN ' (foreign table)' WHEN p.partrelid IS NOT NULL THEN ' (partitioned table)' ELSE '' END AS table_type_info FROM information_schema.tables AS tab LEFT JOIN pg_class AS cls ON tab.table_name = cls.relname LEFT JOIN pg_namespace AS ns ON tab.table_schema = ns.nspname LEFT JOIN pg_inherits AS inh ON cls.oid = inh.inhrelid LEFT JOIN pg_partitioned_table AS p ON cls.oid = p.partrelid WHERE tab.table_schema NOT IN ('pg_catalog', 'information_schema', 'hologres', 'hologres_statistic', 'hologres_streaming_mv') AND tab.table_schema = 'a ' AND (inh.inhrelid IS NULL OR NOT EXISTS ( SELECT 1 FROM pg_inherits WHERE inh.inhrelid = pg_inherits.inhrelid )) ORDER BY tab.table_name; r�r+r,r-zUnknown tool: �text)rpr�)�getrO�re�match� IGNORECASEr�r�rN�any�allrQr rrM)rr~� serverlessrZr[r}�arguments_listr�r�r�r��maxcompute_table_list�resrYs @r� call_toolr�$s������J� �&�&�� � �g�&����0�1� 1��x�x�1�5�"�-�-�H�H�QS�QY�QY�Zi�kp�rt�r�r�RA�RA��q�r� r�� �8� 8�� � �g�&����0�1� 1��{�{�}�"�"�$�/�/��9�9��?�@� @�� � �%� %�� � �g�&����0�1� 1��k�Lj�k�k�k��U�V� V�l� �%� %�� � �g�&����0�1� 1��v�Lu�v�v�v��^�_� _�w� �-� -����x�(��� � �g�&���F�?�#�#��<�=� =��6�(�!�E�7�+�� �$� $�� � �g�&����0�1� 1��5�'�"�� �(� (�� � �g�&����0�1� 1�"�5�'�*�� �$� $�"���'7�8��"���{�3����:�;� ;���'�q����>�)B�(C�1�E�� �5� 5�&�]�]�+?�@��%�M�M�*=�y�I��%�M�M�*=�>�� �}�}�^�X�>� ��&�:�;�;��T�U� U� $� � �*;� <��$�$6�#7�q�9J�8K�L�,�-�.��� �  �� �"� "� �� �-� -����x�(����6�7� 7�)� *0��1 �! ��2 �$� $����x�(��� � �g�&���F�?�#�#��<�=� =�+�F�8�5���t�D���>�$��0�1�1� �4�� � 3�C� �V�S��X�J� 8� 9�9�s�OOc��&# �SSKJn U"5IShv�N up[RUU[R 55IShv�N SSS5IShv�N gNIN![ aneSnAff=fN!,IShv�N (df  g=f7f)z'Main entry point to run the MCP server.r)� stdio_serverN)�mcp.server.stdior��app�run�create_initialization_options� Exception)r�� read_stream� write_stream�es r�mainr��sq���-� �~�~�!<�+� ��'�'����1�1�3�� � ��~�~� �� � � �� ���~�~�~�ss�B�A�B�A7�,A"�A � A"� B�A5�B� A"�" A2�,A-�-A2�2A7�5B�7B�=B �> B� B�__main__)!�asyncio�logging�os�psycopgr�r�Error� mcp.serverr� mcp.typesrrrr�pydanticr �hologres_mcp_server.utilsr r r r�r�listrrrkr�r�rM�dictr��__name__r�rrr�<module>r�sG���� �� �-��C�C��e�e� � � "�#������ �d�8�n� �� � ������!�t�,<�'=�!��!�F����y@�V�y@��y@�x����K�$�t�*�K��K�Z����s:�#�s:�$�s:�4� �3D�s:��s:�j�& �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/aliyun/alibabacloud-hologres-mcp-server'

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