Zenn
Open14

MCPをgoで触ってみる

kurehajimekurehajime

MCPをgoで触ってみる

https://zenn.dev/uji/articles/try-mpc-development-mcp-go

この記事を参考に

kurehajimekurehajime

curosorのMCPの設定からAdd New Global MCP Server押して

mcp.jsonを編集して

{
    "mcpServers": {
        "calculator": {
            "command": "ビルドしたバイナリの絶対パス"
        }
    }
}
kurehajimekurehajime

駄洒落判定サーバーを作る

kurehajimekurehajime

こうだ

package main

import (
	"context"
	"encoding/json"
	"fmt"

	"github.com/kurehajime/dajarep"
	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
)

func main() {
	// Create a new MCP server
	s := server.NewMCPServer(
		"Dajarep",
		"1.0.0",
		server.WithResourceCapabilities(true, true),
		server.WithLogging(),
	)

	// Add a dajare tool
	dajareTool := mcp.NewTool("dajarep",
		mcp.WithDescription("Determines if a sentence contains a pun. 文章に駄洒落が含まれているか判定します"),
		mcp.WithString("sentence",
			mcp.Required(),
			mcp.Description("This argument is the sentence you want to determine if it is a pun."),
		),
	)

	// Add the calculator handler
	s.AddTool(dajareTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
		sentence := request.Params.Arguments["sentence"].(string)
		s, _ := dajarep.Dajarep(sentence, 2, false)
		result := map[string]interface{}{
			"result":  len(s) > 0,
			"matches": s,
		}
		jsonResult, err := json.Marshal(result)
		if err != nil {
			return nil, fmt.Errorf("JSON変換エラー: %v", err)
		}
		return mcp.NewToolResultText(string(jsonResult)), nil
	})

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

リポジトリはここ
https://github.com/kurehajime/dajarep_mcp

kurehajimekurehajime

引数は1つ。文字列を受け取る

    // Add a dajare tool
	dajareTool := mcp.NewTool("dajarep",
		mcp.WithDescription("Determines if a sentence contains a pun. 文章に駄洒落が含まれているか判定します"),
		mcp.WithString("sentence",
			mcp.Required(),
			mcp.Description("This argument is the sentence you want to determine if it is a pun."),
		),
	)
kurehajimekurehajime

駄洒落判定処理の本体。
ライブラリを呼び出してJSONを返してるだけ。

    // Add the dajare handler
	s.AddTool(dajareTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
		sentence := request.Params.Arguments["sentence"].(string)
		s, _ := dajarep.Dajarep(sentence, 2, false)
		result := map[string]interface{}{
			"result":  len(s) > 0,
			"matches": s,
		}
		jsonResult, err := json.Marshal(result)
		if err != nil {
			return nil, fmt.Errorf("JSON変換エラー: %v", err)
		}
		return mcp.NewToolResultText(string(jsonResult)), nil
	})
kurehajimekurehajime

結果

理由を説明できるんならMCPいらないじゃん、と思わなくはない

kurehajimekurehajime

このMCP本当はテキストをたくさん受け取れるんだけど、一個ずつしか渡してくれない

kurehajimekurehajime

引数名をsentenceからsentencesに変更し、説明文に「複数行受け取れるよ」と追記

ログインするとコメントできます