Build a GitHub Slack Bot With AWS Bedrock and MCP, Part 1
Building a Slack bot with traditional APIs led to 400 lines of code. Using MCP and AWS Bedrock reduced complexity, enabling scalable, tool-driven automation.
Join the DZone community and get the full member experience.
Join For FreeI set out to build a simple Slack bot that could answer questions about our GitHub repository — open bugs, pending PRs, and recent releases. Straightforward enough.
It turned into 400 lines of API glue code.
When I asked Claude, ChatGPT, Gemini, and several coding assistants for architecture advice, they all converged on the same conventional pattern:
| What every AI suggested | What it means in practice |
|---|---|
| 1. Slack receives the mention | Write a GitHub REST client |
| 2. Bot calls GitHub REST API | Routing logic per question type |
| 3. Feed response into Claude/GPT | Pagination per endpoint |
| 4. Model formats the answer | Maintain API versions |
| 5. Bot posts back to Slack | Repeat for every new data source |
This works. I built it. Three days, 400 lines of API client code, and it answered perhaps 60% of the questions my team asked. Questions like "Are any critical bugs related to PRs merged this week?" required custom correlation logic across multiple endpoints. Every new question type meant new code. Adding error monitoring as a second data source meant a separate integration entirely.
After digging deeper into how AWS Bedrock handles tool use, I discovered the Model Context Protocol. I rebuilt the same bot in an afternoon — 150 lines, answering a far wider range of questions, and adding a new data source is a handful of lines in a single function. This article explains what changed and why it matters.
The core insight: don't build an API client that feeds a model. Build a model that calls tools. These are fundamentally different architectures.
The Architecture: Three Layers, One Loop
The system is built in three layers. Each has exactly one responsibility and hands off cleanly to the next:
|
Slack (Socket Mode) User types @mention → question received |
|
↓ question passed to agent |
|
AWS Bedrock — Claude (Agent Loop) Reason → decide tools → call → read results → repeat |
|
↓ tool calls routed via registry |
|
MCP Servers (GitHub + any other) 40+ tools per server — issues, PRs, releases, code search… |
|
↓ tool results → reasoning → formatted answer → Slack |
Slack receives the @mention and passes the question down. Bedrock runs the agent loop — Claude reasons about which GitHub MCP tools to call, executes them, reads the results, and loops until it has enough data to answer. The tool registry routes each call to the correct MCP server automatically. The answer travels back up to Slack.
Before vs. After: A Real Question
To understand why this matters, consider a specific question a developer might ask in Slack: "Are any critical bugs related to PRs merged this week?"
On the surface, this seems simple. But answering it correctly requires data from two separate GitHub API endpoints — the issues API for bugs, and the pull requests API for recent merges — and then correlation logic to match issue references in PR descriptions. If you are writing a traditional bot, you need to anticipate this question, write the two API calls, handle pagination on each, and write the join logic. Now imagine a dozen different question types. Each one is a new coding task.
| Traditional approach | MCP approach |
|---|---|
| 1. Search GitHub for critical bugs | Claude calls list_merged_prs (this week) |
| 2. Search for PRs merged this week | Claude calls search_issues (critical bugs) |
| 3. Write correlation logic across both | Claude calls get_issue for each candidate |
| 4. Handle pagination on each endpoint | Claude cross-references links in PR bodies |
| 5. Feed combined data to model to format | Claude returns correlated, formatted answer |
| 6. New question? Write new logic. | New question? Model figures out new tools. |
What makes the MCP approach powerful is not just the line count — it is what the model is doing. Claude receives the full JSON Schema for every available GitHub tool at startup. When the question arrives, it reasons over those tool descriptions, selects the relevant ones, calls them in the right order, and then reasons over the combined results to produce an answer. It does not need to be told: "for bug questions, use search_issues". It reads the tool description and figures that out.
The result is that the model can handle questions you never anticipated. "Show me PRs merged this week still linked to open bugs" — a slightly different framing of the same question — works without any code changes, because Claude adapts its tool selection to the new phrasing.
Example Slack response:
:rotating_light: *Critical Bugs Linked to Recent PRs*
• <https://github.com/org/repo/issues/1234|#1234> — Payment processing failure
(linked to <https://github.com/org/repo/pull/5678|PR #5678>, merged Apr 14)
• <https://github.com/org/repo/issues/1290|#1290> — Auth token timeout on mobile
(linked to <https://github.com/org/repo/pull/5691|PR #5691>, merged Apr 15)
Summary:
2 critical bugs found. Both linked to PRs merged this week.
6 tool calls: list merged PRs, search critical issues, get_issue per candidate.
What the Model Context Protocol Does
MCP is an open standard that lets AI models discover and call external tools through a uniform interface. Every MCP server exposes a tools/list endpoint returning every available action as a full JSON Schema. The model loads these at startup and reasons over them autonomously. Your application code never routes a single query. GitHub's official MCP server at api.githubcopilot.com/mcp/ exposes 40+ tools — issues, PRs, releases, code search — and a single GitHub token is all the authentication required.
The shift is architectural, not cosmetic. The conventional model is a formatter — it receives data you fetched. The MCP model is a reasoning agent — it decides what to fetch, fetches it, and synthesizes the results. The first scales with the API code you write. The second scales with the MCP ecosystem.
Why SRE and Platform Teams Should Care
This bot started as a developer productivity tool. But when our SRE and platform engineering teams reviewed the architecture, they saw something broader: a pattern that could eliminate an entire category of operational toil. Platform teams spend considerable time maintaining integrations — every API change means updating a client, every new data source means a new integration project. The MCP pattern changes that calculus entirely.
- Integration toil. MCP server owners maintain compatibility with their own APIs. When GitHub updates its REST API, GitHub's MCP server absorbs that change. You own zero API client code.
- API drift. Traditional bots silently degrade when response schemas change. With MCP, the server owner tracks those changes — your bot keeps working.
- Correlation complexity. Linking deploys to errors, PRs to bugs, incidents to changesets — this logic is brittle in code and breaks constantly. Models do this naturally by reasoning across tool results in context.
- Platform rebuilds for new capabilities. Each new MCP server extends the bot without touching the agent loop. The loop is infrastructure. The servers are plugins. New team joins? New tool added? It is configuration, not development.
- The compounding effect matters most: every new MCP server registered is immediately available for any question the model asks. Traditional integrations accumulate glue code. MCP integrations accumulate capabilities.
Conclusion
The conventional approach to building AI-powered developer tools is not wrong — it works, and many teams run it successfully. But it carries a hidden cost: every new capability requires new code, every new data source requires a new integration, and every API change requires maintenance. Over time, that cost compounds.
The Model Context Protocol eliminates that cost. By exposing tools through a uniform interface that the model discovers at startup, MCP shifts the integration burden away from your codebase and onto the ecosystem. The model reasons about which tools to call. You reason about what questions to answer.
Part 1 has covered the why — the architectural distinction, the before/after comparison on a real question, and why this matters especially for SRE and platform teams. Part 2 puts it into practice with the complete implementation, step-by-step setup, and production lessons that make it reliable for daily use.
Continue to Part 2: Implementation, Setup, and Production Patterns.
Full project code on GitHub: https://github.com/sangharshcs/slack-github-mcp-bot.
Opinions expressed by DZone contributors are their own.
Comments