Skip to content

ma-nakaya/sharepoint-browser-mcp

v0.10.0

Search and read configured SharePoint Online sites with a portable skill that teaches progressive retrieval, citations, and strict read-only boundaries.

SharePoint Browser MCP Server

Entra IDアプリ登録を使用せず、Microsoft Edgeの認証済みセッションからSharePoint Onlineへ読み取り専用で接続するオンプレMCPサーバーです。

Phase 1の認証状態確認、Phase 2の検索・ページ本文取得、Phase 3のファイルアクセス、Phase 4のPDF・Office文書本文抽出、Phase 5のSharePointサイト横断検索、Phase 6の文書構造検索、Phase 7の汎用検索・取得、Phase 8のSharePointリスト項目取得、Phase 9の最大20 MiB文書解析に加え、Phase 10では複数サイトの横断検索・取得に対応します。

目的

  • Entra IDのアプリ登録、Client ID、Client Secret、証明書を使わない
  • 利用者が通常どおりEdgeで完了したSSO・MFAセッションを再利用する
  • 設定済みSharePointサイト群以外へアクセスしない
  • SharePoint REST APIを読み取り専用で利用する
  • Cookie、トークン、Authorizationヘッダーをアプリケーションへ取り出さない

対応範囲

  • TypeScriptのstdio MCPサーバー
  • MCP専用Edgeプロファイル
  • 初回・再認証用のheadedログインコマンド
  • sharepoint_auth_status MCPツール
  • /_api/web/currentuserによる認証確認
  • sharepoint_searchによる設定済みサイト群の横断検索、種類・フォルダー・拡張子・更新日による絞り込み
  • sharepoint_get_pageによるSitePages内の.aspxページ本文取得
  • sharepoint_list_document_librariesによる可視ドキュメントライブラリ一覧
  • sharepoint_list_folderによる直下フォルダー・ファイル一覧
  • sharepoint_download_fileによる許可形式・5 MiB以下のファイル取得
  • sharepoint_extract_document_textによるPDF・DOCX・XLSX・PPTX本文抽出
  • sharepoint_get_document_outlineによるページ・見出し・シート・スライドの構造化
  • sharepoint_search_documentによる1文書内のノード検索
  • sharepoint_get_document_nodesによる選択ノードだけの本文取得
  • searchfetchによる汎用の読み取り専用検索・取得
  • Lists/.../DispForm.aspx?ID=...で表されるSharePointリスト項目の本文取得
  • BrowserContext.requestからページ内fetchへのフォールバック
  • 設定値、URL制約、レスポンス解析、認証判定、検索、ページ、ファイル、文書抽出の単体テスト

対象外

  • リスト項目の汎用取得
  • OCR、画像内文字認識
  • 旧Officeバイナリ形式(DOC、XLS、PPT)
  • 書き込み、アップロード、更新、削除
  • OneDrive
  • 公開HTTP MCPエンドポイントと一般公開プラグイン

動作要件

  • Windows 10またはWindows 11
  • Microsoft Edge
  • Node.js 22以上
  • 対象SharePointサイトへアクセスできる社内ネットワーク
  • 対象SharePointサイトへアクセスできるユーザーアカウント

セットアップ

npm install
Copy-Item .env.example .env

.envを編集します。

SHAREPOINT_SITE_URL=https://tenant.sharepoint.com/sites/example
SHAREPOINT_ADDITIONAL_SITE_URLS=https://tenant.sharepoint.com/teams/another-site
SHAREPOINT_PROFILE_DIR=C:\Apps\SharePointBrowserMcp\edge-profile
SHAREPOINT_HEADLESS=true
LOG_LEVEL=info

SHAREPOINT_SITE_URLは主サイト、SHAREPOINT_ADDITIONAL_SITE_URLSは追加サイトをカンマ・セミコロン・改行区切りで指定します。いずれも同じSharePoint Onlineテナントの/sites/<name>または/teams/<name>である必要があります。テナントルート、OneDrive、任意のURLは受け付けません。 npm run loginnpm run devnpm startは、プロジェクト直下に.envがあれば自動的に読み込みます。

初回ログイン・再認証

npm run login

MCP専用プロファイルでEdgeが起動します。通常どおりSSO・MFAを完了し、対象SharePointサイトが表示されたことを確認してからEdgeを閉じます。

普段利用しているEdgeプロファイルをSHAREPOINT_PROFILE_DIRに指定しないでください。既知のEdge既定プロファイル配下は起動前に拒否します。

検証

npm run check

個別に実行する場合:

npm run typecheck
npm test

MCPサーバーの起動

開発時:

npm run dev

ビルド後:

npm run build
npm start

stdioクライアントの設定例:

{
  "mcpServers": {
    "sharepoint-browser": {
      "command": "node",
      "args": [
        "C:\\Apps\\sharepoint-browser-mcp-server\\dist\\src\\index.js"
      ],
      "env": {
        "SHAREPOINT_SITE_URL": "https://tenant.sharepoint.com/sites/example",
        "SHAREPOINT_ADDITIONAL_SITE_URLS": "https://tenant.sharepoint.com/teams/another-site",
        "SHAREPOINT_PROFILE_DIR": "C:\\Apps\\SharePointBrowserMcp\\edge-profile",
        "SHAREPOINT_HEADLESS": "true"
      }
    }
  }
}

MCPツール

search / fetch

汎用の読み取り専用検索・取得ツールです。searchは設定済みSharePointサイト群から引用可能なページ、リスト項目、対応文書を横断検索し、fetchは返されたIDから対象サイトを選び、本文と引用URLを取得します。

  • search入力: query
  • search出力: idtitle、絶対urlを持つ最大10件のresults
  • fetch入力: searchが返したid
  • fetch出力: idtitletexturlmetadata
  • 対応対象: SitePages.aspxLists直下のDispForm.aspx?ID=...、PDF、DOCX、XLSX、PPTX
  • 規程・規則は文書ファイルとは限らないため、最初に正確な名称をsearchへ渡す

リスト項目取得はdocs/phase-8-list-item-fetch.mdを参照してください。

sharepoint_auth_status

設定済み全サイトに対する現在のEdgeセッション状態を確認します。全サイトが読める場合だけ全体状態をAUTHENTICATEDとし、サイト別状態も返します。

返却する状態:

状態意味
AUTHENTICATEDSharePoint REST APIをユーザーコンテキストで利用できる
LOGIN_REQUIREDログインまたは再認証が必要
ACCESS_DENIEDログイン済みだが対象サイトへの権限がない
SITE_NOT_FOUND対象サイトが存在しない、またはURL設定が誤っている
UNAVAILABLEネットワーク、プロキシ、SharePoint側の障害などで確認できない

MCP結果には、表示名とサイトURLだけを含めます。メールアドレス、ログイン名、Cookie、トークン、レスポンス本文は返しません。

sharepoint_search

SharePoint自身の検索インデックスを使い、設定済み全サイト配下のページとファイルを横断検索します。

  • 必須入力: query
  • サイト限定: 任意のsiteUrl。省略時は全設定サイトを検索
  • 件数・ページング: maxResults(1〜20、既定値10)、startRow(0〜50,000)
  • 対象限定: scopeallpagesdocuments)、任意のfolderUrl
  • 絞り込み: fileExtensions(最大10種類)、modifiedAftermodifiedBefore
  • 並び順: relevanceまたはmodified-desc
  • 出力: タイトル、URL、結果種別、親URL、ファイル拡張子、コンテンツ種別、更新日時、短い要約、ページング情報
  • 複数サイト検索のページングではsiteUrlまたはfolderUrlで1サイトに限定
  • 検索APIの結果に設定サイト群外のURLが含まれても、MCP結果から除外
  • kind=pageのURLはsharepoint_get_page、対応するkind=documentのURLはsharepoint_extract_document_textへ渡せる

sharepoint_get_page

設定済みサイト群のSitePagesライブラリにある.aspxページから、作成済み本文をプレーンテキストで取得します。

  • 入力: 絶対URLまたはサーバー相対URL
  • 出力: タイトル、URL、更新日時、本文、切り詰め有無
  • 本文は最大50,000文字
  • 生のCanvasContent1 HTML、Webパーツ設定、スクリプト、スタイルは返却しない
  • 動的Webパーツが実行時に表示するデータは対象外

sharepoint_list_document_libraries

設定済み全サイト内の非表示ではないドキュメントライブラリと、そのルートフォルダーURLを返します。任意のsiteUrlで1サイトに限定できます。

sharepoint_list_folder

指定フォルダー直下のフォルダーとファイルを、それぞれ最大100件まで返します。

  • 入力: 絶対URLまたはサーバー相対URL、任意のmaxResults(1〜100、既定値50)
  • 出力: 名前、URL、サイズ、更新日時、バージョン、ダウンロード可否
  • 設定サイト群外や直接の子ではない応答項目を除外

sharepoint_download_file

設定済みサイト群内の許可形式ファイルをMCPの埋め込みバイナリresourceとして返します。

  • 最大5 MiB
  • 対応形式: PDF、DOCX、XLSX、PPTX、TXT、Markdown、CSV、JSON、XML、BMP、GIF、JPEG、PNG、WebP
  • 実行形式、スクリプト、HTML、SVG、マクロ有効Office形式、その他の形式は拒否
  • SharePointメタデータと実データのサイズを照合
  • SHA-256をメタデータとして返却

sharepoint_extract_document_text

設定済みサイト群のPDF・DOCX・XLSX・PPTXを取得し、プレーンテキストとして返します。

  • 解析元ファイルは最大20 MiB
  • 抽出本文は最大100,000文字
  • PDFは最大200ページ
  • DOCXは本文、ヘッダー、フッター、脚注、文末脚注を抽出
  • XLSXはシート名とセルの保存値を抽出
  • PPTXはスライド本文と対応可能なスピーカーノートを抽出
  • Office ZIPは最大1,000部品、対象XML 1部品2 MiB、対象XML合計8 MiB
  • PDF内の文書アクションやOfficeマクロは実行しない
  • スキャンPDFのOCR、数式・図形・画像の意味解析、Excel数式の再計算は行わない

sharepoint_get_document_outline

PDF・DOCX・XLSX・PPTXを共通ノードへ変換し、短いプレビューを持つアウトラインを返します。

  • PDFはページ単位
  • Wordは見出し階層と補助部品単位
  • Excelはシート単位
  • PowerPointはスライド単位
  • 各ノードに安定した形式別IDと根拠位置を付与
  • 外部LLM呼び出しやローカルへの自動保存は行わない

sharepoint_search_document

1つのPDF・Office文書内を検索し、関連ノードのID、根拠位置、スコア、短いスニペットを返します。

  • 検索語は1〜200文字
  • 最大20件、既定値10件
  • スコアは同一文書・同一呼び出し内の順位付け専用

sharepoint_get_document_nodes

アウトラインまたは文書内検索で得たノードIDを最大20件指定し、その部分だけの本文を返します。合計本文は最大100,000文字です。前回結果のsha256expectedSha256へ渡すと、探索中に文書が更新された場合は取得を拒否します。

セキュリティ境界

  • 対象は設定済みSharePoint Onlineサイト群のみ(最大10サイト、同一テナント)
  • REST要求は対象サイト配下の/_api/のみ
  • ページ取得は各設定サイトのSitePages配下にある.aspxだけを許可
  • リスト項目取得は各設定サイトのLists/<リスト名>/DispForm.aspxと単一の正の整数IDだけを許可
  • 検索結果URLを再検証し、設定サイト群外の結果を除外
  • 検索対象フォルダー、拡張子、更新日の入力を検証し、検索結果の親URLもサイト境界と照合
  • フォルダー・ファイルURLとSharePoint応答パスを再検証
  • MCP resourceとして返すバイナリは許可形式と5 MiB上限を満たす場合だけ返却
  • PDF・Office文書の解析元ファイルは20 MiBまで許可し、元バイナリ自体はMCP応答へ含めない
  • Office ZIPは展開前後のサイズと部品数を制限し、DOCTYPE・ENTITYを拒否
  • 抽出本文を100,000文字に制限
  • 構造化ノードは最大500件、選択ノードは最大20件
  • 文書アウトライン、文書内検索、選択本文を外部LLMや永続インデックスへ送信・保存しない
  • OneDrive、テナントルート、任意URLを拒否
  • MCPツールは読み取り専用、非破壊、冪等として宣言
  • Cookieやトークンを独自ファイルへエクスポートしない
  • HTTPエラー時のHTML本文を読み取らない
  • ログは標準エラーへ出力し、標準出力はMCPプロトコル専用とする

詳細はdocs/phase-1-authentication.mddocs/phase-2-sharepoint-read.mddocs/phase-3-file-access.mddocs/phase-4-document-text.mddocs/phase-5-site-search.mddocs/phase-6-document-structure.mddocs/phase-8-list-item-fetch.mddocs/phase-9-large-document-processing.mddocs/phase-10-multi-site.mdを参照してください。