OSSのAIプラットフォームLibreChatをDockerで立ち上げてモデル・MCP追加まで試してみた

OSSのAIプラットフォームLibreChatをDockerで立ち上げてモデル・MCP追加まで試してみた

複数のAIモデルやMCPの設定を1つのファイルで管理できるOSSプラットフォーム「LibreChat」をDockerで立ち上げ、Amazon BedrockのClaudeとMCPサーバーを追加してみました。`librechat.yaml`という設定ファイルの使い勝手や、社内AI基盤としての活用可能性をレポートします。
2026.05.18

はじめに

こんにちは、AI事業本部・生成AIインテグレーション部・西日本開発チームの政岡です。

最近、AIエージェントやMCPを社内ツールにどう組み込むかを考える場面が増えてきました。複数のモデルやツールを使い分けるようになると、それらの設定をどう管理するかも気になってきます。

そういう用途に使えそうなOSSを探していたところ、librechat.yamlという1つのファイルでモデル・エージェント・MCPを管理できるLibreChatというOSSを見つけたので、まずはDockerで立ち上げて触ってみました。

この記事では、LibreChatがどんなOSSなのかを整理しつつ、Docker Composeで立ち上げて、Amazon BedrockのClaude(Sonnet / Haiku)とMCPサーバーをlibrechat.yamlから追加するところまで試します。

LibreChatとは

LibreChatは「Open-Source AI Platform」を掲げるOSSのチャットプラットフォームです。UIはChatGPTに近く、初見でも直感的に使えます。Shopify、Daimler Truck、Boston Universityなど海外の大手企業・大学での採用実績が紹介されています。

https://www.librechat.ai/

主な機能

LibreChatには多くの機能がありますが、今回触っていて特に気になったのは次のあたりです。

  • OpenAI、Anthropic、Google、Mistral、Amazon Bedrock、Azure OpenAI、Ollamaなど、主要なモデルプロバイダに対応
  • OpenAI互換のカスタムエンドポイントを追加できるため、独自の推論基盤や社内APIともつなぎやすい
  • librechat.yamlでモデル、MCP、エージェント、UI表示をまとめて設定できる
  • MITライセンスで公開されている

そのほか、RAG、Web検索、メモリ、OAuth / OIDC / SAML / LDAPなど、社内向けAI基盤として使うときに欲しくなりそうな機能も用意されています。

技術スタック

セルフホストで動かす前提で、どんな技術構成になっているかを軽く整理しておきます。

レイヤー 採用技術
フロントエンド React (Vite) + Tailwind CSS + Radix UI
バックエンド Node.js + Express(APIサーバー、ポート3080)、認証はPassport.js
主データDB MongoDB(会話履歴・ユーザー情報など)
RAGベクトルDB PostgreSQL + pgvector
キャッシュ・セッション Redis
全文検索 Meilisearch(会話履歴の検索)

Docker Composeで立ち上げると、上記のコンテナがまとめて起動します。

librechat.yamlで何ができるか

LibreChatを触っていてまず便利だと感じたのが、設定をlibrechat.yamlにかなり寄せられる点です。モデルまわりの設定だけでなく、MCPやエージェント、UIの表示まで同じファイルで扱えます。

  • カスタムエンドポイント(モデルプロバイダ)の定義
  • モデルの追加・有効化・表示名の制御
  • MCPサーバーの登録
  • エージェントの設定
  • UI表示の細かい制御(モデルセレクタの並びなど)

管理画面でポチポチ設定するタイプではなく、ファイルとして差分を見ながら設定できるのが便利です。ただし、LibreChat本体の.gitignoreではlibrechat.yamlが除外されているため、実際の設定ファイルをそのままリポジトリに含める前提ではなさそうです。

やってみた

ここから実際にLibreChatをDockerで立ち上げ、BedrockのClaude(Sonnet / Haiku)とMCPサーバーを追加して動かすところまでを確認します。

前提

検証環境は以下の通りです。

  • OS: macOS Tahoe 26.4.1
  • Docker: 29.1.4-rd(Rancher Desktop 1.22.3経由)
  • Docker Compose: v5.0.1

Docker DesktopではなくRancher Desktopを使っていますが、docker / docker composeコマンドが使える環境であれば手順自体は同じです。

また、事前にAmazon Bedrock側で検証用のIAMユーザーを作成し、AmazonBedrockFullAccess権限を付与したアクセスキーを発行しておきます。

Docker Composeで起動する

公式リポジトリをクローンし、サンプルの.env.example.envにコピーします。

git clone https://github.com/danny-avila/LibreChat.git
cd LibreChat
cp .env.example .env

ここまでできたらDocker Composeで起動します。通常は次のコマンドで大丈夫です。

docker compose up -d

自分の環境では、Rancher Desktopで起動したときにbind mountまわりの権限エラーに当たりました。Claude Codeにログを渡しながら何度か相談し、最終的には対象ディレクトリを先に作ってからUID/GIDを明示する形で起動できました。

mkdir -p meili_data_v1.35.1 logs images data-node uploads
chown -R $(id -u):$(id -g) meili_data_v1.35.1 logs images data-node uploads
UID=$(id -u) GID=$(id -g) docker compose up -d

このあたりの詳細は、「備考: Rancher Desktopで起動時につまずいたところ」にまとめています。

起動が完了したらhttp://localhost:3080にアクセスします。初回はログイン画面が出ます。

login

アカウントがないので、「新規作成」を押してサインアップ画面に遷移し、項目に沿って入力してアカウントを作成します。

sign-up-fill

アカウントが正常に作成されたら、ログイン画面にリダイレクトされるので、先程作成したアカウントのメールアドレスとパスワードを入れてください。

login-fill

ログインしたらChatGPTのようなチャット画面が出てきました。

home

試しに「こんにちは」と入力してみましたが、なにも設定していないのでエラーメッセージが返りますね。

error

また、デフォルトではOpenAI, Google, Anthropicのモデルが表示される設定になっています。

default-model

ここのUIの表示の制御は、「備考: LLMプロバイダ設定の置き場所を決める」に記載しています。

librechat.yamlをマウントする

LibreChatのリポジトリ直下にlibrechat.yamlを作成し、Dockerコンテナにマウントします。マウントはdocker-compose.override.ymlを用意するのが公式の推奨パターンです。先ほどApple Silicon対策で作ったdocker-compose.override.ymlに、apiサービス側のvolume設定を追記します。

docker-compose.override.yml
services:
  mongodb:
    image: mongo:4.4.18
+  api:
+    volumes:
+      - type: bind
+        source: ./librechat.yaml
+        target: /app/librechat.yaml

Apple Silicon以外の方はmongodbセクションは不要で、apiセクションだけを書けばOKです。

BedrockのClaude Sonnet / Haikuを追加する

.envの設定

.envにAWSのクレデンシャルを設定します。LibreChatのBedrock用環境変数はBEDROCK_AWS_*プレフィックスが付く点に注意してください。
また、今回はBedrockだけをUIに表示したいので、ENDPOINTSbedrockだけ設定します。

.env
#=================#
#   AWS Bedrock   #
#=================#

BEDROCK_AWS_DEFAULT_REGION=us-east-1
BEDROCK_AWS_ACCESS_KEY_ID=<ここにアクセスキーIDを入力>
BEDROCK_AWS_SECRET_ACCESS_KEY=<ここにシークレットアクセスキーを入力>

#===================================================#
#                     Endpoints                     #
#===================================================#

ENDPOINTS=bedrock

librechat.yamlの設定

続いてlibrechat.yamlに、Bedrockで使いたいモデルを追加します。今回はUIに出したいモデル、タイトル生成に使うモデル、利用するリージョンをendpoints.bedrockにまとめて書きました。

librechat.yaml
version: 1.3.11
cache: true

endpoints:
  bedrock:
    titleModel: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'
    availableRegions:
      - 'us-east-1'
    models:
      - 'us.anthropic.claude-sonnet-4-6'
      - 'us.anthropic.claude-haiku-4-5-20251001-v1:0'

docker compose down && docker compose up -dで再起動し、UIのモデルセレクタを開きます。

yamlで指定した2種類のモデルが表示されていますね!めちゃくちゃ簡単です。

bedcork-model

もし、UIでの表示名を変更したいなら、yamlファイルにmodelSpecsを追加してください。詳細は公式ドキュメントのModel Specsにまとまっています。

https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/model_specs

librechat.yaml
version: 1.3.11
cache: true

endpoints:
  bedrock:
    titleModel: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'
    availableRegions:
      - 'us-east-1'
    models:
      - 'us.anthropic.claude-sonnet-4-6'
      - 'us.anthropic.claude-haiku-4-5-20251001-v1:0'

+ modelSpecs:
+   list:
+     - name: 'claude-sonnet-4-6'
+       label: 'Claude Sonnet 4.6'
+       description: 'Anthropic Claude Sonnet 4.6 (Bedrock)'
+       preset:
+         endpoint: 'bedrock'
+         model: 'us.anthropic.claude-sonnet-4-6'
+         region: 'us-east-1'
+     - name: 'claude-haiku-4-5'
+       label: 'Claude Haiku 4.5'
+       description: 'Anthropic Claude Haiku 4.5 (Bedrock)'
+       preset:
+         endpoint: 'bedrock'
+         model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'
+         region: 'us-east-1'

再度docker compose down && docker compose up -dで再起動すると、モデルセレクタの表示名が変わっていることが確認できます。

bedrock-model-rename

挙動の確認

実際にプロンプトを投げて応答が返ることを確認します。

haiku

ストリーミングで返ってきました!
ちなみに、チャット欄のタイトルは最初の入力に合わせて英語で自動生成されています。
これは、yamlで設定しているendpoints.bedrock.titleModelのモデルを使っています。
yamlにendpoints.bedrock.titlePromptを追加すると、タイトル生成LLMへの指示文自体を書き換えることができます。
以下のように指定してあげることで、タイトルが日本語で生成されるようになります。

librechat.yaml
version: 1.3.11
cache: true

endpoints:
  bedrock:
    titleModel: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'
+    titlePrompt:  |
+      以下の会話内容から、日本語で簡潔なタイトル(最大5語、句読点・記号なし)を生成してください。
+      出力はタイトル本文のみとし、前置きや引用符は含めないでください。
+      {convo}
    availableRegions:
      - 'us-east-1'
    models:
      - 'us.anthropic.claude-sonnet-4-6'
      - 'us.anthropic.claude-haiku-4-5-20251001-v1:0'

同じ入力でもtitlePromptを設定したものとしていないもので、表示が変わっているのがわかります。

title-prompt

MCPサーバーを追加する

モデルと同じlibrechat.yamlに、MCPサーバーもmcpServersセクションで追加できます。今回はAWSが公式提供しているAWS Knowledge MCP Serverを例に、UIから呼び出せるところまで確認します。AWS公式ドキュメントを横断検索・取得できるリモートMCPサーバーで、記事執筆時点(2026年5月)では認証不要で利用できます。

librechat.yamlの設定

librechat.yamlmcpServersセクションを追加します。

librechat.yaml
version: 1.3.11
cache: true

endpoints:
  bedrock:
    ...

modelSpecs:
  list:
    - name: 'claude-sonnet-4-6'
      ...

+ mcpServers:
+   aws-knowledge:
+     type: streamable-http
+     url: https://knowledge-mcp.global.api.aws

docker compose down && docker compose up -dで再起動します。

UIから呼び出してみる

再起動後、チャット欄のツール選択メニューに、MCPサーバーが追加されました。

add-mcp

サイドバーからもMCPサーバーとして認識されていることを確認できます。

sidebar-mcp

接続ボタンを押すことで連携ができました。

forcus-connection

after-connection

チャット欄のMCP接続先がaws-knowledgeになっていることを確認し、試しに最近発表されたAgentCoreの機能であるPaymentsについて聞いてみました。
ツール実行の結果を踏まえて、AWS公式ドキュメントを参照した回答が返ってきています!

mcp-agentcore-payments

同じ質問をMCPサーバーなしで投げると、公式ドキュメントを参照した回答にはなりませんでした。

no-mcp-agentcore-payments

MCPを接続することで、LibreChatのチャット画面からAWS公式ドキュメントを参照した回答を得られることが確認できました。

このように、librechat.yamlに数行追加するだけで、モデルと同じ感覚でMCPサーバーを管理できるのは扱いやすいですね。

後片付け

検証が終わったら、リポジトリ直下で以下を実行してコンテナを停止します。

docker compose down

データごと完全に消したい場合は-vを付けます(MongoDBの会話履歴なども削除されるので注意)。

docker compose down -v

検証用に作成したIAMユーザーやアクセスキーも、不要であれば無効化・削除しておきます。

まとめ

LibreChatをDockerで立ち上げ、librechat.yamlにBedrockのClaude(Sonnet / Haiku)とMCPサーバーを追加できることを確認しました。

モデルもMCPも同じlibrechat.yamlに寄せられる点は、エージェント基盤を社内で運用していくうえで素直に扱いやすい構成だと感じました。

一方で、実際に触ってみると.envlibrechat.yamlの役割分担や、ENDPOINTSで制御できる範囲は最初少し迷いやすいところでした。このあたりは備考に整理したので参考になればと思います。

次はエージェント設定もlibrechat.yamlでどこまで管理しやすいか試してみたいです。

備考: Rancher Desktopで起動時につまずいたところ

今回の検証では、Rancher DesktopでLibreChatを起動するところで少しハマりました。ここは自力でログを読み切るのではなく、Claude Codeにエラーログを渡しながら、原因の切り分けや関連Issueの調査を手伝ってもらいました。

最初に出たのは、MeiliSearchのデータディレクトリを作るタイミングでのpermission deniedです。

Error response from daemon: error while creating mount source path '.../LibreChat/meili_data_v1.35.1': chown .../LibreChat/meili_data_v1.35.1: permission denied

やりとりする中で、作業ディレクトリのパスに日本語の「ブログ」という文字が入っていたことが怪しそうだと分かりました。Rancher DesktopはLima VMとvirtiofs経由でホストのディレクトリをマウントするため、パスや所有権まわりで引っかかることがあるらしいです。そこで、ディレクトリ名をブログからblogに変更しました。

これでmeili_data_v1.35.1まわりのエラーは消えましたが、次はUID / GIDの警告と、imagesディレクトリのchownエラーが出ました。

WARN[0000] The "UID" variable is not set. Defaulting to a blank string.
WARN[0000] The "GID" variable is not set. Defaulting to a blank string.
...
Error response from daemon: error while creating mount source path '.../LibreChat/images': chown .../LibreChat/images: permission denied

次のエラーでは、関連するGitHub Issueを探してもらいました。LibreChatのIssueには、Mac + ColimaやRancher Desktopで同じような権限エラーに当たっている例がいくつかあり、docker compose upの前にbind mount対象のディレクトリを作っておく、という対処にたどり着きました。

参考にしたIssueはこちらです。

最終的には、次のようにディレクトリを事前作成し、UID/GIDを明示して起動しました。

mkdir -p meili_data_v1.35.1 logs images data-node uploads
chown -R $(id -u):$(id -g) meili_data_v1.35.1 logs images data-node uploads
UID=$(id -u) GID=$(id -g) docker compose up -d

備考: LLMプロバイダ設定の置き場所を決める

UIを開いた状態のままだと、モデルセレクタにOpenAI / Anthropic / Googleが並び、それぞれのプロバイダにも大量のモデルが選べる状態になっています。Bedrockだけ使いたい今回の検証としてはノイズが多いので、まずはこの状態の理由と、設定の置き場所を整理しておきます。

なぜデフォルトで色々表示されるのか

.env.exampleをそのままコピーしてくると、以下のようにuser_providedの値が初期設定で入っています。

.env(抜粋)
ANTHROPIC_API_KEY=user_provided
GOOGLE_KEY=user_provided
OPENAI_API_KEY=user_provided
ASSISTANTS_API_KEY=user_provided

LibreChatは「.envに認証キーが設定されているプロバイダを自動でUIに出す」という挙動になっており、user_providedも「キーが設定された状態」と扱われます。user_providedは「サーバ側にキーは持たず、各ユーザーがUIから自分のキーを入力するモード」を意味する特殊値です。

BYOK

公式ドキュメントにも、空欄にすると無効化、user_providedでBYOK(Bring Your Own Key)モード、と書かれています。

https://www.librechat.ai/docs/configuration/dotenv

.envlibrechat.yamlの役割分担

ドキュメントを読むと、設定ファイルごとに役割が分かれていることがわかります。

  • .env: シークレット・クレデンシャル・インフラ設定・認証・機能フラグ
  • librechat.yaml: エンドポイント構成・モデル一覧・UIカスタマイズ・レート制限

エンドポイントの種類とUI表示条件

LibreChatのエンドポイントは2種類あり、UIに表示される条件が異なります。実機で複数パターンを試して整理しました。

ビルトインエンドポイント(openAI / anthropic / google / bedrock / azureOpenAI / assistantsなど)

LibreChatに最初から組み込まれているプロバイダで、UIに表示される条件は以下の両方を満たしたときです。

  1. .envに対応する認証情報(APIキー、Bedrockの場合はAWSクレデンシャル)が設定されている
  2. .envENDPOINTS変数で除外されていない

librechat.yaml側でendpoints.bedrockなどを書いても、上の条件を満たしていなければUIには出ません。yaml側は有効化済みのエンドポイントの挙動を詳細設定する(モデル一覧、タイトル生成モデル、リージョンなど)役割です。

カスタムエンドポイント(librechat.yamlendpoints.custom配下)

OpenAI互換APIを持つ任意のプロバイダ(Mistral、Groq、OpenRouterなど)を追加する枠で、UIに表示される条件は1つだけです。

  • librechat.yamlendpoints.custom配下に定義されている

.envは無関係です。yamlに書いた時点でUIに表示されます。apiKey: '${MISTRAL_API_KEY}'のように.envの値を参照する書き方をしますが、値の解決は起動時ではなく実呼び出し時に行われるため、.envMISTRAL_API_KEYが無くてもエンドポイント自体はUIに出ます。(もちろん、UIに表示されるだけでメッセージを送るとエラーとなります。)

また、ENDPOINTS変数によるホワイトリストは カスタムエンドポイントには適用されませんENDPOINTS=bedrockとしても、yamlに書いたカスタムエンドポイントはそのままUIに残ります。

ENDPOINTS変数の役割

.envENDPOINTS変数は「どのビルトインエンドポイントをUIに出すか」のホワイトリストとして働きます。

.env
# bedrockだけを許可。OpenAI / Anthropic / Googleが.envにキーを持っていてもUIに出ない
ENDPOINTS=bedrock

未設定の場合は、LibreChatが内部で持つデフォルトリスト(openAI / agents / assistants / azureAssistants / azureOpenAI / google / anthropic / bedrock)が使われます。指定可能なエンドポイント名はこのリストの値を組み合わせる形になります。

繰り返しになりますが、ENDPOINTSはビルトインだけを対象にしたフィルタで、librechat.yamlに定義したカスタムエンドポイントには影響しません。


生成AI活用はクラスメソッドにお任せ

過去に支援してきた生成AIの支援実績100+を元にホワイトペーパーを作成しました。御社が抱えている課題のうち、どれが解決できて、どのようなサービスが受けられるのか?4つのフェーズに分けてまとめています。どうぞお気軽にご覧ください。

生成AI資料イメージ

無料でダウンロードする

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事