@secondlayer/mcp 11.6.1 → 11.6.2

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/dist/bin.js CHANGED
@@ -869,7 +869,16 @@ import { DECODED_EVENT_TYPES as DECODED_EVENT_TYPES2 } from "@secondlayer/shared
869
869
  import {
870
870
  runSubgraphTest
871
871
  } from "@secondlayer/subgraphs/testing";
872
+ import { z as z10 } from "zod";
873
+
874
+ // src/lib/ids.ts
872
875
  import { z as z9 } from "zod";
876
+ var uuidSchema = z9.string().uuid();
877
+ var webhookIdSchema = uuidSchema.describe("Webhook id");
878
+ var subgraphNameSchema = z9.string().min(1).max(63).regex(/^[a-z0-9-]+$/, "lowercase alphanumeric + hyphens only").describe("Subgraph name");
879
+ var tableNameSchema = z9.string().min(1).max(63).regex(/^[a-z_][a-z0-9_]*$/i, "letters, digits and underscores only").describe("Table name");
880
+
881
+ // src/tools/subgraphs.ts
873
882
  function eventTypeFor(filter) {
874
883
  if (filter.type === "contract_deploy")
875
884
  return null;
@@ -895,13 +904,13 @@ function registerSubgraphTools(server, clientProvider = getClient) {
895
904
  const { data } = await clientProvider().subgraphs.list();
896
905
  return jsonResponse(data.map(formatSubgraphSummary));
897
906
  });
898
- defineTool(server, "subgraphs_status", "Get full details of a subgraph including schema, health (incl. health.emptyMapping when processed events wrote 0 rows), and table columns.", { name: z9.string().describe("Subgraph name") }, async ({ name }) => {
907
+ defineTool(server, "subgraphs_status", "Get full details of a subgraph including schema, health (incl. health.emptyMapping when processed events wrote 0 rows), and table columns.", { name: subgraphNameSchema }, async ({ name }) => {
899
908
  const detail = await clientProvider().subgraphs.status(name);
900
909
  return jsonResponse(detail);
901
910
  });
902
911
  defineTool(server, "subgraphs_spec", "Fetch a subgraph's self-describing spec — the tables, columns, filters, and read URLs a consumer needs, without guessing. `agent` (default) returns the compact JSON schema built for tool use, `openapi` the OpenAPI document for the subgraph's read routes, `markdown` human-readable docs. Read it before writing queries against an unfamiliar subgraph.", {
903
- name: z9.string().describe("Subgraph name"),
904
- format: z9.enum(["agent", "openapi", "markdown"]).optional().describe("agent = JSON schema for tool use (default), openapi = OpenAPI JSON, markdown = docs.md")
912
+ name: subgraphNameSchema,
913
+ format: z10.enum(["agent", "openapi", "markdown"]).optional().describe("agent = JSON schema for tool use (default), openapi = OpenAPI JSON, markdown = docs.md")
905
914
  }, async ({ name, format }) => {
906
915
  const client = clientProvider();
907
916
  if (format === "openapi")
@@ -911,15 +920,15 @@ function registerSubgraphTools(server, clientProvider = getClient) {
911
920
  return jsonResponse(await client.subgraphs.schema(name));
912
921
  });
913
922
  defineTool(server, "subgraphs_query", 'Query rows from a subgraph table (max 200 rows), reading the open /v1 surface — { rows, next_cursor, tip } envelope, cursor-paginated (no offset). Filters support operators: "amount.gte": "1000", "sender.neq": "SP...", "name.like": "%token%". Available operators: eq, neq, gt, gte, lt, lte, like. Every page with rows returns next_cursor (null only when empty): pass it back as `cursor` to read the next page. To TAIL new rows (no streaming over MCP), poll with cursor = next_cursor ?? the cursor you sent. Fetch one row by id with {"_id": "<id>"}. The same rows are readable over HTTP at GET /v1/subgraphs/<name>/<table>; hand that URL to third parties.', {
914
- name: z9.string().describe("Subgraph name"),
915
- table: z9.string().describe("Table name"),
916
- filters: z9.record(z9.string(), z9.string()).optional().describe('Column filters — plain values or with operators (e.g. {"amount.gte": "1000", "sender": "SP..."})'),
917
- sort: z9.string().optional().describe("Column to sort by"),
918
- order: z9.enum(["asc", "desc"]).optional().describe("Sort order"),
919
- limit: z9.number().max(200).optional().describe("Max rows (default 50, max 200)"),
920
- cursor: z9.string().optional().describe("Resume from a previous response's nextCursor"),
921
- fields: z9.string().optional().describe('Comma-separated column list to return (e.g. "sender,amount")'),
922
- count: z9.boolean().optional().describe("If true, return row count instead of rows")
923
+ name: subgraphNameSchema,
924
+ table: tableNameSchema,
925
+ filters: z10.record(z10.string(), z10.string()).optional().describe('Column filters — plain values or with operators (e.g. {"amount.gte": "1000", "sender": "SP..."})'),
926
+ sort: z10.string().optional().describe("Column to sort by"),
927
+ order: z10.enum(["asc", "desc"]).optional().describe("Sort order"),
928
+ limit: z10.number().max(200).optional().describe("Max rows (default 50, max 200)"),
929
+ cursor: z10.string().optional().describe("Resume from a previous response's nextCursor"),
930
+ fields: z10.string().optional().describe('Comma-separated column list to return (e.g. "sender,amount")'),
931
+ count: z10.boolean().optional().describe("If true, return row count instead of rows")
923
932
  }, async ({
924
933
  name,
925
934
  table,
@@ -949,15 +958,15 @@ function registerSubgraphTools(server, clientProvider = getClient) {
949
958
  return jsonResponse({ ...capped, nextCursor: next_cursor, tip });
950
959
  });
951
960
  defineTool(server, "subgraphs_reindex", "Reindex a subgraph: drops and rebuilds the whole subgraph from its start block to chain tip. Takes no block range — use subgraphs_backfill to process a specific range. Returns an operationId — check subgraphs_status (health) or the REST operations endpoint to track progress to completion.", {
952
- name: z9.string().describe("Subgraph name")
961
+ name: subgraphNameSchema
953
962
  }, async ({ name }) => {
954
963
  const result = await clientProvider().subgraphs.reindex(name);
955
964
  return jsonResponse(result);
956
965
  });
957
966
  defineTool(server, "subgraphs_backfill", "Backfill a subgraph over a block range. Non-destructive forward fill (does not drop existing data) — unlike subgraphs_reindex, and the only data-fill path for BYO subgraphs (reindex is blocked there). Both blocks required. Returns an operationId — check subgraphs_status (health) or the REST operations endpoint to track progress.", {
958
- name: z9.string().describe("Subgraph name"),
959
- fromBlock: z9.number().int().nonnegative().describe("Start block (inclusive)"),
960
- toBlock: z9.number().int().nonnegative().describe("End block (inclusive)")
967
+ name: subgraphNameSchema,
968
+ fromBlock: z10.number().int().nonnegative().describe("Start block (inclusive)"),
969
+ toBlock: z10.number().int().nonnegative().describe("End block (inclusive)")
961
970
  }, async ({ name, fromBlock, toBlock }) => {
962
971
  const result = await clientProvider().subgraphs.backfill(name, {
963
972
  fromBlock,
@@ -965,15 +974,15 @@ function registerSubgraphTools(server, clientProvider = getClient) {
965
974
  });
966
975
  return jsonResponse(result);
967
976
  });
968
- defineTool(server, "subgraphs_stop", "Cancel an in-flight reindex or backfill operation for a subgraph. Returns the stop request status; check subgraphs_status (health) or the REST operations endpoint to confirm it reaches a terminal state.", { name: z9.string().describe("Subgraph name") }, async ({ name }) => {
977
+ defineTool(server, "subgraphs_stop", "Cancel an in-flight reindex or backfill operation for a subgraph. Returns the stop request status; check subgraphs_status (health) or the REST operations endpoint to confirm it reaches a terminal state.", { name: subgraphNameSchema }, async ({ name }) => {
969
978
  const result = await clientProvider().subgraphs.stop(name);
970
979
  return jsonResponse(result);
971
980
  });
972
981
  defineTool(server, "subgraphs_gaps", "List indexing gaps (missing block ranges) for a subgraph. Each gap reports start/end/size, reason, and detected/resolved timestamps. Feed an unresolved gap's range into subgraphs_backfill to fill it. Defaults to unresolved gaps.", {
973
- name: z9.string().describe("Subgraph name"),
974
- limit: z9.number().int().positive().optional().describe("Max gaps to return"),
975
- offset: z9.number().int().nonnegative().optional().describe("Pagination offset"),
976
- resolved: z9.boolean().optional().describe("Filter by resolved state (omit for unresolved only)")
982
+ name: subgraphNameSchema,
983
+ limit: z10.number().int().positive().optional().describe("Max gaps to return"),
984
+ offset: z10.number().int().nonnegative().optional().describe("Pagination offset"),
985
+ resolved: z10.boolean().optional().describe("Filter by resolved state (omit for unresolved only)")
977
986
  }, async ({ name, limit, offset, resolved }) => {
978
987
  const result = await clientProvider().subgraphs.gaps(name, {
979
988
  limit,
@@ -983,20 +992,20 @@ function registerSubgraphTools(server, clientProvider = getClient) {
983
992
  return jsonResponse(result);
984
993
  });
985
994
  defineTool(server, "subgraphs_operations", "Operation history for a subgraph (deploy/reindex/backfill/stop), newest first — status, block range, progress, and error. THIS IS THE VERIFY CALL: after subgraphs_deploy, subgraphs_reindex, subgraphs_backfill, or subgraphs_stop, poll it with the returned operationId until `status` is terminal (completed/failed/cancelled) before reporting success. Omit operationId for the recent history.", {
986
- name: z9.string().describe("Subgraph name"),
987
- operationId: z9.string().optional().describe("Fetch one operation by id (the operationId returned by reindex/backfill/stop); omit for recent history")
995
+ name: subgraphNameSchema,
996
+ operationId: z10.string().optional().describe("Fetch one operation by id (the operationId returned by reindex/backfill/stop); omit for recent history")
988
997
  }, async ({ name, operationId }) => {
989
998
  const client = clientProvider();
990
999
  return jsonResponse(operationId ? await client.subgraphs.getOperation(name, operationId) : await client.subgraphs.operations(name));
991
1000
  });
992
- defineTool(server, "subgraphs_delete", "Delete a subgraph permanently.", { name: z9.string().describe("Subgraph name") }, async ({ name }) => {
1001
+ defineTool(server, "subgraphs_delete", "Delete a subgraph permanently.", { name: subgraphNameSchema }, async ({ name }) => {
993
1002
  const result = await clientProvider().subgraphs.delete(name);
994
1003
  return textResponse(result.message);
995
1004
  });
996
1005
  defineTool(server, "subgraphs_deploy", "Deploy a subgraph from TypeScript code. Pass the full defineSubgraph() source — it will be bundled, validated, and deployed. Optional startBlock overrides the source definition for this deploy. dryRun validates schema/DDL only and does not run handlers — call subgraphs_test first and deploy only when it returns ok: true with written >= 1. Call subgraphs_reindex separately if you need a forced reindex.", {
997
- code: z9.string().describe("TypeScript source code containing a defineSubgraph() call"),
998
- startBlock: z9.number().int().nonnegative().optional().describe("Override the definition startBlock for this deploy"),
999
- dryRun: z9.boolean().optional().describe("Validate schema/DDL only — does not run handlers. Use subgraphs_test to prove a mapping writes rows.")
1006
+ code: z10.string().describe("TypeScript source code containing a defineSubgraph() call"),
1007
+ startBlock: z10.number().int().nonnegative().optional().describe("Override the definition startBlock for this deploy"),
1008
+ dryRun: z10.boolean().optional().describe("Validate schema/DDL only — does not run handlers. Use subgraphs_test to prove a mapping writes rows.")
1000
1009
  }, async ({ code, startBlock, dryRun }) => {
1001
1010
  const bundled = await bundleSubgraphCode(code);
1002
1011
  const result = await clientProvider().subgraphs.deploy({
@@ -1012,10 +1021,10 @@ function registerSubgraphTools(server, clientProvider = getClient) {
1012
1021
  return jsonResponse(result);
1013
1022
  });
1014
1023
  defineTool(server, "subgraphs_test", "Prove a subgraph mapping writes rows against Index data before deploy. Pass full defineSubgraph() source plus a height range. Returns ok/written/tables; EMPTY_MAPPING means events matched but 0 rows were written — read hint for observed event.data keys and do not invent fields. subgraphs_deploy dryRun is DDL only; do not deploy until ok: true with written >= 1.", {
1015
- code: z9.string().describe("TypeScript source containing a defineSubgraph() call"),
1016
- fromHeight: z9.number().int().nonnegative().describe("Start block height (inclusive)"),
1017
- toHeight: z9.number().int().nonnegative().optional().describe("End block height (inclusive); default fromHeight+100"),
1018
- limit: z9.number().int().positive().max(200).optional().describe("Max Index rows per source (default 50, max 200)")
1024
+ code: z10.string().describe("TypeScript source containing a defineSubgraph() call"),
1025
+ fromHeight: z10.number().int().nonnegative().describe("Start block height (inclusive)"),
1026
+ toHeight: z10.number().int().nonnegative().optional().describe("End block height (inclusive); default fromHeight+100"),
1027
+ limit: z10.number().int().positive().max(200).optional().describe("Max Index rows per source (default 50, max 200)")
1019
1028
  }, async ({ code, fromHeight, toHeight, limit }) => {
1020
1029
  const bundled = await bundleSubgraphCode(code);
1021
1030
  const def = await loadBundledDefinition(bundled.handlerCode);
@@ -1096,36 +1105,36 @@ function registerSubgraphTools(server, clientProvider = getClient) {
1096
1105
 
1097
1106
  // src/tools/webhooks.ts
1098
1107
  import { CHAIN_TRIGGER_TYPES } from "@secondlayer/shared";
1099
- import { z as z10 } from "zod";
1108
+ import { z as z11 } from "zod";
1100
1109
  function registerWebhookTools(server, clientProvider = getClient) {
1101
1110
  defineTool(server, "webhooks_list", "List all webhooks for the current account. Returns summary fields (no secrets).", {}, async () => {
1102
1111
  const { data } = await clientProvider().webhooks.list();
1103
1112
  return jsonResponse(data);
1104
1113
  });
1105
- defineTool(server, "webhooks_get", "Get full detail for a webhook (triggers, auth, retry config, circuit state).", { id: z10.string().describe("Webhook id") }, async ({ id }) => {
1114
+ defineTool(server, "webhooks_get", "Get full detail for a webhook (triggers, auth, retry config, circuit state).", { id: webhookIdSchema }, async ({ id }) => {
1106
1115
  const detail = await clientProvider().webhooks.get(id);
1107
1116
  return jsonResponse(detail);
1108
1117
  });
1109
1118
  defineTool(server, "webhooks_create", "Create a webhook that fires on raw chain events (set triggers). Returns `signingSecret` ONCE — forward it to the user so they can wire it into their receiver.", {
1110
- name: z10.string().describe("Human-readable name, unique per account"),
1111
- triggers: z10.array(z10.object({
1112
- type: z10.enum(CHAIN_TRIGGER_TYPES),
1113
- contractId: z10.string().optional(),
1114
- functionName: z10.string().optional(),
1115
- caller: z10.string().optional(),
1116
- sender: z10.string().optional(),
1117
- recipient: z10.string().optional(),
1118
- assetIdentifier: z10.string().optional(),
1119
- deployer: z10.string().optional(),
1120
- contractName: z10.string().optional(),
1121
- topic: z10.string().optional(),
1122
- lockedAddress: z10.string().optional(),
1123
- trait: z10.string().optional(),
1124
- minAmount: z10.union([z10.string(), z10.number()]).optional(),
1125
- maxAmount: z10.union([z10.string(), z10.number()]).optional()
1119
+ name: z11.string().describe("Human-readable name, unique per account"),
1120
+ triggers: z11.array(z11.object({
1121
+ type: z11.enum(CHAIN_TRIGGER_TYPES),
1122
+ contractId: z11.string().optional(),
1123
+ functionName: z11.string().optional(),
1124
+ caller: z11.string().optional(),
1125
+ sender: z11.string().optional(),
1126
+ recipient: z11.string().optional(),
1127
+ assetIdentifier: z11.string().optional(),
1128
+ deployer: z11.string().optional(),
1129
+ contractName: z11.string().optional(),
1130
+ topic: z11.string().optional(),
1131
+ lockedAddress: z11.string().optional(),
1132
+ trait: z11.string().optional(),
1133
+ minAmount: z11.union([z11.string(), z11.number()]).optional(),
1134
+ maxAmount: z11.union([z11.string(), z11.number()]).optional()
1126
1135
  })).describe("Chain triggers. Each targets a raw chain event/tx; string fields accept `*` wildcards, `trait` scopes to a SIP/trait. Per-type accepted fields: see the secondlayer://chain-triggers resource. Forward-looking: starts at chain tip, no backfill."),
1127
- url: z10.string().describe("Webhook URL"),
1128
- format: z10.enum([
1136
+ url: z11.string().describe("Webhook URL"),
1137
+ format: z11.enum([
1129
1138
  "standard-webhooks",
1130
1139
  "inngest",
1131
1140
  "trigger",
@@ -1133,17 +1142,17 @@ function registerWebhookTools(server, clientProvider = getClient) {
1133
1142
  "cloudevents",
1134
1143
  "raw"
1135
1144
  ]).optional().describe("Wire format (default standard-webhooks)"),
1136
- authConfig: z10.record(z10.string(), z10.unknown()).optional().describe('Receiver auth sent with each delivery, e.g. {"type": "bearer", "token": "..."}')
1145
+ authConfig: z11.record(z11.string(), z11.unknown()).optional().describe('Receiver auth sent with each delivery, e.g. {"type": "bearer", "token": "..."}')
1137
1146
  }, async (input) => {
1138
1147
  const res = await clientProvider().webhooks.create(input);
1139
1148
  return jsonResponse(res);
1140
1149
  });
1141
1150
  defineTool(server, "webhooks_update", "Patch a webhook (name, url, authConfig, format, retry, timeout, concurrency).", {
1142
- id: z10.string(),
1143
- name: z10.string().optional().describe("Rename the webhook"),
1144
- url: z10.string().optional(),
1145
- authConfig: z10.record(z10.string(), z10.unknown()).optional().describe("Receiver auth sent with each delivery (bearer/etc.)"),
1146
- format: z10.enum([
1151
+ id: webhookIdSchema,
1152
+ name: z11.string().optional().describe("Rename the webhook"),
1153
+ url: z11.string().optional(),
1154
+ authConfig: z11.record(z11.string(), z11.unknown()).optional().describe("Receiver auth sent with each delivery (bearer/etc.)"),
1155
+ format: z11.enum([
1147
1156
  "standard-webhooks",
1148
1157
  "inngest",
1149
1158
  "trigger",
@@ -1151,35 +1160,35 @@ function registerWebhookTools(server, clientProvider = getClient) {
1151
1160
  "cloudevents",
1152
1161
  "raw"
1153
1162
  ]).optional(),
1154
- maxRetries: z10.number().int().min(0).optional(),
1155
- timeoutMs: z10.number().int().min(100).optional(),
1156
- concurrency: z10.number().int().min(1).optional()
1163
+ maxRetries: z11.number().int().min(0).optional(),
1164
+ timeoutMs: z11.number().int().min(100).optional(),
1165
+ concurrency: z11.number().int().min(1).optional()
1157
1166
  }, async ({ id, ...patch }) => {
1158
1167
  const res = await clientProvider().webhooks.update(id, patch);
1159
1168
  return jsonResponse(res);
1160
1169
  });
1161
- defineTool(server, "webhooks_delete", "Delete a webhook. Pending outbox rows are cascade-deleted.", { id: z10.string() }, async ({ id }) => {
1170
+ defineTool(server, "webhooks_delete", "Delete a webhook. Pending outbox rows are cascade-deleted.", { id: webhookIdSchema }, async ({ id }) => {
1162
1171
  const res = await clientProvider().webhooks.delete(id);
1163
1172
  return jsonResponse(res);
1164
1173
  });
1165
- defineTool(server, "webhooks_test", "Send a one-off test webhook to a webhook's URL (built for its format, SSRF-guarded). Logged as a delivery row. Returns {ok, statusCode, error, durationMs, deliveryId}.", { id: z10.string().describe("Webhook id") }, async ({ id }) => {
1174
+ defineTool(server, "webhooks_test", "Send a one-off test webhook to a webhook's URL (built for its format, SSRF-guarded). Logged as a delivery row. Returns {ok, statusCode, error, durationMs, deliveryId}.", { id: webhookIdSchema }, async ({ id }) => {
1166
1175
  const res = await clientProvider().webhooks.test(id);
1167
1176
  return jsonResponse(res);
1168
1177
  });
1169
- defineTool(server, "webhooks_pause", "Pause a webhook: stops delivery attempts and stops queueing new ones. Nothing is deleted — resume picks the webhook back up from the tip. Verify with webhooks_get (status).", { id: z10.string().describe("Webhook id") }, async ({ id }) => jsonResponse(await clientProvider().webhooks.pause(id)));
1170
- defineTool(server, "webhooks_resume", "Resume a paused webhook (also clears a tripped circuit breaker). Deliveries restart from the current tip — use webhooks_replay for the blocks missed while paused. Verify with webhooks_get (status).", { id: z10.string().describe("Webhook id") }, async ({ id }) => jsonResponse(await clientProvider().webhooks.resume(id)));
1171
- defineTool(server, "webhooks_rotate_secret", "Rotate a webhook's signing secret. Returns the NEW `signingSecret` ONCE — forward it to the user; deliveries signed with the old secret stop verifying as soon as this returns, so the receiver must be updated.", { id: z10.string().describe("Webhook id") }, async ({ id }) => jsonResponse(await clientProvider().webhooks.rotateSecret(id)));
1172
- defineTool(server, "webhooks_deliveries", "List recent delivery attempts for a webhook — status code, attempt count, error, duration, timestamps. THIS IS THE VERIFY CALL: after webhooks_create, webhooks_test, or webhooks_replay, read it to confirm the webhook actually landed (and to see the receiver's response when it didn't) instead of trusting the enqueue result.", { id: z10.string().describe("Webhook id") }, async ({ id }) => jsonResponse(await clientProvider().webhooks.deliveries(id)));
1173
- defineTool(server, "webhooks_dead", "List a webhook's dead-letter queue — deliveries that exhausted their retries, with the outbox id, payload, and last error. Diagnose the receiver first (webhooks_get for the URL/auth, webhooks_test for a live probe), then requeue rows with webhooks_requeue.", { id: z10.string().describe("Webhook id") }, async ({ id }) => jsonResponse(await clientProvider().webhooks.dead(id)));
1178
+ defineTool(server, "webhooks_pause", "Pause a webhook: stops delivery attempts and stops queueing new ones. Nothing is deleted — resume picks the webhook back up from the tip. Verify with webhooks_get (status).", { id: webhookIdSchema }, async ({ id }) => jsonResponse(await clientProvider().webhooks.pause(id)));
1179
+ defineTool(server, "webhooks_resume", "Resume a paused webhook (also clears a tripped circuit breaker). Deliveries restart from the current tip — use webhooks_replay for the blocks missed while paused. Verify with webhooks_get (status).", { id: webhookIdSchema }, async ({ id }) => jsonResponse(await clientProvider().webhooks.resume(id)));
1180
+ defineTool(server, "webhooks_rotate_secret", "Rotate a webhook's signing secret. Returns the NEW `signingSecret` ONCE — forward it to the user; deliveries signed with the old secret stop verifying as soon as this returns, so the receiver must be updated.", { id: webhookIdSchema }, async ({ id }) => jsonResponse(await clientProvider().webhooks.rotateSecret(id)));
1181
+ defineTool(server, "webhooks_deliveries", "List recent delivery attempts for a webhook — status code, attempt count, error, duration, timestamps. THIS IS THE VERIFY CALL: after webhooks_create, webhooks_test, or webhooks_replay, read it to confirm the webhook actually landed (and to see the receiver's response when it didn't) instead of trusting the enqueue result.", { id: webhookIdSchema }, async ({ id }) => jsonResponse(await clientProvider().webhooks.deliveries(id)));
1182
+ defineTool(server, "webhooks_dead", "List a webhook's dead-letter queue — deliveries that exhausted their retries, with the outbox id, payload, and last error. Diagnose the receiver first (webhooks_get for the URL/auth, webhooks_test for a live probe), then requeue rows with webhooks_requeue.", { id: webhookIdSchema }, async ({ id }) => jsonResponse(await clientProvider().webhooks.dead(id)));
1174
1183
  defineTool(server, "webhooks_requeue", "Requeue ONE dead-lettered delivery for another attempt, by its outbox id from webhooks_dead. Fix the receiver first — a requeue against a still-broken endpoint just dies again. Verify with webhooks_deliveries.", {
1175
- id: z10.string().describe("Webhook id"),
1176
- outboxId: z10.string().describe("Outbox id of the dead delivery (from webhooks_dead)")
1184
+ id: webhookIdSchema,
1185
+ outboxId: uuidSchema.describe("Outbox id of the dead delivery (from webhooks_dead)")
1177
1186
  }, async ({ id, outboxId }) => jsonResponse(await clientProvider().webhooks.requeue(id, outboxId)));
1178
1187
  defineTool(server, "webhooks_replay", "Replay a block range for a webhook. Replays run at 10% of batch capacity — use sparingly. Pass `force` (a short idempotency suffix) to re-run a range that was already replayed.", {
1179
- id: z10.string(),
1180
- fromBlock: z10.number().int().nonnegative(),
1181
- toBlock: z10.number().int().nonnegative(),
1182
- force: z10.string().optional().describe("Idempotency suffix to force a duplicate replay of the range")
1188
+ id: webhookIdSchema,
1189
+ fromBlock: z11.number().int().nonnegative(),
1190
+ toBlock: z11.number().int().nonnegative(),
1191
+ force: z11.string().optional().describe("Idempotency suffix to force a duplicate replay of the range")
1183
1192
  }, async ({ id, fromBlock, toBlock, force }) => {
1184
1193
  const res = await clientProvider().webhooks.replay(id, {
1185
1194
  fromBlock,
@@ -1309,5 +1318,5 @@ var server = createServer();
1309
1318
  var transport = new StdioServerTransport;
1310
1319
  await server.connect(transport);
1311
1320
 
1312
- //# debugId=150034135E3B5DAA64756E2164756E21
1321
+ //# debugId=AA879F736F365AF664756E2164756E21
1313
1322
  //# sourceMappingURL=bin.js.map