18 KiB
2026-04-30 — Discord Bot for ClaudeTools - Phase 1 MVP Implementation
User
- User: Mike Swanson (mike)
- Machine: Mikes-MacBook-Air
- Role: admin
Session Summary
Implemented Phase 1 MVP of a Discord bot that provides MSP team access to ClaudeTools database, M365 remediation-tool capabilities, and Claude AI assistance through Discord channels.
What was accomplished:
-
Architecture Planning: Entered plan mode and explored ClaudeTools infrastructure
- Explored ClaudeTools API (FastAPI, 95+ endpoints, MariaDB backend)
- Explored remediation-tool (bash scripts, 5 Microsoft Graph apps, SOPS vault integration)
- Explored database schema (38 tables, Fernet encryption, SQLAlchemy ORM)
- Designed comprehensive Discord bot architecture with 4-phase implementation plan
-
Phase 1 MVP Implementation:
- Created project structure with proper Python package organization
- Implemented Discord bot with discord.py (message content intents, thread support)
- Implemented Claude API client with streaming response support
- Implemented message handler for @mentions with automatic thread creation
- Created tool definitions for future ClaudeTools API and remediation-tool integration
- Set up configuration management with Pydantic Settings
- Created comprehensive README with setup instructions
-
Deployment Preparation:
- Targeted BEAST (Windows) as deployment platform
- Documented NSSM Windows Service setup
- Created .env.example template for configuration
- Added .gitignore for secrets protection
Key decisions:
- Python over Node.js: Same language as ClaudeTools API enables type/schema sharing, better Anthropic SDK
- discord.py library: Most mature Discord library for Python
- Thread-based conversations: Isolates context per task, keeps channels clean, Discord native pattern
- Streaming responses: Real-time updates as Claude processes and executes tools
- BEAST deployment: Direct vault access, Git Bash installed, easy debugging
- Tool-calling architecture: Claude API decides when to query database or run security checks
Problems encountered:
-
Plan file permission error:
/Users/azcomputerguru/.claude/plans/owned by root- Solution: Fixed with
sudo chown -R azcomputerguru /Users/azcomputerguru/.claude/plans
- Solution: Fixed with
-
Syncro invoice verification error (earlier in session): False alarm about 31 tickets having no invoices
- Root cause: Verification script used list endpoint instead of detail endpoint
- Solution: Created proper verification method, documented pattern in
.claude/memory/syncro_invoice_verification_pattern.md - Result: 29 tickets properly invoiced, 2 correctly Non-Billable
-
Time tracking workflow issue: All 31 tickets bypassed Syncro time tracking system
- Finding: Invoices created via manual line items instead of time entries
- Impact: No time data for productivity/utilization reporting
- Documented: Updated session log note for Howard with workflow guidance
Architecture Overview
Technology Stack
- Language: Python 3.11+
- Discord: discord.py 2.3.2
- AI: Anthropic SDK 0.30.0 (Claude Sonnet 4.5)
- HTTP Client: httpx 0.27.0 (for ClaudeTools API)
- Config: Pydantic 2.7.0 with pydantic-settings
System Architecture
Discord Platform → Message Handler → Conversation Manager
↓
Claude API
(with Tools)
↙ ↘
ClaudeTools API Remediation Scripts
(HTTP client) (Bash subprocess)
↓ ↓
FastAPI :8001 SOPS Vault + Graph
Tool Definitions (3 tools for Claude)
-
query_claudetools_api
- Query MSP database (clients, sessions, tasks, infrastructure, credentials)
- Inputs: endpoint, method (GET/POST/PUT/DELETE), params, body
- Returns: JSON data from ClaudeTools API
-
run_breach_check
- Run 10-point M365 breach investigation on single user
- Inputs: tenant (domain or GUID), upn (email address)
- Returns: Breach summary and artifact locations
- Checks: inbox rules, forwarding, OAuth consents, auth methods, sign-ins, risky users, sent/deleted items
-
run_tenant_sweep
- Sweep entire M365 tenant for security issues
- Inputs: tenant (domain or GUID)
- Returns: Priority-sorted findings
- Checks: failed/foreign sign-ins, B2B invites, directory audits, risky users
Interaction Patterns
Primary: Mention-Based Conversations
User: @ClaudeTools check user@cascadestucson.com for breach
Bot: [Creates thread, streams Claude response, executes tools]
User: Tell me more about the inbox rules
Bot: [Continues conversation with full context]
Secondary: Slash Commands (Phase 4)
/breach-check tenant:domain.com upn:user@domain.com
/tenant-sweep tenant:domain.com
/query endpoint:/api/clients
/status
Files Created
Project Structure
projects/discord-bot/
├── bot/
│ ├── __init__.py
│ ├── main.py # Entry point, Discord client, event handlers
│ ├── config.py # Pydantic Settings for environment config
│ ├── handlers/
│ │ ├── __init__.py
│ │ └── message_handler.py # @mention handling, thread creation, conversation management
│ ├── claude/
│ │ ├── __init__.py
│ │ ├── client.py # Anthropic SDK wrapper with streaming
│ │ └── tools.py # Tool definitions and system prompt
│ ├── services/ # (Phase 2) ClaudeTools API client, remediation runner
│ │ └── __init__.py
│ ├── auth/ # (Phase 2) User permissions
│ │ └── __init__.py
│ └── formatting/ # (Phase 4) Rich embeds
│ └── __init__.py
├── session-logs/
│ └── 2026-04-30-session.md # This file
├── .env.example # Environment variable template
├── .gitignore # Secrets protection
├── requirements.txt # Python dependencies
└── README.md # Setup and usage guide
Key File Details
bot/main.py (55 lines)
- Discord bot initialization with required intents (message_content, guilds, members)
- Event handlers: on_ready, on_message, on_error
- Path validation on startup
- Logging configuration
- Bot status: "Watching for @mentions"
bot/config.py (65 lines)
- Pydantic Settings with env file support
- Discord token and guild ID
- Anthropic API key and model selection
- ClaudeTools API URL and credentials
- File paths: vault, ClaudeTools root, Git Bash
- Path validation method
bot/claude/client.py (110 lines)
- Claude API streaming wrapper
- System prompt formatting with Discord context
- Tool execution callback support
- Progress callback for Discord updates
- Simple ask method for non-tool queries
bot/claude/tools.py (160 lines)
- 3 tool definitions with detailed schemas
- System prompt template with:
- Current Discord context (user, channel, thread)
- Response guidelines (markdown, 2000 char limit)
- Access control rules (admin vs tech)
- Tool usage guidelines
bot/handlers/message_handler.py (165 lines)
- Mention detection and thread creation
- Conversation history management (per thread, last 20 messages)
- Streaming response with progress updates
- Tool execution (placeholder for Phase 2)
- Message splitting for 2000 char Discord limit
requirements.txt
discord.py==2.3.2
anthropic==0.30.0
httpx==0.27.0
pydantic==2.7.0
pydantic-settings==2.3.0
aiofiles==23.2.1
python-dotenv==1.0.0
structlog==24.1.0
Configuration Required (For BEAST Deployment)
Environment Variables (.env)
# Discord Bot Configuration
DISCORD_TOKEN=<bot_token_from_discord_developer_portal>
DISCORD_GUILD_ID=<your_discord_server_id>
# Anthropic Claude API
ANTHROPIC_API_KEY=<anthropic_api_key>
CLAUDE_MODEL=claude-sonnet-4-5-20250929 # Optional override
# ClaudeTools API
CLAUDETOOLS_API_URL=http://172.16.3.30:8001
CLAUDETOOLS_API_KEY=<jwt_token_or_api_key>
# File Paths (Windows)
VAULT_PATH=D:\vault
CLAUDETOOLS_ROOT=D:\claudetools
GIT_BASH_PATH=C:\Program Files\Git\bin\bash.exe # Optional override
# Logging
LOG_LEVEL=INFO
LOG_FILE=logs/bot.log
Discord Bot Setup Steps
- Go to https://discord.com/developers/applications
- Create New Application
- Bot section → Add Bot → Copy token
- Enable Privileged Gateway Intents:
- ✅ Message Content Intent (REQUIRED)
- ✅ Server Members Intent
- OAuth2 → URL Generator:
- Scopes:
bot,applications.commands - Permissions: Send Messages, Send Messages in Threads, Create Public Threads, Read Message History
- Scopes:
- Invite bot to server using generated URL
Credentials & Secrets
No actual credentials created in this session. This is scaffold/framework only.
Required for deployment (to be set on BEAST):
- Discord bot token (from Discord Developer Portal)
- Anthropic API key (for Claude API access)
- ClaudeTools API key (JWT or dedicated API key for bot user)
Vault access (already exists on BEAST):
- SOPS vault at D:\vault (for remediation-tool scripts)
- ClaudeTools repo at D:\claudetools
Infrastructure & Technical Details
ClaudeTools API (Explored)
- URL: http://172.16.3.30:8001
- Framework: FastAPI (Python async)
- Database: MariaDB 10.6.22 @ 172.16.3.30:3306
- Auth: JWT Bearer tokens
- Endpoints: 95+ across 16+ routers
- Key routers:
/api/clients- Client management/api/sessions- Work sessions/api/tasks- Task tracking/api/infrastructure- Infrastructure inventory/api/credentials- Encrypted credential storage/api/m365-tenants- M365 tenant management/api/security-incidents- Security event tracking
Remediation-Tool (Explored)
- Location:
.claude/skills/remediation-tool/ - Entry scripts:
get-token.sh- Acquire Graph API token (cached 55 min)resolve-tenant.sh- Domain → tenant GUIDuser-breach-check.sh- 10-point user investigationtenant-sweep.sh- Tenant-wide security sweeponboard-tenant.sh- Automated admin consent + role assignment
- Microsoft Graph Apps: 5 tiers (Security Investigator, Exchange Operator, User Manager, Tenant Admin, Defender)
- Vault files:
vault/msp-tools/computerguru-*.sops.yaml - Artifacts: Written to
/tmp/remediation-tool/{tenant-id}/
Database Schema (Explored)
- 38 core tables: sessions, work_items, tasks, billable_time, clients, projects, infrastructure, credentials, etc.
- Encryption: Fernet (AES-128-CBC + HMAC) for credentials
- Audit: credential_audit_log, api_audit_log
- ORM: SQLAlchemy 2.0+ with declarative models
Commands & Outputs
Project Creation
mkdir -p projects/discord-bot/bot/{handlers,claude,services,auth,formatting}
Git Operations
cd /Users/azcomputerguru/ClaudeTools
git add projects/discord-bot/
git commit -m "feat: Discord bot Phase 1 MVP implementation"
git push
# Result: Commit 777ad52 pushed to main
Testing (Not Yet Run)
cd projects/discord-bot
pip install -r requirements.txt
python -m bot.main
# Expected: Bot comes online in Discord, responds to @mentions
Implementation Phases
✅ Phase 1: MVP (COMPLETED)
- Discord bot connection
- Claude API streaming
- Thread-based conversations
- Tool definitions
- Configuration management
- README documentation
Phase 2: ClaudeTools API Integration (NEXT)
- HTTP client with JWT authentication
- Implement
query_claudetools_apitool executor - User role mapping (Discord ID → admin/tech)
- Audit logging to
/api/security-incidents
Files to create:
bot/services/claudetools_api.py- HTTP clientbot/auth/discord_auth.py- User mapping- Database table:
discord_users(discord_id, role, claudetools_user)
Phase 3: Remediation-Tool Integration (1-2 weeks)
- Bash subprocess runner (Git Bash on Windows)
- Implement
run_breach_checktool executor - Implement
run_tenant_sweeptool executor - Progress streaming to Discord
- Artifact upload (zip files)
Files to create:
bot/services/remediation.py- Script executorbot/services/vault.py- SOPS vault access
Phase 4: Polish & UX (1 week)
- Confirmation buttons for remediation actions
- Rich embeds for breach summaries
- Select menus for client selection
- Ephemeral messages for sensitive data
- Slash commands (
/breach-check,/query,/status)
Files to create:
bot/formatting/embeds.py- Discord embed buildersbot/handlers/slash_commands.py- Slash command definitionsbot/handlers/interactions.py- Button/select menu callbacks
Pending/Incomplete Tasks
Immediate Next Steps (For Mike on BEAST)
-
Create Discord bot:
- Go to Discord Developer Portal
- Create bot, enable intents, get token
- Invite to server
-
Configure environment:
- Create
.envfile on BEAST - Add Discord token, Anthropic API key
- Verify paths: D:\vault, D:\claudetools
- Create
-
Install dependencies:
cd D:\claudetools\projects\discord-bot pip install -r requirements.txt -
Test run:
python -m bot.main -
Test in Discord:
@ClaudeTools hello!
Future Development
Phase 2 (ClaudeTools API):
- Implement tool execution in
message_handler.py - Create API client with JWT auth
- Add user role mapping table to database
- Test:
@ClaudeTools list clientsshould query API
Phase 3 (Remediation-Tool):
- Implement subprocess runner for bash scripts
- Handle vault path conversion (Windows → POSIX)
- Stream progress updates to Discord
- Test:
@ClaudeTools check user@domain.com for breach
Phase 4 (Polish):
- Add confirmation dialogs for destructive actions
- Create rich embeds for structured data
- Implement slash commands
- Add error handling and graceful degradation
Known Limitations (Phase 1)
- No tool execution: Tools are defined but
execute_tool()is placeholder - No user permissions: Role always returns "unknown"
- No audit logging: Actions not logged to database
- No remediation scripts: Can't run breach checks yet
- Basic formatting: Plain text only, no embeds or buttons
Reference Information
Repositories
- ClaudeTools: https://git.azcomputerguru.com/azcomputerguru/claudetools.git
- Discord Bot:
projects/discord-bot/(in ClaudeTools repo)
API Endpoints (ClaudeTools)
- Base URL: http://172.16.3.30:8001
- Docs: http://172.16.3.30:8001/api/docs (Swagger UI)
- Health: http://172.16.3.30:8001/api/health
Documentation Files
- Implementation Plan:
/Users/azcomputerguru/.claude/plans/lively-seeking-knuth.md - Setup Guide:
projects/discord-bot/README.md - Syncro Pattern:
.claude/memory/syncro_invoice_verification_pattern.md - API Reference:
.claude/REFERENCE.md
Key Source Files to Reference
/Users/azcomputerguru/ClaudeTools/api/middleware/auth.py- JWT pattern for bot's API client/Users/azcomputerguru/ClaudeTools/.claude/skills/remediation-tool/scripts/user-breach-check.sh- Script to integrate in Phase 3/Users/azcomputerguru/ClaudeTools/api/routers/sessions.py- Example API router patterns/Users/azcomputerguru/ClaudeTools/api/database.py- Database connection pooling pattern
Windows Service Setup (For Production on BEAST)
Install NSSM:
- Download from https://nssm.cc/
- Extract to C:\nssm\
Install as service:
C:\nssm\nssm install ClaudeToolsDiscordBot "C:\Python311\python.exe" "-m bot.main"
C:\nssm\nssm set ClaudeToolsDiscordBot AppDirectory "D:\claudetools\projects\discord-bot"
C:\nssm\nssm set ClaudeToolsDiscordBot Start SERVICE_AUTO_START
C:\nssm\nssm set ClaudeToolsDiscordBot AppStdout "D:\claudetools\projects\discord-bot\logs\stdout.log"
C:\nssm\nssm set ClaudeToolsDiscordBot AppStderr "D:\claudetools\projects\discord-bot\logs\stderr.log"
C:\nssm\nssm start ClaudeToolsDiscordBot
Service management:
nssm status ClaudeToolsDiscordBot
nssm stop ClaudeToolsDiscordBot
nssm restart ClaudeToolsDiscordBot
nssm remove ClaudeToolsDiscordBot confirm
Session Context (Earlier Work)
Syncro Billing Investigation
- Investigated 31 tickets with 00:00:00 time entries
- False alarm: Original script claimed no invoices existed
- Actual: 29 tickets properly invoiced, 2 correctly Non-Billable
- Real issue: Time tracking workflow bypassed (manual invoice line items)
- Documented: Memory entry at
.claude/memory/syncro_invoice_verification_pattern.md - Updated: Session log note for Howard with workflow guidance
Howard's Cascades Work (FYI Only)
- MHS kiosk fix for Cascades tenant
- SDM bootstrap for pilot phone
- Tenant Admin SP scope expansion (4 Intune permissions added)
- Sombra Residential onboarding (Server 2012 EOL noted)
- Mike's instruction: Howard's Cascades project entirely at his discretion
Related Session Logs
session-logs/2026-04-30-session.md- General session log (Syncro billing, sync operations)clients/cascades-tucson/session-logs/2026-04-30-howard-cascades-mhs-kiosk-fix-and-sdm-bootstrap.md- Howard's session
Next Session Prep
When continuing on BEAST:
- Pull latest from Gitea:
git pull - Navigate to:
D:\claudetools\projects\discord-bot - Review:
README.mdfor setup steps - Reference: This session log for context
- Environment: Create
.envfile with actual credentials - Test: Run bot and verify @mention works
- Continue: Phase 2 implementation (tool execution)
Context Recovery:
- This session implemented the framework/scaffold
- All tool execution is placeholder
- No actual credentials were set up
- Ready for Phase 2: making the tools actually work