Skip to content

Commit cdb64ce

Browse files
committed
Accept URL
1 parent 1e2c65c commit cdb64ce

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

examples/http/main.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,46 +10,47 @@ import (
1010
"fmt"
1111
"log"
1212
"net/http"
13+
"net/url"
1314
"os"
1415
"time"
1516

1617
"github.com/modelcontextprotocol/go-sdk/mcp"
1718
)
1819

1920
func main() {
20-
var (
21-
host = flag.String("host", "localhost", "Host to connect to or listen on")
22-
port = flag.String("port", "8080", "Port to connect to or listen on")
23-
)
24-
2521
flag.Usage = func() {
26-
fmt.Fprintf(os.Stderr, "Usage: %s <client|server> [options]\n\n", os.Args[0])
22+
fmt.Fprintf(os.Stderr, "Usage: %s <client|server> [proto://<host>:<port>]\n\n", os.Args[0])
2723
fmt.Fprintf(os.Stderr, "This program demonstrates MCP over HTTP using the streamable transport.\n")
2824
fmt.Fprintf(os.Stderr, "It can run as either a server or client.\n\n")
2925
fmt.Fprintf(os.Stderr, "Options:\n")
3026
flag.PrintDefaults()
3127
fmt.Fprintf(os.Stderr, "\nExamples:\n")
3228
fmt.Fprintf(os.Stderr, " Run as server: %s server\n", os.Args[0])
3329
fmt.Fprintf(os.Stderr, " Run as client: %s client\n", os.Args[0])
34-
fmt.Fprintf(os.Stderr, " Custom host/port: %s server -host 0.0.0.0 -port 9090\n", os.Args[0])
30+
fmt.Fprintf(os.Stderr, " Custom host/port: %s server https://0.0.0.0:8000\n", os.Args[0])
3531
os.Exit(1)
3632
}
3733

38-
// Check if we have at least one argument.
3934
if len(os.Args) < 2 {
4035
fmt.Fprintf(os.Stderr, "Error: Must specify 'client' or 'server' as first argument\n\n")
4136
flag.Usage()
4237
}
4338
mode := os.Args[1]
4439

45-
os.Args = append(os.Args[:1], os.Args[2:]...)
46-
flag.Parse()
40+
rawurl := "http://localhost:8000"
41+
if len(os.Args) >= 3 {
42+
rawurl = os.Args[2]
43+
}
44+
url, err := url.Parse(rawurl)
45+
if err != nil {
46+
log.Fatalf("Server failed: %v", err)
47+
}
4748

4849
switch mode {
4950
case "server":
50-
runServer(*host, *port)
51+
runServer(url)
5152
case "client":
52-
runClient(*host, *port)
53+
runClient(url)
5354
default:
5455
fmt.Fprintf(os.Stderr, "Error: Invalid mode '%s'. Must be 'client' or 'server'\n\n", mode)
5556
flag.Usage()
@@ -108,7 +109,7 @@ func getTime(ctx context.Context, ss *mcp.ServerSession, params *mcp.CallToolPar
108109
}, nil
109110
}
110111

111-
func runServer(host, port string) {
112+
func runServer(url *url.URL) {
112113
// Create an MCP server.
113114
server := mcp.NewServer(&mcp.Implementation{
114115
Name: "time-server",
@@ -128,25 +129,24 @@ func runServer(host, port string) {
128129

129130
handlerWithLogging := loggingHandler(handler)
130131

131-
addr := fmt.Sprintf("%s:%s", host, port)
132-
log.Printf("MCP server listening on http://%s", addr)
132+
laddr := fmt.Sprintf("%s:%s", url.Hostname(), url.Port())
133+
log.Printf("MCP server listening on %s", laddr)
133134
log.Printf("Available tool: cityTime (cities: nyc, sf, boston)")
134135

135136
// Start the HTTP server with logging handler.
136-
if err := http.ListenAndServe(addr, handlerWithLogging); err != nil {
137+
if err := http.ListenAndServe("localhost:8000", handlerWithLogging); err != nil {
137138
log.Fatalf("Server failed: %v", err)
138139
}
139140
}
140141

141-
func runClient(host, port string) {
142+
func runClient(url *url.URL) {
142143
ctx := context.Background()
143144

144145
// Create the URL for the server.
145-
url := fmt.Sprintf("http://%s:%s", host, port)
146-
log.Printf("Connecting to MCP server at %s", url)
146+
log.Printf("Connecting to MCP server at %s", url.String())
147147

148148
// Create a streamable client transport.
149-
transport := mcp.NewStreamableClientTransport(url, nil)
149+
transport := mcp.NewStreamableClientTransport(url.String(), nil)
150150

151151
// Create an MCP client.
152152
client := mcp.NewClient(&mcp.Implementation{

0 commit comments

Comments
 (0)