magaza-mcp 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tunaarikaya
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,255 @@
1
+ # Mağaza MCP
2
+
3
+ App Store Connect ve Google Play'i tek MCP sunucusunda birleştirir; yapay zekâ asistanın iki mağazayı da yönetir.
4
+
5
+ [![npm](https://img.shields.io/npm/v/magaza-mcp.svg)](https://www.npmjs.com/package/magaza-mcp)
6
+ [![Lisans: MIT](https://img.shields.io/badge/lisans-MIT-blue.svg)](LICENSE)
7
+ [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org)
8
+
9
+ `magaza-mcp`, kullandığın yapay zekâ asistanını (Claude, Antigravity, Cursor, Codex, Windsurf) doğrudan App Store Connect ve Google Play hesaplarına bağlar. Tek bir kurulum sihirbazı çalıştırırsın; asistan bundan sonra uygulamalarını, sürümlerini, aboneliklerini, yorumlarını ve satın almalarını okuyup düzenleyebilir. İki mağaza, tek kurulum, tek sunucu.
10
+
11
+ ## Neden bu var?
12
+
13
+ Piyasadaki MCP sunucularının neredeyse hepsi tek mağazalı: ya sadece App Store Connect'e ya da sadece Google Play'e bağlanıyorlar. İkisini aynı anda kullanmak istiyorsan iki ayrı sunucu kuruyor, iki ayrı araç setiyle uğraşıyor ve iki mağazayı karşılaştıran her soruyu elle birleştiriyorsun.
14
+
15
+ Bildiğimiz kadarıyla `magaza-mcp`, iki mağazayı tek pakette birleştiren ilk proje. Bunun asıl kazancı araç listesinin uzaması değil: **iki mağazayı aynı anda sorgulayabilen araçlar ancak böyle mümkün oluyor.** "Aynı uygulamanın aboneliği App Store'da ve Play'de kaç para?" ya da "Kullanıcı ödedi ama premium göremiyor, sorun hangi mağazada?" gibi sorular, iki API'ye aynı çağrıda erişebilen bir sunucu olmadan cevaplanamaz.
16
+
17
+ ## Kurulum
18
+
19
+ ```bash
20
+ npx magaza-mcp kur
21
+ ```
22
+
23
+ Sihirbaz sırasıyla şunları sorar:
24
+
25
+ 1. **Hangi mağazaları bağlayalım?** — App Store Connect, Google Play veya ikisi.
26
+ 2. **App Store Connect anahtarı** — Key ID, Issuer ID ve `.p8` özel anahtar dosyanın yolu. Anahtarı App Store Connect → Kullanıcılar ve Erişim → Entegrasyonlar bölümünden oluşturursun. Sihirbaz anahtarı kaydetmeden önce Apple'a gerçek bir istek atıp doğrular; kaç uygulama gördüğünü söyler.
27
+ 3. **Google Play servis hesabı** — Google Cloud Console'dan indirdiğin servis hesabı JSON anahtarının yolu. Sihirbaz bunu da Google'a gerçek bir istek atarak doğrular ve kaç uygulama gördüğünü söyler. (Apple anahtarı doğrulama geçtikten sonra kasaya yazılır; Google anahtarı ise doğrulamanın kendisi erişim token'ı üretmeyi gerektirdiği için önce kasaya yazılıp hemen ardından denenir.)
28
+ 4. **Hangi uygulamalara kurulsun?** — Makinende kurulu görünen istemciler işaretli gelir, istediklerini seçersin.
29
+ 5. **Salt-okunur kurulsun mu?** — Varsayılan hayır. Evet dersen ayar dosyasına `--salt-okunur` bayrağı da yazılır.
30
+
31
+ Desteklenen istemciler ve yazılan ayar dosyaları:
32
+
33
+ | İstemci | Ayar dosyası |
34
+ | --- | --- |
35
+ | Claude Code | `~/.claude.json` |
36
+ | Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` |
37
+ | Antigravity (IDE + CLI) | `~/.gemini/config/mcp_config.json` |
38
+ | Cursor | `~/.cursor/mcp.json` |
39
+ | Windsurf | `~/.codeium/windsurf/mcp_config.json` |
40
+ | Codex | `~/.codex/config.toml` |
41
+
42
+ Mevcut ayarlarına dokunulmaz — sadece `magaza-mcp` girdisi eklenir veya güncellenir ve her yazmadan önce dosyanın `.magaza-mcp-yedek` uzantılı bir kopyası alınır.
43
+
44
+ **Anahtarların ayar dosyasına yazılmaz.** macOS'ta Anahtar Zinciri'ne (Keychain) kaydedilirler; ayar dosyasına yalnızca hangi mağazaların açık olduğunu söyleyen `MAGAZALAR` değişkeni girer. Anahtar Zinciri'ne erişilemeyen sistemlerde izinleri `0600`'e kilitlenmiş bir dosyaya düşülür.
45
+
46
+ Kurulumdan sonra açık olan uygulamaları yeniden başlat.
47
+
48
+ Diğer komutlar:
49
+
50
+ ```bash
51
+ npx magaza-mcp durum # Neyin bağlı olduğunu göster (--json ile makine okunur)
52
+ npx magaza-mcp araclar # Yüklü araçları listele (✎ = veri değiştirebilir)
53
+ npx magaza-mcp surum # Sürümü yazdır
54
+ npx magaza-mcp yardim # Yardım
55
+ npx magaza-mcp # MCP sunucusunu başlat (istemciler bunu çağırır)
56
+ ```
57
+
58
+ ## Yapay zekâya kurdurmak
59
+
60
+ Terminalle uğraşmak istemiyorsan kurulumu asistanına yaptırabilirsin. Kullandığın
61
+ yapay zekâya (Claude Code, Antigravity, Cursor, Codex…) şunu yaz:
62
+
63
+ > https://github.com/tunaarikaya/magaza-mcp — bunu kur, AGENTS.md'yi oku
64
+
65
+ Asistan repodaki [AGENTS.md](AGENTS.md) dosyasını okuyup gerisini halleder:
66
+ paketi tanır, ayar dosyalarına kaydeder, kurulumu doğrular.
67
+
68
+ **Anahtarını asistan görmez.** Kayıt işini o yapar ama anahtar girme kısmını
69
+ sana bırakır — `npx magaza-mcp kur` komutunu sen çalıştırırsın ve anahtar
70
+ bilgisayarından hiç çıkmaz. AGENTS.md asistana bunu açıkça söyler: `.p8`
71
+ dosyanı isteme, okuma, ekrana basma.
72
+
73
+ Asistanın kullandığı komutlar (sen de elle çalıştırabilirsin):
74
+
75
+ ```bash
76
+ npx magaza-mcp durum --json # neyin bağlı olduğunu gör
77
+ npx magaza-mcp kaydet --magazalar appstore,play # ayar dosyalarına yaz
78
+ npx magaza-mcp kur # anahtarı SEN girersin
79
+ ```
80
+
81
+ ## İki mağaza karışır mı?
82
+
83
+ Hayır — ve bu tesadüf değil, tasarımın kendisi.
84
+
85
+ **Araç isimleri önekle ayrılmıştır.** App Store Connect'e giden her araç `appstore__` ile, Google Play'e giden her araç `play__` ile başlar. Bir araç asla iki API'ye birden gitmez; `appstore__yorumlar` yalnızca Apple'ın `customerReviews` uç noktasını, `play__yorumlar` yalnızca Android Publisher'ın `reviews` uç noktasını çağırır. İsimlerin karışma ihtimali yok, çünkü ortak isim yok.
86
+
87
+ **Seçmediğin mağazanın araçları hiç yüklenmez.** Kurulumda hangi mağazaları seçtiğin ayar dosyasındaki `MAGAZALAR` değişkenine yazılır. Sunucu açılışta bu değişkeni okur ve araç listesini ona göre kurar: sadece App Store seçtiysen hiçbir `play__` aracı belleğe bile alınmaz, modeline sunulan araç listesinde görünmez, token harcamaz. Tersi de geçerli. Yani tek paket kurarsın ama pratikte iki bağımsız sunucudan hangisini istiyorsan o çalışır. Rakamla: iki mağaza açıkken 27, yalnızca App Store'da 14, yalnızca Play'de 13 araç yüklenir.
88
+
89
+ **Çapraz araçlar yalnızca iki mağaza da açıkken var olur.** `magaza__` önekli çapraz araçlar (genel bakış, abonelik karşılaştırma, satın alma teşhisi) tek mağazalı kurulumda hiç oluşturulmaz — anlamları olmadığı için.
90
+
91
+ **Ortak dispatch araçları da kapsamını bilir.** `magaza__endpoint_ara` ve `magaza__cagir` araçlarının `magaza` parametresi, yalnızca kurduğun mağazaları kabul eden bir enum'dur. Sadece Play kurduysan model `magaza: "appstore"` diye bir çağrı yapamaz; şema buna izin vermez.
92
+
93
+ ## Ne sorabilirsin
94
+
95
+ Aşağıdaki örneklerdeki uygulama adları uydurmadır; sen kendi uygulamalarının adını kullanırsın.
96
+
97
+ - "İki mağazadaki uygulamalarımı listele, hangisi nerede yayında?"
98
+ - "Nota Defteri uygulamasının aylık aboneliği App Store'da ve Play'de Türkiye'de kaç para? Fark var mı?"
99
+ - "Bir kullanıcı ödeme yaptığını ama premium açılmadığını söylüyor. Nota Defteri'nin satın alma kurulumunu iki mağazada da kontrol et."
100
+ - "App Store'da hangi sürümüm incelemede takıldı?"
101
+ - "Dün yüklediğim TestFlight build'i işlenmesi bitti mi?"
102
+ - "Son bir haftadaki 1 ve 2 yıldızlı App Store yorumlarını özetle, en sık şikâyet ne?"
103
+ - "Şu Play yorumuna kibar bir yanıt yaz, ama önce bana göster."
104
+ - "Nota Defteri'nin Play'deki çökme oranı son 14 günde arttı mı?"
105
+ - "Bu Play satın alma token'ı geçerli mi, abonelik hâlâ aktif mi?"
106
+ - "Play'de hangi sürüm production kanalında ve yüzde kaç kullanıcıya açık?"
107
+ - "Hazırlanmakta olan sürümün 'Bu sürümde neler yeni' metnini güncelle."
108
+
109
+ ## Araçlar
110
+
111
+ Araç adlarındaki önek hangi mağazaya gidildiğini söyler. ✎ işaretli araçlar veri değiştirir.
112
+
113
+ ### App Store Connect (`appstore__`)
114
+
115
+ | Araç | Ne yapar |
116
+ | --- | --- |
117
+ | `appstore__uygulamalar` | Hesaptaki uygulamaları listeler: ad, bundle ID, SKU, birincil dil ve diğer araçların istediği `id`. |
118
+ | `appstore__surumler` | Bir uygulamanın App Store sürümlerini ve durumlarını gösterir (hazırlanıyor, incelemede, yayında, reddedildi). |
119
+ | `appstore__buildler` | TestFlight build'lerini, işlenme durumlarını ve son kullanma tarihlerini listeler. |
120
+ | `appstore__yorumlar` | Müşteri yorumlarını en yeniden eskiye getirir; puana ve ülkeye göre süzülebilir, istersen yalnızca henüz yanıtlanmamışları verir. Varsa mevcut geliştirici yanıtını da gösterir. |
121
+ | `appstore__yorum_yanitla` ✎ | Bir yoruma geliştirici yanıtı yazar (Apple incelemesinden sonra yayınlanır). `onayla=true` gelmeden yazmaz. |
122
+ | `appstore__abonelikler` | Abonelik gruplarını ve içlerindeki abonelikleri listeler: ürün kimliği, süre, durum. |
123
+ | `appstore__abonelik_fiyatlari` | Bir aboneliğin ülke ülke müşteri fiyatlarını ve geliştirici gelirini getirir. |
124
+ | `appstore__iap_urunler` | Tek seferlik uygulama içi satın alma ürünlerini listeler. |
125
+ | `appstore__testflight_gruplari` | TestFlight beta gruplarını, her gruptaki test kullanıcı sayısını, genel davet linklerini ve kotalarını gösterir. |
126
+ | `appstore__metin_guncelle` ✎ | Hazırlanmakta olan sürümün mağaza metinlerini günceller: sürüm notları, açıklama, anahtar kelimeler, tanıtım metni. `onayla=true` gelmeden yazmaz. |
127
+ | `appstore__satis_raporu` | Satış/indirme raporunu TSV olarak indirir: günlük, haftalık, aylık veya yıllık; satış, ön sipariş, yükleme, abonelik, abonelik olayı, abone ve teklif kodu raporları. |
128
+
129
+ ### Google Play (`play__`)
130
+
131
+ | Araç | Ne yapar |
132
+ | --- | --- |
133
+ | `play__uygulamalar` | Servis hesabının eriştiği uygulamaları listeler; diğer araçların istediği paket adını buradan alırsın. |
134
+ | `play__kanallar` | Yayın kanallarını (internal, alpha, beta, production) ve her kanaldaki sürümleri, kullanıcı yüzdeleriyle birlikte gösterir. Servis hesabının sürüm yönetme yetkisi gerekir. |
135
+ | `play__yorumlar` | Kullanıcı yorumlarını getirir; istenirse çevirir. Play API'si yalnızca son ~1 haftayı verir. |
136
+ | `play__yorum_yanitla` ✎ | Bir yoruma geliştirici yanıtı yazar (en fazla 350 karakter). |
137
+ | `play__abonelikler` | Abonelikleri ve temel planlarını (base plan) listeler: süre, durum, fiyatlandırılan ülke sayısı. Arşivlenmişleri istersen dahil eder. |
138
+ | `play__abonelik_fiyatlari` | Bir temel planın ülke ülke fiyatlarını ve yeni abonelere açık olup olmadığını getirir; tek tek listelenmemiş ülkeler için "diğer bölgeler" yedek fiyatına da bakar. |
139
+ | `play__urunler` | Tek seferlik ürünleri listeler; yeni (`oneTimeProducts`) ve eski (`inappproducts`) modelin ikisini de dener. |
140
+ | `play__satin_alma_dogrula` | Bir satın alma token'ını doğrular: abonelik durumu, onay durumu, bitiş tarihi, test satın alması mı. |
141
+ | `play__iade_edilenler` | İptal edilmiş, iade edilmiş veya geri alınmış satın almaları listeler; iade sebebini ve kaynağını okunur hale getirir. Google yalnızca son 30 günü verir. |
142
+ | `play__cokme_orani` | Android vitals çökme oranını, ölçüme giren farklı kullanıcı sayısıyla birlikte günlük olarak getirir. |
143
+
144
+ ### İki mağaza birden (`magaza__`)
145
+
146
+ Bu araçlar yalnızca iki mağaza da bağlıyken yüklenir.
147
+
148
+ | Araç | Ne yapar |
149
+ | --- | --- |
150
+ | `magaza__genel_bakis` | İki mağazadaki uygulamaları tek listede toplar; aynı ürünün iOS/Android eşlerini yan yana koyar, sadece tek mağazada olanları ayırır. |
151
+ | `magaza__abonelik_karsilastir` | Aynı uygulamanın aboneliklerini iki mağazada karşılaştırır: ürün kimlikleri, süreler ve istenen ülkedeki fiyatlar. Ülke kodunu iki mağazanın istediği biçime kendi çevirir. |
152
+ | `magaza__iap_teshis` | "Ödedi ama premium göremiyor" sorunlarını teşhis eder: ürünler yayında mı, o ülkede fiyatı var mı, plan yeni abonelere açık mı; Play satın alma token'ı verirsen onu da doğrular ve bulguları madde madde yazar. |
153
+
154
+ ### Tüm API'ye erişim (`magaza__`)
155
+
156
+ | Araç | Ne yapar |
157
+ | --- | --- |
158
+ | `magaza__endpoint_ara` | Bağlı mağazaların API'lerinin tamamında uç nokta arar; operasyon adını, HTTP yöntemini, yolunu ve parametrelerini döndürür. |
159
+ | `magaza__cagir` ✎ | Bulunan operasyonu çalıştırır. Yol parametrelerini otomatik yerine koyar; veri değiştiren işlemler `onayla=true` olmadan çalışmaz. |
160
+ | `magaza__sema` | Bir operasyonun istek gövdesinin nasıl olması gerektiğini gösterir; POST/PATCH çağrılarından önce kullanılır. |
161
+
162
+ `magaza__cagir` burada ✎ ile işaretli, çünkü veri değiştiren operasyonları da çalıştırabilir. Buna karşılık `npx magaza-mcp araclar` çıktısında ✎ görünmez: araç aynı zamanda katalogdaki bütün okuma uçlarının tek kapısı olduğu için salt-okunur modda listeden düşmez, yalnızca yazma operasyonları kapatılır.
163
+
164
+ ## Tam API erişimi
165
+
166
+ Yukarıdaki seçilmiş araçlar günlük işin büyük kısmını görür. Geri kalanı için sunucu, iki mağazanın API'lerinin **tamamını** taşır — toplam **1440 operasyon**:
167
+
168
+ | Kaynak | Operasyon |
169
+ | --- | --- |
170
+ | App Store Connect API v4.5 | 1270 |
171
+ | Android Publisher API v3 | 145 |
172
+ | Play Developer Reporting API v1beta1 | 25 |
173
+
174
+ Hazır araçlar arasında işini görecek bir şey yoksa model önce `magaza__endpoint_ara` ile aradığı işlemi bulur, sonra `magaza__cagir` ile çalıştırır.
175
+
176
+ ### Neden hepsi ayrı araç değil?
177
+
178
+ Çünkü bedeli ağır olurdu. MCP araç tanımları her istekte bağlama girer — yani yüklü araç listesi, sen hiçbirini kullanmasan bile her mesajda tekrar tekrar ödenir.
179
+
180
+ | | Araç sayısı | Araç tanımlarının bağlamdaki maliyeti |
181
+ | --- | --- | --- |
182
+ | **magaza-mcp** | 27 | **~4.000 token** |
183
+ | 1440 operasyonun hepsi ayrı araç olsaydı | 1440 | ~210.000 token |
184
+
185
+ Kapalı özellik yok: 1440 operasyonun tamamına erişilebiliyor, ama kullanılmayanın maliyeti sıfır. Model bir şeye ihtiyaç duyduğu anda arayıp buluyor.
186
+
187
+ Bu yüzden `magaza-mcp`'de "şu özelliği açayım mı, token yer" diye bir ayar da yok — açılacak bir şey yok, hepsi zaten erişilebilir.
188
+
189
+ Katalogların tamamı Apple ve Google'ın **resmî spesifikasyonlarından** üretilir: Apple'ın yayınladığı App Store Connect OpenAPI dosyası ile Google'ın Android Publisher ve Play Developer Reporting discovery dökümanları. Elle yazılmış uç nokta listesi yoktur; spesifikasyon güncellendiğinde katalog yeniden üretilir. Apple'ın eskimiş (deprecated) işaretlediği 159 operasyon katalogdan atılmaz — bazıları o yeteneğe giden tek yol — ama özetleri `[ESKİMİŞ]` ile başlar ve arama sonuçlarında geriye itilirler.
190
+
191
+ ## Gereken izinler
192
+
193
+ **App Store Connect.** Anahtarı oluştururken **App Manager** rolü yeterlidir; Admin gerekmez. İstisnalar: kullanıcı ve erişim yönetimi uç noktaları ile bazı analitik raporlar daha yüksek yetki ister. Sözleşme, vergi ve banka bilgileri hiçbir API anahtarıyla okunamaz (aşağıya bak).
194
+
195
+ **Google Play.** İki adım gerekir ve ikisi de şart:
196
+
197
+ 1. Servis hesabının **Play Console → Kullanıcılar ve izinler** bölümünden davet edilmesi ve ilgili uygulamalara izin verilmesi.
198
+ 2. Servis hesabının bulunduğu Google Cloud projesinde **Android Publisher API** ve **Play Developer Reporting API**'nin etkinleştirilmiş olması. Uygulama listelemesi ve çökme metrikleri Reporting API'sinden geldiği için ikincisi de gerçekten gereklidir.
199
+
200
+ ## Güvenlik
201
+
202
+ - **Anahtarlar Anahtar Zinciri'nde.** Apple `.p8` özel anahtarı ve Google servis hesabı JSON'u macOS Anahtar Zinciri'nde saklanır; ayar dosyalarına, ortam değişkenlerine veya repoya yazılmaz. Anahtar Zinciri'nin olmadığı sistemlerde izinleri `0600` olan bir dosyaya düşülür.
203
+ - **Veri değiştiren işlemler onay ister.** `magaza__cagir` ile yapılan POST/PATCH/PUT/DELETE çağrıları ve `appstore__yorum_yanitla` / `appstore__metin_guncelle` ilk seferde çalışmaz: ne yapılacağını, beklenen gövdeyi ve uyarıyı döndürürler; işlem ancak kullanıcı onayladıktan sonra `onayla=true` ile tekrarlandığında yürür.
204
+ - **Salt-okunur mod.** `--salt-okunur` bayrağı (veya `SALT_OKUNUR=1`) yazma yapan araçları (`appstore__yorum_yanitla`, `appstore__metin_guncelle`, `play__yorum_yanitla`) listeden tamamen çıkarır: model onları göremez, dolayısıyla çağıramaz. 27 araç 24'e düşer. Tek istisna `magaza__cagir`'dır; o listede kalır çünkü katalogdaki bütün **okuma** uçlarına da bu araçtan gidiliyor — ama veri değiştiren bir operasyon istendiğinde "sunucu salt-okunur modda" diyip reddeder.
205
+ - **İstemci hangi aracın veri değiştirdiğini görür.** Sunucu araç listesini MCP `annotations` alanlarıyla (`readOnlyHint`, `destructiveHint`) birlikte verir; onay arayüzü olan istemciler yazma araçlarını buna göre ayırt eder.
206
+ - **Telemetri yok.** Sunucu hiçbir analitik, hata raporu veya kullanım verisi göndermez. Ağ trafiği yalnızca `api.appstoreconnect.apple.com`, `androidpublisher.googleapis.com`, `playdeveloperreporting.googleapis.com` ve Google erişim token'ı için `oauth2.googleapis.com` adreslerine gider. Araya giren bir sunucu yoktur; verilerin doğrudan Apple ve Google ile senin makinen arasında akar.
207
+
208
+ ## Sorun giderme
209
+
210
+ **Apple 401 döndürüyor.** Key ID, Issuer ID ve `.p8` dosyası birbirine ait olmayabilir — üçü aynı anahtara ait olmalı. Uyuşuyorlarsa sistem saatine bak: imzalanan JWT 20 dakika ömürlüdür ve saati kaymış bir makinede üretilen token Apple tarafından reddedilir. Ayrıca `.p8` dosyasının bir App Store Connect API anahtarı olduğundan emin ol; StoreKit veya push anahtarları burada çalışmaz.
211
+
212
+ **Apple 403 döndürüyor.** Anahtarın rolü o işlem için yetersiz. App Manager çoğu şeye yeter; kullanıcı yönetimi ve bazı raporlar daha fazlasını ister. Ama bir şeyi baştan bilmekte fayda var: **sözleşme, vergi ve banka bilgileri hiçbir API anahtarıyla okunamaz.** Apple bu verileri API'ye hiç açmaz; yalnızca Hesap Sahibi (Account Holder) rolündeki kişi App Store Connect arayüzünden görebilir. Buradaki 403 bir yapılandırma hatası değildir, düzeltilemez.
213
+
214
+ **Play 403 döndürüyor, `inappproducts` uç noktasında.** Uygulama Google'ın yeni ürün modeline geçmiştir; eski `inappproducts` uç noktası artık kapalıdır ve `oneTimeProducts` kullanılmalıdır. `play__urunler` aracı bunu kendisi halleder: önce yeni uç noktayı dener, olmazsa eskisine düşer ve hangi modeli kullandığını çıktıda söyler.
215
+
216
+ **Play 403 döndürüyor, genel olarak.** Servis hesabı Play Console'da uygulamaya davet edilmemiş olabilir. Davet ettikten sonra izinlerin yayılması birkaç dakika sürebilir; hemen denemek yerine biraz bekle. Davet tamamsa Cloud projesinde Android Publisher API ve Play Developer Reporting API'nin açık olduğunu doğrula.
217
+
218
+ **"Play uygulamalarımı listele" neden Reporting API'sinden geliyor?** Çünkü Android Publisher API'sinde uygulama listeleme uç noktası yoktur — Google böyle bir uç nokta hiç yayınlamadı. Paket adını bilmeden hiçbir Publisher çağrısı yapılamadığı için liste, Play Developer Reporting API'sinin `apps:search` uç noktasından alınır. Bu yüzden Reporting API'si sadece çökme metrikleri için değil, temel kullanım için de açık olmalıdır.
219
+
220
+ **Play'de sürüm/kanal bilgisi neden bazen gecikiyor?** Play'de kanal bilgisi ancak bir "düzenleme oturumu" (edit) içinden okunabilir. Okuma araçları bu oturumu kendileri açar, okur ve commit etmeden bırakır — yani hiçbir değişiklik yaratmaz — ama bu fazladan iki HTTP çağrısı demektir.
221
+
222
+ ## Geliştirme
223
+
224
+ ```bash
225
+ git clone https://github.com/tunaarikaya/magaza-mcp.git
226
+ cd magaza-mcp
227
+ npm install
228
+ npm run build # TypeScript derle
229
+ npm run kontrol # Tip kontrolü (tsc --noEmit)
230
+ npm run dev # İzleme modunda derleme
231
+ ```
232
+
233
+ Araç kataloglarını spesifikasyonlardan yeniden üretmek için:
234
+
235
+ ```bash
236
+ node scripts/uret-katalog.mjs
237
+ ```
238
+
239
+ Bu komut `spec/appstore-openapi.json`, `spec/play.json` ve `spec/play-reporting.json` dosyalarını okur ve `src/katalog/` altındaki katalogları yeniden yazar. Apple veya Google spesifikasyonunu güncellediğinde bu komutu çalıştırman yeterli; operasyon listesi elle düzenlenmez.
240
+
241
+ ## Benzer projeler
242
+
243
+ Bu alanda önce yola çıkmış, iyi iş yapan projeler var. İhtiyacın tek mağazayla sınırlıysa bunlara bakmanı içtenlikle öneririz:
244
+
245
+ - **[app-store-connect-mcp (Heimdall)](https://github.com/erayendes/app-store-connect-mcp)** — App Store Connect API'sinin tamamını 890 araçla kapsayan, profil sistemiyle araç setini daraltmana izin veren çok kapsamlı bir sunucu. Sadece iOS tarafıyla ilgileniyorsan bu alandaki en derin proje.
246
+ - **[app-store-connect-mcp-server](https://github.com/JoshuaRileyDev/app-store-connect-mcp-server)** — Alanın ilki. App Store Connect'i bir MCP sunucusunun arkasına koyma fikrini ilk kuran proje; sonradan gelen herkes bir şekilde buna borçlu.
247
+ - **[google-play-developer-mcp](https://github.com/devinwang/google-play-developer-mcp)** — Play tarafında kapsamlı ve olgun bir sunucu. Yalnızca Android yayınlıyorsan işini fazlasıyla görür.
248
+
249
+ Farkımız şu: bu projelerin hepsi tek mağazaya bakar. `magaza-mcp` ikisini tek kurulumda birleştirir ve iki mağazayı aynı çağrıda karşılaştırabilen araçlar sunar — tek mağazalı bir sunucuda yapılamayan şey tam olarak budur.
250
+
251
+ ## Lisans
252
+
253
+ MIT — ayrıntılar için [LICENSE](LICENSE) dosyasına bak. Üçüncü taraf kaynaklar için [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
254
+
255
+ App Store, TestFlight, App Store Connect, Google Play ve Play Console adları sahiplerinin tescilli markalarıdır. Bu proje bağımsız bir açık kaynak çalışmasıdır; Apple Inc. veya Google LLC ile bağlantılı değildir, onlar tarafından onaylanmamış, desteklenmemiş veya sponsor edilmemiştir.
@@ -0,0 +1,61 @@
1
+ # Üçüncü Taraf Bildirimleri
2
+
3
+ `magaza-mcp`, MIT lisansıyla dağıtılır. Bununla birlikte proje, üçüncü taraflarca
4
+ yayınlanan bazı spesifikasyon dosyalarını ve açık kaynak bağımlılıkları kullanır.
5
+ Bu belge onları ve hangi koşullarla kullanıldıklarını listeler.
6
+
7
+ ## Spesifikasyonlar
8
+
9
+ ### Apple Inc. — App Store Connect OpenAPI spesifikasyonu
10
+
11
+ - Dosya: `spec/appstore-openapi.json`
12
+ - Yayınlayan: Apple Inc.
13
+ - Kullanım: Bu dosya Apple tarafından App Store Connect API'sinin resmî
14
+ tanımı olarak yayınlanır. `magaza-mcp` onu yalnızca okur ve
15
+ `src/katalog/appstore.json` içindeki operasyon kataloğunu bu dosyadan üretir
16
+ (`node scripts/uret-katalog.mjs`). Spesifikasyon üzerinde bir değişiklik
17
+ yapılmaz; içeriği Apple'a aittir ve Apple'ın kendi şartlarına tabidir.
18
+
19
+ App Store, App Store Connect ve TestFlight, Apple Inc.'in tescilli markalarıdır.
20
+
21
+ ### Google LLC — Android Publisher ve Play Developer Reporting discovery dökümanları
22
+
23
+ - Dosyalar: `spec/play.json` (Android Publisher API v3),
24
+ `spec/play-reporting.json` (Play Developer Reporting API v1beta1)
25
+ - Yayınlayan: Google LLC
26
+ - Kullanım: Bu dosyalar Google tarafından ilgili API'lerin resmî makine okunur
27
+ tanımları olarak yayınlanır. `magaza-mcp` onları yalnızca okur ve
28
+ `src/katalog/play.json` içindeki operasyon kataloğunu bu dosyalardan üretir.
29
+ Dökümanlar üzerinde bir değişiklik yapılmaz; içerikleri Google'a aittir ve
30
+ Google'ın kendi şartlarına tabidir.
31
+
32
+ Google Play ve Play Console, Google LLC'nin tescilli markalarıdır.
33
+
34
+ > Bu proje bağımsız bir açık kaynak çalışmasıdır. Apple Inc. veya Google LLC ile
35
+ > bağlantılı değildir; onlar tarafından onaylanmamış, desteklenmemiş veya
36
+ > sponsor edilmemiştir.
37
+
38
+ ## Bağımlılıklar
39
+
40
+ ### @modelcontextprotocol/sdk
41
+
42
+ - Lisans: MIT
43
+ - Kullanım: MCP sunucu protokolünün uygulanması (araç listeleme, araç çağırma
44
+ ve stdio taşıma katmanı).
45
+
46
+ ### zod
47
+
48
+ - Lisans: MIT
49
+ - Kullanım: Şema tanımı ve doğrulama.
50
+
51
+ Geliştirme bağımlılıkları (`typescript`, `@types/node`) yayınlanan pakete dahil
52
+ değildir; ikisi de Apache-2.0 ve MIT lisanslıdır.
53
+
54
+ ## Alınan kod
55
+
56
+ Bu projede şu an başka bir açık kaynak projeden kopyalanmış, uyarlanmış veya
57
+ türetilmiş herhangi bir kod parçası **bulunmamaktadır.** Tüm kaynak kod bu
58
+ depoya özgü olarak yazılmıştır.
59
+
60
+ İleride başka bir projeden bir kod parçası alınırsa, kaynağı (proje adı, bağlantı,
61
+ alınan dosya veya işlev) ve lisansı bu bölüme eklenir.