社内専用 MCP サーバーを Cloudflare Workers で構築する - Google OAuth 認証編
この記事では、 Cloudflare Workers を利用した Model Context Protocol(MCP) サーバーを開発する方法を紹介します。Cloudflare の提供するデモアプリをベースに Google OAuth を利用し、社内メンバーのみがアクセスできるサーバーを構築しました。この方法を知ることで、公開範囲を制限したい MCP サーバーを作成・配布することが可能になります。
業務効率化を進めるために、さまざまな SaaS を導入してきました。そこで発生した問題が、サービスを横断した情報検索です。どのサービスになんの情報があるか、ナレッジ化されているのかそれとも対応履歴を漁る必要があるのか。。そんな問題を軽減するための方法として、MCP サーバーの開発に着手しています。
最終的には Backlog、Stripe などの社内ツールのデータを Claude から直接操作できるようにする予定ですが、まずは認証基盤を整えることから始めました。
なぜ Google OAuth を使うのか
社内専用のシステムということで、Google OAuth を認証基盤として選択しました。理由は既に Google Workspace を利用していることが大きく、OAuth の Internal モードを使えば組織外のアクセスを制限できそうだと判断したこともあります。
最終的には各種サービスごとに OAuth を利用した認証を設定して、社員ごとのアカウント情報を利用した操作ができるようにすべきとは思いますが、今回の開発目的は「情報・履歴・ナレッジの検索」です。取得系であれば、権限の問題を除けば誰かのアカウントで発行した API キーを利用する形で十分ですので、今回は「社外のメンバーが利用できないようにするための仕組み」として Google の OAuthを利用することにしています。
今回構築するもの
Cloudflare Workers 上で動作する、Google OAuth 認証付きの MCP サーバーを作ります。認証が完了すると、以下のような社内ツール連携の準備が整う仕組みになっています。
まず Backlog API との連携では、チケット検索や作成といった機能を想定しています。次に esa API との連携では記事検索や投稿機能、そして Stripe API との連携では顧客情報や決済データの参照機能を実装予定です。
認証部分を今回実装し、各ツールとの連携は順次追加していく計画を立てました。
プロジェクトのセットアップ
テンプレートからの初期化
Cloudflare が提供するテンプレートを使用します。
npm create cloudflare@latest -- my-mcp-server --template=cloudflare/ai/demos/remote-mcp-google-oauth
このテンプレートには OAuth 認証の基盤が既に含まれています。Cloudflare が考える Remote MCP サーバーでの OAuth 認証フローの確認や理解を深める意味でも、まずはテンプレートを採用しました。
KV Namespace の設定
このテンプレートでは、 Durable Objects と KV を利用します。 KV は自身でセットアップが必要でしたので、KV Namespace を作成しましょう。
npx wrangler kv namespace create internal-mcp-server
出力された設定を wrangler.json
に追加します。
{
"kv_namespaces": [
{
"binding": "OAUTH_KV",
"id": "your-generated-kv-id"
}
]
}
初回デプロイ
Google の OAuth 設定を行うには、アプリケーションの URL が必要です。そこでこの MCP サーバーを一度デプロイしてしまいます。
npm run deploy
デプロイが成功すると、以下のような URL が生成されます。
https://my-mcp-server.your-subdomain.workers.dev
この URL をコピーして手元に控えておきましょう。
Google OAuth の設定
続いて Google OAuth 側の設定を始めましょう。
Google Cloud Console でのプロジェクト作成
Google Cloud Console で新しいプロジェクトを作成します。社内専用ということで、プロジェクト名も「Internal MCP Server」のような分かりやすい名前にしました。
OAuth 同意画面の設定(Internal モード)
「API とサービス」→「OAuth 同意画面」から設定を行います。
ここで重要なのは、User Type を必ず「Internal」に設定することです。これにより組織内のメンバーのみがアクセス可能になります。External にしてしまうと外部からもアクセスできてしまうため、社内専用の目的に反してしまいます。
必要事項の入力では、アプリケーション名を「社内 MCP Server」のような分かりやすい名前にし、ユーザーサポートメールには管理者のメールアドレスを設定します。承認済みドメインには組織のドメインを登録しておきましょう。
OAuth クライアント ID の作成
「API とサービス」→「認証情報」→「OAuth クライアント ID」を作成します。
アプリケーションの種類は「ウェブアプリケーション」を選択しましょう。承認済みのリダイレクト URI には、先ほどデプロイしたアプリの URL を利用します。/callback
も追加する必要があることに注意しましょう。
https://my-mcp-server.your-subdomain.workers.dev/callback
これで Google 側の OAuth 認証に向けた準備は完了です。
Wrangler でシークレットを登録する
先ほどデプロイした MCP サーバーは、まだ Google OAuth での認証が行えません。ここからは必要なパラメーターを設定していきましょう。
認証情報を安全に管理するため、Wrangler の secret 機能を使用し、次のように値を登録します。
# Google OAuth クライアント ID
wrangler secret put GOOGLE_CLIENT_ID
# → Google Cloud Console で取得したクライアント ID を入力
# Google OAuth クライアント シークレット
wrangler secret put GOOGLE_CLIENT_SECRET
# → クライアントシークレットを入力
# Cookie 暗号化用のキー
wrangler secret put COOKIE_ENCRYPTION_KEY
# → openssl rand -hex 32 で生成した32バイトキーを入力
# 組織ドメインの制限
wrangler secret put HOSTED_DOMAIN
# → 例:yourcompany.com(組織のドメインを入力)
HOSTED_DOMAIN
を設定することで、指定したドメインのアカウントでのみログインが可能になるそうです。
ローカルでテストする場合は、これらの値を .dev.vars
に設定しましょう。ただしこの場合、OAuth のコールバック URL が異なるため、ngrok を入れるなどの追加作業が必要になるかもしれません。
MCP サーバーの動作確認
ここまでで接続の準備ができました。実際に動作するかをチェックしていきましょう。
MCP Inspector でのテスト
最も簡単なテスト方法は、MCP Inspector を使うやり方です。npx
コマンドでアプリを立ち上げましょう。
npx @modelcontextprotocol/inspector
アプリに移動後、Transport Type を SSE に設定します。そしてURL にはデプロイした Workers の URL を指定しましょう。
「Connect」を押すと Google の認証画面にリダイレクトされ、組織のアカウントでログインできることを確認できます。External ではなく Internal に設定したため、組織外のアカウントではアクセスできないはずです。
Claude Integrations での利用
Claude で Integrations 機能を使用している場合、デプロイした URL を設定することで Claude から直接アクセスできるようになります。
実際に設定してみたところ、認証が正常に完了し、MCP サーバーとの接続が確立されました。現在は認証機能のみですが、ここから社内ツールとの連携機能を順次追加していく予定です。
次のステップ
認証基盤が完成したので、今後は社内ツール連携を実装していく予定です。
Backlog や esa と連携することで、記事や対応履歴の検索が可能になり、社内での情報確認などが効率化できることを期待しています。また、Stripe 連携では顧客情報や決済履歴・サブスクリプションの詳細などが検索できるようになれば良いなと考えています。
まとめ
Cloudflare の用意するテンプレートを活用することで、簡単に
Google OAuth を使った社内専用 Remote MCP サーバーの認証基盤が完成しました。
今後は Backlog、esa、Stripe などの社内ツールとの連携機能を順次追加し、Claude を通じて日常業務で使っているツールのデータを効率的に操作できるようにしていきます。
社内の DX 向上に向けて、一歩ずつ進めていく予定です。進捗があれば、また記事にまとめて共有したいと思います。
Discussion