Skip to content

Commit 7f0f201

Browse files
committed
v2.1.2: Remove broken clone_webhook tool
1 parent 1c5dad8 commit 7f0f201

File tree

6 files changed

+12
-92
lines changed

6 files changed

+12
-92
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [2.1.2] - 2026-01-26
9+
10+
### Removed
11+
12+
- Removed `clone_webhook` tool due to webhook.site API compatibility issues (24 → 23 tools)
13+
14+
### Changed
15+
16+
- Updated README and badges to reflect 23 tools
17+
818
## [2.1.1] - 2026-01-26
919

1020
### Fixed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![PyPI](https://img.shields.io/pypi/v/webhook-mcp-server.svg)](https://pypi.org/project/webhook-mcp-server/)
44
[![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)
5-
[![MCP](https://img.shields.io/badge/MCP-24%20tools-brightgreen.svg)](https://modelcontextprotocol.io/)
5+
[![MCP](https://img.shields.io/badge/MCP-23%20tools-brightgreen.svg)](https://modelcontextprotocol.io/)
66
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
77

88
A Model Context Protocol (MCP) server for [webhook.site](https://webhook.site) - instantly capture HTTP requests, emails, and DNS lookups. Perfect for testing webhooks, debugging API callbacks, security testing, and bug bounty hunting.
@@ -139,7 +139,6 @@ Add to `claude_desktop_config.json`:
139139
| Tool | Description |
140140
| ------------------------ | --------------------------------------- |
141141
| `send_multiple_requests` | Send batch of requests for load testing |
142-
| `clone_webhook` | Copy webhook with all settings |
143142
| `export_webhook_data` | Export all requests to JSON |
144143

145144
---

handlers/tool_handlers.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ def _get_handler(
120120
"extract_links_from_request": self._handle_extract_links_from_request,
121121
# Batch & utility tools
122122
"send_multiple_requests": self._handle_send_multiple_requests,
123-
"clone_webhook": self._handle_clone_webhook,
124123
"export_webhook_data": self._handle_export_webhook_data,
125124
}
126125
return handlers.get(name)
@@ -388,13 +387,6 @@ async def _handle_send_multiple_requests(self, arguments: dict[str, Any]) -> Too
388387
delay_ms=arguments.get("delay_ms", 0),
389388
)
390389

391-
async def _handle_clone_webhook(self, arguments: dict[str, Any]) -> ToolResult:
392-
"""Handle clone_webhook tool."""
393-
self._validate_webhook_token(arguments["source_token"])
394-
return await self._webhook_service.clone_webhook(
395-
source_token=arguments["source_token"],
396-
)
397-
398390
async def _handle_export_webhook_data(self, arguments: dict[str, Any]) -> ToolResult:
399391
"""Handle export_webhook_data tool."""
400392
self._validate_webhook_token(arguments["webhook_token"])

models/schemas.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -654,20 +654,6 @@ def to_json(self) -> str:
654654
"required": ["webhook_token", "payloads"]
655655
}
656656
),
657-
Tool(
658-
name="clone_webhook",
659-
description="Clone an existing webhook with all its settings. Creates a new webhook with the same configuration (status, content, CORS, timeout) as the source.",
660-
inputSchema={
661-
"type": "object",
662-
"properties": {
663-
"source_token": {
664-
"type": "string",
665-
"description": "The webhook token (UUID) to clone"
666-
}
667-
},
668-
"required": ["source_token"]
669-
}
670-
),
671657
Tool(
672658
name="export_webhook_data",
673659
description="Export all captured requests from a webhook to JSON format. Includes full request details: headers, body, IP, timestamp, user agent.",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "webhook-mcp-server"
3-
version = "2.1.1"
3+
version = "2.1.2"
44
description = "MCP Server for webhook.site API integration with layered architecture"
55
readme = "README.md"
66
license = {text = "MIT"}

services/webhook_service.py

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -351,70 +351,3 @@ async def get_dns(self, webhook_token: str, validate: bool = False) -> ToolResul
351351
"url": url,
352352
}
353353
)
354-
355-
async def clone_webhook(self, source_token: str) -> ToolResult:
356-
"""Clone an existing webhook with all its settings.
357-
358-
Creates a new webhook with the same configuration as the source.
359-
360-
Args:
361-
source_token: The webhook UUID to clone
362-
363-
Returns:
364-
ToolResult with new webhook token and copied settings
365-
"""
366-
try:
367-
# Get source webhook info (returns dict, not response)
368-
source_data = await self._client.get(f"/token/{source_token}")
369-
370-
# Create new webhook with same config
371-
config = WebhookConfig(
372-
default_status=source_data.get("default_status"),
373-
default_content=source_data.get("default_content"),
374-
default_content_type=source_data.get("default_content_type"),
375-
timeout=source_data.get("timeout"),
376-
cors=source_data.get("cors"),
377-
)
378-
379-
# Create the cloned webhook (returns Response object)
380-
create_response = await self._client.post("/token", json_data=config.to_payload())
381-
create_response.raise_for_status()
382-
new_data = create_response.json()
383-
384-
new_token = new_data.get("uuid")
385-
urls = self._build_webhook_urls(new_token)
386-
387-
return ToolResult(
388-
success=True,
389-
message=f"Webhook cloned! New URL: {urls['url']}",
390-
data={
391-
"source_token": source_token,
392-
"new_token": new_token,
393-
**urls,
394-
"cloned_settings": {
395-
"default_status": source_data.get("default_status"),
396-
"default_content": source_data.get("default_content"),
397-
"default_content_type": source_data.get("default_content_type"),
398-
"timeout": source_data.get("timeout"),
399-
"cors": source_data.get("cors"),
400-
}
401-
}
402-
)
403-
except WebhookApiError as e:
404-
if e.status_code == 404:
405-
return ToolResult(
406-
success=False,
407-
message=f"Source token '{source_token}' not found or expired",
408-
data=None
409-
)
410-
return ToolResult(
411-
success=False,
412-
message=f"Failed to clone webhook: {str(e)}",
413-
data=None
414-
)
415-
except Exception as e:
416-
return ToolResult(
417-
success=False,
418-
message=f"Failed to clone webhook: {str(e)}",
419-
data=None
420-
)

0 commit comments

Comments
 (0)