DEV Community

myougaTheAxo
myougaTheAxo

Posted on

Claude Code + MCP: Query Databases and Manage GitHub Issues in Plain English

The Model Context Protocol (MCP) is what turns Claude Code from a code editor into a full development agent. Connect your database, GitHub repos, and Slack — then control all of them with natural language.


What MCP Enables

Once configured:

  • "Show me all users who haven't logged in for 30 days" → Claude runs a SQL query against your SQLite database
  • "Assign all Critical-tagged Issues in the v2.0 milestone to me" → GitHub API calls happen automatically
  • "Post the deployment result to #deployments with the version from package.json" → Claude reads the file, then calls the Slack API

No switching tabs. No API docs. Just describe what you need.


Setup: One CLI Command

# SQLite
claude mcp add --transport stdio sqlite-db -- \
  npx @modelcontextprotocol/server-sqlite ./data/app.sqlite3

# GitHub
claude mcp add --transport stdio github -- \
  --env GITHUB_TOKEN=$GITHUB_TOKEN \
  npx @modelcontextprotocol/server-github

# Slack
claude mcp add --transport stdio slack -- \
  --env SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN \
  npx @modelcontextprotocol/server-slack
Enter fullscreen mode Exit fullscreen mode

Or manage everything in .mcp.json:

{
  "mcpServers": {
    "app-db": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-sqlite", "./data/app.db"]
    },
    "github": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Real Example: Database Analysis

You: "Show me the top 10 users by purchase amount this month,
      and flag anyone who placed more than 5 orders in 24 hours."
Enter fullscreen mode Exit fullscreen mode

Claude generates and executes:

-- Suspicious high-frequency buyers
SELECT
  u.id, u.email,
  COUNT(o.id) as order_count,
  SUM(o.total) as total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.created_at > datetime('now', '-1 month')
GROUP BY u.id
ORDER BY total_spent DESC
LIMIT 10;

-- Fraud flag: 5+ orders in 24h
SELECT user_id, COUNT(*) as rapid_orders
FROM orders
WHERE created_at > datetime('now', '-1 day')
GROUP BY user_id
HAVING rapid_orders >= 5;
Enter fullscreen mode Exit fullscreen mode

You get the results without writing a single SQL query.


Real Example: GitHub Triage

You: "List all open bugs tagged P0 or P1 with no assignee.
      Assign them to @yourhandle and add the 'needs-triage' label."
Enter fullscreen mode Exit fullscreen mode

Claude makes multiple GitHub API calls:

  1. GET /repos/:owner/:repo/issues?labels=P0,P1&state=open
  2. Filter for assignee: null
  3. PATCH /repos/:owner/:repo/issues/:number for each match

This kind of batch triage operation normally takes 20-30 minutes manually. With MCP, it's a single instruction.


Server Catalog

Package Use Case
server-sqlite SQLite read/write
server-github Issues, PRs, branches, commits
server-slack Channel messages, search
server-postgres PostgreSQL
server-fetch Web page retrieval
server-brave-search Web search
server-filesystem Extended file operations

Full list: github.com/modelcontextprotocol/servers


Build a Custom Server (Python)

For internal tools not covered by official servers:

from mcp.server import Server
from mcp.server.stdio import stdio_server
import asyncio

server = Server("internal-erp")

@server.list_tools()
async def list_tools():
    return [{
        "name": "get_inventory",
        "description": "Query internal ERP inventory",
        "inputSchema": {
            "type": "object",
            "properties": {"sku": {"type": "string"}},
            "required": ["sku"]
        }
    }]

@server.call_tool()
async def call_tool(name, args):
    if name == "get_inventory":
        result = query_erp(args["sku"])  # your internal function
        return [{"type": "text", "text": str(result)}]

async def main():
    async with stdio_server() as streams:
        await server.run(*streams)

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Register it:

claude mcp add --transport stdio erp -- python erp_server.py
Enter fullscreen mode Exit fullscreen mode

Security Notes

Never hardcode tokens in configuration:

// Good
"env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }

// Bad - token stored in plaintext
"env": { "GITHUB_TOKEN": "ghp_xxxxx" }
Enter fullscreen mode Exit fullscreen mode

Restrict filesystem access:

{
  "args": [
    "-y", "@modelcontextprotocol/server-filesystem",
    "./src",   // only allow these paths
    "./docs"
  ]
}
Enter fullscreen mode Exit fullscreen mode

The Bigger Picture

MCP is what makes Claude Code genuinely agentic. Without it, you're pair-programming. With it, you're delegating entire workflows.

Start with SQLite + GitHub. Those two alone eliminate a large portion of routine development overhead — database inspection, Issue triage, branch management.


If you want pre-built Claude Code skills that work well in MCP-connected environments, the **Security Pack* (¥1,480) and Code Review Pack (¥980) are available on PromptWorks.*

Myouga (@myougatheaxo) — Security-focused Claude Code engineer.

Top comments (0)