Open14
MCPをgoで触ってみる

MCPをgoで触ってみる
この記事を参考に

mcp-goいれて

サンプルコードそのままコピペしてビルドして

curosorのMCPの設定からAdd New Global MCP Server押して
mcp.jsonを編集して
{
"mcpServers": {
"calculator": {
"command": "ビルドしたバイナリの絶対パス"
}
}
}

できた
ここまでサンプル通り

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

以前作った駄洒落判定コマンドラインツールをライブラリとして使う

こうだ
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)
}
}
リポジトリはここ

引数は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."),
),
)

駄洒落判定処理の本体。
ライブラリを呼び出して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
})

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

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

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

ちゃんと使いこなしてくれるようになった
ログインするとコメントできます