# EasyWebhook-MCP Server
**Send webhooks to any HTTP endpoint from Claude Desktop with .env file support!**
[](https://modelcontextprotocol.io)
[](https://www.docker.com/)
[](LICENSE)
## Overview
EasyWebhook-MCP is a Model Context Protocol (MCP) server that enables Claude to send webhooks to Discord, Slack, or any custom HTTP endpoint. It provides a secure interface for AI assistants to send webhook requests to various services without requiring direct API access or file system permissions. Now with **`.env` file support** for easy webhook management!
## ⨠Features
### šÆ Core Capabilities
- ā
Send webhooks to **any HTTP endpoint**
- ā
Support for GET, POST, PUT, PATCH, DELETE methods
- ā
Custom headers and JSON payloads
- ā
**Discord embeds** with title, color, and fields
- ā
**Slack integration** for team notifications
- ā
**Store webhooks in .env file** for easy management
- ā
**Reference webhooks by alias** - no more copy/paste!
- ā
Detailed response feedback with status codes
- ā
Error handling with clear error messages
### š Security
- No file system access required
- Runs in isolated Docker container as non-root user
- Webhook URLs masked in list output
- 30-second timeout protection prevents hanging
- HTTPS recommended for all webhook URLs
- `.env` file protected by `.gitignore`
### š ļø Available Tools
**Alias-Based Tools** (use stored webhooks from .env):
- `list_webhooks` - List all configured webhook aliases
- `send_webhook_by_alias` - Send webhook using stored alias
- `send_discord_webhook_by_alias` - Discord embed by alias (supports title, color, username, avatar)
- `send_slack_webhook_by_alias` - Slack message by alias
**Direct URL Tools** (pass webhook URL each time):
- `send_webhook` - Universal webhook sender (GET, POST, PUT, PATCH, DELETE)
- `send_discord_webhook` - Discord embed with URL (supports title, color, username, avatar)
- `send_slack_webhook` - Slack message with URL
## š Quick Start
### Prerequisites
- Docker Desktop with MCP Toolkit
- Claude Desktop app
### Installation
**1. Create .env file:**
```bash
cd c:\Users\plgon\Downloads\EasyWebhook-MCP
copy .env.example .env
notepad .env
```
Add your webhooks:
```env
DISCORD_WEBHOOK=https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN
SLACK_WEBHOOK=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
MY_CUSTOM_API=https://api.example.com/webhook
```
**2. Build Docker image:**
```bash
docker build -t easywebhook-mcp-server .
```
**3. Configure Claude Desktop:**
```bash
# Copy catalog
copy custom.yaml $env:USERPROFILE\.docker\mcp\catalogs\custom.yaml
# Update registry
notepad $env:USERPROFILE\.docker\mcp\registry.yaml
```
Add to registry under `registry:`:
```yaml
easywebhook:
ref: ""
```
Update Claude config at `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers": {
"mcp-toolkit-gateway": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"-v", "C:\\Users\\plgon\\.docker\\mcp:/mcp",
"docker/mcp-gateway",
"--catalog=/mcp/catalogs/docker-mcp.yaml",
"--catalog=/mcp/catalogs/custom.yaml",
"--config=/mcp/config.yaml",
"--registry=/mcp/registry.yaml",
"--tools-config=/mcp/tools.yaml",
"--transport=stdio"
]
}
}
}
```
**4. Restart Claude Desktop**
## š” Usage Examples
### Using Stored Webhooks (Recommended)
**List configured webhooks:**
```text
You: "List my webhooks"
Claude: š Stored Webhooks:
⢠DISCORD_WEBHOOK: https://discord.com/api/webh...
⢠SLACK_WEBHOOK: https://hooks.slack.com/serv...
⢠MY_CUSTOM_HOOK: https://example.com/webhook...
```
**Simple Discord message:**
```text
You: "Send Discord message using DISCORD_WEBHOOK saying 'Hello World!'"
Claude: ā
Discord embed sent successfully!
```
**Discord with title and color:**
```text
You: "Send to DISCORD_WEBHOOK with title 'Deployment Status' message 'All systems operational' and color 00FF00"
Claude: ā
Discord embed sent successfully!
š Title: Deployment Status
```
**Discord with full embed (JSON):**
```text
You: "Send to DISCORD_WEBHOOK: {'title': 'Server Metrics', 'description': 'Current status', 'color': 3447003, 'fields': [{'name': 'CPU', 'value': '45%', 'inline': true}, {'name': 'RAM', 'value': '62%', 'inline': true}]}"
Claude: ā
Discord embed sent successfully!
```
**Slack message:**
```text
You: "Send to SLACK_WEBHOOK: 'Deployment complete'"
Claude: ā
Slack message sent successfully!
```
**Custom webhook:**
```text
You: "Use MY_CUSTOM_HOOK to send {\"status\": \"active\", \"uptime\": 3600}"
Claude: ā
Webhook sent successfully!
š Status: 200
```
### Using Direct URLs
**Generic webhook:**
```text
You: "Send POST webhook to https://example.com/hook with payload {\"test\": true}"
Claude: ā
Webhook sent successfully!
```
**Discord with URL:**
```text
You: "Send Discord webhook to [URL] with message 'Alert!' and color FF0000"
Claude: ā
Discord embed sent successfully!
```
### Payload Formats
**Simple text:**
```json
{"message": "Hello World"}
```
**JSON payload:**
```json
{"title": "Alert", "status": "active", "priority": 1}
```
**Custom headers:**
```json
{"Authorization": "Bearer token123", "X-Custom-Header": "value"}
```
Or comma-separated:
```text
"Authorization: Bearer token123, X-Custom-Header: value"
```
## š Architecture
```text
Claude Desktop ā MCP Gateway ā EasyWebhook MCP Server ā Target Webhook URL
ā
.env file (local)
ā
Discord/Slack/Custom API
```
## š Documentation
- **[QUICK_START.md](QUICK_START.md)** - 5-minute setup guide
- **[SETUP_GUIDE.md](SETUP_GUIDE.md)** - Comprehensive setup instructions
- **[CLAUDE.md](CLAUDE.md)** - Developer implementation guide
- **[CHANGELOG.md](CHANGELOG.md)** - Version history
- **[VISUAL_GUIDE.txt](VISUAL_GUIDE.txt)** - Visual walkthrough
## šÆ Why Use .env Files?
**Before:**
```
ā Copy/paste long URLs every time
ā Risk of typos
ā Hard to manage multiple webhooks
```
**After:**
```
ā
Simple aliases like "DISCORD_WEBHOOK"
ā
Store once, use everywhere
ā
Easy to update and manage
ā
More secure (URLs in local file)
```
## š§ Updating Webhooks
1. Edit `.env` file
2. Rebuild: `docker build -t easywebhook-mcp-server .`
3. Restart Claude Desktop
## š§ Development
### Local Testing
```bash
# Run server directly
python easywebhook_server.py
# Test MCP protocol
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | python easywebhook_server.py
```
### Testing Webhooks
**Discord Webhook:**
Create a webhook in Discord: Server Settings ā Integrations ā Webhooks
**Slack Webhook:**
Create an app at [api.slack.com/apps](https://api.slack.com/apps) and enable Incoming Webhooks
**Custom Webhook:**
Any HTTP endpoint that accepts POST/GET/PUT/PATCH/DELETE requests
## š Troubleshooting
### Tools Not Appearing
- Verify Docker image built successfully: `docker images | grep easywebhook`
- Check catalog and registry files for syntax errors
- Ensure Claude Desktop config includes custom catalog path
- Restart Claude Desktop completely (quit and reopen)
### Webhook Failures
- Verify the webhook URL is correct and accessible
- Check that the webhook hasn't been deleted or revoked
- Ensure payload format matches the expected format for the service
- Review error messages for HTTP status codes
### Timeout Errors
- Webhook endpoint may be slow or unavailable
- Check network connectivity
- Verify the target service is operational
### "No webhook found for alias"
- Check `.env` file exists in project directory
- Verify alias name matches (case-insensitive)
- Rebuild Docker image: `docker build -t easywebhook-mcp-server .`
- Ensure the URL starts with `http://` or `https://`
### Invalid URL Errors
- Ensure URL includes `http://` or `https://`
- Verify no typos in the webhook URL
- Check that the URL is properly formatted
**Full troubleshooting guide in [SETUP_GUIDE.md](SETUP_GUIDE.md)**
## š Project Structure
```
EasyWebhook-MCP/
āāā .env.example # Webhook configuration template
āāā .env # Your webhooks (create this)
āāā .gitignore # Git ignore rules (protects .env)
āāā easywebhook_server.py # Main MCP server
āāā requirements.txt # Python dependencies
āāā Dockerfile # Docker configuration
āāā custom.yaml # MCP catalog definition
āāā README.md # This file (complete documentation)
āāā QUICK_START.md # Fast setup guide
āāā SETUP_GUIDE.md # Detailed instructions
āāā VISUAL_GUIDE.txt # Visual walkthrough
āāā CHANGELOG.md # Version history
āāā CLAUDE.md # Implementation guide
```
## š¤ Contributing
Contributions are welcome! This is an open-source MCP server and we'd love your help making it better.
### Ways to Contribute
- š **Report bugs** - Open an issue describing the problem
- š” **Suggest features** - Share ideas for new tools or improvements
- š **Improve documentation** - Fix typos, clarify instructions, add examples
- š§ **Submit code** - Fix bugs, add features, improve performance
- ā **Star the repo** - Show your support!
### Development Setup
1. **Fork and clone the repository**
```bash
git clone https://github.com/YOUR_USERNAME/EasyWebhook-MCP.git
cd EasyWebhook-MCP
```
2. **Create a `.env` file for testing**
```bash
cp .env.example .env
# Add your test webhook URLs
```
3. **Make your changes**
- Follow existing code style
- Use single-line docstrings for MCP tools
- Add error handling for new features
- Test thoroughly before submitting
4. **Test your changes**
```bash
# Build Docker image
docker build -t easywebhook-mcp-server .
# Test locally
python easywebhook_server.py
```
5. **Submit a pull request**
- Describe what your PR does
- Reference any related issues
- Include examples if adding new features
### Adding New Tools
To add a new webhook tool:
1. **Add the function to `easywebhook_server.py`**
```python
@mcp.tool()
async def send_my_service_webhook(webhook_url: str = "", message: str = "") -> str:
"""Send a message to MyService using a webhook URL."" # Single-line only!
# Implementation here
return "ā
Message sent successfully!"
```
2. **Use these guidelines:**
- Decorate with `@mcp.tool()`
- Use **single-line docstrings only** (multi-line causes errors)
- Use empty string defaults: `param: str = ""` not `param: str = None`
- Return formatted strings with emojis (ā
ā ā ļø š)
- Add comprehensive error handling
- Log actions to stderr
3. **Update `custom.yaml`**
```yaml
tools:
- name: send_my_service_webhook
```
4. **Update documentation**
- Add usage examples to README.md
- Update SETUP_GUIDE.md if needed
- Update CHANGELOG.md
5. **Rebuild and test**
```bash
docker build -t easywebhook-mcp-server .
# Test in Claude Desktop
```
### Code Style Guidelines
- **Python:** Follow PEP 8, use async/await for HTTP operations
- **Error messages:** User-friendly with emoji indicators
- **Logging:** Use `logger.info()` and `logger.error()` for important events
- **Security:** Never log full webhook URLs, mask sensitive data
- **Type hints:** Use simple types (str, int), avoid Optional/Union
### Testing Guidelines
**Before submitting:**
- ā
Test all new tools with real webhook URLs
- ā
Test error conditions (invalid URLs, timeouts, etc.)
- ā
Verify changes work in Docker container
- ā
Check that Claude Desktop recognizes new tools
- ā
Ensure no secrets are hardcoded or logged
### Documentation Guidelines
- Keep README.md concise and user-focused
- Add detailed examples for complex features
- Update CHANGELOG.md for all changes
- Use clear, friendly language
- Include emoji for visual clarity šØ
### Getting Help
- **Questions?** Open a discussion or issue
- **Stuck?** Check [CLAUDE.md](CLAUDE.md) for implementation details
- **Need examples?** See existing tools in `easywebhook_server.py`
### License
By contributing, you agree that your contributions will be licensed under the MIT License.
## š License
MIT License - Use freely in your projects
## š Resources
- [Model Context Protocol](https://modelcontextprotocol.io)
- [Docker MCP](https://docs.docker.com/desktop/mcp)
- [FastMCP](https://github.com/jlowin/fastmcp)
## āļø Response Format
All tools return formatted strings with:
- ā
Success indicators
- ā Error messages
- š Status codes
- š URL information
- ā” Method used
- š Response previews (first 200 chars)
## ā ļø Limitations
- Maximum 30-second timeout per request
- Response body limited to 200 characters in output
- JSON payload format required for most structured data
- No support for file uploads via webhooks
## š What's New in v2.0
- ⨠`.env` file support for webhook storage
- š§ Four new alias-based tools
- š `list_webhooks` tool to view configurations
- š Enhanced security with URL masking
- šØ Discord embeds with full customization (title, color, fields)
- š Comprehensive documentation
---
**Ready to send webhooks from Claude?** Follow [QUICK_START.md](QUICK_START.md) to get started in 5 minutes! š