lastsaas について
LastSaaS は、Go バックエンドと React + TypeScript フロントエンドで構成された SaaS の基盤です。マルチテナント、認証、Stripe 課金、ホワイトラベルブランディング、管理画面を備え、既製の基盤をフォークして自社製品向けに拡張したい開発者に向けられています。MIT ライセンスで提供され、読み取り専用の管理用 MCP サーバーを含みます。
主な機能
- 01ロールベースのアクセス制御によるマルチテナント管理
- 02MFA/TOTP と OAuth プロバイダーによる認証
- 03Stripe サブスクリプションとクレジットベースの課金
- 04ホワイトラベルブランディングとカスタムページ
- 05スコープ付き API キーと署名付き送信 Webhook
- 06システムヘルス監視とプロダクト分析ダッシュボード
活用シーン
- 01新しい SaaS 製品のアカウント、チーム、権限の基盤構築
- 02AI エージェントを通じた ARR 推移やシステムヘルスの自然言語照会
- 03顧客向けの署名付き送信 Webhook 連携の提供
MCP 対応
本プロジェクトには 32 個の読み取り専用ツールを備えた MCP サーバーが組み込まれています。Claude などの MCP 対応 AI クライアントから、稼働中のアプリケーションのダッシュボード、ユーザー、テナント、課金、ログ、ヘルスデータを照会できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
LastSaaS
これさえあれば、もうほかのSaaSボイラープレートは必要ありません。
LastSaaSは、Claude Codeとの対話だけで構築された、本番環境に対応する完全なSaaS基盤です。マルチテナントのアカウント管理、認証、ロールベースのアクセス制御、ホワイトラベルのブランディング、Stripeの課金、APIキー、送信Webhook、完全な管理インターフェース、システムのヘルスモニタリング、クレジットベースの利用状況追跡、テレメトリーを用いたプロダクト分析など、SaaSビジネスの立ち上げに必要なすべてを備えており、製品に合わせてすぐにカスタマイズできます。
ソフトウェア開発のボトルネックは、もはやエンジニアリングの対応力ではなく、想像力です。LastSaaSがそれを証明しています。明確なビジョンを持つ一人の人間とAIエージェントがあれば、かつてはチームと何カ月もの作業が必要だったものを構築できます。Claude Codeで開発されているため、コードベースはエージェント型のエンジニアリングに対応したフォーク可能な状態です。AIエージェントに渡して、対話を通じて製品開発を続けられます。
LastSaaSが生まれた理由
SaaS製品にはどれも、ユーザーアカウント、チーム、ロール、認証、管理ダッシュボード、課金、利用制限、ブランディング、Webhook、APIキーといった、ありふれた共通基盤が必要です。これまでは、その基盤を構築するために何週間も費やし、実際の製品のコードを一行も書けないことがありました。
LastSaaSなら、その手間をなくせます。フォークして、AIエージェントに渡し、次の機能をすでに備えた基盤の上で製品開発を始めましょう。
- ロールベースのアクセス制御を備えたマルチテナント分離
- リフレッシュトークンのローテーションに対応したJWT認証
- Google、GitHub、MicrosoftのOAuth連携
- マジックリンクによるパスワードレス認証
- MFA/TOTPとリカバリーコード
- メール認証とパスワードのリセット
- チームへの招待とメンバー管理
- サブスクリプション、シート単位の料金、トライアル、クレジットバンドルに対応したStripe課金
- プランの利用権と課金を適用するミドルウェア
- カスタムテーマ、ロゴ、ランディングページ、カスタムページに対応したホワイトラベルのブランディング
- APIキー認証(管理者およびユーザーのスコープ)
- 19種類のイベントとHMAC-SHA256署名に対応した送信Webhook
- クレジットベースの利用状況追跡(サブスクリプション+購入したバケット)
- Stripe経由のプロモーションコードとクーポン管理
- プロダクト分析ダッシュボード(コンバージョンファネル、KPI、継続率コホート、エンゲージメント指標)
- カスタムイベント追跡用のGo SDKとREST APIを備えたテレメトリーイベントシステム
- すべてを管理する完全な管理インターフェース
- 組み込みのAPIドキュメント(HTMLとMarkdown)
- リアルタイムのシステムヘルスモニタリング
- 財務指標ダッシュボード(収益、ARR、DAU、MAU)
- AIを活用した管理アクセスを可能にするMCP(Model Context Protocol)サーバー
- サーバー管理用CLIツール
- データベースマイグレーションを用いた自動バージョン管理
- Fly.ioでの本番環境へのデプロイ
これは、アイデアを持つ人がそのまま製品をリリースする、ソフトウェアのエージェント時代に向けたオープンソースのインフラストラクチャです。コードベースには一貫したパターンが採用されており、AIエージェントがスムーズに扱えるため、構築時と同じ方法で進化させ続けられます。
比較
SaaSボイラープレートを検討しているなら、ShipFast、Supastarter、MakerKit、SaaS Pegasus、Gravityなどをすでにご覧になったことでしょう。技術系の創業者がLastSaaSを選ぶ理由をご紹介します。
無料でオープンソース。 ShipFastは169ドル、MakerKitは199~599ドル、Supastarterは299ドルから、SaaS Pegasusは年間249ドルで、Gravityは1,000ドル未満です。LastSaaSはMITライセンスです。フォークして製品をリリースすれば、ライセンス料は一切かかりません。コードは完全にあなたのものです。 Go バックエンドであり、単なる Next.js プロジェクトではありません。 ShipFast、Supastarter、MakerKit、Gravity はすべて JavaScript/TypeScript スタックです。SaaS Pegasus は Django を使用しています。LastSaaS は Go バックエンドと React + TypeScript フロントエンドを組み合わせており、コンパイル済みバイナリでのデプロイ、低いメモリ使用量(14MB の Alpine コンテナ)、そして Go で知られる並行処理モデルを実現します。SaaS で実際のトラフィックを処理する場合や、Node.js のモノリスではないバックエンドを求めている場合、これは重要です。
本格的なマルチテナント対応。 ShipFast はマルチテナントにまったく対応していません。SaaS Pegasus と Gravity は基本的なチーム機能を備えていますが、真のテナント分離には対応していません。LastSaaS は完全なマルチテナントアーキテクチャを提供します。テナント単位のデータ分離、3 階層の RBAC(owner/admin/user)、チームへの招待、所有権の移譲、テナントごとのアクティビティログ、テナントごとの請求に対応しています。「ユーザーが共同作業できる」ことと、「各顧客がそれぞれ分離されたワークスペースを持つ」ことの違いです。
ホワイトラベルのブランディングを標準搭載。 ほとんどのボイラープレートは、せいぜいテーマ切り替え機能を提供する程度です。LastSaaS には、カスタムアプリ名、ロゴ、色、フォント、ランディングページ、カスタムページ、CSS の挿入、ファビコン、利用権限に応じた表示制御が可能なナビゲーション、認証ページのカスタマイズを備えた、完全なホワイトラベルシステムが含まれています。顧客に自社のブランド(自社ブランドとフレームワークのブランドの併記ではなく)を見せるプラットフォームを構築するなら、何週間もの作業を省けます。
Stripe のウェブフックだけでなく、送信ウェブフックにも対応。 ShipFast、Supastarter、MakerKit、SaaS Pegasus、Gravity を含め、他のどの選択肢にも送信ウェブフックシステムはありません。LastSaaS には、課金、チームのライフサイクル、ユーザーのライフサイクル、クレジット、セキュリティイベントにわたる 19 種類のイベント、HMAC-SHA256 署名、配信状況の追跡、テストイベントが標準搭載されています。顧客は初日から自社のプラットフォームとの連携を構築できます。
スコープを指定したアクセスが可能な API キー。 ShipFast、Supastarter、MakerKit には API キー管理が含まれていません。LastSaaS は、lsk_ プレフィックス付き API キー、admin および user の権限スコープ、SHA-256 ハッシュ化ストレージ、最終使用日時の追跡を提供し、顧客が連携を構築できる状態で利用できます。
ヘルスモニタリングと財務ダッシュボード。 競合するボイラープレートには、システムのヘルスモニタリングが含まれていません。LastSaaS は、全ノードにわたって CPU、メモリ、ディスク、HTTP、MongoDB のメトリクスを 60 秒ごとに収集し、8 つのリアルタイムチャート、しきい値アラート、30 日間のデータ保持を提供します。財務ダッシュボードでは、売上、ARR、DAU、MAU の時系列データをすぐに利用できます。
テレメトリーを備えたプロダクト分析。 競合するボイラープレートには、プロダクト分析が含まれていません。LastSaaS は、顧客のジャーニー(訪問者 → 登録 → プランページ → チェックアウト → 有料コンバージョン → アップグレード)を自動計測し、コンバージョンファネルとして可視化します。PM ダッシュボードには、SaaS KPI(MRR、ARR、ARPU、LTV、解約率、トライアルからのコンバージョン)、リテンションコホート分析、エンゲージメント指標(有料サブスクライバーの DAU/WAU/MAU)、カスタムイベントエクスプローラーが含まれています。Go SDK と REST API を使えば、設定不要で独自のイベントを追跡できます。
AI ネイティブな運用のための MCP サーバー。 これは LastSaaS 独自の機能です。読み取り専用ツールを 32 個備えた組み込みの Model Context Protocol サーバーにより、Claude(または MCP 互換の AI)を実行中のアプリケーションに直接接続できます。ARR の推移の確認、エラー急増の調査、API キーの監査、システムのヘルスレビューなどを、すべて自然言語で行えます。エージェントによる管理アクセスを提供する SaaS ボイラープレートは他にありません。
AI 支援開発向けに構築。 LastSaaS は、Claude Code との対話だけで完全に構築されており、そのコードベースも同じ方法で開発を続けられるよう設計されています。一貫したパターン、明確な命名、AI エージェントが自在に把握できる構成を備えています。フォークして、エージェントを適用し、製品の内容を伝えて、そのまま開発を続けられます。競合するボイラープレートは手作業での開発向けに構築されていますが、LastSaaS は、現在のソフトウェア開発のあり方に合わせて構築されています。
| LastSaaS | ShipFast | Supastarter | MakerKit | Pegasus | Gravity | |
|---|---|---|---|---|---|---|
| 価格 | 無料(MIT) | $169 | $299+ | $199–599 | $249/年 | <$1K |
| スタック | Go + React | Next.js | Next.js / Nuxt | Next.js | Django | Node + React |
| マルチテナンシー | 完全な RBAC | — | ✓ | ✓ | チームのみ | チームのみ |
| ホワイトラベル | 完全対応 | — | 一部対応 | 一部対応 | — | — |
| Webhook | 19 イベント | — | — | — | — | — |
| API キー | スコープ設定可能 | — | — | — | 基本 | — |
| ヘルスモニタリング | 8 つのグラフ | — | — | — | — | — |
| プロダクト分析 | 5 タブの PM ダッシュボード | — | — | — | — | — |
| クレジットシステム | デュアルバケット | — | — | 基本 | — | — |
| MCP サーバー | 26 ツール | — | — | — | — | — |
| 管理ダッシュボード | 完全対応 | — | ✓ | ✓ | ✓ | 基本 |
| Stripe Billing | 完全対応 | ✓ | ✓ | ✓ | ✓ | ✓ |
機能
認証と ID 管理
- bcrypt ハッシュ化によるメールアドレス/パスワード登録
- Resend によるメール認証
- Google、GitHub、Microsoft OAuth と自動アカウント連携
- メールによるマジックリンクのパスワードレスログイン
- セットアップウィザード付き MFA/TOTP 二要素認証
- MFA のバックアップアクセス用リカバリーコード
- JWT アクセストークン(30 分)+リフレッシュトークン(7 日間)とローテーション
- ログイン失敗回数に応じたアカウントロック
- セキュアなトークンを使用したパスワードリセットフロー
- パスワード強度の適用
- セッション管理 — アクティブなセッションの一覧表示、個別またはすべてのセッションの取り消し
- パスワード変更時のセッション取り消し
マルチテナンシー
- ルートテナント(システム管理者)+顧客テナント
- ユーザーはメンバーシップを介してテナントに所属します
- ロール:階層型の権限を持つ owner、admin、user
- メール通知付きのチーム招待
- メンバー間の所有権移転
- テナントごとのアクティビティログ
- テナント設定のセルフサービス
課金とクレジット(Stripe)
- サブスクリプションプラン:月次および年次課金(年次割引率を設定可能)
- 料金モデル:定額またはユーザー数単位(含まれるユーザー数、最小/最大ユーザー数の上限付き)
- 無料トライアル:プランごとにトライアル期間を設定でき、トライアルの不正利用を防止
- クレジットバンドル:一回限りの購入に対応
- デュアルクレジットバケット:サブスクリプションクレジット(リセットまたは累積)+購入済みクレジット
- Stripe Checkout(リダイレクト方式)による決済の受け付け
- Stripe Billing Portal による顧客のセルフサービス(支払い方法、請求書)
- 複数通貨対応:デフォルト通貨を設定可能
- Stripe Tax による自動税額計算
- プロモーションコードとクーポン:管理 UI から作成・管理し、Stripe と連携
- 請求書の生成:連番の請求書番号、PDF ダウンロード、税額の内訳
- 取引履歴:テナントごとおよび管理者全体を対象とした検索とフィルタリング
- 財務指標:収益、ARR、DAU、MAU の時系列グラフ
- 課金適用ミドルウェア:期限切れのサブスクリプションによる有料機能へのアクセスをブロック
- 利用権限ミドルウェア:プランに基づいて機能を制限(ブール値および数値の利用権限)
- 課金免除:特別なアカウント(ルートテナント、デモアカウント)向け
- 管理者によるサブスクリプション管理:キャンセル、変更、プランの再割り当て
- 返金と異議申し立てへの対応:
charge.refunded、charge.dispute.created、charge.dispute.closedの Webhook ハンドラー
ホワイトラベルのブランディング
- アプリ名、タグライン、ロゴのカスタマイズ(テキスト、画像、または両方のモード)
- テーマカラー(プライマリ、アクセント、背景、サーフェス、テキスト)と自動生成される色合いパレット
- カスタムフォント(本文および見出し)
- HTML を設定可能なカスタムランディングページ
- SEO メタデータ付きの
/p/{slug}で配信されるカスタムページ - カスタム CSS の挿入
- カスタム head HTML の挿入(分析、メタタグ)
- ファビコンのアップロード
- 画像/アセット管理用メディアライブラリ
- 利用権限に応じて項目を表示する設定可能なナビゲーションサイドバー
- 認証ページのカスタマイズ(ログイン/サインアップの見出しと補足テキスト)
- ダッシュボード HTML のカスタマイズ
- Open Graph 画像のサポート
API キー
lsk_接頭辞付きの API キーを作成- 2 つの権限レベル:admin(ルートテナントを自動的に解決)と user(X-Tenant-ID が必要)
- 保存時に SHA-256 でハッシュ化 — 生のキーは作成時のみ表示
- 最終使用日時を記録
- キー管理用の管理者 UI
- すべてのエンドポイントで JWT と API キーの両方による認証をサポート
送信 Webhook
- 5 つのカテゴリにわたる 19 種類のイベント:
- 請求:subscription.activated、subscription.canceled、payment.received、payment.failed
- チームのライフサイクル:member.invited、member.joined、member.removed、member.role_changed、ownership.transferred
- ユーザーのライフサイクル:user.registered、user.verified、user.deactivated
- クレジットと請求:credits.purchased、plan.changed、tenant.created、tenant.deactivated
- 監査とセキュリティ:user.deleted、tenant.deleted、api_key.created、api_key.revoked
whsec_接頭辞付きシークレットによる HMAC-SHA256 ペイロード署名- レスポンスコード、レスポンス本文、所要時間を含む配信追跡
- テストイベントの配信
- シークレットの再生成
- Webhook ごとのイベントタイプのフィルタリング
管理者インターフェース
- ユーザー数/テナント数、ヘルス概要、ビジネスメトリクスを表示する ダッシュボード
- ユーザー管理 — 一覧表示、検索、プロフィール表示、編集、利用停止、代理ログイン、所有権の事前確認を伴う削除
- テナント管理 — 一覧表示、表示、編集、プランの割り当て、ステータス管理、サブスクリプション管理
- 財務概要 — 全テナントの取引履歴、収益/ARR/DAU/MAU グラフ
- プロダクト分析 — コンバージョンファネル、SaaS KPI、リテンションコホート、エンゲージメント指標、カスタムイベントエクスプローラー
- プラン管理 — 作成、編集、アーカイブ、権限設定、シート単位の設定、トライアル期間
- クレジットバンドル管理 — 作成、編集、並べ替え、有効化/無効化
- プロモーション — Stripe のプロモーションコードとクーポンを作成・管理
- ブランディングエディター — テーマカラー、ロゴ、フォント、ランディングページ、カスタムページ、CSS、ナビゲーション
- API キー管理 — 作成、表示、失効
- Webhook 管理 — 作成、編集、削除、テスト、配信履歴の表示
- お知らせ — システム全体のお知らせを公開
- 重要度フィルタリング、検索、ユーザーフィルタリングに対応した システムログビューア
- 設定変数エディター(文字列、数値、列挙型、テンプレート)
- アプリ内メッセージ — 個々のユーザーにメッセージを送信
- ルートメンバー — 招待やロール変更を通じて管理者チームを管理
- ユーザーとテナントの CSV エクスポート
- 管理者による代理ログイン — デバッグのために任意のユーザーとしてログイン
- システムヘルスモニタリング(下記参照)
- インテグレーションのヘルスチェック — MongoDB、Stripe、Resend、Google OAuth のステータス
- 3 段階の管理者アクセス:user(読み取り専用)、admin(読み書き)、owner(破壊的操作)
システムヘルスモニタリング
- ハートビート(30 秒間隔)によるノードの自動登録
- 60 秒ごとにメトリクスを収集:CPU、メモリ、ディスク、ネットワーク、HTTP リクエスト統計、MongoDB 統計、Go ランタイム
- パーセンタイルレイテンシ(p50/p95/p99)を追跡する HTTP メトリクスミドルウェア
- しきい値ベースのアラート(警告/重大レベルを設定可能)
- MongoDB TTL インデックスによる 30 日間のデータ自動保持
- 8 つの時系列グラフを備えたリアルタイムダッシュボード(Recharts)
- 集約、全ノード重ね合わせ、単一ノードのフィルターモード
- 時間範囲の選択:1h、6h、24h、7d、30d
- インテグレーションのヘルスパネル(MongoDB、Stripe、Resend、Google OAuth の接続状況)
プロダクト分析とテレメトリー
- コンバージョンファネル — 訪問者 → サインアップ → プランページの閲覧 → チェックアウト → 有料プランへのコンバージョン → アップグレード。各ステップのコンバージョン率を確認できます
- SaaS KPI — MRR、ARR、ARPU、LTV、解約率、トライアルから有料プランへのコンバージョン率、初回購入までの所要時間の中央値、アクティブなサブスクライバー数
- 継続率コホート — 週単位または月単位のコホート継続率テーブルと、色分けされたヒートマップ(
lastLoginAtを時系列で追跡) - エンゲージメント指標 — 有料サブスクライバーの DAU/WAU/MAU、ユーザーあたりの平均セッション数、利用頻度の高い機能、クレジット消費の推移
- カスタムイベントエクスプローラー — すべてのイベントタイプを表示し、推移グラフを確認できます。名前と期間で絞り込めます
- Telemetry Go SDK —
telemetry.Track()/TrackBatch()/TrackPageView()/TrackCheckoutStarted()/TrackLogin()による、プロセス内での直接的なイベント記録(HTTP のオーバーヘッドなし) - Telemetry REST API — ページビュー用の
POST /telemetry/track(匿名、レート制限あり)、カスタムイベント用のPOST /telemetry/eventsと/telemetry/events/batch(認証必須) - 自動計測 — 登録、メール認証、ログイン、チェックアウト、サブスクリプションの有効化・キャンセル、プラン変更を自動的に追跡します
- 365 日間の保持 — MongoDB TTL インデックスにより、テレメトリーイベントは自動的に期限切れになります
- レート制限 — 匿名トラッキングは IP ごとに 60 リクエスト/分、認証済みイベントはユーザーごとに 120 リクエスト/分
ユーザー向けセルフサービス
- プロフィールの編集(表示名、メールアドレス)
- テーマ設定(ライト/ダーク)
- パスワード管理
- MFA の設定と管理
- リモートからのセッション失効に対応したセッションビューアー
- データのクリーンアップを伴うアカウント削除
- データエクスポート(GDPR に準拠)
- 請求管理(プランの選択、クレジットの購入、請求書の履歴、PDF のダウンロード)
- オンボーディングフロー
組み込み API ドキュメント
/api/docsに、詳細を展開できるインタラクティブな HTML API リファレンスを用意- 外部ドキュメントに組み込める Markdown API リファレンスを
/api/docs/markdownに用意 - ペイロードの説明を含む、包括的な Webhook イベントリファレンス
- VERSION ファイルからバージョンを自動設定
CLI による管理
lastsaas setup— システムを初期化します(ルートテナントとオーナーを作成)lastsaas start/stop/restart— サーバープロセスを管理しますlastsaas change-password— 任意のユーザーのパスワードをリセットしますlastsaas send-message— ユーザーにシステムメッセージを送信しますlastsaas transfer-root-owner— ルートテナントのオーナー権限を移譲しますlastsaas config list|get|set— 設定変数を管理しますlastsaas version— バイナリとデータベースのバージョンを表示しますlastsaas status— システムの健全性を確認しますlastsaas mcp— MCP サーバーを起動します(下記の MCP サーバー を参照)
MCP サーバー(AI 管理者アクセス)
組み込みのModel Context Protocolサーバーにより、Claude などの AI アシスタントが、ダッシュボード、ユーザー、テナント、財務情報、ログ、ヘルス情報などの管理データに読み取り専用でアクセスできます。「ARR の推移はどうなっていますか?」や「過去 1 時間の重大なログを表示して」といった質問を自然言語で行う際に便利です。
- 14 カテゴリにまたがる 32 個の読み取り専用ツール — 書き込み操作はなく、設計上安全です
- 2 個のリソース — 自動的にコンテキストを提供する
lastsaas://dashboardとlastsaas://health - API キー認証 — ルートテナントの API キーが必要です。管理 API と同じ認証方式です
- Stdio トランスポート — ローカルで動作し、Claude Desktop と Claude Code に対応しています
ツールのカテゴリ:
- 概要 — ソフトウェアのバージョンと環境
- ダッシュボード — ユーザー数/テナント数、ヘルスの概要
- テナント — フィルタリング付きの一覧、メンバーを含む詳細表示
- ユーザー — 検索付きの一覧、認証方式と所属情報を含む詳細表示
- 財務 — 取引履歴、収益/ARR/DAU/MAU の時系列指標
- ログ — 重大度/カテゴリ/日付フィルター付きの全文検索、重大度別の件数
- ヘルス — 現在のシステム指標、時系列のヘルスデータ、ノード一覧、インテグレーションの状態
- 設定 — 実行時設定変数の一覧と詳細確認
- プラン — プランの詳細、権限キー、クレジットバンドル
- お知らせ — 公開済みおよび下書きのお知らせの一覧
- プロモーション — クーポンの詳細を含む Stripe プロモーションコード
- セキュリティ — API キー一覧(プレビューのみ)、ルートテナントのメンバー
- Webhook — Webhook 設定、イベントタイプのリファレンス、配信履歴
セキュリティ
- セキュリティヘッダー(CSP、HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy)
- 認証エンドポイントでのレート制限
- リクエスト本文のサイズ制限
- NoSQL インジェクション対策(正規表現入力のエスケープ)
- DOMPurify による、挿入された HTML の XSS 対策
- 信頼できるプロキシ IP の解決(Fly-Client-IP)
- Webhook 署名の検証(Stripe の受信、HMAC-SHA256 の送信)
- 一意のイベント ID インデックスによる冪等な Webhook 処理
- システムログのインジェクション検出と重大なアラートの自動通知
- ファミリーベースの失効機能を備えたリフレッシュトークンのローテーション
本番環境対応
- Docker によるマルチステージビルド(Go + Node + Alpine)
- マシンの自動停止/自動起動に対応した Fly.io デプロイ
- Go バイナリからの SPA 配信(別途 Web サーバーは不要)
- CORS、セキュリティヘッダー、レート制限
- 接続を適切にドレインするグレースフルシャットダウン
- 起動時のデータベースマイグレーションによる自動バージョン管理
- アップグレード後、管理者ユーザーにバージョン通知メッセージを送信
技術スタック
| レイヤー | 技術 |
|---|---|
| バックエンド | Go 1.25、gorilla/mux |
| フロントエンド | React 19、TypeScript、Vite 7、Tailwind CSS 4 |
| データベース | MongoDB(Atlas またはローカル) |
| 認証 | JWT(アクセス+リフレッシュ)、bcrypt、Google/GitHub/Microsoft OAuth、マジックリンク、TOTP MFA |
| 請求 | Stripe(stripe-go v82)— Checkout、Billing Portal、Webhook、Tax |
| メール | Resend |
| グラフ | Recharts |
| 指標 | gopsutil v4 |
| gofpdf(請求書の生成) | |
| セキュリティ | DOMPurify(フロントエンド)、HMAC-SHA256(Webhook) |
| デプロイ | Docker、Fly.io |
前提条件
- Go 1.25 以降 — インストール
- Node.js 22 以降 — インストール
- MongoDB — 以下のいずれか:
- MongoDB Atlas(無料の M0 ティアで問題なく動作します)
- ローカルの MongoDB Community Edition
- Git
任意
- Resend API キー — メール認証、パスワードリセット、招待用
- Google OAuth 認証情報 — Google サインイン用
- GitHub OAuth 認証情報 — GitHub サインイン用
- Microsoft OAuth 認証情報 — Microsoft サインイン用
- Stripe アカウント — 請求(サブスクリプション、クレジット購入、請求書)用
- Fly.io アカウント — 本番環境へのデプロイ用
クイックスタート
1. リポジトリをクローンする
git clone https://github.com/metavert-io/lastsaas.git
cd lastsaas
2. セットアップスクリプトを実行する
./scripts/setup.sh
以下の入力を求められます。
- データベース名 — プロジェクトの識別名です(同じ名前を使うプロジェクトは、同じユーザーベースを共有します)
- MongoDB URI — Atlas の接続文字列、または
mongodb://localhost:27017 - JWT シークレット — 自動生成されます
- Google OAuth 認証情報 — 任意です。スキップするには Enter キーを押します
- Resend API キー — 任意です。スキップするには Enter キーを押します
- アプリ名とメール設定
.env ファイルを書き込み、設定テンプレートをコピーします。
3. バックエンドを起動する
set -a && source .env && set +a
cd backend
go run ./cmd/server
サーバーは http://localhost:4290 で起動します。
4. フロントエンドを起動する
別のターミナルで次を実行します。
set -a && source .env && set +a
cd frontend
npm install
npm run dev
フロントエンドは http://localhost:4280 で起動します。
5. システムを初期化する
CLI セットアップを実行して、ルートテナントと管理者アカウントを作成します。
cd backend
go run ./cmd/lastsaas setup
ルートテナント(管理者組織)とオーナーアカウントが作成されます。これで http://localhost:4280 からログインできます。
Stripe 請求を設定する
Stripe との連携は任意ですが、有料サブスクリプション、クレジットバンドルの購入、請求書の生成には必要です。このセクションをスキップした場合、LastSaaS は無料プランのみのプラットフォームとして動作します。
1. Stripe アカウントを作成する
stripe.com で登録し、初期設定を完了します。開発中は テストモード を使用できます。
2. API キーを取得する
Stripe Dashboard → Developers → API keys に移動して、次のキーをコピーします。
- 公開可能キー(
pk_test_またはpk_live_で始まります) - シークレットキー(
sk_test_またはsk_live_で始まります)
3. Webhook エンドポイントを作成する
Stripe Dashboard → Developers → Webhooks → Add endpoint に移動します。
- エンドポイント URL:
https://your-domain.com/api/billing/webhook- Stripe CLI を使ったローカル開発の場合:
stripe listen --forward-to localhost:4290/api/billing/webhook
- Stripe CLI を使ったローカル開発の場合:
- 購読するイベント — 次の 8 つのイベントを選択します。
checkout.session.completedinvoice.paidinvoice.payment_failedcustomer.subscription.updatedcustomer.subscription.deletedcharge.refundedcharge.dispute.createdcharge.dispute.closed
エンドポイントを作成したら、署名シークレット(whsec_ で始まります)をコピーします。
4. 環境変数を設定する
.env ファイルに次の項目を追加します。
STRIPE_SECRET_KEY=sk_test_...
STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
5. 管理画面でプランを作成する
Stripe を設定してバックエンドを起動したら、次の手順を実行します。
- ルートテナントのオーナーとしてログインします
- Admin → Plans に移動し、サブスクリプションプランを作成します
- 価格、請求間隔、トライアル日数、利用権限、クレジット割り当てを設定します
- 必要に応じて、Admin → Credit Bundles で クレジットバンドル を作成します
- 必要に応じて、Admin → Promotions で プロモーションコード を作成します
顧客がチェックアウトすると、Stripe の商品と価格が自動的に作成されます。API キーと Webhook 以外に、Stripe Dashboard で設定する必要はありません。
6. 本番環境に移行する
本番環境の準備ができたら、次の手順を実行します。
- Stripe Dashboard で ライブモード に切り替えます
- 本番 URL と同じ 8 つのイベントを指定して、新しい Webhook エンドポイントを作成します
- 本番環境変数をライブキーと Webhook シークレットで更新します
設定
設定ファイルは backend/config/ にあります。
dev.example.yaml/prod.example.yaml— リポジトリにコミットされるテンプレートdev.yaml/prod.yaml— 実際に使用する設定ファイル(gitignore 対象)
LASTSAAS_ENV=dev または LASTSAAS_ENV=prod を設定して、読み込む設定ファイルを選択します。デフォルトは dev です。
シークレットは YAML 内で ${ENV_VAR} として参照され、読み込み時に環境変数から展開されます。デフォルト値には ${VAR:default} の構文を使用します。
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
DATABASE_NAME | はい | プロジェクトの識別子 — 同じ名前を共有すると、ユーザーベースも共有されます |
MONGODB_URI | はい | MongoDB の接続文字列 |
JWT_ACCESS_SECRET | はい | アクセストークンの署名に使用するシークレット |
JWT_REFRESH_SECRET | はい | リフレッシュトークンの署名に使用するシークレット |
FRONTEND_URL | はい | CORS とメールリンクに使用するフロントエンド URL |
APP_NAME | はい | アプリケーション名(メールと UI で使用) |
STRIPE_SECRET_KEY | いいえ | Stripe のシークレット API キー |
STRIPE_PUBLISHABLE_KEY | いいえ | Stripe の公開可能キー(フロントエンドに送信) |
STRIPE_WEBHOOK_SECRET | いいえ | Stripe の Webhook 署名シークレット |
GOOGLE_CLIENT_ID | いいえ | Google OAuth クライアント ID |
GOOGLE_CLIENT_SECRET | いいえ | Google OAuth シークレット |
GOOGLE_REDIRECT_URL | いいえ | Google OAuth リダイレクト URL |
RESEND_API_KEY | いいえ | Resend メールサービスの API キー |
FROM_EMAIL | いいえ | 送信者のメールアドレス(デフォルト:[email protected]) |
FROM_NAME | いいえ | 送信者名(デフォルト:LastSaaS) |
プロジェクト構成
lastsaas/
backend/
cmd/
server/main.go Entry point (HTTP server, route wiring)
lastsaas/main.go CLI administration tool + MCP server
config/ YAML config files
internal/
api/handlers/ HTTP handlers (auth, admin, tenant, billing, branding, webhooks, etc.)
apicounter/ API call counters for integration health
auth/ JWT, password hashing, Google/GitHub/Microsoft OAuth, TOTP MFA
config/ Config loader with env variable expansion
configstore/ Runtime configuration (DB-backed, cached)
db/ MongoDB connection, collections, indexes
email/ Resend email service with templates
events/ Internal event emitter (drives webhook deliveries)
health/ System health monitoring service
middleware/ Auth, tenant, RBAC, rate limiting, metrics, security, billing enforcement
models/ All data models
planstore/ Plan seeding
stripe/ Stripe service (Checkout, Billing Portal, Customers, Prices, Subscriptions)
syslog/ System logging service with injection detection
telemetry/ Telemetry event collection, Go SDK, and PM analytics queries
version/ Version management and auto-migration
frontend/
src/
api/client.ts Axios API client with token refresh
components/ Layout, AdminLayout, BrandingThemeInjector, shared components
contexts/ Auth, Tenant, and Branding React contexts
pages/
admin/ Admin interface (dashboard, users, tenants, plans, billing, branding, etc.)
admin/health/ Health monitoring components and charts
app/ Customer-facing pages (dashboard, billing, team, settings, activity)
app/settings/ User settings tabs (profile, security, MFA, sessions, billing)
auth/ Login, signup, MFA challenge, magic link, verification, password reset
public/ Landing page and custom pages
types/index.ts TypeScript type definitions
scripts/
setup.sh Interactive setup script
Dockerfile Multi-stage production build
fly.toml Fly.io deployment config
VERSION Current version number
API ドキュメント
LastSaaS には、組み込みのセルフホスト可能な API ドキュメントが含まれています。
- インタラクティブな HTML リファレンス:
GET /api/docs— リクエストとレスポンスの例を含む、展開可能なエンドポイントカード - Markdown リファレンス:
GET /api/docs/markdown— 外部ドキュメントへの埋め込み用
ドキュメントはコードから生成されるため、実行中のバージョンと常に一致します。すべてのエンドポイント、パラメーター、リクエスト/レスポンス形式、およびペイロードの説明付きの 19 種類すべての Webhook イベントを網羅しています。
MCP サーバーのセットアップ
MCP サーバーを使用すると、AI アシスタントが自然言語で管理データを照会できます。API キーを使用して、LastSaaS 管理 API に読み取り専用リクエストを中継します。
前提条件
- LastSaaS インスタンスが稼働していること(ローカルまたはデプロイ済み)
- ルートテナントの API キーを用意すること — Admin → API Keys で admin 権限を指定して作成します
Claude Desktop での使用
Claude Desktop の設定ファイル(macOS の場合は ~/Library/Application Support/Claude/claude_desktop_config.json)に追加します。
{
"mcpServers": {
"lastsaas": {
"command": "/path/to/lastsaas",
"args": ["mcp"],
"env": {
"LASTSAAS_URL": "https://your-app.fly.dev",
"LASTSAAS_API_KEY": "lsk_your_api_key_here"
}
}
}
}
Claude Code での使用
プロジェクトの .mcp.json に追加します。
{
"mcpServers": {
"lastsaas": {
"command": "/path/to/lastsaas",
"args": ["mcp"],
"env": {
"LASTSAAS_URL": "https://your-app.fly.dev",
"LASTSAAS_API_KEY": "lsk_your_api_key_here"
}
}
}
}
CLI バイナリのビルド
cd backend
go build -o lastsaas ./cmd/lastsaas
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
LASTSAAS_URL | はい | LastSaaS インスタンスのベース URL(例:http://localhost:4290 または https://your-app.fly.dev) |
LASTSAAS_API_KEY | はい | admin 権限を持つルートテナントの API キー(lsk_ で始まります) |
利用可能なツール(26)
| ツール | 説明 |
|---|---|
get_about | ソフトウェアのバージョンと環境 |
dashboard_stats | ユーザー数/テナント数とヘルスの概要 |
list_tenants | 検索とフィルターに対応した、ページ分割されたテナント一覧 |
get_tenant | プラン、請求、メンバーの詳細を含むテナント情報 |
list_users | 検索とフィルターに対応した、ページ分割されたユーザー一覧 |
get_user | 認証方法とメンバーシップを含むユーザーの詳細 |
list_transactions | 検索とフィルターに対応した金融取引一覧 |
get_financial_metrics | 収益、ARR、DAU、MAU の時系列データ |
search_logs | 重要度/カテゴリ/日付フィルターに対応した全文ログ検索 |
get_log_severity_counts | 重要度レベル別のログ件数 |
get_system_health | 現在の CPU、メモリ、ディスク、HTTP 統計 |
get_health_metrics | 時系列のヘルスデータ(ノード別または集計) |
list_nodes | ステータスとバージョンを含むサーバーノード一覧 |
get_integrations | サードパーティ連携のヘルス状態 |
list_config | 実行時設定変数の一覧 |
get_config | 単一の設定変数の詳細 |
list_plans | 価格と利用権限を含むサブスクリプションプラン一覧 |
get_plan | プランの詳細情報 |
list_entitlement_keys | 利用権限キーのカタログ |
list_credit_bundles | クレジットバンドルの価格 |
list_announcements | 公開済みおよび下書きのお知らせ |
list_promotions | Stripe のプロモーションコードとクーポン |
list_api_keys | API キーの一覧(プレビューのみ) |
list_root_members | 管理チームと保留中の招待 |
list_webhooks | 送信 Webhook の設定 |
list_webhook_event_types | 利用可能な Webhook イベントタイプ |
get_webhook | 配信履歴を含む Webhook の詳細 |
MCP の例
これらの例では、MCP ツールの実際の動作を示します。各例には、ユーザーのプロンプトと、バックグラウンドで実行される正確なツール呼び出しを記載しています。
例 1:ビジネスの概要を確認する
プロンプト:「今日の SaaS の調子はどうですか?」
ツール呼び出し:
dashboard_stats— 概要を返します:Users: 1,284 (12 new today) Tenants: 89 (3 new this week) Health: All systems healthy Active alerts: 0
例 2:収益の推移を調査する
プロンプト:「過去 30 日間の収益の推移を見せてください」
ツール呼び出し:
get_financial_metrics— 時系列データを取得します:
グラフ表示用の日次収益データポイント(値はセント単位)を返します。例:{ "range": "30d", "metric": "revenue" }2026-01-27: $1,250.00 2026-01-28: $890.00 ... 2026-02-25: $2,100.00get_financial_metrics— 続けて ARR を取得します:{ "range": "30d", "metric": "arr" }
例 3:特定のテナントを検索する
プロンプト:「Acme Corp のテナントを検索して、詳細を見せてください」
ツール呼び出し:
list_tenants— 名前で検索します:
一致するテナントの ID、プラン名、請求ステータスを返します。{ "search": "Acme Corp" }get_tenant— テナント ID を使って詳細情報を取得します:
プラン情報、請求ステータス、クレジット残高、サブスクリプション開始日と終了日、および役割を含む全メンバー一覧を返します。{ "id": "6789abc..." }
例 4:重大なエラーを検索する
プロンプト:「過去 1 時間に重大なエラーはありましたか?」
ツール呼び出し:
search_logs— 重要度と時間で絞り込みます:
タイムスタンプ、カテゴリ、メッセージ、メタデータを含むログエントリを返します。例:{ "severity": "critical", "fromDate": "2026-02-26T14:00:00Z", "perPage": "50" }[critical] 14:23:05 billing — Stripe webhook signature verification failed [critical] 14:31:12 security — Log injection pattern detected in user inputget_log_severity_counts— 全体の分布を提示します:critical: 2, high: 15, medium: 89, low: 342, debug: 1,204
例 5:システムのヘルス状態を監視する
プロンプト:「システムのヘルス状態はどうですか?すべての連携が正常に動作していますか?」
ツール呼び出し:
get_system_health— 現在のメトリクスを返します:CPU: 12.3% Memory: 245 MB / 512 MB (47.8%) Disk: 1.2 GB / 8 GB (15.0%) HTTP: 1,234 requests (p95 latency: 45ms) MongoDB: 12 active connectionsget_integrations— サードパーティとの接続を確認します:MongoDB: healthy (3ms response) Stripe: healthy (120ms response, 89 calls/24h) Resend: healthy (95ms response, 12 calls/24h) Google OAuth: healthy
例 6:API キーの使用状況を監査する
プロンプト:「有効な API キーをすべて表示し、最終使用日時を教えてください」
ツール呼び出し:
list_api_keys— キーの一覧を返します(キー全体が公開されることはありません):"Production Automation" (admin) — lsk_...a3f2 — last used: 2 hours ago "CI/CD Pipeline" (admin) — lsk_...b7e1 — last used: 15 minutes ago "Customer Integration" (user) — lsk_...c9d4 — last used: 3 days ago "Old Test Key" (admin) — lsk_...d1e5 — last used: never
例 7:サブスクリプションプランを確認する
プロンプト:「提供しているプランと、それぞれの加入者数を教えてください」
ツール呼び出し:
list_plans— 価格と加入者数を含むすべてのプランを返します:Starter: $9/mo ($86/yr) — 45 subscribers — 5 seat limit Pro: $29/mo ($278/yr) — 31 subscribers — 25 seat limit, per-seat pricing Enterprise: $99/mo ($950/yr) — 8 subscribers — unlimited seatslist_credit_bundles— 購入可能なクレジットを表示します:Small Pack: 100 credits — $5.00 — active Medium Pack: 500 credits — $20.00 — active Large Pack: 2000 credits — $60.00 — active
例 8:Webhook の配信状況を確認する
プロンプト:「Webhook は正常に配信されていますか? 本番用 Webhook の最近の履歴を表示してください」
ツール呼び出し:
list_webhooks— 設定済みの Webhook をすべて表示します:"Production" — https://api.example.com/webhooks — 12 events — active "Staging" — https://staging.example.com/hooks — 5 events — activeget_webhook— 本番用 Webhook の配信履歴を取得します:
ステータスコード、応答時間、失敗があればその内容を含む、最近の配信試行を返します:{ "id": "abc123..." }2026-02-26 14:30:01 — subscription.activated — 200 OK (120ms) 2026-02-26 14:15:22 — payment.received — 200 OK (95ms) 2026-02-26 13:45:10 — member.joined — 500 Error (340ms)
例 9:ユーザーの検索とメンバーシップの確認
プロンプト:「メールアドレスが [email protected] のユーザーを探して、そのテナントのメンバーシップを表示してください」
ツール呼び出し:
list_users— メールアドレスで検索します:
一致するユーザーの ID、確認状況、最終ログイン日時を返します。{ "search": "[email protected]" }get_user— 詳細情報を取得します:
次の内容を返します:{ "id": "def456..." }Email: [email protected] (verified) Auth: password + Google OAuth MFA: TOTP enabled Memberships: — Acme Corp (owner) — joined 2026-01-15 — Side Project Inc (admin) — joined 2026-02-10 Last login: 2 hours ago
例 10:ヘルスメトリクスの詳細分析
プロンプト:「過去 24 時間における、すべてのノードの CPU とメモリの推移を表示してください」
ツール呼び出し:
list_nodes— すべてのサーバーノードを特定します:node-1 (v1.0.0) — healthy — last seen: 30s ago node-2 (v1.0.0) — healthy — last seen: 28s agoget_health_metrics— 集計された時系列データを取得します:
60 秒ごとのデータポイントを返します。CPU 使用率、メモリ使用率、ディスク使用率、HTTP リクエスト数、レイテンシのパーセンタイルが含まれており、グラフ化にそのまま使えます。{ "range": "24h" }get_health_metrics— 必要に応じて、特定のノードを詳しく調べます:{ "node": "node-1", "range": "24h" }
デプロイ
Fly.io
LastSaaS には、本番環境へのデプロイ用に Dockerfile と Fly.io の設定が含まれています。
# Install flyctl if needed
curl -L https://fly.io/install.sh | sh
# Create the app (first time only)
flyctl apps create your-app-name --org your-org
# Set production secrets
flyctl secrets set \
DATABASE_NAME="your-db-name" \
MONGODB_URI="mongodb+srv://..." \
JWT_ACCESS_SECRET="$(openssl rand -hex 32)" \
JWT_REFRESH_SECRET="$(openssl rand -hex 32)" \
FRONTEND_URL="https://your-app-name.fly.dev" \
APP_NAME="YourApp" \
STRIPE_SECRET_KEY="sk_live_..." \
STRIPE_PUBLISHABLE_KEY="pk_live_..." \
STRIPE_WEBHOOK_SECRET="whsec_..."
# Deploy
flyctl deploy
Dockerfile は Go バックエンドと React フロントエンドをビルドし、約 14 MB の Alpine コンテナにまとめます。Go バイナリがフロントエンドの SPA を直接配信するため、nginx や別の Web サーバーは不要です。
その他のプラットフォーム
Docker イメージは、コンテナを実行できる環境であればどこでも動作します。外部依存関係は MongoDB のみです。上記の環境変数を設定し、ポート 8080 を公開してください。
フォークして、AI と一緒に開発を続けましょう
LastSaaS は、Claude Code との対話だけで開発されました。すべての機能、ハンドラー、コンポーネントが自然言語で説明され、AI エージェントによって実装されています。しかし、本当に重要なのは、これがそのように開発されたことではなく、これからもそのように開発を続けられるように設計されていることです。
コードベースには一貫したパターンがあり、明確な命名規則が使われ、AI エージェントがスムーズに読み進められる構成になっています。フォークして Claude Code に読み込ませ、作りたい製品について説明し始めてください。エージェントは認証、テナンシー、課金、ミドルウェア、イベントといった既存のパターンをすでに理解しており、それらを活用して自然に開発を進めます。ゼロから始めるのではなく、対話の続きを始められます。
すぐに使える機能は次のとおりです。
- 製品のデータモデルを追加する:
backend/internal/models/に追加します - API ハンドラーを追加する:
backend/internal/api/handlers/に追加します - ルートを登録する:
backend/cmd/server/main.goに登録します - フロントエンドのページを追加する:
frontend/src/pages/に追加します - テナントコンテキストを使う:認証済みの各リクエストにはユーザーのテナントが含まれるため、製品のロジックでマルチテナントをすぐに利用できます
- クレジットシステムを使う:利用量に応じた機能のクレジットを確認し、差し引きます
- エンタイトルメントを使う:
middleware.RequireEntitlement(db, "feature_name")とmiddleware.RequireActiveBilling()で機能の利用を制御します - 設定ストアを使う:再デプロイせずに、実行時に変更できる設定を追加します
- イベントエミッターを使う:ハンドラーからイベントを送信すると、設定済みの Webhook に自動的に配信されます
- API キーを使う:エンドポイントは JWT 認証と API キー認証の両方を自動的にサポートします
- ブランディングシステムを使う:UI には BrandingContext を通じてホワイトラベルテーマが自動的に適用されます
- テレメトリーシステムを使う:Go の
telemetry.Track()または外部クライアントからのPOST /telemetry/eventsでカスタムイベントを追跡すると、それらが PM ダッシュボードに自動的に表示されます
プライバシーポリシー
LastSaaS はセルフホスト可能なソフトウェアです。データベース、ホスティング、データはお客様が管理します。MCP サーバーは読み取り専用ツールを使用し、HTTP API 経由でお客様の LastSaaS インスタンスに接続します。Metavert LLC や第三者にデータが送信されることはありません。
プライバシーポリシーの全文については、こちらをご覧ください:https://www.metavert.io/lastsaas-privacy-policy
ライセンス
MIT - Copyright 2026 Metavert LLC
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。