shutdown_llm_server
Terminates a local LLM server process running on a given port, ensuring safe shutdown.
Instructions
指定されたポートで稼働しているローカル LLM サーバープロセスを安全に終了させます。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | 終了させるサーバーのポート番号 |
Implementation Reference
- src/mcp_mlx_launcher/server.py:240-246 (handler)Handler for the shutdown_llm_server tool. Validates port argument is an integer, then delegates to process_manager.shutdown_server via asyncio.to_thread.
elif name == "shutdown_llm_server": port = arguments.get("port") if not isinstance(port, int): raise ValueError("Port must be an integer") result_msg = await asyncio.to_thread(process_manager.shutdown_server, port) return [types.TextContent(type="text", text=result_msg)] - Schema definition for shutdown_llm_server tool. Defines 'port' as required integer parameter.
types.Tool( name="shutdown_llm_server", description="指定されたポートで稼働しているローカル LLM サーバープロセスを安全に終了させます。", inputSchema={ "type": "object", "properties": { "port": {"type": "integer", "description": "終了させるサーバーのポート番号"} }, "required": ["port"], }, ), - src/mcp_mlx_launcher/server.py:20-128 (registration)Tool registration via @server.list_tools() decorator. shutdown_llm_server is one of 8 tools listed in the handle_list_tools function.
return [ types.Tool( name="check_system_environment", description="現在のシステム環境(Apple Siliconか、空きメモリが何GBあるかなど)を診断します。", inputSchema={ "type": "object", "properties": {}, }, ), types.Tool( name="check_llm_status", description="指定されたポートでサーバーがリッスンしているか(稼働中か)を確認します。", inputSchema={ "type": "object", "properties": { "port": {"type": "integer", "description": "確認するポート番号"} }, "required": ["port"], }, ), types.Tool( name="list_running_servers", description="現在バックグラウンドで稼働しているすべてのローカルLLMサーバー(ポート番号とモデル名)の一覧を取得します。", inputSchema={ "type": "object", "properties": {}, }, ), types.Tool( name="search_mlx_models", description="Hugging Faceからダウンロード可能なMLXフォーマットのLLMモデルを検索・リストアップします。", inputSchema={ "type": "object", "properties": { "search_query": { "type": "string", "description": "検索キーワード(例: 'llama', 'qwen')。未指定の場合は人気のMLXモデルを返します。" }, "limit": { "type": "integer", "description": "取得する最大件数。デフォルトは10。" } }, }, ), types.Tool( name="download_model", description="Hugging Faceから指定されたMLXモデルを事前にダウンロードし、ローカルにキャッシュします。大きなモデルの起動前の準備に利用します。", inputSchema={ "type": "object", "properties": { "model_name": { "type": "string", "description": "ダウンロードするモデル名 (例: mlx-community/Llama-3-8B-Instruct-4bit)" } }, "required": ["model_name"], }, ), types.Tool( name="launch_llm_server", description="mlx_lm.server をサブプロセスとしてバックグラウンドで起動します。空きメモリが少ない場合は起動が拒否されます。", inputSchema={ "type": "object", "properties": { "model_name": { "type": "string", "description": "起動するモデル名 (例: mlx-community/Llama-3-8B-Instruct-4bit)", }, "port": {"type": "integer", "description": "サーバーを起動するポート番号"}, "memory_requirement_gb": { "type": "number", "description": "起動に必要な空きメモリの目安(GB)。未指定時はデフォルトで 4.0GB。" } }, "required": ["model_name", "port"], }, ), types.Tool( name="restart_llm_server", description="指定されたポートで稼働しているサーバーを一度停止し、再起動します。モデルの切り替えなどにも使用できます。", inputSchema={ "type": "object", "properties": { "port": {"type": "integer", "description": "再起動するサーバーのポート番号"}, "model_name": { "type": "string", "description": "(オプション)新しく起動するモデル名。省略した場合は現在そのポートで稼働しているモデルをそのまま再起動します。" }, "memory_requirement_gb": { "type": "number", "description": "(オプション)起動に必要な空きメモリの目安(GB)。未指定時はデフォルトで 4.0GB。" } }, "required": ["port"], }, ), types.Tool( name="shutdown_llm_server", description="指定されたポートで稼働しているローカル LLM サーバープロセスを安全に終了させます。", inputSchema={ "type": "object", "properties": { "port": {"type": "integer", "description": "終了させるサーバーのポート番号"} }, "required": ["port"], }, ), ] - MlxProcessManager.shutdown_server - the core helper that terminates the server process by PID, with graceful termination and fallback to kill on timeout.
def shutdown_server(self, port: int) -> str: """指定されたポートで稼働しているサーバープロセスを終了させる""" state = self._load_state() port_str = str(port) if port_str not in state: return f"Error: No running server found on port {port}." pid = state[port_str]["pid"] try: proc = psutil.Process(pid) proc.terminate() proc.wait(timeout=5) except psutil.NoSuchProcess: pass except psutil.TimeoutExpired: proc.kill() except Exception as e: return f"Error during shutdown: {str(e)}" state = self._load_state() if port_str in state: del state[port_str] self._save_state(state) return f"Successfully shut down server on port {port} (PID: {pid})."