ビジネスを強化する: アクセス制御を使用して既存のサービスに AI ツールを接続する
パーソナルアクセス トークンとモデル コンテキスト プロトコル (MCP) を使用して、AI ツールを既存のサービスに安全に接続することでビジネスを強化する方法を学びます。完全なソース コードと実用的な例が含まれています。
パーソナルアクセス トークンとモデル コンテキスト プロトコル (MCP) を使用して、AI ツールを既存のサービスに安全に接続することでビジネスを強化する方法を学びます。完全なソース コードと実用的な例が含まれています。
アクセス制御を使用して既存のサービスに AI ツールを接続するためのガイドへようこそ!
特に LLM との統合(モデル コンテキスト プロトコルを使用)およびさまざまな AI エージェントを通じて、アクセス制御の課題に対処しながら、既存のサービスを AI ツールに対応させる方法を探ります。
このガイドを通じて、次のことを学びます:
完全なチュートリアル資料、完全なデモ プロジェクト ソース コード(フロントエンド、バックエンド、MCP サーバーを含む)、AI 対応サービスをゼロから構築するための実用的なガイドも提供します。
このガイドがあなたのビジネスをどのように向上させるか:
さあ、始めましょう!
MCP (モデル コンテキスト プロトコル) は、大規模言語モデル (LLM) にコンテキスト情報を提供する方法を標準化するオープンでユニバーサルなプロトコルです。
MCP は複数の主要コンポーネントから構成されており、AI ツールがあなたのサービスにアクセスできるようになります:
このガイドでは、MCP サーバーがサービスと AI ツールの間の重要な接続ポイントであることだけを知っていれば十分です。MCP サーバーは LLM が使用するためのツールを一連提供し、これらのツールはあなた自身のサービスと相互作用します。MCP の詳細については、MCP (モデル コンテキスト プロトコル) とは何か、どのように機能するか を参照できます。ここでは、MCP サーバーだけに焦点を当てます。
ロールベースのアクセス制御 (RBAC) ポリシーを統合したコンテンツ管理システム (CMS) を例として使用します。MCP サーバーを作成し、現在のユーザーが CMS 内で利用可能な記事の数を LLM に取得させるための get-available-article-count ツールを定義します:
これは、MCP サーバーをサービスに接続するための重要なコードです。このツールの実装では、サービスの api/articles エンドポイントにリクエストを送り、結果を返します。
しかし、これはまだ不十分です。なぜなら、サービスの API が公共ではないかもしれないからです。各エンドポイントにはアクセス制御が必要で、異なるユーザーが異なるリソースとデータにアクセスできるようにする必要があります。
次に、サービスにアクセス制御を追加する方法を説明します。
AI ツールを通じてシステムにアクセスするユーザーは、直接的にシステムを使用する可能性のある個々のユーザーであるため、MCP サーバーは AI ツールを通じて対話するときにその代表者として機能します。
したがって、ユーザーが AI ツールを通じてサービスにアクセスする場合、次の2つの実践的なアクセス制御の課題が生じます:
この問題を解決する鍵は次の通りです:
MCP サーバーがユーザーの資格情報やインタラクティブなサインインなしでサービスへのアクセスをユーザーから許可される方法は?
この問題を解決すれば、MCP サーバーを通じて直接サービスと相互作用でき、元のユーザー向けに設計されたアクセス制御メカニズムを引き続き使用することができます。MCP サーバー専用の新しいシステムを再設計する必要がありません!
しかし、これが可能ですか?
もちろんです!この問題は、パーソナル アクセス トークンを使用して完全に解決できます!
パーソナル アクセス トークン (PAT) は、ユーザーが資格情報やインタラクティブなサインインを使わずにアクセス トークンを安全に付与する方法を提供します。これは CI/CD、スクリプト、またはリソースにプログラムでアクセスする必要があるアプリケーションに適しています。
ワークフローの流れは次の通りです:
したがって、システムがパーソナル アクセス トークン (PAT) をサポートしている限り、AI ツールと既存のサービス間のアクセス制御の課題を解決し、認証メカニズムを再設計することなく、データのセキュリティとユーザーのプライバシー保護を確保できます。
次は、これを実際に実装する方法を見てみましょう。
このセクションでは、既存の CMS システムを基礎として MCP サーバーのアクセス制御を実装します。
実践における RBAC: アプリケーションの安全な認証の実装 にある完全な CMS サンプル チュートリアルとソース コードをチェックアウトできますが、これは必須ではありません。ここで基本的な原則をすべて取り上げます。
CMS サンプルは、包括的な認証および認可ソリューションを提供する人気のオープンソースアイデンティティ プラットフォームである Logto に基づいていますが、このプラットフォームの技術的な実装はこの記事の焦点ではありません。
アクセス制御を実装する最初のステップは、システムのための権限とアクセス制御ポリシーを設計することです。
クテンツ管理システム (CMS) の例では、RBAC (ロールベースのアクセス制御) に基づいて次のような API エンドポイントを設計し、各エンドポイントにアクセスするために必要な権限を指定しました。
| エンドポイント | アクセス制御ロジック |
|---|---|
| GET /api/articles | - list:articles 権限を持つユーザーまたは自分の記事が見える著者 |
| GET /api/articles/:id | - read:articles 権限を持つユーザーまたはその記事の著者 |
| POST /api/articles | - create:articles 権限を持つユーザー |
| PATCH /api/articles/:id | - update:articles 権限を持つユーザーまたはその記事の著者 |
| DELETE /api/articles/:id | - delete:articles 権限を持つユーザーまたはその記事の著者 |
| PATCH /api/articles/:id/published | - publish:articles 権限を持つユーザーのみ |
システムの権限設計は次の通りです:
| 権限 | 説明 |
|---|---|
| list:articles | システム内のすべての記事のリストを見る |
| read:articles | 任意の記事の全文を読む |
| create:articles | 新しい記事を作成する |
| update:articles | 任意の記事を修正する |
| delete:articles | 任意の記事を削除する |
| publish:articles | 公開ステータスを変更する |
これらの権限に基づいて、CMS システムのために次の役割を定義しました。
| 権限/役割 | 👑 管理者 | 📝 出版者 | ✍️ 著者 |
|---|---|---|---|
| 説明 | コンテンツ管理のためのフルシステムアクセス | すべての記事を見て公開ステータスを制御することができる | システム内で新しい記事を作成することができる |
| list:articles | ✅ | ✅ | ❌ |
| read:articles | ✅ | ✅ | ❌ |
| create:articles | ✅ | ❌ | ✅ |
| update:articles | ✅ | ❌ | ❌ |
| delete:articles | ✅ | ❌ | ❌ |
| publish:articles | ✅ | ✅ | ❌ |
ノート: 著者は、ロールの権限に関係なく、自分の記事に対して自動的に読み取り/更新/削除権限を持ちます。
次に、システム内のユーザーにロールを割り当てます (CMS デモを例として使用):
| ユーザー名 | ロール |
|---|---|
| アレックス | 管理者 |
| ボブ | 出版者 |
| チャールズ | 著者 |
そして、上記の記事 実践における RBAC で言及されているように、Logto で内部的なロールを設定しました。

CMS サンプルへのユーザーのログイン方法は次の通りです:
したがって、サービス API にアクセス制御を適用することは、ステップ 9 でアクセス トークンを検証し、権限を確認するミドルウェアを追加するのと同様に簡単です。
コア実装は次の通りです (RBAC サンプル - バックエンド の完全な実装を参照):
認証が必要な API エンドポイントにミドルウェアを適用します:
これで、CMS システムにアクセス制御を追加し、ユーザーにロールを割り当てました。
ユーザーがログインし、CMS API のためのアクセス トークンを取得した後、このトークンを使用して CMS API にアクセスできます。アクセス トークンにはユーザーの権限情報が含まれています。これにより、ユーザーの権限に基づいてどのデータを返すかを制御できます。
次のステップは、MCP サーバーでパーソナル アクセス トークンを使用することです。
上記の CMS 認証フローを参照してください。ユーザーはログイン後に CMS API のアクセス トークンを取得します。このアクセス トークンは、CMS API にアクセスするための資格情報です。
ログイン後にユーザーが取得するのと同様のアクセス トークンを取得するだけで済みます。次に、これを使用して CMS API にアクセスできます。
ここでパーソナル アクセス トークンが役立ちます。それらを使用すると、通常のログイン後にユーザーが取得するのと同様のアクセス トークンを取得できます。
ここで必要な手順は次の通りです:
この例では、Logto を使用してデモを行います。Logto はパーソナル アクセス トークンとトークン エクスチェンジをサポートしています。他のシステムを使用している場合でも、このアプローチに従って独自のパーソナル アクセス トークン サポートを実装できます。
Logto コンソール > ユーザー管理で、詳細ページからユーザーのためにパーソナル アクセス トークンを作成できます:

パーソナル アクセス トークンを作成するときに、有効期限を必要に応じて設定できます。
ユーザーのパーソナル アクセス トークンを持ったので、MCP サーバーで使用できます。
まず、Logto の パーソナル アクセス トークン ドキュメント に従い、Logto のトークン エンドポイントから CMS API にアクセスするためのアクセス トークンを取得します。完全なソース コードはこちらで確認できます。
MCP サーバーでは、exchangeAccessToken 関数からのアクセス トークンを使用して CMS API データを取得します。
この方法では、MCP サーバーはユーザーの認証情報なしで CMS API にアクセスすることができます。代わりに、ユーザーのパーソナル アクセス トークンを使用します。
RBC サンプル - MCP サーバーで完全なコードを見つけることができます。
Claude Desktop でこの MCP サーバーをローカルにデプロイする方法については、MCP サーバーデプロイ ガイドをご覧ください。
このサーバーを Cursor、Cline、Windsurf など、さまざまな AI IDE にもデプロイできます。
Claude Desktop でこの実装をテストしましょう。
私たちの CMS では、アレックスとチャールズがそれぞれ 1 記事を作成しました。
アレックスは管理者の役割を持っているため、すべての記事を見ることができますが、著者であるチャールズは自分の記事のみを見ることができます。
Claude に利用可能な記事数を尋ねると、get-available-article-count ツールを使用して許可を求めてきます:

MCP にアレックスのパーソナル アクセス トークンを使用し、-Claude に利用可能な記事の数を尋ねると、Claude は get-available-article-count ツールを呼び出して、2 件の記事があると教えてくれます。

チャールズのパーソナル アクセス トークンに切り替えて同じ質問をすると、Claude は 1 件の記事しかないと伝えます。

素晴らしいですね!パーソナル アクセス トークンを使用して CMS API にアクセスし、正確なデータを取得することができました。
これは私たちが望んでいたことそのものです: 各ユーザーのためにパーソナル アクセス トークンを作成し、ユーザーが MCP サーバーにトークンを設定すると、それぞれのユーザーに対して個別化された AI エクスペリエンスを作成します。
まとめのセクションを書くのを手伝ってください:
このガイドでは、適切なアクセス制御を維持しながら AI ツールを既存のサービスに接続する方法を探りました。RBAC 実装を伴う CMS システムを使用して、パーソナル アクセス トークン (PAT) がどのように認証の課題を優雅に解決できるかを示しました。
この実装のための完全なソース コードを RBAC サンプル リポジトリ で見つけることができます。このリポジトリには、CMS バックエンド、フロントエンド、および MCP サーバーの実装が含まれます。
MCP サーバーをユーザーに配布する際は、パーソナル アクセス トークンを設定可能にすることを忘れないようにしましょう。これにより、各ユーザーが以下を行うことができます:
このアプローチは、AI 統合を安全に保ちながら、システム内の各ユーザーに応じたカスタマイズされたエクスペリエンスを提供します。
この AI 統合の旅でビジネスの大成功を祈っています!これらの新しい AI 機能でサービスが繁栄し、成長することを願っています! 🚀