@striderlabs/mcp-zipcar 1.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/dist/index.js ADDED
@@ -0,0 +1,585 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { chromium } from "patchright";
6
+ // --- Browser session management ---
7
+ let browser = null;
8
+ let context = null;
9
+ async function getBrowser() {
10
+ if (!browser || !browser.isConnected()) {
11
+ browser = await chromium.launch({
12
+ headless: true,
13
+ args: [
14
+ "--no-sandbox",
15
+ "--disable-blink-features=AutomationControlled",
16
+ ],
17
+ });
18
+ }
19
+ return browser;
20
+ }
21
+ async function getContext() {
22
+ if (!context) {
23
+ const b = await getBrowser();
24
+ context = await b.newContext({
25
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
26
+ viewport: { width: 1280, height: 800 },
27
+ locale: "en-US",
28
+ });
29
+ }
30
+ return context;
31
+ }
32
+ async function newPage() {
33
+ const ctx = await getContext();
34
+ return ctx.newPage();
35
+ }
36
+ // --- Tool implementations ---
37
+ async function searchCars(args) {
38
+ const page = await newPage();
39
+ try {
40
+ const url = `https://www.zipcar.com/cars?location=${encodeURIComponent(args.location)}&starttime=${encodeURIComponent(args.start_time)}&endtime=${encodeURIComponent(args.end_time)}`;
41
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
42
+ // Wait for car listings to appear
43
+ await page.waitForSelector('[data-testid="car-card"], .vehicle-card, .car-listing', {
44
+ timeout: 15000,
45
+ }).catch(() => null);
46
+ const cars = await page.evaluate(() => {
47
+ const results = [];
48
+ // Try multiple selectors for different page structures
49
+ const cardSelectors = [
50
+ '[data-testid="car-card"]',
51
+ ".vehicle-card",
52
+ ".car-listing",
53
+ "[class*='VehicleCard']",
54
+ "[class*='CarCard']",
55
+ ];
56
+ let cards = null;
57
+ for (const sel of cardSelectors) {
58
+ const found = document.querySelectorAll(sel);
59
+ if (found.length > 0) {
60
+ cards = found;
61
+ break;
62
+ }
63
+ }
64
+ if (!cards)
65
+ return results;
66
+ cards.forEach((card, index) => {
67
+ const nameEl = card.querySelector("[class*='name'], [class*='Name'], h2, h3");
68
+ const typeEl = card.querySelector("[class*='type'], [class*='Type'], [class*='category']");
69
+ const locationEl = card.querySelector("[class*='location'], [class*='Location'], [class*='address']");
70
+ const distEl = card.querySelector("[class*='distance'], [class*='Distance']");
71
+ const hourlyEl = card.querySelector("[class*='hourly'], [class*='Hourly'], [class*='rate']");
72
+ const dailyEl = card.querySelector("[class*='daily'], [class*='Daily']");
73
+ const idAttr = card.dataset.vehicleId ||
74
+ card.dataset.carId ||
75
+ card.dataset.id ||
76
+ `car-${index}`;
77
+ results.push({
78
+ id: idAttr,
79
+ name: nameEl?.innerText?.trim() || "Unknown Vehicle",
80
+ type: typeEl?.innerText?.trim() || "Car",
81
+ location: locationEl?.innerText?.trim() || "See map",
82
+ distance: distEl?.innerText?.trim() || "N/A",
83
+ hourly_rate: hourlyEl?.innerText?.trim() || "N/A",
84
+ daily_rate: dailyEl?.innerText?.trim() || "N/A",
85
+ available: !card.classList.contains("unavailable"),
86
+ });
87
+ });
88
+ return results;
89
+ });
90
+ if (cars.length === 0) {
91
+ return JSON.stringify({
92
+ status: "no_results",
93
+ message: `No available Zipcars found near "${args.location}" for the requested time period.`,
94
+ searched_url: url,
95
+ });
96
+ }
97
+ return JSON.stringify({
98
+ status: "success",
99
+ location: args.location,
100
+ start_time: args.start_time,
101
+ end_time: args.end_time,
102
+ total_found: cars.length,
103
+ cars,
104
+ });
105
+ }
106
+ finally {
107
+ await page.close();
108
+ }
109
+ }
110
+ async function getCarDetails(args) {
111
+ const page = await newPage();
112
+ try {
113
+ const url = `https://www.zipcar.com/cars/${encodeURIComponent(args.car_id)}`;
114
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
115
+ await page.waitForSelector("[class*='VehicleDetail'], [class*='CarDetail'], .vehicle-detail, main", { timeout: 15000 }).catch(() => null);
116
+ const details = await page.evaluate((carId) => {
117
+ const getText = (selector) => document.querySelector(selector)?.innerText?.trim() || "N/A";
118
+ const features = [];
119
+ document.querySelectorAll("[class*='feature'], [class*='Feature'], [class*='amenity']").forEach((el) => {
120
+ const text = el.innerText?.trim();
121
+ if (text)
122
+ features.push(text);
123
+ });
124
+ return {
125
+ car_id: carId,
126
+ name: getText("h1, [class*='VehicleName'], [class*='CarName']"),
127
+ type: getText("[class*='vehicleType'], [class*='VehicleType'], [class*='category']"),
128
+ year: getText("[class*='year'], [class*='Year']"),
129
+ make: getText("[class*='make'], [class*='Make']"),
130
+ model: getText("[class*='model'], [class*='Model']"),
131
+ seats: getText("[class*='seats'], [class*='Seats'], [class*='capacity']"),
132
+ fuel_type: getText("[class*='fuel'], [class*='Fuel']"),
133
+ transmission: getText("[class*='transmission'], [class*='Transmission']"),
134
+ hourly_rate: getText("[class*='hourly'], [class*='HourlyRate']"),
135
+ daily_rate: getText("[class*='daily'], [class*='DailyRate']"),
136
+ included_miles_per_hour: getText("[class*='miles'], [class*='Miles']"),
137
+ location: getText("[class*='location'], [class*='Location'], [class*='address']"),
138
+ features: features.slice(0, 20),
139
+ };
140
+ }, args.car_id);
141
+ return JSON.stringify({ status: "success", details });
142
+ }
143
+ finally {
144
+ await page.close();
145
+ }
146
+ }
147
+ async function reserveCar(args) {
148
+ const page = await newPage();
149
+ try {
150
+ // Navigate to the car's booking page
151
+ const url = `https://www.zipcar.com/cars/${encodeURIComponent(args.car_id)}/reserve`;
152
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
153
+ // Check if user is logged in
154
+ const isLoggedIn = await page.evaluate(() => {
155
+ return (!document.querySelector("[class*='SignIn'], [class*='Login'], [href*='login']") ||
156
+ !!document.querySelector("[class*='UserMenu'], [class*='AccountMenu'], [data-testid='user-menu']"));
157
+ });
158
+ if (!isLoggedIn) {
159
+ return JSON.stringify({
160
+ status: "auth_required",
161
+ message: "Authentication required. Please log in to Zipcar before making a reservation.",
162
+ action: "Please use a browser to log in to zipcar.com, then retry.",
163
+ });
164
+ }
165
+ // Fill in start time
166
+ const startInput = await page.$("[name='startTime'], [data-testid='start-time'], #start-time");
167
+ if (startInput) {
168
+ await startInput.fill(args.start_time);
169
+ }
170
+ // Fill in end time
171
+ const endInput = await page.$("[name='endTime'], [data-testid='end-time'], #end-time");
172
+ if (endInput) {
173
+ await endInput.fill(args.end_time);
174
+ }
175
+ // Select plan if specified
176
+ if (args.plan) {
177
+ const planSelector = await page.$(`[data-plan="${args.plan}"], [value="${args.plan}"]`);
178
+ if (planSelector) {
179
+ await planSelector.click();
180
+ }
181
+ }
182
+ // Get reservation summary before confirming
183
+ const summary = await page.evaluate(() => {
184
+ const getText = (sel) => document.querySelector(sel)?.innerText?.trim() || "N/A";
185
+ return {
186
+ subtotal: getText("[class*='subtotal'], [class*='Subtotal']"),
187
+ total: getText("[class*='total'], [class*='Total']"),
188
+ duration: getText("[class*='duration'], [class*='Duration']"),
189
+ included_miles: getText("[class*='includedMiles'], [class*='miles']"),
190
+ };
191
+ });
192
+ // Click confirm/reserve button
193
+ const confirmBtn = await page.$("[data-testid='confirm-reservation'], [class*='ConfirmButton'], button[type='submit']");
194
+ if (confirmBtn) {
195
+ await confirmBtn.click();
196
+ await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 15000 }).catch(() => null);
197
+ }
198
+ // Extract confirmation details
199
+ const confirmation = await page.evaluate(() => {
200
+ const getText = (sel) => document.querySelector(sel)?.innerText?.trim() || "N/A";
201
+ return {
202
+ reservation_id: getText("[class*='confirmationNumber'], [data-testid='reservation-id']"),
203
+ status: getText("[class*='status'], [class*='Status']"),
204
+ message: getText("[class*='confirmationMessage'], [class*='success']"),
205
+ };
206
+ });
207
+ return JSON.stringify({
208
+ status: "success",
209
+ reservation: {
210
+ car_id: args.car_id,
211
+ start_time: args.start_time,
212
+ end_time: args.end_time,
213
+ plan: args.plan || "default",
214
+ ...confirmation,
215
+ cost_summary: summary,
216
+ },
217
+ });
218
+ }
219
+ finally {
220
+ await page.close();
221
+ }
222
+ }
223
+ async function extendReservation(args) {
224
+ const page = await newPage();
225
+ try {
226
+ await page.goto("https://www.zipcar.com/my-zipcar/reservations", {
227
+ waitUntil: "domcontentloaded",
228
+ timeout: 30000,
229
+ });
230
+ // Find the reservation
231
+ const reservationSelector = `[data-reservation-id="${args.reservation_id}"], [data-id="${args.reservation_id}"]`;
232
+ await page.waitForSelector(reservationSelector, { timeout: 10000 }).catch(() => null);
233
+ // Click extend/modify button
234
+ const extendBtn = await page.$(`${reservationSelector} [class*='extend'], ${reservationSelector} [data-action='extend']`);
235
+ if (!extendBtn) {
236
+ // Try finding extend button generically for the active reservation
237
+ const anyExtend = await page.$("[class*='ExtendTrip'], [data-testid='extend-trip'], button:has-text('Extend')");
238
+ if (anyExtend)
239
+ await anyExtend.click();
240
+ }
241
+ else {
242
+ await extendBtn.click();
243
+ }
244
+ // Set new end time
245
+ await page.waitForSelector("[name='newEndTime'], [data-testid='new-end-time']", { timeout: 10000 }).catch(() => null);
246
+ const newEndInput = await page.$("[name='newEndTime'], [data-testid='new-end-time'], #new-end-time");
247
+ if (newEndInput) {
248
+ await newEndInput.fill(args.new_end_time);
249
+ }
250
+ // Confirm extension
251
+ const confirmBtn = await page.$("[data-testid='confirm-extend'], button[type='submit'], [class*='ConfirmExtend']");
252
+ if (confirmBtn) {
253
+ await confirmBtn.click();
254
+ await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 15000 }).catch(() => null);
255
+ }
256
+ const result = await page.evaluate(() => {
257
+ const getText = (sel) => document.querySelector(sel)?.innerText?.trim() || "N/A";
258
+ return {
259
+ confirmation: getText("[class*='confirmation'], [class*='success']"),
260
+ confirmed_end_time: getText("[class*='endTime'], [class*='EndTime']"),
261
+ additional_cost: getText("[class*='additionalCost'], [class*='cost']"),
262
+ };
263
+ });
264
+ return JSON.stringify({
265
+ status: "success",
266
+ reservation_id: args.reservation_id,
267
+ new_end_time: args.new_end_time,
268
+ ...result,
269
+ });
270
+ }
271
+ finally {
272
+ await page.close();
273
+ }
274
+ }
275
+ async function endTrip(args) {
276
+ const page = await newPage();
277
+ try {
278
+ await page.goto("https://www.zipcar.com/my-zipcar/active-trip", {
279
+ waitUntil: "domcontentloaded",
280
+ timeout: 30000,
281
+ });
282
+ // Find end trip button
283
+ await page.waitForSelector("[data-testid='end-trip'], [class*='EndTrip'], button:has-text('End Trip')", { timeout: 15000 }).catch(() => null);
284
+ const endTripBtn = await page.$("[data-testid='end-trip'], [class*='EndTripButton'], button[data-action='end-trip']");
285
+ if (!endTripBtn) {
286
+ return JSON.stringify({
287
+ status: "error",
288
+ message: "Could not find active trip controls. Make sure you have an active reservation.",
289
+ reservation_id: args.reservation_id,
290
+ });
291
+ }
292
+ await endTripBtn.click();
293
+ // Handle confirmation dialog
294
+ await page.waitForSelector("[data-testid='confirm-end-trip'], [class*='ConfirmDialog']", {
295
+ timeout: 5000,
296
+ }).catch(() => null);
297
+ const confirmDialog = await page.$("[data-testid='confirm-end-trip'], [class*='ConfirmEnd']");
298
+ if (confirmDialog) {
299
+ await confirmDialog.click();
300
+ await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 15000 }).catch(() => null);
301
+ }
302
+ const tripSummary = await page.evaluate(() => {
303
+ const getText = (sel) => document.querySelector(sel)?.innerText?.trim() || "N/A";
304
+ return {
305
+ end_time: getText("[class*='endTime'], [class*='tripEnd']"),
306
+ duration: getText("[class*='tripDuration'], [class*='duration']"),
307
+ miles_driven: getText("[class*='milesDriven'], [class*='miles']"),
308
+ total_cost: getText("[class*='totalCost'], [class*='total']"),
309
+ receipt_url: document.querySelector("[href*='receipt']")?.href || "N/A",
310
+ };
311
+ });
312
+ return JSON.stringify({
313
+ status: "success",
314
+ reservation_id: args.reservation_id,
315
+ trip_summary: tripSummary,
316
+ });
317
+ }
318
+ finally {
319
+ await page.close();
320
+ }
321
+ }
322
+ async function getReservationHistory(args) {
323
+ const page = await newPage();
324
+ try {
325
+ await page.goto("https://www.zipcar.com/my-zipcar/reservations", {
326
+ waitUntil: "domcontentloaded",
327
+ timeout: 30000,
328
+ });
329
+ await page.waitForSelector("[class*='ReservationList'], [class*='reservation-list'], [data-testid='reservations']", { timeout: 15000 }).catch(() => null);
330
+ const filter = args.filter || "all";
331
+ const limit = args.limit || 20;
332
+ // Click appropriate filter tab
333
+ if (filter !== "all") {
334
+ const tabSelector = `[data-tab="${filter}"], button:has-text("${filter === "upcoming" ? "Upcoming" : "Past"}")`;
335
+ const tab = await page.$(tabSelector);
336
+ if (tab) {
337
+ await tab.click();
338
+ await page.waitForTimeout(1000);
339
+ }
340
+ }
341
+ const reservations = await page.evaluate((maxItems) => {
342
+ const results = [];
343
+ const cardSelectors = [
344
+ "[class*='ReservationCard']",
345
+ "[class*='reservation-card']",
346
+ "[data-testid='reservation-item']",
347
+ "li[class*='reservation']",
348
+ ];
349
+ let cards = null;
350
+ for (const sel of cardSelectors) {
351
+ const found = document.querySelectorAll(sel);
352
+ if (found.length > 0) {
353
+ cards = found;
354
+ break;
355
+ }
356
+ }
357
+ if (!cards)
358
+ return results;
359
+ const count = Math.min(cards.length, maxItems);
360
+ for (let i = 0; i < count; i++) {
361
+ const card = cards[i];
362
+ const getText = (sel) => card.querySelector(sel)?.innerText?.trim() || "N/A";
363
+ results.push({
364
+ id: card.dataset.reservationId ||
365
+ card.dataset.id ||
366
+ `res-${i}`,
367
+ car_name: getText("[class*='carName'], [class*='vehicleName'], h3, h4"),
368
+ car_type: getText("[class*='carType'], [class*='vehicleType']"),
369
+ pickup_location: getText("[class*='location'], [class*='pickupLocation']"),
370
+ start_time: getText("[class*='startTime'], [class*='pickupTime'], [data-label='Start']"),
371
+ end_time: getText("[class*='endTime'], [class*='returnTime'], [data-label='End']"),
372
+ status: getText("[class*='status'], [class*='reservationStatus']"),
373
+ total_cost: getText("[class*='totalCost'], [class*='cost'], [class*='price']"),
374
+ miles_driven: getText("[class*='milesDriven'], [class*='miles']"),
375
+ });
376
+ }
377
+ return results;
378
+ }, limit);
379
+ return JSON.stringify({
380
+ status: "success",
381
+ filter,
382
+ total_returned: reservations.length,
383
+ reservations,
384
+ });
385
+ }
386
+ finally {
387
+ await page.close();
388
+ }
389
+ }
390
+ // --- Tool definitions ---
391
+ const TOOLS = [
392
+ {
393
+ name: "search_cars",
394
+ description: "Search for available Zipcars near a location for a given time period. Returns a list of available vehicles with rates and locations.",
395
+ inputSchema: {
396
+ type: "object",
397
+ properties: {
398
+ location: {
399
+ type: "string",
400
+ description: "Address, city, or zip code to search near (e.g. '10001', 'Brooklyn, NY', '123 Main St, Boston')",
401
+ },
402
+ start_time: {
403
+ type: "string",
404
+ description: "Reservation start time in ISO 8601 format (e.g. '2025-08-15T10:00:00')",
405
+ },
406
+ end_time: {
407
+ type: "string",
408
+ description: "Reservation end time in ISO 8601 format (e.g. '2025-08-15T14:00:00')",
409
+ },
410
+ radius_miles: {
411
+ type: "number",
412
+ description: "Search radius in miles (default: 1)",
413
+ },
414
+ },
415
+ required: ["location", "start_time", "end_time"],
416
+ },
417
+ },
418
+ {
419
+ name: "get_car_details",
420
+ description: "Get detailed information about a specific Zipcar including vehicle type, features, seating, fuel type, and pricing rates.",
421
+ inputSchema: {
422
+ type: "object",
423
+ properties: {
424
+ car_id: {
425
+ type: "string",
426
+ description: "The Zipcar vehicle ID from search results",
427
+ },
428
+ },
429
+ required: ["car_id"],
430
+ },
431
+ },
432
+ {
433
+ name: "reserve_car",
434
+ description: "Book a Zipcar for a specific time slot. Requires the user to be logged in to Zipcar. Returns reservation confirmation details.",
435
+ inputSchema: {
436
+ type: "object",
437
+ properties: {
438
+ car_id: {
439
+ type: "string",
440
+ description: "The Zipcar vehicle ID to reserve",
441
+ },
442
+ start_time: {
443
+ type: "string",
444
+ description: "Reservation start time in ISO 8601 format",
445
+ },
446
+ end_time: {
447
+ type: "string",
448
+ description: "Reservation end time in ISO 8601 format",
449
+ },
450
+ plan: {
451
+ type: "string",
452
+ description: "Optional membership plan to use (e.g. 'hourly', 'daily')",
453
+ },
454
+ },
455
+ required: ["car_id", "start_time", "end_time"],
456
+ },
457
+ },
458
+ {
459
+ name: "extend_reservation",
460
+ description: "Extend an existing Zipcar reservation to a later end time. The car must still be available for the extended period.",
461
+ inputSchema: {
462
+ type: "object",
463
+ properties: {
464
+ reservation_id: {
465
+ type: "string",
466
+ description: "The reservation ID to extend",
467
+ },
468
+ new_end_time: {
469
+ type: "string",
470
+ description: "The new end time in ISO 8601 format",
471
+ },
472
+ },
473
+ required: ["reservation_id", "new_end_time"],
474
+ },
475
+ },
476
+ {
477
+ name: "end_trip",
478
+ description: "End an active Zipcar rental session. The car must be parked at a valid Zipcar spot. Returns a trip summary with duration, miles, and cost.",
479
+ inputSchema: {
480
+ type: "object",
481
+ properties: {
482
+ reservation_id: {
483
+ type: "string",
484
+ description: "The active reservation ID to end",
485
+ },
486
+ },
487
+ required: ["reservation_id"],
488
+ },
489
+ },
490
+ {
491
+ name: "get_reservation_history",
492
+ description: "View past and upcoming Zipcar reservations. Can filter by upcoming or past reservations.",
493
+ inputSchema: {
494
+ type: "object",
495
+ properties: {
496
+ filter: {
497
+ type: "string",
498
+ enum: ["upcoming", "past", "all"],
499
+ description: "Filter reservations: 'upcoming', 'past', or 'all' (default: 'all')",
500
+ },
501
+ limit: {
502
+ type: "number",
503
+ description: "Maximum number of reservations to return (default: 20)",
504
+ },
505
+ },
506
+ required: [],
507
+ },
508
+ },
509
+ ];
510
+ // --- MCP Server setup ---
511
+ const server = new Server({
512
+ name: "mcp-zipcar",
513
+ version: "1.0.0",
514
+ }, {
515
+ capabilities: {
516
+ tools: {},
517
+ },
518
+ });
519
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
520
+ return { tools: TOOLS };
521
+ });
522
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
523
+ const { name, arguments: args } = request.params;
524
+ try {
525
+ let result;
526
+ switch (name) {
527
+ case "search_cars":
528
+ result = await searchCars(args);
529
+ break;
530
+ case "get_car_details":
531
+ result = await getCarDetails(args);
532
+ break;
533
+ case "reserve_car":
534
+ result = await reserveCar(args);
535
+ break;
536
+ case "extend_reservation":
537
+ result = await extendReservation(args);
538
+ break;
539
+ case "end_trip":
540
+ result = await endTrip(args);
541
+ break;
542
+ case "get_reservation_history":
543
+ result = await getReservationHistory(args);
544
+ break;
545
+ default:
546
+ return {
547
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
548
+ isError: true,
549
+ };
550
+ }
551
+ return {
552
+ content: [{ type: "text", text: result }],
553
+ };
554
+ }
555
+ catch (error) {
556
+ const message = error instanceof Error ? error.message : String(error);
557
+ return {
558
+ content: [
559
+ {
560
+ type: "text",
561
+ text: JSON.stringify({ status: "error", error: message }),
562
+ },
563
+ ],
564
+ isError: true,
565
+ };
566
+ }
567
+ });
568
+ // Cleanup on exit
569
+ process.on("exit", async () => {
570
+ if (context)
571
+ await context.close().catch(() => null);
572
+ if (browser)
573
+ await browser.close().catch(() => null);
574
+ });
575
+ process.on("SIGINT", async () => {
576
+ if (context)
577
+ await context.close().catch(() => null);
578
+ if (browser)
579
+ await browser.close().catch(() => null);
580
+ process.exit(0);
581
+ });
582
+ // Start server
583
+ const transport = new StdioServerTransport();
584
+ await server.connect(transport);
585
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@striderlabs/mcp-zipcar",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Zipcar car sharing service automation",
5
+ "author": "Strider Labs <hello@striderlabs.ai>",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "bin": {
10
+ "striderlabs-mcp-zipcar": "dist/index.js"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "dev": "tsc --watch",
15
+ "start": "node dist/index.js"
16
+ },
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.0.0",
19
+ "patchright": "^1.49.1"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^22.0.0",
23
+ "typescript": "^5.6.0"
24
+ },
25
+ "mcpName": "io.github.markswendsen-code/zipcar"
26
+ }