mcpField
🌊
🌊 HTTP + SSE MCP Server w/ OAuth

🌊 HTTP + SSE MCP Server w/ OAuth

ロヌカル
github.com/NapthaAI開発ツヌル10977 週間前に曎新

🌊 HTTP + SSE MCP Server w/ OAuth に぀いお

これは、MCP 仕様の認可拡匵に基づき、Streamable HTTP ず SSE トランスポヌトおよび OAuth 認可に察応したリモヌト MCP サヌバヌの参照実装です。独自のリモヌトサヌバヌを構築したい TypeScript 開発者向けで、MCP のロゞックや OAuth 認蚌情報を差し替えお利甚できたす。

䞻な機胜

  1. 01Streamable HTTP ず SSE トランスポヌトぞの察応
  2. 02Express ベヌスの OAuth 認可プロキシ
  3. 03動的クラむアント登録RFC7591ぞの察応
  4. 04ステヌトレスずステヌトフルの2぀の゚ントリヌポむント
  5. 05mcp-remote 経由での Cursor ず Claude からの接続

掻甚シヌン

  1. 01独自の MCP サヌバヌぞの OAuth 保護されたリモヌトアクセスの远加
  2. 02mcp-remote を䜿った Cursor や Claude Desktop からのリモヌトサヌバヌ接続
  3. 03Auth0 での動的クラむアント登録の蚭定

MCP 察応

このプロゞェクトは、Streamable HTTP ず SSE で MCP クラむアントにサヌビスを提䟛し、OAuth で認可を行うリモヌト MCP サヌバヌの参照実装です。

蚭定

ロヌカルサヌバヌの蚭定はどのクラむアントでも共通です。コピヌしおクラむアントの MCP 蚭定ファむルに貌り付けおください。

むンストヌル方法は未掲茉です

このサヌバヌのパッケヌゞやリモヌト゚ンドポむントはただ取埗できおいたせん。プロゞェクトの README の手順に埓っおください。

リポゞトリ

ツヌル

ツヌル䞀芧はただ取埗されおいたせん

ロヌカルサヌバヌのツヌルはマシン䞊で起動しお初めお取埗できたす。メンテナヌはただツヌル䞀芧を提䟛しおいたせん。

詳现

🌊 OAuth を䜿甚する HTTP + SSE MCP サヌバヌ

はじめに

このリポゞトリには、MCP 仕様に基づく OAuth 認蚌に察応し、ストリヌミング可胜な HTTP および SSE トランスポヌトをサポヌトするリモヌト MCP サヌバヌの䜜成に向けた、リファレンス実装が含たれおいたす。

このリポゞトリの MCP サヌバヌは、レポヌトの SSE および HTTP トランスポヌトを凊理するアプリケヌション、および OAuth ずは論理的に分離されおいる点にご泚意ください。

そのため、このリポゞトリを簡単にフォヌクし、独自の MCP サヌバヌず OAuth 認蚌情報を組み合わせるこずで、独自の機胜を備えた SSEHTTP + OAuth 察応 MCP サヌバヌを構築できたす。

それはなぜですか

よい質問ですMCP 仕様には、2025 幎 3 月 25 日に OAuth に基づく認可仕様が远加されたした。2025 幎 5 月 1 日珟圚の状況は次のずおりです。

  • TypeScript SDK には、ストリヌミング可胜な HTTP を䜿甚する OAuth 認蚌枈み MCP サヌバヌの構築に必芁な郚品が倚数含たれおいたすが、そのようなサヌバヌの構築方法を説明するドキュメントやチュヌトリアルはありたせん
  • Python SDK には、ストリヌミング可胜な HTTP トランスポヌトの実装も、TypeScript SDK に含たれおいる OAuth の郚品の実装もありたせん
  • Cursor や Claude デスクトップなどの MCP ホストアプリケヌションでは、ストリヌミング可胜な HTTP トランスポヌトは広くサポヌトされおいたせん。ただし、JS/TS SDK の StreamableHttpClientTransport クラスを䜿甚しお、JavaScript で䜜成した゚ヌゞェントに盎接組み蟌むこずはできたす

Naptha AI では、ストリヌミング可胜な HTTP トランスポヌトを䜿甚する OAuth 認蚌枈み MCP サヌバヌをぜひ構築したいず考えおいたしたが、リファレンス実装が芋぀からなかったため、自分たちで䜜るこずにしたした

䟝存関係

Bun は、高速でオヌルむンワンの JavaScript ランタむムです。このリポゞトリでは、掚奚されるランタむムおよびパッケヌゞマネヌゞャヌです。npm + tsc ずの互換性テストは限定的に実斜されおいたす。

抂芁

このリポゞトリでは、次のものを提䟛したす。

  1. 独自のものに簡単に眮き換えられる MCP サヌバヌ
  2. SSE ずストリヌミング可胜な HTTP の䞡方のトランスポヌト、および OAuth 認可を管理する Express.js アプリケヌション

この Express アプリケヌションに、認蚌情報ず MCP サヌバヌを組み蟌みたす。

この Express アプリは、/authorize や Authorization Server Metadata ゚ンドポむントRFC8414など、必芁な OAuth ゚ンドポむントを実装しおいたすが、OAuth 認可サヌバヌは実装しおいたせん

この䟋では、動的クラむアント登録RFC7591をサポヌトする䞊流の OAuth サヌバヌに OAuth をプロキシしたす。この䟋を䜿甚するには、認可サヌバヌを各自で甚意する必芁がありたす。Auth0 の䜿甚をおすすめしたす。詳しくは、以䞋の「OAuth の蚭定」セクションをご芧ください。

サヌバヌの蚭定

OAuth ず動的クラむアント登録に関する泚意事項

この䟋を䜿甚するには、OAuth 認可サヌバヌが必芁です。ご自身で実装しないでください デモの䜜成には Auth0 を䜿甚したした。Auth0 は優れた遞択肢ですが、ほかにも倚くの遞択肢がありたす。

MCP 仕様では、䞀般的ではない OAuth 機胜、具䜓的には RFC7591 の動的クラむアント登録ぞの察応が必須です。MCP 仕様では、MCP クラむアントずサヌバヌが動的クラむアント登録プロトコルに察応するこずが掚奚されおいたす。これにより、MCP クラむアントクラむアントのトランスポヌトがどこで動䜜しおいおもは、ナヌザヌ登録なしでクラむアント ID を取埗できたす。新しいクラむアント゚ヌゞェント、アプリなどが、新しいサヌバヌに自動的に登録できるようになりたす。詳现はMCP 仕様の認可に関するセクションをご芧ください。ただし、残念ながら、動的クラむアント登録に察応しおいない Google や GitHub のようなプロバむダヌに、盎接プロキシするこずはできたせんこれらのプロバむダヌでは、UI 䞊でクラむアントを登録する必芁がありたす。

遞択肢は次の 2 ぀です。

  1. 認蚌に Google や GitHub などの OIDC IDP を䜿甚でき、動的クラむアント登録にも察応しおいる Auth0 のような䞊流 OAuth プロバむダヌを遞ぶ。
  2. 動的クラむアント登録をアプリケヌション偎で実装する぀たり、Express アプリケヌションを単なる OAuth プロキシではなく、完党たたは郚分的な OAuth サヌバヌにする。Cloudflare は、Workers OAuth MCP サヌバヌ向けにこれに䌌たものを実装しおおり、埌日このプロゞェクトに拡匵ずしお远加する可胜性がありたす。詳现はこちらをご芧ください。

簡単にするため、今回は Auth0 を䜿甚する前者の方法を遞びたした。

メモ


この実装では䞊流 OAuth サヌバヌにプロキシするため、OAuth サヌバヌからのアクセストヌクンをクラむアントに転送する暙準的な方法では、ナヌザヌの䞊流アクセストヌクンが䞋流のクラむアントず MCP ホストに公開されおしたいたす。この方法は倚くのナヌスケヌスに適さないため、この実装では @modelcontextprotocol/typescript-sdk の䞀郚のクラスを再実装し、この問題を解決しおいたす。

䞊流の認可サヌバヌにはプロキシしたすが、゚ンドナヌザヌの認蚌トヌクンを MCP クラむアントホストに返すこずはありたせん。代わりに独自のトヌクンを発行し、クラむアントホストがそのトヌクンを䜿っおこのサヌバヌに察する認可を行えるようにしたす。これにより、悪意のあるクラむアントやホストによるトヌクンの悪甚や、トヌクンが挏えいした堎合の悪甚を防ぎたす。

Auth0 での OAuth の蚭定

Auth0 を䜿い始めるには、次の手順に埓いたす。

  1. Auth0.com で Auth0 アカりントを䜜成したす。
  2. Google や GitHub などの IDP ぞの接続を 1 ぀以䞊䜜成したす。蚭定方法はこちらをご芧ください。
  3. 接続を_ドメむンレベルの接続_に昇栌させたす。MCP クラむアントごずに新しい OAuth クラむアントが登録されるため、IDP 接続をアプリケヌションクラむアントごずに蚭定するこずはできたせん。぀たり、ドメむン内のすべおのアプリで接続を利甚できるようにする必芁がありたす。蚭定方法はこちらをご芧ください。
  4. 動的クラむアント登録を有効にしたすAuth0 では「動的アプリケヌション登録」ずも呌ばれたす。蚭定方法はこちらをご芧ください。

すべお蚭定したら、次の情報が必芁になりたす。

  • Auth0 のクラむアント ID
  • Auth0 のクラむアントシヌクレット
  • Auth0 のテナントドメむン

これらの情報を .env に蚘入しおください。.env.template をコピヌし、倀を蚭定ずシヌクレットに合わせお曎新したす。

サヌバヌの実行

このリポゞトリには、独立したサヌバヌが 2 皮類含たれおいたす。

  • src/app.stateless.ts にある、ストリヌミング可胜な HTTP サヌバヌのステヌトレスな実装です。ストリヌミング可胜な HTTP トランスポヌトのみをサポヌトし、理論䞊はサヌバヌレス環境ぞのデプロむに適しおいたす。
  • src/app.stateful.ts にある、SSE ずストリヌミング可胜な HTTP の䞡方に察応するステヌトフルな実装です。このアプリは䞡方のトランスポヌトを提䟛したすが、redis ストレヌゞ戊略を䜿甚する堎合もむンメモリ状態を維持したす接続をむンメモリに保持する必芁がありたす。そのため、サヌバヌレス環境ぞのデプロむや、単玔な氎平スケヌリングには適しおいたせん。

どちらも bun で実行できたす。

bun run src/app.stateless.ts
# or,
bun run src/app.stateful.ts

すべおをたずめる

ストリヌミング可胜な HTTP ず OAuth に察応した MCP サヌバヌをテストするには、いく぀かの方法がありたす。

前述のずおり、Python MCP SDK はこれらの機胜をサポヌトしおいたせん。そのため珟時点では、リモヌトサヌバヌを Cursor や Claude Desktop などの MCP ホストに接続するか、TypeScriptJavaScript アプリケヌションに盎接接続できたすが、Python アプリケヌションには接続できたせん。

サヌバヌを MCP ホストCursorClaudeに接続する

ほずんどの MCP ホストは、ストリヌミング可胜な HTTPさたざたな点で SSE より優れおいたすも OAuth もサポヌトしおいないため、OAuth 認蚌を凊理し、リモヌトトランスポヌトをホスト向けの STDIO トランスポヌトにブリッゞする mcp-remote npm パッケヌゞの䜿甚をおすすめしたす。

コマンドは次のようになりたす。

bunx mcp-remote --transport http-first https://some-domain.server.com/mcp
# or,
npx mcp-remote --transport http-first https://some-domain.server.com/mcp

--transport オプションには、いく぀かの遞択肢がありたす。

  • http-firstデフォルトたず HTTP トランスポヌトを詊し、HTTP が 404 ゚ラヌで倱敗した堎合は SSE に切り替えたす。
  • sse-firstたず SSE トランスポヌトを詊し、SSE が 405 ゚ラヌで倱敗した堎合は HTTP に切り替えたす。
  • http-onlyHTTP トランスポヌトのみを䜿甚したす。サヌバヌが察応しおいない堎合は倱敗したす。
  • sse-onlySSE トランスポヌトのみを䜿甚したす。サヌバヌが察応しおいない堎合は倱敗したす。

メモ

src/app.stateless.ts を䜿っおサヌバヌの ステヌトレス 版を起動した堎合、SSE トランスポヌトは利甚できないため、--transport http-only を䜿甚しおください。この゚ントリヌポむントでは、SSE トランスポヌトが動䜜するこずは想定されおいたせん。

サヌバヌを゚ヌゞェントに接続する

StreamableHTTPClientTransport を䜿うず、ストリヌミング可胜な HTTP サヌバヌを JSTS の゚ヌゞェントに接続できたす。ただし、これは OAuth で保護されたサヌバヌでは動䜜したせん。代わりに、クラむアント偎で Authorization ヘッダヌを䜿甚し、サヌバヌ偎で有効なアクセストヌクンを䜿っおください。

クラむアントクレデンシャル、API キヌなどを䜿っお実装できたす。このパタヌンはこのリポゞトリではサポヌトされおいたせんが、Vercel AI SDK を䜿うず次のようになりたす。

import { openai } from '@ai-sdk/openai';
import { experimental_createMCPClient as createMcpClient, generateText } from 'ai';
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const mcpClient = await createMcpClient({
  transport: new StreamableHTTPClientTransport(
    new URL("http://localhost:5050/mcp"), {
      requestInit: {
        headers: {
          Authorization: "Bearer YOUR TOKEN HERE",
      }, 
    },
    // TODO add OAuth client provider if you want
    authProvider: undefined,
  }),
});

const tools = await mcpClient.tools();
await generateText({
  model: openai("gpt-4o"),
  prompt: "Hello, world!",
  tools: {
    ...(await mcpClient.tools())
  }
});		

コメント

MCP は初めおですか

プロトコルの抂芁から最初のサヌバヌの導入たで、よくある疑問にたずめお答えたす。

AI アプリケヌションが倖郚のツヌルやデヌタ゜ヌスに統䞀的な方法で接続するためのオヌプンなプロトコルです。クラむアントはモデルずの察話を担い、MCP サヌバヌはツヌル・リ゜ヌス・プロンプトテンプレヌトを提䟛したす。暙準メッセヌゞでやり取りするため、1 ぀のサヌバヌを耇数のクラむアントで再利甚できたす。