📝

Mastraを参考にドキュメントMCPサーバーを作ってみた

に公開

最近「microCMS Document MCPサーバー」を作って公開しました。

以前作ったmicroCMS MCPサーバーとは違い、これは公式ドキュメントをLLMに参照してもらうためのMCPサーバーです。
この記事ではDocument MCPサーバーの必要性や実装方法についてまとめてみます。

Document MCP Serverってなに?

みなさんMastraは使っているでしょうか?
TypeScriptでAIエージェントを作れるフレームワークなんですが、面白いのがセットアップ時に自動でMastra MCPサーバーがCursorやClaude Codeに追加されます。

このMCPサーバーはMastraのドキュメントやブログなどの公式情報を参照するもので、Mastraを使って開発していく際にはとても有用です。この体験がとても良いなと思い、真似して作ってみたというのが今回の背景です。

ドキュメントへのアクセスを提供するものだとContext 7が人気ですが、これは有名ライブラリだけが集められています。それぞれのSaaSが公式で自社のDocument MCPサーバーを提供していくのはトレンドになるのではないかと思っています。

作ったもの

https://github.com/microcmsio/microcms-document-mcp-server

microCMSのドキュメントの内容をLLMに伝えるためのMCPサーバーです。

このMCPサーバーで何が変わるのか、具体例を見てみましょう。
例えば、 「コンテンツの作成者をAPI経由で変更できますか?」 という質問をClaudeでしてみます。

正しい答えは「できる」なんですが、MCPサーバーなしでは間違った内容が回答されてしまいます。

Claude Desktopの画面。MCP無しの場合、「できない」と答えてしまう
間違えた内容をこねくり回して伝えてくる

ドキュメントMCPサーバーをセットして同じ質問をしてみましょう。

Claude Desktopの画面。MCPが利用され、正しい回答がなされている
正確な内容を教えてくれる。curlでのサンプルリクエストを示してくれるなど手厚い

正しい回答が得られ、さらに補足のテキストも詳細です。

メッセージの最後には回答の根拠に使ったドキュメントへのリンクが追加されています。LLMの回答に不安がある場合はユーザーが自身の目で確認することができます。


回答の根拠となったドキュメントのURLも伝えてくれる


MCPサーバーはこちらのドキュメントの内容をベースに回答しています。
https://document.microcms.io/

なぜDocument MCPサーバーが必要なのか?

microCMSは日本製のヘッドレスCMSで、2019年リリースなのでもう6年弱ほど運営されています。
多くの方が使ったり記事にしてくれてるおかげで基本的な使い方はLLMの知識に含まれていますが、複雑な使い方・最新の機能については回答の精度は十分ではありません。

最近のAIエージェントの多くはWeb検索をサポートしています。しかし古い記事を参考にしてしまったりドキュメントの内容を正しく読めなかったりするケースも多く、やはり精度に不安が残ります。

ドキュメントMCPサーバーを使うことで「最新で」「正確な」内容をLLMに提供し、回答の精度を高めることができます。

仕組み

このDocument MCPサーバーの実装の中身がどうなってるかを紹介します。

コンテンツをマークダウンにしてMCPサーバー内に保持

まず情報ソースですが、ドキュメントの内容をマークダウンに変換してローカルに保存しています。
例えば以下のような内容です。

Cursorでマークダウンファイルが開かれている。ドキュメントの内容が表示されている
ドキュメントの内容をマークダウンに変換

こんな感じで本文をマークダウンで記述し、メタ情報としてコンテンツIDとディレクトリ名を持たせています。

ディレクトリは4つあり、ドキュメントサイトの階層に合う形で分類されています。

  • manual - microCMSの機能の詳細や管理画面の操作方法など
  • content-api - コンテンツAPIのリクエスト形式、パラメータなど
  • management-api - マネジメントAPIのリクエスト形式、パラメータなど
  • image-api - 画像APIの使い方など

GitHubのディレクトリ画面。マークダウンファイルが4つにフォルダ分けされている
ディレクトリ構造。4つのディレクトリの下にファイルが分類されている

ドキュメントの1ページ = 1ファイル の形で保持しています。
工夫として、ドキュメント共通で常に読み込んで欲しい知識を docs/general.md に記載しています(後述)。

3つのツールを定義

1. ファイルのインデックスを返すツール list_documents

「ファイル名の一覧を返す」ツールです。

manual content-api management-api image-api が指定されたらその配下のファイルを、指定がなければすべてのファイル名を返します。

AIエージェントはファイル名のリストから、ユーザーの質問に答えるために必要なファイルはどれかを判断します。

2. ファイルの詳細を返すツール search_document

「ファイルの詳細を取得する」ツールです。

1のツールから得たファイル名を指定し、そのファイルの内容をマークダウンで取得します。
AIエージェントはドキュメントの内容を読み、それに基づいてユーザーへ回答します。

3. microCMSの共通情報を返すツール fetch_general

「microCMSの一般的な情報を取得する」ツールです。

  • APIのリクエスト方法
  • 回答の末尾には根拠としたドキュメントのURLを示すこと
  • 管理画面のURLを提示する場合はどのように構築するか

など、常にLLMに把握しておいて欲しい内容を読み込んでもらいます(docs/general.md に書いている)。

1と2のツールの説明の中に「まだ fetch_general で全体情報を取得していない場合は、最初に fetch_general を実行してください」と書いており、どのツールが発動する際でも読み込まれるようになっています。

3つのツールが使われる様子

microCMSに関する質問や指示を受けると、

  1. fetch_general で共通情報を読み込み
  2. list_documents でファイルのリストを取得
  3. search_document で必要なファイルを読み込み
  4. 読み込んだ知識に基づいて回答

という流れで進みます。

Cursorの指示の様子。ツールが順番に呼ばれている
Cursorの指示の様子。ツールが順番に呼ばれている

使い方

MCPを設定後、microCMSに関する質問をすると自動でツールが利用されます。

microCMSの仕様について質問する例

microCMSで、下書きで登録済みのコンテンツをAPI経由で公開したい。
どのようなリクエストを送ればいい?

あるいは、メッセージの末尾に use microcms-docs-mcp と書けば強制的に発火させられます。

microCMSのドキュメントを読みながら実装してもらう例

microCMSで、特定の日付以降に更新されたコンテンツの一覧を取得するスクリプトを作ります。

- 環境変数でサービスIDとAPIキーを指定
- コマンドライン引数でAPIエンドポイントと基準となる日付を指定
- 結果は整形して表示

言語はJavaScriptでお願いします。

use microcms-docs-mcp

設定方法

Cursorだとディープリンク機能を使って↓をブラウザのURL欄にコピペして設定できます。

cursor://anysphere.cursor-deeplink/mcp/install?name=microcms-document&config=eyJjb21tYW5kIjoibnB4IC15IG1pY3JvY21zLWRvY3VtZW50LW1jcC1zZXJ2ZXIifQ%3D%3D

その他のMCPクライアントであれば npx で設定できます。

{
  "mcpServers": {
    "microcms-document": {
      "command": "npx",
      "args": ["-y", "microcms-document-mcp-server"]
    }
  }
}

Claude Desktop用にdxtファイルもサポートしているので詳しくはREADMEをご覧ください。この辺りはどんどん便利になってきてますね。

ドキュメントの更新を同期する

MCPサーバー内にマークダウン化したファイルを直接持っているため、ドキュメントが更新された際にはその変更を同期する必要があります。

色んな方法があると思いますが、今回 コンテンツ更新時にmicroCMSからWebhookを飛ばし、Pipedreamで受け取って自動でPull Requestを出す 仕組みにしました。

フロー図。microCMSからWebhook通知され、それをPipedreamで受け取って処理される。マークダウン化した内容でPull Requestが作成される
ドキュメントが更新されたら自動でPRを作成(Pipedreamで実装)

Pull Requestの画面。ドキュメントの更新マークダウンファイルのdiffとして表現されている
こんな感じでPRが作られるので人間が確認してマージする

このあたりは色々やり方があると思いますが、ひとまずこの形で運用してみようと思っています。

おわりに

Document MCPサーバーの特徴、作り方について整理してみました。

LLMの知識では足りない最新性・正確性の高い情報を提供できるDocument MCPサーバーはこれから増えていくと思います。実装される際の参考になれば幸いです。
個人的にはAPIのラッパーではないMCPサーバーの作り方を学べたのが面白かったです。

ちなみにMastraのMCPサーバーはもう少し複雑で、ブログをスクレイピングしたりサンプルコードを参照したりとアクセスできるリソースが多いです。

興味がある方はぜひ読んでみてください👇
https://github.com/mastra-ai/mastra/tree/72aab2a4c4acbb2ab5b5f739315881f4fac68c09/packages/mcp-docs-server


AI開発で学んだTipsをXにポストしてるので、よければXもフォローしてみてください:)

Discussion