mcp-task-runner
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., "@mcp-task-runnerregister a task named 'health' to run 'echo ok'"
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.
mcp-task-runner
An MCP server that lets an AI assistant run and schedule shell tasks safely.
Every command is checked against an allow-list + deny-list before execution, runs
with shell=False (no shell injection), and is killed if it exceeds a timeout.
┌────────────┐ register_task / run_task ┌────────────────────┐
│ MCP Client │ ─────────────────────────▶ │ task-runner │
│ (assistant)│ ◀───────────────────────── │ (FastMCP) │
└────────────┘ stdout / rc / status └─────────┬──────────┘
│
┌────────────────────────────┼──────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ security │ ─pass─▶ │ runner │ ─────▶ │ schedule │
│ allow/deny │ │ subprocess │ │ 30s/5m/1h.. │
└──────────────┘ │ + timeout │ └──────────────┘
└──────────────┘Why this exists
Giving an LLM the ability to run shell commands is powerful but dangerous.
mcp-task-runner adds a policy layer: only vetted binaries run, shell
metacharacters can't inject, and nothing runs forever. The assistant gets a
controlled "remote hands" without a foot-gun.
Safety model
Control | Mechanism |
Binary allow-list | Only known-safe binaries ( |
Deny-list |
|
No shell | Executed as an argv list with |
Timeout | Wall-clock cap kills runaway processes |
Fail-fast | Bad commands rejected at registration time |
Features
Register named tasks once, run them by name
Per-task result history (
last(),history)Schedule expressions:
30s,5m,2h,1d100% offline-testable core (execution is injectable)
Install
pip install -r requirements.txtUse as an MCP server
python -m mcp_task_runner.serverTools:
register_task(name, command)— validate + store a taskrun_task_by_name(name, timeout?)— execute, return stdout/rcparse_schedule(expr)— validate5m/1h/…
Use the engine directly
from mcp_task_runner.runner import TaskRunner
runner = TaskRunner()
runner.register("ping_gw", "ping -n 1 8.8.8.8") # rejects unknown binary
runner.register("build", "python -m pytest") # ok
res = runner.run("build")
print(res.ok, res.stdout)Verified invariants
rm -rf /,sudo ls,curl …⇒ rejected before executioninjected
echo ok ; rm -rf /⇒ rejected (denylist token)unknown binary ⇒ rejected
next_fire(None)fires immediately; afterwardslast + interval
Project layout
mcp-task-runner/
├── mcp_task_runner/
│ ├── __init__.py
│ ├── security.py # allow/deny validation
│ ├── runner.py # safe subprocess execution + registry
│ ├── schedule.py # interval / cron-like parsing
│ └── server.py # MCP/FastMCP adapter
├── tests/test_runner.py
├── conftest.py
├── requirements.txt
├── README.md
├── LICENSE
└── .gitignoreLicense
MIT © wzx11223344
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.
Latest Blog Posts
- 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/wzx11223344/mcp-task-runner'
If you have feedback or need assistance with the MCP directory API, please join our Discord server