Pek çok geliştirici iki araç sunucusuna zaten doğrudan düzenleyicisinden ulaşıyor: güncel
kütüphane belgeleri için Context7, kitaplar, videolar ve eğitimler için
O’Reilly. Her ikisi de kişisel bir anahtar ister; bu yüzden herkesin .mcp.json
dosyasında bir tane bulunur:
"oreilly": {
"type": "http",
"url": "https://api.oreilly.com/api/content-discovery/v1/mcp/",
"headers": {
"Authorization": "Bearer ${OREILLY_MCP_TOKEN}"
}
},
"context7": {
"type": "http",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "${CONTEXT7_API_KEY}"
}
}
Bu yöntem tek bir makinedeki tek bir kişi için işe yarar. Sohbet çalışma alanına, ajanlara ya da bir iş arkadaşına hiçbir şey kazandırmaz ve anahtar bir ortam değişkeninde ya da bir dosyada durur. Bu makale iki sunucuyu da platformun arkasına taşır. Yönetici her birini bir kez bağlar. Herkes kendi anahtarını kendi OpenBao klasöründe tutar, konsoldan ya da OpenBao’dan girip değiştirir ve anahtar yalnızca o kişinin kendi çağrılarında dışarı çıkar. Hiçbir zaman bir sohbette, bir yapılandırma dosyasında ya da ortak bir hesapta bulunmaz.
Aşağıdaki her adım 27 Eylül 2026’da canlı bir sistemde yapıldı. Ekran görüntüleri gerçektir; adlar ve adresler değiştirilmiştir.
Kim ne yapar
| Adım | Kim | Nerede |
|---|---|---|
| Sunucuyu kaydetmek | Yönetici | Konsol, /mcp → Register a server |
| Değişkeni o sunucu üzerinde tanımlamak | Yönetici | Konsol, /mcp → Variables |
| Kendi anahtarını kaydetmek, ardından Sync tools | Yönetici | My variables (/vault), ardından /mcp |
| Kendi anahtarını kaydetmek, kontrol etmek ve değiştirmek | Herkes, kendisi için | My variables, OpenBao web arayüzü ya da bao komut satırı |
Kişiler sunucu kaydedemez ve değişken tanımlayamaz: bu adımların her biri platformun trafiği ve kimlik bilgilerini nereye göndereceğine karar verir. Kişilerin elinde olan, kendi anahtarlarıdır.
Anahtarınız nerede durur
Her kişinin değerleri, kv gizli kayıt motorundaki (KV sürüm 2) tek bir klasörde durur:
kv/
└── users/
└── ayse.demir@corp.example/
└── mcp/
├── context7 CONTEXT7_API_KEY
└── oreilly OREILLY_MCP_TOKEN
kv/users/<e-posta>/mcp/<sunucu> yolunu parça parça okuyun:
| Parça | Nedir | Neye dikkat edilmeli |
|---|---|---|
kv |
Gizli kayıt motoru | Her zaman kv |
users/<e-posta> |
Kişisel kasanız | Adresiniz, oturum açtığınız hesapta yazıldığı biçimiyle birebir, büyük-küçük harf dahil. bao token lookup bunu meta.email olarak gösterir |
mcp |
Platformun okuduğu tek klasör | Kasanızın başka bir yerinde tuttuğunuz her şey yalnızca size aittir ve hiçbir yere gönderilmez |
<sunucu> |
Her araç sunucusu için bir gizli kayıt | Sunucunun /mcp sayfasında parantez içinde görünen kısa adı (slug), örneğin oreilly (oreilly) |
| içindeki anahtar | Tanımlanan her değişken için bir anahtar | Değişkenin adı, birebir ve büyük harflerle: CONTEXT7_API_KEY, OREILLY_MCP_TOKEN |
Yol hakkında iki şey daha:
- Kimse
kv/users/klasörünü listeleyemez. Hangi iş arkadaşının kasası olduğunu kimse göremez; bu yüzden kendi klasörünüzü tam yoluyla açarsınız. Konsol size bu klasörün bağlantısını verir. - Komut satırı ve web arayüzü
kv/users/…kullanır; alttaki API ve politikalar değerler içinkv/data/users/…, sürümler içinkv/metadata/users/…kullanır. Bir araç sizden API yolunu isterse, doğru yol budur.
Bölüm A: yönetici
A1. .mcp.json dosyanızda zaten yazanlardan başlayın
Yukarıdaki .mcp.json dosyasındaki her girdi, konsol formlarındaki bir soruyu yanıtlar:
.mcp.json içinde |
Konsolda |
|---|---|
Girdinin adı, oreilly |
Name. Sunucunun kısa adı olur; bu aynı zamanda OpenBao gizli kaydının adıdır. Birebir aynı tutun |
url |
URL (streamable HTTP endpoint) |
| Başlığın adı | Değişkenin Header alanı |
Başlık değerinde ${…} çevresindeki metin |
Değişkenin Template alanı; anahtarın geleceği yerde ${value} olacak biçimde |
${…} içindeki ad |
Kişilerin göreceği Variable adı |
Kısa ad, sunucu kaydedildiği anda sabitlenir. Ad zaten kullanılıyorsa platform sonuna -2
ekler ve OpenBao klasörü kısa adı izler; bu yüzden kişilere anahtarlarının nerede
durduğunu söylemeden önce /mcp sayfasındaki parantezlere bakın.
A2. Her sunucuyu kaydedin
/mcp → Register a server bölümünde adı ve URL’yi girin, Auth alanını none
bırakın (paylaşılan bir anahtar yok: herkes kendi anahtarını getirir) ve require user
(signed assertion) kutusunu işaretleyin. Ardından Register & sync düğmesine basın.

Context7 anahtarsız da yanıt verir, bu yüzden araçları hemen görünür. O’Reilly belirteci olmayan herkesi geri çevirir; bu yüzden ilk eşitleme başarısız olur ve satır, sonra ne yapılacağını açıkça söyler:

Bu beklenen bir durumdur. Sonraki iki adım bunu düzeltir.
A3. Değişkeni tanımlayın ve önce sunucuyu seçin
/mcp → Variables → Declare a variable formunda ilk alan Server alanıdır. Bu
değişkenle ilgili geri kalan her şeyi o belirler:
- Değerin nereye gideceğini belirler. Bir kişinin bu değişkene verdiği değer bu sunucuya gönderilir, başka hiçbir sunucuya gönderilmez.
- Değerin nerede duracağını belirler. Değer, her kişinin OpenBao klasöründe
mcp/<bu sunucunun kısa adı>altında saklanır. - Sonradan değiştirilemez. Bir tanımı düzenlerken teslim yöntemini, başlığı, şablonu, biçimi, zorunlu ve gizli ayarlarını ve açıklamayı değiştirebilirsiniz; sunucuyu ve adı değiştiremezsiniz. Yanlış sunucuya tanımlanmış bir değişken silinip yeniden tanımlanmalıdır ve silmek, kişilerin o değişken için kaydettiği bütün değerleri de siler.
- İki sunucu bir değişkeni asla paylaşmaz. İki sunucu aynı belirteci istiyorsa değişkeni her birinde tanımlayın; herkes de değerini her sunucu için bir kez kaydeder.

Formun geri kalanı doğrudan .mcp.json dosyasındaki başlık satırından gelir:
| Sunucu | Değişken | Teslim | Başlık | Şablon | Zorunlu | Gizli |
|---|---|---|---|---|---|---|
context7 |
CONTEXT7_API_KEY |
header | CONTEXT7_API_KEY |
(boş: değerin kendisi) | evet | evet |
oreilly |
OREILLY_MCP_TOKEN |
header | Authorization |
Bearer ${value} |
evet | evet |
Her biri için bir açıklama yazın; kişiler bunu kendi sayfalarında okur. Declare düğmesinden sonra her iki sunucu da değişkenini ve nereye teslim edildiğini gösterir:

Platformun sizin için zorunlu tuttuğu kurallar: kişiler yalnızca değer girer, hiçbir zaman başlık ya da şablon seçmez; taşıma başlıkları ve platformun kendi başlıkları hedef başlık olarak seçilemez; bir kişinin kaydetmediği zorunlu bir değişken, araç sunucusuna hiçbir şey ulaşmadan o kişinin çağrısını durdurur ve kendi sayfasına bir bağlantı verir.
A4. Kendi anahtarınızı kaydedin, ardından Sync tools
Paylaşılan anahtarı olmayan bir sunucu, araçlarını anonim olarak listelemeyi bile reddeder. Bu yüzden Sync tools, düğmeye basan yöneticinin kendi değeriyle çalışır. Önce kendi O’Reilly belirtecinizi My variables sayfasına kaydedin (aşağıdaki B1 adımı), ardından satırdaki Sync tools düğmesine basın:

Önbelleğe alınan araç listesi, sizin belirtecinizin görebildiği listedir. Herkesin çağrıları yine kendi belirtecini taşır.
Varsayılan olarak bir sunucu, izin verilen ekiplerin oturum açmış bütün kullanıcılarına açıktır. Yalnızca bazı kişilerin ulaşması gereken bir sunucuda Access alanını granted yapıp o kişileri ekleyin. GitHub makalesi aynı adımları üçüncü bir hizmet için anlatır.
Bölüm B: herkes, kendisi için
B1. Anahtarınızı My variables sayfasına kaydedin
Konsolda oturum açın ve My variables (/vault) sayfasını açın. Zorunlu anahtarını
henüz kaydetmediğiniz bir sunucu bunu söyler:

Anahtarınızı yapıştırıp Save düğmesine basın. Satır artık set, kısa bir parmak izi ve in OpenBao gösterir. Değer bir daha hiç gösterilmez, size bile. Sonradan değiştirmek için yeni anahtarı yazıp Replace düğmesine basın; parmak izi değişir.
Sayfanın üstündeki kutu klasörünüzün adını verir ve ona bağlantı içerir:

B2. OpenBao’da kontrol edin
open my folder in OpenBao bağlantısını açın. Yöntem olarak OIDC seçin, Role alanını boş bırakın ve konsolda kullandığınız şirket hesabıyla oturum açın. Bir yönetici de bunun için rolü boş bırakmalıdır: yönetici rolü kasayı işletmek içindir, kişisel anahtarlar için değil.

Bağlantı klasörünüzdeki mcp/ klasörünü açar. Her sunucu için bir gizli kayıt vardır:

Birini açın. İçinde değişkenle birebir aynı adı taşıyan tek bir anahtar vardır; değeri siz gösterene kadar maskelidir:

B3. OpenBao’da değiştirin
Gizli kayıtta Create new version düğmesine basın, değeri değiştirin ve Save düğmesine basın. Anahtarın adını olduğu gibi bırakın; kayıtta birden fazla anahtar varsa diğer satırları silmeyin: yeni sürüm gizli kaydın tamamıdır.

Konsolda ayrıca kaydetmeniz gereken bir şey yoktur. Platform klasörünüzü her çağrıda yeniden okur; bir sonraki çağrı yeni anahtarı kullanır ve My variables yeni parmak izini ve zamanı gösterir:

OpenBao’ya yazılan bir anahtar, konsoldan kaydedilen bir anahtarla birebir aynı biçimde denetlenir: satır sonu içeremez, en çok 8 KiB olabilir ve değişkenin biçimine uymalıdır. Uymayan bir değer gönderilmez, kullanılamaz olarak reddedilir. Sunucunun tanımlamadığı bir adla eklediğiniz anahtar saklanır ama hiçbir zaman gönderilmez.
B4. Aynısı komut satırından
bao istemcisini kasanıza yöneltin ve oturum açın; şirket hesabıyla oturum açma bir
tarayıcı penceresinde tamamlanır:
export BAO_ADDR=https://vault.corp.example
bao login -method=oidc
bao token lookup
bao token lookup, klasörünüzün adını meta.email olarak gösterir. Klasörünüzü
listeleyin, bir gizli kaydı okuyun ve sürümlerini görün:
bao kv list kv/users/ayse.demir@corp.example/mcp
bao kv get kv/users/ayse.demir@corp.example/mcp/context7
bao kv metadata get kv/users/ayse.demir@corp.example/mcp/context7
Tek bir anahtarı değiştirmek için patch kullanın ve değeri standart girişten verin;
böylece kabuk geçmişinize hiç düşmez (read -rs yapıştırdığınızı ekranda göstermez):
read -rs NEWKEY
printf '%s' "$NEWKEY" | bao kv patch kv/users/ayse.demir@corp.example/mcp/context7 CONTEXT7_API_KEY=-
unset NEWKEY
Tek bir anahtarı değiştirmek için bao kv put kullanmayın. put gizli kaydı baştan
yazar: adını vermediğiniz her anahtar silinir. patch yalnızca adını verdiğiniz
anahtarları değiştirir. Birden fazla değişkeni olan bir sunucuda bu fark önemlidir.
Her komutun canlı kasada bir üyeye verdiği yanıt:
| Komut | Sonuç |
|---|---|
bao token lookup |
meta.email = adresiniz; politikalar default ve personal |
bao kv list …/mcp |
context7, envkit, github, oreilly |
bao kv list kv/users/ |
403: kimin kasası olduğunu kimse listeleyemez |
bao kv get …/mcp/context7 |
CONTEXT7_API_KEY ve değeri, sürüm 2 |
bao kv metadata get …/mcp/context7 |
zamanlarıyla birlikte sürüm 1 ve 2 |
İki anahtarlı bir kayıtta tek anahtarla put |
diğer anahtar gitmişti |
İki anahtarlı bir kayıtta tek anahtarla patch |
diğer anahtar korunmuştu |
Düzenleyicinizden kullanın
İki sunucu da platforma alındıktan sonra .mcp.json dosyanız artık kimsenin anahtarını
taşımaz. Dosya platformun aktarıcısını gösterir ve kişisel platform anahtarınızı gönderir;
aktarıcı Context7 ya da O’Reilly anahtarınızı çıkışta klasörünüzden ekler:
"context7": {
"type": "http",
"url": "https://ai.corp.example/api/mcp/context7",
"headers": {
"Authorization": "Bearer ${BOSPHORUS_KEY}"
}
},
"oreilly": {
"type": "http",
"url": "https://ai.corp.example/api/mcp/oreilly",
"headers": {
"Authorization": "Bearer ${BOSPHORUS_KEY}"
}
}
ai.corp.example yerine platformunuzun adresini yazın. Her URL’nin son parçası
sunucunun kısa adıdır. Sohbet çalışma alanı, düzenleyici eklentisi ve ajanlar aynı
sunuculara aynı yoldan, her seferinde soran kişinin anahtarıyla ulaşır.
VS Code için aimo eklentisinde bir dosyaya
eklenecek hiçbir şey yoktur: oturum açtığınızda aynı sunuculara aktarıcı üzerinden ulaşır
ve Vault görünümü değişkenlerinizi aynı klasöre yazar.
Platformun anahtarınız hakkında verdiği sözler
- Anahtar, sizin her çağrınızda sizin klasörünüzden okunur ve yalnızca tanımlandığı tek sunucuya gönderilir. Önbellek yoktur: bir değişiklik bir sonraki çağrıda geçerli olur.
- Hiçbir zaman modelin bağlamında, bir günlük satırında ya da denetim izinde bulunmaz;
denetim izi yalnızca değişkenin adını tutar. Bir aracın yanıtı anahtarı geri
yansıtırsa saklanan kopyada onun yerine
[uservar:CONTEXT7_API_KEY]görünür. - Konsol onu hiçbir zaman göstermez, ne size ne de yöneticilerine; sıradan hiçbir oturum başkalarının kasalarını listeleyemez. OpenBao’nun kendisini işleten birkaç kişi, her klasöre ulaşabilen bir role sahiptir; bu grubu küçük tutun.
- OpenBao kısa bir süre okunamazsa, zorunlu bir anahtar çağrıyı could not be read from the vault just now … try again iletisiyle durdurur. Anahtarın eksik olduğunu asla söylemez ve çağrıyı anahtarsız asla göndermez.
- My variables sayfasındaki Remove düğmesi anahtarı siler. Bir sunucunun son anahtarını silmek o gizli kaydı geçmişiyle birlikte yok eder. Birkaç anahtardan birini silmek eski değeri kaydın sürüm geçmişinde bırakır; onu OpenBao’da yok edebilirsiniz.
Bir şey yolunda gitmediğinde
| Durum | Ne yapmalı |
|---|---|
| This tool needs your own OREILLY_MCP_TOKEN … | Anahtarınızı My variables sayfasına kaydedin; ileti oraya bağlantı verir. |
Sync tools mcp http 401 gösteriyor |
Düğmeye basan yönetici kendi anahtarını henüz kaydetmedi (A4). |
OpenBao users/ için permission denied diyor |
Beklenen durum: kimse başkalarının kasalarını listeleyemez. Klasörünüzü tam yoluyla ya da konsolun bağlantısıyla açın. |
| OpenBao’ya yazdığınız anahtar kullanılmıyor | Gizli kaydın adının sunucunun kısa adı, anahtarın adının büyük harflerle değişkenin adı olduğunu ve yoldaki e-postanın bao token lookup çıktısıyla birebir aynı olduğunu kontrol edin. |
| My variables değeri kullanılamaz gösteriyor | Değer bir kurala uymuyor (satır sonu, 8 KiB’tan uzun, yanlış biçim). Temiz bir değerle yeni bir sürüm oluşturun. |
put kullandınız ve diğer anahtarlar gitti |
OpenBao’da önceki sürümü açın, eksik değerleri kopyalayın ve bütün anahtarlarla yeni bir sürüm oluşturun. |
| could not be read from the vault just now | OpenBao kısa bir süre için ulaşılamıyor. Bir dakika sonra yeniden deneyin; sürerse yöneticinize bildirin. |
| Şirketten ayrılıyorsunuz | Değerlerinizi My variables sayfasından silin ya da bir yöneticiden silmesini isteyin. |