
OSSのAIプラットフォームLibreChatをDockerで立ち上げてモデル・MCP追加まで試してみた
はじめに
こんにちは、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など海外の大手企業・大学での採用実績が紹介されています。
主な機能
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にアクセスします。初回はログイン画面が出ます。

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

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

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

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

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

ここのUIの表示の制御は、「備考: LLMプロバイダ設定の置き場所を決める」に記載しています。
librechat.yamlをマウントする
LibreChatのリポジトリ直下にlibrechat.yamlを作成し、Dockerコンテナにマウントします。マウントはdocker-compose.override.ymlを用意するのが公式の推奨パターンです。先ほどApple Silicon対策で作ったdocker-compose.override.ymlに、apiサービス側のvolume設定を追記します。
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に表示したいので、ENDPOINTSにbedrockだけ設定します。
#=================#
# 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にまとめて書きました。
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種類のモデルが表示されていますね!めちゃくちゃ簡単です。

もし、UIでの表示名を変更したいなら、yamlファイルにmodelSpecsを追加してください。詳細は公式ドキュメントのModel Specsにまとまっています。
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で再起動すると、モデルセレクタの表示名が変わっていることが確認できます。

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

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

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

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

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


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

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

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に寄せられる点は、エージェント基盤を社内で運用していくうえで素直に扱いやすい構成だと感じました。
一方で、実際に触ってみると.envとlibrechat.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はこちらです。
- #7414 meilisearch fails with permission error
- #1439 [Bug]: docker compose up leads to npm cache permission error
- #2561 [Bug]: Can't start LibreChat on macOS/colima
最終的には、次のようにディレクトリを事前作成し、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の値が初期設定で入っています。
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から自分のキーを入力するモード」を意味する特殊値です。

公式ドキュメントにも、空欄にすると無効化、user_providedでBYOK(Bring Your Own Key)モード、と書かれています。
.envとlibrechat.yamlの役割分担
ドキュメントを読むと、設定ファイルごとに役割が分かれていることがわかります。
.env: シークレット・クレデンシャル・インフラ設定・認証・機能フラグlibrechat.yaml: エンドポイント構成・モデル一覧・UIカスタマイズ・レート制限
エンドポイントの種類とUI表示条件
LibreChatのエンドポイントは2種類あり、UIに表示される条件が異なります。実機で複数パターンを試して整理しました。
ビルトインエンドポイント(openAI / anthropic / google / bedrock / azureOpenAI / assistantsなど)
LibreChatに最初から組み込まれているプロバイダで、UIに表示される条件は以下の両方を満たしたときです。
.envに対応する認証情報(APIキー、Bedrockの場合はAWSクレデンシャル)が設定されている.envのENDPOINTS変数で除外されていない
librechat.yaml側でendpoints.bedrockなどを書いても、上の条件を満たしていなければUIには出ません。yaml側は有効化済みのエンドポイントの挙動を詳細設定する(モデル一覧、タイトル生成モデル、リージョンなど)役割です。
カスタムエンドポイント(librechat.yamlのendpoints.custom配下)
OpenAI互換APIを持つ任意のプロバイダ(Mistral、Groq、OpenRouterなど)を追加する枠で、UIに表示される条件は1つだけです。
librechat.yamlのendpoints.custom配下に定義されている
.envは無関係です。yamlに書いた時点でUIに表示されます。apiKey: '${MISTRAL_API_KEY}'のように.envの値を参照する書き方をしますが、値の解決は起動時ではなく実呼び出し時に行われるため、.envにMISTRAL_API_KEYが無くてもエンドポイント自体はUIに出ます。(もちろん、UIに表示されるだけでメッセージを送るとエラーとなります。)
また、ENDPOINTS変数によるホワイトリストは カスタムエンドポイントには適用されません。ENDPOINTS=bedrockとしても、yamlに書いたカスタムエンドポイントはそのままUIに残ります。
ENDPOINTS変数の役割
.envのENDPOINTS変数は「どのビルトインエンドポイントをUIに出すか」のホワイトリストとして働きます。
# bedrockだけを許可。OpenAI / Anthropic / Googleが.envにキーを持っていてもUIに出ない
ENDPOINTS=bedrock
未設定の場合は、LibreChatが内部で持つデフォルトリスト(openAI / agents / assistants / azureAssistants / azureOpenAI / google / anthropic / bedrock)が使われます。指定可能なエンドポイント名はこのリストの値を組み合わせる形になります。
繰り返しになりますが、ENDPOINTSはビルトインだけを対象にしたフィルタで、librechat.yamlに定義したカスタムエンドポイントには影響しません。










