import json import gradio as gr from mcp_mlflow_tools import ( set_tracking_uri, get_system_info, list_experiments, create_experiment, register_model, search_runs, list_registered_models, get_model_info ) def create_interface(): with gr.Blocks(title="MLflow MCP Service") as app: gr.Markdown("# MLflow MCP Service") gr.Markdown("A service that exposes MLflow functionality through a web interface and API endpoints.") with gr.Tab("Tracking & System Info"): with gr.Group(): gr.Markdown("## Set Tracking URI") uri_input = gr.Textbox(label="MLflow Tracking URI") uri_output = gr.JSON(label="Result") uri_button = gr.Button("Set URI") uri_button.click( fn=set_tracking_uri, inputs=uri_input, outputs=uri_output ) with gr.Group(): gr.Markdown("## Get System Info") sys_info_output = gr.JSON(label="System Information") sys_info_button = gr.Button("Get Info") sys_info_button.click( fn=get_system_info, inputs=[], outputs=sys_info_output ) with gr.Tab("Experiment Management"): with gr.Group(): gr.Markdown("## List Experiments") exp_list_output = gr.JSON(label="Experiments") exp_list_button = gr.Button("List Experiments") exp_list_button.click( fn=list_experiments, inputs=[], outputs=exp_list_output ) with gr.Group(): gr.Markdown("## Create Experiment") exp_name_input = gr.Textbox(label="Experiment Name") exp_tags_input = gr.Textbox(label="Tags (JSON format)", placeholder='{"key": "value"}') exp_create_output = gr.JSON(label="Result") exp_create_button = gr.Button("Create Experiment") def create_exp_with_tags(name, tags_str): """Create a new experiment. Given the name and tags""" try: tags = json.loads(tags_str) if tags_str else None except json.JSONDecodeError: return {"error": True, "message": "Invalid JSON format for tags"} return create_experiment(name, tags) exp_create_button.click( fn=create_exp_with_tags, inputs=[exp_name_input, exp_tags_input], outputs=exp_create_output ) with gr.Tab("Model Registry"): with gr.Group(): gr.Markdown("## Register Model") reg_run_id = gr.Textbox(label="Run ID") reg_artifact_path = gr.Textbox(label="Artifact Path") reg_model_name = gr.Textbox(label="Model Name") reg_output = gr.JSON(label="Result") reg_button = gr.Button("Register Model") reg_button.click( fn=register_model, inputs=[reg_run_id, reg_artifact_path, reg_model_name], outputs=reg_output ) with gr.Group(): gr.Markdown("## List Registered Models") list_models_output = gr.JSON(label="Models") list_models_button = gr.Button("List Models") list_models_button.click( fn=list_registered_models, inputs=[], outputs=list_models_output ) with gr.Group(): gr.Markdown("## Get Model Info") model_info_name = gr.Textbox(label="Model Name") model_info_output = gr.JSON(label="Model Information") model_info_button = gr.Button("Get Info") model_info_button.click( fn=get_model_info, inputs=model_info_name, outputs=model_info_output ) with gr.Tab("Run Search"): with gr.Group(): gr.Markdown("## Search Runs") search_exp_id = gr.Textbox(label="Experiment ID") search_filter = gr.Textbox(label="Filter String") search_order_by = gr.Textbox(label="Order By") search_max_results = gr.Number(label="Max Results", value=100, precision=0) search_output = gr.JSON(label="Search Results") search_button = gr.Button("Search") search_button.click( fn=search_runs, inputs=[search_exp_id, search_filter, search_order_by, search_max_results], outputs=search_output ) return app if __name__ == "__main__": app = create_interface() app.launch(mcp_server=True)