devglow-mcp
MCP server for devglow — let Claude Code, Codex, and Cursor start, stop, and inspect your local dev processes
npm · fingerprint 3b055f4804477f36a3a855ae · repository · RSS
17tools
2recorded versions
56dtracked
changed since 4 Sep
What changed
Changed between 4 September 2026 and 30 October 2026 (first seen 2026-10-30 13:01 UTC)
9 descriptions rewritten, 4 schema or annotation changes with the description left byte-identical, 4 tools added.
--- pinned/check_port +++ observed/check_port { + "annotations": { + "openWorldHint": false, + "readOnlyHint": true + }, "description": "Check if a TCP port is in use on localhost. When occupied, also reports who holds it — and if it's a devglow-managed project (so the user can recognize their own process). Call this BEFORE run_process / create_project to avoid silent conflicts.", "execution": { "taskSupport": "forbidden" + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "in_use": { + "type": "boolean" + }, + "occupier": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "pid": { + "type": "number" + } + }, + "required": [ + "pid", + "name" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "owned_by_devglow": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "is_ai_process": { + "type": "boolean" + }, + "project_id": { + "type": "string" + }, + "project_name": { + "type": "string" + } + }, + "required": [ + "project_id", + "project_name", + "is_ai_process" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Set when the occupier is a process DevGlow manages; null for an external process." + }, + "port": { + "type": "number" + } + }, + "required": [ + "port", + "in_use", + "occupier", + "owned_by_devglow" + ], + "type": "object" + }, "title": "Check port availability" }
--- pinned/create_project +++ observed/create_project { + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + }, "description": "Register a permanent DevGlow project WITHOUT running it. This is how you 'add a project to DevGlow' — there is no config file to author (no devglow.json / DEVGLOW.md); calling this tool IS the registration. Use it for bulk registration when you want to record metadata only (no port binding, no browser tab, no dependency install). To start the project later, call start_project. Use run_process instead when you need to actually launch a server for verification or one-off work.", "execution": { "taskSupport": "forbidden" - "description": "Short summary of what the app does (max 280 chars).", - "maxLength": 280, + "description": "What the app does, plus any notes worth keeping (max 1000 chars).", + "maxLength": 1000, "type": "string" }, "interactive": { + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "persisted": { + "description": "false means DevGlow did not register it in time and the id does not exist. Do not use it.", + "type": "boolean" + } + }, + "required": [ + "id", + "persisted" + ], + "type": "object" + }, "title": "Create a permanent project (without running)" }
+ tool added: delete_process
--- pinned/delete_project +++ observed/delete_project { - "description": "Delete a kept (permanent) DevGlow project. Stops the process if running. Does NOT apply to AI processes — those are dismissed via the UI.", + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false + }, + "description": "Delete a kept (permanent) DevGlow project. Stops the process if running. Does NOT apply to AI processes — use delete_process for those.", "execution": { "taskSupport": "forbidden" }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "removed": { + "description": "false means it is still listed after waiting.", + "type": "boolean" + } + }, + "required": [ + "id", + "removed" + ], + "type": "object" + }, "title": "Delete a permanent project" }
+ tool added: delete_workspace
--- pinned/get_logs +++ observed/get_logs { - "description": "Export and retrieve recent logs from a running or stopped process.", + "annotations": { + "openWorldHint": false, + "readOnlyHint": true + }, + "description": "Recent output of a project or AI process, oldest first, one line per entry as [timestamp] [level] message. Works whether it is running or stopped, but DevGlow keeps logs in memory only, so they are gone after the app restarts. Use it when a process exited, failed to start, or behaves unexpectedly. DevGlow writes the logs out on request, so the call can take a few seconds; if they do not arrive, DevGlow is probably not running.", "execution": { "taskSupport": "forbidden" }, - "description": "Project or AI process ID", + "description": "Project or AI process ID (from list_projects)", "type": "string" }, "lines": {
--- pinned/get_project +++ observed/get_project { - "description": "Get the full metadata for a single project or AI process (path, command, port, tags, description, status). Use this when you need details beyond what list_projects shows — for example, to duplicate a project with the same path or read its description before editing.", + "annotations": { + "openWorldHint": false, + "readOnlyHint": true + }, + "description": "Get the full metadata for a single project or AI process (path, command, port, tags, description, status). Use this when you need details beyond what list_projects shows — for example, to duplicate a project with the same path, to reuse its command in a git worktree (then call run_process with the worktree path), or to read its description before editing.", "execution": { "taskSupport": "forbidden" },
+ tool added: get_run_history
--- pinned/get_status +++ observed/get_status { - "description": "Get the running status of a specific project or AI process.", + "annotations": { + "openWorldHint": false, + "readOnlyHint": true + }, + "description": "Whether one project or AI process is running right now, with its PID. Lighter than list_projects when you already have the id, for example to confirm that start_project or stop_project took effect (both can return before the change has landed). 'No status found' means DevGlow has no entry with that id. For past runs, use get_run_history.", "execution": { "taskSupport": "forbidden" }, - "description": "Project or AI process ID", + "description": "Project or AI process ID (from list_projects)", "type": "string" } },
--- pinned/list_projects +++ observed/list_projects { - "description": "List all registered user projects and AI temporary processes with their status.", + "annotations": { + "openWorldHint": false, + "readOnlyHint": true + }, + "description": "List every registered project and AI process with its running state, port, PID, command, path and id. Projects are the user's permanent entries, started with start_project; AI processes are temporary ones created by run_process or workspace_run. Call this first: it gives you the ids the other tools take, and shows whether the user already has a project for the checkout you are working in. Also lists the tags already in use.", "execution": { "taskSupport": "forbidden" },
+ tool added: list_workspaces
--- pinned/run_process +++ observed/run_process { - "description": "Create and start ONE new temporary process. Shows in DevGlow's AI Processes section. User can later [keep] or [dismiss] it. Before calling this, run list_projects: if the user already registered a project for this path/command, call start_project instead so you run THEIR command, not a new one. Only use run_process when no matching project exists. If you are starting more than one process, call workspace_run once instead of calling this repeatedly — otherwise each process waits in the sidebar and the user sees nothing happen.", + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + }, + "description": "Create and start ONE new temporary process. Shows in DevGlow's AI Processes section. User can later [keep] or [dismiss] it. A name already used by another AI process stops and replaces that process. Before calling this, run list_projects: if the user already registered a project inside this checkout, call start_project instead so you run THEIR command, not a new one. Only use run_process when no matching project exists. In a git worktree of a registered project, this IS the right call: a project registered for the main checkout would run there, not in your worktree. Detect a worktree with `git rev-parse --path-format=absolute --git-dir --git-common-dir` (the two differ only in a linked worktree), reuse the project's command, port and interactive flag from get_project, set path to the matching directory in the worktree, and name it '<project name> (<branch>)'. If you are starting more than one process, call workspace_run once instead of calling this repeatedly — otherwise each process waits in the sidebar and the user sees nothing happen.", "execution": { "taskSupport": "forbidden" }, - "description": "Short summary of what the app does (max 280 chars). Helps the user remember the project later. Write 1-2 plain sentences from the user's perspective.", - "maxLength": 280, + "description": "What the app does, plus any notes worth keeping (max 1000 chars). Helps the user remember the project later. Start with 1-2 plain sentences from the user's perspective; append findings or gotchas below if they ask.", + "maxLength": 1000, "type": "string" }, "interactive": { + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "description": "AI process id, for get_logs, stop_project and delete_process.", + "type": "string" + }, + "last_exit_reason": { + "description": "Last log line before it exited, when it exited right after start.", + "type": [ + "string", + "null" + ] + }, + "persisted": { + "description": "Whether DevGlow registered the process within the wait. false: do not rely on the id.", + "type": "boolean" + }, + "port_conflict": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "occupier_name": { + "type": [ + "string", + "null" + ] + }, + "occupier_pid": { + "type": [ + "number", + "null" + ] + }, + "port": { + "type": "number" + } + }, + "required": [ + "port" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Set when the port was already taken; the process was registered but not started." + }, + "running": { + "type": "boolean" + }, + "state": { + "description": "running: up. error: registered but not running (port conflict, or it exited right after start). pending: registered, not confirmed running yet. unknown: DevGlow had not registered it when the wait ran out, so do not rely on the id.", + "enum": [ + "running", + "error", + "pending", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "id", + "state", + "running", + "port_conflict", + "last_exit_reason", + "persisted" + ], + "type": "object" + }, "title": "Run a new AI process" }
--- pinned/start_project +++ observed/start_project { - "description": "Start a user-registered project using its configured command (cannot modify the command). PREFER this over run_process: call list_projects first, and if a project for this path/command already exists, start it here instead of re-running it yourself. This reuses the command the user registered.", + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + }, + "description": "Start a user-registered project with its registered command, in its registered path. Neither can be changed. PREFER this over run_process: call list_projects first, and if a project is registered inside the checkout you are working in, start it here instead of running the command yourself. Do NOT use this from a git worktree for a project registered in the main checkout: it would start the main checkout, not your worktree. Use get_project, then run_process with the worktree path.", "execution": { "taskSupport": "forbidden" },
--- pinned/stop_process +++ observed/stop_process { - "description": "Stop a running AI temporary process by name.", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false + }, + "description": "Stop an AI process by its exact display name. Prefer stop_project: it takes the id from list_projects, works for projects and AI processes alike, and the id is what every other tool uses. Use this only when you know an AI process by name alone. Does not apply to permanent projects. If no AI process has exactly that name, nothing is stopped, but the response still reads as sent.", "execution": { "taskSupport": "forbidden" }, - "description": "AI process name", + "description": "Exact display name of the AI process, as shown in list_projects.", "type": "string" } },
--- pinned/stop_project +++ observed/stop_project { - "description": "Stop a running project or AI process.", + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false + }, + "description": "Stop a running project or AI process by id (from list_projects). This is the stop tool to use for both kinds. The entry stays registered: a project can be started again with start_project. To remove an AI process instead of only stopping it, use delete_process. Returns once the stop is requested; call get_status to confirm.", "execution": { "taskSupport": "forbidden" }, - "description": "Project or AI process ID", + "description": "Project or AI process ID (from list_projects)", "type": "string" } },
--- pinned/update_project +++ observed/update_project { + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false + }, "description": "Update a kept (permanent) DevGlow project's metadata. Pass only the fields you want to change. Does NOT apply to temporary AI processes — for those, set fields at run_process time or have the user keep the process first.", "execution": { "taskSupport": "forbidden" - "maxLength": 280, + "maxLength": 1000, "type": "string" }, { - "description": "Short summary (max 280 chars). Pass null or empty string to clear." + "description": "What the app does, plus any notes worth keeping (max 1000 chars). Appending to what is already there is usually right — read it with get_project first rather than overwriting. Pass null or empty string to clear." }, "id": { "description": "Project id (call list_projects first). Must be a permanent project, not an AI process (those have ids starting with 'ai-').",
--- pinned/workspace_run +++ observed/workspace_run { + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + }, "description": "Start two or more processes and arrange them on screen together in a new DevGlow workspace. PREFER this over repeated run_process calls whenever you are starting more than one process — the user does not have to ask to see them. Repeated run_process calls leave each process sitting in the sidebar until the user clicks it into a pane, so starting three that way makes the app look like nothing happened. Each process here starts exactly as run_process would. Always creates a new workspace: a name that already exists gets a numbered variant, and no existing workspace is ever modified, so a repeat call cannot disturb the user's arrangement. DevGlow chooses the split layout from its own window size; you cannot specify one. If DevGlow is closed it will be launched.", "execution": { "taskSupport": "forbidden" - "description": "Short summary of what this process is (max 280 chars).", - "maxLength": 280, + "description": "What this process is, plus any notes worth keeping (max 1000 chars).", + "maxLength": 1000, "type": "string" }, "interactive": { + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "arranged": { + "description": "Processes placed in the new workspace. 0 means no workspace was created.", + "type": "number" + }, + "processes": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "description": "AI process id, for get_logs, stop_project and delete_process.", + "type": "string" + }, + "last_exit_reason": { + "description": "Last log line before it exited, when it exited right after start.", + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "port_conflict": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "occupier_name": { + "type": [ + "string", + "null" + ] + }, + "occupier_pid": { + "type": [ + "number", + "null" + ] + }, + "port": { + "type": "number" + } + }, + "required": [ + "port" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Set when the port was already taken; the process was registered but not started." + }, + "running": { + "type": "boolean" + }, + "state": { + "description": "running: up. error: registered but not running (port conflict, or it exited right after start). pending: registered, not confirmed running yet. unknown: DevGlow had not registered it when the wait ran out, so do not rely on the id.", + "enum": [ + "running", + "error", + "pending", + "unknown" + ], + "type": "string" + } + }, + "required": [ + "id", + "state", + "running", + "port_conflict", + "last_exit_reason", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "workspace_requested": { + "description": "The name you asked for. DevGlow numbers it if a workspace with that name exists.", + "type": "string" + } + }, + "required": [ + "workspace_requested", + "arranged", + "processes" + ], + "type": "object" + }, "title": "Run processes in a new workspace" }
Current tools
Show all 17 tool fingerprints
check_port
create_project
delete_process
delete_project
delete_workspace
get_logs
get_project
get_run_history
get_status
list_projects
list_workspaces
run_process
start_project
stop_process
stop_project
update_project
workspace_run
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your devglow-mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/0eec697ec8fb6705.html)