check_llm_status
Checks whether a local LLM server is active by testing if a specified port is listening.
Instructions
指定されたポートでサーバーがリッスンしているか(稼働中か)を確認します。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | 確認するポート番号 |
Implementation Reference
- src/mcp_mlx_launcher/server.py:143-149 (handler)Handler for the 'check_llm_status' tool. Extracts the 'port' argument from the call, validates it is an integer, then calls process_manager.is_port_in_use(port) and returns the result as a lowercase boolean string ('true'/'false').
elif name == "check_llm_status": port = arguments.get("port") if not isinstance(port, int): raise ValueError("Port must be an integer") is_running = process_manager.is_port_in_use(port) return [types.TextContent(type="text", text=str(is_running).lower())] - src/mcp_mlx_launcher/server.py:29-39 (schema)Tool registration with input schema for 'check_llm_status'. Defines name, description, and required 'port' parameter (type: integer).
types.Tool( name="check_llm_status", description="指定されたポートでサーバーがリッスンしているか(稼働中か)を確認します。", inputSchema={ "type": "object", "properties": { "port": {"type": "integer", "description": "確認するポート番号"} }, "required": ["port"], }, ), - src/mcp_mlx_launcher/server.py:17-128 (registration)Registration of all tools via @server.list_tools() decorator; the 'check_llm_status' tool is registered on lines 29-39 within the handle_list_tools function.
@server.list_tools() async def handle_list_tools() -> list[types.Tool]: """AIエージェントに提供するツールの一覧とスキーマを定義します""" 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"], }, ), ] - Helper method is_port_in_use on MlxProcessManager. Uses psutil.net_connections to check if the given port is in LISTEN state. Returns False on AccessDenied.
def is_port_in_use(self, port: int) -> bool: """指定されたポートが LISTEN 状態(使用中)かどうかを判定する""" try: for conn in psutil.net_connections(kind="inet"): if conn.laddr.port == port and conn.status == "LISTEN": return True return False except psutil.AccessDenied: return False