os.MkdirAll(outDir, 0o755); err != nil { log.Fatalf("Failed to create output directory: %v", err) } f, err := os.Create(filepath.Join(outDir, "mcp.gen.go")) if err != nil { log.Fatalf("Failed to create file: %v", err) } defer f.Close() def := &codegen.ServerDefinition{ Capabilities: codegen.ServerCapabilities{ Tools: &codegen.ToolCapability{}, Logging: &codegen.LoggingCapability{}, }, Implementation: codegen.Implementation{ Name: "Scrapbox MCP Server", Version: "1.0.0", }, Tools: []codegen.Tool{ { Name: "get_page", Description: "Get a Scrapbox page by title", InputSchema: struct { PageTitle string `json:"page_title" jsonschema:"description=page title,required"` }{}, }, // 他の機能は省略 }, } if err := codegen.Generate(f, def, "scrapbox"); err != nil { log.Fatalf("Failed to generate code: %v", err) } } ktr0731/go-mcp type ServerToolHandler interface { // 定義したtoolに対応するメソッドのシグネチャの集合を表現するインターフェース HandleToolGetPage(ctx context.Context, req *ToolGetPageRequest) (*mcp.CallToolResult, error) } type ToolGetPageRequest struct { PageTitle string `json:"page_title"` } var ( ToolGetPageInputSchema = json.RawMessage(`{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"page_title":{"type":"string","de scription":"Page title to retrieve"}},"additionalProperties":false,"type":"object","required":["page_title"]}`) ) var ToolList = []protocol.Tool{ { Name: "get_page", Description: "Get a Scrapbox page by title", InputSchema: ToolGetPageInputSchema, }, } func NewHandler(toolHandler ServerToolHandler) *mcp.Handler { // handlerのコンストラクタ h := &mcp.Handler{} h.Capabilities = protocol.ServerCapabilities{ Tools: &protocol.ToolCapability{}, Logging: &protocol.LoggingCapability{}, } h.Implementation = protocol.Implementation{ Name: "Scrapbox MCP Server", Version: "1.0.0", } h.Tools = ToolList h.ToolHandler = protocol.ServerHandlerFunc[protocol.CallToolRequestParams](func(ctx context.Context, method string, req protocol.CallToolRequestParams) (any, error) { idx := slices.IndexFunc(ToolList, func(t protocol.Tool) bool { return t.Name == req.Name }) if idx == -1 { return nil, fmt.Errorf("tool not found: %s", req.Name) } switch method { case "tools/call": switch req.Name { case "get_page": var in ToolGetPageRequest if err := json.Unmarshal(req.Arguments, &in); err != nil { return nil, err } inputSchema, _ := ToolList[idx].InputSchema.(json.RawMessage) if err := protocol.ValidateByJSONSchema(string(inputSchema), in); err != nil { return nil, err } return toolHandler.HandleToolGetPage(ctx, &in) default: return nil, fmt.Errorf("tool not found: %s", req.Name) } default: return nil, fmt.Errorf("method %s not found", method) } }) return h } 型定義からコード生成