@webhooks-cc/mcp 1.23.0 → 2.0.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
@@ -6,12 +6,14 @@ The easiest way in is the [remote server](#remote-server) at `https://webhooks.c
6
6
 
7
7
  ## Install
8
8
 
9
- No API key is needed. Without one, the server starts with the full tools for the account a human connected the agent to before, or else in the keyless [agent sandbox](#without-an-api-key-the-agent-sandbox). It reads:
9
+ No API key is needed. Without one, the server starts with the tools for the account a human connected the agent to before, or else in the keyless [agent sandbox](#without-an-api-key-the-agent-sandbox). It reads:
10
10
 
11
11
  - `WHK_API_KEY` (optional) for an API key, which always wins over a saved connection
12
12
  - `WHK_AGENT_FILE` for where the sandbox and the connection are saved (default `~/.config/whk/agent.json`, see [the agent credential file](#the-agent-credential-file))
13
13
  - `WHK_BASE_URL` for a custom API base URL
14
14
  - `WHK_WEBHOOK_URL` for a custom receiver base URL
15
+ - `WHK_MCP_TOOLS` for which [tool groups](#tool-groups) to list, such as `all` or `core,teams`
16
+ - `WHK_MCP_READ_ONLY` set to `1` to list only the tools that change nothing
15
17
 
16
18
  ### Claude Code plugin
17
19
 
@@ -34,7 +36,7 @@ For other agents, `npx skills add kroqdotdev/webhooks-cc` installs the same skil
34
36
  - **claude.ai and Claude Desktop**: Settings, Connectors, add a custom connector with the URL `https://webhooks.cc/mcp`
35
37
  - **ChatGPT**: add it as a custom connector (developer mode)
36
38
 
37
- A client that can send headers may use an API key instead: `Authorization: Bearer whcc_...`. The remote server has 54 tools: `send_to`, `replay_request` and `share_port` 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.
39
+ A client that can send headers may use an API key instead: `Authorization: Bearer whcc_...`. The remote server has 91 tools: `send_to`, `replay_request` and `share_port` 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.
38
40
 
39
41
  ### One-click
40
42
 
@@ -83,7 +85,29 @@ Leave out `env` to start without a key. Get your API key at [webhooks.cc/account
83
85
 
84
86
  ## What it exposes
85
87
 
86
- The server exposes `57` tools, `3` prompts, and `3` resource surfaces with an API key, the same `57` tools and the prompts with a saved connection, and `11` sandbox tools otherwise. The remote server exposes `54` tools.
88
+ With an API key or a saved connection, the server lists the `39` core tools and `enable_tools` by default, and all `94` tools for Claude Code, Codex and ChatGPT (see [Tool groups](#tool-groups)), plus `3` prompts (and, with an API key, `3` resource surfaces). Without either, it lists `11` sandbox tools. The remote server exposes the `36` core tools it can run by default, and `91` with `?tools=all` or for clients that load every group.
89
+
90
+ ### Tool groups
91
+
92
+ The tools come in groups, so that clients with a limit on tools (Cursor stops at about 40 across all servers) get a list they can use:
93
+
94
+ - `core`: endpoints, captured requests and emails, sending test webhooks, signatures, forwarding destinations, deliveries, previews of your local app, usage and approvals
95
+ - `forwarding`: dry runs of a destination, the endpoint's forwarding settings and signing secret (rotating it counts as a change), test deliveries
96
+ - `layouts`: email layouts and named fields, ready-made layouts, and AI setup
97
+ - `extras`: bulk endpoint changes, favourites, request counts and payload schemas
98
+ - `teams`: teams, members, invites, sharing endpoints with a team, team pricing
99
+ - `account`: billing, API keys, connected agents, public share links, the display name
100
+ - `domains`: custom inbound email domains
101
+ - `sheets`: Google Sheets destinations
102
+ - `names`: reserved preview names, their passwords, and the requests visitors made
103
+
104
+ Without `WHK_MCP_TOOLS`, the server lists `core`. A client that loads tools only when the model looks for them, or takes long lists (Claude Code, claude.ai, Codex, ChatGPT), gets every group once it connects, announced with one `notifications/tools/list_changed`. With `WHK_MCP_TOOLS` (`all`, or `core` plus group names separated by commas), the server lists exactly those groups for every client; unknown names are reported on stderr.
105
+
106
+ `enable_tools` loads more groups during a session: pass `groups` (for example `["teams"]`, or `["all"]`). It answers with the tools each group added, and its description lists every group and which are loaded, so an agent that misses a tool knows where it lives. It is there whenever a group is left to load.
107
+
108
+ `WHK_MCP_READ_ONLY=1` lists only the tools that change nothing (their `readOnlyHint` is true). `enable_tools` stays, since it only changes what this session lists, and loads only a group's read-only tools; without an account, `connect_account` and `wait_for_connection` stay too.
109
+
110
+ Every tool carries MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`) and a title.
87
111
 
88
112
  ### Endpoint tools
89
113
 
@@ -171,14 +195,15 @@ Everything the dashboard's Shares page does is here, so an agent never needs it;
171
195
  - `list_provider_templates`
172
196
  - `get_usage` (personal plan plus each subscribed team's pool)
173
197
  - `describe`
198
+ - `enable_tools` (local server only: loads more [tool groups](#tool-groups))
174
199
 
175
200
  ### Without an API key: the agent sandbox
176
201
 
177
- Started without `WHK_API_KEY`, the server starts with the full tools when [the agent credential file](#the-agent-credential-file) holds a live connection to a human's account. Otherwise it registers sandbox tools instead ([auth.md](https://webhooks.cc/auth.md)):
202
+ Started without `WHK_API_KEY`, the server starts with the account's tools when [the agent credential file](#the-agent-credential-file) holds a live connection to a human's account. Otherwise it registers sandbox tools instead ([auth.md](https://webhooks.cc/auth.md)):
178
203
 
179
204
  - `create_endpoint`, `list_endpoints`, `get_endpoint`, `delete_endpoint`, `list_requests`, `get_request`, `wait_for_request`, `generate_payload_schema`: the same names and arguments as the full tools, in a sandbox of up to 3 endpoints, 25 captured requests each and 100 in all, for 24 hours. The first `create_endpoint` registers it (a few seconds of proof of work).
180
205
  - `connect_account`: returns a link and a 6-digit code for a human to connect the agent to their account. Pass the email they sign in to webhooks.cc with.
181
- - `wait_for_connection`: waits for the human, then replaces the sandbox tools with the full tools for that account (`notifications/tools/list_changed`) and saves the connection.
206
+ - `wait_for_connection`: waits for the human, then replaces the sandbox tools with the tools for that account, in the same [groups](#tool-groups) (`notifications/tools/list_changed`) and saves the connection.
182
207
  - `about_sandbox`: the limits and how to connect, without a network call.
183
208
 
184
209
  The human approves the agent once: later sessions start connected, for 90 days. When they disconnect the agent under Account, Connected agents, the sandbox tools come back. A sandbox made in an earlier session cannot move into the account, because only the process that registered holds the claim token; `connect_account` then connects through a new registration and says so, and the old endpoints stay in the sandbox until they expire.
@@ -257,26 +282,28 @@ Use `list_provider_templates` to inspect templates, default events, signature he
257
282
  Typical agent flows:
258
283
 
259
284
  - Create an ephemeral endpoint, send a provider-signed webhook, and wait for capture
260
- - Search retained requests across endpoints with full-text filters
285
+ - Search retained requests across endpoints by substring, continuing with the cursor through long histories
261
286
  - Compare two webhook attempts and extract only the JSON fields you care about
262
287
  - Verify a captured signature against a known secret
263
288
  - Run `test_webhook_flow` to create, send, capture, verify, replay, and clean up in one tool call
264
289
 
265
290
  ## Programmatic use
266
291
 
267
- The package also exports `createServer()`, `registerTools()`, `registerSandboxTools()`, `registerPrompts()`, and `registerResources()` if you want to embed the server yourself. `createServer()` without `apiKey` takes `credentialsFile` (a path, or `false` to keep the sandbox and the connection in memory). `registerTools(server, client, { remote: true })` applies the remote server's restrictions; it is also exported from `@webhooks-cc/mcp/tools`.
292
+ The package also exports `createServer()`, `registerTools()`, `registerSandboxTools()`, `registerPrompts()`, and `registerResources()` if you want to embed the server yourself. `createServer()` takes `tools` and `readOnly` (default `WHK_MCP_TOOLS` and `WHK_MCP_READ_ONLY`), and without `apiKey` also `credentialsFile` (a path, or `false` to keep the sandbox and the connection in memory). `registerTools(target, client, { remote, groups, readOnly })` registers the tools on anything with a `tool()` method (`asToolServer(mcpServer)` adapts an `McpServer` from `@modelcontextprotocol/server`); `remote: true` applies the remote server's restrictions. It is also exported from `@webhooks-cc/mcp/tools`.
268
293
 
269
294
  ```ts
270
295
  import { createServer } from "@webhooks-cc/mcp";
271
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
272
-
273
- const server = createServer({
274
- apiKey: process.env.WHK_API_KEY!,
275
- baseUrl: process.env.WHK_BASE_URL,
276
- webhookUrl: process.env.WHK_WEBHOOK_URL,
277
- });
278
-
279
- await server.connect(new StdioServerTransport());
296
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
297
+
298
+ // One server per connection; serves 2026-07-28 clients and those that open with initialize.
299
+ serveStdio(() =>
300
+ createServer({
301
+ apiKey: process.env.WHK_API_KEY!,
302
+ baseUrl: process.env.WHK_BASE_URL,
303
+ webhookUrl: process.env.WHK_WEBHOOK_URL,
304
+ tools: "core,teams",
305
+ })
306
+ );
280
307
  ```
281
308
 
282
309
  ## Example conversation