Bir MCP Müşteri Oluşturma: keşif, yönlendirme ve Çift Çağ Düşüşü
Type: Build
Languages: Python
Prerequisites: Phase 13, Lesson 07
Time: ~85 minutes
Öğrenme Hedefleri
- Her MCP ' yi oluşturun .
2026-07-28Mevcut metadata ile başvuru. - Sence stdio sunucuları
server/discoverve karşılıklı desteklenen bir versiyonu seçin. - Sınırlı bir miras araştırmasını açıkça izin verilen yaşıtlar için izin verin.
- Bir erkeği sadece pozitif bir sonucu doğrulttuktan sonra kabul et .
initializedesteklenen bir inceleme sonucu. - Sessizce çarpışmaları üstü yazmadan belirleyici araç listelerini birleştirin.
- Her bir aletin sahibi olan eşlerine protokol seanslarını icat etmeden arama yolu.
Sorun
Bir ajan host genellikle birden fazla MCP sunucusuna konuşur. Her sunucuyu keşfetmek, araç kataloglarını birleştirmek, kopya isimlerini çözmek, rota çağrılarını yapmak ve ulaşım hatalarından kurtulmak gerekir.
- Evet .
2026-07-28Değişiklik sabit duruma daha basit hale getirir çünkü her talep kendiliğinden içerir. Uygunluk başlangıç daha ince yapar. Bir istemci:
- tercih edilen sürümü destekleyen modern bir sunucu;
- Tanınan bir sürüm veya başlık hatası gönderen modern bir sunucu;
- Hiç duymadığın bir miras sunucu .
server/discover- ... - Alana kadar sessiz kalan bir miras sunucu .
initialize- Evet .
Her bir sonda hatası miras olarak değerlendirilmesi tehlikelidir. Yanlış biçimlendirilmiş modern bir taleb, aşırı yüklü bir sunucu, ölü bir süreç ve eski bir sunucu, aynı zaman sonunu veya bağlantı kapanmasını oluşturabilir. Bu sinyaller belirsizdir.
Anlaşım
Bir akran, protokol oturumu değil
Her sunucu işlem veya son noktası için bir taşıma eş dosyası tutun:
- taşıma elliği veya gönderme işlevi;
- Seçilen protokol çağı ve versiyonu;
- Son keşfedilen sunucu özellikleri;
- son belirleyici araç listesi;
- İlişki için bekleyen talebinin kimlikleri;
- ulaşım sağlığı.
Bu müşteri hesaplama. Bu protokol oturum durumu değil. Modern MCP'de, sunucu hala her istek için mevcut sürüm ve özellikleri alır.
Her modern talebi sıfırdan inşa et
pythondef modern_request(request_id, method, params, version, capabilities):
return {
"jsonrpc": "2.0",
"id": request_id,
"method": method,
"params": {
**params,
"_meta": {
"io.modelcontextprotocol/protocolVersion": version,
"io.modelcontextprotocol/clientCapabilities": capabilities,
"io.modelcontextprotocol/clientInfo": CLIENT_INFO,
},
},
}Bir bağlantı nesneye bir kez metadata eklemeyin ve teline ulaştığını varsayın. Son serileşmiş talebi damgalayın ve kontrol edin.
Modern keşif
server/discoverdesteklenen sürümleri, sunucu yeteneklerini, talimatları, önbelleğe işaretleri ve önerilen sunucu kimliğini gönderir. Bir istemci en yüksek karşılıklı desteklenen modern sürümü seçer.
Discovery yalnızca modern bir istemci için seçmeli, ancak studio'da önerilmektedir. Bazı eski sunucular başlangıçtan önce bir işlem kabul eder, bu nedenle göndermek tools/listİlk olarak belirsiz bir başarı elde edebilirsiniz.server/discoverTemiz bir çağ sınırını yaratıyor.
Stdio uyumluluk sondası
İki çağda bir stüdyo müvekkilesi gönderir.server/discoverDiğer isteklerden önce tercih edilen modern metadata ile.
- DiscoverResult.Sunucu modern. karşılıklı desteklenen bir sürümü seçin ve istek başına metadata ile devam edin.
- Recognized modern error.Sunucu modern.
-32022, seçindata.supportedBaşlık veya yetenek hataları için, talebi düzeltin.initialize- Evet . - Ambiguous signal.Tanınmayan bir JSON-RPC hatası, zaman sonlaması, bağlantı kapanması veya boş bir yanıt bir çağı tanımlamaz.
Tanınan modern protokol hataları şunları içerir:
-32020BaşlıkTamışmazlık-32021İhtiyaçlı Müşteri yeteneği eksik-32022Desteklenmeyen ProtokolVersion
Tanınan modern hatalar, eşleri miras bırakılmış izin listesindeyken bile modern kalır. Bir sunucu modern hata sözlüklerini anladığını kanıtladıktan sonra, gönderme initializeBu bir aşağı derecede.
Tedavi etmeyin .-32601Bu, açıkça izin verilen bir eş eşini yalnızca bir eş eşliğin verilebilmesi için uygun hale getirir. Aynı kural bir zaman kesimi, bağlantı kapanması veya boş bir cevap için geçerlidir.
İzin verilme, işçinin niyeti, kanıt değil.
Miras uyumluluğu, bir sabitli eş eşya yapılandırmasının açık bir özelliği olmalıdır:
pythonclient.add_server("archive", archive_transport, allow_legacy=True)Bu seçeneği yapılandırılmış komut veya son noktaya bağlayın.allow_legacy=TrueAçıklama sonucu belirsiz bir şekilde ortaya çıkınca başarısız olur ve asla almaz .initialize- Evet .
İzin veren, arama izni verir.initializetaşımacılık zorunlu bir süre içinde, aşağıdaki tüm özellikleri gerektirir:
- bir JSON-RPC
2.0Eşleşen talebinin kimliği ile cevap; - Tam olarak bir tane .
resultVe hayır .error- ... - A.
protocolVersionMüşteri'nin yapılandırılmış eski revizyondan oluşan seti; - bir nesne değerlendirici
capabilitiesalan; - A.
serverInfoBoş olmayan bir dizileri olan nesnenameveversionAlanlar.
Zamanlama, bağlantı kapatılması, hata tepkisi, yanlış biçimlendirilmiş sonuç, eşleşmeyen kimlik veya desteklenmeyen bir düzeltme kapanmaz. Sadece yapısal olarak geçerli olumlu sonuçlar miras çağını seçer.legacy_probe_timeout_msTransport adaptörüne; gerçek bir stdio veya HTTP adaptörü, bu süreyi sadece kaydetmek yerine uygulamalıdır.
Seçilen çağı taşımacılık eşleri için önbelleğe koyun.
Miras uyumluluk dalıdır
Sınırlı araştırma geçerli olumlu miras kanıtını döndürdükten sonra, müşteri seçilen miras versiyonunu bu değişiklikle tanımlanan şekilde kullanır:
- Cevap zarfını ve ilişki kimliğini kontrol edin.
- Tartışılmış revizyonun yapılandırılmış miras setinde olduğundan emin olun.
- Geçerli özellikleri ve sunucu kimliğini kaydet.
- Gönder .
notifications/initializedSadece tüm çeklerin geçtiği zaman. - Bu nakliye ömrü için eski talep şekilleri kullanın.
Bu dal bilinen eşcinsellerle birlikte çalışabilmek için var. Yeni sunucular veya yeni talepler için varsayılan tasarım değildir. Eğer nakliye yeniden başlanır veya son noktası değişirse, eşcins çağı önbelleğini atın ve yeniden müzakere edin.
Bulma ve önbelleğe alma araçları
Her aktif yaşıt için arayın.tools/listModern bir sonuç içerir .resultType- Evet .ttlMsvecacheScope.Tamamlı izin bağlamında tazelik ipucuyu onurlandırın. İptal edildikten sonra veya aboneli bir listede değişiklik olayından sonra tekrar alın.
Müşteriler kayıp bir kişiyi tedavi etmelidir .resultType"complete"Daha önceki müzakere döneminden gelen bir yanıt için modern cache alanlarını gerektirmez.
Sunucu belirleyici siparişleri geri göndermelidir. Müşteri ayrıca birleşmeden önce sıralamalıdır, böylece yerel kayıt sırası işlem başlatma zamanına bağlı değildir.
Çarpışma güvenli isim alanı birleşimi
İki sunucu da her ikisini de ortaya çıkarabilir .search. Açıklanan politikayı seçin:
- Prefix on collision.İlk kanonik adını sakla ve daha sonraki çarpışmaları
<server>/<tool>- Evet . - Reject on collision.Doppelini yüklemeyin ve net bir yapılandırma hatası ortaya çıkmasın.
- Silent overwrite.Bu, hangi sunucu model tarafından seçilen eylemleri aldığını saklar.
Hem kanonik hem de yerel isimleri saklayın.tools/callsahip sunucu tarafından açıklanan yerel adı kullanır.
Bir arama yönlendirme
Routing bir aramak.
textcanonical tool name
-> peer name + local tool name
-> new JSON-RPC request id
-> modern request metadata or explicit legacy shape
-> matching response idSahip olan taşımacılık kullanılamadığında arama gönderme.tools/list. Hızlı bir nakliye sırasında kaybedilen modern uçuş istekleri, operasyonun güvenlik politikası izin verdiğinde yeni bir JSON-RPC kimliği ile tekrar denebilir.
İletişim ve abonelik
Modern listeler ve kaynak değişiklikleri sadece müşteri tarafından açılan bir listeye ulaşır subscriptions/listenMüşteri bildirim filtresini gönderir, bekler.notifications/subscriptions/acknowledged, ve bildirim metadatalarında bulunan dinleme istekinin kimliği ile olayları ilişkilendirir.
Bağlantıyı kesince yeni bir dinleme talebi açın ve ilgili listeleri veya kaynakları yeniden düzenleyin.Last-Event-ID- Evet .
Sunucu tarafından başlatılan istekler yok
Modern sunucular, örnekleme, çıkartma veya kök için bağımsız JSON-RPC istekleri ile müşteriyi çağırmazlar.input_required, ve müşteri yerleşik giriş isteklerini yerine getirdikten sonra orijinal talebi tekrar dener.
Girdiyi yerine getirirken eşlerin yanıt okuyucularını engellemeyin. Bağlantıyı koruyun ve tekrar denemek için yeni bir JSON-RPC kimliği oluşturun.
Kullan
code/main.pyBu sistem, iki modern eşe ve bir amaçlı olarak izin verilen miras eşe ile bağlantılıdır, sonra araçlarını birleştirir ve yönlendirir.
bashcd code
python3 main.py
python3 -m unittest discover tests -vTestler normal demoların kaçırdığı sınırlar kanıtlıyor:
- modern istekler metadata tekrarlama yapar;
-32022Başlangıç olmadan modern keşifleri tekrar denemek;- Tanınan modern hatalar, izin verilen bir eş için bile asla aşağı derecede değil;
- Zaman kesintileri, bağlantı kapanması, boş cevaplar ve tanınmamış hatalar tetiklenmez.
initializeİzin verilmeyen; - İzin verilen bir eşe sadece geçerli, desteklenen bir mirasından sonra miras olur.
initializeSonuç; - yanlış biçimlendirilmiş ve desteklenmeyen miras sonuçları, eşcinselliği kullanılamaz hale getirir;
- Başarılı bir şekilde seçilen bir dönem, nakliye ömrü için önbelleğe alınır.
Gönder
Bu ders gemileri outputs/skill-mcp-client-harness.mdModern talep damgasını, studio çağında müzakereyi, belirleyici isim alanı birleşimini, yönlendirmeyi ve başarısızlıkla kapatılmış bir miras uyumluluğu dalını destekler.
Egzersizler
- Sahte bir sunucu dönüşü yapın .
-32022Müşteriyi göndermek yerine başarısız olduğunu onaylayıninitialize- Evet . - Sahte bir miras sunucusu izin verin, sınırlı yapın.
initializeZamanı araştırıp, eşlerin kalıp kaldığını kanıtla.unknownve kullanılamıyor. - Ekle
cacheScope: "private"iki yetki bağlamı için araç listeleri. Müşteriyi bir bağlamın önbelleğe alınmış sonucu diğerine asla paylaşmadığını doğrulayın. - Çatışma politikasını reddetmeye değiştirin ve hatadaki her iki eş isimle başlatmayı başarısız edin.
- Son bir ekle
subscriptions/listenAkım kaybı durumunda, yeni bir istek kimliği ile tekrar dinleyin ve yeniden düzenleme araçları kullanın.
Anahtar Terimler
| Term | Meaning |
|---|---|
| Peer | Client-side record for one server transport and its discovered data |
| Protocol era | Modern per-request metadata or legacy initialization semantics |
| Discovery probe | Initial server/discover used to identify the stdio era |
| Recognized modern error | Error that proves modern behavior and forbids legacy fallback |
| Legacy allowlist | Operator configuration permitting one bounded compatibility probe for a pinned peer |
| Positive legacy evidence | Valid, correlated initialize result for an explicitly supported legacy revision |
| Merged namespace | Canonical tool names across all active peers |
| Collision policy | Prefix or reject rule for duplicate tool names |
| Era cache | Selected modern or legacy behavior stored for one transport peer |
| Transport recovery | Restart or reconnect, rediscover, relist, and retry safely with a new id |
Daha Fazla Okumak
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.