mcp-scraper 0.21.5 → 0.22.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
@@ -88,7 +88,7 @@ Build the branded one-click bundle:
88
88
  npm run build:mcpb
89
89
  ```
90
90
 
91
- The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.21.5`, SHA-256 `ab07d5d0adb37840e434dcb5931927a26274f475c8f216048d59737904d9bf5d`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
91
+ The generated bundle is written to `build/mcpb/mcp-scraper-<version>.mcpb` and copied to `public/downloads/` for the hosted download. The current public bundle is `https://mcpscraper.dev/downloads/mcp-scraper.mcpb` (`0.22.0`, SHA-256 `6c897da09abb3583c4d98d6effddc713f823114af85a929bdd6f3475032d1bed`). Install it by opening or dragging it into Claude Desktop. Claude displays the `MCP Scraper` install card, icon, and API-key configuration field from the bundle manifest.
92
92
 
93
93
  The MCPB install exposes every tool — web-intelligence plus all `browser_*` tools — through the one `mcp-scraper` server.
94
94
 
@@ -29200,7 +29200,7 @@ var PACKAGE_VERSION;
29200
29200
  var init_version = __esm({
29201
29201
  "src/version.ts"() {
29202
29202
  "use strict";
29203
- PACKAGE_VERSION = "0.21.5";
29203
+ PACKAGE_VERSION = "0.22.0";
29204
29204
  }
29205
29205
  });
29206
29206
 
@@ -30927,11 +30927,15 @@ var init_mcp_tool_schemas = __esm({
30927
30927
  connectionId: import_zod34.z.string().min(1).describe("A Google Calendar connectionId from list_service_connections, with actionsEnabled true."),
30928
30928
  calendarId: import_zod34.z.string().min(1).default("primary").describe('Calendar to create the event in. Default "primary".'),
30929
30929
  summary: import_zod34.z.string().min(1).max(500).describe("Event title."),
30930
- description: import_zod34.z.string().max(5e3).optional().describe("Event description."),
30930
+ description: import_zod34.z.string().min(1).max(5e3).describe("Required event context. Include the purpose or agenda supplied by the user and the Zoom join link when one was created."),
30931
30931
  location: import_zod34.z.string().max(500).optional().describe("Event location."),
30932
30932
  startDateTime: import_zod34.z.string().min(1).describe('Start time, ISO 8601, e.g. "2026-07-15T09:00:00-06:00".'),
30933
30933
  endDateTime: import_zod34.z.string().min(1).describe('End time, ISO 8601, e.g. "2026-07-15T10:00:00-06:00".'),
30934
- timeZone: import_zod34.z.string().max(100).optional().describe('IANA timezone, e.g. "America/Denver". Applies to both start and end.')
30934
+ timeZone: import_zod34.z.string().max(100).optional().describe('IANA timezone, e.g. "America/Denver". Applies to both start and end.'),
30935
+ attendees: import_zod34.z.array(import_zod34.z.object({
30936
+ email: import_zod34.z.string().email().describe("Invitee email address."),
30937
+ displayName: import_zod34.z.string().min(1).max(200).optional().describe("Invitee name when known.")
30938
+ }).strict()).max(100).describe("Required attendee list. Include every person the user asked to invite; use an empty array only when no invitee was identified.")
30935
30939
  };
30936
30940
  GoogleCalendarCreateEventOutputSchema = {
30937
30941
  ok: import_zod34.z.boolean(),
@@ -30944,7 +30948,7 @@ var init_mcp_tool_schemas = __esm({
30944
30948
  startDateTime: import_zod34.z.string().min(1).describe('Start time, ISO 8601, e.g. "2026-07-15T09:00:00-06:00".'),
30945
30949
  durationMinutes: import_zod34.z.number().int().min(1).max(1440).default(30).describe("Meeting duration in minutes. Default 30."),
30946
30950
  timezone: import_zod34.z.string().max(100).optional().describe('IANA timezone, e.g. "America/Denver".'),
30947
- agenda: import_zod34.z.string().max(2e3).optional().describe("Meeting description/agenda.")
30951
+ agenda: import_zod34.z.string().min(1).max(2e3).describe("Required meeting description or agenda. Preserve the purpose and context supplied by the user.")
30948
30952
  };
30949
30953
  ZoomCreateMeetingOutputSchema = {
30950
30954
  ok: import_zod34.z.boolean(),
@@ -31653,21 +31657,21 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
31653
31657
  }, async (input) => executor.slackSendMessage(input));
31654
31658
  server.registerTool("gmail_send_message", {
31655
31659
  title: "Send Gmail Message",
31656
- description: "Send an email through a connected, action-enabled Gmail connection. Requires a connectionId from list_service_connections with actionsEnabled true; the person must have explicitly turned actions on for that connection.",
31660
+ description: "Preferred path for sending a simple plain-text email through a connected, action-enabled Gmail connection. Provide only connectionId, to, subject, and body; MCP Scraper constructs the MIME message and base64url encoding server-side. Never construct raw MIME or base64 yourself, and do not use call_service_connection_action for Gmail send-message. Requires a connectionId from list_service_connections with actionsEnabled true.",
31657
31661
  inputSchema: GmailSendMessageInputSchema,
31658
31662
  outputSchema: recordOutputSchema("gmail_send_message", GmailSendMessageOutputSchema),
31659
31663
  annotations: { title: "Send Gmail Message", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
31660
31664
  }, async (input) => executor.gmailSendMessage(input));
31661
31665
  server.registerTool("google_calendar_create_event", {
31662
31666
  title: "Create Calendar Event",
31663
- description: "Create an event on a connected, action-enabled Google Calendar connection. Requires a connectionId from list_service_connections with actionsEnabled true; the person must have explicitly turned actions on for that connection.",
31667
+ description: "Create a complete event on a connected, action-enabled Google Calendar connection. Always preserve the supplied purpose in description, include the Zoom join link when available, and include every explicitly named invitee in attendees. Do not create a bare meeting event. Requires a connectionId from list_service_connections with actionsEnabled true.",
31664
31668
  inputSchema: GoogleCalendarCreateEventInputSchema,
31665
31669
  outputSchema: recordOutputSchema("google_calendar_create_event", GoogleCalendarCreateEventOutputSchema),
31666
31670
  annotations: { title: "Create Calendar Event", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
31667
31671
  }, async (input) => executor.googleCalendarCreateEvent(input));
31668
31672
  server.registerTool("zoom_create_meeting", {
31669
31673
  title: "Create Zoom Meeting",
31670
- description: "Create a meeting on a connected, action-enabled Zoom connection. Requires a connectionId from list_service_connections with actionsEnabled true; the person must have explicitly turned actions on for that connection.",
31674
+ description: "Create a meeting on a connected, action-enabled Zoom connection and preserve the user-supplied purpose in the required agenda. Zoom creates the join link; invitees must then be added through google_calendar_create_event attendees. Requires a connectionId from list_service_connections with actionsEnabled true.",
31671
31675
  inputSchema: ZoomCreateMeetingInputSchema,
31672
31676
  outputSchema: recordOutputSchema("zoom_create_meeting", ZoomCreateMeetingOutputSchema),
31673
31677
  annotations: { title: "Create Zoom Meeting", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
@@ -31716,7 +31720,7 @@ function registerPaaExtractorMcpTools(server, executor, options = {}) {
31716
31720
  }, async (input) => executor.renewConnectedDataDownload(input));
31717
31721
  server.registerTool("call_service_connection_action", {
31718
31722
  title: "Run Connected Service Action",
31719
- description: "Run one explicitly allowlisted write or mutation on a tenant-owned OAuth or remote MCP connection. First call list_service_connections, use a connection with actionsEnabled true, describe the exact actionTools entry to obtain its live schema, and supply only that action's arguments. The server rejects arbitrary action names, inactive or foreign connections, disabled actions, and every adminBlockedTools entry. This can include Google Drive folder creation or file copies, Resend delivery, and GitHub mutations only when those exact actions are live and approved. Sends, deletes, merges, workflow execution, and content changes are high impact.",
31723
+ description: "Run one explicitly allowlisted write or mutation on a tenant-owned OAuth or remote MCP connection. For Gmail send-message, use gmail_send_message instead and never construct raw MIME or base64. For other providers, first call list_service_connections, use a connection with actionsEnabled true, describe the exact actionTools entry to obtain its live schema, and supply only that action's arguments. The server rejects arbitrary action names, inactive or foreign connections, disabled actions, and every adminBlockedTools entry. This can include Google Drive folder creation or file copies, Resend delivery, and GitHub mutations only when those exact actions are live and approved. Sends, deletes, merges, workflow execution, and content changes are high impact.",
31720
31724
  inputSchema: CallServiceConnectionActionInputSchema,
31721
31725
  outputSchema: recordOutputSchema("call_service_connection_action", CallServiceConnectionActionOutputSchema),
31722
31726
  annotations: { title: "Run Connected Service Action", readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true }
@@ -43285,6 +43289,21 @@ function providerConfigKeyFrom(value) {
43285
43289
  const key = value.trim();
43286
43290
  return key && key.length <= 200 ? key : null;
43287
43291
  }
43292
+ function calendarAttendeesFrom(value) {
43293
+ if (!Array.isArray(value) || value.length > 100) return null;
43294
+ const attendees = [];
43295
+ for (const item of value) {
43296
+ if (!item || typeof item !== "object" || Array.isArray(item)) return null;
43297
+ const attendee = item;
43298
+ if (typeof attendee.email !== "string" || !attendee.email.trim()) return null;
43299
+ if (attendee.displayName !== void 0 && typeof attendee.displayName !== "string") return null;
43300
+ attendees.push({
43301
+ email: attendee.email.trim(),
43302
+ ...typeof attendee.displayName === "string" && attendee.displayName.trim() ? { displayName: attendee.displayName.trim() } : {}
43303
+ });
43304
+ }
43305
+ return attendees;
43306
+ }
43288
43307
  function bindingsForSchedule(bindings, scheduleActionId) {
43289
43308
  return bindings.filter((binding) => binding.scheduleActionId === scheduleActionId);
43290
43309
  }
@@ -44130,18 +44149,20 @@ var init_server = __esm({
44130
44149
  const user = c.get("user");
44131
44150
  const body = await c.req.json().catch(() => ({}));
44132
44151
  const connectionId = providerConfigKeyFrom(body.connectionId);
44133
- if (!connectionId || typeof body.summary !== "string" || typeof body.startDateTime !== "string" || typeof body.endDateTime !== "string") {
44134
- return c.json({ ok: false, error: "connectionId, summary, startDateTime, and endDateTime are required." }, 400);
44152
+ const attendees = calendarAttendeesFrom(body.attendees);
44153
+ if (!connectionId || typeof body.summary !== "string" || typeof body.description !== "string" || typeof body.startDateTime !== "string" || typeof body.endDateTime !== "string" || !attendees) {
44154
+ return c.json({ ok: false, error: "connectionId, summary, description, startDateTime, endDateTime, and attendees are required." }, 400);
44135
44155
  }
44136
44156
  const timeZone = typeof body.timeZone === "string" ? body.timeZone : void 0;
44137
44157
  try {
44138
44158
  const result = await callScheduleConnectionAction(user.email, connectionId, {
44139
44159
  calendarId: typeof body.calendarId === "string" ? body.calendarId : "primary",
44140
44160
  summary: body.summary,
44141
- description: typeof body.description === "string" ? body.description : void 0,
44161
+ description: body.description,
44142
44162
  location: typeof body.location === "string" ? body.location : void 0,
44143
44163
  start: { dateTime: body.startDateTime, timeZone },
44144
- end: { dateTime: body.endDateTime, timeZone }
44164
+ end: { dateTime: body.endDateTime, timeZone },
44165
+ attendees
44145
44166
  });
44146
44167
  return c.json({ ok: true, result });
44147
44168
  } catch (err) {
@@ -44152,8 +44173,8 @@ var init_server = __esm({
44152
44173
  const user = c.get("user");
44153
44174
  const body = await c.req.json().catch(() => ({}));
44154
44175
  const connectionId = providerConfigKeyFrom(body.connectionId);
44155
- if (!connectionId || typeof body.topic !== "string" || typeof body.startDateTime !== "string") {
44156
- return c.json({ ok: false, error: "connectionId, topic, and startDateTime are required." }, 400);
44176
+ if (!connectionId || typeof body.topic !== "string" || typeof body.startDateTime !== "string" || typeof body.agenda !== "string") {
44177
+ return c.json({ ok: false, error: "connectionId, topic, startDateTime, and agenda are required." }, 400);
44157
44178
  }
44158
44179
  try {
44159
44180
  const result = await callScheduleConnectionAction(user.email, connectionId, {
@@ -44161,7 +44182,7 @@ var init_server = __esm({
44161
44182
  startDateTime: body.startDateTime,
44162
44183
  durationMinutes: typeof body.durationMinutes === "number" ? body.durationMinutes : 30,
44163
44184
  timezone: typeof body.timezone === "string" ? body.timezone : void 0,
44164
- agenda: typeof body.agenda === "string" ? body.agenda : void 0
44185
+ agenda: body.agenda
44165
44186
  });
44166
44187
  return c.json({ ok: true, result });
44167
44188
  } catch (err) {