@webhooks-cc/mcp 1.15.0 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/dist/bin/mcp.js +52 -10
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
MCP server for [webhooks.cc](https://webhooks.cc). It gives coding agents direct access to webhook testing workflows: create endpoints, send signed test webhooks, inspect captures, compare attempts, verify signatures, and read recent webhook context through MCP resources.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The easiest way in is the [remote server](#remote-server) at `https://webhooks.cc/mcp`, for any client that can add a remote MCP server (Claude Code, Cursor, VS Code, Codex, claude.ai, ChatGPT): you approve it once in your browser, with no key and nothing to install. This package is the local server, for sends to a handler on your machine, its prompts and resources, a keyless sandbox, and CI. It works with Claude Code, Cursor, VS Code, Codex, Devin Desktop (formerly Windsurf), and Claude Desktop.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -27,11 +27,12 @@ For other agents, `npx skills add kroqdotdev/webhooks-cc` installs the same skil
|
|
|
27
27
|
|
|
28
28
|
`https://webhooks.cc/mcp` serves the same tools over streamable HTTP, with nothing to install. The client opens webhooks.cc in the browser once; the human signs in and clicks Connect (OAuth 2.1 with PKCE, no code to type), and can disconnect it later under Account, Connected agents.
|
|
29
29
|
|
|
30
|
-
- **
|
|
31
|
-
- **
|
|
32
|
-
- **Claude Code**: `claude mcp add --transport http webhooks-cc https://webhooks.cc/mcp`
|
|
30
|
+
- **Claude Code**: `claude mcp add -s user --transport http webhooks-cc https://webhooks.cc/mcp`, then `/mcp` in Claude Code to sign in
|
|
31
|
+
- **Codex**: `codex mcp add webhooks-cc --url https://webhooks.cc/mcp` (it opens the browser to sign in; if it does not, `codex mcp login webhooks-cc`)
|
|
33
32
|
- **Cursor** (`.cursor/mcp.json`): `{ "mcpServers": { "webhooks-cc": { "url": "https://webhooks.cc/mcp" } } }`
|
|
34
33
|
- **VS Code** (`.vscode/mcp.json`): `{ "servers": { "webhooks-cc": { "type": "http", "url": "https://webhooks.cc/mcp" } } }`
|
|
34
|
+
- **claude.ai and Claude Desktop**: Settings, Connectors, add a custom connector with the URL `https://webhooks.cc/mcp`
|
|
35
|
+
- **ChatGPT**: add it as a custom connector (developer mode)
|
|
35
36
|
|
|
36
37
|
A client that can send headers may use an API key instead: `Authorization: Bearer whcc_...`. The remote server has 44 tools: `send_to` and `replay_request` are left out and `targetUrl` is refused, because a hosted server cannot reach your machine, and waits are capped at 50 seconds. It needs an account (no sandbox), and serves tools only, without prompts or resources.
|
|
37
38
|
|
|
@@ -56,7 +57,7 @@ npx @webhooks-cc/mcp setup claude-code
|
|
|
56
57
|
npx @webhooks-cc/mcp setup cursor
|
|
57
58
|
npx @webhooks-cc/mcp setup vscode
|
|
58
59
|
npx @webhooks-cc/mcp setup codex
|
|
59
|
-
npx @webhooks-cc/mcp setup windsurf
|
|
60
|
+
npx @webhooks-cc/mcp setup devin # Devin Desktop, formerly Windsurf ("windsurf" works too)
|
|
60
61
|
npx @webhooks-cc/mcp setup claude-desktop
|
|
61
62
|
```
|
|
62
63
|
|
package/dist/bin/mcp.js
CHANGED
|
@@ -2409,7 +2409,7 @@ function sandboxToolSet(server, session, showAccount) {
|
|
|
2409
2409
|
}
|
|
2410
2410
|
|
|
2411
2411
|
// src/index.ts
|
|
2412
|
-
var VERSION = true ? "1.15.
|
|
2412
|
+
var VERSION = true ? "1.15.1" : "0.0.0-dev";
|
|
2413
2413
|
function createServer(options = {}) {
|
|
2414
2414
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
2415
2415
|
const webhookUrl = options.webhookUrl ?? process.env.WHK_WEBHOOK_URL;
|
|
@@ -2436,7 +2436,15 @@ var import_fs = require("fs");
|
|
|
2436
2436
|
var import_path = require("path");
|
|
2437
2437
|
var import_child_process = require("child_process");
|
|
2438
2438
|
var import_os = require("os");
|
|
2439
|
-
var TOOLS = [
|
|
2439
|
+
var TOOLS = [
|
|
2440
|
+
"claude-code",
|
|
2441
|
+
"claude-desktop",
|
|
2442
|
+
"cursor",
|
|
2443
|
+
"vscode",
|
|
2444
|
+
"codex",
|
|
2445
|
+
"devin",
|
|
2446
|
+
"windsurf"
|
|
2447
|
+
];
|
|
2440
2448
|
var API_KEY_REGEX = /^whcc_[a-zA-Z0-9_-]+$/;
|
|
2441
2449
|
function validateApiKeyFormat(key) {
|
|
2442
2450
|
if (!API_KEY_REGEX.test(key)) {
|
|
@@ -2458,12 +2466,13 @@ function vscodeServerConfig(apiKey) {
|
|
|
2458
2466
|
function resolveApiKey(flags) {
|
|
2459
2467
|
return flags["api-key"] ?? process.env.WHK_API_KEY ?? null;
|
|
2460
2468
|
}
|
|
2461
|
-
function mergeJsonConfig(filePath, serverName, serverConfig, key = "mcpServers") {
|
|
2469
|
+
function mergeJsonConfig(filePath, serverName, serverConfig, key = "mcpServers", onInvalid = "replace") {
|
|
2462
2470
|
let existing = {};
|
|
2463
2471
|
if ((0, import_fs.existsSync)(filePath)) {
|
|
2464
2472
|
try {
|
|
2465
2473
|
existing = JSON.parse((0, import_fs.readFileSync)(filePath, "utf-8"));
|
|
2466
2474
|
} catch {
|
|
2475
|
+
if (onInvalid === "keep") return false;
|
|
2467
2476
|
console.warn(`Warning: ${filePath} contains invalid JSON and will be overwritten.`);
|
|
2468
2477
|
console.warn(`A backup has been saved to ${filePath}.bak`);
|
|
2469
2478
|
(0, import_fs.copyFileSync)(filePath, `${filePath}.bak`);
|
|
@@ -2475,6 +2484,7 @@ function mergeJsonConfig(filePath, serverName, serverConfig, key = "mcpServers")
|
|
|
2475
2484
|
const dir = (0, import_path.dirname)(filePath);
|
|
2476
2485
|
if (!(0, import_fs.existsSync)(dir)) (0, import_fs.mkdirSync)(dir, { recursive: true });
|
|
2477
2486
|
(0, import_fs.writeFileSync)(filePath, JSON.stringify(existing, null, 2) + "\n");
|
|
2487
|
+
return true;
|
|
2478
2488
|
}
|
|
2479
2489
|
function getClaudeDesktopConfigPath() {
|
|
2480
2490
|
const os = (0, import_os.platform)();
|
|
@@ -2577,11 +2587,41 @@ WHK_API_KEY = "<your-key>"
|
|
|
2577
2587
|
process.exit(1);
|
|
2578
2588
|
}
|
|
2579
2589
|
}
|
|
2580
|
-
function
|
|
2581
|
-
|
|
2582
|
-
|
|
2590
|
+
function devinMcpConfigPath(os = (0, import_os.platform)(), home = (0, import_os.homedir)(), env = process.env) {
|
|
2591
|
+
if (os === "win32") {
|
|
2592
|
+
const base2 = env.APPDATA || import_path.win32.join(home, "AppData", "Roaming");
|
|
2593
|
+
return import_path.win32.join(base2, "devin", "mcp_config.json");
|
|
2594
|
+
}
|
|
2595
|
+
const xdg = env.XDG_CONFIG_HOME;
|
|
2596
|
+
const base = xdg && import_path.posix.isAbsolute(xdg) ? xdg : import_path.posix.join(home, ".config");
|
|
2597
|
+
return import_path.posix.join(base, "devin", "mcp_config.json");
|
|
2598
|
+
}
|
|
2599
|
+
function legacyWindsurfConfigPath(home = (0, import_os.homedir)()) {
|
|
2600
|
+
return (0, import_path.join)(home, ".codeium", "windsurf", "mcp_config.json");
|
|
2601
|
+
}
|
|
2602
|
+
function setupDevin(apiKey) {
|
|
2603
|
+
const config = mcpServerConfig(apiKey);
|
|
2604
|
+
const configPath = devinMcpConfigPath();
|
|
2605
|
+
if (!mergeJsonConfig(configPath, "webhooks-cc", config, "mcpServers", "keep")) {
|
|
2606
|
+
console.error(
|
|
2607
|
+
`${configPath} is not plain JSON (it may hold comments), so it was left as it is.`
|
|
2608
|
+
);
|
|
2609
|
+
console.error(`Add this under "mcpServers" yourself:
|
|
2610
|
+
`);
|
|
2611
|
+
const entry = mcpServerConfig(apiKey ? "<your-key>" : null);
|
|
2612
|
+
console.error(`"webhooks-cc": ${JSON.stringify(entry, null, 2)}`);
|
|
2613
|
+
process.exit(1);
|
|
2614
|
+
}
|
|
2583
2615
|
console.log(`Done! Config written to ${configPath}`);
|
|
2584
|
-
|
|
2616
|
+
const legacyPath = legacyWindsurfConfigPath();
|
|
2617
|
+
if ((0, import_fs.existsSync)((0, import_path.dirname)(legacyPath))) {
|
|
2618
|
+
if (mergeJsonConfig(legacyPath, "webhooks-cc", config, "mcpServers", "keep")) {
|
|
2619
|
+
console.log(`Also written to ${legacyPath}, for Windsurf from before the rename.`);
|
|
2620
|
+
} else {
|
|
2621
|
+
console.warn(`Left ${legacyPath} as it is: it is not plain JSON.`);
|
|
2622
|
+
}
|
|
2623
|
+
}
|
|
2624
|
+
console.log("Restart Devin Desktop (or Windsurf) for changes to take effect.");
|
|
2585
2625
|
}
|
|
2586
2626
|
function printUsage() {
|
|
2587
2627
|
console.log(`
|
|
@@ -2599,7 +2639,8 @@ Tools:
|
|
|
2599
2639
|
cursor Cursor editor (writes .cursor/mcp.json)
|
|
2600
2640
|
vscode VS Code Copilot (writes .vscode/mcp.json)
|
|
2601
2641
|
codex OpenAI Codex CLI (runs 'codex mcp add')
|
|
2602
|
-
|
|
2642
|
+
devin Devin Desktop (formerly Windsurf) and the Devin CLI
|
|
2643
|
+
windsurf The same as devin
|
|
2603
2644
|
|
|
2604
2645
|
Options:
|
|
2605
2646
|
--api-key <key> Your webhooks.cc API key (or set WHK_API_KEY env var); optional
|
|
@@ -2656,8 +2697,9 @@ function runSetup(args2) {
|
|
|
2656
2697
|
case "codex":
|
|
2657
2698
|
setupCodex(apiKey);
|
|
2658
2699
|
break;
|
|
2700
|
+
case "devin":
|
|
2659
2701
|
case "windsurf":
|
|
2660
|
-
|
|
2702
|
+
setupDevin(apiKey);
|
|
2661
2703
|
break;
|
|
2662
2704
|
}
|
|
2663
2705
|
}
|
|
@@ -2690,7 +2732,7 @@ Setup:
|
|
|
2690
2732
|
npx @webhooks-cc/mcp setup cursor
|
|
2691
2733
|
npx @webhooks-cc/mcp setup vscode
|
|
2692
2734
|
npx @webhooks-cc/mcp setup codex
|
|
2693
|
-
npx @webhooks-cc/mcp setup
|
|
2735
|
+
npx @webhooks-cc/mcp setup devin
|
|
2694
2736
|
npx @webhooks-cc/mcp setup claude-desktop
|
|
2695
2737
|
(add --api-key whcc_... to start with your account's tools)
|
|
2696
2738
|
|
package/dist/index.js
CHANGED
|
@@ -2436,7 +2436,7 @@ function registerAgentRegistrationTools(server) {
|
|
|
2436
2436
|
}
|
|
2437
2437
|
|
|
2438
2438
|
// src/index.ts
|
|
2439
|
-
var VERSION = true ? "1.15.
|
|
2439
|
+
var VERSION = true ? "1.15.1" : "0.0.0-dev";
|
|
2440
2440
|
function createServer(options = {}) {
|
|
2441
2441
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
2442
2442
|
const webhookUrl = options.webhookUrl ?? process.env.WHK_WEBHOOK_URL;
|
package/dist/index.mjs
CHANGED
|
@@ -654,7 +654,7 @@ function registerAgentRegistrationTools(server) {
|
|
|
654
654
|
}
|
|
655
655
|
|
|
656
656
|
// src/index.ts
|
|
657
|
-
var VERSION = true ? "1.15.
|
|
657
|
+
var VERSION = true ? "1.15.1" : "0.0.0-dev";
|
|
658
658
|
function createServer(options = {}) {
|
|
659
659
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
660
660
|
const webhookUrl = options.webhookUrl ?? process.env.WHK_WEBHOOK_URL;
|
package/package.json
CHANGED