Model Bağlam Protokolü (MCP) çevresindeki ekosistem olgunlaştıkça, sağlam ve ölçeklenebilir sunucu mimarilerine olan ihtiyaç hayati hale gelir. Statik araç tanımları basit kullanım durumları için işe yarasa da, kurumsal düzeydeki uygulamalar araçların çalışma zamanında kaydedilmesini gerektirir. Bu yaklaşım, dinamik araç keşfi ve kaydı olarak bilinir ve MCP sunucularının sunucu yeniden başlatma gerektirmeden değişen veri kaynaklarına, kullanıcı izinlerine veya eklenti kurulumlarına uyum sağlamasını sağlar.
Bu yazıda, Python kullanarak bir MCP sunucusunda dinamik bir araç kayıt defterinin nasıl uygulanacağını keşfedeceğiz. Statik yapılandırmadan öteye geçerek, araçların programlı olarak eklenebildiği, silinebildiği ve kefedildiği esnek bir sistem oluşturacağız.
Statik Tanımlarla İlgili Zorluklar
Geleneksel MCP uygulamaları, genellikle sunucu başlatma aşamasında tanımlanan sabit bir araç kümesine dayanır. Bu kolay uygulanabilir olsa da, birkaç sınırlama sunar:
- Esneklik Eksikliği: Sunucuyu yeniden dağıtmadan yeni yetenekler ekleyemezsiniz.
- Kaynak İsrafı: Hiçbir zaman kullanılmayanlar da dahil olmak üzere tüm araçlar belleğe yüklenir.
- Karmaşıklık: Artan sabit kodlanmış araç tanımları listesinin yönetimi zorlaşır.
Dinamik kayıt, araç tanımını sunucu başlatmasından ayırarak bu sorunları çözer. Her olası aracı önceden listelemek yerine, herhangi bir zamanda yeni araç sınıflarını veya işlevlerini kabul edebilen bir kayıt defteri oluştururuz.
Dinamik Bir Kayıt Defterinin Mimarisi
Dinamik keşfi uygulamak için üç temel bileşene ihtiyacımız vardır:
- Kayıt Defteri: Mevcut tüm araçlar için meta verileri ve uygulamaları tutan merkezi bir depo (genellikle bir sözlük veya liste).
- Keşif Mekanizması: Veritabanından, dosya sisteminden veya ağ uç noktasından yeni araçları tarayan bir süreç.
- Sunucu İşleyicisi: Bir
initializeveyatools/lististeği alındığında kayıt defterinden okuyan mantık.
Uygulama Örneği
Python ve resmi MCP SDK kullanarak pratik bir uygulamaya bakalım. İşlevleri otomatik olarak küresel bir kayıt defterine kaydeden bir temel araç dekoratörü oluşturacağız.
from mcp.server import Server
from mcp.types import Tool, TextContent
import asyncio
# Keşfedilen araçları saklamak için küresel kayıt defteri
tool_registry = {}
def register_tool(name, description):
"""Araçları dinamik olarak kaydetmek için dekoratör."""
def decorator(func):
tool_metadata = {
"name": name,
"description": description,
"handler": func
}
tool_registry[name] = tool_metadata
return func
return decorator
# Örnek: Dinamik olarak eklenen araç
@register_tool("get_weather", "Bir konum için mevcut hava durumu verilerini getirir")
async def get_weather(location: str) -> str:
# API çağrısını simüle et
return f"{location} konumunda hava güneşli."
# Örnek: Başka bir dinamik araç
@register_tool("ping_server", "Sunucunun ayakta olup olmadığını kontrol eder")
async def ping_server() -> str:
return "Pong!"
# MCP Sunucusunu Başlat
server = Server("dynamic-tool-server")
@server.list_tools()
async def list_tools():
"""
Dinamik kayıt defterini bir dizi MCP aracı olarak ortaya çıkar.
Bu yöntem, istemci tarafından mevcut araçları keşfetmek için çağrılır.
"""
tools = []
for name, metadata in tool_registry.items():
# Gerçek bir uygulamada, işleyiciyi girdi şemalarıyla doğru bir Tool tanımına
# eşlemeniz gerekir
tools.append(Tool(
name=name,
description=metadata["description"]
))
return tools
@server.call_tool()
async def call_tool(name: str, arguments: dict):
"""
Araç çağrılarını kayıt defterindeki doğru işleyiciye yönlendir.
"""
if name not in tool_registry:
raise ValueError(f"Bilinmeyen araç: {name}")
handler = tool_registry[name]["handler"]
# Sağlanan argümanlarla işleyiciyi çalıştır
result = await handler(**arguments)
return [TextContent(type="text", text=str(result))]
async def main():
async with server.run() as server:
await server.serve()
if __name__ == "__main__":
asyncio.run(main())
Gelişmiş Keşif Stratejileri
Yukarıdaki örnek, eklenti benzeri mimariler için harika olan dekoratör tabanlı bir yaklaşım kullanır. Ancak daha karmaşık senaryolar için dosya sistemi keşfi veya veritabanı destekli kayıt uygulamak isteyebilirsiniz. Örneğin, Python modüllerini aramak için bir plugins/ dizinini tarayabilir, bunları içe aktarabilir ve belirli bir öznitelikle işaretlenmiş herhangi bir işlevi otomatik olarak kaydedebilirsiniz.
Başka bir gelişmiş desen, bağlama duyarlı keşiftir. Kayıt defteriniz, hangi araçların geçerli kullanıcı oturumu için görülebilir olduğunu belirlemek için bir yapılandırma hizmetini veya kullanıcı izin veritabanını sorgulayabilir. Bu, hassas araçların yalnızca yetkili istemcilere sunulmasını sağlarken, genel amaçlı araçların halka açık kalmasını sağlar.
Dinamik Kayıt için En İyi Uygulamalar
- Şema Doğrulama: Dinamik olarak kaydedilen araçların, girdi argümanları için sıkı JSON Şema tanımlarına uyduğundan emin olun. Bu şemaları tam olarak tanımlamak için
mcp.typesmodülü kullanılmalıdır. - Hata Yönetimi: Kayıt defterinizin
call_toolişleyicisinde sağlam hata yönetimi uygulayın. Bir dinamik araç başarısız olursa, sunucu çökmemeli, yapılandırılmış bir hata döndürmelidir. - Sıcak Yeniden Yükleme: Kayıt defterini temizlemek ve değişiklikler için yeniden taramak için bir mekanizma uygulamayı düşünün. Bu, geliştiriclerin tüm MCP sunucu işlemini yeniden başlatmadan yeni araçlar eklemesine olanak tanır.
Sonuç
Dinamik araç keşfi ve kaydını uygulamak, MCP sunucunuzu statik bir uç noktadan, yapay zeka uygulamalarınızın yaşayan, nefes alan bir uzantısına dönüştürür. Python dekoratörlerini, merkezi kayıt defterlerini ve şema doğrulamayı kullanarak, zarif bir şekilde ölçeklenen ve yeni gereksinimlere anında uyum sağlayan sistemler oluşturabilirsiniz. MCP ekosistemi büyümeye devam ettikçe, bu kalıpları benimsemek sunucularınızın esnek, güvenli ve performanslı kalmasını sağlayacaktır.