mcpField
O
Omentir

Omentir

リモート
omentir.comビジネス・マーケティング511 日前に更新
リポジトリ公式サイト

Omentir について

Omentir は、LinkedIn の見込み顧客の発見、文脈に沿った営業メッセージの作成、人のペースに合わせたキャンペーン実行を行うオープンソースの AI 営業ワークスペースです。マネージドサービスとしても、自社インフラへのセルフホストとしても利用でき、コードと運用を自身で管理できます。

主な機能

  1. 01LinkedIn の見込み顧客を検索
  2. 02文脈に応じたアウトリーチ文面の作成
  3. 03人のペースに合わせたキャンペーン実行
  4. 04返信メッセージの処理
  5. 05MCP エンドポイントと REST API による接続
  6. 06自前の Firebase、Gemini、Unipile アカウントによるセルフホスト

活用シーン

  1. 01Claude、ChatGPT、Cursor から LinkedIn の見込み顧客開拓を管理
  2. 02見込み顧客データと実行環境を自社管理するセルフホスト運用
  3. 03競合企業の URL から顧客獲得エージェントを作成

MCP 対応

Omentir はワークスペースを MCP サーバーとして提供し、Claude、ChatGPT、Cursor などの MCP クライアントから接続できます。LinkedIn のパスワードを共有せず、ワークスペースの接続を承認してアクセスを許可します。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://omentir.com/api/agent/v1/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

詳細

Omentir

License: MIT

Omentir は、HeyReach や Gojiberry のような LinkedIn のアウトリーチおよび自動化ツールに代わるオープンソースの選択肢です。

有望な LinkedIn の見込み客の検索、文脈に沿ったアウトリーチ文面の作成、人間らしいペースでのキャンペーン実施、返信への対応を行う AI セールスワークスペースです。コードの所有権はお客様にあり、ご自身のインフラで実行できます。

omentir.com でマネージド製品を利用するか、ご自身の Firebase、Gemini、Unipile アカウントを使って、同じアプリケーションコードをセルフホストできます。

単一のコードベース: ホスト型クラウドとセルフホストで、このリポジトリを共有します。RUN_LOCALLY=TRUE にすると、認証、課金、マーケティング、ホスト型専用のメール機能が無効になります。omentir.com の公開ブランド連絡先は、意図的にソース内に残しています(src/lib/hosted-identity.ts を参照)。セルフホストでの運用には使用されません。

他の AI アプリ(Claude、ChatGPT、Grok、Grok Bot、Cursor、…)から接続する

LinkedIn のパスワードを共有せずに、チャットやコーディングエージェントから Omentir を利用できます。

  1. Omentir で LinkedIn に接続し、ワークスペースに入力します。
  2. チャットアプリ(Claude、ChatGPT、Grok): Settings → Connectors → 次を追加
    https://omentir.com/api/agent/v1/mcp → サインインして Connect workspace を承認 → チャットでツールを有効にします。
    API キーは不要です。
  3. Grok Bot(常時利用可能なチームメイトアプリであり、grok.com のチャットではありません):Settings → Plugins → Marketplace で Omentir を検索します。表示されない場合は、同じ MCP URL をカスタムサーバーとして追加し、Connect workspace を承認します。Bot のコンピューターで LinkedIn にサインインしないでください。Grok Bot 連携。
  4. Cursor / Claude Code / スクリプト: API ページでキーを作成し、MCP エンドポイントまたは REST /api/agent/v1/* に
    Authorization: Bearer <token> を送信します。
  5. アシスタントに、従来型のリード検索エージェント、または Steal Customers エージェント(mode: steal_customers + 競合他社の会社 URL)の作成を依頼します。会社が複数ある場合は、ワークスペースの一覧表示と切り替えを依頼します。

ドキュメント:MCP 連携、エージェント API、agents.md(マシン向けガイド)、OpenAPI。


セルフホスト

Omentir は外部のマネージドサービスを利用してセルフホストできます。オフラインでの利用や、依存関係なしでの利用には対応していません。Firebase/Firestore、Unipile、および Gemini API キーまたは Google Cloud Vertex AI プロジェクトをご用意ください。

セルフホストにすると Omentir のサブスクリプションは不要になりますが、Firebase/Google AI と Unipile の利用には引き続き費用が発生する場合があります。

localhost ですぐに開始する

Git と、Docker Compose を使う Docker または Bun 1.3 のいずれかをインストールします。次に、プロジェクトをクローンして設定します。

git clone https://github.com/vanshyadav1408/Omentir.git
cd Omentir
cp .env.example .env

.env を開き、コメントアウトされていない空欄をすべて入力します。サーバーを起動する前に、以下のプロバイダー設定を完了してください。

次のコマンドで、互いに独立したシークレットを生成します。

openssl rand -base64 48

少なくとも次の項目には、生成した値(またはパスワードマネージャー)を使用してください。

  • LOCAL_SESSION_SECRET(必須)
  • LOCAL_APP_PASSWORD(オープンアクセスを明示的に許可する場合を除き必須。詳しくはアクセス制御を参照)
  • CRON_SECRET(自動化を完全に無効にする場合を除き必須)
  • UNIPILE_WEBHOOK_SECRET(返信および関係性の Webhook に必須)

自動化をすべて無効にして初期設定する場合は、CRON_SECRET を空欄のままにし、代わりに AUTOMATION_DISABLED=true を設定します。ドライランの出力を確認するまで、ENABLE_LIVE_AUTOMATION=false のままにしてください。

Docker で実行する

Docker は、サポート対象のセルフホスト方法です。Omentir は amd64 と arm64 で動作します。

docker compose up --build -d
docker compose logs -f omentir

http://localhost:3000 を開きます。Ctrl+C を押すと、Omentir を停止せずにログ表示を終了できます。サーバーを停止するには、後で docker compose down を実行します。

ポートのバインド: Compose はアプリを 127.0.0.1:3000:3000 としてのみ公開します。つまり、コンテナーにアクセスできるのは同じマシンから(http://localhost:3000)であり、LAN 上のほかのデバイスやパブリックインターネットからはアクセスできません。これは意図的な設定です。Docker の起動によって、設定ミスのあるインスタンスやパスワード未設定のインスタンスがアクセス可能になってはなりません。

実際のホスト(LAN/VPS)でアプリを公開するには、次の手順を実行します。

  1. パブリックインターフェースに HTTPS リバースプロキシ(Caddy、nginx、Traefik など)を配置します。
  2. 127.0.0.1:3000 にプロキシします(リスクを理解している場合に限り、Compose のバインド先を変更してください)。
  3. APP_BASE_URL に、正確なパブリック HTTPS オリジン(末尾にスラッシュなし)を設定します。
  4. 強力な LOCAL_APP_PASSWORD を設定したままにします(パブリック URL でオープンアクセスを有効にしないでください)。
Bun で実行する

ローカル開発の場合:

bun install
bun run dev

本番環境に近いローカルサーバーの場合:

bun install
bun run build
bun start

http://localhost:3000 を開きます。オープンアクセスを有効にしていない場合は、LOCAL_APP_PASSWORD を使ってサインインします(下記を参照)。

Bun はパッケージマネージャー兼スクリプトランナーですが、bun run dev は意図的に Next を Bun 上の bun --bun ではなく Node 上で起動します。開発時、Turbopack は firebase-admin を含む serverExternalPackages 内のすべてのパッケージを、firebase-admin-<hash>/firestore のようなハッシュ付き指定子を通じて読み込みます。この指定子は、Next が Node にインストールするローダーフックを介してのみ解決されます。Bun のリゾルバーはそのフックを実行しないため、bun --bun next dev は最初の Firestore インポートで ResolveMessage: Cannot find module エラーを起こします。本番環境には影響しません。ビルド済みの出力では通常の require が生成されるため、build と start は引き続き Bun 上で実行できます。

アクセス制御(ローカルログイン)

セルフホストモードでは、Clerk ではなく、単一のワークスペースと署名付きの HTTP 専用セッション Cookie(omentir_local_session)を使用します。

設定動作
LOCAL_APP_PASSWORD を設定(12 文字以上、高いエントロピー)ログインフォームでそのパスワードが必要になります。これがデフォルトの想定です。
LOCAL_APP_PASSWORD が空で、LOCAL_ALLOW_OPEN_ACCESS が未設定/false起動に失敗します。 パスワードが空というだけでは、保護されていないインスタンスを実行できなくなりました。
LOCAL_ALLOW_OPEN_ACCESS=true かつパスワードが空明示的なオプトインです。パスワードなしで「Continue to overview」ボタンのあるウェルカム画面が表示されます。信頼できるマシン/プライベートネットワークでのみ使用してください。
LOCAL_ALLOW_OPEN_ACCESS=true かつパスワードを設定引き続きパスワードが必要です(オープンアクセスフラグによって、設定済みのパスワードが無効になることはありません)。
LOCAL_SESSION_SECRET常に必須です。32 文字以上で、高いエントロピーが必要です。セッショントークンの HMAC 署名に使用されます。変更すると、既存のすべてのセッションが無効になります。

運用者にとって重要な、ログインに関する追加のセキュリティ強化策は次のとおりです。

  • オリジンチェック: POST /api/local-auth/login は、Origin が APP_BASE_URL と一致するリクエストのみを受け付けます。
  • ブルートフォース対策のスロットリング: 誤ったパスワードの試行は、送信元 IP ごとにレート制限されます(プロセス内)。
  • ログイン後のリダイレクト: ?next= の戻り先パスはサニタイズされるため、//evil.com のような値によってサインイン後にブラウザーがオープンリダイレクトされることはありません。同一オリジンの相対パス(単一の / で始まるもの)のみが許可されます。
  • Cookie フラグ: セッション Cookie には HttpOnly と SameSite=Lax が設定され、APP_BASE_URL が HTTPS の場合は Secure も設定されます。
1. プロバイダーのセットアップ
  1. 専用の Firebase プロジェクトを作成します。Firestore を有効にして、サービスアカウントを作成します。ホストされている Omentir プロジェクトは決して再利用しないでください。
  2. firebase deploy --only firestore:indexes を実行して必要なインデックスをデプロイするか、Firestore のエラーリンクからインデックスを作成します。ソースは firestore.indexes.json です。
    • firebase deploy --only firestore:rules も実行してください。Omentir はサーバー側の Admin SDK 経由でのみ Firestore にアクセスするため、同梱されている firestore.rules ではブラウザー/クライアントからの直接アクセスをすべて拒否します。必ずデプロイしてください。プロジェクト ID やウェブ API キーが漏洩しても、第三者がデータを読み書きするのを防げます。
  3. Unipile アカウントを作成し、DSN、API キー、Webhook シークレットを取得します。Unipile は有料であり、LinkedIn は自動化されたアカウントを制限する場合があります。
  4. Gemini API キーを作成します。代わりに Vertex を使用する場合は、GOOGLE_CLOUD_PROJECT、GOOGLE_CLOUD_LOCATION、GOOGLE_APPLICATION_CREDENTIALS_JSON を設定し、Vertex AI を有効にして、サービスアカウントに Vertex AI User のロールを付与します。
2. 設定

.env.example を .env にコピーします。ローカルで必須の設定は、サーバー起動時に検証されます。

変数適用範囲シークレット実行時の動作
RUN_LOCALLY=TRUEローカルいいえ組み込みの単一ワークスペース認証を選択します
APP_BASE_URL共通いいえ正規のサーバー URL です。localhost 以外では HTTPS が必要です
LOCAL_APP_PASSWORDローカルはい*オープンアクセスが明示的に許可されていない限り、アクセスパスワードが必要です。設定する場合は 12 文字以上にしてください
LOCAL_ALLOW_OPEN_ACCESSローカルいいえパスワードなしのウェルカム画面を許可するには、値を厳密に true にする必要があります
LOCAL_SESSION_SECRETローカルはいほかの値と独立したランダム値が必要です。32 文字以上にしてください
LOCAL_USER_NAME / LOCAL_USER_EMAILローカルいいえ単一のローカルワークスペースに表示するユーザー情報です
FIREBASE_PROJECT_ID共通いいえ専用の Firebase プロジェクトです
FIREBASE_SERVICE_ACCOUNT_KEY共通はいサービスアカウントの JSON です。不正な JSON の場合、起動に失敗します
UNIPILE_DSN / UNIPILE_API_KEY共通混在Unipile のエンドポイントと認証情報です
UNIPILE_WEBHOOK_SECRET共通はい返信とリレーションの Webhook を認証します
GEMINI_API_KEYローカル/シンプルはいGemini Developer API の経路です
Vertex 変数共通/高度な設定はいGEMINI_API_KEY の代替です
CRON_SECRET共通はい自動化が無効でない限り必須です。組み込みスケジューラーとジョブルートで使用します
ENABLE_LIVE_AUTOMATIONローカルいいえ値が厳密に true でない限り、実際の送信は無効のままです
AUTOMATION_DISABLED共通いいえ緊急停止用です。スケジューラーとジョブの実行をスキップします
RESEND_API_KEY / RESEND_FROM_EMAIL任意はい/混在ローカルモードでのトランザクション通知にのみ使用します
ALLOWED_DEV_ORIGINS開発のみいいえトンネル/プロキシを使用する場合に、Next.js HMR 用のホスト名を追加します

* LOCAL_APP_PASSWORD は人が入力する値ですが、シークレットとして扱ってください。

暗号学的に安全なパスワードマネージャーを使うか、openssl rand -base64 48 を実行してシークレットを生成してください。replace-me のようなプレースホルダー文字列は、起動時に拒否されます。

3. HTTPS とコールバック

ローカルのブラウザー利用では http://localhost を使用できます。LAN、VPS、トンネル、インターネット経由でデプロイする場合は、必ず HTTPS を使用してください。Caddy や nginx などのリバースプロキシをポート 3000 の手前に配置し(前述のループバックバインド先へのプロキシを推奨します)、APP_BASE_URL に正確な公開オリジンを設定します。TLS とパスワードなしで、ポート 3000 を 0.0.0.0 に公開しないでください。

Unipile の接続コールバックと返信コールバックには、APP_BASE_URL と一致する、到達可能な HTTPS URL が必要です。

LinkedIn 接続通知コールバック

ユーザーが LinkedIn に接続すると、Omentir は Unipile にサーバー間通知 URL を登録します。

{APP_BASE_URL}/api/connect/callback

このエンドポイントには、フロー開始時に発行され、成功時に消費される、高いエントロピーを持つ一度限りの接続トークンが必要です。また、保存前に、返されたアカウントが設定済みの Unipile アカウントに存在することを検証します。共有シークレットがコールバック URL に含まれることはありません。

返信/関連付けの Webhook には、別の Unipile Webhook ルートと同じ UNIPILE_WEBHOOK_SECRET(ヘッダー x-omentir-webhook-secret)を使用します。

4. 自動化を安全に有効にする

ENABLE_LIVE_AUTOMATION=false のまま LinkedIn に接続し、automationRuns でドライランの判断内容を確認します。アカウント、ターゲティング、メッセージの下書き、クォータが正しいことを確認してから、true に設定してください。AUTOMATION_DISABLED=true は緊急停止として機能し、CRON_SECRET の省略も可能にします。

プロセスでは、CRON_SECRET(ヘッダー x-cron-secret または Authorization: Bearer …)を使って GET /api/jobs/automation-tick を呼び出す組み込みスケジューラーを実行できます。ジョブシークレットの比較には、一定時間で処理する方式を使用します。ブラウザーからアクセス可能な URL や公開ログに CRON_SECRET を含めないでください。

メール

ローカルモードでは、Omentir のマーケティング、創業者、問い合わせフォーム、メーリングリストに関するメールは送信されません。運用通知には、ご自身の Resend アカウントを使用できます。Resend アカウントがなくてもアウトリーチは機能し、通知の送信がスキップされます。

同じリポジトリが omentir.com とセルフホスト型インストールの両方で使用されています。ホステッド製品の識別情報(サポートアドレス、ウェルカムメールの From 行、公開連絡先)は、クラウドモード用の意図的なデフォルトとして src/lib/hosted-identity.ts にあります。これらの処理は RUN_LOCALLY=TRUE の場合は無効になります。セルフホストする場合は、ご自身の RESEND_FROM_EMAIL(任意)のみを設定してください。

バックアップ

すべてのデータの管理責任は運用者にあります。Firestore のマネージドエクスポートまたは Google Cloud バックアップを定期的に設定し、アプリケーションのプロジェクト外に保持して、復元をテストしてください。.env は安全にバックアップし、Git には絶対に保存しないでください。

Firestore には、rateLimits などのコレクションに運用ドキュメントも保存されます(アプリプロセス間で共有されるリクエスト上限)。これらは顧客の CRM データではありません。バックアップに含めるか、復元後に自然に再構築されるようにしてください。

アップグレードとロールバック

変更不可能なリリースタグのみをインストールしてください。

git fetch --tags
git checkout v0.x.y
docker compose up --build -d

既知の正常な直前のタグをチェックアウトして再ビルドすることでロールバックできます。スキーマや運用上の変更について、各リリースノートを確認してください。リリース時点では、セキュリティ修正が提供されるのは最新のリリースタグのみです。


セルフホストする場合のセキュリティのデフォルト設定

このセクションでは、Omentir を自分で実行する際に重要となる保護機能について説明します。ホステッド版の omentir.com では、該当する場合は同じコードパスを使用し、ローカルモードでは使用しない Clerk/Whop も使用します。

ロックダウンされている項目
領域動作
Firestore クライアントfirestore.rules により、ブラウザー/クライアントからの読み取りと書き込みはすべて拒否されます。データにアクセスできるのは、サーバー上の Admin SDK のみです。
リポジトリ内のシークレット.env は gitignore に登録されています。空の .env.example のみを同梱してください。サービスアカウントの JSON や API キーは絶対にコミットしないでください。
ローカルパスワードデフォルトで必須です。オープンアクセスを許可するには、LOCAL_ALLOW_OPEN_ACCESS=true を明示的に設定する必要があります。
Docker ポートデフォルトではループバック(127.0.0.1:3000)にバインドされます。
ウェブサイト分析/プレビュー APIサインイン済みのセッションが必要です。未認証の呼び出し元が Gemini のクォータを消費したり、サーバーをオープンなウェブサイト取得手段として利用したりすることはできません。
リードプレビュー APIサインイン済みユーザーのみ利用でき、レート制限と上限付き JSON ボディが適用されます。
エージェント API と MCPBearer エージェントトークン(保存時はハッシュ化)を使用します。トークンごとおよび全体のレート制限があります。変更リクエストのボディは約 256 KB に制限されます。
共有レート制限プロセス内カウンターと、有効期限付きの Firestore ベースの上限(rateLimits)を併用するため、複数のコンテナーによってクォータが増えることはありません。
ジョブルート(/api/jobs/*)定時間比較により、CRON_SECRET/AUTOMATION_JOB_SECRET が必要です。
ログインリダイレクト?next= は、安全な同一オリジンの相対パスに制限されます。
HTTP セキュリティヘッダーCSP(フレーミング、form-action、object-src、base-uri など)、X-Frame-Options: DENY、HSTS、nosniff、リファラーポリシー。
想定されるコストと不正利用の制御

セルフホスト環境の唯一のユーザーであっても、漏洩したエージェントトークン、バグのある連携機能、または侵害されたブラウザーセッションによって Gemini や Unipile が無制限に呼び出されないよう、アプリには引き続き上限が適用されます。

  • ウェブサイト分析(POST /api/website-analysis):認証必須。共有の時間単位のレート制限があります。
  • ウェブサイトプレビュー(POST /api/website-preview):認証必須。共有の時間単位のレート制限があります。
  • オンボーディングのリードプレビュー(POST /api/onboarding/lead-preview):認証必須。共有の時間単位のレート制限があり、ボディサイズにも上限があります。
  • エージェント API(MCP を含む /api/agent/v1/*):Authorization: Bearer omentir_agent_… による認証。共有の分単位のレート制限があり、書き込みパスの JSON ボディサイズには上限があります。
  • アンケート/Unipile Webhook/接続コールバック:レート制限があります。Webhook には共有シークレットが必要で、接続コールバックには一度だけ使用できるトークンが必要です。

分析のためのウェブサイト取得では引き続き、プライベート IP と予約済み IP がブロックされます(SSRF 対策:検証済みのパブリックアドレスへの DNS ピン留め、認証情報を含む URL の禁止、リダイレクト時の再検証)。

マルチプロセス/マルチコンテナーに関する注意事項

同じ Firestore プロジェクトに対して複数の Node プロセスまたはレプリカを実行する場合:

  • 共有レート制限は rateLimits コレクションを使用し、プロセス間でクォータを適用します。
  • 自動化では引き続き Firestore のティックロックを使用するため、一度に処理を進める自動化ティックは 1 つだけです。
  • プロセス内マップ(ログイン試行カウンターなど)はプロセスごとに管理され、再起動時にリセットされます。唯一の制御手段ではなく、ソフトな保護として扱ってください。
セルフホストに含まれないもの
  • マルチユーザー SaaS 認証(Clerk)、課金(Whop)、または Omentir のマーケティングメール。
  • アプリの自動的なパブリック公開。リバースプロキシを前段に意図的に設置し、ファイアウォールのポートを開放する必要があります。
  • オフライン/エアギャップ環境での動作。すべての機能を利用するには Firebase、Unipile、Gemini/Vertex が引き続き必要です。

安全なデフォルト設定(自動化)

  • ローカルモードでは、署名付きの有効期限付きセッションを使用します。オープンアクセスを明示的に有効にしない限り、パスワードが必要です。
  • ENABLE_LIVE_AUTOMATION=true を設定しない限り、自動化はドライランです。
  • AUTOMATION_DISABLED=true を設定すると、スケジューラーの起動と手動でのティック実行が無効になります。
  • 商用プランの上限はローカルでは解除されますが、招待間隔、日次クォータ、再試行上限、ティックごとの送信予算は引き続き適用されます。
  • 検証時に実際のアウトリーチを送信しないでください。ドライランの出力と automationRuns を使用してください。

開発

bun install
bunx tsc --noEmit
bun run build

ランタイム設定はサーバー起動時に検証されるため、ビルドとコントリビューターの CI でシークレットは不要です。


サポート

Omentir で再現可能な不具合や機能提案には、GitHub の issue を使用してください。リリースタグ、デプロイ方法、機密情報を除去したログ、再現手順を含めてください。

プロバイダーの設定、請求、クォータ、サービス停止、アカウント制限については、Firebase/Google Cloud、Unipile、LinkedIn、Gemini、または Resend のサポートにお問い合わせください。コミュニティが支援することはありますが、セルフホストするユーザーのサードパーティアカウントをプロジェクトが運用したり、デバッグしたりすることはできません。

シークレット、顧客データ、アクセストークン、サービスアカウントの JSON、非公開の LinkedIn メッセージを投稿しないでください。


ライセンスと商標

MIT — LICENSE を参照してください。Omentir の名称とロゴはソフトウェアライセンスの対象ではありません。フォークは、Omentir または omentir.com を名乗らず、別のブランド名を使用してください。

サードパーティに関する告知: 本番環境の依存関係の大半は、MIT、Apache-2.0、BSD、または ISC ライセンスです。特筆すべき MIT 以外の本番ライセンスは次のとおりです。Apache-2.0(Google GenAI、Firebase Admin、および関連する Google ライブラリ)、LGPL-3.0-or-later(@img/sharp-libvips-*、動的リンクされるプラットフォームバイナリ)、MPL-2.0 OR Apache-2.0(dompurify、デュアルライセンス)、CC-BY-4.0(caniuse-lite、推移的なデータの帰属表示)。package.json の "private": true は、「このパッケージを npm レジストリに公開しない」という意味にすぎず、ソースがクローズドであることを意味するものではありません。public/ 内のブログ画像とマーケティング画像はプロジェクトのアセットです。これらを再配布するフォークは、Omentir または omentir.com との関係を示唆しないでください。

コメント

MCP は初めてですか?

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

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