Skip to main content
Glama

compare_electricity_tariffs

Compare Swiss electricity tariffs across municipalities to find the cheapest options for relocation or cost analysis.

Instructions

Compare Swiss electricity tariffs across multiple municipalities side-by-side. Returns prices sorted from cheapest to most expensive. Useful for relocation decisions or cost analysis.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
municipalitiesYesArray of municipality BFS numbers to compare (e.g. ['261', '351', '6621']). Max 20. Use search_municipality_energy to find IDs.
categoryNoElectricity category (H1–H8, C1–C7). Default: H4.
yearNoTariff year (2011–2026). Default: 2026.

Implementation Reference

  • Implementation of the compare_electricity_tariffs tool handler in src/modules/energy.ts.
    case "compare_electricity_tariffs": {
      const municipalities = args.municipalities as string[];
      const category = (args.category as string | undefined) ?? "H4";
      const year = (args.year as string | undefined) ?? CURRENT_YEAR;
    
      if (!Array.isArray(municipalities) || municipalities.length < 2) {
        throw new Error("At least 2 municipality IDs are required for comparison.");
      }
      if (municipalities.length > 20) {
        throw new Error("Maximum 20 municipalities can be compared at once.");
      }
    
      const query = `
        query Observations($locale: String!, $priceComponent: PriceComponent!, $filters: ObservationFilters!) {
          observations(locale: $locale, filters: $filters) {
            period
            municipality
            municipalityLabel
            operator
            operatorLabel
            canton
            cantonLabel
            category
            value(priceComponent: $priceComponent)
            coverageRatio
          }
        }
      `;
    
      const data = await gql<{ observations: Observation[] }>(query, {
        locale: "de",
        priceComponent: "total",
        filters: {
          period: [year],
          municipality: municipalities,
          category: [category],
        },
      });
    
      const observations = data.observations ?? [];
    
      if (!observations.length) {
        return JSON.stringify({
          error: "No tariff data found for the given municipalities",
          municipalities,
          category,
          year,
          hint: "Use search_municipality_energy to verify BFS numbers.",
          source: "https://www.strompreis.elcom.admin.ch",
        }, null, 2);
      }
    
      // Deduplicate by municipality (keep first/cheapest operator if multiple)
      const byMunicipality = new Map<string, Observation>();
      for (const obs of observations) {
        const existing = byMunicipality.get(obs.municipality);
        if (!existing || (obs.value !== null && (existing.value === null || obs.value < existing.value))) {
          byMunicipality.set(obs.municipality, obs);
        }
      }
    
      // Sort by total price ascending
      const sorted = [...byMunicipality.values()].sort((a, b) => {
        if (a.value === null) return 1;
        if (b.value === null) return -1;
        return a.value - b.value;
      });
    
      const results = sorted.map((obs, idx) => ({
        rank: idx + 1,
        municipality: obs.municipalityLabel,
        municipalityId: obs.municipality,
        canton: obs.cantonLabel,
        operator: obs.operatorLabel,
        total_rp_per_kwh: obs.value,
        year,
        category,
      }));
    
      // Find municipalities not found in results
      const foundIds = new Set(observations.map((o) => o.municipality));
      const notFound = municipalities.filter((m) => !foundIds.has(m));
    
      const cheapest = results[0];
      const mostExpensive = results[results.length - 1];
      const spread =
        cheapest && mostExpensive && cheapest.total_rp_per_kwh !== null && mostExpensive.total_rp_per_kwh !== null
          ? +(mostExpensive.total_rp_per_kwh - cheapest.total_rp_per_kwh).toFixed(3)
          : null;
    
      return JSON.stringify(
        {
          comparison: results,
          summary: {
            cheapest: cheapest.municipality,
            most_expensive: mostExpensive.municipality,
            spread_rp_per_kwh: spread,
            category,
            categoryDescription: CATEGORY_DESCRIPTIONS[category] ?? category,
            year,
            note: "Prices in Rappen per kWh. Multiple operators per municipality: cheapest shown.",
          },
          notFound: notFound.length ? notFound : undefined,
          source: "https://www.strompreis.elcom.admin.ch",
        },
        null,
        2
      );
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vikramgorla/mcp-swiss'

If you have feedback or need assistance with the MCP directory API, please join our Discord server