知识库搜索服务

一个基于AWS Bedrock和Cloudflare Workers的模型上下文协议(MCP)服务器实现,用于AI助手通过知识库进行文档搜索。

  • by daohoangson
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 daohoangson/aws-knowledge-base-mcp-server

使用说明

AWS知识库MCP服务器

用法

Claude DesktopGitHub Copilot
{
  "mcpServers": {
    "knowledge-base": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://aws-knowledge-base-mcp-server.daohoangson.workers.dev/sse"
      ]
    }
  }
}
{
  "servers": {
    "aws-knowledge-base": {
      "type": "sse",
      "url": "https://aws-knowledge-base-mcp-server.daohoangson.workers.dev/sse"
    }
  }
}

模型上下文协议(MCP)服务器实现,使AI助手能够使用AWS Bedrock和Cloudflare Workers在知识库中搜索。该项目由三个主要部分组成:

建筑

  1. 基础设施 (/cdk):设置资源,包括:

    • 用于文档嵌入的AWS基岩知识库
    • Pinecone用于高效的文档搜索
    • 用于存储文档文件的AWS S3存储桶
    • 用于MCP服务器的AWS Lambda功能,支持流式HTTP传输
    • AWS IAM用户和API访问策略
  2. MCP服务器 (/cloudflare-mcp-server):实现MCP服务器,该服务器:

    • 提供 search_knowledge_base AI助手工具
    • 与AWS Bedrock集成以进行文档检索
    • 支持SSE(已弃用)和流式HTTP传输
    • 在Cloudflare Workers上运行,兼容Node.js
  3. MCP客户端 (/ai-sdk-mcp-client):一个演示客户端,它:

    • 用途 Vercel的AI SDK Nova Pro型号
    • 充当MCP客户端,支持SSE和流式HTTP传输
    • 通过工具调用流式传输文本响应
graph TD
  subgraph AWS
    S3[S3 Bucket] -->|Stores Documents| KnowledgeBase
    TitanModel[Titan Embed Text V2] -->|Embedding Model| KnowledgeBase
    Lambda -->|Retrieve API| KnowledgeBase
    NovaPro[Nova Pro]
  end

  subgraph Pinecone
    KnowledgeBase[Bedrock Knowledge Base] -->|Vector Embeddings| PineconeDb[Vector Database]
  end

  subgraph Cloudflare
    Worker -->|Retrieve API| KnowledgeBase
  end

  Demo -->|InvokeModel API| NovaPro
  Demo -->|MCP<br />Streamable HTTP| Lambda
  Demo -->|MCP<br />Server Sent Event| Worker
  Demo -->|MCP<br />Streamable HTTP| Worker

基础设施

设置

cd cdk

npm install

# Unique identifier for the CDK stack
export CDK_APP_ID="DocsMcpServer"

# Pinecone credentials to manage vector databases
export PINECONE_API_KEY="pcsk_foo"

# Deploy the stack
npx cdk deploy

输出示例

DocsMcpServer.AwsAccessKeyId = AKI123
DocsMcpServer.AwsRegion = us-east-1
DocsMcpServer.AwsSecretAccessKey = 4cQ456
DocsMcpServer.DataSourceId = OD6LTXXUNH
DocsMcpServer.DocsBucketName = docsmcpserver-docsbucketa5ce02e3-gg8g3crhlo1j
DocsMcpServer.KnowledgeBaseId = GZUYX1EGMF
DocsMcpServer.McpServerUrl = https://vc7ejtu4kk3ayeiqofkmxxzada0uwpzr.lambda-url.us-east-1.on.aws/

文档更新

这 /docs 目录包含用最新文档更新知识库的脚本:

cd docs

# Set environment variables from the CDK output
export DATA_SOURCE_ID="OD6LTXXUNH"
export DOCS_BUCKET_NAME="docsmcpserver-docsbucketa5ce02e3-gg8g3crhlo1j"
export KNOWLEDGE_BASE_ID="GZUYX1EGMF"

# Run the update script
./update.sh

这将:

  1. 从CloudFlare和MCP网站下载最新文档
  2. 将文件上传到S3
  3. 启动新的摄取作业以更新知识库

MCP服务器

MCP服务器提供 search_knowledge_base AI助手可以使用该工具搜索索引文档。该工具接受查询字符串并返回相关文档。

创建 .dev.vars CDK输出中的以下变量:

AWS_ACCESS_KEY_ID=AKI123
AWS_REGION=us-east-1
AWS_SECRET_ACCESS_KEY=4cQ456
KNOWLEDGE_BASE_ID=GZUYX1EGMF

设置

cd cloudflare-mcp-server

npm install

npm run cf-typegen

# run locally
npm run dev

# or deploy to Cloudflare
npm run deploy

MCP客户端

客户端演示了如何连接到MCP服务器,并使用其支持SSE和流式HTTP传输的工具。

设置

cd ai-sdk-mcp-client

npm install

# Set environment variables from the CDK output
export AWS_ACCESS_KEY_ID="AKI123"
export AWS_REGION="us-east-1"
export AWS_SECRET_ACCESS_KEY="4cQ456"

# Test connection to CloudFlare with SSE transport
npm start -- https://aws-knowledge-base-mcp-server.daohoangson.workers.dev/sse

# Test connection to CloudFlare with streamable HTTP transport
npm start -- https://aws-knowledge-base-mcp-server.daohoangson.workers.dev/mcp

# Test connection to Lambda
npm start -- https://vc7ejtu4kk3ayeiqofkmxxzada0uwpzr.lambda-url.us-east-1.on.aws/mcp

输出示例

Created MCP client

{ tools: [ 'search_knowledge_base' ] }

<thinking> To determine if CloudFlare works with the Model Context Protocol (MCP), I need to search the knowledge base for relevant documentation. </thinking>

Tool call: search_knowledge_base {
  "query": "Does CloudFlare work with Model Context Protocol (MCP)?"
}
Tool result
{
  "content": [
    {
      "type": "text",
      "text": "includes(\"special_feature\")) {     this.server.tool(\"specialTool\", \"Special feature\", {}, async () => {       // This tool only appears for users with the special_feature permission     });   } } ```  Benefits:  - Authorization check at the tool level ensures proper access control - Allows you to define permission checks once and reuse them across tools - Provides clear feedback to users when permission is denied - Can choose to only present tools that the agent is able to call  ## Next steps  - [Learn how to use the Workers OAuth Provider Library](https://github.com/cloudflare/workers-oauth-provider) - Learn how to use a third-party OAuth provider, using the [GitHub](/agents/guides/remote-mcp-server/#add-authentication) example MCP server.  ---  # Model Context Protocol (MCP)  URL: https://developers.cloudflare.com/agents/model-context-protocol/  You can build and deploy [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) servers on Cloudflare.  ## What is the Model Context Protocol (MCP)?  [Model Context Protocol (MCP)](https://modelcontextprotocol.io) is an open standard that connects AI systems with external applications. Think of MCP like a USB-C port for AI applications."
    },
    {
      "type": "text",
      "text": "can call.  When you build MCP Servers with the `@cloudflare/model-context-protocol` package, you can define tools the [same way as shown in the `@modelcontextprotocol/typescript-sdk` package's examples](https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#tools)."
    },
    {
      "type": "text",
      "text": "See our [list of example servers](https://modelcontextprotocol.io/examples), or [get started building your own server](https://modelcontextprotocol.io/quickstart/server).   # Introduction Source: https://modelcontextprotocol.io/introduction  Get started with the Model Context Protocol (MCP)  <Note>C# SDK released! Check out [what else is new.](/development/updates)</Note>  MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.  ## Why MCP?  MCP helps you build agents and complex workflows on top of LLMs. LLMs frequently need to integrate with data and tools, and MCP provides:  * A growing list of pre-built integrations that your LLM can directly plug into * The flexibility to switch between LLM providers and vendors * Best practices for securing your data within your infrastructure  ### General architecture  At its core, MCP follows a client-server architecture where a host application can connect to multiple servers:  ```mermaid flowchart LR     subgraph \"Your Computer\"         Host[\"Host with MCP Client\\n(Claude, IDEs, Tools)\"]         S1[\"MCP Server A\"]         S2[\"MCP Server B"
    },
    {
      "type": "text",
      "text": "). - **Local MCP connections**: MCP clients connect to MCP servers on the same machine, using [stdio](https://spec.modelcontextprotocol.io/specification/draft/basic/transports/#stdio) as a local transport method.  ### Get Started  Go to the [Getting Started](/agents/guides/remote-mcp-server/) guide to learn how to build and deploy your first remote MCP server to Cloudflare.  ---  # McpAgent — API Reference  URL: https://developers.cloudflare.com/agents/model-context-protocol/mcp-agent-api/  import { Render, TypeScriptExample } from \"~/components\";  When you build MCP Servers on Cloudflare, you extend the [`McpAgent` class](https://github.com/cloudflare/agents/blob/5881c5d23a7f4580600029f69307cfc94743e6b8/packages/agents/src/mcp.ts), from the Agents SDK, like this:  <TypeScriptExample>  ```ts title=\"src/index.ts\" import { McpAgent } from \"agents/mcp\"; import { DurableMCP } from \"@cloudflare/model-context-protocol\";  export class MyMCP extends McpAgent { \tserver = new McpServer({ name: \"Demo\", version: \"1.0.0\" });  \tasync init() { \t\tthis.server.tool( \t\t\t\"add\", \t\t\t{ a: z.number(), b:"
    },
    {
      "type": "text",
      "text": "For instance, if the client doesn't have access to Claude models but has Gemini, it might map the sonnet hint to `gemini-1.5-pro` based on similar capabilities.  ## Error Handling  Clients **SHOULD** return errors for common failure cases:  Example error:  ```json {   \"jsonrpc\": \"2.0\",   \"id\": 1,   \"error\": {     \"code\": -1,     \"message\": \"User rejected sampling request\"   } } ```  ## Security Considerations  1. Clients **SHOULD** implement user approval controls 2. Both parties **SHOULD** validate message content 3. Clients **SHOULD** respect model preference hints 4. Clients **SHOULD** implement rate limiting 5. Both parties **MUST** handle sensitive data appropriately   # Specification Source: https://modelcontextprotocol.io/specification/2025-03-26/index    [Model Context Protocol](https://modelcontextprotocol.io) (MCP) is an open protocol that enables seamless integration between LLM applications and external data sources and tools. Whether you're building an AI-powered IDE, enhancing a chat interface, or creating custom AI workflows, MCP provides a standardized way to connect LLMs with the context they need."
    }
  ]
}

是的,CloudFlare支持模型上下文协议(MCP)。您可以在CloudFlare上构建和部署MCP服务器。文档表明,CloudFlare提供了包和示例,以帮助您开始使用MCP服务器。

有关更多详细信息,请参阅 CloudFlare上的模型上下文协议文档.

成本估算

假设:

  • us-east-1 区域
  • 共计2 000份文件
  • 每个文档约为5KB/约1250个令牌
  • 每月重新索引所有内容30次(实际实施将逐步完成)
  • 每月使用3000个请求
  • 每个请求占用5ms CPU时间/200ms墙时间
  • 每个查询大约有100个令牌
  • 每个请求返回10个文档
服务 SKU 标价 每月计数 每月成本(美元)
AWS基岩 Titan嵌入(索引) 0.00002/1K代币 75000K 1.5美元
Titan嵌入(查询) 0.00002/1K代币 300K 0.006美元
AWS Lambda 请求 0.2/1M请求 0.003M 0.0006美元
ARM64持续时间 0.0000133334/GB-s 75美元 英镑 0.001美元
数据传输输出 $0.09/GB 0.15 GB 0.0135美元
AWS S3 标准存储 每月0.023美元/GB 0.01 GB 0.00023美元
列表请求 0.005美元/1K请求 6K 0.03美元
GET请求 0.0004/1K请求 60000 0.024美元
CloudFlare 标准版 每月5美元 1 5美元
请求 0.30美元/百万 0.003 0.0009美元
CPU时间 $0.00002/CPU秒 15 $0.0003
松果 标准 25美元/月 1 25美元
矢量存储 每月0.33美元/GB 0.008 GB 0.003美元
矢量插入(写入) 4/百万美元写入 0.06M 0.24美元
向量查询(读取) 16美元/百万读取 0.03万 0.48美元
  • https://aws.amazon.com/bedrock/pricing/
  • https://aws.amazon.com/s3/pricing/
  • https://aws.amazon.com/lambda/pricing/
  • CloudFlare标准计划包括 10M请求和3K CPU秒.
  • 松果标准计划包括 每月15美元的使用积分.替代方案:
    • Aurora PostgreSQL无服务器,每月180美元,配备1个写入器、1个读取器、2个NAT网关等。(参见 分支 aurora)
    • Amazon OpenSearch Serverless最低每月350美元,因为它至少需要一个索引OCU和一个搜索OCU 0.24美元/OCU小时