以下の内容はhttps://buildersbox.corp-sansan.com/entry/2025/12/24/170000より取得しました。


MCPサーバー開発事例 - Sansan MCPサーバーのPoCから学ぶMCP実装入門

はじめに

こんにちは、コーポレートシステム部の坂尾です。コーポレートエンジニアとして社内システムやインフラに関連する設計・開発・運用を担当しています。
はじめに部門について簡単に紹介させていただきます。私が所属するのはコーポレートシステム部という部門で、いわゆる情報システム部門(情シス)です。部のミッションとして掲げているのが「EXをシンプルにする」というものです。EXとはEmployee Experience(従業員体験)のことです。
我々のチームでは生成AIの活用推進や組織的なナレッジの共有に取り組んでいます。今回の記事のテーマは、Sansan MCPサーバーを開発した話です。Sansan MCPサーバーは生成AIがSansanのデータへアクセス可能となるよう設計されたプロダクトです。

本記事では主にSansan MCPサーバーについて技術的なトピックを取り上げ、大きく2つの内容から構成しています。Sansan MCPサーバーについての紹介と、MCPサーバー開発ノウハウの説明です。興味に合わせて好きな箇所から読んでください。この記事を読んでいただいて少しでも参考にして頂けたら幸いです。

また、Sansan MCPサーバーのトライアル導入開始を発表しました。ぜひ次のニュースリリースも併せてご覧ください。
jp.corp-sansan.com

目次

背景

MCPとはなにか

Sansan MCPサーバーについて触れる前に、まずMCPについて解説します。MCP(Model Context Protocol)は生成AIが外部システムに接続するための標準規格です。Microsoft CopilotやChatGPT、Claudeなどから接続することで生成AIの機能を拡張できます。たとえば外部データを参照したり、特定の処理を実行してAIに結果を返したりする機能を持ちます。生成AIは学習したデータに基づいて回答を生成しますが、MCPを接続することでより高度な回答を生成できます。

Sansan MCPサーバーの価値

近年では生成AIを業務に取り入れる動きが各社で加速しています。生成AIを使用することでメール文面の作成や議事録の要約などの業務効率化に一定の成果を得られることが広く知られています。一方で業務への導入度合いや効果は企業ごとに異なるのが現状です。また、生成AIは学習済みのデータに基づいて回答を生成しますが、業務でより効果的に活用するためには企業独自のデータを活用することが重要です。
Sansanは名刺や企業情報、営業履歴を一元管理するビジネスデータベースです。名刺交換やメールのやりとり、商談の記録など、取引先との接点情報が日々の業務を通じて蓄積されています。生成AIがSansanのデータへアクセスできるようになれば、生成AIによりビジネスデータを検索・分析したり、営業活動を支援できるようになったりします。

Sansan MCPサーバーにより、これまでSansanで氏名や会社名から名刺を検索していたユーザーの体験は変化します。生成AIに「A社と前回交換した名刺をすべて教えて」といったように自然言語で指示すれば、名刺情報を取得して読みやすい内容に加工して表示できます。
さらに、生成AIがSansan以外のデータにアクセスできる場合、相乗効果が期待できます。たとえば生成AIでGoogleカレンダーなどのスケジュールアプリケーションと接続をしておけば、生成AIに「今日の商談予定の企業との過去の接点を教えて」と指示することで、カレンダーの予定を参照した結果を元にSansanのデータから名刺情報を取得するといったような効率的な商談準備が期待できます。
このような営業支援を実現するために、Sansanのデータにアクセス可能な仕組みとして「Sansan MCPサーバー」を開発しました。

Sansan MCPサーバーの価値

開発の背景

Sansanは営業活動をはじめとするさまざまな業務のスピードと質の向上を実現するため、生成AIを活用したソリューションの提供を進めています。
この一環として、Sansan MCPサーバーはPoC(Proof of Concept)として開発がスタートしました。PoCとは、新しい概念や技術を実際に試してみることを目的とした試験的な取り組みのことです。このPoCのあとにはトライアルという形で実際のお客様にご利用いただき、フィードバックを得ることでより効果的なプロダクトとなることを目指しています。

SansanのAI活用の取り組みについて詳しくは次のニュースリリースをご覧ください。
jp.corp-sansan.com

ここで私がPoCに関わった経緯に触れておきます。
Sansan MCPサーバーのPoCでは部門横断的なプロジェクト体制が構築されました。プロジェクト発足時の会議にはCTOやVPoPをはじめ各所からメンバーが招集され、私もその一人です。私はコーポレートシステム部門に所属していることもあり、エンジニアとしてインフラ面での支援を期待されていたのだと思います。会議ではPoCの大まかな方針とプロダクトのビジョンが共有され、各担当領域からアイデアを出し合いました。会議の話を聞くうちにSansan MCPサーバーのイメージが私自身の中で明確になり、実際に動作するものを作ってみたくなりました。
会議が終わるとさっそくMVP(Minimum Viable Product)の実装に着手し、その日のうちに実装を完了させることができました。プロジェクトメンバーにMCPが動作する様子のスクリーンショットを共有したところ、非常に良い反応をもらいました。これがきっかけとなり、私はSansan MCPサーバーの開発担当として本格的に携わることになりました。このような関わり方ができたのは、自発的な挑戦が受け入れられるSansanの文化によるものだと思います。
その後はプロジェクトメンバーを始めとする多くの支援の下で開発を進めました。部署の垣根を越えた協力体制により開発は順調に進み、一定の品質に達したためトライアルとしてお客様にリリースできました。

MCPサーバーの全体像

Sansan MCPサーバーの基本機能

Sansan MCPサーバーは生成AIがSansanのデータにアクセスできるようにするためのプロダクトです。Microsoft CopilotやChatGPT、Claudeなどから接続することで生成AIの機能を拡張できます。
Sansan MCPサーバーはMCPのTools(ツール)と呼ばれるものを実装することで実現しています。ツールはAIが外部システムと対話することを可能にするもので、コードを実行したり、AIの学習データに含まれていないデータへアクセスする機能を提供します。

Sansan MCPサーバーが備えているツール機能は次の通りです。

  • 名刺情報取得
  • 企業情報取得
  • コンタクト情報取得
  • ユーザー情報取得

次の画像はMicrosoft CopilotからSansan MCPサーバーに接続して、名刺情報を取得する実際の様子を示したものです。

Sansan MCPサーバーの基本機能

アーキテクチャ

Sansan MCPサーバーはSansanデータへアクセスする機能を実現するために、Sansan APIを利用しています。また、要求されるパフォーマンスを満たすためにAPIではなくBigQueryを利用したデータの保管と取得を実装している箇所もあります。
また、顧客に提供するための本番運用環境はOrbitという全社規模で提供される共通基盤にデプロイして動作させています。OrbitはGoogle Kubernetes Engineをベースにしています。デプロイがしやすいこと、性能やスケーラビリティがあること、セキュリティの担保など本番運用に適した環境であることから決定しています。

Orbitについて詳しくは次の記事をご覧ください。
buildersbox.corp-sansan.com

Sansan MCPサーバーのアーキテクチャ全体像は次の通りです。

Sansan MCPサーバーアーキテクチャ

開発アプローチ

Sansan MCPサーバーはPoCという性質上、特にスピード感が求められます。そのためにもAIを活用した開発手法を採用しました。ここではその開発手法について簡単に説明します。

使用したツールと開発手法

まず、主に使用したAIツールとその用途について説明します。

ツール名 説明と主な用途
Cursor / Visual Studio Code 統合開発環境(IDE)、生成AIによるコーディング支援
Vibe Kanban AIにより自律的かつ並列開発するツール、カンバン型タスク管理
Claude Code コーディング支援
CodeRabbit AIによるコードレビュー・修正提案

IDEは主にCursorを使用していました。Vibe KanbanはClaude Codeなどのエージェントを用いて自律的な開発を支援するツールです。プロジェクト中盤から後半にかけて採用し、並列実装により開発スピードを上げています。Vibe Kanbanを使うとタスクをカンバン上に登録するだけでAIにコーディングを指示でき、git worktreeで環境を分離することで並列実装を可能にします。
CodeRabbitはAIによるコードレビューツールで、GitHubのプルリクエスト上で自動的にコードレビューして、修正提案をしてくれます。コードレビューツールの中でもCodeRabbitはレビュー精度が高く、人的レビューコストを大幅に削減できました。

開発手法の1つに、Spec Driven Development(SDD)を採用しました。SDDは、仕様書を作成しその仕様書に従って開発を進める手法です。SDDを採用することで、生成AIによる自律的な開発における成果物の精度を高めることができると考えています。
また、Vibe Kanbanを使用して生成AIによる自律的な開発をしているという点でVibe Codingも実践していたと言えるでしょう。

これらのツールや手法を組み合わせることで、開発をより効率的に進めることができました。

Cursorでの開発例

Vibe Kanbanでの開発例

開発プロセス

MCPサーバー開発初期の基礎的な実装は私自身がコーディングしていますが、途中から生成AIによる自律的なコーディングにウェイトをおいています。さらに、生成AIにコーディングさせるときには原則的にSDDやTest Driven Development(TDD)とTidy Firstを実践するような指示を与えています。他にも生成AIの成果物の精度を高める方法やテクニックはいくつかありますが、本記事の主題ではないため割愛します。

基本的な開発プロセスは次の通りです。

  1. チャットや会議の内容から要件や修正内容を整理する
  2. Vibe Kanbanでタスクを作成する
  3. Vibe Kanbanのエージェント(主にClaude Code)でPlanまたはマークダウンの設計書を作成させる
  4. Vibe Kanbanで設計内容をレビューし、問題なければ実装をエージェントに依頼
  5. 実装が完了したらVibe KanbanからCursorを起動し実装の確認・動作確認・軽微な修正を行い、想定仕様と挙動が大きく異なっていた場合はVibe Kanbanで指示して修正を依頼
  6. Vibe Kanbanからプルリクエストの発行
  7. GitHubのプルリクエスト上でCodeRabbitが自動レビューする。問題があれば修正をVibe Kanbanで依頼し、問題がなくなるまで繰り返す
  8. 問題なければマージ

このようなプロセスを並列で実行し、繰り返すことでSansan MCPサーバーの機能を拡張していきました。
また、ある一定の間隔でKubernetesのステージング環境にデプロイし、Microsoft CopilotなどのMCPホストから動作の正常性を確認していました。

MCPサーバーの開発ノウハウ

前提

ここでは、Sansan MCPの開発に利用した技術や、MCPサーバー開発の基礎的なポイントを紹介します。みなさんのアイデアから、便利なMCPサーバーがたくさん生まれていくとうれしいです。
MCPサーバーには機能としてTools、Resources、Promptsなどがありますが、本記事ではSansan MCPの主要な機能であるTools(ツール)のみ解説します。
また、記載しているコマンドや設定はすべてMac環境を前提としたものになります。Windows環境では適宜読み替えてください。

用語について

Sansan MCPサーバーについて解説するにあたり、MCP関連の用語について整理しておきます。適宜参照してください。

用語 説明
MCP MCP(Model Context Protocol)は生成AIが外部システムに接続するための標準規格です。たとえば外部データを参照したり、特定の処理を実行してAIに結果を返したりする機能を持ちます。
MCPサーバー MCPを実装したサーバーアプリケーションです。
MCPクライアント MCPサーバーに接続するクライアントアプリケーションです。
MCPホスト MCPクライアントを使ってMCPサーバーに接続するホストアプリケーションです。たとえばClaudeやIDE(CursorやVS CodeのCopilot)やMicrosoft Copilotなどのことを指します。

使用する言語とフレームワーク

MCPサーバーを開発するためのフレームワークにはFastMCPを使用します。FastMCPは現時点ではデファクトスタンダードといえるもので、効率的にMCPを開発できます。公開されているMCPサーバーの中にはNode.jsで開発されているものありますが、ここではPythonを使用します。
gofastmcp.com

余談になりますがFastMCPのドキュメント自体もMCPとして公開されているので、Cursorなどから接続して開発に利用することもできます。
https://gofastmcp.com/mcp

さて、FastMCPはライブラリとして配布されているためインストールも簡単です。uvを利用している環境では次のようにインストールします。

uv add fastmcp

FastMCPを使用した場合、次のコードだけでツールが実装できます。このコードは公式ドキュメントに記載されているものとほぼ同一のものです。

from fastmcp import FastMCP

mcp = FastMCP("MCP Server")

@mcp.tool
def add(a: int, b: int) -> int:
    """2つの数字を足し算します"""
    return a + b

if __name__ == "__main__":
    mcp.run()

ポイントはデコレータとなる@mcp.toolで、装飾することで自動的に関数がツールになります。例えばここではaddという関数名でint型の引数を2つ受け取り、足したものを返却する実装になっています。MCPサーバーを起動すると、MCPホストからはaddというツールが利用できる状態となります。また、docstring(「2つの数字を足し算します」のコメント箇所)は自動的にツールの説明として使用されるなど、FastMCPでは実装の簡略化が図られています。

前述のコードをmain.pyとして保存した場合、次のようにMCPサーバーを起動します。

uv run fastmcp run main.py

FastMCP起動

この方式ではデフォルトでstdioという通信方式を使用しています。停止する場合はCtrl+Cを入力します。
では実際にツールとして動作しているところを見てみましょう。MCPサーバーを一度停止し、次のようにコマンドを変えて実行しなおします。

uv run fastmcp dev main.py

runという箇所がdevに変わっています。これはMCPサーバーと同時にMCP Inspectorを起動する開発モードです。MCP InspectorとはMCPサーバーをデバッグするツールのことで、ブラウザからMCPサーバーの挙動を確認できます。

開発モードで起動すると次のような出力が得られます。表示されているURLにブラウザでアクセスします。

🔗 Open inspector with token pre-filled:
   http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=****

MCP Inspector起動

MCP Inspectorの画面で、Transport TypeをSTDIOと選択し、Connectをクリックします。
Toolsタブに移動し、List Toolsをクリックすると、実装済みのツールが一覧されます。今回はaddツールのみ表示されます。

ツール一覧表示

addツールを選択し、aとbの入力欄に数字を入力し、Run Toolをクリックするとツールが実行されます。例えばaに3、bに7を入力すると結果として10が出力されます。

addツールの実行

通信方式について

MCPサーバーとMCPクライアント間の通信にはstdioとStreamable HTTPという2つの方式が用意されています。stdioは標準入出力を指し、クライアントがMCPサーバーを起動する方式となっていてマシン内で直接通信します。Streamable HTTPは複数のクライアントがサーバーに接続できる方式となっていて遠隔地から通信できます。SaaSが提供するMCPサーバーの多くはStreamable HTTPです。SSEという方式もありますがこちらは現在非推奨となっています。

通信方式 説明 利用ケース例
stdio 標準入出力を利用します。クライアントがMCPサーバーを直接プロセスとして起動し、通信します ローカル環境での起動、開発環境での動作確認などに適しています
Streamable HTTP MCPサーバーはHTTPで待受し、複数クライアント・遠隔地から接続可能です。 リモート接続する場合、サービスとして本番稼働させる場合に適しています

MCPサーバーをサービスとして提供する場合は基本的にStreamable HTTPで起動することになります。
MCPサーバーをOSSとして配布してユーザーに利用してもらう場合や、開発環境で動作を確認する場合は次のような使い方になるでしょう。

  • MCPホストの設定ファイルでstdioを指定して起動する
  • MCP Inspectorでstdioを指定して起動する
  • Streamable HTTPで起動し、MCP Inspectorから接続する

なお、FastMCPを使用している場合、通信方式の切り替えは起動オプションで指定できます。デフォルトではstdioですが、--transport-t)オプションでhttpを指定することによりStreamable HTTPで起動します。この時--port-p)でポート指定、--host0.0.0.0を指定することでマシン外からの接続を許可します。

Streamable HTTPで起動する例:

uv run fastmcp run main.py -t http -p 8000 --host 0.0.0.0

デバッグ方法

開発中のMCPサーバーの動作確認はMCPホストから繋ぐ方法と、AIを使用せずにMCPサーバーの挙動を確認できるMCP Inspectorを使用する方法があります。
MCPホストから繋ぐ方法は、AIがMCPサーバーを利用するときの実際の挙動を確認できるため重要な検証方法である一方で、AIの入出力のゆらぎが検証の妥当性に影響を与えることもあります。また、自然言語を用いるよりも入力値を直接MCPに渡せれば素早く検証できることもあります。たとえばint型の引数を入力するようなMCPツールの検証において、「3と5を足してください」という指示をAIに与えてAIからMCPサーバーを呼び出してもらうより、人間が3と5をMCPサーバーに直接与えられたほうが簡単に動作確認ができます。

MCPホストを使用する場合、次のような流れになります。
1. 人間の自然言語の指示
2. MCPホスト(クライアント)が指示を解釈してMCPサーバーのツールを利用するか判断
3. MCPホストはツールが期待するパラメータに変換してMCPサーバーに送信する

MCP Inspectorを使用する場合、次のような流れになります。
1. MCP InspectorのUIから、人間がツールを選択する
2. 人間がツールのパラメータを入力して送信する

MCP Inspectorを起動する方法は、前述のMCPサーバー起動時のfastmcp devというコマンドで起動する方法と、個別に起動する方法があります。

個別に起動する場合は次のコマンドを実行してください。実行にはnpx(Node.js)が必要です。

npx @modelcontextprotocol/inspector

MCP Inspectorについて詳しくは次のページを参考にしてください。
modelcontextprotocol.io

MCPホストから繋げる方法

MCPホストから繋げる一般的な方法を記載します。
ここで、MCPサーバーのソースコードパスが/path/to/mcpserver、起動ファイルがmain.pyである場合とします。
また、Streamable HTTPで起動した場合のURLがhttps://mymcpexample.com/mcp/であるとします。ローカルで起動している場合はURLがhttp://localhost:8000/mcp/などの形式になります。

Claude Desktopから接続する

Mac版のClaude Desktopでは~/Library/Application Support/Claude/claude_desktop_config.jsonに設定します。

stdioを使用する例:

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcpserver",
        "run",
        "fastmcp",
        "run",
        "main.py"
      ]
    }
  }
}

Claude Desktopでは執筆時点でリモート接続する手段が提供されていないため、Streamable HTTPを使用する場合はmcp-remoteというパッケージを使用して接続します。mcp-remoteはnpmで配布されています。
詳しくは次のページを参考にしてください。
https://www.npmjs.com/package/mcp-remote

Streamable HTTPを使用する例:

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mymcpexample.com/mcp/",
        "--transport",
        "http-only"
      ]
    }
  }
}

設定を保存後、Claude Desktopを再起動してください。
commandで呼び出すuvは、絶対パスで記載しないとエラーになる場合があります。

Cursorから接続する

stdioを使用する例:

{
  "mcpServers": {
    "my-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcpserver",
        "run",
        "fastmcp",
        "run",
        "main.py"
      ]
    }
  }
}

Streamable HTTPを使用する例:

{
  "mcpServers": {
    "my-mcp-server": {
      "url": "https://mymcpexample.com/mcp/"
    }
  }
}

Microsoft Copilotから接続する

Microsoft CopilotからMCPサーバーを使用する場合はMicrosoft Copilot StudioでのMCPオンボードウィザードを利用する方法やPower AppsでカスタムMCPコネクタを作成する方法が提供されています。
詳しくは次の公式ドキュメントを参考にしてください。
learn.microsoft.com

ツールの基本的な実装方法

MCPサーバーのツール実装について解説します。ここではツールの実装方法として次の2つを紹介します。

  • OpenAPI統合
  • 独自のツール実装

Sansan MCPサーバーでは両方を組み合わせて実装しています。

OpenAPI統合

OpenAPIをMCPのツールとして実装したい場合は、FastMCPのOpenAPI統合という仕組みにより実装を簡略化できます。OpenAPIというのはREST APIの仕様を記述するためのオープンな標準フォーマットのことで、多くのSaaSが自社サービスをAPI化する際に採用しています。OpenAPIは一般に公開されていることも多く、SaaS利用者がAPIを利用する際のドキュメントとして使用されます。OpenAPI統合は、SlackやNotionといったようなサービスでもAPIが公開されてさえいればMCPサーバーを簡単に作ることができるというものです。
Sansanには契約している顧客向けに提供されているAPIサービスがあります。このAPIはOpenAPIで実装されているため、Sansan MCPではこれを用いてツールの一部を実装しています。

注意
本記事の解説は広く技術を共有する目的で記載しています。当社からの許可があるまでSansan APIを利用したMCPサーバーの実装や利用はご遠慮ください。理由としてSansan APIは顧客向けに公開されているサービスですが、執筆時点で社外のMCPサーバーからの利用を前提として設計されていないためです。
なお、当社以外のOpenAPIやAPIサービスを利用してMCPサーバーを実装される場合は、利用規約の範囲内でご自身の責任においてご利用いただき、万一トラブル等が発生した場合でも当社は一切の責任を負いかねますので、あらかじめご了承ください。

OpenAPI統合について詳しくは次のページを参考にしてください。
https://gofastmcp.com/integrations/openapi

また、OpenAPI統合を利用したMCPサーバーの構築には一定の懸念があります。それは、人間向けに設計されたREST APIをLLMエージェントにそのまま渡すとエージェントのパフォーマンスを悪化させる、という主張です。
詳しく知りたい方は次の記事を参照してください。
www.jlowin.dev

しかし、OpenAPIを用いることでMCPサーバーの実装コストは大幅に減少することも事実です。Sansan MCPサーバーではPoCであるという前提のもとにOpenAPIを積極的に活用して迅速な開発をしました。

OpenAPI統合での実装例は次の通りです。このコードは公式ドキュメントに記載されているものを引用しています。

import httpx
from fastmcp import FastMCP

# Create an HTTP client for your API
client = httpx.AsyncClient(base_url="https://api.example.com")

# Load your OpenAPI spec 
openapi_spec = httpx.get("https://api.example.com/openapi.json").json()

# Create the MCP server
mcp = FastMCP.from_openapi(
    openapi_spec=openapi_spec,
    client=client,
    name="My API Server"
)

if __name__ == "__main__":
    mcp.run()

ここで、https://api.example.com/openapi.jsonというのがOpenAPIの仕様書のURLです。これはスキーマ定義と呼ばれます。例ではスキーマ定義をインターネットから取得していますが、ローカル環境下のファイルを読み込んで使用することもできます。

このMCPサーバーを起動するとスキーマ定義されているAPIエンドポイント単位でツールが構築されます。ツールは自動的にAPIを実行するクライアントとして動作し、APIのレスポンスをMCPクライアントに返却します。
たとえばアイテムを管理するAPIがあったとします。このAPIではアイテムを登録・取得・削除でき、そのための/itemsというエンドポイントが存在します。この/itemsで受信したGETやPOSTといったHTTPメソッドによってAPIは処理を変えます。GETではアイテム取得、POSTではアイテム登録ですね。OpenAPI統合を使うと、この「アイテムの取得」や「アイテムの登録」といった単位でツールが作成され、MCPホストから呼び出すことが可能になります。
APIではパラメータを受け取ることで細かな制御をしますが、これもスキーマ定義を元に自動的にツールの引数として使用できます。
この機能を使わずにOpenAPIのスキーマ定義相当のツールを作成する場合、エンドポイントとそのHTTPメソッドの数だけ関数を作成して@mcp.toolで装飾する必要があるため、APIの定義が多いほど実装コストが高くなります。

ツール実装

OpenAPI統合以外にもツールを実装する方法があります。前述の通り、関数を@mcp.toolで装飾することによりツール化する方法です。

@mcp.tool
def add(a: int, b: int) -> int:
    """2つの数字を足し算します"""
    return a + b

この方法では自由にツールの処理を実装できます。MCPサーバーに求められるビジネスロジックを組み込んでツール化することも、外部データベースからデータを取得する処理を実装することもできます。

ツール実装について詳しくは次のページを参考にしてください。
https://gofastmcp.com/servers/tools

OpenAPI統合を使用していたとしてもToolsの実装は同居可能です。Sansan MCPでは名刺検索ツールを提供しているのですが、他ツールに比べて要求されるパフォーマンスが高く設定されていたため、OpenAPIを使用せずBigQueryからデータを取得するツール実装をしています。一方でコンタクト情報や組織情報の取得など比較的パフォーマンスが求められないと想定されるツールはOpenAPI統合を使用しています。

Tips

OpenAPI統合におけるルートマッピング

OpenAPI統合での実装は非常に簡単ですが、すべてのエンドポイントをツール化したいとは限りません。あるいはエンドポイントによってツール化したいHTTPメソッドも異なります。たとえば管理者設定はツールとして提供したくない場合や、取得はできても良いが変更や削除はさせたくない、といった場合があります。これを制御する仕組みとしてルートマッピングが用意されています。
ルートマッピングについて詳しくは次のページを参考にしてください。
https://gofastmcp.com/integrations/openapi#route-mapping

次の例は、すべてのエンドポイントでGETメソッド以外はツールから除外し、管理者向けエンドポイント(/admin)はツールから除外する設定です。

mcp = FastMCP.from_openapi(
    openapi_spec=spec,
    client=client,
    route_maps=[
        # すべてのエンドポイントで`GET`メソッド以外はツールから除外する
        RouteMap(
            methods=["POST", "PUT", "DELETE", "PATCH"],
            pattern=r".*",
            mcp_type=MCPType.EXCLUDE,
        ),

        # 管理者向けエンドポイントはツールから除外する
        RouteMap(
            pattern=r"^/admin/.*", 
            mcp_type=MCPType.EXCLUDE,
        ),
    ],
)

OpenAPI統合におけるMCPクライアントのヘッダの取り扱い

認証などの目的でMCPサーバーへの通信にヘッダを付与する場合があります。たとえばSansan APIでは認証用トークンをヘッダで受け取る仕様になっており、クライアントからはトークンを送信してもらうことでアクセスコントロールします。OpenAPI統合でMCPサーバーを実装した場合、クライアントからのヘッダ情報は自動的にOpenAPIリクエストで使用されます。このためOpenAPIへ送るヘッダを取り扱う独自の実装は不要です。

MCPリクエストの高度なカスタマイズ

MCPサーバーを開発するとクライアントからのリクエストをカスタマイズしたい場合があります。ログの記録や監視、認証と承認、レートリミット、キャッシュなどです。たとえば特定のツール利用時にリクエストを書き換えたい場合もあるでしょう。こういった場合にミドルウェアという仕組みを使用します。ミドルウェアはMCPサーバーを通過するMCPリクエストとレスポンスを柔軟に変更できます。
Sansan MCPサーバーのOpenAPI統合でもミドルウェアを活用しています。特定のMCPホストからのリクエストパラメータが、Sansan APIが要求する形式にならないことがあり、MCPサーバー内でパラメータ形式を変換してから処理できるようにミドルウェアを用いて実装しています。

ミドルウェアについて詳しくは次のページを参考にしてください。
https://gofastmcp.com/servers/middleware#mcp-middleware

コンテナ化の例

MCPサーバーをコンテナ化したい場合には例として次のDockerfileを参考にしてください。

FROM python:3.12-slim-bookworm
WORKDIR /app
COPY main.py /app
RUN pip install fastmcp
EXPOSE 8000
ENTRYPOINT ["fastmcp", "run", "main.py"]
CMD ["--transport", "http", "--host", "0.0.0.0"]

次のコマンドでビルドして起動し、ポートを確認します。

docker build -t my-mcp .
docker run -d -P --name mcp my-mcp
docker port mcp
# ここでは 8000/tcp -> 0.0.0.0:32769 と表示されたとします。この場合ポート番号は32769です。

MCP Inspectorを起動し、Transport TypeをStreamable HTTPに、URLをhttp://localhost:32768/mcpに設定してConnectをクリックするとMCPサーバーに接続できます。

停止する時は次のコマンドを実行します。

docker rm -f mcp

ステートレスにする

MCPサーバーをKubernetesのPodとして起動するなど、クライアントからのアクセスがロードバランスするような環境で注意したいのがセッションです。FastMCPで実装したMCPサーバーはデフォルトでクライアントとのセッション確立時にIDが付与され、以降は通信時にそのIDを送信します。MCPサーバーが複数動作する構成では別のMCPサーバーが発行したIDを受け付けられず、結果として通信が不安定になります。FastMCPにはFASTMCP_STATELESS_HTTPという環境変数が用意されており、こういった場合にはtrueに設定することでセッションID生成が抑制されます。

これでMCPサーバー開発のノウハウは以上です。

おわりに

さて、いかがでしたでしょうか。今回はSansan MCPサーバーの解説と、MCPサーバー開発のノウハウを紹介しました。
しかし開発はこれで終わりではありません。Sansan MCPサーバーはSansanのAIソリューションのひとつの柱として今後も拡張を続け、本番提供に向けてさらなる機能向上を進めていきます。

読者へのメッセージ

この記事を読んで、私たちの取り組みに少しでも共感していただけたなら、ぜひ一度カジュアルにお話ししませんか?チームや業務内容、今後の展望について、ざっくばらんにご紹介できれば嬉しいです。
最後までお読みいただき、ありがとうございました。

Sansan技術本部ではカジュアル面談を実施しています

Sansan技術本部では中途の方向けにカジュアル面談を実施しています。Sansan技術本部での働き方、仕事の魅力について、現役エンジニアの視点からお話しします。「実際に働く人の話を直接聞きたい」「どんな人が働いているのかを事前に知っておきたい」とお考えの方は、ぜひエントリーをご検討ください。




以上の内容はhttps://buildersbox.corp-sansan.com/entry/2025/12/24/170000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14