利用 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):在 LLM 应用端(例如 Claude Desktop)进行 MCP 通信。
  • 客户端(Client):在主机内部管理与服务器的通信。
  • 服务器(Server):响应客户端的请求,提供文档数据及工具功能。

图示如下

modelcontextprotocol.io

通过客户端以固定格式与各 MCP 服务器进行交互,能够自由访问本地或云端的各类资源。这三者之间通过 JSON 格式的消息进行交互,形成了 LLM 安全且动态访问外部信息的机制。

有关详细内容,也可参考以下文章。

acro-engineer.hatenablog.com

2. 什么是 AWS Documentation MCP Server

AWS 基于模型上下文协议(MCP),在以下代码仓库中公开了面向各类用途的 MCP 服务器集群。

github.com

目前公开的 MCP 服务器共有以下 9 种:

服务器名称概述
Core MCP ServerAWS MCP 的基础服务器
AWS Documentation MCP Server可将 AWS 产品文档设为检索对象
Amazon Bedrock Knowledge Bases Retrieval MCP Server可通过 MCP 访问 Bedrock KnowledgeBase
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 应用等工具。

本次将介绍分别使用支持通过 GUI 操作 MCP 的 Claude Desktop,以及支持通过 Python 调用 MCP 的 dolphin-mcp,结合 AWS Documentation MCP Server 打造 FAQ 助手的方法。

通过 Claude Desktop 打造 AWS 文档 FAQ 助手

接下来,让我们实际使用 AWS Documentation MCP Server 吧。使用该服务器需具备以下环境:

  • Python 3.10 及以上版本
  • uv(注:一种 Python 包管理工具)

github.com

首先,从以下 URL 下载并安装 Claude Desktop。

claude.ai

打开 Claude Desktop 后,从文件菜单中选择 “设置”,操作如下

从设置中选择 “开发者” 菜单,再点击 “编辑配置”,操作如下

参考以下文档,配置 claude_desktop_config.json 文件。

github.com

配置值

json

{
  "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-mcp 打造 AWS 文档 FAQ 助手

接下来,让我们尝试利用 dolphin-mcp,将 AWS Documentation Server 作为 FAQ 助手集成到 Streamlit 应用中。

1. 架构与准备

本次实现的架构如下:由 Streamlit 构建的 FAQ 助手,通过 FastAPI 向调用了 AWS Documentation MCP Server 的 LLM 发起回答请求。

使用的模块等如下:

  • Python 3.13
  • 主要依赖库
    • dolphin-mcp:用于与 MCP 服务器通信的库
    • Streamlit:用于构建聊天界面
    • FastAPI:用于搭建后端 API

2. FastAPI 服务器的实现

首先,我们通过 FastAPI 将与 MCP 服务器的通信部分实现为简单的 API。

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

# 适配 Windows 系统的事件循环策略
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:
            # 调用 dolphin-mcp 与 MCP 服务器交互
            result = await run_interaction(
                user_query=q,  # 用户查询
                model_name="claude-3-7-sonnet-latest",  # 使用的 LLM 模型
                quiet_mode=False,  # 非静默模式
                stream=True  # 启用流式响应
            )

            # 流式返回 LLM 生成的内容
            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"

    # 返回流式响应,媒体类型为 text/event-stream
    return StreamingResponse(stream_generator(), media_type="text/event-stream")

同时,创建以下 mcp_config.json 配置文件:

{
  "mcpServers": {
    "aws-documentation-mcp-server": {
      "command": "uvx",  # 执行命令
      "args": [
        "--from",
        "awslabs-aws-documentation-mcp-server@latest",  # 从指定源获取服务器
        "awslabs.aws-documentation-mcp-server.exe"  # MCP 服务器可执行文件
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"  # 日志级别设为 ERROR
      },
      "disabled": false,  # 启用该 MCP 服务器
      "autoApprove": []  # 自动批准的操作列表(空表示需手动批准)
    }
  },
  "models": [
    {
      "model": "claude-3-7-sonnet-latest",  # 模型名称
      "provider": "anthropic",  # 模型提供商
      "apiKey": "<AnthropicのAPI Key>",  # 替换为 Anthropic 的 API 密钥
      "title": "claude",  # 模型标题
      "temperature": 0.7,  # 温度参数(控制生成内容的随机性)
      "top_k": 256,  # Top-K 采样参数
      "top_p": 0.9,  # Top-P 采样参数
      "max_tokens": 2048  # 最大生成 tokens 数
    }
  ]
}

3. 基于 Streamlit 的前端实现

接下来,使用 Streamlit 实现 FAQ 助手的 UI 界面。

import streamlit as st
import requests
import json

# FastAPI 后端 API 地址
API_URL = "http://localhost:8000/query"

# 设置页面标题
st.title("💬 AI聊天(基于 AWS Documentation MCP Server)")

# 初始化会话状态中的消息列表(若不存在则创建)
if "messages" not in st.session_state:
    st.session_state.messages = []

# 渲染历史消息
for message in st.session_state.messages:
    with st.chat_message(message["role"]):  # 根据角色(user/assistant)渲染消息框
        if message["type"] == "llm_text":
            st.markdown(message["content"])  # 渲染普通文本消息
        elif message["type"] == "search_result":
            # 以折叠面板形式渲染搜索结果
            with st.expander("🔍 搜索结果(点击展开)", expanded=False):
                st.json(message["content"])

# 获取用户输入
user_input = st.chat_input("请输入问题")

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:
            # 向 FastAPI 后端发送请求(启用流式响应,超时时间 120 秒)
            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}")  # 若状态码非 200,显示错误
                else:
                    # 逐行处理流式响应
                    for line in response.iter_lines(decode_unicode=True):
                        if line and line.startswith("data: "):
                            # 解析 payload 内容
                            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 Desktop 和 dolphin-mcp 两种方式,打造可查阅 AWS 文档的 FAQ 助手。

此次我们使用的是 AWS Documentation MCP Server,但 MCP 的魅力在于,它可以轻松替换为 AWS 公开的其他 MCP 服务器。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注