ooligo
mcp-server

MCP server exposing Outreach sequences and prospects to Claude

Difficulty
上級
Setup time
45-90 min
For
revops · gtm-engineer
RevOps

Stack

ClaudeOutreach 組織への読み取り専用の窓を与える Model Context Protocol サーバーです。シーケンスのパフォーマンス、シーケンス途中で止まっている対象、プロスペクト検索、そして特定プロスペクトのエンゲージメント履歴を扱います。SDR マネージャーがチャットで「Q3 のエンタープライズシーケンスで何が一時停止していて、その理由は何か」と尋ねると、一時停止理由が付いた行が返ってきます。しかもその返答は、何かを変更できるコードパスを 1 つも持たないプロセスから来ています。scaffold は apps/web/public/artifacts/mcp-server-outreach-revops/ にあり、README.mdpyproject.tomlsrc/outreach_revops_mcp/server.py で構成され、pip install -e . でインストールできます。

構築を始める前に次のセクションを読んでください。Outreach はすでに自社製のものを提供しています。

これを使うべき場合

Outreach は https://api.outreach.io/mcp/ で自社の MCP server をホストしています。OAuth 2.1 とユーザーレベルの ID で認証し、2025-11-11 に公開された MCP の認可標準に従い、ワークフロー、プロスペクティング、アカウント、ディール、ユーザー、カレンダーという 6 つのカテゴリーでツールを公開しています。シートに Amplify アドオンが有効化されていること、および組織設定での管理者トグルが必要で、機能は読み取り、作成、削除に限られます。Outreach は既存レコードの更新を意図的に除外しており、その理由として、既存レコードを編集する際のモデルの挙動が予測できない点を挙げています (ベンダー公式ドキュメント、Outreach サポートポータル)。

大半のチームにとってホスト版が正解であり、この scaffold は無駄な作業です。 有効にして接続し、先に進んでください。自前で作るべきなのは、次の 4 つのうちいずれかが当てはまる場合です。

エージェントにプロスペクトを削除させたくない。 ホスト版のプロスペクティングカテゴリーには作成と削除が含まれます。削除は Outreach で唯一、取り消しもローカルコピーもない操作です。削除されたプロスペクトはシーケンス履歴ごと消えます。この scaffold のディスパッチテーブルには POSTPATCHDELETE もどこにも存在しないため、プロスペクト自身のメモ欄経由でモデルに届いた指示には、呼び出す先がありません。これはポリシーとして誰かが守らせるものではなく、構造上の性質です。

サービスアカウントの ID が必要である。 ホスト版はサインインした本人として、その人の権限で動きます。Slack チャンネル、夜間のレポーティングジョブ、チーム全員が起動するワークフローに接続されたエージェントには、背後にいる個人がいません。ユーザー単位の OAuth 付与では「どの個人が見るよりも狭い範囲」を表現できません。

全シートに Amplify があるわけではない。 ホスト版はアドオンに依存します。第三者による価格調査では、2026 年の Amplify 各階層は Core、Plus、Pro でおよそ 1 ユーザーあたり月 $100、$130、$160 とされています。Outreach はこれらを公表していないため、見積もりではなく報告値の幅として扱ってください。公開 API に対する標準的な OAuth アプリケーションにはこの制限がないため、40 シートの組織は 40 人分の Amplify を購入しなくてもチャットでシーケンスの質問に答えられます。

集計済みの読み取りが欲しい。 get_sequence_performance は、Outreach 自身が保持しているカウンターに対する 1 回のリクエストで「このシーケンスの調子はどうか」に答えます。

これを使うべきでない場合

  • ホスト版を退ける理由がない。 ここで最も多い誤りなので繰り返します。既定の選択は Outreach 自身のサーバーであり、それ以外を選ぶ根拠は上記の 4 つの狭いケースがすべてです。
  • プロスペクトのデータを LLM に渡せない。 返される行はすべて、氏名、業務用メールアドレス、役職、エンゲージメント履歴を会話に持ち込みます。OUTREACH_ALLOWED_SEQUENCE_IDS は範囲を狭めますが、なくすわけではありません。third-party のモデルに連絡先データを渡すことをポリシーが禁じているなら、どちらのサーバーも適切なプロジェクトではありません。
  • エージェントにシーケンスを実行させたい。 プロスペクトのシーケンス追加、一時停止、メール送信、いずれも設計上ここにはありません。作成ができるホスト版か、Outreach の画面を使ってください。
  • 求めているのが一括エクスポートである。 各ツールは 100 行が上限で、1 ページのみを返します。全シーケンスの四半期集計は /api/v2/sequences に対してページングするスクリプトの仕事であり、ファイルとしてレビューするものです。4,000 行にチャットは不向きなインターフェースです。

公開しているもの

ツールは 5 つ、すべて読み取りです。

  • list_sequences-lastUsedAt でソートした GET /sequences を呼び、各シーケンスのエンゲージメントカウンターを返します。他のすべてに先立つ id 特定のステップです。
  • get_sequence_performanceGET /sequences/{id} を呼び、derived ブロックを追加します。プロスペクト単位の返信率、バウンス率、オプトアウト率を含み、生のカウンターを _basis の下に置くことで、人間が Outreach の画面と計算を突き合わせられるようにしています。
  • find_stalled_sequence_statesstate で絞った GET /sequenceStates を呼び、prospectsequence を含め、-stateChangedAt でソートします。pauseReasonerrorReason をそのまま通すため、「何が止まっているか」が件数ではなく理由付きで返ります。
  • search_prospects は 15 フィールド固定の射影で GET /prospects を呼び、オプトアウト済みレコードを除いた contactable_count を計算します。
  • get_prospect_engagementGET /prospects/{id} と、そのプロスペクトで絞った GET /mailings を呼び、直近 10 通の配信、開封、クリック、返信、バウンスのタイムスタンプを返します。

エンジニアリング上の姿勢

server.py の 3 つの判断が要になっています。

すべてのリクエストが明示的な sparse fieldset を持ちます。 Outreach の prospect リソースは 230 個の属性を定義しており、そのうち 150 個は custom1 から custom150 です (組織の OpenAPI 定義 https://api.outreach.io/api/v2/schema/openapi.json で確認済み)。既定のレスポンスは大半が null であり、その全部に対して行ごとにトークンを払うことになります。PROSPECT_FIELDS は 15 個に射影します。custom フィールドを意図的に外しているのは、その枠こそ各組織が報酬レンジ、契約条件、公開するつもりのなかったメモを置いている場所だからです。custom17 という名前のフィールドは、自分が何を読んでいるのかをモデルに知らせる手段を一切与えません。

フィルターキーはリクエスト送信前に検証されます。 Outreach は各リソースの属性のうち一部だけをフィルター可能として指定しており、prospect では 230 個中 17 個です。サポートされないフィルターはベンダー側で拒否されません。パラメーターは無視され、コレクション全体とともに 200 が返り、モデルは組織全体の件数を絞り込み後の答えであるかのように報告します。_check_filters() は検証済みの集合にないキーをすべて拒否し、許可されたリストと、よくある取り違えに関する注記を返します。prospect の companyoptedOutemailOptedOut はいずれも返却はされますが、フィルターには使えません。そのため search_prospects は、存在しないフィルターがあるふりをせず、contactable_count をクライアント側で計算します。

返信率はメッセージ単位ではなくプロスペクト単位で計算します。 _rates()replyCountdeliverCount で割るのではなく、numRepliedProspectsnumContactedProspects で割ります。replyCount はメッセージ数を数えるため、熱心なプロスペクト 1 人が 4 回返信すると、4 件の別々の送信に対する 4 件の返信として読まれ、まさにマネージャーが評価したいシーケンスで率が水増しされます。

失敗モードとガード

ローテーションされた refresh token を失い、2 時間後に認証が死ぬ。 Outreach の access token の有効期間は 2 時間で、リフレッシュのたびに新しい refresh token が発行され、使用済みのものは失効します。新しいトークンをメモリー上にしか持たないサーバーは再起動まで動き、その後は死んだ資格情報を提示します。これはスコープの問題に見える 401 として表面化します。ガード: TokenStore._refresh() は、新しい access token を呼び出し元に返す 前に、一時ファイルのリネーム経由で OUTREACH_TOKEN_FILE にローテーション後のトークンを書き込みます。さらに TokenStore.load() が起動時にそのファイルへテスト書き込みを行い、書き込み不可なら起動を拒否します。refresh token は発行から 14 日で失効するため、それより長く停止していたサーバーは authorization code フローのやり直しが必要です。エラーメッセージがその旨を明示します。

エージェントのループが組織の API 予算を使い切る。 Outreach は 1 ユーザーあたり 1 時間に 10,000 リクエストを許可し、すべてのレスポンスで X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset を返します (ベンダー公式ドキュメント)。この予算は CRM 同期をはじめ組織上の他のすべての連携と共有されるため、激しくページングするエージェントはチャットだけでなく Salesforce 同期も壊します。ガード: _get() はすべてのレスポンスで X-RateLimit-Remaining を読み、既定値 250 の OUTREACH_RATE_LIMIT_FLOOR を下回った時点でリセット時刻を示してエラーを送出します。同期が重要な組織では 500 以上に引き上げてください。

include したリソースが、射影で削ったはずのペイロードを持ち込む。 find_stalled_sequence_statesinclude=prospect,sequence を使いますが、JSON:API は include したリソースも射影しない限り全幅で返します。止まっている行が 50 件あれば、そのそれぞれが 230 属性のプロスペクトを引きずってきます。ガード: extra_fields 引数が fields[sequenceState] と並べて fields[prospect]fields[sequence] を指定し、include されたプロスペクトを 5 属性に抑えます。

切り詰められた回答が、完全な回答のように読める。 各ツールは page[limit]=100 を上限とし、最初の 1 ページしか返しません。ガード: 部分的です。上限は適用され文書化されていますが、ツールはまだ切り詰めを通知しません。これは README.md にある本番投入前の番号付きリストの項目 2 であり、誰かがこれらの数字を上に報告し始めたら真っ先に直すべき箇所です。

これを作る代わりに

ホスト版以外にも、CData が自社の JDBC ドライバー上に構築した読み取り専用の Outreach MCP server を公開しており、Zapier と Pipedream も汎用 MCP レイヤー経由で Outreach を公開しています。3 つとも、この scaffold より早く立ち上がります。それらを見送る理由はホスト版を見送る理由と同じで、資格情報とデータ経路が third-party のものになる点にあります。この scaffold のツール表面、スコープ集合、rate limit の下限は、いずれもあなたが所有するファイル内の値です。「あのエージェントには何が見えていたのか」への答えが、ベンダーの主張ではなく実地の確認でなければならないとき、これが効いてきます。

複数の system of record にわたって同じ読み取り中心の姿勢を構築しているなら、このシリーズの ApolloGong のサーバーが射影と事前検証という同じ形を共有しているため、プロンプトはそれらの間で流用できます。これをサーバーとして出すか、パッケージ化されたスキルとして出すかの違いについては Claude Skill vs MCP server を参照してください。

Files in this artifact

Download all (.zip)