mcpField
C
Creating an MCP Server in Go and Serving it with Docker

Creating an MCP Server in Go and Serving it with Docker

ローカル
github.com/ollama-tlms-golangクラウド・インフラ1195 週間前に更新

Creating an MCP Server in Go and Serving it with Docker について

このチュートリアルでは、Goで小規模なMCPサーバーを作り、指定URLに対してcurlを実行してウェブページの内容を取得します。mcp-goで単一の取得ツールを実装し、MCPサーバー開発とDockerパッケージ化を学ぶ読者向けです。

主な機能

  1. 01GoでMCPサーバーを実装
  2. 02curlによるウェブページ取得
  3. 03必須URLパラメーターの受け付け
  4. 04ページ本文の返却とエラー処理
  5. 05Dockerによるサーバーのパッケージ化

活用シーン

  1. 01MCPツールの基本的な呼び出し手順の学習
  2. 02LLM分析用のウェブページ取得
  3. 03Dockerでのサーバー構築と実行

MCP 対応

この例はmcp-goとstdioトランスポートでMCPサーバーを実装します。MCPクライアントに、ウェブページを取得する単一のuse_curlツールを提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"05-make-your": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"build"
]
}
}
}
起動コマンドdocker run -i --rm build

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocibuild

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

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 に認識されます。 mcp

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

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

少し待ちます。 mcp

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

まとめ

わずか数行のコードで、LLM に「超能力」を簡単に与えられることがお分かりいただけたと思います。今後のブログ記事では、Ollama と Go の MCP クライアントを使って、MCP サーバーとやり取りする生成 AI アプリケーションの作成方法を紹介します。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。