Ana içeriğe atla
Bu kılavuz geliştiriciler ve teknik bilgiye sahip kullanıcılar içindir. MCP sunucusunu kurabilmek için Node.js, terminal kullanımı ve yapılandırma dosyaları hakkında temel bilgi gerekmektedir.

57 Araç

iklim.co API”sinin tüm yetenekleri MCP aracı olarak sunulur — yıldırım, fırtına, yağış, tahmin, alarmlar ve daha fazlası.

Otomatik Auth

JWT token”lar otomatik olarak alınır ve yenilenir. Kimlik bilgilerinizi girin, gerisini sunucu halleder.

HMAC İmzalı

Her istek HMAC-SHA256 ile imzalanır. Kimlik bilgileri düz metin olarak iletilmez; istek başına tekil nonce ile replay saldırıları engellenir.

Genel Bakış

iklim.co MCP Sunucusu, Model Context Protocol standardını uygular ve iklim.co REST API’sinin tamamını 9 kategoride 57 araç olarak sunar. MCP uyumlu herhangi bir yapay zeka istemcisi (Claude, OpenClaw vb.) doğal dil aracılığıyla canlı hava durumu verileri sorgulayabilir, alarmları yönetebilir ve kullanıcı hesaplarını kontrol edebilir.
KategoriAraç SayısıKapsam
⚡ Yıldırım2Yıldırım çarpma verileri
🌪️ Fırtına3Fırtına hücresi takibi
🌧️ Yağış2Radar yağış verileri
🌤️ Tahmin3Saatlik / günlük / anlık hava durumu
👤 Auth & Kullanıcı11Kimlik doğrulama ve kullanıcı yönetimi
🏢 Hesap8Hesap ve abonelik yönetimi
📍 Nokta Alarmları6GPS tabanlı uyarı abonelikleri
🗺️ Coğrafi Alarmlar12Sınır bazlı uyarılar + il/ilçe/mahalle kataloğu
📅 Tahmin Alarmları10Eşik bazlı tahmin uyarıları + il/ilçe kataloğu
Toplam57

Gereksinimler

  • Node.js >= 18 (ES2022 desteği gerekli)
  • npm >= 9
  • iklim.co API erişim bilgileri: HMAC secret, kullanıcı adı ve şifre

Kurulum

Kaynak kod git.tarla.io/iklim.co/mcp-server adresindeki public repository’den indirilebilir.
git clone https://git.tarla.io/iklim.co/mcp-server.git
cd mcp-server
npm install
npm run build

Ortam Değişkenleri

Sunucu başlamadan önce aşağıdaki değişkenlerin tanımlı olması gerekir. Geliştirme ortamında mcp-server dizininde bir .env dosyası oluşturabilirsiniz (.gitignore kapsamında):
# .env
IKLIM_ENV=test                     # prod | test | local  (IKLIM_BASE_URL yoksa kullanılır)
IKLIM_BASE_URL=                    # Opsiyonel. Tanımlıysa IKLIM_ENV'i override eder
IKLIM_HMAC_SECRET=<secret>         # Zorunlu. İstek imzalama için HMAC-SHA256 anahtarı
IKLIM_USERNAME=<email>             # Zorunlu. API hesabı e-postası
IKLIM_PASSWORD=<password>          # Zorunlu. API hesabı şifresi
IKLIM_TOKEN_STORE_PATH=            # Opsiyonel. Access/refresh token'ları kalıcı saklamak için dosya yolu
IKLIM_HTTP_LOG_PATH=               # Opsiyonel. API istek log dosyası yolu
IKLIM_HTTP_LOG_MAX_BYTES=5242880   # Opsiyonel. Rotate eşiği (byte), varsayılan: 5 MB
IKLIM_HTTP_LOG_MAX_FILES=5         # Opsiyonel. Tutulacak rotated dosya sayısı
IKLIM_HTTP_LOG_REQUEST_BODY_MAX_BYTES=16384   # Opsiyonel. Request body log boyut sınırı
IKLIM_HTTP_LOG_RESPONSE_BODY_MAX_BYTES=16384  # Opsiyonel. Response body log boyut sınırı
Ortama göre base URL:
IKLIM_ENVURL
prodhttps://api.iklim.co
testhttps://api-test.iklim.co
localhttp://localhost:8080
IKLIM_HTTP_LOG_PATH tanımlıysa her API çağrısı tek satır JSON olarak loglanır. Hassas alanlar (Authorization, X-Signature, password, token vb.) otomatik olarak maskelenir.

Build ve Çalıştırma

# TypeScript'i derle (dist/ klasörünü oluşturur)
npm run build

# Derlenmiş sunucuyu başlat
npm start

# Geliştirme modunda çalıştır — derleme adımı gerekmez
npm run dev
Başarılı başlatmada çıktı:
iklim.co MCP server running
Sunucu stdio transportu üzerinden iletişim kurar. Doğrudan terminalde çalıştırmak yerine bir MCP istemcisi tarafından yönetilmesi beklenir.

MCP İstemci Konfigürasyonu

Claude CLI (.mcp.json)

Proje kök dizinine bir .mcp.json dosyası ekleyin. Claude CLI bunu otomatik olarak yükler:
{
  "mcpServers": {
    "iklim": {
      "command": "node",
      "args": ["/tam/yol/mcp-server/dist/index.js"],
      "env": {
        "IKLIM_ENV": "test",
        "IKLIM_HMAC_SECRET": "<secret>",
        "IKLIM_USERNAME": "<email>",
        "IKLIM_PASSWORD": "<password>"
      }
    }
  }
}
Global olarak tanımlamak için aynı mcpServers bloğunu ~/.claude/settings.json dosyasına ekleyin.

OpenClaw

openclaw mcp set komutu env parametresini ayrı olarak desteklemez; tüm alanları tek bir JSON nesnesi olarak geçirin:
openclaw mcp set iklim '{"type":"stdio","command":"node","args":["/tam/yol/mcp-server/dist/index.js"],"env":{"IKLIM_ENV":"test","IKLIM_HMAC_SECRET":"<secret>","IKLIM_USERNAME":"<email>","IKLIM_PASSWORD":"<password>"}}'
Ya da ~/.openclaw/openclaw.json dosyasını doğrudan düzenleyin:
{
  "mcp": {
    "iklim": {
      "type": "stdio",
      "command": "node",
      "args": ["/tam/yol/mcp-server/dist/index.js"],
      "env": {
        "IKLIM_ENV": "test",
        "IKLIM_HMAC_SECRET": "<secret>",
        "IKLIM_USERNAME": "<email>",
        "IKLIM_PASSWORD": "<password>"
      }
    }
  }
}

Diğer MCP İstemcileri

MCP stdio standardını destekleyen her istemci bağlanabilir. Gerekli parametreler:
ParametreDeğer
transportstdio
commandnode
args["<dist/index.js tam yolu>"]
envYukarıdaki dört değişken

Araç Kataloğu

⚡ Yıldırım

AraçAçıklama
get_lightnings_withinMerkez koordinatı ve yarıçap ile tanımlanan dairesel alan içindeki yıldırım çarpmalarını sorgular
get_lightnings_pageZaman aralığına göre yıldırım verilerini sayfalı olarak getirir

🌪️ Fırtına

AraçAçıklama
get_thunderstorms_withinDairesel alan içindeki fırtına hücrelerini sorgular
get_thunderstorms_pageZaman aralığına göre fırtına verilerini sayfalı getirir
get_thunderstorm_detailseventId ile belirli bir fırtına olayının geçmiş detaylarını getirir

🌧️ Yağış

AraçAçıklama
get_precipitations_withinDairesel alan içindeki radar yağış verilerini sorgular; intensityThreshold ile filtrelenebilir
get_precipitations_pageZaman aralığına göre yağış verilerini sayfalı getirir; intensityThreshold zorunludur
Yoğunluk seviyeleri (en düşükten en yükseğe): DRIZZLE < LIGHT < MODERATE < HEAVY < VERY_HEAVY < EXTREME

🌤️ Hava Tahmini

AraçAçıklama
get_hourly_forecast1–14 günlük saatlik tahminler; 53 seçilebilir metrik desteklenir
get_daily_forecastGünlük agregat tahminler; saatlik ile aynı parametreler (solar panel alanları hariç)
get_current_weatherKoordinat için en güncel hava gözlemini getirir
WEATHER_ICON, TEMPERATURE, APPARENT_TEMPERATURE, DEW_POINT_TEMPERATURE, HUMIDITY, CLOUD_COVER, CLOUD_COVER_LOW, CLOUD_COVER_MID, CLOUD_COVER_HIGH, WIND_SPEED, WIND_GUST, WIND_DIRECTION, WIND_SPEED_AT_100M, WIND_DIRECTION_AT_100M, PRECIPITATION, RAIN, SHOWERS, SNOWFALL, SNOW_DEPTH, PRECIPITATION_PROBABILITY, WEATHER_CODE, PRESSURE_MSL, SURFACE_PRESSURE, VISIBILITY, EVAPOTRANSPIRATION, ET0_FAO_EVAPOTRANSPIRATION, VAPOUR_PRESSURE_DEFICIT, CAPE, LIFTED_INDEX, CONVECTIVE_INHIBITION, SUNSHINE_DURATION, SHORTWAVE_RADIATION, DIRECT_RADIATION, DIFFUSE_RADIATION, DIRECT_NORMAL_IRRADIANCE, GLOBAL_TILTED_IRRADIANCE, TERRESTRIAL_RADIATION, SHORTWAVE_RADIATION_INSTANT, DIRECT_RADIATION_INSTANT, DIFFUSE_RADIATION_INSTANT, DIRECT_NORMAL_IRRADIANCE_INSTANT, GLOBAL_TILTED_IRRADIANCE_INSTANT, TERRESTRIAL_RADIATION_INSTANT, SOIL_TEMPERATURE_0CM, SOIL_TEMPERATURE_6CM, SOIL_TEMPERATURE_18CM, SOIL_TEMPERATURE_54CM, SOIL_MOISTURE_0_TO_1CM, SOIL_MOISTURE_1_TO_3CM, SOIL_MOISTURE_3_TO_9CM, SOIL_MOISTURE_9_TO_27CM, SOIL_MOISTURE_27_TO_81CM, IS_DAY

👤 Auth & Kullanıcı

AraçAçıklama
auth_registerYeni kullanıcı hesabı oluşturur
auth_logoutGeçerli JWT token’ı geçersiz kılar
user_get_meOturum açmış kullanıcının profilini getirir
user_getuserId ile kullanıcı detayını getirir
user_create(Admin) roles ve status ile yeni kullanıcı oluşturur
user_update(Admin) userId ile kullanıcı alanlarını günceller
user_listSayfalı kullanıcı listesi; roles ve status ile filtrelenebilir
user_unblockBloke edilmiş kullanıcıyı açar
user_change_passwordoldPassword ve newPassword ile şifre değiştirir
user_password_reset_requestŞifre sıfırlama e-postası gönderir
user_password_resetSıfırlama token’ı ile şifreyi günceller

🏢 Hesap

AraçAçıklama
account_getuserId ile hesap detaylarını getirir
account_createYeni hesap oluşturur (INDIVIDUAL veya ORGANIZATION)
account_updateaccountId ile hesap alanlarını günceller
account_activation_requestAktivasyon e-postası gönderir
account_activateE-posta doğrulama token’ı ile hesabı aktive eder
account_phone_activation_requestSMS doğrulama kodu gönderir
account_activate_phoneSMS token’ı ile telefonu doğrular
account_update_subscriptionAbonelik planını değiştirir

📍 Nokta Alarmları

GPS koordinatı ve yapılandırılabilir yarıçap etrafındaki olaylar için uyarı abonelikleri.
AraçAçıklama
point_alarm_registerYeni nokta alarmı oluşturur
point_alarm_updateMevcut alarmı günceller
point_alarm_deleteAlarm kaydını siler
point_alarm_get_by_idTekil alarm detayını getirir
point_alarm_get_by_recipientAlıcıya ait tüm alarmları listeler
point_alarm_listSayfalı alarm listesi; recipientIds ile filtrelenebilir

🗺️ Coğrafi Alarmlar

İdari sınır, poligon veya H3 adresi bazlı uyarı abonelikleri. Üç sınır tipi desteklenir:
// İdari sınır
{ "type": "ADMINISTRATIVE", "cityId": 6, "districtId": 60 }

// Poligon
{ "type": "POLYGON", "polygon": { "exterior": [{"lat": 39.9, "lng": 32.8}, ...] } }

// H3 hücre indeksi
{ "type": "H3INDEX", "h3Address": "8f2830828052d25" }
CRUD araçları (geo_alarm_register, geo_alarm_update, geo_alarm_delete, geo_alarm_get_by_id, geo_alarm_get_by_recipient, geo_alarm_list) Nokta Alarmları ile aynı imzayı paylaşır. Konum kataloğu:
AraçAçıklama
geo_alarm_list_citiesTüm illeri listeler
geo_alarm_get_citycityId ile il detayını getirir
geo_alarm_list_districtscityId ile ilçeleri listeler
geo_alarm_get_districtdistrictId ile ilçe detayını getirir
geo_alarm_list_neighborhoodsdistrictId ile mahalleleri listeler
geo_alarm_get_neighborhoodneighborhoodId ile mahalle detayını getirir

📅 Tahmin Alarmları

Eşik aşıldığında sabah 04:00 UTC veya akşam 16:00 UTC’de gönderilen uyarılar. Eşik parametreleri:
ParametreDeğerler
precipitationThresholdmm cinsinden sayısal değer
snowFallThresholdLIGHT | MODERATE | HEAVY
windGustThresholdSTRONG_WIND | STORM | SEVERE_STORM | HURRICANE
hotTemperatureThresholdHOT_SNAP | HEAVY_HOT_SNAP | EXTREME_HOT_SNAP
coldTemperatureThresholdCOLD_SNAP | HEAVY_COLD_SNAP | EXTREME_COLD_SNAP
CRUD araçları Nokta Alarmları ile aynı imzayı takip eder. Ek konum kataloğu araçları: forecast_alarm_list_cities, forecast_alarm_get_city, forecast_alarm_list_districts, forecast_alarm_get_district.

Mimari

src/
├── index.ts          # MCP sunucu başlatma, araç yönlendirme
├── config.ts         # Ortam değişkeni ayrıştırma
├── auth.ts           # JWT token yönetimi (otomatik yenileme)
├── client.ts         # HTTP API istemcisi (HMAC imzalama)
├── security.ts       # HMAC-SHA256, nonce, idempotency key
└── tools/
    ├── lightnings.ts
    ├── thunderstorms.ts
    ├── precipitations.ts
    ├── forecasts.ts
    ├── auth.ts
    ├── accounts.ts
    ├── point-alarms.ts
    ├── geo-alarms.ts
    └── forecast-alarms.ts
İstek akışı:
MCP İstemci


index.ts  (CallToolRequestSchema)


tools/<kategori>.ts  ← Zod validasyonu


client.ts  (apiGet / apiPost / apiPatch / apiDelete)
    │  ├── auth.ts → geçerli JWT al (gerekirse otomatik yenile)
    │  └── security.ts → HMAC-SHA256 imzası üret


iklim.co REST API

Kimlik Doğrulama ve Güvenlik

Her API etkileşimi iki bağımsız güvenlik katmanı kullanır: JWT tabanlı kimlik doğrulama ve HMAC-SHA256 istek imzalama. Her ikisi de her isteğe uygulanır.

Otomatik Auth Akışı

Sunucu, ilk araç çağrısında otomatik olarak giriş yapar. Manuel bir login adımı gerekmez.
İlk araç çağrısı


getValidAccessToken()          ← auth.ts

    ├─ Token state yok → login()
    │       POST /v1/auth/login  { username, password }
    │       ← { accessToken, refreshToken }
    │       JWT payload decode → son kullanma süresini hesapla
    │       tokenState'e kaydet

    ├─ accessToken süresi dolmak üzere (< 30 sn kaldı) → refresh()
    │       POST /v1/auth/refresh  { refreshToken }
    │       ← { accessToken, refreshToken }
    │       tokenState'i güncelle

    └─ accessToken geçerli → doğrudan döndür
login ve refresh endpoint’leri Authorization: Bearer header’ı içermez — bu istekler yalnızca HMAC imzasıyla doğrulanır.

HTTP İstek Header’ları

HeaderDeğerNotlar
Content-Typeapplication/jsonSabit
AuthorizationBearer <accessToken>Yalnızca normal API isteklerinde; login/refresh’te yer almaz
X-Signaturehex stringHMAC-SHA256 imzası
X-TimestampUnix epoch (ms)Date.now() string olarak
X-NonceUUID v4Her istekte tekil — replay saldırısını engeller
X-Idempotency-KeyUUID v4POST, PUT, PATCH ve DELETE isteklerinde

HMAC-SHA256 İmza Hesabı

X-Signature değeri dört bileşenin | ile birleştirilmesinin HMAC-SHA256’sıdır:
imzalanacak_veri = "METHOD|PATH_WITH_QUERY|TIMESTAMP|BODY"
X-Signature      = HMAC-SHA256(imzalanacak_veri, IKLIM_HMAC_SECRET) → hex
Örnek — GET isteği:
METHOD    = "GET"
PATH      = "/v1/users?pageNumber=0&pageSize=10"
TIMESTAMP = "1774349677000"
BODY      = ""   ← GET isteğinde body yok

imzalanacak = "GET|/v1/users?pageNumber=0&pageSize=10|1774349677000|"
X-Signature = HMAC-SHA256(imzalanacak, secret) → "a3f9c2..."
Örnek — POST isteği:
METHOD    = "POST"
PATH      = "/v1/lightnings/within"
TIMESTAMP = "1774349677000"
BODY      = '{"center":{"lat":39.87,"lng":32.74},"radius":50000,...}'

imzalanacak = "POST|/v1/lightnings/within|1774349677000|{\"center\":...}"
X-Signature = HMAC-SHA256(imzalanacak, secret) → "7be41d..."

Güvenlik Önerileri

  • IKLIM_HMAC_SECRET ve IKLIM_PASSWORD değerlerini kaynak koda veya git geçmişine eklemeyin
  • Üretim ortamında .env dosyası yerine sistem ortam değişkenlerini veya bir secrets manager kullanın
  • Her ortam için ayrı kimlik bilgileri kullanın (prod / test / local)
  • HMAC secret’ı düzenli olarak rotate edin