mcp(1) - 深入浅出分析mcp(模型上下文协议)

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 330人参与

官网
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传输两种方式
  1. Stdio:使用标准输入输出进行通信,适用于本地进程。同一机器传输效率最高,进程管理简单
  2. SSE:使用服务器发送事件,进行服务器到客户端的单向消息传递,使用http的POST请求实现客户端到服务器的单向消息传递。需要兼容http的场景、需要进行鉴权等情况,可以使用

组件

  1. mcp host:管理一个或者多个mcp客户端的AI应用,例如vs code等接入了大模型的IDE
  2. mcp client:保持与mcp server之间连接的一个组件,它会从mcp服务器获取交给mcp host使用的上下文
  3. mcp server:提供上下文给mcp客户端的一个程序

mcp服务端

mcp服务端提出了下面几个核心的概念

Resources

  • 资源,是一种能够被客户端阅读的数据。让AI通过Resource获取问题相关上下文信息。当需要让大模型访问某些数据或者信息的时候,可以使用这个

Tools

  • 工具,可以被大模型调用的方法,比如写文件、操作数据库、执行命令等等

Prompts

  • 提示词,帮助用户理解特定任务的事先写好的模板。让AI遵循最佳实践,当需要标准化、专业化的提示内容的时候,可以使用这个

交互流程

https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#listening-for-messages-from-the-server

Streamable HTTP

  • 简单看一下这种数据传输方式。具体细节可以阅读上面的文档,服务器会提供一个单一的endpoint,例如/mcp,这个endpoint支持POST和GET方法,所有的mcp通信都会通过这个单一的endpoint进行,对于SSE。这个连接涉及两次POST和一次GET请求
  1. 客户端与服务器建立会话,获取session id(POST)
  2. 发送初始化完成通知(POST)
  3. 建立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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clarence Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值