@@ -204,6 +204,73 @@ def describe_table(table: str, database: Optional[str] = None):
204204 return execute_sql (sql )
205205
206206
207+ @mcp .tool ()
208+ def show_stages ():
209+ """List available Databend stages (safe operation, not affected by MCP safe mode)"""
210+ logger .info ("Listing all stages" )
211+ return _execute_sql ("SHOW STAGES" )
212+
213+
214+ @mcp .tool ()
215+ def list_stage_files (stage_name : str , path : Optional [str ] = None ):
216+ """
217+ List files in a Databend stage (safe operation, not affected by MCP safe mode)
218+ Args:
219+ stage_name: The stage name (with @ prefix)
220+ path: Optional path within the stage
221+
222+ Returns:
223+ Dictionary containing either query results or error information
224+ """
225+ if not stage_name .startswith ('@' ):
226+ stage_name = f"@{ stage_name } "
227+
228+ if path :
229+ stage_path = f"{ stage_name } /{ path .strip ('/' )} "
230+ else :
231+ stage_path = stage_name
232+
233+ logger .info (f"Listing files in stage '{ stage_path } '" )
234+ sql = f"LIST { stage_path } "
235+ return _execute_sql (sql )
236+
237+
238+ @mcp .tool ()
239+ def show_connections ():
240+ """List available Databend connections (safe operation, not affected by MCP safe mode)"""
241+ logger .info ("Listing all connections" )
242+ return _execute_sql ("SHOW CONNECTIONS" )
243+
244+
245+ @mcp .tool ()
246+ async def create_stage (name : str , url : str , connection_name : Optional [str ] = None , ** kwargs ) -> dict :
247+ """
248+ Create a Databend stage with connection
249+ Args:
250+ name: The stage name
251+ url: The stage URL (e.g., 's3://bucket-name')
252+ connection_name: Optional connection name to use
253+ **kwargs: Additional stage options
254+
255+ Returns:
256+ Dictionary containing either query results or error information
257+ """
258+ logger .info (f"Creating stage '{ name } ' with URL '{ url } '" )
259+
260+ sql_parts = [f"CREATE STAGE { name } " , f"URL = '{ url } '" ]
261+
262+ if connection_name :
263+ sql_parts .append (f"CONNECTION = (CONNECTION_NAME = '{ connection_name } ')" )
264+
265+ # Add any additional options from kwargs
266+ for key , value in kwargs .items ():
267+ if key not in ['name' , 'url' , 'connection_name' ]:
268+ sql_parts .append (f"{ key .upper ()} = '{ value } '" )
269+
270+ sql = " " .join (sql_parts )
271+ return _execute_sql (sql )
272+
273+
207274def main ():
208275 """Main entry point for the MCP server."""
209276 try :
0 commit comments