@codespar/mcp-andreani 0.1.0 → 0.2.0-alpha.1

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.d.ts CHANGED
@@ -2,15 +2,25 @@
2
2
  /**
3
3
  * MCP Server for Andreani — largest Argentine courier/logistics provider.
4
4
  *
5
- * Tools:
5
+ * Tools (18):
6
6
  * - create_shipment: Create a new shipment
7
7
  * - get_shipment: Get shipment details by ID
8
8
  * - track_shipment: Track a shipment by tracking number
9
9
  * - get_rates: Get shipping rates/quotes
10
10
  * - list_branches: List Andreani branches/sucursales
11
11
  * - create_label: Generate a shipping label
12
+ * - get_label_pdf: Download label as PDF (base64)
12
13
  * - get_tracking_history: Get full tracking history
14
+ * - list_tracking_by_date: List tracking events for a date range
13
15
  * - cancel_shipment: Cancel a shipment
16
+ * - validate_postal_code: Validate CP coverage and list available services
17
+ * - create_pickup: Create a pickup/collection request
18
+ * - list_pickups: List pickup requests
19
+ * - cancel_pickup: Cancel a pickup request
20
+ * - create_return: Create a reverse logistics shipment (return)
21
+ * - list_returns: List return shipments
22
+ * - list_products: List contracted products/services
23
+ * - get_invoice: Get billing/invoice details
14
24
  *
15
25
  * Environment:
16
26
  * ANDREANI_API_KEY — API key
package/dist/index.js CHANGED
@@ -2,15 +2,25 @@
2
2
  /**
3
3
  * MCP Server for Andreani — largest Argentine courier/logistics provider.
4
4
  *
5
- * Tools:
5
+ * Tools (18):
6
6
  * - create_shipment: Create a new shipment
7
7
  * - get_shipment: Get shipment details by ID
8
8
  * - track_shipment: Track a shipment by tracking number
9
9
  * - get_rates: Get shipping rates/quotes
10
10
  * - list_branches: List Andreani branches/sucursales
11
11
  * - create_label: Generate a shipping label
12
+ * - get_label_pdf: Download label as PDF (base64)
12
13
  * - get_tracking_history: Get full tracking history
14
+ * - list_tracking_by_date: List tracking events for a date range
13
15
  * - cancel_shipment: Cancel a shipment
16
+ * - validate_postal_code: Validate CP coverage and list available services
17
+ * - create_pickup: Create a pickup/collection request
18
+ * - list_pickups: List pickup requests
19
+ * - cancel_pickup: Cancel a pickup request
20
+ * - create_return: Create a reverse logistics shipment (return)
21
+ * - list_returns: List return shipments
22
+ * - list_products: List contracted products/services
23
+ * - get_invoice: Get billing/invoice details
14
24
  *
15
25
  * Environment:
16
26
  * ANDREANI_API_KEY — API key
@@ -62,7 +72,7 @@ async function andreaniRequest(method, path, body) {
62
72
  }
63
73
  return res.json();
64
74
  }
65
- const server = new Server({ name: "mcp-andreani", version: "0.1.0" }, { capabilities: { tools: {} } });
75
+ const server = new Server({ name: "mcp-andreani", version: "0.2.0-alpha.1" }, { capabilities: { tools: {} } });
66
76
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
67
77
  tools: [
68
78
  {
@@ -188,6 +198,176 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
188
198
  required: ["shipmentId"],
189
199
  },
190
200
  },
201
+ {
202
+ name: "get_label_pdf",
203
+ description: "Download a shipping label as PDF (base64-encoded)",
204
+ inputSchema: {
205
+ type: "object",
206
+ properties: { shipmentId: { type: "string", description: "Shipment ID" } },
207
+ required: ["shipmentId"],
208
+ },
209
+ },
210
+ {
211
+ name: "list_tracking_by_date",
212
+ description: "List tracking events for a contract within a date range",
213
+ inputSchema: {
214
+ type: "object",
215
+ properties: {
216
+ contract: { type: "string", description: "Contract/account number" },
217
+ from_date: { type: "string", description: "Start date (YYYY-MM-DD)" },
218
+ to_date: { type: "string", description: "End date (YYYY-MM-DD)" },
219
+ },
220
+ required: ["contract", "from_date", "to_date"],
221
+ },
222
+ },
223
+ {
224
+ name: "validate_postal_code",
225
+ description: "Validate CP coverage and list available services for a postal code",
226
+ inputSchema: {
227
+ type: "object",
228
+ properties: {
229
+ postal_code: { type: "string", description: "Argentine postal code" },
230
+ },
231
+ required: ["postal_code"],
232
+ },
233
+ },
234
+ {
235
+ name: "create_pickup",
236
+ description: "Create a pickup/collection request (retiro)",
237
+ inputSchema: {
238
+ type: "object",
239
+ properties: {
240
+ contract: { type: "string", description: "Contract number" },
241
+ pickup_date: { type: "string", description: "Pickup date (YYYY-MM-DD)" },
242
+ address: {
243
+ type: "object",
244
+ description: "Pickup address",
245
+ properties: {
246
+ postal_code: { type: "string" },
247
+ street: { type: "string" },
248
+ number: { type: "string" },
249
+ city: { type: "string" },
250
+ province: { type: "string" },
251
+ contact_name: { type: "string" },
252
+ contact_phone: { type: "string" },
253
+ },
254
+ required: ["postal_code", "contact_name"],
255
+ },
256
+ packages_count: { type: "number", description: "Number of packages to pick up" },
257
+ notes: { type: "string", description: "Additional notes" },
258
+ },
259
+ required: ["contract", "pickup_date", "address", "packages_count"],
260
+ },
261
+ },
262
+ {
263
+ name: "list_pickups",
264
+ description: "List pickup/collection requests",
265
+ inputSchema: {
266
+ type: "object",
267
+ properties: {
268
+ contract: { type: "string", description: "Filter by contract" },
269
+ from_date: { type: "string", description: "Filter from date (YYYY-MM-DD)" },
270
+ to_date: { type: "string", description: "Filter to date (YYYY-MM-DD)" },
271
+ status: { type: "string", description: "Filter by status" },
272
+ },
273
+ },
274
+ },
275
+ {
276
+ name: "cancel_pickup",
277
+ description: "Cancel a pickup/collection request",
278
+ inputSchema: {
279
+ type: "object",
280
+ properties: { pickupId: { type: "string", description: "Pickup request ID" } },
281
+ required: ["pickupId"],
282
+ },
283
+ },
284
+ {
285
+ name: "create_return",
286
+ description: "Create a reverse logistics shipment (logística inversa / devolución)",
287
+ inputSchema: {
288
+ type: "object",
289
+ properties: {
290
+ contract: { type: "string", description: "Contract number" },
291
+ original_shipment_id: { type: "string", description: "Original shipment ID being returned" },
292
+ origin: {
293
+ type: "object",
294
+ description: "Pickup address (where to collect from)",
295
+ properties: {
296
+ postal_code: { type: "string" },
297
+ street: { type: "string" },
298
+ number: { type: "string" },
299
+ city: { type: "string" },
300
+ province: { type: "string" },
301
+ contact_name: { type: "string" },
302
+ contact_phone: { type: "string" },
303
+ },
304
+ required: ["postal_code", "contact_name"],
305
+ },
306
+ destination: {
307
+ type: "object",
308
+ description: "Return destination address",
309
+ properties: {
310
+ postal_code: { type: "string" },
311
+ street: { type: "string" },
312
+ number: { type: "string" },
313
+ city: { type: "string" },
314
+ province: { type: "string" },
315
+ },
316
+ required: ["postal_code"],
317
+ },
318
+ packages: {
319
+ type: "array",
320
+ description: "Packages to return",
321
+ items: {
322
+ type: "object",
323
+ properties: {
324
+ weight: { type: "number" },
325
+ height: { type: "number" },
326
+ width: { type: "number" },
327
+ length: { type: "number" },
328
+ },
329
+ required: ["weight"],
330
+ },
331
+ },
332
+ reason: { type: "string", description: "Return reason" },
333
+ },
334
+ required: ["contract", "origin", "destination", "packages"],
335
+ },
336
+ },
337
+ {
338
+ name: "list_returns",
339
+ description: "List reverse logistics shipments (returns)",
340
+ inputSchema: {
341
+ type: "object",
342
+ properties: {
343
+ contract: { type: "string", description: "Filter by contract" },
344
+ from_date: { type: "string", description: "Filter from date (YYYY-MM-DD)" },
345
+ to_date: { type: "string", description: "Filter to date (YYYY-MM-DD)" },
346
+ },
347
+ },
348
+ },
349
+ {
350
+ name: "list_products",
351
+ description: "List contracted products/services available on the account",
352
+ inputSchema: {
353
+ type: "object",
354
+ properties: {
355
+ contract: { type: "string", description: "Contract/account number" },
356
+ },
357
+ required: ["contract"],
358
+ },
359
+ },
360
+ {
361
+ name: "get_invoice",
362
+ description: "Get billing/invoice details",
363
+ inputSchema: {
364
+ type: "object",
365
+ properties: {
366
+ invoice_id: { type: "string", description: "Invoice/factura ID or number" },
367
+ },
368
+ required: ["invoice_id"],
369
+ },
370
+ },
191
371
  ],
192
372
  }));
193
373
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
@@ -234,6 +414,69 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
234
414
  return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/envios/${args?.shipmentId}/trazas`), null, 2) }] };
235
415
  case "cancel_shipment":
236
416
  return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("DELETE", `/envios/${args?.shipmentId}`), null, 2) }] };
417
+ case "get_label_pdf":
418
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/envios/${args?.shipmentId}/etiquetas?formato=pdf`), null, 2) }] };
419
+ case "list_tracking_by_date": {
420
+ const params = new URLSearchParams({
421
+ contrato: args?.contract,
422
+ fechaDesde: args?.from_date,
423
+ fechaHasta: args?.to_date,
424
+ });
425
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/trazas?${params}`), null, 2) }] };
426
+ }
427
+ case "validate_postal_code":
428
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/cobertura/${args?.postal_code}`), null, 2) }] };
429
+ case "create_pickup": {
430
+ const payload = {
431
+ contrato: args?.contract,
432
+ fechaRetiro: args?.pickup_date,
433
+ direccion: args?.address,
434
+ cantidadBultos: args?.packages_count,
435
+ observaciones: args?.notes,
436
+ };
437
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("POST", "/retiros", payload), null, 2) }] };
438
+ }
439
+ case "list_pickups": {
440
+ const params = new URLSearchParams();
441
+ if (args?.contract)
442
+ params.set("contrato", args.contract);
443
+ if (args?.from_date)
444
+ params.set("fechaDesde", args.from_date);
445
+ if (args?.to_date)
446
+ params.set("fechaHasta", args.to_date);
447
+ if (args?.status)
448
+ params.set("estado", args.status);
449
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/retiros?${params}`), null, 2) }] };
450
+ }
451
+ case "cancel_pickup":
452
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("DELETE", `/retiros/${args?.pickupId}`), null, 2) }] };
453
+ case "create_return": {
454
+ const payload = {
455
+ contrato: args?.contract,
456
+ envioOriginal: args?.original_shipment_id,
457
+ origen: args?.origin,
458
+ destino: args?.destination,
459
+ bultos: args?.packages,
460
+ motivo: args?.reason,
461
+ };
462
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("POST", "/logistica-inversa", payload), null, 2) }] };
463
+ }
464
+ case "list_returns": {
465
+ const params = new URLSearchParams();
466
+ if (args?.contract)
467
+ params.set("contrato", args.contract);
468
+ if (args?.from_date)
469
+ params.set("fechaDesde", args.from_date);
470
+ if (args?.to_date)
471
+ params.set("fechaHasta", args.to_date);
472
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/logistica-inversa?${params}`), null, 2) }] };
473
+ }
474
+ case "list_products": {
475
+ const params = new URLSearchParams({ contrato: args?.contract });
476
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/productos?${params}`), null, 2) }] };
477
+ }
478
+ case "get_invoice":
479
+ return { content: [{ type: "text", text: JSON.stringify(await andreaniRequest("GET", `/facturas/${args?.invoice_id}`), null, 2) }] };
237
480
  default:
238
481
  return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
239
482
  }
@@ -260,7 +503,7 @@ async function main() {
260
503
  const t = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID(), onsessioninitialized: (id) => { transports.set(id, t); } });
261
504
  t.onclose = () => { if (t.sessionId)
262
505
  transports.delete(t.sessionId); };
263
- const s = new Server({ name: "mcp-andreani", version: "0.1.0" }, { capabilities: { tools: {} } });
506
+ const s = new Server({ name: "mcp-andreani", version: "0.2.0-alpha.1" }, { capabilities: { tools: {} } });
264
507
  server._requestHandlers.forEach((v, k) => s._requestHandlers.set(k, v));
265
508
  server._notificationHandlers?.forEach((v, k) => s._notificationHandlers.set(k, v));
266
509
  await s.connect(t);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codespar/mcp-andreani",
3
- "version": "0.1.0",
3
+ "version": "0.2.0-alpha.1",
4
4
  "description": "MCP server for Andreani — Argentine courier and logistics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",