使用 Gradio 和 MCP 构建模块化图像处理服务器

社区文章 发布于 2025 年 5 月 19 日

作者:梁文

现代 AI 工作流通常需要一种模块化、可组合的方式来公开工具(例如图像或文本处理),这些工具可以从任何地方调用——无论是 API、用户界面还是另一个 AI 代理。模型上下文协议 (MCP) 提供了一个统一的框架,通过事件驱动协议公开函数(工具)。结合 Gradio,您可以快速搭建用于交互式和程序化使用的 Web UI 或 HTTP 端点。

在这篇文章中,我将逐步介绍如何使用 Gradio 的 MCP 服务器模式和一个以编程方式调用每个函数的 Python 客户端来构建一个简单的图像编辑服务器,展示这种架构如何轻松实现工具集成和远程自动化。


架构概览

  • 服务器:通过 Gradio Blocks 公开图像处理工具(灰度、旋转、对比度),每个函数都可作为 MCP 工具使用。
  • 客户端:连接到服务器的 MCP 端点,上传图像,并远程调用每个工具,保存结果。

图表:端到端 MCP 工作流

image/png


实现图像编辑服务器

以下部分展示了使用 Gradio Blocks 和 MCP 的最小服务器实现。此服务器将多个图像处理工具公开为可调用 MCP 函数 (server.py)

import gradio as gr
from PIL import Image, ImageEnhance

def to_grayscale(img: Image.Image) -> Image.Image:
    return img.convert("L").convert("RGB")

def rotate_image(img: Image.Image, angle: float) -> Image.Image:
    return img.rotate(angle, expand=True)

def adjust_contrast(img: Image.Image, factor: float) -> Image.Image:
    enhancer = ImageEnhance.Contrast(img)
    return enhancer.enhance(factor)

with gr.Blocks() as demo:
    gr.Markdown("# Image Editing MCP Server")
    with gr.Tab("Grayscale"):
        inp_g = gr.Image(type="pil", label="Input Image")
        out_g = gr.Image(type="pil", label="Grayscale Output")
        gr.Button("Convert").click(to_grayscale, inp_g, out_g)
    with gr.Tab("Rotate"):
        inp_r = gr.Image(type="pil", label="Input Image")
        angle = gr.Slider(0, 360, value=90, label="Angle")
        out_r = gr.Image(type="pil", label="Rotated Output")
        gr.Button("Rotate").click(rotate_image, [inp_r, angle], out_r)
    with gr.Tab("Contrast"):
        inp_c = gr.Image(type="pil", label="Input Image")
        factor = gr.Slider(0.1, 3.0, value=1.5, label="Contrast Factor")
        out_c = gr.Image(type="pil", label="Adjusted Output")
        gr.Button("Adjust").click(adjust_contrast, [inp_c, factor], out_c)

if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        mcp_server=True,  # <-- Enables MCP endpoint!
        debug=True
    )

关键点:mcp_server=True 设置为 true 会告诉 Gradio 将每个工具公开为 MCP 端点。现在,任何支持 MCP 协议的东西都可以列出、描述和调用这些函数!


使用 MCP 客户端进行程序化图像处理

客户端演示了如何连接到服务器,将图像编码为数据 URI,并通过 MCP 调用每个工具 (client.py)

import asyncio, base64
from mcp import ClientSession
from mcp.client.sse import sse_client

async def main():
    server_url = "https://:7860/gradio_api/mcp/sse"
    # Encode image as data URI
    with open("input.png", "rb") as f:
        raw = f.read()
    b64 = base64.b64encode(raw).decode("ascii")
    data_uri = f"data:image/png;base64,{b64}"

    async with sse_client(server_url) as (read_stream, write_stream):
        async with ClientSession(read_stream, write_stream) as session:
            await session.initialize()
            tools = await session.list_tools()
            # ... print available tools ...
            async def call_and_save(tool_name, args, out_path):
                res = await session.call_tool(tool_name, args)
                # ... decode and write result ...
            await call_and_save("to_grayscale", {"img": data_uri}, "output_grayscale.png")
            await call_and_save("rotate_image", {"img": data_uri, "angle": 90}, "output_rotated.png")
            await call_and_save("adjust_contrast", {"img": data_uri, "factor": 1.5}, "output_contrast.png")

if __name__ == "__main__":
    asyncio.run(main())

亮点

  • 工具列表:客户端可以在运行时发现可用工具,适应服务器公开的任何工具。
  • 流式输出:MCP 支持分块的、基于事件的通信,这对于异步生成数据的 AI 工具来说是理想的选择。

为什么将 MCP 与 Gradio 结合使用?

  • 可组合性:将任何 Python 函数公开为远程工具,以便它可以从脚本、Web UI 甚至其他 AI 代理使用。这使得在项目之间共享和重用逻辑变得容易。
  • 灵活性:只需编辑 Gradio Blocks 定义即可轻松添加或删除工具。您无需处理 REST API 样板或自定义路由,MCP 会为您处理管道。
  • 交互式或自动化:同一服务器同时支持实时 Web 演示和批处理自动化,让您可以快速原型化,然后将这些工具用于生产管道或自动化脚本而无需更改。

后续步骤

  • 添加更多图像工具,或扩展到音频/文本处理!
  • 与 LLM 集成,通过自然语言指令组合工具使用。
  • 部署服务器以实现协作式 AI 工作流。

MCP + Gradio 是一种轻量级、Pythonic 的方式,可以为人类和机器用户提供模块化 AI 工具。在您的下一个项目中尝试一下吧!


社区

注册登录 以评论