官网
https://modelcontextprotocol.io/docs/getting-started/intro
简介
- mcp(Model Context Protocol) 也称为模型上下文协议,是一种将AI应用和外部系统建立起连接的协议。使用mcp,像Claude和chatGpt这样的AI应用,就可以连接到数据库、本地文件这样的数据源,使用各种工具,完成丰富的需求
- mcp提供了一种把大模型连接到外部系统的一种标准规范

- 像http协议一样,mcp协议也需要客户端和服务端,用http协议的客户端和服务端概念来理解mcp协议的客户端和服务端就可以了
协议
mcp协议包含两层。数据层和传输层
- 数据层:基于
json-rpc 2.0,所有通信都遵循这个协议。这一层处理消息框架、请求/响应链接和高级通信模式
关于json-rpc 2.0参考https://wiki.geekdream.com/Specification/json-rpc_2.0.html
json-rpc 2.0协议格式大致如下
- 请求体
{ "jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1 }
- 返回消息体
{ "jsonrpc": "2.0", "result": 19, // 如果失败会返回error "id": 1 }
- 传输层:处理clients和server之间的通信,支持Stdio或者http的sse传输两种方式
- Stdio:使用标准输入输出进行通信,适用于本地进程。同一机器传输效率最高,进程管理简单
- SSE:使用服务器发送事件,进行服务器到客户端的单向消息传递,使用http的POST请求实现客户端到服务器的单向消息传递。需要兼容http的场景、需要进行鉴权等情况,可以使用
组件
mcp host:管理一个或者多个mcp客户端的AI应用,例如vs code等接入了大模型的IDEmcp client:保持与mcp server之间连接的一个组件,它会从mcp服务器获取交给mcp host使用的上下文mcp server:提供上下文给mcp客户端的一个程序
mcp服务端
mcp服务端提出了下面几个核心的概念
Resources
- 资源,是一种能够被客户端阅读的数据。让AI通过Resource获取问题相关上下文信息。当需要让大模型访问某些数据或者信息的时候,可以使用这个
Tools
- 工具,可以被大模型调用的方法,比如写文件、操作数据库、执行命令等等
Prompts
- 提示词,帮助用户理解特定任务的事先写好的模板。让AI遵循最佳实践,当需要标准化、专业化的提示内容的时候,可以使用这个
交互流程
Streamable HTTP
- 简单看一下这种数据传输方式。具体细节可以阅读上面的文档,服务器会提供一个单一的
endpoint,例如/mcp,这个endpoint支持POST和GET方法,所有的mcp通信都会通过这个单一的endpoint进行,对于SSE。这个连接涉及两次POST和一次GET请求
- 客户端与服务器建立会话,获取session id(POST)
- 发送初始化完成通知(POST)
- 建立SSE流连接(GET)
示例
- 这里以golang为例,演示如何创建mcp服务端和客户端。下面是一个可直接运行的服务器实例代码
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
// 创建MCP服务器实例
mcpServer := server.NewMCPServer("demo-server", "1.0.0")
// 添加一个简单的echo工具
mcpServer.AddTool(mcp.Tool{
Name: "echo",
Description: "Echo back the input message",
InputSchema: mcp.ToolInputSchema{
Type: "object",
Properties: map[string]any{
"message": map[string]any{
"type": "string",
"description": "The message to echo back",
},
},
Required: []string{
"message"},
},
}, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
message := request.GetString("message", "")
return &mcp.CallToolResult{
Content: []mcp.Content{
mcp.TextContent{
Type: "text",
Text: fmt.Sprintf("Echo: %s", message),
},
},
}, nil
})
// 添加一个计算器工具
mcpServer.AddTool(mcp.Tool{
Name: "calculate",
Description: "Perform basic arithmetic calculations",
InputSchema: mcp.ToolInputSchema{
Type: "object",
Properties: map[string]any{
"operation": map[string]any{
"type": "string",
"description": "T

最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



