@webhooks-cc/mcp 1.6.0 → 1.7.0
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 +5 -1
- package/dist/bin/mcp.js +20 -9
- package/dist/index.js +20 -9
- package/dist/index.mjs +21 -9
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -149,10 +149,14 @@ Provider template and signing support includes:
|
|
|
149
149
|
- `mux`
|
|
150
150
|
- `sentry`
|
|
151
151
|
- `bitbucket`
|
|
152
|
+
- `docusign`
|
|
153
|
+
- `adyen`
|
|
154
|
+
- `paypal`
|
|
155
|
+
- `plaid`
|
|
152
156
|
|
|
153
157
|
Signature verification also supports:
|
|
154
158
|
|
|
155
|
-
- all template providers except `sendgrid
|
|
159
|
+
- all template providers except `sendgrid` (IP allowlisting) and `plaid` (JWT/JWK verification requires Plaid API credentials)
|
|
156
160
|
|
|
157
161
|
Use `list_provider_templates` to inspect templates, default events, signature headers, and signing requirements from the agent.
|
|
158
162
|
|
package/dist/bin/mcp.js
CHANGED
|
@@ -687,15 +687,17 @@ function registerTools(server, client) {
|
|
|
687
687
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template to send with signed headers"),
|
|
688
688
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
689
689
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
690
|
-
secret: import_zod2.z.string().optional().describe(
|
|
690
|
+
secret: import_zod2.z.string().optional().describe(
|
|
691
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
692
|
+
)
|
|
691
693
|
},
|
|
692
694
|
withErrorHandling(
|
|
693
695
|
async ({ slug, method, headers, body, provider, template, event, secret }) => {
|
|
694
696
|
let response;
|
|
695
697
|
if (provider) {
|
|
696
698
|
const templateSecret = secret?.trim();
|
|
697
|
-
if (!templateSecret) {
|
|
698
|
-
throw new Error(
|
|
699
|
+
if (!templateSecret && import_sdk.TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
700
|
+
throw new Error(`send_webhook with provider "${provider}" requires a non-empty secret`);
|
|
699
701
|
}
|
|
700
702
|
response = await client.endpoints.sendTemplate(slug, {
|
|
701
703
|
provider,
|
|
@@ -871,7 +873,7 @@ function registerTools(server, client) {
|
|
|
871
873
|
requestId: import_zod2.z.string().describe("The captured request ID"),
|
|
872
874
|
provider: import_zod2.z.enum(import_sdk.VERIFY_PROVIDERS).optional().describe("Provider whose signature scheme should be verified. Omit to use stored result."),
|
|
873
875
|
secret: import_zod2.z.string().optional().describe(
|
|
874
|
-
"
|
|
876
|
+
"Provider credential for client-side verification (for example a shared signing secret, Adyen hex HMAC key, or PayPal webhook ID). Required for non-Discord providers."
|
|
875
877
|
),
|
|
876
878
|
publicKey: import_zod2.z.string().optional().describe("Discord application public key. Required for provider=discord."),
|
|
877
879
|
url: httpUrlSchema.optional().describe("Original signed URL. Required for Twilio, Square, and HubSpot verification."),
|
|
@@ -943,7 +945,9 @@ function registerTools(server, client) {
|
|
|
943
945
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
944
946
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
945
947
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
946
|
-
secret: import_zod2.z.string().optional().describe(
|
|
948
|
+
secret: import_zod2.z.string().optional().describe(
|
|
949
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
950
|
+
)
|
|
947
951
|
},
|
|
948
952
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
949
953
|
const response = await client.sendTo(url, {
|
|
@@ -974,7 +978,9 @@ function registerTools(server, client) {
|
|
|
974
978
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
975
979
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
976
980
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
977
|
-
secret: import_zod2.z.string().optional().describe(
|
|
981
|
+
secret: import_zod2.z.string().optional().describe(
|
|
982
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
983
|
+
)
|
|
978
984
|
},
|
|
979
985
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
980
986
|
const preview = await client.buildRequest(url, {
|
|
@@ -1050,9 +1056,9 @@ function registerTools(server, client) {
|
|
|
1050
1056
|
}
|
|
1051
1057
|
if (provider) {
|
|
1052
1058
|
const templateSecret = secret?.trim();
|
|
1053
|
-
if (!templateSecret) {
|
|
1059
|
+
if (!templateSecret && import_sdk.TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
1054
1060
|
throw new Error(
|
|
1055
|
-
|
|
1061
|
+
`test_webhook_flow with provider "${provider}" requires a non-empty secret`
|
|
1056
1062
|
);
|
|
1057
1063
|
}
|
|
1058
1064
|
flow.sendTemplate({
|
|
@@ -1066,6 +1072,11 @@ function registerTools(server, client) {
|
|
|
1066
1072
|
"test_webhook_flow cannot verify Discord signatures (Ed25519 requires a public key, not a secret)"
|
|
1067
1073
|
);
|
|
1068
1074
|
}
|
|
1075
|
+
if (!templateSecret) {
|
|
1076
|
+
throw new Error(
|
|
1077
|
+
`test_webhook_flow cannot verify "${provider}" signatures \u2014 this provider's templates are unsigned`
|
|
1078
|
+
);
|
|
1079
|
+
}
|
|
1069
1080
|
flow.verifySignature({
|
|
1070
1081
|
provider,
|
|
1071
1082
|
secret: templateSecret
|
|
@@ -1208,7 +1219,7 @@ function registerAgentRegistrationTools(server) {
|
|
|
1208
1219
|
}
|
|
1209
1220
|
|
|
1210
1221
|
// src/index.ts
|
|
1211
|
-
var VERSION = true ? "1.
|
|
1222
|
+
var VERSION = true ? "1.7.0" : "0.0.0-dev";
|
|
1212
1223
|
function createServer(options = {}) {
|
|
1213
1224
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
1214
1225
|
const server = new import_mcp2.McpServer({
|
package/dist/index.js
CHANGED
|
@@ -709,15 +709,17 @@ function registerTools(server, client) {
|
|
|
709
709
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template to send with signed headers"),
|
|
710
710
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
711
711
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
712
|
-
secret: import_zod2.z.string().optional().describe(
|
|
712
|
+
secret: import_zod2.z.string().optional().describe(
|
|
713
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
714
|
+
)
|
|
713
715
|
},
|
|
714
716
|
withErrorHandling(
|
|
715
717
|
async ({ slug, method, headers, body, provider, template, event, secret }) => {
|
|
716
718
|
let response;
|
|
717
719
|
if (provider) {
|
|
718
720
|
const templateSecret = secret?.trim();
|
|
719
|
-
if (!templateSecret) {
|
|
720
|
-
throw new Error(
|
|
721
|
+
if (!templateSecret && import_sdk.TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
722
|
+
throw new Error(`send_webhook with provider "${provider}" requires a non-empty secret`);
|
|
721
723
|
}
|
|
722
724
|
response = await client.endpoints.sendTemplate(slug, {
|
|
723
725
|
provider,
|
|
@@ -893,7 +895,7 @@ function registerTools(server, client) {
|
|
|
893
895
|
requestId: import_zod2.z.string().describe("The captured request ID"),
|
|
894
896
|
provider: import_zod2.z.enum(import_sdk.VERIFY_PROVIDERS).optional().describe("Provider whose signature scheme should be verified. Omit to use stored result."),
|
|
895
897
|
secret: import_zod2.z.string().optional().describe(
|
|
896
|
-
"
|
|
898
|
+
"Provider credential for client-side verification (for example a shared signing secret, Adyen hex HMAC key, or PayPal webhook ID). Required for non-Discord providers."
|
|
897
899
|
),
|
|
898
900
|
publicKey: import_zod2.z.string().optional().describe("Discord application public key. Required for provider=discord."),
|
|
899
901
|
url: httpUrlSchema.optional().describe("Original signed URL. Required for Twilio, Square, and HubSpot verification."),
|
|
@@ -965,7 +967,9 @@ function registerTools(server, client) {
|
|
|
965
967
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
966
968
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
967
969
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
968
|
-
secret: import_zod2.z.string().optional().describe(
|
|
970
|
+
secret: import_zod2.z.string().optional().describe(
|
|
971
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
972
|
+
)
|
|
969
973
|
},
|
|
970
974
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
971
975
|
const response = await client.sendTo(url, {
|
|
@@ -996,7 +1000,9 @@ function registerTools(server, client) {
|
|
|
996
1000
|
provider: import_zod2.z.enum(import_sdk.TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
997
1001
|
template: import_zod2.z.string().optional().describe("Provider-specific template preset"),
|
|
998
1002
|
event: import_zod2.z.string().optional().describe("Provider event or topic name"),
|
|
999
|
-
secret: import_zod2.z.string().optional().describe(
|
|
1003
|
+
secret: import_zod2.z.string().optional().describe(
|
|
1004
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
1005
|
+
)
|
|
1000
1006
|
},
|
|
1001
1007
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
1002
1008
|
const preview = await client.buildRequest(url, {
|
|
@@ -1072,9 +1078,9 @@ function registerTools(server, client) {
|
|
|
1072
1078
|
}
|
|
1073
1079
|
if (provider) {
|
|
1074
1080
|
const templateSecret = secret?.trim();
|
|
1075
|
-
if (!templateSecret) {
|
|
1081
|
+
if (!templateSecret && import_sdk.TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
1076
1082
|
throw new Error(
|
|
1077
|
-
|
|
1083
|
+
`test_webhook_flow with provider "${provider}" requires a non-empty secret`
|
|
1078
1084
|
);
|
|
1079
1085
|
}
|
|
1080
1086
|
flow.sendTemplate({
|
|
@@ -1088,6 +1094,11 @@ function registerTools(server, client) {
|
|
|
1088
1094
|
"test_webhook_flow cannot verify Discord signatures (Ed25519 requires a public key, not a secret)"
|
|
1089
1095
|
);
|
|
1090
1096
|
}
|
|
1097
|
+
if (!templateSecret) {
|
|
1098
|
+
throw new Error(
|
|
1099
|
+
`test_webhook_flow cannot verify "${provider}" signatures \u2014 this provider's templates are unsigned`
|
|
1100
|
+
);
|
|
1101
|
+
}
|
|
1091
1102
|
flow.verifySignature({
|
|
1092
1103
|
provider,
|
|
1093
1104
|
secret: templateSecret
|
|
@@ -1230,7 +1241,7 @@ function registerAgentRegistrationTools(server) {
|
|
|
1230
1241
|
}
|
|
1231
1242
|
|
|
1232
1243
|
// src/index.ts
|
|
1233
|
-
var VERSION = true ? "1.
|
|
1244
|
+
var VERSION = true ? "1.7.0" : "0.0.0-dev";
|
|
1234
1245
|
function createServer(options = {}) {
|
|
1235
1246
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
1236
1247
|
const server = new import_mcp2.McpServer({
|
package/dist/index.mjs
CHANGED
|
@@ -250,6 +250,7 @@ import {
|
|
|
250
250
|
MAX_GLOB_PATTERN_LEN,
|
|
251
251
|
NotFoundError,
|
|
252
252
|
RateLimitError,
|
|
253
|
+
TEMPLATE_METADATA,
|
|
253
254
|
TEMPLATE_PROVIDERS,
|
|
254
255
|
TimeoutError,
|
|
255
256
|
UnauthorizedError,
|
|
@@ -702,15 +703,17 @@ function registerTools(server, client) {
|
|
|
702
703
|
provider: z2.enum(TEMPLATE_PROVIDERS).optional().describe("Optional provider template to send with signed headers"),
|
|
703
704
|
template: z2.string().optional().describe("Provider-specific template preset"),
|
|
704
705
|
event: z2.string().optional().describe("Provider event or topic name"),
|
|
705
|
-
secret: z2.string().optional().describe(
|
|
706
|
+
secret: z2.string().optional().describe(
|
|
707
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
708
|
+
)
|
|
706
709
|
},
|
|
707
710
|
withErrorHandling(
|
|
708
711
|
async ({ slug, method, headers, body, provider, template, event, secret }) => {
|
|
709
712
|
let response;
|
|
710
713
|
if (provider) {
|
|
711
714
|
const templateSecret = secret?.trim();
|
|
712
|
-
if (!templateSecret) {
|
|
713
|
-
throw new Error(
|
|
715
|
+
if (!templateSecret && TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
716
|
+
throw new Error(`send_webhook with provider "${provider}" requires a non-empty secret`);
|
|
714
717
|
}
|
|
715
718
|
response = await client.endpoints.sendTemplate(slug, {
|
|
716
719
|
provider,
|
|
@@ -886,7 +889,7 @@ function registerTools(server, client) {
|
|
|
886
889
|
requestId: z2.string().describe("The captured request ID"),
|
|
887
890
|
provider: z2.enum(VERIFY_PROVIDERS).optional().describe("Provider whose signature scheme should be verified. Omit to use stored result."),
|
|
888
891
|
secret: z2.string().optional().describe(
|
|
889
|
-
"
|
|
892
|
+
"Provider credential for client-side verification (for example a shared signing secret, Adyen hex HMAC key, or PayPal webhook ID). Required for non-Discord providers."
|
|
890
893
|
),
|
|
891
894
|
publicKey: z2.string().optional().describe("Discord application public key. Required for provider=discord."),
|
|
892
895
|
url: httpUrlSchema.optional().describe("Original signed URL. Required for Twilio, Square, and HubSpot verification."),
|
|
@@ -958,7 +961,9 @@ function registerTools(server, client) {
|
|
|
958
961
|
provider: z2.enum(TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
959
962
|
template: z2.string().optional().describe("Provider-specific template preset"),
|
|
960
963
|
event: z2.string().optional().describe("Provider event or topic name"),
|
|
961
|
-
secret: z2.string().optional().describe(
|
|
964
|
+
secret: z2.string().optional().describe(
|
|
965
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
966
|
+
)
|
|
962
967
|
},
|
|
963
968
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
964
969
|
const response = await client.sendTo(url, {
|
|
@@ -989,7 +994,9 @@ function registerTools(server, client) {
|
|
|
989
994
|
provider: z2.enum(TEMPLATE_PROVIDERS).optional().describe("Optional provider template for signing"),
|
|
990
995
|
template: z2.string().optional().describe("Provider-specific template preset"),
|
|
991
996
|
event: z2.string().optional().describe("Provider event or topic name"),
|
|
992
|
-
secret: z2.string().optional().describe(
|
|
997
|
+
secret: z2.string().optional().describe(
|
|
998
|
+
"Signing secret. Required for signed provider templates; omit for secretless providers (sendgrid, discord, plaid)."
|
|
999
|
+
)
|
|
993
1000
|
},
|
|
994
1001
|
withErrorHandling(async ({ url, method, headers, body, provider, template, event, secret }) => {
|
|
995
1002
|
const preview = await client.buildRequest(url, {
|
|
@@ -1065,9 +1072,9 @@ function registerTools(server, client) {
|
|
|
1065
1072
|
}
|
|
1066
1073
|
if (provider) {
|
|
1067
1074
|
const templateSecret = secret?.trim();
|
|
1068
|
-
if (!templateSecret) {
|
|
1075
|
+
if (!templateSecret && TEMPLATE_METADATA[provider]?.secretRequired !== false) {
|
|
1069
1076
|
throw new Error(
|
|
1070
|
-
|
|
1077
|
+
`test_webhook_flow with provider "${provider}" requires a non-empty secret`
|
|
1071
1078
|
);
|
|
1072
1079
|
}
|
|
1073
1080
|
flow.sendTemplate({
|
|
@@ -1081,6 +1088,11 @@ function registerTools(server, client) {
|
|
|
1081
1088
|
"test_webhook_flow cannot verify Discord signatures (Ed25519 requires a public key, not a secret)"
|
|
1082
1089
|
);
|
|
1083
1090
|
}
|
|
1091
|
+
if (!templateSecret) {
|
|
1092
|
+
throw new Error(
|
|
1093
|
+
`test_webhook_flow cannot verify "${provider}" signatures \u2014 this provider's templates are unsigned`
|
|
1094
|
+
);
|
|
1095
|
+
}
|
|
1084
1096
|
flow.verifySignature({
|
|
1085
1097
|
provider,
|
|
1086
1098
|
secret: templateSecret
|
|
@@ -1223,7 +1235,7 @@ function registerAgentRegistrationTools(server) {
|
|
|
1223
1235
|
}
|
|
1224
1236
|
|
|
1225
1237
|
// src/index.ts
|
|
1226
|
-
var VERSION = true ? "1.
|
|
1238
|
+
var VERSION = true ? "1.7.0" : "0.0.0-dev";
|
|
1227
1239
|
function createServer(options = {}) {
|
|
1228
1240
|
const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
|
|
1229
1241
|
const server = new McpServer2({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webhooks-cc/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "MCP server for webhooks.cc — AI agent integration for webhook testing",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -36,15 +36,15 @@
|
|
|
36
36
|
},
|
|
37
37
|
"homepage": "https://webhooks.cc",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
39
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
40
40
|
"zod": "^4.4.3",
|
|
41
|
-
"@webhooks-cc/sdk": "1.
|
|
41
|
+
"@webhooks-cc/sdk": "1.9.1"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@types/node": "^
|
|
44
|
+
"@types/node": "^26.2.0",
|
|
45
45
|
"tsup": "^8.5.1",
|
|
46
46
|
"typescript": "^6.0.3",
|
|
47
|
-
"vitest": "^4.1.
|
|
47
|
+
"vitest": "^4.1.10"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsup",
|