@webhooks-cc/mcp 1.7.0 → 1.9.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
@@ -58,7 +58,7 @@ Get your API key at [webhooks.cc/account](https://webhooks.cc/account).
58
58
 
59
59
  ## What it exposes
60
60
 
61
- The server exposes `25` tools, `3` prompts, and `3` resource surfaces.
61
+ The server exposes `35` tools, `3` prompts, and `3` resource surfaces.
62
62
 
63
63
  ### Endpoint tools
64
64
 
@@ -91,12 +91,32 @@ The server exposes `25` tools, `3` prompts, and `3` resource surfaces.
91
91
  - `preview_webhook`
92
92
  - `test_webhook_flow`
93
93
 
94
+ ### Team tools
95
+
96
+ - `list_teams`
97
+ - `list_team_members`
98
+ - `share_endpoint`
99
+ - `unshare_endpoint`
100
+
101
+ Endpoints shared with you already appear in `list_endpoints` (with `fromTeam`) and work with every request tool except `clear_requests`, which stays with the owner. Invites are not exposed: accepting one claims a paid seat.
102
+
94
103
  ### Discovery and account tools
95
104
 
96
105
  - `list_provider_templates`
97
- - `get_usage`
106
+ - `get_usage` (personal plan plus each subscribed team's pool)
98
107
  - `describe`
99
108
 
109
+ ### Agent registration tools
110
+
111
+ Registered on every server, with or without an API key, so an agent that has no credential yet can obtain one (auth.md):
112
+
113
+ - `how_to_register`
114
+ - `register_agent`
115
+ - `check_claim`
116
+ - `register_agent_with_email`
117
+ - `verify_agent_otp`
118
+ - `register_agent_with_idjag`
119
+
100
120
  ## Prompts
101
121
 
102
122
  The server exposes MCP prompts for common workflows:
@@ -153,6 +173,8 @@ Provider template and signing support includes:
153
173
  - `adyen`
154
174
  - `paypal`
155
175
  - `plaid`
176
+ - `resend`
177
+ - `workos`
156
178
 
157
179
  Signature verification also supports:
158
180
 
package/dist/bin/mcp.js CHANGED
@@ -559,11 +559,62 @@ function registerTools(server, client) {
559
559
  );
560
560
  server.tool(
561
561
  "list_endpoints",
562
- "List all webhook endpoints for the authenticated user.",
562
+ "List webhook endpoints: those you own (with sharedWith) and those shared with you through teams (with fromTeam). Optionally keep only one team's endpoints.",
563
+ {
564
+ team: import_zod2.z.string().min(1).optional().describe(
565
+ "Team id or name (case-insensitive). Keeps endpoints shared with you from that team and endpoints you own that are shared with it."
566
+ )
567
+ },
568
+ withErrorHandling(async ({ team }) => {
569
+ const endpoints = await client.endpoints.list({ team });
570
+ return jsonContent(endpoints);
571
+ })
572
+ );
573
+ server.tool(
574
+ "list_teams",
575
+ "List the teams you own or belong to, with role, seats, pooled request usage (requestsUsed/requestLimit), period end, and whether the team is suspended for lack of a subscription.",
563
576
  {},
564
577
  withErrorHandling(async () => {
565
- const endpoints = await client.endpoints.list();
566
- return jsonContent(endpoints);
578
+ const teams = await client.teams.list();
579
+ return jsonContent(
580
+ teams.map((team) => ({
581
+ ...team,
582
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
583
+ }))
584
+ );
585
+ })
586
+ );
587
+ server.tool(
588
+ "list_team_members",
589
+ "List a team's members and pending invites. Any member of the team may call this.",
590
+ { teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)") },
591
+ withErrorHandling(async ({ teamId }) => {
592
+ const result = await client.teams.members(teamId);
593
+ return jsonContent(result);
594
+ })
595
+ );
596
+ server.tool(
597
+ "share_endpoint",
598
+ "Share an endpoint you own with a team so its members can inspect, stream, and edit it. The team needs an active subscription; the endpoint's requests then bill the team's pooled quota.",
599
+ {
600
+ slug: import_zod2.z.string().describe("Slug of an endpoint you own"),
601
+ teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)")
602
+ },
603
+ withErrorHandling(async ({ slug, teamId }) => {
604
+ await client.teams.share(teamId, slug);
605
+ return jsonContent({ shared: true, slug, teamId });
606
+ })
607
+ );
608
+ server.tool(
609
+ "unshare_endpoint",
610
+ "Stop sharing an endpoint you own with a team. Works even when the team is suspended.",
611
+ {
612
+ slug: import_zod2.z.string().describe("Slug of an endpoint you own"),
613
+ teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)")
614
+ },
615
+ withErrorHandling(async ({ slug, teamId }) => {
616
+ await client.teams.unshare(teamId, slug);
617
+ return jsonContent({ shared: false, slug, teamId });
567
618
  })
568
619
  );
569
620
  server.tool(
@@ -1012,13 +1063,31 @@ function registerTools(server, client) {
1012
1063
  );
1013
1064
  server.tool(
1014
1065
  "get_usage",
1015
- "Check current request usage, remaining quota, plan, and period end.",
1066
+ "Check current request usage, remaining quota, plan, and period end, plus the pooled quota of every subscribed team you belong to.",
1016
1067
  {},
1017
1068
  withErrorHandling(async () => {
1018
- const usage = await client.usage();
1069
+ const [usageResult, teamsResult] = await Promise.allSettled([
1070
+ client.usage(),
1071
+ client.teams.list()
1072
+ ]);
1073
+ if (usageResult.status === "rejected") throw usageResult.reason;
1074
+ const usage = usageResult.value;
1075
+ const teams = teamsResult.status === "fulfilled" ? teamsResult.value : [];
1076
+ const teamsError = teamsResult.status === "rejected" ? teamsResult.reason instanceof Error ? teamsResult.reason.message : String(teamsResult.reason) : void 0;
1019
1077
  return jsonContent({
1020
1078
  ...usage,
1021
- periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null
1079
+ periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null,
1080
+ ...teamsError ? { teamsError } : {},
1081
+ teams: teams.filter((team) => !team.suspended).map((team) => ({
1082
+ id: team.id,
1083
+ name: team.name,
1084
+ role: team.role,
1085
+ seats: team.seats,
1086
+ used: team.requestsUsed,
1087
+ limit: team.requestLimit,
1088
+ remaining: Math.max(0, team.requestLimit - team.requestsUsed),
1089
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
1090
+ }))
1022
1091
  });
1023
1092
  })
1024
1093
  );
@@ -1219,7 +1288,7 @@ function registerAgentRegistrationTools(server) {
1219
1288
  }
1220
1289
 
1221
1290
  // src/index.ts
1222
- var VERSION = true ? "1.7.0" : "0.0.0-dev";
1291
+ var VERSION = true ? "1.9.0" : "0.0.0-dev";
1223
1292
  function createServer(options = {}) {
1224
1293
  const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
1225
1294
  const server = new import_mcp2.McpServer({
package/dist/index.js CHANGED
@@ -581,11 +581,62 @@ function registerTools(server, client) {
581
581
  );
582
582
  server.tool(
583
583
  "list_endpoints",
584
- "List all webhook endpoints for the authenticated user.",
584
+ "List webhook endpoints: those you own (with sharedWith) and those shared with you through teams (with fromTeam). Optionally keep only one team's endpoints.",
585
+ {
586
+ team: import_zod2.z.string().min(1).optional().describe(
587
+ "Team id or name (case-insensitive). Keeps endpoints shared with you from that team and endpoints you own that are shared with it."
588
+ )
589
+ },
590
+ withErrorHandling(async ({ team }) => {
591
+ const endpoints = await client.endpoints.list({ team });
592
+ return jsonContent(endpoints);
593
+ })
594
+ );
595
+ server.tool(
596
+ "list_teams",
597
+ "List the teams you own or belong to, with role, seats, pooled request usage (requestsUsed/requestLimit), period end, and whether the team is suspended for lack of a subscription.",
585
598
  {},
586
599
  withErrorHandling(async () => {
587
- const endpoints = await client.endpoints.list();
588
- return jsonContent(endpoints);
600
+ const teams = await client.teams.list();
601
+ return jsonContent(
602
+ teams.map((team) => ({
603
+ ...team,
604
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
605
+ }))
606
+ );
607
+ })
608
+ );
609
+ server.tool(
610
+ "list_team_members",
611
+ "List a team's members and pending invites. Any member of the team may call this.",
612
+ { teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)") },
613
+ withErrorHandling(async ({ teamId }) => {
614
+ const result = await client.teams.members(teamId);
615
+ return jsonContent(result);
616
+ })
617
+ );
618
+ server.tool(
619
+ "share_endpoint",
620
+ "Share an endpoint you own with a team so its members can inspect, stream, and edit it. The team needs an active subscription; the endpoint's requests then bill the team's pooled quota.",
621
+ {
622
+ slug: import_zod2.z.string().describe("Slug of an endpoint you own"),
623
+ teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)")
624
+ },
625
+ withErrorHandling(async ({ slug, teamId }) => {
626
+ await client.teams.share(teamId, slug);
627
+ return jsonContent({ shared: true, slug, teamId });
628
+ })
629
+ );
630
+ server.tool(
631
+ "unshare_endpoint",
632
+ "Stop sharing an endpoint you own with a team. Works even when the team is suspended.",
633
+ {
634
+ slug: import_zod2.z.string().describe("Slug of an endpoint you own"),
635
+ teamId: import_zod2.z.string().min(1).describe("Team id (from list_teams)")
636
+ },
637
+ withErrorHandling(async ({ slug, teamId }) => {
638
+ await client.teams.unshare(teamId, slug);
639
+ return jsonContent({ shared: false, slug, teamId });
589
640
  })
590
641
  );
591
642
  server.tool(
@@ -1034,13 +1085,31 @@ function registerTools(server, client) {
1034
1085
  );
1035
1086
  server.tool(
1036
1087
  "get_usage",
1037
- "Check current request usage, remaining quota, plan, and period end.",
1088
+ "Check current request usage, remaining quota, plan, and period end, plus the pooled quota of every subscribed team you belong to.",
1038
1089
  {},
1039
1090
  withErrorHandling(async () => {
1040
- const usage = await client.usage();
1091
+ const [usageResult, teamsResult] = await Promise.allSettled([
1092
+ client.usage(),
1093
+ client.teams.list()
1094
+ ]);
1095
+ if (usageResult.status === "rejected") throw usageResult.reason;
1096
+ const usage = usageResult.value;
1097
+ const teams = teamsResult.status === "fulfilled" ? teamsResult.value : [];
1098
+ const teamsError = teamsResult.status === "rejected" ? teamsResult.reason instanceof Error ? teamsResult.reason.message : String(teamsResult.reason) : void 0;
1041
1099
  return jsonContent({
1042
1100
  ...usage,
1043
- periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null
1101
+ periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null,
1102
+ ...teamsError ? { teamsError } : {},
1103
+ teams: teams.filter((team) => !team.suspended).map((team) => ({
1104
+ id: team.id,
1105
+ name: team.name,
1106
+ role: team.role,
1107
+ seats: team.seats,
1108
+ used: team.requestsUsed,
1109
+ limit: team.requestLimit,
1110
+ remaining: Math.max(0, team.requestLimit - team.requestsUsed),
1111
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
1112
+ }))
1044
1113
  });
1045
1114
  })
1046
1115
  );
@@ -1241,7 +1310,7 @@ function registerAgentRegistrationTools(server) {
1241
1310
  }
1242
1311
 
1243
1312
  // src/index.ts
1244
- var VERSION = true ? "1.7.0" : "0.0.0-dev";
1313
+ var VERSION = true ? "1.9.0" : "0.0.0-dev";
1245
1314
  function createServer(options = {}) {
1246
1315
  const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
1247
1316
  const server = new import_mcp2.McpServer({
package/dist/index.mjs CHANGED
@@ -575,11 +575,62 @@ function registerTools(server, client) {
575
575
  );
576
576
  server.tool(
577
577
  "list_endpoints",
578
- "List all webhook endpoints for the authenticated user.",
578
+ "List webhook endpoints: those you own (with sharedWith) and those shared with you through teams (with fromTeam). Optionally keep only one team's endpoints.",
579
+ {
580
+ team: z2.string().min(1).optional().describe(
581
+ "Team id or name (case-insensitive). Keeps endpoints shared with you from that team and endpoints you own that are shared with it."
582
+ )
583
+ },
584
+ withErrorHandling(async ({ team }) => {
585
+ const endpoints = await client.endpoints.list({ team });
586
+ return jsonContent(endpoints);
587
+ })
588
+ );
589
+ server.tool(
590
+ "list_teams",
591
+ "List the teams you own or belong to, with role, seats, pooled request usage (requestsUsed/requestLimit), period end, and whether the team is suspended for lack of a subscription.",
579
592
  {},
580
593
  withErrorHandling(async () => {
581
- const endpoints = await client.endpoints.list();
582
- return jsonContent(endpoints);
594
+ const teams = await client.teams.list();
595
+ return jsonContent(
596
+ teams.map((team) => ({
597
+ ...team,
598
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
599
+ }))
600
+ );
601
+ })
602
+ );
603
+ server.tool(
604
+ "list_team_members",
605
+ "List a team's members and pending invites. Any member of the team may call this.",
606
+ { teamId: z2.string().min(1).describe("Team id (from list_teams)") },
607
+ withErrorHandling(async ({ teamId }) => {
608
+ const result = await client.teams.members(teamId);
609
+ return jsonContent(result);
610
+ })
611
+ );
612
+ server.tool(
613
+ "share_endpoint",
614
+ "Share an endpoint you own with a team so its members can inspect, stream, and edit it. The team needs an active subscription; the endpoint's requests then bill the team's pooled quota.",
615
+ {
616
+ slug: z2.string().describe("Slug of an endpoint you own"),
617
+ teamId: z2.string().min(1).describe("Team id (from list_teams)")
618
+ },
619
+ withErrorHandling(async ({ slug, teamId }) => {
620
+ await client.teams.share(teamId, slug);
621
+ return jsonContent({ shared: true, slug, teamId });
622
+ })
623
+ );
624
+ server.tool(
625
+ "unshare_endpoint",
626
+ "Stop sharing an endpoint you own with a team. Works even when the team is suspended.",
627
+ {
628
+ slug: z2.string().describe("Slug of an endpoint you own"),
629
+ teamId: z2.string().min(1).describe("Team id (from list_teams)")
630
+ },
631
+ withErrorHandling(async ({ slug, teamId }) => {
632
+ await client.teams.unshare(teamId, slug);
633
+ return jsonContent({ shared: false, slug, teamId });
583
634
  })
584
635
  );
585
636
  server.tool(
@@ -1028,13 +1079,31 @@ function registerTools(server, client) {
1028
1079
  );
1029
1080
  server.tool(
1030
1081
  "get_usage",
1031
- "Check current request usage, remaining quota, plan, and period end.",
1082
+ "Check current request usage, remaining quota, plan, and period end, plus the pooled quota of every subscribed team you belong to.",
1032
1083
  {},
1033
1084
  withErrorHandling(async () => {
1034
- const usage = await client.usage();
1085
+ const [usageResult, teamsResult] = await Promise.allSettled([
1086
+ client.usage(),
1087
+ client.teams.list()
1088
+ ]);
1089
+ if (usageResult.status === "rejected") throw usageResult.reason;
1090
+ const usage = usageResult.value;
1091
+ const teams = teamsResult.status === "fulfilled" ? teamsResult.value : [];
1092
+ const teamsError = teamsResult.status === "rejected" ? teamsResult.reason instanceof Error ? teamsResult.reason.message : String(teamsResult.reason) : void 0;
1035
1093
  return jsonContent({
1036
1094
  ...usage,
1037
- periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null
1095
+ periodEnd: usage.periodEnd ? new Date(usage.periodEnd).toISOString() : null,
1096
+ ...teamsError ? { teamsError } : {},
1097
+ teams: teams.filter((team) => !team.suspended).map((team) => ({
1098
+ id: team.id,
1099
+ name: team.name,
1100
+ role: team.role,
1101
+ seats: team.seats,
1102
+ used: team.requestsUsed,
1103
+ limit: team.requestLimit,
1104
+ remaining: Math.max(0, team.requestLimit - team.requestsUsed),
1105
+ periodEnd: team.periodEnd ? new Date(team.periodEnd).toISOString() : null
1106
+ }))
1038
1107
  });
1039
1108
  })
1040
1109
  );
@@ -1235,7 +1304,7 @@ function registerAgentRegistrationTools(server) {
1235
1304
  }
1236
1305
 
1237
1306
  // src/index.ts
1238
- var VERSION = true ? "1.7.0" : "0.0.0-dev";
1307
+ var VERSION = true ? "1.9.0" : "0.0.0-dev";
1239
1308
  function createServer(options = {}) {
1240
1309
  const apiKey = options.apiKey ?? process.env.WHK_API_KEY;
1241
1310
  const server = new McpServer2({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webhooks-cc/mcp",
3
- "version": "1.7.0",
3
+ "version": "1.9.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",
@@ -37,14 +37,14 @@
37
37
  "homepage": "https://webhooks.cc",
38
38
  "dependencies": {
39
39
  "@modelcontextprotocol/sdk": "^1.30.0",
40
- "zod": "^4.4.3",
41
- "@webhooks-cc/sdk": "1.9.1"
40
+ "zod": "^4.6.5",
41
+ "@webhooks-cc/sdk": "1.11.0"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/node": "^26.2.0",
44
+ "@types/node": "^26.6.3",
45
45
  "tsup": "^8.5.1",
46
46
  "typescript": "^6.0.3",
47
- "vitest": "^4.1.10"
47
+ "vitest": "^5.0.2"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsup",