在Go中创建MCP服务器并使用Docker提供服务
引言
今天,我们将探讨如何在Go中创建MCP服务器,并使用Docker为其提供服务。
先决条件:已阅读 理解模型上下文协议(MCP)
要编写MCP服务器,有几个官方SDK:
近年来,我对Go产生了兴趣,所以我四处看看是否有Go实现。在此页面上 ,我发现了几个,特别是 的创造者 mcphost (我在讨论和使用 上一篇博客文章).
优势在于 mcp-go 该项目是因为它很简单,还提供了开发MCP客户端的工具,这对未来的博客文章非常有用。
创建MCP服务器
我不会在这里详细介绍或实现MCP服务器的所有可能性。我将只实现要点:
- 提供LLM工具列表
- LLM调用这些工具时执行它们
当我使用法学硕士时,有一件事我想做:给它一个网站链接,这样它就可以在那里找到信息,为我做一个总结等等。
所以我创建了一个MCP服务器,它调用 curl 使用URL参数的实用程序并返回其内容。但是让我们看看源代码:
go.mod:
module mcp-curl
go 1.23.4
require github.com/mark3labs/mcp-go v0.8.2
require github.com/google/uuid v1.6.0main.go:
package main
import (
"context"
"fmt"
"os/exec"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
// Create MCP server
s := server.NewMCPServer(
"mcp-curl",
"1.0.0",
)
// Add a tool
tool := mcp.NewTool("use_curl",
mcp.WithDescription("fetch this webpage"),
mcp.WithString("url",
mcp.Required(),
mcp.Description("url of the webpage to fetch"),
),
)
// Add a tool handler
s.AddTool(tool, curlHandler)
fmt.Println("🚀 Server started")
// Start the stdio server
if err := server.ServeStdio(s); err != nil {
fmt.Printf("😡 Server error: %v\n", err)
}
fmt.Println("👋 Server stopped")
}
func curlHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
url, ok := request.Params.Arguments["url"].(string)
if !ok {
return mcp.NewToolResultError("url must be a string"), nil
}
cmd := exec.Command("curl", "-s", url)
output, err := cmd.Output()
if err != nil {
return mcp.NewToolResultError(err.Error()), nil
}
content := string(output)
return mcp.NewToolResultText(content), nil
}解释
这真的很简单。我的服务器将只提供一个工具。该代码实现了一个服务器,该服务器公开了一个基于 curl 使用模型控制协议。
- 首先,我创建了一个名为的MCP服务器
mcp-curl版本1.0.0适用于标准输入/输出(stdio) - 然后我定义了一个名为
use_curl这需要一个必要的url参数 - 最后,我添加
handler对于执行curl命令与-s检索网页内容的选项 - 当然,我会处理错误并将网页内容作为文本返回
使用Docker打包MCP服务器
为了让我的生活更轻松,我会使用 Dockerfile 构建一个包含我的MCP服务器的Docker镜像。这样,我可以更容易地在不同的平台上部署它,或者让任何想使用它的人都可以使用它。
Dockerfile:
FROM golang:1.23.4-alpine AS builder
WORKDIR /app
COPY go.mod .
COPY main.go .
RUN <<EOF
go mod tidy
go build
EOF
FROM curlimages/curl:8.6.0
WORKDIR /app
COPY --from=builder /app/mcp-curl .
ENTRYPOINT ["./mcp-curl"]我的 Dockerfile 有两个部分:
- 第一部分在Go中构建我的MCP服务器
- 第二部分使用
curlimages/curl:8.6.0包含以下内容的图像curl并复制我的mcp-curl服务器进入镜像(所以mcp-curl是调用的可执行文件curl)
要构建Docker镜像,我运行以下命令:
docker build -t mcp-curl .现在让我们看看如何使用我们的新MCP服务器 mcphost:
使用MCP服务器 mcphost
首先,我们需要创建一个配置文件 mcp.json 为了 mcphost:
{
"mcpServers": {
"mcp-curl-with-docker" :{
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"mcp-curl"
]
}
}
}然后我们可以使用 mcphost 使用我们的MCP服务器和Ollama的LLM,如下所示:
mcphost --config ./mcp.json --model ollama:qwen2.5-coder:14bMCP服务器由以下人员识别 mcphost: mcp
您可以通过以下方式请求可用工具列表 /tools 命令: mcp
现在,您可以请求网页的内容并分析其内容(在我的示例中,我从GitHub检索Go代码): mcp
等一下: mcp
以下是网页内容: mcp
结论
你可以看到,只需几行,就很容易给你的LLM赋予“超能力”。在未来的博客文章中,我将向您展示如何使用Ollama和Go中的MCP客户端创建生成式AI应用程序,以与我们的MCP服务器交互。
