File size: 2,807 Bytes
8019bac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0127f1d
8019bac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0127f1d
8019bac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main

import (
	"context"
	"encoding/json"
	"flag"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"strconv"

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

func webSearchHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	query := request.Params.Arguments["query"].(string)
	fmt.Println("query:", query)
	client := &http.Client{}

	//https://www.baidu.com/s?wd=ssstn=json&rn=10
	u, err := url.Parse("https://www.baidu.com/s")
	v := url.Values{}
	v.Add("wd", query)
	v.Add("tn", "json")
	v.Add("rn", "10")
	u.RawQuery = v.Encode()

	fmt.Println(v.Encode())

	req, _ := http.NewRequest("GET", u.String(), nil)
	req.Header.Set("Accept", "text/html")
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36")

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	fmt.Println("resp.StatusCode:", resp.StatusCode)
	type Entry struct {
		Title string
		Url   string
		Abs   string
	}

	type Feed struct {
		Entry []Entry
	}
	type Result struct {
		Feed Feed
	}

	var r Result
	err = json.NewDecoder(resp.Body).Decode(&r)
	if err != nil {
		return nil, err
	}
	var messages []mcp.Content
	for _, entry := range r.Feed.Entry {
		if entry.Abs != "" {
			log.Println(entry.Title, entry.Url, entry.Abs)
			s := "标题:" + entry.Title + "\n链接:" + entry.Url + "\n简介:" + entry.Abs
			messages = append(messages, mcp.TextContent{Type: "text", Text: s})
		}

	}

	return &mcp.CallToolResult{
		Content: messages,
	}, nil
}

func NewMCPServer() *server.MCPServer {
	// Create a new MCP server
	s := server.NewMCPServer(
		"Calculator Demo",
		"1.0.0",
		server.WithResourceCapabilities(true, true),
		server.WithLogging(),
	)
	webSearchTool := mcp.NewTool("web_search",
		mcp.WithDescription("web search tool"),
		mcp.WithString("query", mcp.Description("The web search query"), mcp.Required()),
	)

	s.AddTool(webSearchTool, webSearchHandler)
	return s
}

func main() {
	var transport string
	var port int
	flag.StringVar(&transport, "t", "sse", "Transport type (stdio or sse)")
	flag.StringVar(&transport, "transport", "sse", "Transport type (stdio or sse)")
	flag.IntVar(&port, "p", 8080, "Port number (default 8080)")
	flag.IntVar(&port, "port", 8080, "Port number (default 8080)")
	flag.Parse()

	mcpServer := NewMCPServer()

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

		sseServer := server.NewSSEServer(mcpServer)
		log.Printf("SSE server listening on :" + strconv.Itoa(port))
		if err := sseServer.Start(":" + strconv.Itoa(port)); err != nil {
			log.Fatalf("Server error: %v", err)
		}
	}
}