@yoryoboy/bi-mcp 1.16.0 → 1.19.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 +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +179 -6
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +3 -6
- package/dist/src/config/__tests__/google-store.test.js +30 -0
- package/dist/src/config/__tests__/google-store.test.js.map +7 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
- package/dist/src/config/google-store.js +18 -0
- package/dist/src/config/google-store.js.map +2 -2
- package/dist/src/config/mcp-tool-deadline-context.js +34 -0
- package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
- package/dist/src/config/mcp-tool-deadline.js +67 -0
- package/dist/src/config/mcp-tool-deadline.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
- package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
- package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-api.js +6 -0
- package/dist/src/services/vtex/vtex-api.js.map +2 -2
- package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
- package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
- package/dist/src/tools/config/list-profiles.js +39 -3
- package/dist/src/tools/config/list-profiles.js.map +2 -2
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
- package/dist/src/tools/mercadolibre/index.js +32 -0
- package/dist/src/tools/mercadolibre/index.js.map +2 -2
- package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
- package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
- package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
- package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
- package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/google-ads/report-utils.js +0 -78
- package/dist/src/google-ads/report-utils.js.map +0 -7
- package/dist/src/search-console/search-console-utils.js +0 -275
- package/dist/src/search-console/search-console-utils.js.map +0 -7
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
- package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { error, object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
formatMercadoLibreError,
|
|
5
|
+
MercadoLibreApiError,
|
|
6
|
+
normalizeMercadoLibrePaging
|
|
7
|
+
} from "../../services/mercadolibre/mercadolibre-api.js";
|
|
8
|
+
import { searchMercadoLibreProductAdsAdGroupAds } from "../../services/mercadolibre/mercadolibre-product-ads.js";
|
|
9
|
+
import { mercadoLibreDateRegex } from "./helpers.js";
|
|
10
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
11
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
12
|
+
const PRODUCT_ADS_PAGE_LIMIT = 50;
|
|
13
|
+
function isValidCalendarDate(value) {
|
|
14
|
+
const [year, month, day] = value.split("-").map(Number);
|
|
15
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
16
|
+
return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
|
|
17
|
+
}
|
|
18
|
+
const meliGetProductAdsAdGroupAdsSchema = z.object({
|
|
19
|
+
profileId: z.string().trim().min(1).describe("Explicit MercadoLibre profile id to use for the Product Ads request."),
|
|
20
|
+
siteId: z.string().trim().min(1).describe("MercadoLibre site id for the Product Ads account, such as MLA or MLB."),
|
|
21
|
+
adGroupId: z.string().trim().min(1).describe("MercadoLibre Product Ads ad group id to read."),
|
|
22
|
+
dateFrom: z.string().regex(mercadoLibreDateRegex).describe("Start date in YYYY-MM-DD format for the Product Ads window."),
|
|
23
|
+
dateTo: z.string().regex(mercadoLibreDateRegex).describe("End date in YYYY-MM-DD format for the Product Ads window."),
|
|
24
|
+
metrics: z.array(z.string().trim().min(1)).min(1).describe(
|
|
25
|
+
"Product Ads metrics to request for the ad group rows, using the metric names supported by the endpoint."
|
|
26
|
+
),
|
|
27
|
+
channel: z.string().trim().min(1).optional().describe("Optional channel filter forwarded to the Product Ads ad-group ads request."),
|
|
28
|
+
campaignId: z.string().trim().min(1).optional().describe("Optional campaign id filter forwarded to the Product Ads ad-group ads request."),
|
|
29
|
+
aggregationType: z.enum(["adgroup", "daily"]).optional().describe("Optional aggregation type supported by the Product Ads ad-group ads endpoint."),
|
|
30
|
+
limit: z.number().int().min(1).max(100).optional().describe("Requested page size for the Product Ads ad-group ads result."),
|
|
31
|
+
offset: z.number().int().min(0).optional().describe("Requested offset for the Product Ads ad-group ads result.")
|
|
32
|
+
}).superRefine((value, ctx) => {
|
|
33
|
+
for (const field of ["dateFrom", "dateTo"]) {
|
|
34
|
+
if (!isValidCalendarDate(value[field])) {
|
|
35
|
+
ctx.addIssue({
|
|
36
|
+
code: z.ZodIssueCode.custom,
|
|
37
|
+
path: [field],
|
|
38
|
+
message: `${field} must be a valid calendar date.`
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (value.dateFrom > value.dateTo) {
|
|
43
|
+
ctx.addIssue({
|
|
44
|
+
code: z.ZodIssueCode.custom,
|
|
45
|
+
path: ["dateTo"],
|
|
46
|
+
message: "dateTo must be on or after dateFrom."
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
function buildPageMetadata(params) {
|
|
51
|
+
const nextOffset = params.effectiveOffset + params.effectiveLimit;
|
|
52
|
+
const hasMore = params.effectiveLimit > 0 && params.returned >= params.effectiveLimit && nextOffset < params.total;
|
|
53
|
+
const underfilledPage = params.returned < params.effectiveLimit && nextOffset < params.total;
|
|
54
|
+
return stripNulls({
|
|
55
|
+
profile_id: params.profileId,
|
|
56
|
+
site_id: params.siteId,
|
|
57
|
+
ad_group_id: params.adGroupId,
|
|
58
|
+
campaign_id: params.campaignId,
|
|
59
|
+
channel: params.channel,
|
|
60
|
+
aggregation_type: params.aggregationType,
|
|
61
|
+
entity: "ad_group_ads",
|
|
62
|
+
fetch_mode: "page",
|
|
63
|
+
total: params.total,
|
|
64
|
+
requested_limit: params.requestedLimit,
|
|
65
|
+
effective_limit: params.effectiveLimit,
|
|
66
|
+
requested_offset: params.requestedOffset,
|
|
67
|
+
effective_offset: params.effectiveOffset,
|
|
68
|
+
returned: params.returned,
|
|
69
|
+
has_more: hasMore,
|
|
70
|
+
next_offset: hasMore ? nextOffset : void 0,
|
|
71
|
+
continuation: hasMore ? `Re-run meli_get_product_ads_ad_group_ads with offset=${nextOffset}, limit=${params.effectiveLimit} to continue.` : underfilledPage ? "The returned page had fewer rows than the effective limit, so page-mode continuation is not reliable for this response." : "No more Product Ads ad group ads pages remain for this query."
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function buildAdGroupNotFoundMessage(params) {
|
|
75
|
+
return `MercadoLibre Product Ads ad group "${params.adGroupId}" was not found for siteId "${params.siteId}" in profile "${params.profileId}". Verify the adGroupId or run meli_search_product_ads_ad_groups to re-discover Product Ads ad groups if the account changed.`;
|
|
76
|
+
}
|
|
77
|
+
async function meliGetProductAdsAdGroupAdsHandler(params) {
|
|
78
|
+
let resolvedProfileId;
|
|
79
|
+
try {
|
|
80
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
81
|
+
if (!profileResolution.ok) {
|
|
82
|
+
return profileResolution.response;
|
|
83
|
+
}
|
|
84
|
+
const profileId = profileResolution.value.profileId;
|
|
85
|
+
resolvedProfileId = profileId;
|
|
86
|
+
const requestedLimit = params.limit ?? PRODUCT_ADS_PAGE_LIMIT;
|
|
87
|
+
const requestedOffset = params.offset ?? 0;
|
|
88
|
+
const page = await searchMercadoLibreProductAdsAdGroupAds(profileId, {
|
|
89
|
+
siteId: params.siteId,
|
|
90
|
+
adGroupId: params.adGroupId,
|
|
91
|
+
dateFrom: params.dateFrom,
|
|
92
|
+
dateTo: params.dateTo,
|
|
93
|
+
metrics: params.metrics,
|
|
94
|
+
channel: params.channel,
|
|
95
|
+
campaignId: params.campaignId,
|
|
96
|
+
aggregationType: params.aggregationType,
|
|
97
|
+
limit: requestedLimit,
|
|
98
|
+
offset: requestedOffset
|
|
99
|
+
});
|
|
100
|
+
const effectivePaging = normalizeMercadoLibrePaging(page.paging);
|
|
101
|
+
const returned = page.results.length;
|
|
102
|
+
return object(
|
|
103
|
+
stripNulls({
|
|
104
|
+
profile_id: profileId,
|
|
105
|
+
site_id: params.siteId,
|
|
106
|
+
ad_group_id: params.adGroupId,
|
|
107
|
+
product: "PADS",
|
|
108
|
+
mode: "page",
|
|
109
|
+
paging: page.paging,
|
|
110
|
+
results: page.results.map((row) => stripNulls(row)),
|
|
111
|
+
metadata: buildPageMetadata({
|
|
112
|
+
profileId,
|
|
113
|
+
siteId: params.siteId,
|
|
114
|
+
adGroupId: params.adGroupId,
|
|
115
|
+
campaignId: params.campaignId,
|
|
116
|
+
channel: params.channel,
|
|
117
|
+
aggregationType: params.aggregationType,
|
|
118
|
+
total: effectivePaging.total,
|
|
119
|
+
requestedLimit: params.limit,
|
|
120
|
+
requestedOffset,
|
|
121
|
+
effectiveLimit: effectivePaging.limit || requestedLimit,
|
|
122
|
+
effectiveOffset: effectivePaging.offset,
|
|
123
|
+
returned
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
);
|
|
127
|
+
} catch (err) {
|
|
128
|
+
if (err instanceof MercadoLibreApiError && err.status === 404) {
|
|
129
|
+
return error(
|
|
130
|
+
buildAdGroupNotFoundMessage({
|
|
131
|
+
profileId: resolvedProfileId ?? params.profileId,
|
|
132
|
+
siteId: params.siteId,
|
|
133
|
+
adGroupId: params.adGroupId
|
|
134
|
+
})
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
return error(formatMercadoLibreError(err, "Failed to get MercadoLibre Product Ads ad group ads"));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export {
|
|
141
|
+
meliGetProductAdsAdGroupAdsHandler,
|
|
142
|
+
meliGetProductAdsAdGroupAdsSchema
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=get-product-ads-ad-group-ads.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-product-ads-ad-group-ads.ts"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n formatMercadoLibreError,\n MercadoLibreApiError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreProductAdsAdGroupAds } from \"../../services/mercadolibre/mercadolibre-product-ads.js\";\nimport { mercadoLibreDateRegex } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nconst PRODUCT_ADS_PAGE_LIMIT = 50;\n\nfunction isValidCalendarDate(value: string) {\n const [year, month, day] = value.split(\"-\").map(Number);\n const date = new Date(Date.UTC(year, month - 1, day));\n\n return (\n date.getUTCFullYear() === year &&\n date.getUTCMonth() === month - 1 &&\n date.getUTCDate() === day\n );\n}\n\nexport const meliGetProductAdsAdGroupAdsSchema = z.object({\n profileId: z\n .string()\n .trim()\n .min(1)\n .describe(\"Explicit MercadoLibre profile id to use for the Product Ads request.\"),\n siteId: z\n .string()\n .trim()\n .min(1)\n .describe(\"MercadoLibre site id for the Product Ads account, such as MLA or MLB.\"),\n adGroupId: z\n .string()\n .trim()\n .min(1)\n .describe(\"MercadoLibre Product Ads ad group id to read.\"),\n dateFrom: z\n .string()\n .regex(mercadoLibreDateRegex)\n .describe(\"Start date in YYYY-MM-DD format for the Product Ads window.\"),\n dateTo: z\n .string()\n .regex(mercadoLibreDateRegex)\n .describe(\"End date in YYYY-MM-DD format for the Product Ads window.\"),\n metrics: z\n .array(z.string().trim().min(1))\n .min(1)\n .describe(\n \"Product Ads metrics to request for the ad group rows, using the metric names supported by the endpoint.\"\n ),\n channel: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional channel filter forwarded to the Product Ads ad-group ads request.\"),\n campaignId: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional campaign id filter forwarded to the Product Ads ad-group ads request.\"),\n aggregationType: z\n .enum([\"adgroup\", \"daily\"])\n .optional()\n .describe(\"Optional aggregation type supported by the Product Ads ad-group ads endpoint.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Requested page size for the Product Ads ad-group ads result.\"),\n offset: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Requested offset for the Product Ads ad-group ads result.\"),\n}).superRefine((value, ctx) => {\n for (const field of [\"dateFrom\", \"dateTo\"] as const) {\n if (!isValidCalendarDate(value[field])) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [field],\n message: `${field} must be a valid calendar date.`,\n });\n }\n }\n\n if (value.dateFrom > value.dateTo) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"dateTo\"],\n message: \"dateTo must be on or after dateFrom.\",\n });\n }\n});\n\nfunction buildPageMetadata(params: {\n profileId: string;\n siteId: string;\n adGroupId: string;\n campaignId?: string;\n channel?: string;\n aggregationType?: string;\n total: number;\n requestedLimit?: number;\n requestedOffset: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n}) {\n const nextOffset = params.effectiveOffset + params.effectiveLimit;\n const hasMore = params.effectiveLimit > 0 && params.returned >= params.effectiveLimit && nextOffset < params.total;\n const underfilledPage = params.returned < params.effectiveLimit && nextOffset < params.total;\n\n return stripNulls({\n profile_id: params.profileId,\n site_id: params.siteId,\n ad_group_id: params.adGroupId,\n campaign_id: params.campaignId,\n channel: params.channel,\n aggregation_type: params.aggregationType,\n entity: \"ad_group_ads\",\n fetch_mode: \"page\",\n total: params.total,\n requested_limit: params.requestedLimit,\n effective_limit: params.effectiveLimit,\n requested_offset: params.requestedOffset,\n effective_offset: params.effectiveOffset,\n returned: params.returned,\n has_more: hasMore,\n next_offset: hasMore ? nextOffset : undefined,\n continuation: hasMore\n ? `Re-run meli_get_product_ads_ad_group_ads with offset=${nextOffset}, limit=${params.effectiveLimit} to continue.`\n : underfilledPage\n ? \"The returned page had fewer rows than the effective limit, so page-mode continuation is not reliable for this response.\"\n : \"No more Product Ads ad group ads pages remain for this query.\",\n });\n}\n\nfunction buildAdGroupNotFoundMessage(params: {\n profileId: string;\n siteId: string;\n adGroupId: string;\n}) {\n return `MercadoLibre Product Ads ad group \"${params.adGroupId}\" was not found for siteId \"${params.siteId}\" in profile \"${params.profileId}\". Verify the adGroupId or run meli_search_product_ads_ad_groups to re-discover Product Ads ad groups if the account changed.`;\n}\n\nexport async function meliGetProductAdsAdGroupAdsHandler(\n params: z.infer<typeof meliGetProductAdsAdGroupAdsSchema>\n) {\n let resolvedProfileId: string | undefined;\n\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n resolvedProfileId = profileId;\n const requestedLimit = params.limit ?? PRODUCT_ADS_PAGE_LIMIT;\n const requestedOffset = params.offset ?? 0;\n const page = await searchMercadoLibreProductAdsAdGroupAds(profileId, {\n siteId: params.siteId,\n adGroupId: params.adGroupId,\n dateFrom: params.dateFrom,\n dateTo: params.dateTo,\n metrics: params.metrics,\n channel: params.channel,\n campaignId: params.campaignId,\n aggregationType: params.aggregationType,\n limit: requestedLimit,\n offset: requestedOffset,\n });\n const effectivePaging = normalizeMercadoLibrePaging(page.paging);\n const returned = page.results.length;\n\n return object(\n stripNulls({\n profile_id: profileId,\n site_id: params.siteId,\n ad_group_id: params.adGroupId,\n product: \"PADS\",\n mode: \"page\",\n paging: page.paging,\n results: page.results.map((row) => stripNulls(row)),\n metadata: buildPageMetadata({\n profileId,\n siteId: params.siteId,\n adGroupId: params.adGroupId,\n campaignId: params.campaignId,\n channel: params.channel,\n aggregationType: params.aggregationType,\n total: effectivePaging.total,\n requestedLimit: params.limit,\n requestedOffset,\n effectiveLimit: effectivePaging.limit || requestedLimit,\n effectiveOffset: effectivePaging.offset,\n returned,\n }),\n })\n );\n } catch (err) {\n if (err instanceof MercadoLibreApiError && err.status === 404) {\n return error(\n buildAdGroupNotFoundMessage({\n profileId: resolvedProfileId ?? params.profileId,\n siteId: params.siteId,\n adGroupId: params.adGroupId,\n })\n );\n }\n\n return error(formatMercadoLibreError(err, \"Failed to get MercadoLibre Product Ads ad group ads\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { object, error } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
|
+
import {
|
|
5
|
+
listMercadoLibreProductAdsAdvertisers
|
|
6
|
+
} from "../../services/mercadolibre/mercadolibre-product-ads.js";
|
|
7
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
8
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
9
|
+
import { mercadolibreProductAdsProfileIdSchemaField } from "./product-ads-helpers.js";
|
|
10
|
+
const advertiserSchema = [
|
|
11
|
+
"advertiser_id",
|
|
12
|
+
"advertiser_site_id",
|
|
13
|
+
"account_name",
|
|
14
|
+
"business_name",
|
|
15
|
+
"status"
|
|
16
|
+
];
|
|
17
|
+
const meliListProductAdsAdvertisersSchema = z.object({
|
|
18
|
+
profileId: mercadolibreProductAdsProfileIdSchemaField
|
|
19
|
+
});
|
|
20
|
+
function projectAdvertiser(advertiser) {
|
|
21
|
+
return [
|
|
22
|
+
advertiser.advertiser_id,
|
|
23
|
+
advertiser.advertiser_site_id,
|
|
24
|
+
advertiser.account_name ?? null,
|
|
25
|
+
advertiser.business_name ?? null,
|
|
26
|
+
advertiser.status ?? null
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
async function meliListProductAdsAdvertisersHandler(params) {
|
|
30
|
+
try {
|
|
31
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
32
|
+
if (!profileResolution.ok) {
|
|
33
|
+
return profileResolution.response;
|
|
34
|
+
}
|
|
35
|
+
const profileId = profileResolution.value.profileId;
|
|
36
|
+
const advertisers = await listMercadoLibreProductAdsAdvertisers(profileId);
|
|
37
|
+
const uniqueSites = new Set(advertisers.map((advertiser) => advertiser.advertiser_site_id)).size;
|
|
38
|
+
return object(
|
|
39
|
+
stripNulls({
|
|
40
|
+
profile_id: profileId,
|
|
41
|
+
product: "PADS",
|
|
42
|
+
metadata: {
|
|
43
|
+
total_advertisers: advertisers.length,
|
|
44
|
+
unique_sites: uniqueSites,
|
|
45
|
+
continuation: advertisers.length > 0 ? "Use one of the returned advertiser_site_id and advertiser_id pairs by passing them as siteId and advertiserId to the Product Ads search tool. That tool returns page metadata with next_offset when more rows remain." : "No Product Ads advertisers were returned for this profile."
|
|
46
|
+
},
|
|
47
|
+
advertisers_schema: advertiserSchema,
|
|
48
|
+
advertisers: advertisers.map(projectAdvertiser)
|
|
49
|
+
})
|
|
50
|
+
);
|
|
51
|
+
} catch (err) {
|
|
52
|
+
return error(formatMercadoLibreError(err, "Failed to list MercadoLibre Product Ads advertisers"));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
meliListProductAdsAdvertisersHandler,
|
|
57
|
+
meliListProductAdsAdvertisersSchema
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=get-product-ads-advertisers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-product-ads-advertisers.ts"],
|
|
4
|
+
"sourcesContent": ["import { object, error } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n listMercadoLibreProductAdsAdvertisers,\n type MercadoLibreProductAdsAdvertiser,\n} from \"../../services/mercadolibre/mercadolibre-product-ads.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProductAdsProfileIdSchemaField } from \"./product-ads-helpers.js\";\n\nconst advertiserSchema = [\n \"advertiser_id\",\n \"advertiser_site_id\",\n \"account_name\",\n \"business_name\",\n \"status\",\n] as const;\n\nexport const meliListProductAdsAdvertisersSchema = z.object({\n profileId: mercadolibreProductAdsProfileIdSchemaField,\n});\n\nfunction projectAdvertiser(advertiser: MercadoLibreProductAdsAdvertiser) {\n return [\n advertiser.advertiser_id,\n advertiser.advertiser_site_id,\n advertiser.account_name ?? null,\n advertiser.business_name ?? null,\n advertiser.status ?? null,\n ];\n}\n\nexport async function meliListProductAdsAdvertisersHandler(\n params: z.infer<typeof meliListProductAdsAdvertisersSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const advertisers = await listMercadoLibreProductAdsAdvertisers(profileId);\n const uniqueSites = new Set(advertisers.map((advertiser) => advertiser.advertiser_site_id)).size;\n\n return object(\n stripNulls({\n profile_id: profileId,\n product: \"PADS\",\n metadata: {\n total_advertisers: advertisers.length,\n unique_sites: uniqueSites,\n continuation:\n advertisers.length > 0\n ? \"Use one of the returned advertiser_site_id and advertiser_id pairs by passing them as siteId and advertiserId to the Product Ads search tool. That tool returns page metadata with next_offset when more rows remain.\"\n : \"No Product Ads advertisers were returned for this profile.\",\n },\n advertisers_schema: advertiserSchema,\n advertisers: advertisers.map(projectAdvertiser),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to list MercadoLibre Product Ads advertisers\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,QAAQ,aAAa;AAC9B,SAAS,SAAS;AAElB,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,OAEK;AACP,SAAS,kBAAkB;AAC3B,SAAS,6CAA6C;AACtD,SAAS,kDAAkD;AAE3D,MAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,sCAAsC,EAAE,OAAO;AAAA,EAC1D,WAAW;AACb,CAAC;AAED,SAAS,kBAAkB,YAA8C;AACvE,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW,gBAAgB;AAAA,IAC3B,WAAW,iBAAiB;AAAA,IAC5B,WAAW,UAAU;AAAA,EACvB;AACF;AAEA,eAAsB,qCACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,cAAc,MAAM,sCAAsC,SAAS;AACzE,UAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,eAAe,WAAW,kBAAkB,CAAC,EAAE;AAE5F,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,UAAU;AAAA,UACR,mBAAmB,YAAY;AAAA,UAC/B,cAAc;AAAA,UACd,cACE,YAAY,SAAS,IACjB,0NACA;AAAA,QACR;AAAA,QACA,oBAAoB;AAAA,QACpB,aAAa,YAAY,IAAI,iBAAiB;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,KAAK,qDAAqD,CAAC;AAAA,EAClG;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { error, object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
|
+
import { getMercadoLibreItem } from "../../services/mercadolibre/mercadolibre-items.js";
|
|
5
|
+
import {
|
|
6
|
+
getMercadoLibreDeclaredDimensionsShippingQuote
|
|
7
|
+
} from "../../services/mercadolibre/mercadolibre-shipping.js";
|
|
8
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
9
|
+
import { asRecord, normalizeString, toNumber } from "./helpers.js";
|
|
10
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
11
|
+
import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
|
|
12
|
+
function formatDeclaredDimensions(heightCm, widthCm, lengthCm, weightGrams) {
|
|
13
|
+
return `${heightCm}x${widthCm}x${lengthCm},${weightGrams}`;
|
|
14
|
+
}
|
|
15
|
+
const meliGetShippingQuoteByDeclaredDimensionsSchema = z.object({
|
|
16
|
+
profileId: mercadolibreProfileIdSchemaField,
|
|
17
|
+
itemId: z.string().trim().min(1).optional().describe("Optional MercadoLibre item id used to hydrate price, listing type, shipping and category context."),
|
|
18
|
+
heightCm: z.number().int().positive().describe("Declared package height in centimeters."),
|
|
19
|
+
widthCm: z.number().int().positive().describe("Declared package width in centimeters."),
|
|
20
|
+
lengthCm: z.number().int().positive().describe("Declared package length in centimeters."),
|
|
21
|
+
weightGrams: z.number().int().positive().describe("Declared package weight in grams."),
|
|
22
|
+
itemPrice: z.number().nonnegative().optional().describe("Unit item price used for the shipping cost simulation when itemId is not provided or when the item snapshot needs a manual override."),
|
|
23
|
+
listingTypeId: z.string().trim().min(1).optional().describe("MercadoLibre listing type id used for the shipping cost simulation when itemId is not provided or when the item snapshot needs a manual override."),
|
|
24
|
+
mode: z.string().trim().min(1).optional().describe("MercadoLibre shipping mode. Defaults to me2."),
|
|
25
|
+
logisticType: z.string().trim().min(1).optional().describe("MercadoLibre logistic type used for the shipping cost simulation."),
|
|
26
|
+
freeShipping: z.boolean().optional().describe("Whether the seller wants to simulate free shipping for the buyer."),
|
|
27
|
+
currencyId: z.string().trim().min(1).optional().describe("Currency id used for the quote. Defaults to ARS."),
|
|
28
|
+
condition: z.enum(["new", "used"]).optional().describe("Item condition used for the quote. Defaults to new."),
|
|
29
|
+
categoryId: z.string().trim().min(1).optional().describe("Optional category id used for the quote when itemId is not provided."),
|
|
30
|
+
verbose: z.boolean().optional().describe("Whether to request verbose shipping simulation output. Defaults to true."),
|
|
31
|
+
tags: z.array(z.string().trim().min(1)).optional().describe("Optional MercadoLibre tags to forward to the shipping quote endpoint.")
|
|
32
|
+
}).refine(
|
|
33
|
+
(params) => Boolean(params.itemId) || params.itemPrice !== void 0 && params.listingTypeId,
|
|
34
|
+
{
|
|
35
|
+
message: "Provide itemId or, when simulating from declared dimensions only, at least itemPrice and listingTypeId.",
|
|
36
|
+
path: ["itemPrice"]
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
async function meliGetShippingQuoteByDeclaredDimensionsHandler(params) {
|
|
40
|
+
try {
|
|
41
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
42
|
+
if (!profileResolution.ok) {
|
|
43
|
+
return profileResolution.response;
|
|
44
|
+
}
|
|
45
|
+
const profileId = profileResolution.value.profileId;
|
|
46
|
+
const dimensions = formatDeclaredDimensions(params.heightCm, params.widthCm, params.lengthCm, params.weightGrams);
|
|
47
|
+
let itemSnapshot = null;
|
|
48
|
+
if (params.itemId) {
|
|
49
|
+
itemSnapshot = await getMercadoLibreItem(profileId, params.itemId);
|
|
50
|
+
}
|
|
51
|
+
const shippingSnapshot = asRecord(itemSnapshot ? asRecord(itemSnapshot).shipping : void 0);
|
|
52
|
+
const hydratedMode = params.mode ?? normalizeString(shippingSnapshot.mode, "me2");
|
|
53
|
+
const hydratedCondition = params.condition ?? normalizeString(itemSnapshot?.condition, "new");
|
|
54
|
+
const hydratedCurrencyId = params.currencyId ?? (normalizeString(itemSnapshot?.currency_id) || "ARS");
|
|
55
|
+
const resolvedQuote = await getMercadoLibreDeclaredDimensionsShippingQuote(profileId, {
|
|
56
|
+
dimensions,
|
|
57
|
+
verbose: params.verbose ?? true,
|
|
58
|
+
itemId: params.itemId,
|
|
59
|
+
itemPrice: params.itemPrice ?? (itemSnapshot ? toNumber(itemSnapshot.price) : void 0),
|
|
60
|
+
listingTypeId: params.listingTypeId ?? normalizeString(itemSnapshot?.listing_type_id),
|
|
61
|
+
mode: hydratedMode || "me2",
|
|
62
|
+
condition: hydratedCondition || "new",
|
|
63
|
+
logisticType: params.logisticType ?? normalizeString(shippingSnapshot.logistic_type),
|
|
64
|
+
freeShipping: params.freeShipping ?? shippingSnapshot.free_shipping === true,
|
|
65
|
+
currencyId: hydratedCurrencyId,
|
|
66
|
+
categoryId: params.categoryId ?? normalizeString(itemSnapshot?.category_id),
|
|
67
|
+
tags: params.tags
|
|
68
|
+
});
|
|
69
|
+
return object(
|
|
70
|
+
stripNulls({
|
|
71
|
+
profile_id: profileId,
|
|
72
|
+
metadata: {
|
|
73
|
+
source: params.itemId ? "item_hydrated" : "declared_dimensions",
|
|
74
|
+
item_id: params.itemId,
|
|
75
|
+
dimensions,
|
|
76
|
+
height_cm: params.heightCm,
|
|
77
|
+
width_cm: params.widthCm,
|
|
78
|
+
length_cm: params.lengthCm,
|
|
79
|
+
weight_grams: params.weightGrams,
|
|
80
|
+
item_price: params.itemPrice ?? (itemSnapshot ? toNumber(itemSnapshot.price) : void 0),
|
|
81
|
+
listing_type_id: params.listingTypeId ?? normalizeString(itemSnapshot?.listing_type_id),
|
|
82
|
+
mode: hydratedMode || "me2",
|
|
83
|
+
logistic_type: params.logisticType ?? normalizeString(shippingSnapshot.logistic_type),
|
|
84
|
+
free_shipping: params.freeShipping ?? shippingSnapshot.free_shipping === true,
|
|
85
|
+
currency_id: hydratedCurrencyId,
|
|
86
|
+
condition: hydratedCondition || "new",
|
|
87
|
+
category_id: params.categoryId ?? normalizeString(itemSnapshot?.category_id),
|
|
88
|
+
verbose: params.verbose ?? true
|
|
89
|
+
},
|
|
90
|
+
coverage: asRecord(resolvedQuote.coverage),
|
|
91
|
+
custom_message: resolvedQuote.custom_message ? asRecord(resolvedQuote.custom_message) : void 0
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
return error(
|
|
96
|
+
formatMercadoLibreError(err, "Failed to fetch MercadoLibre shipping quote by declared dimensions")
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
meliGetShippingQuoteByDeclaredDimensionsHandler,
|
|
102
|
+
meliGetShippingQuoteByDeclaredDimensionsSchema
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=get-shipping-quote-by-declared-dimensions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.ts"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { getMercadoLibreItem } from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport {\n getMercadoLibreDeclaredDimensionsShippingQuote,\n} from \"../../services/mercadolibre/mercadolibre-shipping.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asRecord, normalizeString, toNumber } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nfunction formatDeclaredDimensions(heightCm: number, widthCm: number, lengthCm: number, weightGrams: number) {\n return `${heightCm}x${widthCm}x${lengthCm},${weightGrams}`;\n}\n\nexport const meliGetShippingQuoteByDeclaredDimensionsSchema = z\n .object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre item id used to hydrate price, listing type, shipping and category context.\"),\n heightCm: z.number().int().positive().describe(\"Declared package height in centimeters.\"),\n widthCm: z.number().int().positive().describe(\"Declared package width in centimeters.\"),\n lengthCm: z.number().int().positive().describe(\"Declared package length in centimeters.\"),\n weightGrams: z.number().int().positive().describe(\"Declared package weight in grams.\"),\n itemPrice: z.number().nonnegative().optional().describe(\"Unit item price used for the shipping cost simulation when itemId is not provided or when the item snapshot needs a manual override.\"),\n listingTypeId: z.string().trim().min(1).optional().describe(\"MercadoLibre listing type id used for the shipping cost simulation when itemId is not provided or when the item snapshot needs a manual override.\"),\n mode: z.string().trim().min(1).optional().describe(\"MercadoLibre shipping mode. Defaults to me2.\"),\n logisticType: z.string().trim().min(1).optional().describe(\"MercadoLibre logistic type used for the shipping cost simulation.\"),\n freeShipping: z.boolean().optional().describe(\"Whether the seller wants to simulate free shipping for the buyer.\"),\n currencyId: z.string().trim().min(1).optional().describe(\"Currency id used for the quote. Defaults to ARS.\"),\n condition: z.enum([\"new\", \"used\"]).optional().describe(\"Item condition used for the quote. Defaults to new.\"),\n categoryId: z.string().trim().min(1).optional().describe(\"Optional category id used for the quote when itemId is not provided.\"),\n verbose: z.boolean().optional().describe(\"Whether to request verbose shipping simulation output. Defaults to true.\"),\n tags: z.array(z.string().trim().min(1)).optional().describe(\"Optional MercadoLibre tags to forward to the shipping quote endpoint.\"),\n })\n .refine(\n (params) => Boolean(params.itemId) || (params.itemPrice !== undefined && params.listingTypeId),\n {\n message:\n \"Provide itemId or, when simulating from declared dimensions only, at least itemPrice and listingTypeId.\",\n path: [\"itemPrice\"],\n }\n );\n\nexport async function meliGetShippingQuoteByDeclaredDimensionsHandler(\n params: z.infer<typeof meliGetShippingQuoteByDeclaredDimensionsSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const dimensions = formatDeclaredDimensions(params.heightCm, params.widthCm, params.lengthCm, params.weightGrams);\n\n let itemSnapshot: Record<string, unknown> | null = null;\n if (params.itemId) {\n itemSnapshot = await getMercadoLibreItem(profileId, params.itemId);\n }\n\n const shippingSnapshot = asRecord(itemSnapshot ? asRecord(itemSnapshot).shipping : undefined);\n const hydratedMode = params.mode ?? normalizeString(shippingSnapshot.mode, \"me2\");\n const hydratedCondition = params.condition ?? normalizeString(itemSnapshot?.condition, \"new\");\n const hydratedCurrencyId = params.currencyId ?? (normalizeString(itemSnapshot?.currency_id) || \"ARS\");\n const resolvedQuote = await getMercadoLibreDeclaredDimensionsShippingQuote(profileId, {\n dimensions,\n verbose: params.verbose ?? true,\n itemId: params.itemId,\n itemPrice: params.itemPrice ?? (itemSnapshot ? toNumber(itemSnapshot.price) : undefined),\n listingTypeId: params.listingTypeId ?? normalizeString(itemSnapshot?.listing_type_id),\n mode: hydratedMode || \"me2\",\n condition: hydratedCondition || \"new\",\n logisticType: params.logisticType ?? normalizeString(shippingSnapshot.logistic_type),\n freeShipping: params.freeShipping ?? (shippingSnapshot.free_shipping === true),\n currencyId: hydratedCurrencyId,\n categoryId: params.categoryId ?? normalizeString(itemSnapshot?.category_id),\n tags: params.tags,\n });\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n source: params.itemId ? \"item_hydrated\" : \"declared_dimensions\",\n item_id: params.itemId,\n dimensions,\n height_cm: params.heightCm,\n width_cm: params.widthCm,\n length_cm: params.lengthCm,\n weight_grams: params.weightGrams,\n item_price: params.itemPrice ?? (itemSnapshot ? toNumber(itemSnapshot.price) : undefined),\n listing_type_id: params.listingTypeId ?? normalizeString(itemSnapshot?.listing_type_id),\n mode: hydratedMode || \"me2\",\n logistic_type: params.logisticType ?? normalizeString(shippingSnapshot.logistic_type),\n free_shipping: params.freeShipping ?? (shippingSnapshot.free_shipping === true),\n currency_id: hydratedCurrencyId,\n condition: hydratedCondition || \"new\",\n category_id: params.categoryId ?? normalizeString(itemSnapshot?.category_id),\n verbose: params.verbose ?? true,\n },\n coverage: asRecord(resolvedQuote.coverage),\n custom_message: resolvedQuote.custom_message ? asRecord(resolvedQuote.custom_message) : undefined,\n })\n );\n } catch (err) {\n return error(\n formatMercadoLibreError(err, \"Failed to fetch MercadoLibre shipping quote by declared dimensions\")\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,UAAU,iBAAiB,gBAAgB;AACpD,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AAEjD,SAAS,yBAAyB,UAAkB,SAAiB,UAAkB,aAAqB;AAC1G,SAAO,GAAG,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,WAAW;AAC1D;AAEO,MAAM,iDAAiD,EAC3D,OAAO;AAAA,EACN,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,mGAAmG;AAAA,EACxJ,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,EACxF,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EACtF,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,EACxF,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EACrF,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,sIAAsI;AAAA,EAC9L,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,mJAAmJ;AAAA,EAC/M,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EACjG,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,mEAAmE;AAAA,EAC9H,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mEAAmE;AAAA,EACjH,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,EAC3G,WAAW,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,qDAAqD;AAAA,EAC5G,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,sEAAsE;AAAA,EAC/H,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0EAA0E;AAAA,EACnH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,uEAAuE;AACrI,CAAC,EACA;AAAA,EACC,CAAC,WAAW,QAAQ,OAAO,MAAM,KAAM,OAAO,cAAc,UAAa,OAAO;AAAA,EAChF;AAAA,IACE,SACE;AAAA,IACF,MAAM,CAAC,WAAW;AAAA,EACpB;AACF;AAEF,eAAsB,gDACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,aAAa,yBAAyB,OAAO,UAAU,OAAO,SAAS,OAAO,UAAU,OAAO,WAAW;AAEhH,QAAI,eAA+C;AACnD,QAAI,OAAO,QAAQ;AACjB,qBAAe,MAAM,oBAAoB,WAAW,OAAO,MAAM;AAAA,IACnE;AAEA,UAAM,mBAAmB,SAAS,eAAe,SAAS,YAAY,EAAE,WAAW,MAAS;AAC5F,UAAM,eAAe,OAAO,QAAQ,gBAAgB,iBAAiB,MAAM,KAAK;AAChF,UAAM,oBAAoB,OAAO,aAAa,gBAAgB,cAAc,WAAW,KAAK;AAC5F,UAAM,qBAAqB,OAAO,eAAe,gBAAgB,cAAc,WAAW,KAAK;AAC/F,UAAM,gBAAgB,MAAM,+CAA+C,WAAW;AAAA,MACpF;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO,cAAc,eAAe,SAAS,aAAa,KAAK,IAAI;AAAA,MAC9E,eAAe,OAAO,iBAAiB,gBAAgB,cAAc,eAAe;AAAA,MACpF,MAAM,gBAAgB;AAAA,MACtB,WAAW,qBAAqB;AAAA,MAChC,cAAc,OAAO,gBAAgB,gBAAgB,iBAAiB,aAAa;AAAA,MACnF,cAAc,OAAO,gBAAiB,iBAAiB,kBAAkB;AAAA,MACzE,YAAY;AAAA,MACZ,YAAY,OAAO,cAAc,gBAAgB,cAAc,WAAW;AAAA,MAC1E,MAAM,OAAO;AAAA,IACf,CAAC;AAED,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,QAAQ,OAAO,SAAS,kBAAkB;AAAA,UAC1C,SAAS,OAAO;AAAA,UAChB;AAAA,UACA,WAAW,OAAO;AAAA,UAClB,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,UAClB,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO,cAAc,eAAe,SAAS,aAAa,KAAK,IAAI;AAAA,UAC/E,iBAAiB,OAAO,iBAAiB,gBAAgB,cAAc,eAAe;AAAA,UACtF,MAAM,gBAAgB;AAAA,UACtB,eAAe,OAAO,gBAAgB,gBAAgB,iBAAiB,aAAa;AAAA,UACpF,eAAe,OAAO,gBAAiB,iBAAiB,kBAAkB;AAAA,UAC1E,aAAa;AAAA,UACb,WAAW,qBAAqB;AAAA,UAChC,aAAa,OAAO,cAAc,gBAAgB,cAAc,WAAW;AAAA,UAC3E,SAAS,OAAO,WAAW;AAAA,QAC7B;AAAA,QACA,UAAU,SAAS,cAAc,QAAQ;AAAA,QACzC,gBAAgB,cAAc,iBAAiB,SAAS,cAAc,cAAc,IAAI;AAAA,MAC1F,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,wBAAwB,KAAK,oEAAoE;AAAA,IACnG;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,6 +2,11 @@ export * from "./get-account-context.js";
|
|
|
2
2
|
export * from "./validate-connection.js";
|
|
3
3
|
export * from "./get-orders-summary.js";
|
|
4
4
|
export * from "./get-order-details.js";
|
|
5
|
+
export * from "./get-order-billing-info.js";
|
|
6
|
+
export * from "./reconcile-buyer-data.js";
|
|
7
|
+
export * from "./reconcile-return-data.js";
|
|
8
|
+
export * from "./reconcile-claim-data.js";
|
|
9
|
+
export * from "./get-payment-details.js";
|
|
5
10
|
export * from "./get-sales-by-item.js";
|
|
6
11
|
export * from "./get-sales-trend.js";
|
|
7
12
|
export * from "./get-shipping-summary.js";
|
|
@@ -9,6 +14,9 @@ export * from "./get-item-visits.js";
|
|
|
9
14
|
export * from "./get-store-performance.js";
|
|
10
15
|
export * from "./search-items.js";
|
|
11
16
|
export * from "./get-item-details.js";
|
|
17
|
+
export * from "./get-pack-context-by-order.js";
|
|
18
|
+
export * from "./get-bundle-context-by-item.js";
|
|
19
|
+
export * from "./get-shipping-quote-by-declared-dimensions.js";
|
|
12
20
|
export * from "./get-listing-quality.js";
|
|
13
21
|
export * from "./predict-category.js";
|
|
14
22
|
export * from "./get-category-requirements.js";
|
|
@@ -24,4 +32,28 @@ export * from "./answer-question.js";
|
|
|
24
32
|
export * from "./profile-resolution.js";
|
|
25
33
|
export * from "./get-site-categories-and-listing-types.js";
|
|
26
34
|
export * from "./get-billing-provisions-summary.js";
|
|
35
|
+
import {
|
|
36
|
+
meliGetBillingProvisionsByOrderHandler,
|
|
37
|
+
meliGetBillingProvisionsByOrderSchema,
|
|
38
|
+
ordersSchema,
|
|
39
|
+
paymentInfoSchema,
|
|
40
|
+
detailsSchema,
|
|
41
|
+
detailsSalesSchema,
|
|
42
|
+
detailsItemsSchema
|
|
43
|
+
} from "./get-billing-provisions-by-order.js";
|
|
44
|
+
export * from "./get-full-storage-charges.js";
|
|
45
|
+
export * from "./get-product-ads-advertisers.js";
|
|
46
|
+
export * from "./get-product-ads-ad-group-ads.js";
|
|
47
|
+
export * from "./search-product-ads-ad-groups.js";
|
|
48
|
+
export * from "./search-product-ads-campaigns.js";
|
|
49
|
+
export * from "./search-product-ads-ads.js";
|
|
50
|
+
export {
|
|
51
|
+
detailsItemsSchema as billingProvisionsByOrderDetailsItemsSchema,
|
|
52
|
+
detailsSalesSchema as billingProvisionsByOrderDetailsSalesSchema,
|
|
53
|
+
detailsSchema as billingProvisionsByOrderDetailsSchema,
|
|
54
|
+
meliGetBillingProvisionsByOrderHandler,
|
|
55
|
+
meliGetBillingProvisionsByOrderSchema,
|
|
56
|
+
ordersSchema,
|
|
57
|
+
paymentInfoSchema
|
|
58
|
+
};
|
|
27
59
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from \"./get-account-context.js\";\nexport * from \"./validate-connection.js\";\nexport * from \"./get-orders-summary.js\";\nexport * from \"./get-order-details.js\";\nexport * from \"./get-sales-by-item.js\";\nexport * from \"./get-sales-trend.js\";\nexport * from \"./get-shipping-summary.js\";\nexport * from \"./get-item-visits.js\";\nexport * from \"./get-store-performance.js\";\nexport * from \"./search-items.js\";\nexport * from \"./get-item-details.js\";\nexport * from \"./get-listing-quality.js\";\nexport * from \"./predict-category.js\";\nexport * from \"./get-category-requirements.js\";\nexport * from \"./estimate-listing-fee.js\";\nexport * from \"./estimate-product-profitability.js\";\nexport * from \"./create-item.js\";\nexport * from \"./update-item-basic-fields.js\";\nexport * from \"./update-item-description.js\";\nexport * from \"./update-item-pictures.js\";\nexport * from \"./pause-or-reactivate-item.js\";\nexport * from \"./search-questions.js\";\nexport * from \"./answer-question.js\";\nexport * from \"./profile-resolution.js\";\nexport * from \"./get-site-categories-and-listing-types.js\";\nexport * from \"./get-billing-provisions-summary.js\";\n"],
|
|
5
|
-
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
4
|
+
"sourcesContent": ["export * from \"./get-account-context.js\";\nexport * from \"./validate-connection.js\";\nexport * from \"./get-orders-summary.js\";\nexport * from \"./get-order-details.js\";\nexport * from \"./get-order-billing-info.js\";\nexport * from \"./reconcile-buyer-data.js\";\nexport * from \"./reconcile-return-data.js\";\nexport * from \"./reconcile-claim-data.js\";\nexport * from \"./get-payment-details.js\";\nexport * from \"./get-sales-by-item.js\";\nexport * from \"./get-sales-trend.js\";\nexport * from \"./get-shipping-summary.js\";\nexport * from \"./get-item-visits.js\";\nexport * from \"./get-store-performance.js\";\nexport * from \"./search-items.js\";\nexport * from \"./get-item-details.js\";\nexport * from \"./get-pack-context-by-order.js\";\nexport * from \"./get-bundle-context-by-item.js\";\nexport * from \"./get-shipping-quote-by-declared-dimensions.js\";\nexport * from \"./get-listing-quality.js\";\nexport * from \"./predict-category.js\";\nexport * from \"./get-category-requirements.js\";\nexport * from \"./estimate-listing-fee.js\";\nexport * from \"./estimate-product-profitability.js\";\nexport * from \"./create-item.js\";\nexport * from \"./update-item-basic-fields.js\";\nexport * from \"./update-item-description.js\";\nexport * from \"./update-item-pictures.js\";\nexport * from \"./pause-or-reactivate-item.js\";\nexport * from \"./search-questions.js\";\nexport * from \"./answer-question.js\";\nexport * from \"./profile-resolution.js\";\nexport * from \"./get-site-categories-and-listing-types.js\";\nexport * from \"./get-billing-provisions-summary.js\";\nexport {\n meliGetBillingProvisionsByOrderHandler,\n meliGetBillingProvisionsByOrderSchema,\n ordersSchema,\n paymentInfoSchema,\n detailsSchema as billingProvisionsByOrderDetailsSchema,\n detailsSalesSchema as billingProvisionsByOrderDetailsSalesSchema,\n detailsItemsSchema as billingProvisionsByOrderDetailsItemsSchema,\n} from \"./get-billing-provisions-by-order.js\";\nexport * from \"./get-full-storage-charges.js\";\nexport * from \"./get-product-ads-advertisers.js\";\nexport * from \"./get-product-ads-ad-group-ads.js\";\nexport * from \"./search-product-ads-ad-groups.js\";\nexport * from \"./search-product-ads-campaigns.js\";\nexport * from \"./search-product-ads-ads.js\";\n"],
|
|
5
|
+
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACiB;AAAA,EACK;AAAA,EACA;AAAA,OACjB;AACP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { listMercadoLibreProductAdsAdvertisers } from "../../services/mercadolibre/mercadolibre-product-ads.js";
|
|
4
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
5
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
6
|
+
const mercadolibreProductAdsProfileIdSchemaField = z.string().trim().min(1).optional().describe(
|
|
7
|
+
"Explicit MercadoLibre profile id to use. If omitted, the tool returns a guided selection payload with available active profiles."
|
|
8
|
+
);
|
|
9
|
+
const mercadolibreProductAdsSiteIdSchemaField = z.string().trim().min(1).optional().describe(
|
|
10
|
+
"Explicit MercadoLibre site id to use for Product Ads. If both siteId and advertiserId are provided, the ads search tool uses them directly. If either one is omitted, the tool can resolve a single available advertiser or return a guided selection payload."
|
|
11
|
+
);
|
|
12
|
+
const mercadolibreProductAdsAdvertiserIdSchemaField = z.string().trim().min(1).optional().describe(
|
|
13
|
+
"Explicit MercadoLibre advertiser id to use for Product Ads. If both siteId and advertiserId are provided, the ads search tool uses them directly. If either one is omitted, the tool can resolve a single available advertiser or return a guided selection payload."
|
|
14
|
+
);
|
|
15
|
+
function projectAdvertiser(advertiser) {
|
|
16
|
+
return stripNulls({
|
|
17
|
+
advertiser_id: advertiser.advertiser_id,
|
|
18
|
+
advertiser_site_id: advertiser.advertiser_site_id,
|
|
19
|
+
account_name: advertiser.account_name,
|
|
20
|
+
business_name: advertiser.business_name,
|
|
21
|
+
status: advertiser.status
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function buildProductAdsSelectionResponse(params) {
|
|
25
|
+
const { reason, profileId, availableAdvertisers, siteId, advertiserId } = params;
|
|
26
|
+
const hasAdvertisers = availableAdvertisers.length > 0;
|
|
27
|
+
const zeroAdvertiserMessage = "No Product Ads advertisers are available for this profile yet. Run advertiser discovery again after the account exposes Product Ads advertisers.";
|
|
28
|
+
const messageByReason = {
|
|
29
|
+
missing_profile: "MercadoLibre Product Ads requires an explicit profileId, but no profile was selected.",
|
|
30
|
+
missing_advertiser_context: hasAdvertisers ? "MercadoLibre Product Ads requires a siteId and advertiserId to continue." : zeroAdvertiserMessage,
|
|
31
|
+
incomplete_advertiser_context: hasAdvertisers ? "MercadoLibre Product Ads requires both siteId and advertiserId together. Please provide the missing part of the context." : zeroAdvertiserMessage,
|
|
32
|
+
advertiser_context_not_found: !hasAdvertisers ? zeroAdvertiserMessage : siteId && advertiserId ? `The siteId "${siteId}" and advertiserId "${advertiserId}" do not match any available Product Ads advertiser for this profile.` : "The requested Product Ads advertiser context was not found for this profile.",
|
|
33
|
+
multiple_advertisers_available: "More than one Product Ads advertiser is available for this profile. Please choose one siteId and advertiserId pair."
|
|
34
|
+
};
|
|
35
|
+
const requiredFields = hasAdvertisers ? ["siteId", "advertiserId"] : void 0;
|
|
36
|
+
return object(
|
|
37
|
+
stripNulls({
|
|
38
|
+
selection_required: true,
|
|
39
|
+
reason,
|
|
40
|
+
profile_id: profileId,
|
|
41
|
+
message: messageByReason[reason],
|
|
42
|
+
required_fields: requiredFields,
|
|
43
|
+
available_advertisers: availableAdvertisers.map(projectAdvertiser),
|
|
44
|
+
resolution_hint: hasAdvertisers ? "If you need help choosing a pair, first run the advertiser discovery tool, then pass the selected siteId and advertiserId to the page-mode ads search tool." : "Re-run advertiser discovery after the profile exposes Product Ads advertisers."
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
async function resolveMercadoLibreProductAdsContext(params) {
|
|
49
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
50
|
+
if (!profileResolution.ok) {
|
|
51
|
+
return profileResolution;
|
|
52
|
+
}
|
|
53
|
+
const profileId = profileResolution.value.profileId;
|
|
54
|
+
const availableAdvertisers = await listMercadoLibreProductAdsAdvertisers(profileId);
|
|
55
|
+
const requestedSiteId = params.siteId?.trim();
|
|
56
|
+
const requestedAdvertiserId = params.advertiserId?.trim();
|
|
57
|
+
if (!requestedSiteId && !requestedAdvertiserId) {
|
|
58
|
+
if (availableAdvertisers.length === 1) {
|
|
59
|
+
const [advertiser] = availableAdvertisers;
|
|
60
|
+
return {
|
|
61
|
+
ok: true,
|
|
62
|
+
value: {
|
|
63
|
+
profileId,
|
|
64
|
+
siteId: advertiser.advertiser_site_id,
|
|
65
|
+
advertiserId: advertiser.advertiser_id,
|
|
66
|
+
advertiser,
|
|
67
|
+
availableAdvertisers,
|
|
68
|
+
resolutionMode: "auto_single_match"
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
response: buildProductAdsSelectionResponse({
|
|
75
|
+
reason: availableAdvertisers.length > 0 ? "multiple_advertisers_available" : "missing_advertiser_context",
|
|
76
|
+
profileId,
|
|
77
|
+
availableAdvertisers
|
|
78
|
+
})
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (!requestedSiteId || !requestedAdvertiserId) {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
response: buildProductAdsSelectionResponse({
|
|
85
|
+
reason: "incomplete_advertiser_context",
|
|
86
|
+
profileId,
|
|
87
|
+
availableAdvertisers,
|
|
88
|
+
siteId: requestedSiteId,
|
|
89
|
+
advertiserId: requestedAdvertiserId
|
|
90
|
+
})
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const matchedAdvertiser = availableAdvertisers.find(
|
|
94
|
+
(advertiser) => advertiser.advertiser_site_id === requestedSiteId && advertiser.advertiser_id === requestedAdvertiserId
|
|
95
|
+
);
|
|
96
|
+
if (!matchedAdvertiser) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
response: buildProductAdsSelectionResponse({
|
|
100
|
+
reason: "advertiser_context_not_found",
|
|
101
|
+
profileId,
|
|
102
|
+
availableAdvertisers,
|
|
103
|
+
siteId: requestedSiteId,
|
|
104
|
+
advertiserId: requestedAdvertiserId
|
|
105
|
+
})
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
ok: true,
|
|
110
|
+
value: {
|
|
111
|
+
profileId,
|
|
112
|
+
siteId: matchedAdvertiser.advertiser_site_id,
|
|
113
|
+
advertiserId: matchedAdvertiser.advertiser_id,
|
|
114
|
+
advertiser: matchedAdvertiser,
|
|
115
|
+
availableAdvertisers,
|
|
116
|
+
resolutionMode: "explicit"
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function buildMercadoLibreProductAdsSelectionResponse(params) {
|
|
121
|
+
return buildProductAdsSelectionResponse(params);
|
|
122
|
+
}
|
|
123
|
+
export {
|
|
124
|
+
buildMercadoLibreProductAdsSelectionResponse,
|
|
125
|
+
mercadolibreProductAdsAdvertiserIdSchemaField,
|
|
126
|
+
mercadolibreProductAdsProfileIdSchemaField,
|
|
127
|
+
mercadolibreProductAdsSiteIdSchemaField,
|
|
128
|
+
resolveMercadoLibreProductAdsContext
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=product-ads-helpers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/product-ads-helpers.ts"],
|
|
4
|
+
"sourcesContent": ["import { object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { listMercadoLibreProductAdsAdvertisers, type MercadoLibreProductAdsAdvertiser } from \"../../services/mercadolibre/mercadolibre-product-ads.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\n\nexport const mercadolibreProductAdsProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit MercadoLibre profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n );\n\nexport const mercadolibreProductAdsSiteIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit MercadoLibre site id to use for Product Ads. If both siteId and advertiserId are provided, the ads search tool uses them directly. If either one is omitted, the tool can resolve a single available advertiser or return a guided selection payload.\"\n );\n\nexport const mercadolibreProductAdsAdvertiserIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit MercadoLibre advertiser id to use for Product Ads. If both siteId and advertiserId are provided, the ads search tool uses them directly. If either one is omitted, the tool can resolve a single available advertiser or return a guided selection payload.\"\n );\n\nexport type MercadoLibreProductAdsSelectionReason =\n | \"missing_profile\"\n | \"missing_advertiser_context\"\n | \"incomplete_advertiser_context\"\n | \"advertiser_context_not_found\"\n | \"multiple_advertisers_available\";\n\nexport interface MercadoLibreProductAdsContext {\n profileId: string;\n siteId: string;\n advertiserId: string;\n advertiser: MercadoLibreProductAdsAdvertiser | null;\n availableAdvertisers: MercadoLibreProductAdsAdvertiser[];\n resolutionMode: \"explicit\" | \"auto_single_match\";\n}\n\nexport type MercadoLibreProductAdsContextResolutionResult =\n | { ok: true; value: MercadoLibreProductAdsContext }\n | { ok: false; response: ReturnType<typeof object<Record<string, unknown>>> };\n\nfunction projectAdvertiser(advertiser: MercadoLibreProductAdsAdvertiser) {\n return stripNulls({\n advertiser_id: advertiser.advertiser_id,\n advertiser_site_id: advertiser.advertiser_site_id,\n account_name: advertiser.account_name,\n business_name: advertiser.business_name,\n status: advertiser.status,\n });\n}\n\nfunction buildProductAdsSelectionResponse(params: {\n reason: MercadoLibreProductAdsSelectionReason;\n profileId: string;\n availableAdvertisers: MercadoLibreProductAdsAdvertiser[];\n siteId?: string;\n advertiserId?: string;\n}) {\n const { reason, profileId, availableAdvertisers, siteId, advertiserId } = params;\n const hasAdvertisers = availableAdvertisers.length > 0;\n const zeroAdvertiserMessage =\n \"No Product Ads advertisers are available for this profile yet. Run advertiser discovery again after the account exposes Product Ads advertisers.\";\n const messageByReason: Record<MercadoLibreProductAdsSelectionReason, string> = {\n missing_profile:\n \"MercadoLibre Product Ads requires an explicit profileId, but no profile was selected.\",\n missing_advertiser_context: hasAdvertisers\n ? \"MercadoLibre Product Ads requires a siteId and advertiserId to continue.\"\n : zeroAdvertiserMessage,\n incomplete_advertiser_context: hasAdvertisers\n ? \"MercadoLibre Product Ads requires both siteId and advertiserId together. Please provide the missing part of the context.\"\n : zeroAdvertiserMessage,\n advertiser_context_not_found:\n !hasAdvertisers\n ? zeroAdvertiserMessage\n : siteId && advertiserId\n ? `The siteId \"${siteId}\" and advertiserId \"${advertiserId}\" do not match any available Product Ads advertiser for this profile.`\n : \"The requested Product Ads advertiser context was not found for this profile.\",\n multiple_advertisers_available:\n \"More than one Product Ads advertiser is available for this profile. Please choose one siteId and advertiserId pair.\",\n };\n\n const requiredFields = hasAdvertisers ? [\"siteId\", \"advertiserId\"] : undefined;\n\n return object(\n stripNulls({\n selection_required: true,\n reason,\n profile_id: profileId,\n message: messageByReason[reason],\n required_fields: requiredFields,\n available_advertisers: availableAdvertisers.map(projectAdvertiser),\n resolution_hint: hasAdvertisers\n ? \"If you need help choosing a pair, first run the advertiser discovery tool, then pass the selected siteId and advertiserId to the page-mode ads search tool.\"\n : \"Re-run advertiser discovery after the profile exposes Product Ads advertisers.\",\n })\n );\n}\n\nexport async function resolveMercadoLibreProductAdsContext(params: {\n profileId?: string;\n siteId?: string;\n advertiserId?: string;\n}): Promise<MercadoLibreProductAdsContextResolutionResult> {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution;\n }\n\n const profileId = profileResolution.value.profileId;\n const availableAdvertisers = await listMercadoLibreProductAdsAdvertisers(profileId);\n const requestedSiteId = params.siteId?.trim();\n const requestedAdvertiserId = params.advertiserId?.trim();\n\n if (!requestedSiteId && !requestedAdvertiserId) {\n if (availableAdvertisers.length === 1) {\n const [advertiser] = availableAdvertisers;\n return {\n ok: true,\n value: {\n profileId,\n siteId: advertiser.advertiser_site_id,\n advertiserId: advertiser.advertiser_id,\n advertiser,\n availableAdvertisers,\n resolutionMode: \"auto_single_match\",\n },\n };\n }\n\n return {\n ok: false,\n response: buildProductAdsSelectionResponse({\n reason: availableAdvertisers.length > 0 ? \"multiple_advertisers_available\" : \"missing_advertiser_context\",\n profileId,\n availableAdvertisers,\n }),\n };\n }\n\n if (!requestedSiteId || !requestedAdvertiserId) {\n return {\n ok: false,\n response: buildProductAdsSelectionResponse({\n reason: \"incomplete_advertiser_context\",\n profileId,\n availableAdvertisers,\n siteId: requestedSiteId,\n advertiserId: requestedAdvertiserId,\n }),\n };\n }\n\n const matchedAdvertiser = availableAdvertisers.find(\n (advertiser) =>\n advertiser.advertiser_site_id === requestedSiteId && advertiser.advertiser_id === requestedAdvertiserId\n );\n\n if (!matchedAdvertiser) {\n return {\n ok: false,\n response: buildProductAdsSelectionResponse({\n reason: \"advertiser_context_not_found\",\n profileId,\n availableAdvertisers,\n siteId: requestedSiteId,\n advertiserId: requestedAdvertiserId,\n }),\n };\n }\n\n return {\n ok: true,\n value: {\n profileId,\n siteId: matchedAdvertiser.advertiser_site_id,\n advertiserId: matchedAdvertiser.advertiser_id,\n advertiser: matchedAdvertiser,\n availableAdvertisers,\n resolutionMode: \"explicit\",\n },\n };\n}\n\nexport function buildMercadoLibreProductAdsSelectionResponse(params: {\n reason: MercadoLibreProductAdsSelectionReason;\n profileId: string;\n availableAdvertisers: MercadoLibreProductAdsAdvertiser[];\n siteId?: string;\n advertiserId?: string;\n}) {\n return buildProductAdsSelectionResponse(params);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|