@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 +24 -2
- package/dist/bin/mcp.js +76 -7
- package/dist/index.js +76 -7
- package/dist/index.mjs +76 -7
- package/package.json +5 -5
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 `
|
|
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
|
|
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
|
|
566
|
-
return jsonContent(
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
588
|
-
return jsonContent(
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
582
|
-
return jsonContent(
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
41
|
-
"@webhooks-cc/sdk": "1.
|
|
40
|
+
"zod": "^4.6.5",
|
|
41
|
+
"@webhooks-cc/sdk": "1.11.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@types/node": "^26.
|
|
44
|
+
"@types/node": "^26.6.3",
|
|
45
45
|
"tsup": "^8.5.1",
|
|
46
46
|
"typescript": "^6.0.3",
|
|
47
|
-
"vitest": "^
|
|
47
|
+
"vitest": "^5.0.2"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsup",
|