前言
官方SDK仓库:https://github.com/modelcontextprotocol/go-sdk
官方demo:https://github.com/modelcontextprotocol/go-sdk/blob/main/examples/hello/main.go
demo代码:
1 | // Copyright 2025 The Go MCP SDK Authors. All rights reserved. |
代码解析
1. 程序结构
- flag 模块:用于解析命令行参数,这里定义了一个 httpAddr,用于指定是否通过 HTTP 提供服务。
- mcp 模块:这是 MCP SDK 的核心模块,用于定义和处理 tool、prompt 和 resource。
- main 函数:程序入口,负责初始化 mcp.Server,注册工具、提示和资源,并启动服务。
2. mcp 的主要概念
- Tool:工具函数,用于执行特定的任务。例如,SayHi 是一个工具函数,它接收一个名字,并返回一个问候消息。
- Prompt:提示函数,用于生成对话框的内容。例如,PromptHi 生成一个提示用户输入名字的对话框。
- Resource:资源,用于存储和提供数据。例如,handleEmbeddedResource 提供了一个嵌入式的资源,返回一段文本。
3. 程序的主要功能
- 工具函数 SayHi:
- 接收一个名字作为参数。
- 返回一个包含问候消息的 mcp.CallToolResult。
- 提示函数 PromptHi:
- 生成一个提示消息,让用户输入名字。
- 资源 info:
- 提供一个嵌入式的资源,返回一段固定的文本。
- 服务启动:
- 如果设置了 httpAddr,则通过 HTTP 提供服务。
- 否则,通过标准输入/输出与用户交互。
mcp 的 prompt、resource 和 tool 的使用
1. Tool 的使用
- 定义:通过 mcp.AddTool 将工具函数注册到 mcp.Server。
- 调用:客户端可以通过调用工具的名称,传递参数,获取结果。
- 示例:
1
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
2. Prompt 的使用
- 定义:通过 server.AddPrompt 将提示函数注册到 mcp.Server。
- 调用:客户端可以通过调用提示的名称,获取提示内容。
- 示例:
1
server.AddPrompt(&mcp.Prompt{Name: "greet"}, PromptHi)
3. Resource 的使用
- 定义:通过 server.AddResource 将资源注册到 mcp.Server。
- 调用:客户端可以通过资源的 URI 获取资源内容。
- 示例:
1
2
3
4
5server.AddResource(&mcp.Resource{
Name: "info",
MIMEType: "text/plain",
URI: "embedded:info",
}, handleEmbeddedResource)
资源查询场景的举例
1. 功能概述
实现一个查询资源的 mcp 服务,包含以下功能:
- 用户输入查询文本进行模糊查询。
- 如果查询结果超过阈值(如10个),系统自动提取资源类型列表,并提示用户选择一个资源类型。
- 用户选择资源类型后,系统进行更精确的查询并返回结果。
2. 伪代码实现
1 | package main |
3. 功能说明
- 工具 queryResources:
- 输入参数:
- queryText:用户输入的查询文本。
- resourceType:用户指定的资源类型(可选)。
- 逻辑:
- 如果用户未指定资源类型,进行模糊查询。
- 如果查询结果超过10个,提取资源类型列表,并提示用户选择一个资源类型。
- 如果用户指定了资源类型,进行精确查询。
- 输出:
- 如果结果超过阈值,返回提示信息,列出资源类型供用户选择。
- 如果结果未超过阈值,返回查询到的资源列表。
- 动态提示:
- 当查询结果超过10个时,系统会自动提取资源类型列表,并提示用户选择一个资源类型。
- 提示信息格式:Too many results (12). Please specify a resource type from: [document, image, video]。
4. 交互流程
- 用户首次查询:
- 用户调用 queryResources,仅输入查询文本(如 queryText=”doc”)。
- 系统进行模糊查询,返回结果。
- 如果结果超过10个,系统提取资源类型列表,并提示用户选择资源类型。
- 用户选择资源类型:
- 用户根据提示选择一个资源类型(如 resourceType=”document”)。
- 用户再次调用 queryResources,输入查询文本和资源类型。
- 系统进行精确查询,返回更精确的结果。
5. 示例交互
首次查询:
1 | User: queryResources(queryText="doc") |
用户选择资源类型并再次查询:
1 | User: queryResources(queryText="doc", resourceType="document") |