What if your iPhone could talk to your own MCP servers anywhere? That is exactly what I built with MCP iOS app MCP Connect, a native mobile client for the Model Context Protocol. In this article, I explain how I designed, shipped, and deployed it, and why this approach matters if you want real AI tools on mobile.
MCP Connect nedir?
MCP Connect, MCP sunucularına HTTP üzerinden bağlanmak, araçlara göz atmak ve yolda AI ile sohbet etmek için benim MCP iOS uygulamam. Bunu Swift ve SwiftUI ile geliştirdim; böylece iPhone’da yerel, hızlı ve kararlı hissettiriyor.
Uygulama şunları yapmanıza olanak tanır:
Uygulamanın bir “wrapper” gibi değil, premium hissettirmesini istedim. Bu yüzden karanlık sinema tarzında, glassmorphism, yay (spring) animasyonları ve dokunsal geri bildirim (haptic feedback) ile tasarladım. Bu tasarım tercihi önemli; çünkü mobil AI araçlarının hızlı ve net hissettirmesi gerekir—özellikle kullanıcılar sohbetler ile sunucular arasında geçiş yaptığında.
Neden bir MCP iOS uygulaması yaptım?
Bu MCP iOS uygulamasını kendi araçlarıma telefonumdan doğrudan erişmek istediğim için yaptım. Masaüstüyle sınırlı iş akışları, masanızdan uzaktayken sizi yavaşlatır. iPhone’da, tarayıcıda ve Mac’te zaten sahip olduğum aynı kontrolü istedim.
Gothenburg’da ürünler geliştirirken edindiğim deneyime göre, en iyi mobil uygulamalar acı veren ve dar bir problemi çok iyi çözer. MCP Connect benim için bunu yapıyor. MCP sunucularıma güvenli erişim sağlıyor ve bunun için başka karmaşık bir katman eklemiyor.
Bu aynı zamanda Model Context Protocol’ün (MCP) kendi yönüyle de uyumlu. Anthropic’in MCP spesifikasyonu, temiz bir istemci-sunucu modeline dayanıyor; bu da yapılandırılmış araç erişimi gereken mobil uygulamalar için güçlü bir uyum. Uygulamayı bu fikre paralel olacak şekilde geliştirdim; böylece protokol geliştikçe uygulama sürdürülebilir kalıyor.
Çözdüğüm kullanıcı problemi
Çoğu AI aracı hâlâ masaüstünde oturuyormuş varsayımıyla tasarlanıyor. Seyahat ederken bir sunucuyu kontrol etmeniz, bir aracı tetiklemeniz ya da bir sonucu incelemeniz gerektiğinde bu durum bozuluyor. MCP Connect ile bu sürtünmeyi azalttım.
Sonuç basit: Uygulamayı açıyorum, bir sunucu seçiyorum ve araçlarımla saniyeler içinde etkileşime geçiyorum. MCP iOS uygulaması fikrinin özü bu hız.
MCP iOS uygulamasının arkasındaki teknoloji yığını
Yığını odaklı ve modern tuttum. Şişkin bir mimari ya da gereksiz bağımlılıklar istemedim.
| Katman | Teknoloji |
|---|---|
| --- | --- |
| Platform | iOS 17+, Swift 6, SwiftUI |
| Mimari | MVVM + Coordinators |
| Backend | Supabase (Auth, PostgreSQL, Realtime) |
| MCP Transport | JSON-RPC over HTTP |
| Kalıcılık | SwiftData |
| IAP | StoreKit 2 |
| i18n | String Catalogs (EN + SV) |
| Dağıtım | Xcode + XcodeGen |
Bu yığın, MCP iOS uygulaması için sağlam bir temel sağladı. SwiftUI arayüzü iyi yönetti, SwiftData offline-first depolamayı destekledi ve Supabase ek bir backend yükü olmadan kimlik doğrulama ve senkronizasyon sağladı.
Ayrıca gizli bilgiler için Keychain ve abonelikler için StoreKit 2 gibi tanıdık üretim araçlarını kullandım. Böylece uygulama, altyapı gürültüsü yerine ürün kalitesine odaklı kaldı.
Adım 1: Önce sistemi tasarladım
Her zaman tasarım sistemiyle başlarım; çünkü sonrasında zaman kazandırır. Bu projede, özellik kodunu yazmadan önce token’ları ve paylaşılan bileşenleri oluşturdum.
Dark Cinema paleti derin siyahlar, hafif yükseltilmiş yüzeyler ve indigo bir vurgu (accent) kullanıyor. Her yüzey, `.ultraThinMaterial` ve ince bir sınır (border) ile glassmorphism uyguluyor; böylece UI katmanlı hissettiriyor ama ağırlaşmıyor.
Sistem şunları içeriyor:
`GlassCard`, `AccentButton`, `StatusBadge`, `ShimmerLoader` ve `GlassTextField` gibi yeniden kullanılabilir bileşenler oluşturdum. Bu sayede MCP iOS uygulaması daha kolay ölçeklendi; çünkü yeni ekranlar aynı görsel dili devraldı.
Adım 2: Modelleri kalıcılıktan ayırdım
Domain modellerini SwiftData kalıcılık modellerinden ayırdım. Bu, iş mantığını temiz ve test edilebilir tuttu.
Ana modeller şunlar:
Bu ayrım, kulağa geldiğinden daha önemliydi. Depolama detaylarını uygulama mantığını yeniden yazmadan değiştirmeme alan sağladı. Bir MCP iOS uygulaması için bu tür bir sınır, gelecekteki özellikleri yayınlamayı kolaylaştırır.
Güvenlik kararı: API anahtarları için yalnızca Keychain
Bozmayacağım tek bir kural belirledim: API anahtarları asla Supabase’e dokunmayacak. Veritabanında yalnızca `apiKeyRef` saklıyorum; gerçek anahtar ise iOS Keychain’de yaşıyor.
Bu, veritabanı ihlalinin kimlik bilgilerini açığa çıkarmadığı anlamına geliyor. Taviz ise anahtarların cihazlar arasında otomatik senkronize olmaması. Kullanıcıların yeni telefonda yeniden girmesi gerekiyor; ancak bu birkaç saniye sürüyor ve ciddi bir güvenlik riskini ortadan kaldırıyor.
Adım 3: MCP istemcisini oluşturdum
İstemci JSON-RPC over HTTP kullanıyor; bu, MCP spesifikasyonundaki Streamable HTTP transport ile uyumlu. Her istek, JSON-RPC gövdesiyle birlikte standart bir HTTP POST olarak gönderiliyor.
Uygulama dört temel işlemi destekliyor:
Yetkilendirme token’larını istek zamanında Keychain’den yüklüyorum. Bu, MCP iOS uygulaması için güvenliği artırıyor ve sırların bellekte ihtiyaç olandan daha uzun süre tutulmasını engelliyor.
Bunu, istek akışı gerçek kullanımda kararlı hissedene kadar kendi sunucularım üzerinde test ettim. Sonuç, beklenenden öngörülebilir gecikme ve çok daha iyi bir mobil deneyim oldu.
Adım 4: Supabase’i bağladım
Kimlik doğrulama ve senkronizasyon için Supabase kullandım; çünkü üretime hızlı bir yol veriyor. Backend’de dört tablo var:
Her tabloda Row Level Security (RLS) var. Bu, kullanıcıların yalnızca kendi kayıtlarına erişebileceği anlamına geliyor. Ayrıca signup’tan sonra bir profilin otomatik oluşturulmasını sağlayan bir veritabanı tetikleyicisi (trigger) ekledim.
Auth, Apple ile Sign in ve email/password destekliyor. Bu, kullanıcıları tek bir giriş yöntemine zorlamadan temiz bir kayıt akışı sağladı. Bir MCP iOS uygulaması için bu esneklik benimsemeyi kolaylaştırır.
Adım 5: Ana özellikleri oluşturdum
Uygulamada üç temel yüzey var: sohbet, sunucu yönetimi ve ayarlar. Her birini telefonda deneyimin hızlı kalması için odaklı tuttum.
Sohbet arayüzü
Sohbet, bir durum makinesi (state machine) kullanıyor: `idle` → `sending` → `streaming` → `toolCalling` → `idle`. Araç çağrıları, araç adı, argümanlar, sonuç ve yürütme süresiyle birlikte genişletilebilir kartlar olarak satır içinde görünüyor.
Bu UI önemli; çünkü kullanıcıların AI’nın ne yaptığını güvenle anlamasına yardımcı oluyor. Tahmin etmek yerine her adımı görebiliyorlar.
Sunucu yönetimi
Kullanıcılar sunucu ekleyebilir, düzenleyebilir ve silebilir. URL doğrulaması, kaydırarak silme (swipe-to-delete) ve onay diyalogları ekledim; böylece sunucu değişiklikleri güvenli ve bilinçli hissettiriyor.
Her sunucu detay görünümü sağlık verilerini, Swift Charts ile gecikme grafiklerini ve mevcut araçları ile parametre şemalarını listeleyen bir Tool Explorer’ı gösteriyor. Bu, MCP iOS uygulamasını sadece basit bir sohbet ön yüzünden daha kullanışlı hale getirdi.
Navigasyon ve ayarlar
`NavigationStack` ve tür güvenli (type-safe) rotalarla üç sekmeli bir düzen kullandım. Derin bağlantılar (deep linking), `mcpconnect://` URL şeması üzerinden çalışıyor.
Ayarlar şunları içeriyor:
Adım 6: MCP sunucu endpoint’ini dağıttım
En zor kısım, stdio tabanlı bir MCP sunucusunu mobil cihazdan erişilebilir hale getirmekti. Kişisel sitemdeki MCP sunucum başlangıçta `StdioServerTransport` ile yerel bir Node.js süreci olarak çalışıyordu.
Bunu MCP iOS uygulamasına açığa çıkarmak için Vercel’deki Next.js siteme bir API route ekledim. Bu route, JSON-RPC isteklerini yerel sunucu implementasyonuna köprülemek için MCP SDK’sının `InMemoryTransport` özelliğini kullanıyor.
Her istek, `createLinkedPair()` ile taze bir sunucu/istemci çifti oluşturur, işlemi çalıştırır ve yanıtı döndürür. Bu yaklaşım, uzun ömürlü bağlantılardan kaçındığı için serverless altyapıya iyi uyuyor.
Endpoint `https://uygarduzgun.com/api/mcp` adresinde yaşıyor ve herhangi bir MCP istemcisinden çağırabildiğim 15 aracı açığa çıkarıyor. Bu kurulum, yerel bir araç sunucusunu, tüm backend’i yeniden tasarlamadan mobil uyumlu bir servise dönüştürdü.
Bu mimari neden işe yarıyor?
Pratikte işe yaramasının nedeni, her isteğin stateless ve izole olması. Bu, operasyonel riski azaltır ve ölçeklemeyi çok daha kolay hale getirir. Bir MCP iOS uygulaması geliştiriyorsanız, serverless dağıtım için bu deseni düşünmeye değer.
Adım 7: IAP ve gelir elde etme (monetization)
Basit bir free/pro modeli için StoreKit 2 kullandım. Ücretsiz katman kullanılabilir; ancak Pro katmanı, power user’ların en hızlı şekilde çarptığı limitleri kaldırıyor.
| Özellik | Ücretsiz | Pro ($4.99/ay) |
|---|---|---|
| --- | ---: | ---: |
| Sunucular | 2 | Sınırsız |
| Sohbetler | 50 | Sınırsız |
| Geçmiş | 30 gün | Sınırsız |
| Temalar | Koyu + Açık | + özel vurgu |
| Arama | Mevcut sohbet | Tam metin tümü |
Bu modeli seviyorum; çünkü gündelik kullanıcıları cezalandırmıyor. Uygulama gerçek bir iş akışının parçası haline geldiğinde doğal olarak genişleyen, baştan yeterli bir değer sunuyor.
Proje istatistikleri ve sonuçlar
Geliştirme beklediğimden daha büyük çıktı, ama yapı temiz kaldı.
Bu sayılar önemli; çünkü uygulamanın bir prototip değil, üretime hazır (production-grade) olduğunu gösteriyor. Gerçek bir MCP iOS uygulaması istedim ve onu yayınladım.
Bu makaleye ekleyebileceğim görseller
Bu yazıyı yayınlarsam, okuyuculara yardımcı olmak ve SEO’yu iyileştirmek için açıklayıcı alt metin (alt text) içeren ekran görüntüleri eklerdim.
Önemli çıkarımlar
MCP Connect, MCP iOS uygulaması fikrinin pratik, güvenli ve gerçek kullanım için hazır olduğunu gösteriyor. Mobil AI araçları geliştiriyorsanız, bu mimari size zaman kazandırabilir ve riski azaltabilir. audio signal levels explained ile ilgili bağlantılı yazıyı okuyun veya isterseniz bir sonraki adımda sunucu kodunu da parçalayarak açıklamam için yorum bırakın.