A Go-based Model Context Protocol (MCP) server that provides comprehensive access to Businessmap (formerly Kanbanize) cards including reading card information and adding comments.
- 🎯 Two MCP Tools:
read_card
- Comprehensive card information retrievaladd_card_comment
- Add comments to existing cards
- 📊 Structured Data: Returns clean JSON with title, description, subtasks, and comments
- ✍️ Card Interaction: Add comments to cards directly through the API
- 🔐 Secure Authentication: API key and base URL configuration via environment variables
- 🔗 Direct API Integration: Uses official Businessmap API v2 endpoints
- ⚡ Lightweight: Minimal dependencies and fast response times
- 🚀 Native Performance: Direct Go binary execution without containers
- Go 1.25 or later
- Kanbanize/Businessmap account with API access
Copy the environment template and configure your Kanbanize credentials:
cp .env.example .env
Edit .env
and set your values:
KANBANIZE_API_KEY=your_actual_api_key
KANBANIZE_BASE_URL=https://your-subdomain.kanbanize.com
- Log into your Kanbanize/Businessmap account
- Click on your user dropdown menu (top right)
- Select "API"
- Copy your API key
# Install dependencies
go mod download
# Build the server
go build -o businessmap-mcp
# Run the server
./businessmap-mcp
This MCP server is designed to work seamlessly with Claude Code. Follow these steps to integrate:
# Clone the repository
git clone https://github.com/hivemq/businessmap-mcp.git
cd businessmap-mcp
# Install dependencies
go mod download
# Build the server
go build -o businessmap-mcp
Add the MCP server to your Claude Code configuration. Create or edit your Claude Code configuration file:
For Claude Code CLI (~/.claude/mcp_servers.json
):
{
"mcpServers": {
"businessmap": {
"command": "/path/to/businessmap-mcp/businessmap-mcp",
"env": {
"KANBANIZE_API_KEY": "your_api_key_here",
"KANBANIZE_BASE_URL": "https://your-subdomain.kanbanize.com"
}
}
}
}
For Claude Desktop (configuration file location varies by OS):
{
"mcpServers": {
"businessmap": {
"command": "/absolute/path/to/businessmap-mcp",
"env": {
"KANBANIZE_API_KEY": "your_api_key_here",
"KANBANIZE_BASE_URL": "https://your-subdomain.kanbanize.com"
}
}
}
}
Instead of putting credentials in the config file, you can use a .env
file:
# In the businessmap-mcp directory
cp .env.example .env
# Edit .env with your credentials
Then update the Claude Code config to use the working directory:
{
"mcpServers": {
"businessmap": {
"command": "/path/to/businessmap-mcp/businessmap-mcp",
"cwd": "/path/to/businessmap-mcp"
}
}
}
After updating the configuration, restart Claude Code to load the new MCP server.
Once integrated, you can use the tools in Claude Code:
Reading card information:
Please read the details of Businessmap card 12345
Reading card from URL (supports various URL formats):
Please read the details from https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345
Please read the details from https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/
Please read the details from https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/details/
Please read the details from https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/comments/
Adding comments to cards:
Please add a comment "Work completed successfully" to Businessmap card 12345
Adding comments using URL (supports various URL formats):
Please add a comment "Task completed" to https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345
Please add a comment "Task completed" to https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/
Please add a comment "Task completed" to https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/details/
Please add a comment "Task completed" to https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/comments/
Claude will automatically use the MCP server to fetch comprehensive card information or add comments as requested.
The MCP server communicates via stdin/stdout using the JSON-RPC protocol. It provides two tools:
Description: Read comprehensive card information including title, description, subtasks, and comments
Parameters:
card_id
(string, required): The ID of the Kanbanize card to read or full card URL
Example Response:
{
"title": "Card Title",
"description": "Card description text",
"subtasks": [
{
"id": "123",
"title": "Subtask title",
"description": "Subtask description",
"completed": false
}
],
"comments": [
{
"id": "456",
"text": "Comment text",
"author": "Author Name",
"created_at": "2023-12-01T10:00:00Z"
}
]
}
Description: Add a comment to a card
Parameters:
card_id
(string, required): The ID of the Kanbanize card to add comment to or full card URLcomment_text
(string, required): The text of the comment to add
Example Response:
"Comment added successfully"
- Kanbanize Account: Active Kanbanize/Businessmap account with API access
- API Key: Generated from your account settings (User menu → API)
- Card ID: Valid card ID from your Kanbanize board to test with
- Environment Setup: Configured
.env
file with your credentials
-
Setup Environment:
cp .env.example .env # Edit .env with your actual API key and base URL
-
Build and Test:
# Build the server go build -o businessmap-mcp # Test read_card only (replace 12345 with your actual card ID) ./tests/test_mcp.sh 12345 # Test with full URL (various formats supported) ./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345" ./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/" ./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/12345/details/" # Test both read_card and add_card_comment tools ./tests/test_mcp.sh 12345 "Test comment from MCP server"
# Test read_card only with card ID
./tests/test_mcp.sh YOUR_CARD_ID
# Test read_card with full URL (various formats supported)
./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID"
./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID/"
./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID/details/"
./tests/test_mcp.sh "https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID/comments/"
# Test both tools
./tests/test_mcp.sh YOUR_CARD_ID "Your test comment"
# Test read_card only with card ID
python3 tests/test_interactive.py YOUR_CARD_ID
# Test read_card with full URL
python3 tests/test_interactive.py "https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID/"
# Test both tools
python3 tests/test_interactive.py YOUR_CARD_ID "Your test comment"
# Replace YOUR_CARD_ID in the test file (tests both tools)
sed 's/REPLACE_WITH_CARD_ID/YOUR_CARD_ID/g' tests/test_messages.jsonl | ./businessmap-mcp
# Or test with URL (escape slashes properly)
sed 's|REPLACE_WITH_CARD_ID|https://yourcompany.kanbanize.com/ctrl_board/123/cards/YOUR_CARD_ID/|g' tests/test_messages.jsonl | ./businessmap-mcp
The server should return a clean JSON response like:
{
"title": "Example Card Title",
"description": "Card description text",
"subtasks": [
{
"id": "123",
"title": "Subtask title",
"description": "Optional description",
"completed": false
}
],
"comments": [
{
"id": "456",
"text": "Comment text",
"author": "Author Name",
"created_at": "2023-12-01T10:00:00Z"
}
]
}
The server uses the official Businessmap API v2 endpoints:
Endpoints:
GET {KANBANIZE_BASE_URL}/api/v2/cards/{card_id} # Card details
GET {KANBANIZE_BASE_URL}/api/v2/cards/{card_id}/comments # Comments
GET {KANBANIZE_BASE_URL}/api/v2/cards/{card_id}/subtasks # Subtasks
POST {KANBANIZE_BASE_URL}/api/v2/cards/{card_id}/comments # Add comment
Authentication:
apikey: {KANBANIZE_API_KEY}
businessmap-mcp/
├── README.md # This documentation
├── LICENSE # Apache License 2.0
├── CONTRIBUTING.md # Contribution guidelines
├── main.go # MCP server entry point
├── go.mod # Go module definition
├── go.sum # Go dependencies
├── .env.example # Environment variables template
├── .gitignore # Git ignore rules
├── internal/
│ ├── config/
│ │ └── config.go # Configuration management
│ └── kanbanize/
│ ├── client.go # Kanbanize API client
│ └── types.go # API response types
└── tests/
├── test_mcp.sh # Shell script testing
├── test_interactive.py # Interactive Python testing
└── test_messages.jsonl # Manual JSON-RPC testing
The server provides robust error handling with graceful degradation:
- 🚫 Missing Configuration: Fails fast on startup if API credentials are missing
- ❌ Invalid Card ID: Clear error messages for empty or invalid card IDs
- 🌐 API Errors: Forwards Businessmap API error messages with context
- 📊 Partial Data: Returns available data with empty arrays for missing comments/subtasks
- 🔗 Network Issues: Detailed error reporting for connectivity problems
- 🔒 Environment-based Secrets: API keys stored in environment variables only
- 🚫 No Secret Logging: Credentials never appear in logs or error messages
- 🔐 HTTPS Only: All API communications use secure HTTPS connections
- 🛡️ Secure by Default: No elevated privileges required for execution
- mark3labs/mcp-go - Model Context Protocol Go SDK
- joho/godotenv - Environment variable management
Contributions are welcome! Please read CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'feat: add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
- Issues: Report bugs or request features via GitHub Issues
- Documentation: Full API documentation available in this README
- Community: Contributions and feedback welcome!