Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

AWS Documentation MCP Server でAWSのFAQアシスタントを作成する

はじめに

データ分析エンジニアの木介です。
AWSの公式ドキュメントで欲しい情報を探そうとしても、なかなか目的のページが見つからなかったりすることってありませんか?
AWSから「AWS Documentation MCP Server」が公開されたため、本記事では、それを利用して、最新のAWSドキュメントに基づき、質問に回答してくれるFAQアシスタントの作成方法について紹介したいと思います。

MCP Serverの呼び出しには、Claude Desktop および dolphin-mcp を利用します。

github.com

概要

1. MCPとは

MCP(Model Context Protocol)は、Anthropic社が開発したオープンなプロトコルです。
LLM(大規模言語モデル)と外部のデータソースやツールを接続するための標準化された方法を提供します。

www.anthropic.com

MCPのしくみ

MCPは、以下の3つのコンポーネントから成り立っています。

  • ホスト(Host)
  • クライアント(Client)
    • ホスト内部でサーバーと通信を管理。
  • サーバー(Server)
    • クライアントからの要求に応じて、ドキュメントデータやツール機能を提供。

図にすると以下のような形です。

modelcontextprotocol.io

クライアントサイドから定まった形式でそれぞれのMCPサーバーとやり取りを行うことで、ローカルやクラウドにある様々なリソースに自由にアクセスできるようになっています。
この3者間でJSONベースのメッセージをやりとりすることで、LLMが外部情報へ安全かつ動的にアクセスできる仕組みとなっています。

詳しくは以下の記事でも解説をしているため参考にしていただければと思います。

acro-engineer.hatenablog.com

2. AWS Documentation MCP Serverとは

AWSでは、Model Context Protocol(MCP)をベースに、さまざまな用途に特化したMCPサーバー群を以下のレポジトリで公開しています。

github.com

公開されているMCPサーバーには、現在以下の9種が提供されています。

サーバー名 概要
Core MCP Server AWS MCPのベースとなるサーバー
AWS Documentation MCP Server AWS製品ドキュメントを検索対象にできる
Amazon Bedrock Knowledge Bases Retrieval MCP Server Bedrock KnowledgeBaseをMCP経由で参照できる
AWS CDK MCP Server CDKについてのベストプラクティスを取得できる
Cost Analysis MCP Server AWSのコストサービスを利用できる
Amazon Nova Canvas MCP Server 画像生成を行う
AWS Diagram MCP Server AWSの構成図などを生成する
AWS Lambda MCP Server AWS Lambdaを実行する
AWS Terraform MCP Server Terraformのベストプラクティスを取得できる


今回紹介する「AWS Documentation MCP Server」では、AWS公式のドキュメントをナレッジソースとして扱い、
外部から簡単に検索・参照できる仕組みを提供する形となっています。

具体的には以下の機能がMCPにより提供されています。

機能名 概要
search_documentation 指定したキーワードに関連するAWSドキュメントを検索する機能
read_documentation ドキュメントの特定ページやセクションを読み取り、その内容を取得する機能
recommend 質問に関連する推奨ドキュメントやページを提案する機能

また、新たに追加されるドキュメントにも自動で対応する設計となっており、
常に最新のAWSドキュメントを対象にしたFAQアプリケーションなどの構築が可能になります。

今回はGUIMCPが利用できるClaude Desktopと、PythonからMCPを利用できるdolphin-mcpを使ってのAWS Documentation MCP Serverを使ったFAQアシスタントの作成方法について紹介します。

Claude Desktop経由でAWS ドキュメントのFAQアシスタントを作成する

では早速AWS Documentation MCP Serverを利用してみましょう。
AWS Documentation MCP Serverの利用には以下の環境が必要となります

github.com


まず以下のURLよりClaude Desktopをインストールします。

claude.ai

Claude Desktopを開くと以下の形でファイルメニューから「設定」を選択します。

設定から「開発者」メニューより、「構成を編集」を選択します。

以下のドキュメントを参考にclaude_desktop_config.jsonの設定を行います。

github.com

設定値

{
  "mcpServers": {

      "awslabs.aws-documentation-mcp-server": {
          "command": "uvx",
          "args": [
              "--from",
              "awslabs-aws-documentation-mcp-server@latest",
              "awslabs.aws-documentation-mcp-server.exe"
          ],
          "env": {
              "FASTMCP_LOG_LEVEL": "ERROR"
          },
          "disabled": false,
          "autoApprove": []
      }
  }
}

その後に、再起動し以下の形となっていれば設定完了です。

使い方は簡単で、新規チャットよりチャットを送信するのみです。

例えば以下の質問を送信してみましょう。

以下の形で、AWSドキュメントを参考にした回答が生成されます。

以下の形でドキュメントの検索、読み込みを必要に応じて行っていることがわかります。

ドキュメントの検索

ドキュメントの読み込み

また、AWSドキュメントに関連しない質問をしてみると以下の回答が生成されていることからLLMがMCPサーバーを利用するかを判断出来ていることもわかります。

以上でClaude Desktopを使ったAWS Documentation MCP Serverの使い方です。
非常に簡単にAWSドキュメントベースのFAQアシスタントを利用できることがわかります。

dolphin-mcpAWS ドキュメントのFAQアシスタントを作成する

さて、では次にdolphin-mcpを利用して実際にStreamlitアプリにAWS Documentation ServerをFAQアシスタントとして組み込んでみましょう。

1. 構成と準備

今回の構成は以下の通りです。
Streamlitで作成したFAQアシスタントからFastAPI経由でAWS Documentation MCP Serverを使ったLLMの回答をリクエストしている形です。

モジュールなどは以下の物を利用しました

  • Python 3.13
  • 使用する主要ライブラリ
    • dolphin-mcpMCPサーバーと通信するためのライブラリ
    • Streamlit:チャット画面の作成用
    • FastAPI:バックエンドAPIの構築用

2. FastAPIサーバーの実装

まず、MCPサーバーとの通信部分をFastAPIで簡単なAPIとして実装します。

import asyncio
import json
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from dolphin_mcp import run_interaction
import sys

if sys.platform.startswith('win'):
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

app = FastAPI()

@app.get("/query")
async def query_endpoint(q: str):
    async def stream_generator():
        try:
            result = await run_interaction(
                user_query=q,
                model_name="claude-3-7-sonnet-latest",
                quiet_mode=False,
                stream=True
            )

            async for chunk in result:
                yield f"data: {json.dumps({'type': 'llm_text', 'payload': chunk})}\n\n"

        except Exception as e:
            yield f"data: {json.dumps({'type': 'error', 'payload': str(e)})}\n\n"

    return StreamingResponse(stream_generator(), media_type="text/event-stream")

また、以下のmcp_config.jsonファイルを作成します。

mcp_config.json

{
  "mcpServers": {
    "aws-documentation-mcp-server": {
      "command": "uvx",
      "args": [
        "--from",
        "awslabs-aws-documentation-mcp-server@latest",
        "awslabs.aws-documentation-mcp-server.exe"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  },
  "models": [
    {
      "model": "claude-3-7-sonnet-latest",
      "provider": "anthropic",
      "apiKey": "<AnthropicのAPI Key>",
      "title": "claude",
      "temperature": 0.7,
      "top_k": 256,
      "top_p": 0.9,
      "max_tokens": 2048
    }
  ]
}

3. Streamlitによるフロントエンドの実装

次に、FAQアシスタントのUIをStreamlitで実装します。

import streamlit as st
import requests
import json

API_URL = "http://localhost:8000/query"

st.title("💬 AIチャット with AWS Documentation MCP Server")

if "messages" not in st.session_state:
    st.session_state.messages = []

user_input = st.chat_input("質問を入力してください")

for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        if message["type"] == "llm_text":
            st.markdown(message["content"])
        elif message["type"] == "search_result":
            with st.expander("🔍 検索結果(クリックして展開)", expanded=False):
                st.json(message["content"])

if user_input:
    with st.chat_message("user"):
        st.markdown(user_input)
    st.session_state.messages.append({"role": "user", "type": "llm_text", "content": user_input})

    with st.chat_message("assistant"):
        assistant_placeholder = st.empty()
        partial_response = ""

        try:
            with requests.get(API_URL, params={"q": user_input}, stream=True, timeout=120) as response:
                if response.status_code != 200:
                    st.error(f"エラー: {response.status_code}")
                else:
                    for line in response.iter_lines(decode_unicode=True):
                        if line and line.startswith("data: "):
                            payload = json.loads(line[len("data: "):])
                            partial_response += payload["payload"]
                            assistant_placeholder.markdown(partial_response)
        except requests.exceptions.RequestException as e:
            st.error(f"接続エラー: {e}")

        st.session_state.messages.append({
            "role": "assistant",
            "type": "llm_text",
            "content": partial_response
        })

このように、Streamlitとdolphin-mcpを使うことで、AWS Documentation MCP Serverをバックエンドに持つFAQアシスタントを簡単に構築できました。

4. 動作確認

以下が実際に動かしてみた結果になります。

Claude Desktopを用いた時と同様に最新のAWSのドキュメントを参照した回答を行えていることがわかります。

まとめ

AWS Documentation MCP Serverを使い、Claude Desktopdolphin-mcp経由でAWSドキュメントを参照できるFAQアシスタントを作成しました。
今回はAWS Documentation MCP Serverでしたが、そのほかに公開されているAWSMCPサーバーとも簡単に置き換えることが出来るのがMCPの魅力だと感じました。

Acroquest Technologyでは、キャリア採用を行っています。

  • Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com