summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mcp_sd15/cli.py10
-rw-r--r--src/mcp_sd15/config.py23
2 files changed, 32 insertions, 1 deletions
diff --git a/src/mcp_sd15/cli.py b/src/mcp_sd15/cli.py
index 8bc1e20..3a3a9f7 100644
--- a/src/mcp_sd15/cli.py
+++ b/src/mcp_sd15/cli.py
@@ -37,7 +37,15 @@ def main(argv: Sequence[str] | None = None) -> int:
)
backend = ModelManager(config)
service = ImageGenerationService(config, backend)
- create_server(service).run()
+ server = create_server(service)
+ if config.server.transport == "streamable-http":
+ server.run(
+ transport="streamable-http",
+ host=config.server.host,
+ port=config.server.port,
+ )
+ else:
+ server.run()
except SD15Error as exc:
logging.getLogger(__name__).error("startup failed: %s", exc)
return 2
diff --git a/src/mcp_sd15/config.py b/src/mcp_sd15/config.py
index 1a5a71d..df2da34 100644
--- a/src/mcp_sd15/config.py
+++ b/src/mcp_sd15/config.py
@@ -12,6 +12,7 @@ from .errors import ConfigError
VALID_SIZES = frozenset({"square_512", "landscape_512", "portrait_512"})
VALID_SCHEDULERS = frozenset({"dpmpp_2m_karras", "dpmpp_2m_sde_karras", "euler_a", "ddim", "lcm"})
+VALID_TRANSPORTS = frozenset({"stdio", "streamable-http"})
@dataclass(frozen=True)
@@ -72,11 +73,19 @@ class OutputConfig:
@dataclass(frozen=True)
+class ServerConfig:
+ transport: str = "stdio"
+ host: str = "127.0.0.1"
+ port: int = 8000
+
+
+@dataclass(frozen=True)
class AppConfig:
model: ModelConfig
generation: GenerationConfig
controlnet: ControlNetConfig
output: OutputConfig
+ server: ServerConfig = ServerConfig()
def controlnet_path(self, mode: str) -> Path:
item = self.controlnet.for_mode(mode)
@@ -208,11 +217,25 @@ def load_config(path: str | Path, *, validate_paths: bool = True) -> AppConfig:
if not output_dir.is_absolute():
output_dir = config_path.parent / output_dir
+ server_raw = _table(raw, "server")
+ transport = _string(server_raw, "transport") or "stdio"
+ if transport not in VALID_TRANSPORTS:
+ raise ConfigError(f"unsupported transport: {transport}")
+ host = _string(server_raw, "host") or "127.0.0.1"
+ port_value = server_raw.get("port", 8000)
+ if (
+ isinstance(port_value, bool)
+ or not isinstance(port_value, int)
+ or not 1 <= port_value <= 65535
+ ):
+ raise ConfigError("server.port must be an integer between 1 and 65535")
+
config = AppConfig(
model=ModelConfig(root, checkpoint, vae, tuple(loras)),
generation=GenerationConfig(steps_value, cfg_scale, scheduler, default_size),
controlnet=controlnet,
output=OutputConfig(output_dir.resolve(), _bool(output_raw, "enabled", False)),
+ server=ServerConfig(transport, host, port_value),
)
if validate_paths:
validate_model_paths(config)