nato243 weblog.n-jitter brand iconweblog.n-jitter
テクノロジー

ちょっとした自作MCPサーバーをmetoro-io/mcp-golang でめちゃ楽に作る

2025.03.15
AIGolangやってみた
ちょっとした自作MCPサーバーをmetoro-io/mcp-golang でめちゃ楽に作る アイキャッチ

いきなりコード

わりと感動したので勢いで文章書いてます。

https://github.com/metoro-io/mcp-golang

多くは語ることなかれ。

./cmd/vkMcpExampleTool/main.go にこういうの書くとする。


package main

import (
    "encoding/json"
    "fmt"
    "github.com/metoro-io/mcp-golang"
    "github.com/metoro-io/mcp-golang/transport/stdio"
)

type VkTextEditArguments struct {
    Ex0Text string `json:"ex0text" jsonschema:"required,description=ここで受け取った文字列をvkMcpExampleTool独自の文字列に加工して返します。"`
}

func main() {
    done := make(chan struct{})

    server := mcp_golang.NewServer(stdio.NewStdioServerTransport())

    {
       mcpName := `vk_text_edit`
       toolDescription := `受け取ったテキストをVK独自の文字列に加工して返します`

       err := server.RegisterTool(mcpName, toolDescription, func(arguments VkTextEditArguments) (*mcp_golang.ToolResponse, error) {
          type Response struct {
             Result string `json:"result"`
          }

          r := Response{
             Result: fmt.Sprintf(`++ %s ++`, arguments.Ex0Text),
          }
          respJ, _ := json.Marshal(r)

          return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(string(respJ))), nil
       })
       if err != nil {
          panic(err)
       }
    }

    err := server.Serve()
    if err != nil {
       panic(err)
    }

    <-done
}

ビルドする。


go install ./cmd/vkMcpExampleTool/...  




Claude DesktopやCline、Roo Code などお使いのAI エージェントのMCP設定にビルドしたコマンドを追加する

{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-puppeteer"]
    },
   ..... 
   "vkMcpExampleTool": {
      "command": "vkMcpExampleTool",
      "args": [],
      "env": {}
    }
  }
}

あとは使ってみよう

Claude Desktop

Roo Code

これだけだとだからなんだ、という話なのだが、
JSON-Schemaの設定などをGoのjsonschemaタグなどで勝手にやってくれるのが有用すぎる。
MCPサーバーはNode系のコミュニティがやはり豊富だが、既存資産にGoのものがあるチームはガンガン作っていってもいいのではないだろうか。
バイナリだとチームの非エンジニア職にも配りやすい気がする。

他のMCPサーバーのClientも構築できそうなので、Node製などの外部コマンド/サーバーがあっても中継基地として利用できそう。なんならこれ自体にもLLMを使わせて決まり切ったタスクを貯めといてもいいくらいかもしれない。

追記:

もともとGoで作ってたduckduckgo検索とスクレイピングをそれぞれRegisterToolしたら...
オレオレAI検索もできた。OSSだと自分なりの勘所とコスト調整が効く世界なのでおもしろいかも。