@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 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`, which uses IP allowlisting instead of cryptographic signatures
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("Signing secret. Required when provider is set.")
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("send_webhook with provider templates requires a non-empty secret");
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
- "Shared signing secret. Required for non-Discord providers when doing client-side verification."
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("Signing secret. Required when provider is set.")
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("Signing secret. Required when provider is set.")
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
- "test_webhook_flow with provider templates requires a non-empty secret"
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.6.0" : "0.0.0-dev";
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("Signing secret. Required when provider is set.")
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("send_webhook with provider templates requires a non-empty secret");
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
- "Shared signing secret. Required for non-Discord providers when doing client-side verification."
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("Signing secret. Required when provider is set.")
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("Signing secret. Required when provider is set.")
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
- "test_webhook_flow with provider templates requires a non-empty secret"
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.6.0" : "0.0.0-dev";
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("Signing secret. Required when provider is set.")
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("send_webhook with provider templates requires a non-empty secret");
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
- "Shared signing secret. Required for non-Discord providers when doing client-side verification."
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("Signing secret. Required when provider is set.")
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("Signing secret. Required when provider is set.")
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
- "test_webhook_flow with provider templates requires a non-empty secret"
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.6.0" : "0.0.0-dev";
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.6.0",
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.29.0",
39
+ "@modelcontextprotocol/sdk": "^1.30.0",
40
40
  "zod": "^4.4.3",
41
- "@webhooks-cc/sdk": "1.8.0"
41
+ "@webhooks-cc/sdk": "1.9.1"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/node": "^25.9.1",
44
+ "@types/node": "^26.2.0",
45
45
  "tsup": "^8.5.1",
46
46
  "typescript": "^6.0.3",
47
- "vitest": "^4.1.7"
47
+ "vitest": "^4.1.10"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsup",