@carrierllc/mcp 0.2.17 → 0.2.19
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 +21 -1
- package/dist/cli.js +893 -80
- package/dist/cli.js.map +1 -1
- package/dist/index.js +213 -36
- package/dist/index.js.map +1 -1
- package/package.json +10 -9
- package/plugin/.claude-plugin/marketplace.json +2 -2
- package/plugin/carrier/.claude-plugin/plugin.json +1 -1
- package/plugin/carrier/README.md +31 -4
- package/plugin/carrier/agents/carrier-billing-auditor.md +1 -1
- package/plugin/carrier/commands/billing.md +8 -1
- package/plugin/carrier/commands/provision.md +18 -8
- package/plugin/carrier/commands/wallet.md +31 -0
- package/plugin/carrier/skills/carrier-operations/SKILL.md +12 -5
- package/templates/storefront/package-lock.json +12722 -0
- package/templates/storefront/package.json +3 -3
- package/templates/storefront/src/app/activate/[orderId]/ActivateClient.tsx +125 -0
- package/templates/storefront/src/app/activate/[orderId]/page.tsx +16 -12
- package/templates/storefront/src/app/api/checkout/claim/route.ts +30 -0
- package/templates/storefront/src/app/api/checkout/guest/route.ts +91 -0
- package/templates/storefront/src/app/api/profile/phone/route.ts +40 -0
- package/templates/storefront/src/app/checkout/[templateId]/CheckoutClient.tsx +71 -13
- package/templates/storefront/src/app/checkout/success/CheckoutSuccessClient.tsx +415 -0
- package/templates/storefront/src/app/checkout/success/page.tsx +59 -0
- package/templates/storefront/src/app/sign-up/[[...sign-up]]/StorefrontSignUpClient.tsx +199 -0
- package/templates/storefront/src/app/sign-up/[[...sign-up]]/page.tsx +18 -3
- package/templates/storefront/src/lib/checkout-order-claim.ts +141 -0
- package/templates/storefront/src/lib/complete-email-sign-up.ts +50 -0
- package/templates/storefront/src/lib/verify-checkout-session.ts +70 -0
- package/templates/storefront/src/middleware.ts +6 -0
package/dist/index.js
CHANGED
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
6
|
|
|
7
|
-
//
|
|
8
|
-
import { z } from "zod";
|
|
9
|
-
import * as Sentry from "@sentry/cloudflare";
|
|
10
|
-
|
|
11
|
-
// ../../packages/ocs-client/dist/chunk-67QO5NVD.js
|
|
7
|
+
// ../../packages/ocs-client/dist/chunk-PMFMORPK.js
|
|
12
8
|
var ENDPOINT_LIMITS_PER_MIN = {
|
|
13
9
|
// Global sentinel (keyed as "__global__")
|
|
14
10
|
__global__: 600,
|
|
@@ -20,7 +16,7 @@ var ENDPOINT_LIMITS_PER_MIN = {
|
|
|
20
16
|
listLocationZoneElement: 150,
|
|
21
17
|
sendMtSms: 150,
|
|
22
18
|
// 300/min (explicit; also the fallback default)
|
|
23
|
-
|
|
19
|
+
modifySubscriberMobilePlan: 300,
|
|
24
20
|
affectRecurringPackageToSubscriber: 300,
|
|
25
21
|
affectSubscriberFakePhoneNumber: 300,
|
|
26
22
|
affectSubscriberRealPhoneNumber: 300,
|
|
@@ -169,6 +165,38 @@ function getRateLimitWindowCounts(resellerKey, endpoint) {
|
|
|
169
165
|
return { calls_in_window, batch_calls_in_window };
|
|
170
166
|
}
|
|
171
167
|
|
|
168
|
+
// ../../packages/ocs-client/dist/chunk-W6L6SMW5.js
|
|
169
|
+
var OCS_MAX_USAGE_WINDOW_DAYS = 7;
|
|
170
|
+
function clampUsagePeriod(start, end, maxDays = OCS_MAX_USAGE_WINDOW_DAYS) {
|
|
171
|
+
const endMs = Date.parse(`${end}T00:00:00Z`);
|
|
172
|
+
const startMs = Date.parse(`${start}T00:00:00Z`);
|
|
173
|
+
if (Number.isNaN(endMs) || Number.isNaN(startMs) || startMs > endMs) {
|
|
174
|
+
return { start, end };
|
|
175
|
+
}
|
|
176
|
+
const minStartMs = endMs - (maxDays - 1) * 864e5;
|
|
177
|
+
if (startMs < minStartMs) {
|
|
178
|
+
return { start: new Date(minStartMs).toISOString().slice(0, 10), end };
|
|
179
|
+
}
|
|
180
|
+
return { start, end };
|
|
181
|
+
}
|
|
182
|
+
function locationParams(iccid) {
|
|
183
|
+
return { iccid };
|
|
184
|
+
}
|
|
185
|
+
function subscriberIdParams(iccid) {
|
|
186
|
+
return { iccid };
|
|
187
|
+
}
|
|
188
|
+
function networkEventsOverPeriodParams(iccid, start, end) {
|
|
189
|
+
return usageOverPeriodParams(iccid, start, end);
|
|
190
|
+
}
|
|
191
|
+
function usageOverPeriodParams(iccid, start, end) {
|
|
192
|
+
const period = clampUsagePeriod(start, end);
|
|
193
|
+
return { subscriber: { iccid }, period };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// src/tools.ts
|
|
197
|
+
import { z } from "zod";
|
|
198
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
199
|
+
|
|
172
200
|
// src/client.ts
|
|
173
201
|
var OcsApiError2 = class extends Error {
|
|
174
202
|
constructor(code, message, method) {
|
|
@@ -389,7 +417,9 @@ var DESTRUCTIVE_TOOLS = /* @__PURE__ */ new Set([
|
|
|
389
417
|
"modify_subscriber_package_active_period",
|
|
390
418
|
"modify_subscriber_voip_plan",
|
|
391
419
|
"push_steering_to_subscriber",
|
|
392
|
-
"reset_subscriber_gz_counter"
|
|
420
|
+
"reset_subscriber_gz_counter",
|
|
421
|
+
// S6 live-smoke gap fill (CAR-105)
|
|
422
|
+
"change_network_profile_of_location_zone"
|
|
393
423
|
]);
|
|
394
424
|
function wrapHandler(toolName, ocsMethod, requiredScope, ctx, handler) {
|
|
395
425
|
return async (args) => {
|
|
@@ -567,9 +597,7 @@ function registerAllTools(server2, ctx) {
|
|
|
567
597
|
TOOL_SCOPES["modify_account_balance"],
|
|
568
598
|
ctx,
|
|
569
599
|
async ({ accountId, amount, mode }, token2) => {
|
|
570
|
-
const params = { accountId };
|
|
571
|
-
if (mode === "adapt") params.adaptBalance = amount;
|
|
572
|
-
else params.setBalance = amount;
|
|
600
|
+
const params = { accountId, amount, mode };
|
|
573
601
|
return ocsCall(ctx.env, token2, "modifyAccountBalance", params);
|
|
574
602
|
}
|
|
575
603
|
)
|
|
@@ -864,7 +892,7 @@ function registerAllTools(server2, ctx) {
|
|
|
864
892
|
"getSubscriberLocation",
|
|
865
893
|
TOOL_SCOPES["get_subscriber_location"],
|
|
866
894
|
ctx,
|
|
867
|
-
async ({ iccid }, token2) => ocsCall(ctx.env, token2, "getSubscriberLocation",
|
|
895
|
+
async ({ iccid }, token2) => ocsCall(ctx.env, token2, "getSubscriberLocation", locationParams(iccid))
|
|
868
896
|
)
|
|
869
897
|
);
|
|
870
898
|
server2.registerTool(
|
|
@@ -1530,10 +1558,7 @@ function registerAllTools(server2, ctx) {
|
|
|
1530
1558
|
"subscriberUsageOverPeriod",
|
|
1531
1559
|
TOOL_SCOPES["subscriber_usage"],
|
|
1532
1560
|
ctx,
|
|
1533
|
-
async ({ iccid, startDate, endDate }, token2) => ocsCall(ctx.env, token2, "subscriberUsageOverPeriod",
|
|
1534
|
-
subscriber: { iccid },
|
|
1535
|
-
period: { start: startDate, end: endDate }
|
|
1536
|
-
})
|
|
1561
|
+
async ({ iccid, startDate, endDate }, token2) => ocsCall(ctx.env, token2, "subscriberUsageOverPeriod", usageOverPeriodParams(iccid, startDate, endDate))
|
|
1537
1562
|
)
|
|
1538
1563
|
);
|
|
1539
1564
|
server2.registerTool(
|
|
@@ -1553,10 +1578,7 @@ function registerAllTools(server2, ctx) {
|
|
|
1553
1578
|
"subscriberNetworkEventsOverPeriod",
|
|
1554
1579
|
TOOL_SCOPES["subscriber_network_events"],
|
|
1555
1580
|
ctx,
|
|
1556
|
-
async ({ iccid, startDate, endDate }, token2) => ocsCall(ctx.env, token2, "subscriberNetworkEventsOverPeriod",
|
|
1557
|
-
subscriber: { iccid },
|
|
1558
|
-
period: { start: startDate, end: endDate }
|
|
1559
|
-
})
|
|
1581
|
+
async ({ iccid, startDate, endDate }, token2) => ocsCall(ctx.env, token2, "subscriberNetworkEventsOverPeriod", networkEventsOverPeriodParams(iccid, startDate, endDate))
|
|
1560
1582
|
)
|
|
1561
1583
|
);
|
|
1562
1584
|
server2.registerTool(
|
|
@@ -1572,7 +1594,7 @@ function registerAllTools(server2, ctx) {
|
|
|
1572
1594
|
"getSubscriberActivePeriod",
|
|
1573
1595
|
TOOL_SCOPES["subscriber_active_period"],
|
|
1574
1596
|
ctx,
|
|
1575
|
-
async ({ iccid }, token2) => ocsCall(ctx.env, token2, "getSubscriberActivePeriod",
|
|
1597
|
+
async ({ iccid }, token2) => ocsCall(ctx.env, token2, "getSubscriberActivePeriod", subscriberIdParams(iccid))
|
|
1576
1598
|
)
|
|
1577
1599
|
);
|
|
1578
1600
|
server2.registerTool(
|
|
@@ -2395,12 +2417,27 @@ var ocs_methods_default = {
|
|
|
2395
2417
|
name: "high_cost_subscribers",
|
|
2396
2418
|
category: "intelligence",
|
|
2397
2419
|
scope: "read",
|
|
2420
|
+
http_method: "POST",
|
|
2421
|
+
url_path: "/v1/intelligence/high-cost-subscribers",
|
|
2398
2422
|
description: "Identify highest-cost subscribers for cost optimization",
|
|
2399
2423
|
wraps: ["listSubscriber", "subscriberUsageOverPeriod", "getCustomerTariff"],
|
|
2400
2424
|
params: {
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2425
|
+
start: { type: "string(YYYY-MM-DD)", required: false, default: "first day of current month" },
|
|
2426
|
+
end: { type: "string(YYYY-MM-DD)", required: false, default: "today" },
|
|
2427
|
+
limit: { type: "number", required: false, default: 20, max: 200 }
|
|
2428
|
+
},
|
|
2429
|
+
verified_against_server: true,
|
|
2430
|
+
verified_against_live_docs: false
|
|
2431
|
+
},
|
|
2432
|
+
{
|
|
2433
|
+
name: "detect_country_entry",
|
|
2434
|
+
category: "intelligence",
|
|
2435
|
+
scope: "read",
|
|
2436
|
+
description: "Detect subscriber country entry via getSingleSubscriber networkInfo.lastMcc (one OCS call). Resolves MCC to ISO 3166-1 alpha-2 and optionally diffs against expectedCountry.",
|
|
2437
|
+
wraps: ["getSingleSubscriber"],
|
|
2438
|
+
params: {
|
|
2439
|
+
subscriber: { type: "object(subscriberId|imsi|iccid|msisdn|multiImsi|activationCode)", required: true },
|
|
2440
|
+
expectedCountry: { type: "string(ISO3166-1 alpha-2)", required: false }
|
|
2404
2441
|
},
|
|
2405
2442
|
verified_against_server: true,
|
|
2406
2443
|
verified_against_live_docs: false
|
|
@@ -2539,10 +2576,10 @@ var ocs_methods_default = {
|
|
|
2539
2576
|
ocs_method: "getSubscriberLocationByCellId",
|
|
2540
2577
|
category: "subscriber",
|
|
2541
2578
|
scope: "read",
|
|
2542
|
-
status: "
|
|
2579
|
+
status: "obsolete",
|
|
2543
2580
|
audit_pr: "feat/ocs-feature-audit",
|
|
2544
2581
|
audit_stub_id: "S-03",
|
|
2545
|
-
description: "
|
|
2582
|
+
description: "OBSOLETE \u2014 duplicate of implemented get_subscriber_location_by_cell_id (same OCS method + cell tuple). Do not register. Use get_subscriber_location_by_cell_id for GeoSense cell-tower resolution.",
|
|
2546
2583
|
params: {
|
|
2547
2584
|
radio_type: { type: "enum[2G,3G,4G,5G,NB-IoT]", required: true },
|
|
2548
2585
|
mcc: { type: "integer", required: true },
|
|
@@ -2557,7 +2594,7 @@ var ocs_methods_default = {
|
|
|
2557
2594
|
accuracy: { type: "integer", notes: "median error in meters at 50% confidence" }
|
|
2558
2595
|
},
|
|
2559
2596
|
annotations: "readOnlyHint",
|
|
2560
|
-
|
|
2597
|
+
superseded_by: "get_subscriber_location_by_cell_id",
|
|
2561
2598
|
verified_against_server: false,
|
|
2562
2599
|
verified_against_live_docs: true
|
|
2563
2600
|
},
|
|
@@ -2566,7 +2603,7 @@ var ocs_methods_default = {
|
|
|
2566
2603
|
ocs_method: "getResellerInfo",
|
|
2567
2604
|
category: "reseller",
|
|
2568
2605
|
scope: "read",
|
|
2569
|
-
status: "
|
|
2606
|
+
status: "implemented",
|
|
2570
2607
|
audit_pr: "feat/ocs-feature-audit",
|
|
2571
2608
|
audit_stub_id: "S-04",
|
|
2572
2609
|
description: "Read-only view of Bridge4IP webhook and relay flag state from getResellerInfo.trafficInfo. Surfaces relayLU, relayGy, relayCallSms, relayVoIP booleans + notification webhook types. Relay LU is the key flag for event-driven country-change detection (vs polling). Relay endpoint config is OCS portal UI-only.",
|
|
@@ -2581,8 +2618,57 @@ var ocs_methods_default = {
|
|
|
2581
2618
|
notification_webhooks: { type: "array", notes: "Active notification types: prepaid_usage, low_credit, esim_status, recurring_packages" }
|
|
2582
2619
|
},
|
|
2583
2620
|
annotations: "readOnlyHint",
|
|
2584
|
-
verified_against_server:
|
|
2621
|
+
verified_against_server: true,
|
|
2585
2622
|
verified_against_live_docs: true
|
|
2623
|
+
},
|
|
2624
|
+
{
|
|
2625
|
+
name: "list_subscriber_voip_tariff",
|
|
2626
|
+
ocs_method: "listSubscriberVoipTariff",
|
|
2627
|
+
category: "tariff",
|
|
2628
|
+
scope: "read",
|
|
2629
|
+
status: "implemented",
|
|
2630
|
+
description: "List VoIP tariff definitions available to a reseller (smoke-verified OCS method; not on public docs SPA). Optional resellerId filter; omit for token owner's default catalog. Companion to list_voip_tariff_rule for rule detail.",
|
|
2631
|
+
params: {
|
|
2632
|
+
reseller_id: { type: "number", required: false }
|
|
2633
|
+
},
|
|
2634
|
+
annotations: "readOnlyHint",
|
|
2635
|
+
verified_against_server: true,
|
|
2636
|
+
verified_against_live_docs: false,
|
|
2637
|
+
verified_against_live_smoke: true,
|
|
2638
|
+
notes: "Live probe 2026-07-10: only known request property is resellerId (object). Empty object accepted (code 0)."
|
|
2639
|
+
},
|
|
2640
|
+
{
|
|
2641
|
+
name: "list_voip_tariff_rule",
|
|
2642
|
+
ocs_method: "listVoipTariffRule",
|
|
2643
|
+
category: "tariff",
|
|
2644
|
+
scope: "read",
|
|
2645
|
+
status: "implemented",
|
|
2646
|
+
description: "List rate rules for a VoIP plan/tariff by bare integer id (smoke-verified; not on public docs SPA). OCS expects a primitive integer body (same pattern as getCustomerTariff), not an object. Use plan ids from get_reseller_info chargingInfo.voipPlan or list_subscriber_voip_tariff.",
|
|
2647
|
+
params: {
|
|
2648
|
+
voip_plan_id: { type: "number", required: true }
|
|
2649
|
+
},
|
|
2650
|
+
annotations: "readOnlyHint",
|
|
2651
|
+
verified_against_server: true,
|
|
2652
|
+
verified_against_live_docs: false,
|
|
2653
|
+
verified_against_live_smoke: true,
|
|
2654
|
+
notes: "Live probe 2026-07-10: object body rejected (expects java.lang.Integer); unknown id \u2192 OCS 6 No VoIP plan found."
|
|
2655
|
+
},
|
|
2656
|
+
{
|
|
2657
|
+
name: "change_network_profile_of_location_zone",
|
|
2658
|
+
ocs_method: "changeNetworkProfileOfLocationZone",
|
|
2659
|
+
category: "network",
|
|
2660
|
+
scope: "write",
|
|
2661
|
+
status: "implemented",
|
|
2662
|
+
description: "Attach or change the network profile on an existing location zone (smoke-verified; not on public docs SPA). Required fields: locationZoneId + networkProfileId. Use list_network_profiles and list_detailed_location_zones to resolve ids.",
|
|
2663
|
+
params: {
|
|
2664
|
+
location_zone_id: { type: "number", required: true },
|
|
2665
|
+
network_profile_id: { type: "number", required: true }
|
|
2666
|
+
},
|
|
2667
|
+
annotations: "destructiveHint",
|
|
2668
|
+
verified_against_server: true,
|
|
2669
|
+
verified_against_live_docs: false,
|
|
2670
|
+
verified_against_live_smoke: true,
|
|
2671
|
+
notes: "Live probe 2026-07-10: known properties locationZoneId, networkProfileId; missing networkProfileId \u2192 code 2 Missing 'networkProfileId'."
|
|
2586
2672
|
}
|
|
2587
2673
|
],
|
|
2588
2674
|
v1_app_methods: [
|
|
@@ -4142,8 +4228,11 @@ var VALID_RADIO_TYPES = /* @__PURE__ */ new Set(["2G", "3G", "4G", "5G", "NB-IoT
|
|
|
4142
4228
|
var BACKLOG_TOOL_SCOPES = {
|
|
4143
4229
|
affect_subscriber_phone_number: "write",
|
|
4144
4230
|
carrier_webhook_config: "read",
|
|
4231
|
+
change_network_profile_of_location_zone: "write",
|
|
4145
4232
|
get_subscriber_location_by_cell_id: "read",
|
|
4146
4233
|
list_destination_lists: "read",
|
|
4234
|
+
list_subscriber_voip_tariff: "read",
|
|
4235
|
+
list_voip_tariff_rule: "read",
|
|
4147
4236
|
modify_subscriber_mobile_plan: "write",
|
|
4148
4237
|
modify_subscriber_package_active_period: "write",
|
|
4149
4238
|
modify_subscriber_voip_plan: "write",
|
|
@@ -4445,6 +4534,92 @@ function registerAllBacklogTools(server2, ctx) {
|
|
|
4445
4534
|
}
|
|
4446
4535
|
)
|
|
4447
4536
|
);
|
|
4537
|
+
server2.registerTool(
|
|
4538
|
+
"list_subscriber_voip_tariff",
|
|
4539
|
+
{
|
|
4540
|
+
title: "List VoIP Tariffs",
|
|
4541
|
+
description: "Use this to list VoIP tariff definitions available to a reseller. Despite the OCS method name (listSubscriberVoipTariff), this is a reseller-level catalog listing \u2014 not a per-ICCID lookup. Use results (or get_reseller_info chargingInfo.voipPlan.id) to feed `list_voip_tariff_rule` for rate detail. Params: `reseller_id` (integer, optional \u2014 omit to use the token owner's reseller). Returns: OCS VoIP tariff records (may be empty when no VoIP catalog is configured). Do NOT use this for mobile wholesale rates \u2014 use `get_tariff` (getCustomerTariff). Do NOT use this to assign a VoIP plan \u2014 use `modify_subscriber_voip_plan`.",
|
|
4542
|
+
inputSchema: {
|
|
4543
|
+
reseller_id: z3.number().int().positive().optional().describe("Reseller ID (omit to list tariffs for the token owner's reseller)")
|
|
4544
|
+
},
|
|
4545
|
+
annotations: { readOnlyHint: true }
|
|
4546
|
+
},
|
|
4547
|
+
wrapHandler(
|
|
4548
|
+
"list_subscriber_voip_tariff",
|
|
4549
|
+
"listSubscriberVoipTariff",
|
|
4550
|
+
BACKLOG_TOOL_SCOPES["list_subscriber_voip_tariff"],
|
|
4551
|
+
ctx,
|
|
4552
|
+
async ({ reseller_id }, token2) => {
|
|
4553
|
+
const client = new OcsClient2(ctx.env.CARRIER_OCS_BASE_URL, token2);
|
|
4554
|
+
const params = {};
|
|
4555
|
+
if (reseller_id !== void 0) {
|
|
4556
|
+
params.resellerId = reseller_id;
|
|
4557
|
+
}
|
|
4558
|
+
const result2 = await client.call("listSubscriberVoipTariff", params);
|
|
4559
|
+
return {
|
|
4560
|
+
content: [{ type: "text", text: JSON.stringify(result2, null, 2) }]
|
|
4561
|
+
};
|
|
4562
|
+
}
|
|
4563
|
+
)
|
|
4564
|
+
);
|
|
4565
|
+
server2.registerTool(
|
|
4566
|
+
"list_voip_tariff_rule",
|
|
4567
|
+
{
|
|
4568
|
+
title: "List VoIP Tariff Rules",
|
|
4569
|
+
description: "Use this to list the rate rules (costs) for a specific VoIP plan/tariff. OCS expects a bare integer plan id in the request body (not an object). Obtain plan ids from `get_reseller_info` \u2192 chargingInfo.voipPlan.id, or from `list_subscriber_voip_tariff`. Params: `voip_plan_id` (integer, required \u2014 VoIP plan/tariff id). Returns: VoIP tariff rule rows for that plan, or an OCS error when the id is unknown. Do NOT use this for mobile (non-VoIP) wholesale rates \u2014 use `get_tariff`. Do NOT use this to change a subscriber's VoIP plan \u2014 use `modify_subscriber_voip_plan`.",
|
|
4570
|
+
inputSchema: {
|
|
4571
|
+
voip_plan_id: z3.number().int().positive().describe(
|
|
4572
|
+
"VoIP plan/tariff ID (bare integer to OCS listVoipTariffRule; from get_reseller_info chargingInfo.voipPlan.id or list_subscriber_voip_tariff)"
|
|
4573
|
+
)
|
|
4574
|
+
},
|
|
4575
|
+
annotations: { readOnlyHint: true }
|
|
4576
|
+
},
|
|
4577
|
+
wrapHandler(
|
|
4578
|
+
"list_voip_tariff_rule",
|
|
4579
|
+
"listVoipTariffRule",
|
|
4580
|
+
BACKLOG_TOOL_SCOPES["list_voip_tariff_rule"],
|
|
4581
|
+
ctx,
|
|
4582
|
+
async ({ voip_plan_id }, token2) => {
|
|
4583
|
+
const client = new OcsClient2(ctx.env.CARRIER_OCS_BASE_URL, token2);
|
|
4584
|
+
const result2 = await client.call("listVoipTariffRule", voip_plan_id);
|
|
4585
|
+
return {
|
|
4586
|
+
content: [{ type: "text", text: JSON.stringify(result2, null, 2) }]
|
|
4587
|
+
};
|
|
4588
|
+
}
|
|
4589
|
+
)
|
|
4590
|
+
);
|
|
4591
|
+
server2.registerTool(
|
|
4592
|
+
"change_network_profile_of_location_zone",
|
|
4593
|
+
{
|
|
4594
|
+
title: "Change Network Profile of Location Zone",
|
|
4595
|
+
description: "Use this to attach or change the network profile on an existing location zone. A network profile defines sponsor/roaming configuration used when the zone is referenced by package templates. Params: `location_zone_id` (integer from list_detailed_location_zones), `network_profile_id` (integer from list_network_profiles). Returns: OCS confirmation of the updated zone/profile binding. Do NOT use this to create a new location zone \u2014 use `create_location_zone` (which requires networkProfileId at creation time). Do NOT use this for edit/delete of zone TADIG lists \u2014 those remain UI-agent-only (G-19).",
|
|
4596
|
+
inputSchema: {
|
|
4597
|
+
location_zone_id: z3.number().int().positive().describe("Location zone ID (locationZoneId / zoneId from list_detailed_location_zones)"),
|
|
4598
|
+
network_profile_id: z3.number().int().positive().describe("Network profile ID (from list_network_profiles)"),
|
|
4599
|
+
...DRY_RUN_FIELD2
|
|
4600
|
+
},
|
|
4601
|
+
annotations: { destructiveHint: true }
|
|
4602
|
+
},
|
|
4603
|
+
wrapHandler(
|
|
4604
|
+
"change_network_profile_of_location_zone",
|
|
4605
|
+
"changeNetworkProfileOfLocationZone",
|
|
4606
|
+
BACKLOG_TOOL_SCOPES["change_network_profile_of_location_zone"],
|
|
4607
|
+
ctx,
|
|
4608
|
+
async ({
|
|
4609
|
+
location_zone_id,
|
|
4610
|
+
network_profile_id
|
|
4611
|
+
}, token2) => {
|
|
4612
|
+
const client = new OcsClient2(ctx.env.CARRIER_OCS_BASE_URL, token2);
|
|
4613
|
+
const result2 = await client.call("changeNetworkProfileOfLocationZone", {
|
|
4614
|
+
locationZoneId: location_zone_id,
|
|
4615
|
+
networkProfileId: network_profile_id
|
|
4616
|
+
});
|
|
4617
|
+
return {
|
|
4618
|
+
content: [{ type: "text", text: JSON.stringify(result2, null, 2) }]
|
|
4619
|
+
};
|
|
4620
|
+
}
|
|
4621
|
+
)
|
|
4622
|
+
);
|
|
4448
4623
|
}
|
|
4449
4624
|
|
|
4450
4625
|
// src/tools-carrier-ask.ts
|
|
@@ -5478,7 +5653,7 @@ var MONITORED_ENDPOINTS = [
|
|
|
5478
5653
|
// 150/min
|
|
5479
5654
|
"sendMtSms",
|
|
5480
5655
|
// 150/min
|
|
5481
|
-
"
|
|
5656
|
+
"modifySubscriberMobilePlan",
|
|
5482
5657
|
// 300/min
|
|
5483
5658
|
"affectRecurringPackageToSubscriber",
|
|
5484
5659
|
// 300/min
|
|
@@ -6397,8 +6572,10 @@ function registerBalanceTopupApp(server2, ctx) {
|
|
|
6397
6572
|
const execResult = await safeCallWithToken3(
|
|
6398
6573
|
client,
|
|
6399
6574
|
token2,
|
|
6400
|
-
|
|
6401
|
-
{
|
|
6575
|
+
// CAR-78: subscriber top-up uses modifySubscriberBalance with { subscriber, amount }
|
|
6576
|
+
// (delta). modifyAccountBalance is account-level and expects { accountId, amount, mode }.
|
|
6577
|
+
"modifySubscriberBalance",
|
|
6578
|
+
{ subscriber: iccid, amount: delta }
|
|
6402
6579
|
);
|
|
6403
6580
|
if (execResult.error) {
|
|
6404
6581
|
return {
|
|
@@ -7350,7 +7527,7 @@ var CARRIER_SERVICE_CATALOG = [
|
|
|
7350
7527
|
id: "mcp",
|
|
7351
7528
|
name: "Carrier MCP",
|
|
7352
7529
|
category: "connectivity",
|
|
7353
|
-
description: "Model Context Protocol server \u2014
|
|
7530
|
+
description: "Model Context Protocol server \u2014 113 natural-language tools for MVNO/eSIM fleet management",
|
|
7354
7531
|
tier_required: "free",
|
|
7355
7532
|
scopes_required: ["read"],
|
|
7356
7533
|
endpoints: ["https://mcp.carrier.llc/mcp"],
|
|
@@ -7424,7 +7601,7 @@ var CARRIER_SERVICE_CATALOG = [
|
|
|
7424
7601
|
tier_required: "free",
|
|
7425
7602
|
scopes_required: ["read"],
|
|
7426
7603
|
endpoints: ["https://app.carrier.llc"],
|
|
7427
|
-
docs_url: "https://
|
|
7604
|
+
docs_url: "https://carrier.llc/docs"
|
|
7428
7605
|
}
|
|
7429
7606
|
];
|
|
7430
7607
|
var PROJECTS_TOOLS = [
|
|
@@ -7657,7 +7834,7 @@ var PROJECTS_TOOLS = [
|
|
|
7657
7834
|
auth_method: props2.auth_method ?? "oauth"
|
|
7658
7835
|
},
|
|
7659
7836
|
capabilities: {
|
|
7660
|
-
total_tools:
|
|
7837
|
+
total_tools: 113,
|
|
7661
7838
|
// full tool count
|
|
7662
7839
|
read_tools: 35,
|
|
7663
7840
|
write_tools: 20,
|
|
@@ -7781,7 +7958,7 @@ function generateCredentialRecommendations(hasToken, tokenAgeDays) {
|
|
|
7781
7958
|
const recommendations = [];
|
|
7782
7959
|
if (!hasToken) {
|
|
7783
7960
|
recommendations.push(
|
|
7784
|
-
"No eSIMVault token configured. Complete setup at https://app.carrier.llc/
|
|
7961
|
+
"No eSIMVault token configured. Complete setup at https://app.carrier.llc/onboarding"
|
|
7785
7962
|
);
|
|
7786
7963
|
}
|
|
7787
7964
|
if (tokenAgeDays !== null && tokenAgeDays > 90) {
|
|
@@ -10568,7 +10745,7 @@ var audit = (_row) => {
|
|
|
10568
10745
|
var getUserToken = async (_sub) => token;
|
|
10569
10746
|
var toolCtx = { env: stdioEnv, props, audit, getUserToken };
|
|
10570
10747
|
var server = new McpServer(
|
|
10571
|
-
{ name: "carrier-mcp", version: "0.2.
|
|
10748
|
+
{ name: "carrier-mcp", version: "0.2.19" },
|
|
10572
10749
|
{
|
|
10573
10750
|
instructions: "Carrier MCP \u2014 single-user stdio mode. Full tool registry (mirrors the deployed Worker)."
|
|
10574
10751
|
}
|