klaxon
Klaxon
Incident management desk with a SQLite-backed issue database, REST APIs, MCP tools, and a Slack slash-command agent.
Upstream systems and GitHub are simulated — ingest and agent actions are logged as side effects, not sent to real services.
Quick start
cd /Users/alicabukel/Documents/GitHub/klaxon
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env
klaxon-seed # sample code + data issues
klaxon-api # http://127.0.0.1:3000 (docs at /docs)pytest -qLayout
src/klaxon/
db/ models, repository, conversation sessions
api/ FastAPI REST + Slack route registration
mcp/ FastMCP tool server (stdio)
agent/ LangGraph agent + Slack session wrapper
slack/ OAuth, signatures, commands, events (kiwipi-style)
seed.py sample incidents
manifest.yaml Slack app definitionREST API
Method | Path | Purpose |
|
| List / create |
|
| Detail / update |
|
| Status transition |
|
| Comments |
|
| Counts by status / kind / severity / source |
|
| Simulated upstream event |
|
| Simulated action log |
|
| Health |
No auth on the REST surface (local demo).
MCP tools
klaxon-mcp # stdio FastMCP server for Cursor / other agentsTools: search_issues, get_issue, issue_stats, create_issue, update_issue, update_issue_status, add_comment, simulate_upstream_ingest, create_github_issue, list_side_effects.
The Slack agent uses the same tool surface in-process by default. Set KLAXON_USE_MCP=1 to load tools via MCP stdio instead.
Slack bot
Modeled on kiwipi/slack-integration: HTTP (not Socket Mode), OAuth install, HMAC verification, 3-second ack + background work.
Commands
Command | Purpose |
| Talk to the incident agent (queries, creates, updates) |
| End the current conversation for this user+channel |
| Liveness |
Follow-ups: another /klaxon within 30 minutes continues the same session; replies in the bot’s thread also continue it.
Local Slack setup
Fill
.envSlack credentials and generate secrets:
openssl rand -hex 32 # STATE_SECRET
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" # TOKEN_ENCRYPTION_KEYRun the API and expose it:
klaxon-api
ngrok http 127.0.0.1:3000Set
PUBLIC_BASE_URLto the ngrok HTTPS origin (no trailing slash). Create the Slack app frommanifest.yaml(replaceYOUR-DOMAIN). Visithttp://localhost:3000/slack/install.
Without ANTHROPIC_API_KEY, the agent echoes so you can debug Slack plumbing first.
Pitfalls (from kiwipi)
Ack within 3 seconds; do LLM/DB work after.
Verify signatures on raw body bytes.
Dedupe Slack event retries.
Ignore bot/self messages to avoid loops.
Tokens are per-workspace (
team_id).Slack uses mrkdwn, not Markdown.
Data model
Issues have kind of code or data, with kind-specific fields in JSON features. Status audit rows, comments, labels, conversation history, and simulated side effects are stored alongside.
License
Private / experimental.
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/ali-cabukel/klaxon'
If you have feedback or need assistance with the MCP directory API, please join our Discord server