@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.
Files changed (30) hide show
  1. package/README.md +21 -1
  2. package/dist/cli.js +893 -80
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.js +213 -36
  5. package/dist/index.js.map +1 -1
  6. package/package.json +10 -9
  7. package/plugin/.claude-plugin/marketplace.json +2 -2
  8. package/plugin/carrier/.claude-plugin/plugin.json +1 -1
  9. package/plugin/carrier/README.md +31 -4
  10. package/plugin/carrier/agents/carrier-billing-auditor.md +1 -1
  11. package/plugin/carrier/commands/billing.md +8 -1
  12. package/plugin/carrier/commands/provision.md +18 -8
  13. package/plugin/carrier/commands/wallet.md +31 -0
  14. package/plugin/carrier/skills/carrier-operations/SKILL.md +12 -5
  15. package/templates/storefront/package-lock.json +12722 -0
  16. package/templates/storefront/package.json +3 -3
  17. package/templates/storefront/src/app/activate/[orderId]/ActivateClient.tsx +125 -0
  18. package/templates/storefront/src/app/activate/[orderId]/page.tsx +16 -12
  19. package/templates/storefront/src/app/api/checkout/claim/route.ts +30 -0
  20. package/templates/storefront/src/app/api/checkout/guest/route.ts +91 -0
  21. package/templates/storefront/src/app/api/profile/phone/route.ts +40 -0
  22. package/templates/storefront/src/app/checkout/[templateId]/CheckoutClient.tsx +71 -13
  23. package/templates/storefront/src/app/checkout/success/CheckoutSuccessClient.tsx +415 -0
  24. package/templates/storefront/src/app/checkout/success/page.tsx +59 -0
  25. package/templates/storefront/src/app/sign-up/[[...sign-up]]/StorefrontSignUpClient.tsx +199 -0
  26. package/templates/storefront/src/app/sign-up/[[...sign-up]]/page.tsx +18 -3
  27. package/templates/storefront/src/lib/checkout-order-claim.ts +141 -0
  28. package/templates/storefront/src/lib/complete-email-sign-up.ts +50 -0
  29. package/templates/storefront/src/lib/verify-checkout-session.ts +70 -0
  30. 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
- // src/tools.ts
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
- affectPlanToSubscriber: 300,
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", { iccid })
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", { iccid })
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
- startDate: { type: "string(YYYY-MM-DD)", required: true },
2402
- endDate: { type: "string(YYYY-MM-DD)", required: true },
2403
- accountId: { type: "number", required: false }
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: "stubbed",
2579
+ status: "obsolete",
2543
2580
  audit_pr: "feat/ocs-feature-audit",
2544
2581
  audit_stub_id: "S-03",
2545
- description: "Resolve a raw cell tower tuple (radioType + MCC + MNC + LAC + optional cellId) to lat/lon via Bridge4IP GeoSense. Does NOT require a subscriber identifier \u2014 caller supplies cell params directly. Lower-level primitive than get_subscriber_location_by_cell_id. Needed for Relay LU webhook consumer.",
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
- blocked_by: "confirm Relay LU payload shape with Bridge4IP NOC",
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: "stubbed",
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: false,
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
- "affectPlanToSubscriber",
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
- "modifyAccountBalance",
6401
- { subscriber: iccid, adaptBalance: delta }
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 103 natural-language tools for MVNO/eSIM fleet management",
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://app.carrier.llc/docs"
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: 103,
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/setup"
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.4" },
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
  }