mcpField
B
Backlot

Backlot

ローカル
github.com開発ツール262今日更新

Backlot について

Backlotは、企業向けSaaS APIをローカルで再現するエミュレーターです。統合の開発・テスト向けに、決定性のあるコーパスからベンダー形式の応答とアクセス制御を提供し、ベンダーアカウントやネットワークなしで公式SDKを実行できます。

主な機能

  1. 01複数の企業向けAPIをローカルで再現
  2. 02公式ベンダーSDKとHTTPクライアントに対応
  3. 03決定性SQLiteコーパスとJSONLインポート
  4. 04ユーザー、トークン、グループ、文書ACLをモデル化
  5. 05ページネーション、認証、エラーを再現
  6. 06データソースをMCPツールとして公開

活用シーン

  1. 01ベンダーアカウントや認証情報なしで統合をテスト
  2. 02ローカルとCIで再現可能な統合テストを実行
  3. 03RAGパイプラインとエージェントの動作を評価
  4. 04制御された文書データで不具合を再現

MCP 対応

`backlot mcp`は標準入出力経由でMCPサーバーを起動し、すべてのデータソースをツールとして公開します。コーディングエージェントはこれらのツールでBacklotが提供するデータを作成・確認できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"brekkylab-backlot": {
"command": "uvx",
"args": [
"backlot"
]
}
}
}
起動コマンドuvx backlot

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypibacklot0.1.0

ツール

151

掲載時のツール一覧 · 5 日前に更新

パラメーター型必須説明
qstringいいえIssue/PR の検索クエリ
pageanyいいえ取得する結果のページ番号です。詳細については、「[REST API でのページネーションの使用](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api)」をご覧ください。
per_pageanyいいえ1 ページあたりの結果数(最大 100 件)です。詳細については、「[REST API でのページネーションの使用](https://docs.github.com/rest/using-the-rest-api/using-pagination-in-the-rest-api)」をご覧ください。

詳細

Backlot

GitHub stars python PyPI tests License: Apache 2.0

Discord X

エンタープライズ SaaS API をローカルで実行できます。

Backlot は、Slack、Gmail、Google Drive、GitHub、Jira、Notion、S3 などのエンタープライズ API のローカルエミュレーターです。制御可能な決定論的コーパスを使って、連携に必要なレスポンス形式、ページネーション、認証、エラー、ドキュメントごとのアクセス制御を再現します。そのため、ベンダーアカウントも、OAuth の承認も、CI でのシークレット管理も、ネットワーク接続も不要で、公式ベンダー SDK を使って構築やテストができます。

Slack をアプリに接続する2つの方法を並べて表示しています。左側は実際の Slack API:ワークスペースを作成し、アプリを登録し、ボットユーザーを追加して、OAuth スコープを選び、リダイレクト URL を登録し、ワークスペースにインストールします。管理者の承認を待ちますが、その間 API 呼び出しはまだゼロです。右側は Backlot:pip install、backlot serve を実行し、ベース URL を1か所変更するだけで、同じフィールド、ページネーション、ドキュメントごとの ACL を含む conversations.history のレスポンスが返ります。1日かかる作業が数秒で完了します。

60秒で試す

pip install backlot
backlot import --bundled   # a corpus ships with the package; nothing to fetch or write
backlot serve              # every supported API, at http://127.0.0.1:8000

ベース URL を1か所変更して、公式 SDK の接続先を切り替えます。

from slack_sdk import WebClient  # pip install slack_sdk

slack = WebClient(token="admin-service-token", base_url="http://127.0.0.1:8000/slack/api/")
print(slack.conversations_list()["channels"])

同じ呼び出しで、本番環境では Slack を、開発環境では Backlot を対象にできます。Backlot がデータと認証情報を提供し、コードではベンダーのリクエストとレスポンスの契約をそのまま維持できます。

テストごとに専用サーバーを空いているポートで起動することもできます。起動や後片付けは不要です。

import backlot
from slack_sdk import WebClient

with backlot.serve() as s:  # no arguments: a tiny hello-world corpus
    slack = WebClient(token=s.token, base_url=f"{s.base_url}/slack/api/")
    channels = slack.conversations_list()["channels"]
コーディングエージェントですぐに Backlot を実行

このリポジトリ自体がプラグインマーケットプレイスなので、エージェントスキルはリポジトリのクローンや事前の pip install なしでインストールできます。または、すべてのソースを MCP ツールとしてエージェントに渡せます。backlot mcp はサーバーが稼働していない場合に起動し、すべてのソースを stdio 経由で提供します。--user <email> を指定すると、そのユーザーとして応答します。

claude plugin marketplace add brekkylab/backlot && claude plugin install backlot@brekkylab
codex plugin marketplace add brekkylab/backlot && codex plugin add backlot@brekkylab
pip install "backlot[mcp]" && claude mcp add backlot -- backlot mcp   # every source as MCP tools

次のようにプロンプトを入力します。

Slack ワークスペースに #incidents チャンネルを作ってメッセージを3件追加し、サーバーを起動してから、そのチャンネルに対する conversations.history の実際の戻り値を表示してください。

なぜモックを使わないのですか?

手書きのモックは、コードがすでに期待しているレスポンスを返します。Backlot は連携の相手側を実装するため、モックがそのまま再現してしまう前提を明らかにします。テストしたいのが単一のレスポンスの内容だけではなく、API の振る舞いである場合に役立ちます。

❌ 手書きのモック✅ Backlot
テスト固有のレスポンス辞書HTTP 経由で提供するベンダー形式のレスポンス
通常は正常系のみをカバーページネーション、検証、認証、ベンダー形式のエラー
独自のテストヘルパー公式ベンダー SDK と一般的な HTTP クライアント
ID モデルがほとんどない、または存在しない生成されたユーザー、トークン、グループ、ドキュメント ACL
テスト間でフィクスチャに差異が生じるローカルと CI で共有する単一の決定論的コーパス
API ごとに異なる方法でモック化すべての API を1つのプロセスから提供

提供する内容

すべてのソースを1つのローカルポートで提供します。それぞれのSDKが想定するパスプレフィックスを付け、すべてが1つのSQLiteコーパスを読み込みます。

コーパスが事実を定義します。メッセージ、ファイル、課題、作成者、タイムスタンプ、スレッド、コメント、ラベル、閲覧者です。Backlotはそこから安定したID、ユーザー、グループ、トークンを導出するため、実行するたびに同じレコード、同じACLでフィルタリングされたビュー、同じページが提供されます。

各APIについて、サポートするのはドキュメント化されたサブセットのエミュレーションであり、すべてのベンダーエンドポイントではありません。エンドポイントごとの対応表に対応状況が記載されています。実装済みのエンドポイントが実際のAPIと異なる動作をする場合は、バグです。

左側には、ベースURLだけを変更してSlackとGitHubのSDKを呼び出すコードがあります。中央には、127.0.0.1:8000で動作する1つのローカルサーバーがあり、応答するサービスと、それぞれが提供されるパスプレフィックスを示しています。右側には、それらすべての背後にある単一のSQLiteコーパスがあります。

サービスベースパス公式SDKを使った例
Slack/slack/apislack.py
Microsoft Teams/msgraph/v1.0msteams.py
Gmail/gmail/v1gmail.py
Google Drive(Docs、Sheets、Slides)/drive/v3 /docs/v1 /sheets/v4 /slides/v1gdrive.py
GitHub/githubgithub.py
Jira/atlassian/rest/apijira.py
Confluence/atlassian/wiki/rest/apiconfluence.py
Notion/notion/v1notion.py
Linear/linear/graphqllinear/
HubSpot/hubspothubspot.py
Fireflies/fireflies/graphqlfireflies.py
Amazon S3/s3s3.py

ロードマップは追跡用イシューにあります。必要なソースがあれば、そちらでお知らせください。

こんなときに必要です

  • 🔌 インテグレーションの構築やアップグレード。実際のAPIが返すカーソル、ページ形式、エラー本文を、アカウントなしで取得できます。
  • 🧪 テストと、そのテストの継続的な維持。秘密情報が不要で、不安定な動作もないため、ノートPCとCIで同じフィクスチャを使えます。コーパス内のすべてのユーザーにトークンが発行されるので、ある呼び出し元のドキュメントが別の呼び出し元に届かないことも検証できます。
  • 🤖 RAGパイプラインやエージェントの評価。毎回、同じコーパス、同じID、同じ回答を使えるため、スコアの変化はコードの変化を意味します。Slackは書き込みにも対応しているので、投稿、編集、リアクションを行うエージェントをここで実行し、実際の動作を評価できます。1つのエンドポイントで動作を報告し、別のエンドポイントで次回の実行に向けてコーパスを元に戻します(docs/write-overlay.md)。
  • 🐛 見られないデータで発生するバグの再現。他のユーザーのワークスペースにあるドキュメントがパーサーの不具合を引き起こす場合、その形式に合わせたドキュメントを作成して提供し、失敗するテストとして保持できます。

独自のコーパスを用意する

同梱のコーパスはサポート対象のすべてのサービスを網羅していますが、主な使い方は、独自のテスト環境を提供することです。JSONLファイルに、ソースドキュメントを1行ずつ記述します。

{"source_type":"slack","channel":"incidents","author_email":"[email protected]","created":"2026-02-10T18:00:00Z","content":"Anyone seeing 502s from the gateway?","replies":[{"content":"Looking now.","author_email":"[email protected]","created":"2026-02-10T18:00:40Z"}]}
backlot import my-corpus.jsonl --dry-run   # validate against each service's schema, touch nothing
backlot import my-corpus.jsonl && backlot serve

インポートされたすべてのIDには決定論的な認証情報が割り当てられ、GET /_meta/usersに一覧表示されます。別のユーザーのトークンで同じリクエストを送信し、その呼び出し元に表示が許可されている内容をテストできます。コーパスの準備ではスキーマ、ユーザー一覧、シャーディングされたコーパス、公開データセットを説明し、認証とトークンでは各サービスの認証方式を説明しています。

例

対象実行可能な例
📦 サービスごとに1つのスクリプトで利用する、公式ベンダー SDKexamples/using-official-sdk/
🔗 エージェント向けの MCP ツール:backlot mcp、または Backlot を参照するベンダー独自の MCP サーバーexamples/using-mcp-with-agents/
🦙 公式の LlamaIndex リーダーを使って、ドキュメントとして読み込むexamples/using-llamaindex-readers/
🐍 fsspec ファイルシステムを通じて、pandas、pyarrow、または dask で読み込むexamples/using-fsspec/
🗂️ mirage の仮想ファイルシステムを通じて、ls、cat、grep で読み込むexamples/using-mirage/
📥 JSONL ファイルから独自のコーパスを読み込むexamples/bring-your-own-corpus/

ドキュメント

Backlot が提供するすべてのソースと、それぞれのすべてのエンドポイントdocs/supported-sources.md
コーパスの構築とパブリックデータセットdocs/corpus.md
認証方式とトークンdocs/auth.md
実際の API に対する Backlot の忠実度の測定docs/fidelity.md
書き込みと、その書き込み先docs/write-overlay.md
すべての BACKLOT_* 設定と Dockerdocs/configuration.md
利用状況のテレメトリー:収集する理由、送信される内容、無効にする方法docs/telemetry.md
通知と商標NOTICE.md

コントリビューション

CONTRIBUTING.md をご覧ください。実際の API への忠実度が重要です。そのため、実際のサービスと異なる点はバグです。実際のサービスと照らし合わせて測定し、修正がなければ失敗するテストを追加してください。

Backlot は、コントリビューションしてくださる皆さんのおかげで成り立っています。

Backlotのコントリビューターのアバター

ライセンス

Apache-2.0。以前のリリースに適用されていた MIT License については、NOTICE.md をご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。