Creating an MCP Server in Go and Serving it with Docker について
このチュートリアルでは、Goで小規模なMCPサーバーを作り、指定URLに対してcurlを実行してウェブページの内容を取得します。mcp-goで単一の取得ツールを実装し、MCPサーバー開発とDockerパッケージ化を学ぶ読者向けです。
主な機能
- 01GoでMCPサーバーを実装
- 02curlによるウェブページ取得
- 03必須URLパラメーターの受け付け
- 04ページ本文の返却とエラー処理
- 05Dockerによるサーバーのパッケージ化
活用シーン
- 01MCPツールの基本的な呼び出し手順の学習
- 02LLM分析用のウェブページ取得
- 03Dockerでのサーバー構築と実行
MCP 対応
この例はmcp-goとstdioトランスポートでMCPサーバーを実装します。MCPクライアントに、ウェブページを取得する単一のuse_curlツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Go で MCP サーバーを作成し、Docker で提供する
はじめに
今回は、Go で MCP サーバーを作成し、Docker で提供する方法を見ていきます。
前提条件:Model Context Protocol(MCP)を理解するを読んでいること。
MCP サーバーを作成するための公式 SDK はいくつかあります。
ここ数年、Go に興味を持つようになったので、Go の実装があるか調べてみました。https://github.com/punkpeye/awesome-mcp-servers?tab=readme-ov-file#frameworksのページでいくつか見つけました。特に注目したのは、mcphost の作者による https://github.com/mark3labs/mcp-go です(mcphost については、前回のブログ記事で説明し、使用しています)。
mcp-go プロジェクトの利点はシンプルであることに加え、MCP クライアントを開発するためのツールも提供していることです。これは、今後のブログ記事で役立ちます。
MCP サーバーの作成
ここでは、MCP サーバーでできることをすべて詳しく説明したり実装したりはしません。基本的な機能だけを実装します。
- LLM にツールの一覧を提供する
- LLM がツールを呼び出したときに実行する
LLM を使うときに、できるようになったらいいと思うことがあります。Web サイトのリンクを渡して、そこから情報を見つけたり、要約を作成したりできることです。
そこで、URL パラメーターを指定して curl ユーティリティを呼び出し、その内容を返す MCP サーバーを作成しました。ソースコードを見てみましょう。
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.0
main.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
}
解説
とてもシンプルです。サーバーが提供するツールは 1 つだけです。このコードでは、Model Control Protocol を使用して、curl に基づく Web ページの「取得」ツールを公開するサーバーを実装しています。
- まず、標準入力/出力(stdio)で動作する、バージョン
1.0.0のmcp-curlという名前の MCP サーバーを作成します - 次に、必須の
urlパラメーターを受け取るuse_curlという名前のツールを定義します - 最後に、このツールの
handlerを追加し、Web ページの内容を取得するために-sオプションを付けてcurlコマンドを実行します - もちろん、エラーを処理し、Web ページの内容をテキストとして返します
Docker で MCP サーバーをパッケージ化する
作業を簡単にするため、MCP サーバーを含む Docker イメージのビルドに Dockerfile を使います。こうすれば、さまざまなプラットフォームに簡単にデプロイしたり、使いたい人が誰でも利用できるようにしたりできます。
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 は 2 つの部分で構成されています。
- 最初の部分では、Go で MCP サーバーをビルドします
- 2 つ目の部分では、
curlを含むcurlimages/curl:8.6.0イメージを使い、mcp-curlサーバーをイメージにコピーします(つまり、mcp-curlがcurlを呼び出す実行ファイルです)
Docker イメージをビルドするには、次のコマンドを実行します。
docker build -t mcp-curl .
それでは、新しい MCP サーバーを mcphost で使う方法を見てみましょう。
mcphost で MCP サーバーを使う
まず、mcphost 用の設定ファイル mcp.json を作成する必要があります。
{
"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:14b
MCP サーバーが mcphost に認識されます。

利用可能なツールの一覧は、/tools コマンドで要求できます。

これで、Web ページの内容を要求し、その内容を分析できます(この例では、GitHub から Go のコードを取得します)。

少し待ちます。

Web ページの内容が表示されます。

まとめ
わずか数行のコードで、LLM に「超能力」を簡単に与えられることがお分かりいただけたと思います。今後のブログ記事では、Ollama と Go の MCP クライアントを使って、MCP サーバーとやり取りする生成 AI アプリケーションの作成方法を紹介します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。