summaryrefslogtreecommitdiff
path: root/src/mcp_sd15/server.py
blob: b8dc69d587051e2ac2b6f570953baaa6f5de706f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""MCP public surface: three intentionally small image tools."""

from __future__ import annotations

from typing import Literal

from mcp.server import MCPServer
from mcp.server.mcpserver import Image

from .service import ImageGenerationService
from .tools.generate_guided_image import generate_guided_image as guided_adapter
from .tools.generate_image import generate_image as image_adapter
from .tools.inpaint_image import inpaint_image as inpaint_adapter

Size = Literal["square_512", "landscape_512", "portrait_512"]
GuidanceMode = Literal["depth", "openpose", "openpose_full"]


def create_server(service: ImageGenerationService) -> MCPServer:
    server = MCPServer("mcp-sd15")

    @server.tool()
    async def generate_image(
        positive_prompt: str,
        negative_prompt: str | None = None,
        size: Size | None = None,
    ) -> Image:
        """Generate one PNG from a positive prompt using the configured SD1.x model."""
        result = await image_adapter(service, positive_prompt, negative_prompt, size)
        return Image(data=result.png_data, format="png")

    @server.tool()
    async def generate_guided_image(
        positive_prompt: str,
        control_mode: GuidanceMode,
        input_image: str,
        negative_prompt: str | None = None,
        size: Size | None = None,
    ) -> Image:
        """Generate one PNG guided by Depth, OpenPose, or full OpenPose.

        input_image is a Base64 PNG/JPEG or an image data URI.
        """
        result = await guided_adapter(
            service, positive_prompt, control_mode, input_image, negative_prompt, size
        )
        return Image(data=result.png_data, format="png")

    @server.tool()
    async def inpaint_image(
        positive_prompt: str,
        input_image: str,
        mask_image: str,
        negative_prompt: str | None = None,
        size: Size | None = None,
    ) -> Image:
        """Regenerate white mask areas and return one PNG.

        Both images are Base64 PNG/JPEG values or image data URIs.
        """
        result = await inpaint_adapter(
            service, positive_prompt, input_image, mask_image, negative_prompt, size
        )
        return Image(data=result.png_data, format="png")

    return server