procm-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@procm-mcpStart the dev server and monitor its logs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
procm-mcp
English | 简体中文
A Model Context Protocol (MCP) server for process management.
Installation
npm i -g @hunmer/procm-mcpAI one-click setup
Ask your AI agent to run the following steps in a terminal. Install the project skills at the same time as procm-mcp.
npm i -g @hunmer/procm-mcp
npx skills add hunmer/procm-mcp --skill procm-http procm-debug procm-init -y
Start-Process -FilePath "procm-mcp" -ArgumentList "--server", "--port", "7331", "--data-path", "global"
Start-Process "http://127.0.0.1:7331"Related MCP server: Background Process Management MCP Server
Supported features
Secure and automatable process creation
Cleanup created processes automatically on termination (e.g. exiting claude code)
Common process management features supported, restarting, deleting, checking status or retreving stdout/stderr of processes
Room-based WebSocket messaging, retained readiness signals, structured logs, and batch process operations
Using these features, LLMs start processes like development servers, docker-compose, or test watchers and check their outputs to fix bugs automatically.
Run from source
Clone the repository, install dependencies, and build it locally:
git clone https://github.com/hunmer/procm-mcp.git
cd procm-mcp
npm install
npm run buildstdio MCP mode
Start the MCP server over stdio, with the dashboard on port 7331 and shared user-level data:
node ./build/index.js --port 7331 --data-path globalEnable the same command in your MCP client's project configuration (for example, .mcp.json):
{
"mcpServers": {
"procm-mcp": {
"command": "procm-mcp",
"args": ["--port", "7331", "--data-path", "global"]
}
}
}When enabling or restarting a server, use the global procm-mcp manager. Services
with built-in hot reload do not need a restart. If MCP is unavailable, load the
procm-http skill and use its HTTP fallback.
For a single Agent client, add the default stdio configuration:
{
"mcpServers": {
"procm-mcp": {
"command": "procm-mcp",
"args": ["--port", "7331", "--data-path", "global"]
}
}
}Sharing processes across multiple Agent clients (backup option)
If multiple Agent clients need to share the same process manager, use the HTTP backend started above and configure each client with:
{
"mcpServers": {
"procm-mcp": {
"type": "http",
"url": "http://127.0.0.1:7331/mcp"
}
}
}Finally, add the following rule to the project's AGENTS.md or CLAUDE.md so
the AI agent follows the same process-management policy:
When enabling or restarting a server (services with built-in hot reload do not
need a restart), use the global procm-mcp manager. If MCP is unavailable, load
the procm-http skill and use its HTTP fallback.Agent Skills
Install the project skills into the current project:
npx skills add hunmer/procm-mcp --skill procm-http procm-debug procm-init -yUse --skill <name> to install only one. Available skills are
procm-http, procm-debug, and procm-init.
The skills CLI detects the active agent and installs into its project-level
skills directory, such as .agents/skills/ for Codex.
Skill usage cases
Skill | When to use it | Example request |
| Fall back to HTTP/CLI process management when MCP is unavailable | “MCP is disconnected. Use HTTP to inspect logs on port 7331 and stop the given process.” |
| Discover project scripts and create a command catalog | “Read package.json and compose.yml, show candidates, then create |
| Coordinate clients, custom test execution, readiness, and structured logs | “Put frontend and backend in one room; publish |
These cases describe intent; execution still follows each skill's prerequisites and safety rules.
Dashboard (HTTP)
An optional web dashboard lets you view and manage running processes from a browser. It is off by default and, when enabled, binds only to 127.0.0.1 so it is not reachable from the network.
The dashboard is a React + coss frontend (in dashboard/). It is served pre-built: the Node backend serves dashboard/dist/index.html and its /assets/* bundle. When you install procm-mcp from npm the built bundle ships inside the package. If you develop procm-mcp itself and run from source, build the dashboard first:
npm run build:dashboard # builds dashboard/ -> dashboard/dist
# or build everything (dashboard + backend):
npm run buildIf the bundle is missing, GET / returns a small "dashboard not built" page with the command to run instead of failing; the REST API still works.
Enable it by setting PROCM_HTTP_PORT in the MCP server environment:
{
"mcpServers": {
"procm-mcp": {
"command": "procm-mcp",
"env": { "PROCM_HTTP_PORT": "7331" }
}
}
}Then open http://127.0.0.1:7331. Optional PROCM_HTTP_TOKEN requires an Authorization: Bearer <token> header on every request.
The dashboard can list processes, view stdout/stderr, and start, stop, or restart processes. Starting a process from the dashboard is a human-driven localhost action, equivalent to running the command yourself in a terminal.
HTTP API (same origin):
GET /→ dashboard pageGET /api/processes→ list of processes{ serverId, pid, processes: [...] }GET /api/processes/:id→ single process detailGET /api/processes/:id/logs?stream=stdout|stderr&count=200→ recent log linesPOST /api/processes→ start a process (body:{ script, name?, args?, cwd, envs?, desc?, port?, roomId?, group? })POST /api/processes/:id/stop→ stop and retain its historyPOST /api/processes/:id/restart→ restartGET /api/rooms→ list room metadata and active membersGET|PATCH /api/rooms/:roomId→ inspect or update room title/noteGET /api/rooms/:roomId/logs?memberPrefix=&level=&traceId=&count=→ merged structured room logs
Room messages vs process logs
Room WebSocket messages (publish/subscribe) are for test coordination, RPC,
and explicit event notifications. Ordinary application console.log/info/warn/error/debug
output belongs to the owning process's stdout/stderr; the dashboard LogPanel,
process-logs, and the logs/grep CLI commands read that channel. Browser or
miniapp output should use a bridge on its hosting Web process and write to that
process terminal. Do not publish all console.* calls to $procm/log merely
because a process has a roomId.
Backend mode (--server)
By default procm-mcp runs as an MCP server over stdio (with the dashboard optional via PROCM_HTTP_PORT). Pass --server to run it as a standalone HTTP backend: no MCP stdio transport, the dashboard always starts, and the process stays alive to serve it. Useful for running procm-mcp as a long-lived background service that you (or another tool) drive purely over HTTP.
# Dashboard on the default port 7331
procm-mcp --server
# Or pick a port
procm-mcp --server --port 8080
# Keep this instance's process history and logs isolated
procm-mcp --server --port 8080 --data-path .procm-mcp-data--port <number> also works in the default (stdio) mode to start the dashboard without setting PROCM_HTTP_PORT. It takes precedence over PROCM_HTTP_PORT.
If the requested port is already in use, procm-mcp automatically selects the next available port and reports it in the startup log.
--data-path <path> selects the directory used for process history, rooms, and logs. Relative paths are resolved from the current working directory. Without the flag, data is stored in .procm-mcp under the process working directory. Use --data-path global for the per-user ~/.procm-mcp directory. PROCM_MCP_DIR remains supported when set.
Run with PM2
Install procm-mcp and PM2 globally. Create an ecosystem.config.cjs file (the
configuration avoids command-line argument parsing differences on Windows):
const path = require("node:path");
const { execSync } = require("node:child_process");
const globalRoot = execSync("npm root -g", { encoding: "utf8" }).trim();
module.exports = {
apps: [{
name: "procm-mcp",
script: path.join(globalRoot, "@hunmer", "procm-mcp", "build", "index.js"),
args: "--server --port 7331 --data-path global"
}]
};Start it with PM2:
npm i -g @hunmer/procm-mcp pm2
pm2 start ecosystem.config.cjsThe dashboard is then available at http://127.0.0.1:7331. Common management
commands:
pm2 status
pm2 logs procm-mcp
pm2 restart procm-mcp
pm2 stop procm-mcp
pm2 delete procm-mcpTo persist the process across reboots:
Windows (PowerShell): install the Windows startup helper, then save the current PM2 process list:
npm i -g pm2-windows-startup pm2-startup install pm2 saveLinux/macOS: run
pm2 startup, execute the command it prints, and then runpm2 save.
Connect over HTTP (type: "http")
When procm-mcp runs with an HTTP port (--server, or --port/PROCM_HTTP_PORT), it exposes a real MCP endpoint at /mcp using the Streamable HTTP transport. This lets you connect a client that only speaks MCP-over-HTTP instead of stdio.
First run the backend (e.g. in a separate terminal / as a service):
procm-mcp --server --port 7331Then point your MCP client at it:
{
"mcpServers": {
"procm-mcp": {
"type": "http",
"url": "http://127.0.0.1:7331/mcp"
}
}
}Notes:
Process, batch, log, command, and room tools are available over
/mcp. Stdio additionally exposesprocess-input(write to a process's stdin / send a signal).Process state is shared: a process started via
/mcpis visible in the dashboard and REST API, and vice versa.If
PROCM_HTTP_TOKENis set, add it to the client config ("headers": { "Authorization": "Bearer <token>" }) where supported./mcpruns in stateless mode (no session ID) — each request is independent.
procm-commands.json
Define reusable named commands in a procm-commands.json file at the root of your project:
{
"commands": {
"dev": { "script": "npm", "args": ["run", "dev"] },
"test": { "script": "npm", "args": ["test"], "cwd": "." },
"db": { "script": "docker", "args": ["compose", "up"], "envs": { "COMPOSE_FILE": "docker-compose.yml" } }
}
}The procm-command tool (action list) returns the file's contents and the available command names. Use procm-command (action start) to start one by name. Each command's cwd is resolved relative to the project directory (the directory containing procm-commands.json).
Room clients install the separately published TypeScript SDK:
npm i @hunmer/procm-mcp-sdkimport { createLogger, createProcmClient } from "@hunmer/procm-mcp-sdk";
const client = createProcmClient({ clientName: "backend" });
const logger = createLogger({ client });
client.subscribe("debug:", (message) => console.log(message.payload), { prefix: true });
client.publish("backend:ready", { initialized: true }, { retain: true });
await client.waitFor("frontend:ready", { timeout: 30_000 });
logger.info("Backend ready", { pid: process.pid });Function hooks and in-memory traces
Trace storage is built into each procm-mcp process and requires no external service. Traces expire after 24 hours by default. PROCM_TRACE_TTL_SECONDS changes the default and accepts 1..604800 seconds. A trace is limited to 256 KiB after JSON serialization, and the LRU cache is bounded to 64 MiB total.
import { createHook, createLogger, createProcmClient, saveTrace } from "@hunmer/procm-mcp-sdk";
const client = createProcmClient({ clientName: "backend" });
const logger = createLogger({ client });
const fetchUser = createHook(async (id: string) => ({ id }), {
client,
name: "fetchUser",
captureArgs: true,
captureResult: true,
});
fetchUser.before(({ traceId, args }) => {
logger.info("fetchUser called", { userId: args[0] as string }, { traceId });
});
const user = await fetchUser("42");
const diagnosticId = await saveTrace(client, { kind: "diagnostic", user });createHook preserves this, synchronous return types, Promise behavior, and original thrown/rejected errors. Its synchronous before handlers may call setArgs() or skip(); synchronous after handlers may call setResult(). Argument/result capture is off by default. hookProperty() supports only configurable own properties and returns an idempotent restore function. Runtime locations are V8 JavaScript locations; source-map conversion and interception of local variables, closures, or read-only ESM bindings are not supported.
Hook trace storage is asynchronous and never writes trace details or storage status to the application console. saveTrace() is the explicit confirmation API and resolves only after the current procm-mcp instance accepts the record. Timeout, abort, disconnect, invalid TTL, unsafe JSON, and oversized payloads reject without leaking pending requests.
Use the trace-get MCP tool on the same HTTP Stream MCP instance with { "id": "<traceId>" }. It returns { "ok": true, "trace": ... }, or { "ok": false, "error": ... } with one of these stable codes: TRACE_NOT_FOUND, TRACE_INVALID_ID, TRACE_INVALID_PAYLOAD, TRACE_STORE_CONFLICT, TRACE_STORE_ERROR, or TRACE_REQUEST_TIMEOUT.
Trace data is intentionally ephemeral. Restarting procm-mcp clears it, LRU eviction may remove older entries before their TTL, and separate procm-mcp processes do not share traces.
Trace verification:
npm run build:sdk
npm run build
npm test
npm run test:trace
npm run test:custom-noiseManaged processes receive PROCM_ROOM_ID, PROCM_PROCESS_ID, PROCM_WS_URL, and optional authentication automatically. Explicit SDK options override environment values. See demo/ for the Node.js and Electron workflow.
Process creation has no built-in gate
start-process and procm-command (action start) execute the given command directly. procm-mcp does not restrict which commands can be started — there is no whitelist, allow-list, or approval gate. Treat start-process like any tool that runs arbitrary shell commands: keep it under human confirmation (the default in most MCP clients) and only run procm-mcp where the command set it implies is acceptable.
For network-facing setups, optional PROCM_HTTP_TOKEN requires an Authorization: Bearer <token> header on every HTTP / /mcp / dashboard request, so the locally-bound server is not driven by anything else that can reach 127.0.0.1.
Tools
start-processStart a new process with specified script and argumentsscript(required): The script/command to executecwd(required): Working directory for the processargs(optional): Array of arguments to pass to the scriptname(optional): A friendly name for the processenvs(optional): Environment variables to set for the processdesc(optional): A human-readable descriptionport(optional): Served port metadataroomId(optional): Room to join; preserved across restartgroup(optional): Dashboard grouping label; preserved across restart
batch-processStart or restart up to 100 processes with bounded concurrency and per-item resultsprocessManage a process by ID, or list all processesaction(required):get|delete|restart|listid(required for get/delete/restart): The process IDdeletestops and removes a process by ID. The default signal is SIGTERM, but SIGKILL (force killing) is sent after 10 seconds unless the process exits.
process-logsRead a process's logs by ID (tail recent, or grep with a regex)id(required): The process IDpattern(optional): A regular expression. If omitted, tails the most recent chunks instead of searching.stream(optional):"stdout"or"stderr". Tail defaults to"stdout"; in grep mode, omit to search both.count(optional): Number of entries to return (tail default: 10, grep default: 50)ignoreCase(optional): Case-insensitive matching (default: false)
process-log-filesReturn absolute stdout/stderr log file paths for a process, including historylog-filesList historical process log files with absolute paths, newest firstprocessId(optional): Filter by process IDstream(optional):"stdout"or"stderr"limit(optional): Maximum number of entries to return
process-inputWrite to a process's stdin or send it an OS signal (stdio MCP only — not exposed over/mcp; use the dashboard or REST instead)id(required): The process IDtext(optional): String to write to the process's stdinnewline(optional): Append a trailing newline totext(default: true; set false to send raw bytes)signal(optional): Send an OS signal instead — one ofSIGINTSIGTERMSIGKILLSIGHUPSIGUSR1SIGUSR2SIGTSTPSIGCONTSIGQUIT. Provide exactly one oftext/signal.
procm-commandManage processes defined inprocm-commands.jsonaction(required):list|startname(required for start): The command name as defined in the filecwd(optional): Project directory containingprocm-commands.json(default: current working directory)
roomList, inspect, or update room metadata and active membersroom-logsMerge structured logs for a room with optional member-prefix, level, and trace-ID filterstrace-getRead a complete in-memory trace by exact ID from the current procm-mcp instance
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceProduction-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.15483MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to efficiently manage and monitor background processes, with features like process startup, termination, log retrieval, and resource management.17
- AlicenseNot gradedqualityBmaintenanceEnables management of long-running development processes (such as dev servers, compilers, and watchers) from MCP hosts. Provides tools to start, stop, restart, check status, view logs, and send input to managed processes.MIT
- AlicenseNot gradedqualityCmaintenanceA lightweight, cross-platform MCP server for managing background processes. Enables AI coding agents to spawn, monitor, and interact with long-lived processes.MIT
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/hunmer/procm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server