Hushscript MCP sunucusu, Model Context Protocol ile bir asistanı kayıtlarına ve deşifrelerine bağlar. Tarayıcında bir OAuth bağlantısını onayla ya da kişisel erişim jetonu ver. Deşifre ve ücretli işlemler, hesabının kişisel ya da uygun kuruluş finansman kurallarını izler.
İki sunucu
Hushscript aslında iki ayrı MCP sunucusu çalıştırır ve okuyucuların çoğu bunlardan yalnızca birini ister.
https://mcp.hushscript.com/mcp, bu sayfanın geri kalanının anlattığı
hesap sunucusudur. OAuth ya da kişisel erişim jetonu kabul eder ve hesap
işinin yapıldığı yer burasıdır: yükleme, deşifre, düzenleme, dışa
aktarma.
POST https://hushscript.com/mcp, ayrı ve ücretsiz bir dokümantasyon
sunucusudur. Hesap yok, jeton yok, giriş yapılacak bir şey yok. Salt okunur ve
anonimdir: bir hesap açamaz, deşifre çalıştıramaz ve bir hesaba ait hiçbir
şeye dokunamaz. Fiyatlandırma, özellikler, sayfa içeriği ve nasıl bağlanılacağı
hakkındaki soruları beş araç (get_pricing, get_capabilities,
how_to_connect, list_pages, get_page) ve aynı bilgiyi sunan üç kaynak
(hushscript://pricing, hushscript://capabilities, hushscript://connect)
üzerinden yanıtlar.
Hushscript’i yeni bulmuş, elinde jeton olmayan ve bir şey harcamadan önce sana uyup uymadığına hâlâ karar veren bir ajan isen dokümantasyon sunucusuyla başla. Bir hesabı bağlamaya hazır olunca bu sayfanın geri kalanına dön.
Bağlan
Sunucu, tek bir uç noktada Streamable HTTP konuşur:
https://mcp.hushscript.com/mcp
SSE uç noktası yoktur ve yerel olarak kurulacak bir Hushscript yazılımı da yoktur. Claude Code’da:
claude mcp add --transport http hushscript https://mcp.hushscript.com/mcp
JSON yapılandırması alan bir istemcide:
{
"mcpServers": {
"hushscript": {
"type": "http",
"url": "https://mcp.hushscript.com/mcp"
}
}
}
OAuth destekleyen bir istemci, uç noktaları keşfetmek için
/.well-known/oauth-authorization-server adresini okur. /oauth/register
üzerinden kayıt olabilir ya da bir istemci kimliği meta veri belgesi kullanabilir,
ardından giriş için bir tarayıcı penceresi açar.
Onayladığın şey
Yetkilendirme, PKCE’li OAuth 2.1’dir. Tarayıcı penceresi, istemci için bir parola kutusu değil, bir Hushscript onay ekranıdır: istekte bulunan uygulamayı adlandırır, ne yapmak istediğini sade bir dille listeler ve seni bekler. Orada onaylamadıkça hiçbir şey verilmez.
Erişim jetonları bir saat, yenileme jetonları otuz gün geçerlidir. OAuth ile bu kimlik bilgilerini istemcin senin yerine yönetir; yapılandırmaya asla kişisel erişim jetonu yapıştırmazsın.
Tarayıcı olmadan
Bir OAuth bağlantısı tarayıcıda onay gerektirir. Aynı sunucu kişisel erişim
jetonunu da doğrudan kabul eder; bağlanırken tarayıcı adımı yoktur. Bir kişi,
hesaptaki MCP sayfasında
Jetonlar altında bir jeton oluşturur, izinlerini seçer ve dakika satın alıp
alamayacağına karar verir. Jeton bir kez gösterilir, hsr1:<region>:pat.<id>.<secret>
biçimindedir ve her istekte Authorization: Bearer <token> içinde gider: OAuth
gidiş-dönüşü yok, onay ekranı yok, istemci kaydı yok. Aynı jeton
REST API ile de çalışır.
Bir jeton, hesap sahibi bir insan olmayan bir makine hesabına da ait olabilir.
Bir ajan POST /v1/agent/accounts ile ücretli bir kayıt başlatır, yönetebileceği
bir tarayıcıda barındırılan Stripe Checkout’u tamamlar ve ilk jetonunu almak
için POST /v1/agent/accounts/{signup_id}/claim adresinde tek kullanımlık bir
gizli anahtarla hesabı talep eder. O jeton da diğerleri gibi buraya bağlanır.
Akışın uçtan uca anlatımı için Otomatik kullanım sayfasına bak.
Bir jeton başka jeton oluşturamaz, listeleyemez ya da iptal edemez. Bir hesap en fazla 25 etkin jeton tutar. Makine hesabının ilk jetonu kendini REST API üzerinden döndürebilir; akış Otomatik kullanım sayfasındadır.
İzinler
Bir bağlantı bir dizi izin taşır. Hiçbir izin belirtmeyen bir OAuth isteği,
çağıranın seçebileceği on bir iznin billing dışındaki onunu varsayılan alır.
Uygulamada oluşturulan bir jetonda izinleri kişi seçer. Bir makine hesabının
ilk jetonunda yalnızca transcripts:read, transcripts:write, transcribe,
account:read, export, billing ve kendini döndürmek için ayrı pat:rotate
izni bulunur. Talep işlemi iki faturalandırma ayarını da açar; kişinin
oluşturduğu bir jetonda ise bunlar bilerek açılmalıdır. İzinler bilindiğinde
sunucu eşleşen araçları duyurur; arka uç bunları her çağrıda uygular.
| İzin | Ne yapabilir |
|---|---|
transcripts:read |
Deşifreleri, meta verilerini ve silinenler listesini okur ve dışa aktarır |
transcripts:write |
Deşifreleri düzenler, etiketler, çevirir, geri yükler ve siler |
transcribe |
Kayıt yükler, bir bağlantıdan içe aktarır ve deşifre işlemi çalıştırır |
insights |
Insights’ı okur, oluşturur ve siler |
context |
Kayıtlı sözlükleri ve istem ön ayarlarını yönetir |
account:read |
Bakiyeyi, kullanımı, işlemleri ve bekletmeleri okur |
settings:write |
Hesap ayarlarını değiştirir |
org:read |
Kuruluş üyelerini, havuz etkinliğini, faturaları ve denetim kaydını okur |
org:write |
Üye haklarını değiştirir, yasal tutma koyar ve kaldırır, firma muhafazasına (kalıcı) geçişi zamanlar |
export |
Tam hesap dışa aktarımı ister, durumunu denetler ve indirir |
billing |
Ödeme yöntemlerini kaydeder veya yönetir ve dakika paketi satın alır |
billing her yönden istisnadır. Asla dolaylı olarak verilmez, onay ekranı
onaylamadan önce seni uyarır ve bir satın alma aracı, hem jetondaki
faturalandırma bayrağının hem de hesap genelindeki faturalandırma ayarının
açık olmasını gerektirir. pat:rotate, OAuth isteğinde ya da uygulamanın jeton
formunda seçilemez.
Araçların kapsadığı şey
Dokundukları alana göre gruplanmış 56 araç:
| Grup | Araç | Örnekler |
|---|---|---|
| Deşifreler, okuma | 4 | list_transcripts, get_transcript, list_deleted |
| Deşifreler, yazma | 10 | update_body, revert_body, retranslate, tag_transcripts |
| Deşifre işlemi | 8 | create_upload, transcribe_from_url, list_jobs, cancel_job |
| Hesap | 6 | get_balance, get_usage, list_transactions |
| Insights | 3 | get_insights, generate_insights, delete_insights |
| Dışa aktarma | 4 | export_transcript, request_account_export |
| Deşifre bağlamı | 5 | save_dictionary, save_prompt_preset |
| Kuruluş | 10 | get_org, list_org_members, get_org_audit_log, place_transcript_hold |
| Faturalandırma | 6 | list_packs, purchase_pack, list_payment_methods, add_payment_method |
export_transcript, TXT, SRT, VTT, Markdown veya JSON döndürür. 21 dışa
aktarma formatının tamamı uygulamada bulunur.
Araçların yanında sunucu, bağlantı kurulduğunda üç kaynak ve bir instructions
dizesi yayınlar: dakika paketleri, kredi ve izin modeli ile eksiksiz hata kodu
kataloğu; böylece bir istemci herhangi bir şey çağırmadan önce kuralları
okuyabilir. Sayfalanan liste araçları bir limit ve önceki sayfanın
next_cursor değerinden gelen opak bir cursor alır; list_packs ve
list_payment_methods listelerini cursor olmadan döndürür.
MCP yüklemeleri hazırlanmış ses gönderir. Yerel bir video için önce sesini
kendi cihazında hazırla; transcribe_from_url desteklenen ses bağlantılarını
sunucu tarafında getirir ve video bağlantılarını içe aktarmaz. MCP ile
başlatılan işler standart modu kullanır: deşifreler hesabın saklama ayarına
göre tutulur. Tek seferlik gizli mod uygulamada bulunur, MCP jetonlarıyla
kullanılamaz.
Örnekler
OAuth akışını izleyen bir istemci normal bir MCP oturumu alır ve bunların hiçbirini doğrudan görmez: SDK’sı JSON-RPC’yi altta kendisi oluşturur. Bu, jeton tutan bir istemcinin elle gönderdiği protokolün aynısıdır ve her iki durumda da hata ayıklama aracı olarak işe yarar.
Jetonla bağlanmak için onu doğrudan isteğe koy; initialize dışında bir el
sıkışma gerekmez:
curl -s https://mcp.hushscript.com/mcp \
-H "Authorization: Bearer hsr1:us:pat.4f2a1c.9e7b3d2a5c8f1e6b4a0d7c3f2e1b9a8d" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}'
Jetonun izinlerinin kapsadığı her aracı görmek için aynı isteği farklı bir gövdeyle tekrar gönder:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
Her giriş bir ad, bir açıklama ve yukarıdaki gruplarla eşleşen bir JSON Schema
inputSchema taşır. Bir aracı çağırmak şöyle görünür; create_upload kredi
ayırıp bir yükleme başlatır:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "create_upload",
"arguments": {
"size_bytes": 52428800,
"duration_seconds": 1800,
"title": "Team standup 2026-09-10",
"transcription_options": { "speaker_detection": true }
}
}
}
create_upload gibi yapılandırılmış araçlar, dizgeye çevrilmiş JSON içeren
bir content metin bloğu döndürür. Örneğin:
{
"content": [
{
"type": "text",
"text": "{\n \"job_id\": \"job_8f3a1c2b9e\",\n \"balance_seconds\": 5400,\n \"held_seconds\": 1800,\n \"upload\": {\n \"part_size_bytes\": 33554432,\n \"total_parts\": 2,\n \"part_urls\": [\n { \"n\": 1, \"url\": \"https://...\" }\n ],\n \"next_part_number\": 2\n }\n}"
}
]
}
Yukarıdaki yanıt yükleme alanlarını gösterir; tam yanıt ayrıca limits,
funding ve state alanlarını da içerir. Baytları bu URL’lere yükle, her
parçanın ETag’iyle complete_upload’ı çağır, ardından durumu done olana
kadar get_job’ı yokla. Aşağıdaki yapılandırılmış örnekler iç JSON’u doğrudan,
zaten ayrıştırılmış halde gösterir ve hiç değişmediği için
{"jsonrpc":"2.0","id":...} istek sarmalayıcısını atlar: yalnızca name ve
arguments değişir.
export_transcript işlenmiş formatı metin olarak, download_account_export_chunk
ise base64 metnine kodlanmış ham baytları döndürür. Bir sonucun text alanını
yalnızca araç yapılandırılmış veri döndürüyorsa JSON olarak ayrıştır.
Deşifreleri listeleme ve okuma:
{
"name": "list_transcripts",
"arguments": { "limit": 5 }
}
{
"transcripts": [
{
"id": "t_9c2b7f10",
"title": "Team standup 2026-09-10",
"language_detected": "en",
"duration_seconds": 1800,
"tags": ["standup"],
"insights_state": "none"
}
],
"next_cursor": null
}
Insights oluşturma, bir deşifre için ilk çağrıda ücretsizdir. Bu örnek, yeni
bir oluşturma başladıktan sonraki bakiyeyi gösterir; reused değeri false’tur:
{
"name": "generate_insights",
"arguments": { "id": "t_9c2b7f10" }
}
{
"ok": true,
"reused": false,
"balance_seconds": 5400,
"held_seconds": 0
}
Dakika satın alma; yanıt düştükten sonraki bir yeniden deneme çift
ücretlendirmesin diye idempotency_key zorunludur:
{
"name": "purchase_pack",
"arguments": {
"pack": "300min",
"payment_method_id": "pm_1PxYzABC",
"idempotency_key": "agent-2026-09-11-refill-01"
}
}
{
"status": "ok",
"balance_seconds": 23400
}
Kaynaklar araç çağrısı olmadan yanıtlanır; resources/read üç URI’den birini
adlandırır:
{
"jsonrpc": "2.0",
"id": 9,
"method": "resources/read",
"params": { "uri": "hushscript://pricing" }
}
Kısaltılmış yanıt (kaynağın açıklayıcı notu çıkarılmıştır):
{
"contents": [
{
"uri": "hushscript://pricing",
"mimeType": "application/json",
"text": "{\"packs\":[{\"id\":\"45min\",\"minutes\":45},{\"id\":\"300min\",\"minutes\":300},{\"id\":\"900min\",\"minutes\":900},{\"id\":\"1800min\",\"minutes\":1800},{\"id\":\"6000min\",\"minutes\":6000}]}"
}
]
}
Güncel paket tutarları ve para birimleri için list_packs kullan.
Her arka uç hatası sabit bir slug ve sayısal bir kod taşır; bu,
hushscript://error-codes içinde belgelenen aynı gövdedir:
{"error": "<slug>", "code": <number>}. Bir araç çağrısı aynı slug ve
kodu, ham hata nesnesi yerine okunabilir bir mesajın içine katarak gösterir ve
sonucu fırlatmak yerine isError ile işaretler:
{
"content": [
{
"type": "text",
"text": "Not enough transcription credit. This job needs 1800 seconds and the balance is 900 seconds. Top up at https://app.hushscript.com/billing (insufficient_balance, E3001)"
}
],
"isError": true
}
Neyin dakikaya mal olduğu
Hesap verilerini okumak deşifre dakikası harcamaz. Ücretli işlemler uygulamadaki tarifelerle aynıdır. Bunları genellikle kişisel ön ödemeli dakikalar karşılar; bir kuruluşun deşifresi, etkin havuz tek başına işin tamamını karşılıyorsa ve çeviri hedefi seçilmemişse Teams ortak saat havuzunu kullanabilir. Çeviri hedefli ya da içe aktarılmış ses URL’li bir iş kişisel dakikaları kullanır. Finansman, deşifre muhafazasını değiştirmez.
Uygun kişisel hesaplar kart doğrulamasından sonra 30 ücretsiz dakika alır; bir makine hesabı kayıtta satın aldığı paketle başlar.
- Deşifre etmek, bir kaydın uzunluğu kadar dakika harcar. Tıbbi mod %100 ekler, her çeviri hedefi %25 ekler. Çok kanallı mod açıkken her ses kanalı ayrı faturalandırılır, yani bir stereo dosya iki kez sayılır.
- Insights: deşifre başına ilk oluşturma ücretsizdir. Sonradan yeniden oluşturmak, orijinal deşifreden yapılırsa kaydın uzunluğunun %40’ına, temizlenmiş sürümden yapılırsa %30’una mal olur. Yeniden oluşturma, deşifreyi bir kuruluş havuzu ödemiş olsa bile üyenin kişisel dakikalarını kullanır.
- Yeniden çevirmek, bir deşifrenin uzunluğunun dil başına %25’ine mal olur ve üzerine yazar: çağrının ücretlendirdiği her dil, o çevirinin elle düzenlenmiş kopyasını kaybeder ve geri getirmenin yolu yoktur.
purchase_packbaşarılı olunca uygun kayıtlı kartı hemen ücretlendirir.billingizni, jetonun kendi faturalandırma bayrağı ve hesap genelindeki faturalandırma ayarı gerekir. Dakikaları kişisel bakiyeye ekler, Teams havuzuna değil.add_payment_methodhiçbir şeye mal olmaz. Hesabı ücretlendirmeden bir kart kaydeden bir Stripe Checkout bağlantısı döndürür; bunu tarayıcıda bir kez tamamla (bir ajan kendi tarayıcısını yönetebilir). Sonrakipurchase_packçağrıları oturum dışı ücretlendirme dener; ret ya da kartı veren bankanın doğrulama (challenge) istemesi, bitmemiş bir sayfa yerine ayrı bir hata kodu döndürür.
Paketlerin kendisi için fiyatlandırma sayfasına bak.
Gözden geçirme ve iptal etme
Giriş yapabildiğin bir hesapta OAuth bağlantıları, hesabındaki MCP sayfasında Bağlı uygulamalar altında istemcileri ve izinleriyle birlikte görünür. Jetonlar da orada listelenir; birini iptal etmek çağrılarını keser. İstemci yapılandırmasını silmek ise yalnızca o istemcinin istek göndermesini durdurur. Kullanılabilir bir giriş posta kutusu olmayan makine hesabının jetonu bunun yerine ajan hesabı akışı üzerinden kendini döndürür.
Sınırlar
İnsan hesabı jetonları her biri için dakikada 1.200 isteğe izin verir. Bir ajan
hesabının döndürülmüş jetonları bu bütçeyi paylaşır. Bir jetonla ulaşılan
Stripe’ı çağıran faturalandırma rotaları hesap başına dakikada 60 isteği
paylaşır: kart kurulumu, satın alma, varsayılan kart değişikliği, kart kaldırma
ve kart listesi önbelleğinde ıskalama. Ajan hesabı satın almaları ile insan
hesabı jeton satın almaları, hesap başına kayan 24 saatte üç denemeyle
sınırlıdır. Ücretli ajan kaydı sayılır, bir deneme ayrıldıktan sonraki
başarısızlıklar da; insan tarayıcı oturumundaki satın almalar muaftır. Üst
sınıra takılan ret HTTP 429 / kod 4038 agent_purchase_capped olarak döner ve
olağan HTTP 429 / kod 5000 rate_limited yanıtından farklıdır. İkisi de
Retry-After sağlar.
OAuth yetkilendirme ve tamamlama, dakikada 30’luk ortak bir adres kovasını
paylaşır. Kayıt işleminin dakikada 30’luk kendi kovası vardır; /oauth/token
ise dakikada 600’lük ayrı bir kovaya sahiptir. Her biri anahtar olarak tek bir
IPv4 adresini ya da tek bir IPv6 /64 bloğunu kullanır. Ham jeton doğrulama
önbelleği ıskalamalarının aynı anahtarda dakikada 30’luk başka bir kovası
vardır; bu, her MCP aracı çağrısı için bir sınır değildir.