toui ブログ

APIキーは、AIが書いたコードに置くものではありません

公開日 2026年8月28日

APIキーは、AIが書いたコードに置くものではありません

ChatGPTかClaudeを開いて、ちょっとしたツールをつくっているとします。リンクのダッシュボード、ボット、貼り付けたURLをその場で短縮するランディングページ。アシスタントは数秒で全部書き上げます。どこかで外部サービスを呼ぶ必要があるので、こう書きます。

const API_KEY = "toui_live_a1b2c3d4e5f6...";

そして、本物のキーをここに入れてください、と言ってきます。入れます。動きます。その会話を同僚に共有するか、アーティファクトをデプロイするか、リポジトリをGitHubにプッシュします。

あなたのキーは、そのコードが届いた先のどこかにあります。

これは仮の話ではありません。2026年にAIアシスタントの中でソフトウェアをつくると、放っておけばこうなります。しかも、認証情報を漏らそうとして漏らす人はほとんどいません。モデルは空欄を、いちばん手っ取り早いやり方で埋めただけです。つまり、コードに直接書いたということです。

なぜ、これがAIコーディング特有の問題なのか

ソースコードに秘密情報を書くのは、昔からある失敗です。新しいのは、AIツールがそれをどれだけ簡単にしてしまうか、そして判断の瞬間がどれだけ見えなくなったかです。

従来のやり方でプロジェクトを立ち上げるときには、秘密情報をどこに置くかを考える工程が必ずありました。環境変数か、シークレット管理サービスか、忘れずに .gitignore に入れる .env ファイルか。面倒ではありますが、その面倒さにこそ意味がありました。キーを一緒に配らないと決める瞬間が、そこにあったからです。

AIアシスタントの中では、その工程が消えます。やりたいことを書けばコードが出てきて、秘密情報をどう扱うかの判断は、あなたの代わりに下されています。たいていは、よくないほうに。さらに状況を悪くする場面が2つあります。

  • フロントエンド、そして共有されるアーティファクト。 ChatGPTのCanvasやClaudeのArtifactはブラウザで動きます。そのコードにあるものは、開いた人全員に見えます。サーバーもなければ環境もなく、秘密情報を隠す場所がありません。フロントエンドのコードに書かれたキーは、漏れるおそれがあるのではなく、すでに公開されています。
  • 共有されるプロンプトと会話。 コードを動かすためにキーを会話に貼り付けた時点で、それは記録に残ります。会話を共有する、スクリーンショットを撮る、同期を有効にしておく——キーも一緒に付いていきます。

居心地の悪い事実を書きます。ブラウザに配られるコードや、他人と共有するプロンプトに、普通のAPIキーを安全に置く方法はありません。 秘密情報が秘密であり続けるのは、自分の管理下から出ないあいだだけです。

正直な選択肢は3つ

そう認めてしまえば、設計の選択肢はちょうど3つに絞られます。まともな答えは、必ずこのどれかです。

  1. キーをまったく使わない。 認証のないオープンなエンドポイントです。安全ですが、たいていは機能を削ぎ落とすことになります。アカウントごとの制限も所有権もなく、濫用に対して無防備なので、ほとんど役に立たないところまで絞り込むしかありません。
  2. 公開しても構わないほど狭いキーを使う。 漏れても問題にならないところまで権限を絞ります。最悪でも無害な操作がひとつできるだけなら、公開する余裕が生まれます。
  3. そもそもコードに秘密情報を置かない。 コネクタやOAuthのしくみを使い、認証情報は自分が管理する設定画面の中に置いて、コードが持つのは短命で取り消せる許可だけにします。

多くのサービスは1しか用意しないか、フルアクセスのキーを渡して幸運を祈るかのどちらかです。おもしろいのは2と3で、私たちが時間を使ったのもそこです。

toui がしたこと

toui は短縮URLサービスなので、ここで扱う対象は小さく、具体的です。だからこそ、正しいやり方を固めるのにちょうどいい場所でした。すでにリリースしているものが2つあります。

コネクタ。キーがコードに触れません

toui はリモートのMCPサーバーとして動いています。MCP(Model Context Protocol)は、AIアシスタントと外部サービスをつなぐためのオープンな規格です。toui はClaudeかChatGPTに一度だけつなぎ、OAuthでサインインします。あとは「これを toui で短縮して」と言うだけで、会話の中でそのまま短縮されます。

肝心なのは、認可がアシスタントのコネクタ設定の中にあることです。会話の中にもなければ、モデルが書くコードの中にもありません。生成されたアプリが秘密情報を見ることはありません。見るべき秘密情報が、そもそも存在しないからです。公式のMCPレジストリにも io.toui/url-shortener として登録されています。(ClaudeとChatGPT、両方の設定手順はこちらです。

MCPサーバーを持つ短縮サービスは toui が最初ではありませんし、そこを主張するつもりもありません。主張したいのは、その下に何があるかです。

権限を絞った、リンク作成専用のキー。コネクタだけでは足りないから

見落としやすい点はここです。コネクタが縛るのはモデルにできることであって、キーそのものの権限ではありません。 きれいなOAuthコネクタの裏にある認証情報がフルアクセスのキーなら、設定ミス、ログに残ったトークン、侵害された連携——どの経路で漏れても、結局はアカウント全体の乗っ取りです。便利な仕組みを重ねても、被害範囲は変わりません。

そこで toui のキーにはスコープがあります。リンク作成のみのキーにできるのは、ただひとつ、短縮リンクをつくることだけです。ほかのリンクは読めず、統計も見られず、何も削除できず、ほかのキーの管理もできません。新しいキーの初期値はリンク作成のみです。最小権限は、忘れがちなオプションではなく、既定の状態であるべきだからです。

「万一漏れても、できるのは短縮だけ」を、安心させるための言葉ではなく事実にしているのが、この設計です。そしてこれは、コネクタでは届かない唯一の場面——サーバー側で動くアプリ(たとえば Claude Code がNodeやWorkerのプロジェクトとして組み立てるようなもの)がAPIを直接呼ぶ場合——にふさわしい認証情報でもあります。環境変数に置き、リンク作成のみにしておけば、うっかりミスが起きても致命傷ではなく、取り返しのつく失敗で済みます。

正直に書いておくトレードオフ

リンク作成のみのキーが漏れても、リスクがゼロになるわけではありません。失効させるまでのあいだ、あなたのアカウントで迷惑な短縮リンクをつくられる可能性はあります。私たちはこれを3つの方法で抑えています。権限を狭くすること、キーごとにレート制限と利用量の上限を設けること、そして何かおかしいときにすべてのキーを一度に止められるアカウント単位の緊急停止です。とはいえ、抑えられていることと、起こりえないことは違います。

「100%安全です」と売るより、本当の被害範囲をお伝えしたいと考えています。セキュリティは後から取り付ける機能ではなく、意図して選び、はっきり説明するトレードオフの集まりです。toui が破られないという話ではありません。被害の出方が「アカウント全体」ではなく「ワンクリックで消せる、いくつかの不要なリンク」にとどまる、という話です。

AIアシスタントの中でつくるなら

ここから持ち帰れることは、ひとつのツールの話より大きいはずです。

  • モデルに秘密情報を直接書かせないでください。 const API_KEY = "..." と書かれたら、そこが立ち止まる瞬間です。このコードはどこで動くのか、と考えてください。
  • ブラウザに配られるコードや、共有するプロンプトに置くなら、必要なのはキーではなくコネクタかOAuthです。 公開されるコードに安全なキーはありません。
  • **どうしてもキーを使うなら、そのサービスが用意するいちばん狭いものを選び、**サーバー側の環境変数に置いて、会話には出さないでください。

リンクの短縮に限れば、toui はこの両方の道を用意しています。ClaudeやChatGPTの中で使うためのMCPコネクタと、それ以外のすべてのための、権限を絞ったリンク作成専用のキーです。APIは無料で使えて、アシスタントへの接続は1分ほどで終わります。

APIキーを、インターネット上の誰もが読めるコードの中に置いておく必要はありません。設定さえ間違えなければ、置かずに済みます。

← すべての記事