ooligo
mcp-server

MCP server exposing Attio records and lists to Claude

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

Stack

Claude に対して Attio ワークスペースへの意図的に小さな窓だけを開く Model Context Protocol サーバーです。読み取りはオブジェクトの探索、レコードのクエリ、単一レコードの取得、リストエントリのクエリの 4 つ。書き込みはちょうど 1 つだけで、有効化するまでオフのままであり、有効化しても属性単位で制限されます。チームはチャットで「Q3 のパイプラインリストのうち owner が未設定の企業はどれか」と尋ねれば構造化された答えを得られ、しかもエージェントに CRM を書き換えられるボタンを握らせずに済みます。スキャフォールドはアーティファクトバンドル apps/web/public/artifacts/mcp-server-attio-revops/ にあり、README.mdpyproject.tomlsrc/attio_revops_mcp/server.py の 3 点で、pip install -e . でインストールできます。

何かを作り始める前に次のセクションを読んでください。Attio はすでに同種のものを提供しています。

使うべき場面

Attio は自社の MCP server を https://mcp.attio.com/mcp でホストしています。OAuth で認証するため保管もローテーションもすべき鍵がなく、レコード、リスト、コメント、ノート、タスク、ミーティング、メール、ワークスペース、レポーティングにまたがる 30 以上のツールに加えて SQL ツールも公開し、読み取りは自動承認、書き込みは確認を求めます。大半のチームにとってはそれが正解であり、このスキャフォールドは無駄な作業です。 ホスト版サーバーをインストールし、接続して、先へ進んでください。

自前で作るのは、次の 4 つの条件のいずれかに当てはまるときです。

ユーザー ID ではなくサービスアカウント ID が必要な場合。 ホスト版サーバーはログインした本人の Attio 権限で動きます。共有エージェント(Slack ボット、レポーティングジョブ、チーム全員がトリガーする workflow に組み込まれたもの)が、どの個人よりも厳密に少ない範囲しか見てはいけないのなら、ユーザー単位の OAuth 付与ではそれを表現できません。自分でスコープ集合を選べるワークスペース API キーなら表現できます。

ツールの表面積を絞る必要がある場合。 SQL とメールのセマンティック検索を含む 30 以上のツールは、実際の仕事がパイプラインの質問に答えることであるエージェントに与える権限としては広すぎます。このスキャフォールドが Claude に渡すのは 5 つのツールで、ATTIO_ALLOWED_OBJECTS は読み取りすら指定したオブジェクトに限定します。

書き込みを人間の確認ではなく属性単位の許可リストで制御したい場合。 確認ダイアログの価値は、金曜の 16 時にそれを読む人の注意力ぶんしかありません。ATTIO_WRITABLE_ATTRIBUTES は誰が何をクリックしようとリストにないものをすべて拒否します。

呼び出しログを自社インフラに置きたい場合。 ローカルプロセスは指定した先に書き出します。

ここで価値を得るのは 2 つの役割です。分析の残りが行われているのと同じチャットでパイプラインの質問に答えたい RevOps リード。そして、このシリーズの Apollo サーバーと Salesforce サーバーをすでに導入し、すべての記録システムに対して同じ「読み取り中心」の姿勢を揃えることで、prompt を相互に流用可能に保ちたい GTM エンジニアです。

使うべきでない場面

  • ホスト版サーバーを断る理由がない場合。 上で述べたとおりですが繰り返す価値があります。既定は Attio 自身のサーバーです。こちらは、ユーザー単位の OAuth 付与では形が合わない 4 つのケースのためのものです。
  • Attio Free を使っている場合。 無料プランは最大 3 ユーザーまでです。その規模のワークスペースに共有エージェントの権限問題は存在せず、ホスト版サーバーと OAuth フローがちょうど合います。
  • コンプライアンスが CRM レコードを第三者の LLM に渡すことを禁じている場合。 クエリが返すすべてのフィールドが会話に入ります。氏名、業務用メールアドレス、案件金額、チームが属性として保管しているものすべてです。オブジェクトの許可リストはその集合を小さくしますが、なくしはしません。連絡先データを LLM に一切渡せないのであれば、CRM の上に MCP server を置くこと自体が正しいプロジェクトではありません。
  • 作業が一括クレンジングの場合。 40 件の owner 再割り当ては、ここでは設計上 40 回のツール呼び出しになります。Attio の API に対してスクリプトを書き、diff をレビューして実行してください。バッチ処理にチャットは適したインターフェースではありません。

公開するもの

変更できる範囲で分けた 5 つのツールです。

  • 探索: list_objectsGET /v2/objects を呼び、各オブジェクトの api_slug、単数形・複数形の名詞、そして許可リストに含まれるかどうかを返します。Attio のオブジェクトと属性の slug はワークスペースごとに異なるため、これは推測ではなく最初の呼び出しです。
  • レコードの読み取り: query_records は Attio のフィルターと任意の sorts を付けて POST /v2/objects/{object}/records/query を呼びます。get_recordGET /v2/objects/{object}/records/{record_id} を呼び、人間が開けるようにレコードの web_url を返します。
  • パイプラインの読み取り: query_list_entriesPOST /v2/lists/{list}/entries/query を呼びます。Attio がパイプラインの状態を保持する場所はリストなので、ステージに関する質問は親オブジェクトではなくこちらに向けます。
  • 唯一の書き込み: update_record_attributePATCH /v2/objects/{object}/records/{record_id} を呼びます。1 回の呼び出しで 1 レコードの 1 属性のみ。ATTIO_ALLOW_WRITESATTIO_WRITABLE_ATTRIBUTES 内の {object}.{attribute} エントリ、そして 10 文字以上の justification の 3 つが条件です。

削除ツールも、一括更新も、SQL も、PUT の経路もありません。

エンジニアリング上の判断

スキャフォールドを採用する前に理解しておくべき 4 つの選択です。

PATCH のみ、PUT は使わない。 Attio はレコード更新を 2 つの動詞に分けています。PATCH はマルチセレクト属性の既存値の先頭に値を追加し、PUT は上書きと削除を行います。配線してあるのは PATCH だけです。結果は手続き的ではなく構造的です。このサーバーには既存のマルチセレクト値を消せるコード経路が存在しないため、指示を読み違えた場合の最悪の結果はタグが 1 つ増えることであって、タグが消えることではありません。

レスポンスはモデルに渡る前に絞り込む。 Attio は各属性を active_fromactive_untilcreated_by_actor を持つ値オブジェクトの配列として返します。これはそのフィールドの現在の状態ではなく完全な履歴です。生の形をモデルに渡すと、今日についての質問に答えるためのトークンコストが数倍に膨らみます。_slim_recordactive_until が null のエントリだけを残し、それぞれを中身へと縮めます。

ページサイズの既定値は Attio の 500 に対して 25。 クエリ系エンドポイントの limit の既定値は 500 です。これはデータパイプラインには正しい既定値ですが、10 行が欲しい質問には誤った既定値です。500 件の個人データがコンテキストウィンドウに着地し、その会話の残り全体にわたって居座ります。このスキャフォールドは既定を 25 とし、100 を超える値を拒否します。

書き込みのゲートは 3 つあり、justification はそのうちに含まれない。 実際に書き込みを止めるのは環境変数のフラグと属性の許可リストであり、justification の文字列はログのために存在します。justification だけを信頼する設計は、書き込みを「自信に満ちた読み違え 1 回」の距離に置いたままにします。

コストの実際

3 つの費目があり、大きいのは CRM のシートだけです。

  • Attio のシート。 Free は最大 3 ユーザーまで。Plus は年額請求で $35/ユーザー/月(月額請求では $44)、Pro は年額で $79/ユーザー/月(月額では $99)、Enterprise は見積もりのみ。2026-07-31 に Attio の価格ページで確認しました。API アクセスは別 SKU ではありません。
  • サーバーの自前ホスティング。 Claude Desktop ユーザーごとのローカル Python プロセスは、ノート PC 上ではコストがかかりません。共有サービスとして動かすなら小さい VM 1 台、どのクラウドでも $20-50/月です(推定)。
  • Claude のトークン。 すでに支払っている分です。Claude Pro が $20/ユーザー/月、Max ティアが $100-200/ユーザー/月、または API 従量課金。絞り込んだ 25 件のクエリは数千トークン台に収まります。Claude Opus 5 の公表されている入力トークン 100 万あたり $5 で計算すると、週に 20-30 件の質問をする RevOps リードの API コストは $1/ユーザー/月をかなり下回ります(推定。予算を組む前に自分の payload を測定してください)。

制約はスループットではありません。Attio の REST API は読み取り 100 リクエスト/秒、書き込み 25 リクエスト/秒を許容し、ホスト版 MCP server も同じ読み書きのティアに加えて検索 300 件/分、セマンティック検索・レポーティング・SQL がそれぞれ 2 件/秒を公表しています。チャット主体のワークロードはその 3 桁下で動きます。実際にぶつかる上限はクエリ系エンドポイントのスコアベースの制限で、注意点の項で説明します。

成功の姿

1 か月後の測定可能なシグナルはこうです。「今週パイプラインで何が変わり、その穴は誰の担当か」に答えるのが、Attio を開き、ビューを組み直し、エクスポートして貼り付ける 10 分の作業ではなくなり、1 つの質問と構造化された答えになります。2 つめの、より測りにくいシグナルは「起きないこと」です。誰も「今だけ」と言ってエージェントにより広いトークンを与えません。実際に出てくる質問が、3 つのオブジェクトと 4 つの読み取りツールに収まるからです。

代替案との比較

  • Attio のホスト版 MCP server。 ツールが多く、インフラ不要、鍵ではなく OAuth、書き込み前に確認あり。引き換えに、サービスアカウント単位のスコープ設定、属性単位の書き込み制御、自社の監査保存先を諦めます。これが既定であり、スキャフォールドは例外です。
  • Attio REST API に対する使い捨てスクリプト。 制御は最大ですが、bearer 認証、ページネーション、値履歴の平坦化、429 のハンドリングをチームごとにゼロから作り直すことになります。スキャフォールドはおよそ 400 行で、その 4 つがすでに入っています。
  • ノーコードプラットフォーム(Clay、n8n)。 事前に定義したスケジュール実行のエンリッチメントとルーティングのパイプラインには正しい形です。誰も flow を作り置きしていない場当たりの質問とは別の問題です。両方を動かしてください。繰り返す滝のような処理はプラットフォームで、会話はこちらで。根本の問題がレコードそのものの信頼性であるなら、クエリツールではなく CRM ハイジーン から始めてください。

注意点

  • 広すぎる読み取り。 people に対するフィルターなしの query_records は、数百件の連絡先レコードを会話に引き込みます。ガード:limit は既定 25 で 100 が上限、ATTIO_ALLOWED_OBJECTS は指定していないオブジェクトを遮断し、attributes パラメーターは要求していない列を落とします。
  • クエリのスコアベース 429。 Attio は各クエリを複雑さで価格付けします。sorts、フィルター、オブジェクトの総レコード数がスコアを押し上げ、スコアは 10 秒のスライディングウィンドウで合算されるため、重いクエリは 1 本だけでも拒否されえます。ガード:スキャフォールドは 429 を捕捉し、Retry-After を提示し、スタックトレースではなく具体的な助言(フィルターを絞る、sort を外す)を返します。自動リトライはありません。README の TODO #1 がそれです。
  • キー作成時のスコープ過剰付与。 Attio は連携のスコープをキー作成時に固定し、後からの編集を許しません。そのためチームは一度に全部付与しがちです。ガード:README が各ツールに最小スコープを対応付けており、書き込みをオフのままにするなら record_permission:read-write は一切付与しません。
  • 古くなった属性 slug。 属性 slug はワークスペース固有で、誰かがフィールド名を変えると変わり、その後はハードコードされた prompt が静かに壊れます。ガード:list_objects が文書化された最初の呼び出しであり、エラーは失敗したオブジェクトの slug を明示します。
  • 書き込みの静かな有効化。 誰かが ATTIO_ALLOW_WRITES を切り替え、許可リストを忘れる。ガード:ATTIO_WRITABLE_ATTRIBUTES が空なら、フラグの状態にかかわらずすべての書き込みを拒否します。したがって失敗の方向は「何も起きない」であって「何でも起きる」ではありません。

スタック

  • Attio — CRM。オブジェクト、レコード、リスト、属性
  • MCP Python SDKmcp>=1.2.0 パッケージ。Serverstdio_server、ツールレジストリのデコレーターを提供
  • httpxapi.attio.com/v2 に対する非同期 REST クライアント。Authorization: Bearer で認証
  • Claude Desktop または Claude Code — 自然言語インターフェース、ツールの呼び出し元
  • ATTIO_ALLOWED_OBJECTSATTIO_WRITABLE_ATTRIBUTES — エージェントが何を読め、何を変更できるかを決める 2 つのリスト

Files in this artifact

Download all (.zip)