mcp-error-handler
Allows receiving error reports from Bugsnag via webhook, funneling them into the automated fix pipeline.
Provides read-only access to the app's Confluence documentation for context when drafting fixes.
Creates pull requests with automated fixes, manages branches via persistent worktrees, and pushes changes to the repo.
Monitors CI status via the GitHub Checks API and retrieves failure logs to drive iterative fixes.
Creates tickets with root-cause analysis and assigns them automatically based on git blame.
Allows receiving error reports from Sentry via webhook, funneling them into the automated fix pipeline.
Posts notifications about new tickets and pull requests to the app's Slack channel.
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-error-handlerCheckout service is failing with payment timeout, create a PR to fix it"
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-error-handler
An MCP server that turns an application error into a reviewed pull request, with a human as the only gate before merge.
The idea
Wherever an error comes from — a Sentry alert, another tracker's webhook, or a developer just describing a bug — it lands on one entry point: report_error(app_id, data). The server doesn't know or care which tracker produced data; it can be a provider's raw JSON payload or a plain-text description, and the AI agent is responsible for reading whichever shape it gets.
The server assumes every onboarded app lives on GitHub, tracks work in Jira, and has a Slack channel — that's fixed, not pluggable. The only thing that stays source-agnostic is where the error report comes from.
From there, for the app identified by app_id, the server:
Loads that app's config (its repo, Jira project, Slack channel, Confluence space, test command).
Updates its own persistent checkout of the repo (
git pull, then agit worktreefor the fix branch) instead of cloning from scratch each time.Has an AI agent read the error, the code, and the app's Confluence docs, and draft a fix.
Opens a Jira ticket with the root-cause analysis, and assigns it automatically by running
git blameon the changed lines and resolving that author's email to a Jira account.Runs the app's
test_cmdlocally, in the worktree. This is the fast, cheap check — no need to wait on a CI queue just to find out the fix doesn't even build. If it fails, the agent revises using the local failure output and reruns, up to a retry cap (default 3). If it's still failing after that, the fix is dropped: no push, the ticket stays as analysis only.Once local tests pass (or the app has no
test_cmdconfigured at all), the agent commits, pushes the branch, and opens a GitHub PR linked to the ticket.GitHub Actions CI still has to pass — it's the authoritative check, since it can catch things a local run can't (environment differences, integration jobs, flaky infra). If CI fails despite the local pass, the server pulls the failing job's log via the GitHub Checks API, feeds it back to the agent for another revision, and pushes an update to the same branch — up to its own retry cap (default 3). If CI still isn't green after that, the PR is left open with a comment explaining what was tried, and it's now the developer's problem to finish.
Posts the ticket (and the PR link, once one exists) to the app's Slack channel so the team sees it land.
The developer's job stays the same either way: review and merge a PR that's already passing CI, pick up one that ran out of retries, or start from a ticket that never got an automated fix at all.
Any error source funnels into one ingestion call. The orchestrator pulls its own repo checkout plus the app's Confluence docs and drafts a fix, then runs the app's tests locally — fast feedback, no CI queue to wait on. A local pass (or no test command configured) pushes a PR; GitHub Actions CI is still the authoritative check, and a CI failure feeds its log back for another local revision, up to its own cap, before the PR is left for a developer either way. Slack gets notified regardless, and the assignee is resolved from git blame, not from the error source.
Related MCP server: Jira - GitHub MCP Server
Per-app config
The server holds one small config per onboarded app — nothing app-specific lives in the target repo itself:
app_id: checkout-service
repo_url: git@github.com:org/checkout-service.git # GitHub, always
default_branch: main
jira_project_key: CHK
slack_channel: "#checkout-alerts"
confluence_space: CHK # app documentation the agent reads for context
ai_provider: claude # which coding agent drafts the fix — claude | codex | ...
test_cmd: npm test # optional — omitting it skips straight to push + PR
default_assignee: jane@org.com # fallback when git blame can't resolve a Jira user
local_max_attempts: 3 # revise-and-rerun attempts against test_cmd before giving up
ci_max_attempts: 3 # revise-and-repush attempts against CI before flagging a developerDesign decisions worth remembering
Source-agnostic ingestion, fixed tooling. The error report can come from anywhere (Sentry JSON, another tracker's webhook, a developer's sentence) via a thin per-provider webhook route that forwards into
report_error— no per-provider parsing lives in the server. But GitHub, Jira, and Slack are fixed assumptions, not pluginized; the server talks to their APIs directly. MCP itself only speaks JSON-RPC, so providers hit plain webhook routes on the same server, not the MCP endpoint.Persistent worktrees, not fresh clones. Each app's repo is checked out once at onboarding; every fix reuses it via
git pull+git worktree add, which also keeps concurrent fixes for the same app from clobbering each other's working state.Two gates, not one. Local
test_cmdruns first because waiting on a CI queue for feedback the repo can give you in seconds is wasteful — a fix that's obviously broken never leaves the worktree. GitHub Actions CI runs after, because it's the authoritative signal (integration jobs, environment differences a local run won't catch) and still gets its own revise loop when it disagrees with the local result. Each gate has its own retry cap so a genuinely broken app can't loop forever in either stage.No
test_cmdconfigured means no local gate, not "block everything" — the fix goes straight to a PR and CI becomes the only check. This is what keeps the pipeline usable for apps that don't have reliable tests.Assignee comes from the code, not the alert.
git blameon the touched lines is source-agnostic (works whether the error arrived as Sentry JSON or a developer's sentence) and more reliable than trying to infer ownership from the tracker. It depends on git commit email, Jira account email, and Slack identity all lining up — worth checking before relying on it.Confluence is read-only context. The agent consults the app's Confluence space (architecture notes, runbooks) when drafting a fix, the same way it reads the repo — it's an input to the analysis, not something the server writes back to.
The coding agent is swappable per app.
ai_providerpicks which model/tool actually drafts the fix (Claude, Codex, …) — different apps can use different agents without changing any other part of the pipeline, since every downstream step (test gate, Jira, PR, Slack) only cares that a diff exists, not who wrote it.
Stack
Node.js + TypeScript, an Express server, packaged as a Docker image.
src/
index.ts Express app: mounts /mcp and /webhooks, error handling
mcp.ts MCP server — registers the report_error tool (Streamable HTTP, stateless)
webhooks.ts Plain HTTP routes: /webhooks/{sentry,bugsnag,generic}/:appId
orchestrator.ts The pipeline itself — reportError() and handleCIResult()
config.ts Loads config/apps/*.yaml into AppConfig
types.ts Shared types
config.test.ts Unit tests (node:test, via tsx — no separate test framework)
config/apps/ One YAML file per onboarded app (see Per-app config above)
.github/workflows/ci.yml typecheck + test + build, and a Docker build check, on every push/PRWhat's real vs. stubbed: the git plumbing (clone/pull, worktree per fix, push) and the local test_cmd runner are fully implemented — you can run reportError today and it'll get as far as spinning up a worktree and running tests in it. Drafting the actual fix (draftFix), and the Jira/GitHub-PR/Slack calls, are stubs that throw NotImplementedError with what's missing — they need API credentials and an ai_provider integration this repo doesn't have yet. The webhook/MCP routes surface that as a 501 with a clear message rather than pretending to succeed.
Quick start
On a fresh server:
ssh root@your_server_ip
curl -o ~/start.sh https://raw.githubusercontent.com/4-life/mcp-error-handler/main/start.sh
chmod +x ~/start.sh && ./start.shstart.sh installs Docker if it's missing, clones the repo into ~/mcp-error-handler (or $APP_DIR), copies .env.example to .env if there isn't one yet, and runs docker compose up -d --build. It prints the server's /healthz, MCP, and webhook URLs when done — nothing is wired to real Jira/GitHub/Slack/AI credentials yet, so edit .env and config/apps/ afterward and re-run docker compose up -d --build to pick up the changes. Override APP_DIR or PORT as env vars before running the script if you need non-defaults.
Running it
cp .env.example .env # fill in credentials as integrations get wired up
cp config/apps/example.yaml config/apps/<your-app>.yaml
npm install
npm run dev # tsx watch, http://localhost:3000
npm test # node:test, via tsx
npm run typecheckOr as a container:
docker compose up --buildThe MCP endpoint is POST /mcp (Streamable HTTP). Webhook routes are POST /webhooks/sentry/:appId, /webhooks/bugsnag/:appId, /webhooks/generic/:appId — point your tracker's webhook config (or a curl from a developer) at one of these with the app's app_id in the URL.
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
- -licenseBquality-maintenanceEnables AI-driven orchestration of GitHub development workflows including automated issue analysis, code generation, code review, and PR creation through multiple specialized agents. Integrates with GitHub Actions to automate the complete development process from issue to pull request.7
- Alicense-qualityDmaintenanceEnables end-to-end automation of developer workflows from Jira issue tracking to GitHub pull requests through natural language, allowing developers to search issues, create branches, commit changes, and manage PRs directly from their IDE.2MIT
- AlicenseAqualityDmaintenanceAn intelligent debugging assistant that automates the debugging process by analyzing bugs, injecting HTTP-based debug logs into code across multiple environments (browser, Node.js, mobile, etc.), and iteratively fixing issues based on real-time feedback.8MIT
- Alicense-qualityDmaintenanceEnables AI agents to scan GitHub repositories for security vulnerabilities, deployment blockers, and code quality issues. It provides detailed findings and auto-generated code patches to help developers ensure their code is production-ready.64MIT
Related MCP Connectors
Screens public GitHub repos and PRs to generate risk maps, findings, and merge-readiness signals.
AI code review for GitHub PRs with an MCP autofix loop for Claude Code and Cursor
Agentic code review, no signup to try: reality gates + frontier-model review, with veto.
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/4-life/mcp-error-handler'
If you have feedback or need assistance with the MCP directory API, please join our Discord server