@@ -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
1920func 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 , "\n Examples:\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