HushscriptのMCPサーバーは、Model Context Protocolを使い、アシスタントを録音と文字起こし結果に接続します。ブラウザでOAuth接続を承認するか、パーソナルアクセストークンを指定してください。文字起こしと有料の操作には、アカウントの個人分数、または条件を満たすワークスペースの分数プールの利用ルールが適用されます。
2つのサーバー
Hushscriptは2つの独立したMCPサーバーを運用しています。多くの場合、必要なのはそのうち1つです。
https://mcp.hushscript.com/mcp は、このページの以降の説明で扱うアカウント用サーバーです。OAuthまたはパーソナルアクセストークンを受け付け、アップロード、文字起こし、編集、エクスポートなどのアカウント操作を行います。
POST https://hushscript.com/mcp は、独立した無料のドキュメント用サーバーです。アカウントもトークンもサインインも不要です。読み取り専用かつ匿名で、アカウントを開設したり、文字起こしを実行したり、アカウントに属するものに触れたりすることは一切できません。料金、機能、ページの内容、接続方法についての質問に、5つのツール(get_pricing、get_capabilities、how_to_connect、list_pages、get_page)で答えます。同じ情報を3つのリソース(hushscript://pricing、hushscript://capabilities、hushscript://connect)でも提供します。
Hushscriptを見つけたばかりでトークンがなく、費用をかける前に用途に合うかを検討しているエージェントは、ドキュメント用サーバーから始めてください。アカウントを接続する準備ができたら、このページの以降の説明をご覧ください。
接続
サーバーは1つのエンドポイントでStreamable HTTPを使用します。
https://mcp.hushscript.com/mcp
SSEエンドポイントはなく、Hushscriptのソフトウェアを端末にインストールする必要もありません。Claude Codeでは次のように指定します。
claude mcp add --transport http hushscript https://mcp.hushscript.com/mcp
JSON設定を使うクライアントでは次のように指定します。
{
"mcpServers": {
"hushscript": {
"type": "http",
"url": "https://mcp.hushscript.com/mcp"
}
}
}
OAuthに対応するクライアントは、/.well-known/oauth-authorization-serverを読み取ってエンドポイントを検出します。/oauth/registerで登録するか、クライアントIDメタデータドキュメントを使い、サインイン用のブラウザウィンドウを開きます。
承認する内容
認可にはOAuth 2.1とPKCEを使用します。ブラウザには、クライアント用のパスワード入力欄ではなく、Hushscriptの同意画面が表示されます。アクセスを求めるアプリケーション名と、実行したい操作を平易な言葉で示し、承認を待ちます。この画面で承認するまで、権限は付与されません。
アクセストークンの有効期限は1時間、リフレッシュトークンは30日です。OAuthではクライアントが認証情報を管理するため、パーソナルアクセストークンを設定に貼り付ける必要はありません。
接続時のブラウザ操作が不要な方法
OAuth接続にはブラウザでの承認が必要です。同じサーバーはパーソナルアクセストークンも直接受け付け、この場合は接続時のブラウザ操作が不要です。人がアカウント内のMCPページのトークンで作成し、スコープと分数購入の許可を選びます。トークンは一度だけ表示され、hsr1:<region>:pat.<id>.<secret>の形式です。各リクエストのAuthorization: Bearer <token>に指定します。OAuthのやり取り、同意画面、クライアント登録は不要です。同じトークンはREST APIでも使えます。
トークンは、人を所有者としないマシンアカウントに属することもあります。エージェントはPOST /v1/agent/accountsで有料のサインアップを開始し、自ら操作できるブラウザでStripeのホスト型Checkoutを完了します。その後、POST /v1/agent/accounts/{signup_id}/claimで一度きりのシークレットを使ってアカウントと最初のトークンを取得します。このトークンも同じ方法で接続できます。一連の手順は自動文字起こしをご覧ください。
トークンから他のトークンを作成、一覧表示、取り消すことはできません。アクティブなトークンは1アカウントにつき最大25個です。マシンアカウントの最初のトークンは、REST APIを通じて自分自身をローテーションできます。手順は自動文字起こしで説明しています。
権限
接続には一連のスコープが紐づきます。OAuthリクエストでスコープを指定しない場合は、選択可能な11のスコープのうち、billing以外の10が付与されます。アプリで作成するトークンのスコープは、人が選択します。マシンアカウントの最初のトークンに付与されるのは、transcripts:read、transcripts:write、transcribe、account:read、export、billingと、自分自身のローテーション用の別スコープpat:rotateのみです。アカウントの取得時には、課金の両方の設定が有効になります。人が作成するトークンでは、意図的に両方を有効にする必要があります。スコープが判明すると、サーバーは対応するツールを公開します。バックエンドは呼び出しごとにスコープを検証します。
| スコープ | 許可される操作 |
|---|---|
transcripts:read |
文字起こし結果、メタデータ、削除済み一覧の読み取りとエクスポート |
transcripts:write |
文字起こし結果の編集、タグ付け、翻訳、復元、削除 |
transcribe |
録音のアップロード、リンクからのインポート、文字起こしの実行 |
insights |
Insightsの読み取り、生成、削除 |
context |
保存済み辞書とプロンプトプリセットの管理 |
account:read |
残高、利用状況、取引履歴、確保済み分数の読み取り |
settings:write |
アカウント設定の変更 |
org:read |
ワークスペースのメンバー、台帳、請求書、監査ログの読み取り |
org:write |
メンバー権限の変更、法的保留の設定・解除、組織による永続的な保管への移行予約 |
export |
アカウント全体のエクスポートのリクエスト、状態確認、ダウンロード |
billing |
支払い方法の保存・管理と分数パックの購入 |
billingは特別な扱いです。暗黙に付与されることはなく、同意画面では承認前に警告を表示します。購入ツールには、トークンの課金フラグとアカウント全体の課金設定の両方が有効である必要があります。pat:rotateは、OAuthリクエストやアプリのトークン作成フォームでは選択できません。
ツールの対応範囲
56のツールを、操作対象ごとに分類しています。
| グループ | ツール数 | 例 |
|---|---|---|
| 文字起こし結果の読み取り | 4 | list_transcripts、get_transcript、list_deleted |
| 文字起こし結果の書き込み | 10 | update_body、revert_body、retranslate、tag_transcripts |
| 文字起こし | 8 | create_upload、transcribe_from_url、list_jobs、cancel_job |
| アカウント | 6 | get_balance、get_usage、list_transactions |
| Insights | 3 | get_insights、generate_insights、delete_insights |
| エクスポート | 4 | export_transcript、request_account_export |
| 文字起こしコンテキスト | 5 | save_dictionary、save_prompt_preset |
| ワークスペース | 10 | get_org、list_org_members、get_org_audit_log、place_transcript_hold |
| 課金 | 6 | list_packs、purchase_pack、list_payment_methods、add_payment_method |
export_transcriptはTXT、SRT、VTT、Markdown、JSONのいずれかを返します。21のエクスポート形式すべてを利用できるのはアプリです。
ツールに加えて、接続時には3つのリソースとinstructions文字列を公開します。分数パック、分数とスコープの仕組み、エラーコードの全一覧を提供し、クライアントは操作前にルールを確認できます。ページ単位で一覧を返すツールは、limitと、内容を解釈せずに扱うcursorを受け取ります。カーソルには前のページのnext_cursorを指定します。list_packsとlist_payment_methodsは、カーソルなしで一覧を返します。
MCPでアップロードするのは、事前に準備した音声です。端末上の動画は、先に端末で音声を準備してください。transcribe_from_urlは対応する音声リンクをサーバー側で取得し、動画リンクはインポートしません。MCPから開始するジョブは標準モードで、文字起こし結果はアカウントの保持設定に従って保存されます。1回限りのプライベートモードはアプリで利用でき、MCPトークンでは利用できません。
使用例
OAuthフローを使うクライアントは通常のMCPセッションを取得し、以下の通信を直接扱うことはありません。SDKが内部でJSON-RPCを組み立てます。トークンを持つクライアントが手動で送る場合も同じプロトコルなので、どちらの場合もデバッグの参考になります。
トークンで接続するには、リクエストに直接指定します。initialize以外のハンドシェイクは不要です。
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" }
}
}'
同じリクエストを別のボディで送ると、トークンのスコープで利用できるすべてのツールを確認できます。
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
各項目には、名前、説明、JSON SchemaのinputSchemaがあり、上記のグループに対応しています。次のツール呼び出しでは、create_uploadが分数を確保し、アップロードを開始します。
{
"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などの構造化データを返すツールは、JSONを文字列化したcontentテキストブロックを返します。次はその例です。
{
"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}"
}
]
}
上のレスポンスはアップロードのフィールドを示しています。完全なレスポンスにはlimits、funding、stateも含まれます。指定のURLへバイト列をアップロードし、各パートのETagを添えてcomplete_uploadを呼び出します。その後、get_jobをポーリングし、状態がdoneになるまで待ちます。以下の構造化データの例は、パース済みの内部JSONをそのまま示しています。リクエストを包む{"jsonrpc":"2.0","id":...}は常に同じため省略しています。変わるのはnameとargumentsだけです。
export_transcriptは指定形式に整えた内容をテキストで返し、download_account_export_chunkは生のバイト列をbase64テキストに変換して返します。結果のtextをJSONとしてパースするのは、ツールが構造化データを返す場合だけにしてください。
文字起こし結果の一覧取得と読み取りの例です。
{
"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生成です。この例は、新しい生成を開始した後の残高を示し、reusedはfalseです。
{
"name": "generate_insights",
"arguments": { "id": "t_9c2b7f10" }
}
{
"ok": true,
"reused": false,
"balance_seconds": 5400,
"held_seconds": 0
}
分数を購入する例です。レスポンスが失われて再試行した場合の二重請求を防ぐため、idempotency_keyが必須です。
{
"name": "purchase_pack",
"arguments": {
"pack": "300min",
"payment_method_id": "pm_1PxYzABC",
"idempotency_key": "agent-2026-09-11-refill-01"
}
}
{
"status": "ok",
"balance_seconds": 23400
}
リソースはツールを呼び出さずに取得できます。resources/readに3つのURIのいずれかを指定します。
{
"jsonrpc": "2.0",
"id": 9,
"method": "resources/read",
"params": { "uri": "hushscript://pricing" }
}
省略したレスポンスです。リソースの説明文は含めていません。
{
"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}]}"
}
]
}
現在のパックの金額と通貨はlist_packsで確認してください。
バックエンドの各エラーには、固定のスラッグと数値コードがあります。{"error": "<slug>", "code": <number>}というボディで示され、hushscript://error-codesに記載されています。ツール呼び出しでは、生のエラーオブジェクトの代わりに、同じスラッグとコードを読みやすいメッセージに含めて返します。例外を投げる代わりに、結果にisErrorを付けます。
{
"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
}
分数を消費する操作
アカウントデータの読み取りでは、文字起こし用の分数を消費しません。有料の操作にはアプリと同じ料金が適用され、通常は個人のプリペイド分数を使用します。ワークスペースの文字起こしは、有効なTeamsプールだけでジョブ全体の分数を賄え、翻訳先を指定していない場合に、そのプールを使用できます。翻訳先を指定したジョブや音声URLからインポートしたジョブには、個人の分数を使用します。分数の支払い元は、文字起こし結果の保管主体を変更しません。
対象の個人アカウントはカード確認後に30分の無料分数を受け取れます。マシンアカウントは、サインアップ時に購入したパックから利用を開始します。
- 文字起こしは録音時間に応じた分数を消費します。医療モードでは100%、翻訳先を追加するごとに25%が加算されます。マルチチャネルをオンにすると音声チャネルごとに課金され、ステレオのファイルは2回分として数えられます。
- Insights: 文字起こし結果ごとの初回生成は無料です。後で再生成する場合は、元の文字起こしからなら録音時間の40%、クリーンアップ版からなら30%を消費します。文字起こしをワークスペースのプールで支払った場合でも、再生成にはメンバー個人の分数を使用します。
- 再翻訳は言語ごとに文字起こし結果の長さの25%を消費し、翻訳を上書きします。呼び出しで課金対象となる各言語について、手動で編集した翻訳は失われ、元に戻せません。
purchase_packは成功時に、利用可能な保存済みカードへ即座に請求します。billingスコープと、トークンの課金フラグ、アカウント全体の課金設定が必要です。追加するのは個人残高の分数で、Teamsプールではありません。add_payment_methodは無料です。請求せずにカードをアカウントへ保存するStripe Checkoutのリンクを返します。ブラウザで一度だけ完了してください。エージェントが自ら操作してもかまいません。その後のpurchase_packはオフセッション請求を試みます。カード拒否や発行会社による追加認証は、未完了のページではなく、それぞれ別のエラーコードで返します。
パックの詳細は料金ページをご覧ください。
確認と取り消し
サインインできるアカウントでは、OAuth接続はアカウント内のMCPページの連携済みアプリに、クライアントとスコープとともに表示されます。トークンもここに一覧表示され、取り消すとそのトークンによる呼び出しを停止します。クライアントの設定を削除するだけでは、そのクライアントからのリクエストが止まるだけです。マシンアカウントにはサインインに使えるメールボックスがないため、代わりにエージェントアカウントの手順に従い、トークンが自分自身をローテーションします。
利用上限
人のアカウントのトークンは、1つにつき1分あたり1,200回のリクエストが可能です。エージェントアカウントでは、ローテーション前後の一連のトークンでこの上限を共有します。トークンでStripeを呼び出す課金ルートは、アカウントごとに1分あたり60回の上限を共有します。対象はカード設定、購入、デフォルトカードの変更、カード削除、カード一覧のキャッシュミスです。エージェントアカウントの購入と、人のアカウントのトークンによる購入は、アカウントごとに直近24時間で3回の試行までです。エージェントの有料サインアップも、試行枠を確保した後の失敗も数に含みます。人がブラウザセッションで行う購入は対象外です。試行上限による拒否はHTTP 429・コード4038のagent_purchase_cappedで、通常のレート制限であるHTTP 429・コード5000のrate_limitedとは異なります。どちらもRetry-Afterを返します。
OAuthの認可と完了処理は、アドレスごとに1分あたり30回の上限を共有します。登録には独立した1分あたり30回の上限があり、/oauth/tokenには別の1分あたり600回の上限があります。それぞれ、1つのIPv4アドレスまたはIPv6の/64を単位に数えます。生のトークンのイントロスペクションでキャッシュミスが起きた場合にも、同じ単位で別の1分あたり30回の上限があります。すべてのMCPツール呼び出しに適用される制限ではありません。