ops-mcp
Click on "Deploy 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., "@ops-mcpWhy did my-api die last night? Give me evidence and the fix."
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.
🔌 ops-mcp
One MCP server. Your AI agent just learned forensics.
Zero dependencies · One file · The MCP framing is implemented by hand
You already have AI agents. What they don't have is your ops tooling.
ops-mcp is a Model Context Protocol server that exposes the fernedy ops suite as native tools for any MCP client — Claude Desktop, opencode, Cursor, or anything that speaks stdio JSON-RPC:
Tool | Your agent can now ask... |
| "Why did my-api die last night? Give me evidence and the fix." |
| "Write the obituary for the container that just died." |
| "How sinful is the history of this repo we're about to fix?" |
No glue code, no copy-pasting terminal output into a chat window. The agent calls the tool, gets the markdown report, and reasons over it.
⚡ Quickstart
git clone https://github.com/fernedy/ops-mcp.git
git clone https://github.com/fernedy/container-autopsy.git # sibling repos
git clone https://github.com/fernedy/death-noticer.git
git clone https://github.com/fernedy/git-sins.git
cd ops-mcp
python ops_mcp.py # MCP stdio server, ready for any clientPoint your MCP client at it (Claude Desktop example):
{
"mcpServers": {
"ops-mcp": {
"command": "python",
"args": ["/path/to/ops-mcp/ops_mcp.py"]
}
}
}Related MCP server: org-as-code MCP Server
🐳 Deployed with Docker
The image is self-contained: it clones the three tool repos at build time.
docker build -t ops-mcp .
# clients must keep stdin open (-i): MCP speaks stdio
docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock ops-mcpOr configure the client directly:
{
"mcpServers": {
"ops-mcp": {
"command": "docker",
"args": ["run", "--rm", "-i",
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"ghcr.io/fernedy/ops-mcp:latest"]
}
}
}🧰 The tools
container_autopsy(container, tail?)— full forensic workup of a dead (or running) container: evidence table, cause of death, contributing findings, the fix. Powered by container-autopsy.container_obituary(container)— a shorter, warmer goodbye: lifespan, cause of death, final words. Powered by death-noticer.git_sins(repo, share?)— a confession of any git repository: nine sins with evidence and penance, 0–100 Sin Score. Powered by git-sins.
Everything is read-only: the server invokes the tool CLIs in their own repos (OPS_MCP_TOOLS_HOME, defaults to the parent directory). It never restarts, mutates or writes to your infrastructure.
🤖 AI First, by construction
This server is the AI-First layer: the deterministic tools stay the source of truth, and your agent becomes the interface that interprets and explains their reports. Human in the loop is unchanged — tools diagnose, humans act.
🛠️ How it's built
One Python file, zero dependencies. The MCP stdio framing (newline-delimited JSON-RPC 2.0: initialize, tools/list, tools/call, ping) is implemented by hand — read the source as the protocol documentation.
python -m unittest discover -v # 14 tests: real stdio handshake, real tool callsThe suite spawns the actual server process and speaks MCP to it, including a real git_sins call against a real temp repository. CI runs on Python 3.8, 3.10 and 3.12. See .github/workflows/ci.yml.
🗺️ Roadmap
This is step 2 of a linear path: tools → MCP server → guard agent. Step 3 is an always-on agent that listens for container deaths, diagnoses them through this server and prepares the fix as a PR for human approval.
📜 License
MIT — see LICENSE.
Built AI-first by Fernedy Arias · Tech Explorer
If ops-mcp made your agent actually useful at 3 AM, drop a ⭐.
Available Tools
3 toolscontainer_autopsyA
Diagnose WHY a Docker container died, not just THAT it died. Collects exit code, OOM state, restart count, uptime and last log lines, then returns a markdown autopsy report with the cause of death and the exact fix. Works on running containers too.
| Name | Required | Description | Default |
|---|---|---|---|
| tail | No | Number of log lines to collect (default 40). | |
| container | Yes | Container name or id to autopsy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what data is collected (exit code, OOM state, restart count, uptime, last log lines) and what is returned (a markdown autopsy report with cause and fix), making the tool's read-only, diagnostic nature strongly implied. It does not explicitly rule out side effects or mention permissions, but the described behavior is transparent enough for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The core purpose is front-loaded ('Diagnose WHY... not just THAT...'), followed by a compact list of collected data and the output format. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by explaining the return value: a markdown autopsy report with cause of death and exact fix. It also covers inputs implicitly through the listed collected data and mentions the running-container case. Minor gaps like failure modes or Docker daemon prerequisites prevent a perfect score, but the tool is well-specified for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description mentions 'last log lines' which maps to the tail parameter, but it adds no new detail about parameters beyond what the schema provides. Thus the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Diagnose') with a concrete resource ('a Docker container') and clearly scopes the purpose: determining WHY it died rather than merely that it died. It also differentiates from the sibling container_obituary by emphasizing cause analysis and the exact fix, not just recording the death.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when a container died and you need the cause and fix, not just a death notification. It also notes it works on running containers, broadening applicability, but it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
container_obituaryA
Write a one-off obituary for a dead Docker container: who it was, how long it lived, the cause of death (deterministic rules) and its final words (last log lines). Returns markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| container | Yes | Container name or id to mourn. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does well by stating the output format (markdown) and the deterministic nature of the cause-of-death rules, plus the fact that final words come from last log lines. It does not mention side effects or permissions, but the tool is likely read-only in spirit, and the disclosed behavior is specific and helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that packs in the tool's purpose, content, and return format without redundancy. The key verb and resource are front-loaded, and every clause adds meaning. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers the input, the behavioral rules, and the output format. It does not mention edge cases like what happens if the container is not dead or has no logs, but these are minor for a playful utility. Overall it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the only parameter ('container name or id to mourn') at 100% coverage, so the baseline is 3. The description adds the playful context 'to mourn' but no extra technical detail beyond what the schema provides. That is acceptable for a single well-documented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Write') and a clear resource ('obituary for a dead Docker container'), and enumerates the exact content (identity, lifespan, cause of death, final words). It clearly distinguishes itself from siblings like container_autopsy, which presumably analyzes container internals, and git_sins, which is unrelated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for dead containers and mentions the deterministic cause-of-death rules, which gives context on when it applies. However, it does not explicitly say when not to use it or compare it to container_autopsy, leaving some ambiguity about which tool an agent should pick for a live container or a deeper forensic analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_sinsA
The confession booth for a git repository. Analyzes the history read-only (3 AM commits, 'wip' messages, mega-commits, TODO graveyards, zombie branches...) and returns a markdown confession with evidence, penance and a 0-100 Sin Score.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | Path to the git repository to confess. | |
| share | No | Append a shareable badge block (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'read-only', which is a critical safety signal for an agent deciding whether to invoke the tool. It also discloses the output format (markdown confession) and the scoring mechanism (0-100 Sin Score), which helps the agent set expectations. It doesn't mention performance on large repos or whether it requires network access, but for a read-only analysis tool, the key behavioral trait (non-mutating) is clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-crafted sentence that front-loads the core purpose ('confession booth for a git repository'), then packs in the key details (read-only, examples of what it detects, output format, scoring). Every clause earns its place, and the playful tone doesn't obscure the technical meaning. It's appropriately sized for a tool with only 2 parameters and no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analysis tool with 2 parameters, full schema coverage, and no output schema, the description is nearly complete. It tells the agent what the tool does, what it returns, and that it's safe (read-only). The only gaps are minor: it doesn't specify whether the repo path must be absolute or relative, and it doesn't mention edge cases like empty repos or uncommitted changes. But these are not critical for an agent deciding whether to call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('repo' and 'share'). The description adds context by explaining the 'share' parameter's purpose ('Append a shareable badge block') and implies that 'repo' is a local path. The description's mention of 'markdown confession' hints at what the output looks like, which complements the schema. It doesn't add syntax details, but with full schema coverage, the baseline is 3, and the description's contextual hints push it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a vivid metaphor ('confession booth') but immediately grounds it with a specific verb ('Analyzes the history read-only'), a specific resource (git repository), and concrete examples of what it detects (3 AM commits, 'wip' messages, mega-commits, TODO graveyards, zombie branches). It also states the output format (markdown confession with evidence, penance, and a 0-100 Sin Score), making the tool's purpose unmistakable. The sibling tools (container_autopsy, container_obituary) are clearly different domains, so there's no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you want a read-only analysis of a git repository's history, with a playful but structured report. It doesn't explicitly name alternatives or exclusions, but the sibling tools are about containers, not git, so the context is clear. The 'read-only' qualifier is a useful usage signal. It could be improved by stating when NOT to use it (e.g., if you need to modify history or if the repo is not local), but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.0.0- First observed
container_autopsy - First observed
container_obituary - First observed
git_sins
TDQS
Scored across 3 tools
container_autopsy and container_obituary substantially overlap—both diagnose why a container died, examine logs, and output a markdown report. An agent would struggle to reliably choose between them despite the slight difference in depth and tone. git_sins is the only clearly distinct tool.
All three tools follow a consistent lowercase_snake_case pattern with a domain prefix and a thematic noun: container_autopsy, container_obituary, git_sins. The pattern is predictable and readable, though the playful nouns deviate slightly from conventional verb_noun naming.
Three tools is on the thin side for a server named 'ops-mcp', but the set is tightly focused on diagnostics and forensics. It feels more like a themed utility collection than an operational coverage layer, which is acceptable but not rich.
The scope is narrow—container death investigation and git history analysis—and within that scope the tools cover their stated purposes. However, the two container tools are redundant rather than complementary, and there is no action-oriented tooling (e.g., restart, cleanup) that an 'ops' user might expect.
Maintenance
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Security tools for AI agents: scan MCP servers, validate HDP delegation chains, audit releases.
Identity, authorization, audit trails, and revocable permissions for AI agents accessing MCP tools.
Compliance frameworks (SOC 2, ISO 27001, CMMC, NIST, more) delivered to AI agents as MCP tools.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables autonomous digital forensics and incident response by wrapping SIFT Workstation tools as MCP tools and orchestrating a multi-agent AI pipeline for evidence analysis and remediation planning.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with a Git-native organizational governance system, supporting proposal-validation workflows, decision-making, and audit trail management through 21 MCP tools over stdio transport.1MIT
- FlicenseAqualityCmaintenanceEnables AI agents to perform digital forensics and incident response tasks by dynamically discovering and utilizing host tools for memory analysis, metadata extraction, threat detection, and file dissection.51-
- AlicenseNot gradedqualityAmaintenanceProvides MCP tools that give AI agents persistent, append-only memory in a git repository, letting them record observations, decisions, and corrections while retrieving context briefs, current facts, conflicts, and traceable event history without a vector database.4 npmMIT