Gerçek bir host'a bağlanma
Makine çevirisi
Bu sayfa İngilizce dokümantasyondan otomatik olarak çevrildi; esas alınması gereken sürüm İngilizce sayfadır. Yanlış görünen bir şey varsa, nasıl bildireceğinizi Çeviriler sayfası açıklar.
Host, sunucunuzun sonunda içine girdiği uygulamadır: Claude Desktop, Claude Code, bir IDE. Kullanıcının konuştuğu şey host'tur. Onun içinde bir MCP istemcisi sunucunuzu bir alt süreç olarak başlatır ve onunla o sürecin stdin'i ve stdout'u üzerinden konuşur.
Yani bir host'a bağlanmak tek bir eylemdir: ona sunucunuzu başlatan komutu söylersiniz. Bu sayfadaki her şey (iki CLI komutu, üç JSON dosyası) aynı komutu koyacağınız farklı bir yerdir.
Tek sunucu, her host
from mcp.server import MCPServer
mcp = MCPServer("Bookshop")
CATALOG = {
"Dune": "Frank Herbert",
"Neuromancer": "William Gibson",
"The Left Hand of Darkness": "Ursula K. Le Guin",
}
@mcp.tool()
def search_books(query: str) -> list[str]:
"""Search the catalog by title or author."""
needle = query.lower()
return [title for title, author in CATALOG.items() if needle in title.lower() or needle in author.lower()]
@mcp.tool()
def get_author(title: str) -> str:
"""Look up the author of a book in the catalog."""
if title not in CATALOG:
raise ValueError(f"No book titled {title!r} in the catalog.")
return CATALOG[title]
@mcp.resource("catalog://titles")
def titles() -> str:
"""Every title in the catalog, one per line."""
return "\n".join(sorted(CATALOG))
if __name__ == "__main__":
mcp.run()
İki araç ve bir kaynak, tek dosya. Bu dosyayla ilgili üç şey aşağıdaki her host için önemlidir:
- Argümansız
mcp.run()bir stdio sunucusu başlatır: bloklar, protokol mesajlarını stdin'den okur ve stdout'a yazar. Bu sayfadaki her host'un konuştuğu aktarım budur. Host dosyanızı bir alt süreç olarak başlatır ve bu iki kanalın sahibidir; bağlanmanın her zaman yalnızca "işte komut" olmasının nedeni de budur. Hiçbir zaman port seçmezsiniz ve hiçbir şey bir portu dinlemez. run(),if __name__ == "__main__":altındadır. Aşağıdaki her şey bu dosyayı çalıştırmak yerine import eder; bu yüzden korumasız birrun(), modülü herhangi bir şey yüklediği anda bir sunucu başlatırdı.- Sunucu nesnesi,
mcpadında modül düzeyinde bir globaldir.mcp run'ın aradığı ad budur (serverveappde olur). Başka bir ad verirseniz açıkça belirtirsiniz:mcp run server.py:bookshop.
Bu, bu sayfadaki son Python satırı. Buradan aşağısı tamamen host yapılandırması.
Başlatma komutu
Aşağıdaki her host aynı komutu alır:
uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
Hepsi için tek komut, çünkü uv run --with SDK'yı anında yeni bir ortama çözümler: herhangi bir dizinden çalışır, ne bir projeye ne de etkinleştirilecek bir sanal ortama ihtiyaç duyar. Bu, burada başka her yerden daha önemlidir; çünkü host sunucunuzu sizin kabuğunuzdan değil, kendi çalışma dizininden ve neredeyse boş bir ortamla başlatır.
Bu aynı zamanda mcp install'un sizin için Claude Desktop'ın yapılandırmasına yazdığı komuttur (aşağıda). Böylece elle yazdığınız ile aracın ürettiği, aracın eklediği tam sürüm sabitlemesi dışında örtüşür.
Host uv'yi bulamazsa
Host sunucunuzu asgari bir PATH ile başlatır ve uv bunun üzerinde olmayabilir. Yalın
uv'yi which uv (macOS/Linux) veya where uv (Windows) çıktısındaki mutlak yolla değiştirin.
mcp install'un yazdığı da tam olarak budur.
Bu sayfa yerel senaryoyu anlatır
Buradaki her şey sunucunuzu host'un bulunduğu makinede çalıştırır: host dosyanızı stdio
üzerinden başlatır. Kişisel ya da tek makinelik bir araç için bu tam olarak doğru olandır.
Dosyanıza sahip olmayan insanlara bir sunucu vermek için komut değil URL dağıtırsınız:
aynı mcp nesnesi, Streamable HTTP üzerinden sunulur. Sunucunuzu çalıştırma
bu kararı tek bir tabloda verir, Dağıtım ve ölçekleme ise oradan
gerçek bir ana bilgisayar adına giden yoldur.
Ve host, içinde bir MCP istemcisi olan bir uygulamadan başka bir şey değildir; bu yüzden kendi
Python kodunuz host rolünü oynayabilir: İstemci aktarımları
bu aynı dosyayı stdio_client(...) ile bir alt süreç olarak başlatır, Test etme
ise ona hiç süreç olmadan bellek içinde bağlanır.
Claude Desktop
SDK'nın sizin için yapılandırabildiği tek host:
uv run mcp install server.py
Hepsi bu. mcp install sunucunun adını okumak için dosyayı import eder, Claude Desktop'ın yapılandırma dosyasını bulur ve başlatma komutunu içine yazar. Bu arada yolunuzu mutlak bir yola çevirir, sizin yapmanıza gerek kalmaz.
Kafa karıştıracak bir şey yok. Yazdığı kayıt şu:
{
"mcpServers": {
"Bookshop": {
"command": "/absolute/path/to/uv",
"args": [
"run",
"--frozen",
"--with",
"mcp[cli]==2.0.0",
"mcp",
"run",
"/absolute/path/to/server.py"
]
}
}
}
Bu, yukarıdaki bölümdeki başlatma komutunun üç eklemeli hâli: uv'nin mutlak yolu, uv yakınında bulunduğu bir kilit dosyasını asla yeniden yazmasın diye --frozen ve kurulu mcp sürümüne tam bir sabitleme. Şurada bulunan claude_desktop_config.json dosyasına yazılır:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Bu dosyayı elle yazabilirsiniz. mcp install, bunu yaparken klasik hatayı (göreli yol) yapmayın diye vardır.
Claude Desktop'tan tamamen çıkın (yalnızca penceresini kapatmayın) ve yeniden açın.
Warning
Claude Desktop'ın yapılandırma dizini henüz yoksa mcp install, Claude app not found
hatasıyla başarısız olur. Claude Desktop'ı kurun ve bir kez çalıştırın: dizini oluşturan budur.
Tip
Claude Desktop sunucunuzu kendi sürecinde başlatır; bu yüzden kabuğunuzun ortam değişkenleri
orada yoktur. uv run mcp install server.py -v API_KEY=abc123 (veya -f .env) bunları kaydın
env alanına işler. --name kayıt adını geçersiz kılar; varsayılan olarak sunucunun name
değeridir.
Claude Code
Düzenlenecek dosya yok. Sunucuyu claude CLI ile kaydedin; -- sonrasındaki her şey başlatma komutudur.
claude mcp add bookshop -- uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
bookshop'un bağlı olduğunu ve araçlarının listelendiğini doğrulamak için bir Claude Code oturumunda /mcp çalıştırın.
Cursor
Proje kök dizininizde .cursor/mcp.json dosyasını oluşturun.
{
"mcpServers": {
"bookshop": {
"command": "uv",
"args": ["run", "--with", "mcp[cli]", "mcp", "run", "/absolute/path/to/server.py"]
}
}
}
Aynı command artı args, Claude Desktop'ın kullandığı aynı mcpServers anahtarı altında. Sunucu, Cursor'ın MCP ayarlarında iki araç da listelenmiş olarak görünür.
VS Code
Proje kök dizininizde .vscode/mcp.json dosyasını oluşturun.
{
"servers": {
"bookshop": {
"type": "stdio",
"command": "uv",
"args": ["run", "--with", "mcp[cli]", "mcp", "run", "/absolute/path/to/server.py"]
}
}
}
Cursor'ın dosyasından iki fark var ve yalnızca bu ikisi: sarmalayıcı anahtar mcpServers değil servers'tır ve her kayıt type'ını bildirir. Güven iletişim kutusunu onaylayın; ardından Command Palette'teki MCP: List Servers, bookshop'u çalışır durumda gösterir.
Note
GitHub Copilot eklentisiyle oturum açılmış VS Code 1.99 veya üzeri gerekir (Copilot Free yeterli) ve Copilot Chat Agent modunda olmalıdır; çünkü başka hiçbir mod araç çağırmaz.
Görünmüyor
Herhangi bir host yapılandırmasına dokunmadan önce başlatma komutunu kendiniz çalıştırın:
uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
Hiçbir şey yazdırmaz ve geri dönmez. Bu sessizlik doğrudur: stdio sunucusu, bir host'un stdin'de ilk konuşan taraf olmasını bekler (durdurmak için Ctrl-C). Asıl hata bir traceback ya da anında çıkıştır; artık onu bir host üzerinden tahmin etmeye çalışmak yerine okuyabilirsiniz.
Bu komut oturup beklediğinde, geriye kalan neredeyse her zaman üç şeyden biridir:
- Göreli yol. Host sunucunuzu kaydı yaptığınız dizinden değil, kendi çalışma dizininden başlatır.
/absolute/path/to/server.pygereken yerdeserver.pyyazmak, açık ara en yaygın hatadır. Hostuv'yi de bulamıyorsa o yol da mutlak olmalıdır. - Host hâlâ eski yapılandırmasını çalıştırıyor. Host'lar yapılandırmalarını başlarken okur. Özellikle Claude Desktop'tan,
claude_desktop_config.jsonüzerindeki bir düzenleme etkili olmadan önce tamamen çıkılması (yalnızca penceresinin kapatılması değil) ve yeniden açılması gerekir. - Yönlendirilen pencerenin dışında stdout'a bir şey ulaştı. stdio'da stdout protokolün ta kendisidir. SDK, hizmet verirken flush edilmiş başıboş çıktıyı stderr'e yönlendirir; ancak o andan önce stdout'a flush edilen çıktı (bir sarmalayıcı betiğin echo'su, tamponsuz bir süreçte import anında bir
print()) ya da yorumlayıcı çıkışında boşaltılan tamponlanmış birprint(), host'a bozuk bir mesaj verir ve host bağlantıyı keser. stderr işleyicisi her kaydı flush eden varsayılanloggingyapılandırmasıyla log tutun; özel işleyiciler de stdout'tan uzak durmalıdır. Ayrıntıların tamamı Logging sayfasında.
Claude Desktop her sunucu için bir log tutar: mcp-server-<NAME>.log sunucunuzun stderr'idir, bağlantılar için mcp.log'un yanında; macOS'te ~/Library/Logs/Claude, Windows'ta %APPDATA%\Claude\logs altında.
Bu üçünün ötesindeki her şey için doğru sayfa Sorun giderme.
Özet
- Host (Claude Desktop, bir IDE), sunucunuzu stdio üzerinden bir alt süreç olarak başlatan bir MCP istemcisi çalıştırır. Bağlanmak, ona tek bir başlatma komutu vermek demektir.
- O komut
uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py: etkinleştirilecek venv yok, her dizinden çalışır. - Claude Desktop,
mcp install'un sizin için yapılandırdığı tek host'tur. Aynı komutu (artıuv'nin mutlak yolu,--frozenve kurulu sürüme tam bir sabitleme)claude_desktop_config.jsondosyasına yazar; böylece sizin yapmanıza hiç gerek kalmaz. - Claude Code için
claude mcp add bookshop -- <launch command>. Cursor içinmcpServersaltında.cursor/mcp.json. VS Code içinserversaltında.vscode/mcp.json, her kayıtta birtypeile. - Her yerde mutlak yollar, yapılandırmasını düzenledikten sonra host'u yeniden başlatın ve SDK dışında hiçbir şeyin stdout'a yazmasına izin vermeyin.
Bu sayfadaki her host aynı dosyaya, aynı komutla bağlandı. O dosyanın neler sunabileceği ise bu belgelerin geri kalanı: Araçlar, Kaynaklar ve stdio dışındaki tüm aktarımlar için Sunucunuzu çalıştırma.