Mcp 服务器介绍与mcp-go库

small parking
Table of Contents

探索 Model Context Protocol (MCP):构建智能应用的新范式

在人工智能和机器学习领域,构建能够理解和利用上下文信息的智能应用至关重要。Model Context Protocol (MCP) 是一种新兴的协议,旨在简化和标准化应用程序之间共享模型和上下文信息的过程,从而推动智能应用的发展。

什么是 MCP?

Model Context Protocol (MCP) 是一种用于在不同应用程序之间共享模型和上下文信息的协议。它允许应用程序以标准化的方式交换数据,从而实现更强大的集成和协作。MCP 通过定义标准化的接口和数据格式,使得不同的应用程序可以轻松地交换信息,而无需了解彼此的内部实现细节。

MCP 的核心思想是将模型和上下文信息视为可共享的资源,并通过标准化的协议进行访问和管理。这使得应用程序可以轻松地利用其他应用程序提供的模型和上下文信息,从而构建更智能、更强大的应用。

MCP 的优势

  • 互操作性: MCP 允许不同的应用程序以标准化的方式交换数据,从而实现互操作性。
  • 可重用性: MCP 允许应用程序重用其他应用程序提供的模型和上下文信息,从而提高开发效率。
  • 可扩展性: MCP 允许应用程序动态地发现和使用新的模型和上下文信息,从而实现可扩展性。

mcp-go 一个 MCP 协议的实现

mcp-go 是模型上下文协议 (MCP) 的 Go 实现,可应用与外部数据源和工具之间的无缝集成。

主要特点

  • 快速:高级接口意味着更少的代码和更快的开发速度

  • 简单:使用最少的样板构建 MCP 服务器

  • 完整*:MCP Go 旨在提供核心 MCP 规范的完整实现

使用的 MCP 库

mcp-go 项目使用了以下 MCP 库:

  • github.com/mark3labs/mcp-go/mcp: 提供了 MCP 的核心接口和数据结构,例如 ToolResourcePrompt
  • github.com/mark3labs/mcp-go/server: 提供了构建 MCP 服务器的框架,例如 MCPServerServeStdio

代码示例

以下是 main 函数的代码示例,演示了如何创建一个 MCP 服务器:

func main() {
	// Create MCP server
	s := server.NewMCPServer(
		"mcp server go",
		"1.0.0",
		server.WithResourceCapabilities(true, true),
		server.WithPromptCapabilities(true),
	)
	add_tool(s)

	add_res(s)

	add_prompt(s)

	// Start the stdio server
	if err := server.ServeStdio(s); err != nil {
		fmt.Printf("Server error: %v\n", err)
	}
}

以下是 add_tool 函数的代码示例,演示了如何添加一个工具到 MCP 服务器:

func add_tool(s *server.MCPServer) {
	// Add tool
	tool := mcp.NewTool("hello_world",
		mcp.WithDescription("Say hello to someone"),
		mcp.WithString("name",
			mcp.Required(),
			mcp.Description("Name of the person to greet"),
		),
	)

	// Add tool handler
	s.AddTool(tool, helloHandler)
}

以下是 add_res 函数的代码示例,演示了如何添加一个资源到 MCP 服务器:

func add_res(s *server.MCPServer) {
	// Static resource example - exposing a README file
	resource := mcp.NewResource(
		"docs://readme",
		"Project README",
		mcp.WithResourceDescription("The project's README file"),
		mcp.WithMIMEType("text/markdown"),
		mcp.WithAnnotations([]mcp.Role{mcp.RoleAssistant}, 0.8),
	)

	// Add resource with its handler
	s.AddResource(resource, func(ctx context.Context, request mcp.ReadResourceRequest) ([]interface{}, error) {
		content, err := os.ReadFile("README.md")
		if err != nil {
			return nil, err
		}

		return []interface{}{
			mcp.TextResourceContents{
				ResourceContents: mcp.ResourceContents{
					URI:      "docs://readme",
					MIMEType: "text/markdown",
				},
				Text: string(content),
			},
		}, nil
	})
}

以下是 add_prompt 函数的代码示例,演示了如何添加一个提示到 MCP 服务器:

func add_prompt(s *server.MCPServer) {

	// Simple greeting prompt
	s.AddPrompt(mcp.NewPrompt("greeting",
		mcp.WithPromptDescription("A friendly greeting prompt"),
		mcp.WithArgument("name",
			mcp.ArgumentDescription("Name of the person to greet"),
		),
	), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {
		name := request.Params.Name
		if name == "" {
			name = "friend"
		}

		return mcp.NewGetPromptResult(
			"A friendly greeting",
			[]mcp.PromptMessage{
				mcp.NewPromptMessage(
					mcp.RoleAssistant,
					mcp.NewTextContent(fmt.Sprintf("Hello, %s! How can I help you today?", name)),
				),
			},
		), nil
	})
}

以下是 helloHandler 函数的代码示例,演示了如何处理 hello_world 工具的请求:

func helloHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	name, ok := request.Params.Arguments["name"].(string)
	if !ok {
		return mcp.NewToolResultError("name must be a string"), nil
	}

	return mcp.NewToolResultText(fmt.Sprintf("Hello, %s!", name)), nil
}

总结

MCP 是一种有前景的协议,可以帮助构建更智能、更强大的应用程序。通过标准化模型和上下文信息的共享方式,MCP 促进了应用程序之间的互操作性、可重用性和可扩展性。mcp-go 项目是模型上下文协议 (MCP) 的 Go 实现。