From e00c4859698408ae7e13d4d6d5e6d5df606ba558 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Wed, 30 Jul 2025 19:33:15 +0000 Subject: [PATCH] examples: add a 'listeverything' client example, and reorganize Add a client example that lists all features on a stdio server. Since this is our first client example, organize examples by client / server -- otherwise it is too difficult to find client examples. For #33 --- examples/client/listfeatures/main.go | 65 +++++++++++++++++++ examples/{ => server}/completion/main.go | 0 .../{ => server}/custom-transport/main.go | 0 examples/{ => server}/hello/main.go | 0 examples/{ => server}/memory/kb.go | 0 examples/{ => server}/memory/kb_test.go | 0 examples/{ => server}/memory/main.go | 0 examples/{ => server}/rate-limiting/go.mod | 0 examples/{ => server}/rate-limiting/go.sum | 0 examples/{ => server}/rate-limiting/main.go | 0 .../{ => server}/sequentialthinking/README.md | 0 .../{ => server}/sequentialthinking/main.go | 0 .../sequentialthinking/main_test.go | 0 examples/{ => server}/sse/main.go | 0 14 files changed, 65 insertions(+) create mode 100644 examples/client/listfeatures/main.go rename examples/{ => server}/completion/main.go (100%) rename examples/{ => server}/custom-transport/main.go (100%) rename examples/{ => server}/hello/main.go (100%) rename examples/{ => server}/memory/kb.go (100%) rename examples/{ => server}/memory/kb_test.go (100%) rename examples/{ => server}/memory/main.go (100%) rename examples/{ => server}/rate-limiting/go.mod (100%) rename examples/{ => server}/rate-limiting/go.sum (100%) rename examples/{ => server}/rate-limiting/main.go (100%) rename examples/{ => server}/sequentialthinking/README.md (100%) rename examples/{ => server}/sequentialthinking/main.go (100%) rename examples/{ => server}/sequentialthinking/main_test.go (100%) rename examples/{ => server}/sse/main.go (100%) diff --git a/examples/client/listfeatures/main.go b/examples/client/listfeatures/main.go new file mode 100644 index 0000000..caf21bf --- /dev/null +++ b/examples/client/listfeatures/main.go @@ -0,0 +1,65 @@ +// Copyright 2025 The Go MCP SDK Authors. All rights reserved. +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// The listfeatures command lists all features of a stdio MCP server. +// +// Usage: listfeatures [] +// +// For example: +// +// listfeatures go run github.com/modelcontextprotocol/go-sdk/examples/server/hello +// +// or +// +// listfeatures npx @modelcontextprotocol/server-everything +package main + +import ( + "context" + "flag" + "fmt" + "iter" + "log" + "os" + "os/exec" + + "github.com/modelcontextprotocol/go-sdk/mcp" +) + +func main() { + flag.Parse() + args := flag.Args() + if len(args) == 0 { + fmt.Fprintf(os.Stderr, "Usage: listfeatures []") + fmt.Fprintf(os.Stderr, "List all features for a stdio MCP server") + fmt.Fprintln(os.Stderr) + fmt.Fprintf(os.Stderr, "Example: listfeatures npx @modelcontextprotocol/server-everything") + os.Exit(2) + } + + ctx := context.Background() + cmd := exec.Command(args[0], args[1:]...) + client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil) + cs, err := client.Connect(ctx, mcp.NewCommandTransport(cmd)) + if err != nil { + log.Fatal(err) + } + defer cs.Close() + + printSection("tools", cs.Tools(ctx, nil), func(t *mcp.Tool) string { return t.Name }) + printSection("resources", cs.Resources(ctx, nil), func(r *mcp.Resource) string { return r.Name }) + printSection("resource templates", cs.ResourceTemplates(ctx, nil), func(r *mcp.ResourceTemplate) string { return r.Name }) + printSection("prompts", cs.Prompts(ctx, nil), func(p *mcp.Prompt) string { return p.Name }) +} + +func printSection[T any](name string, features iter.Seq2[T, error], featName func(T) string) { + fmt.Printf("%s:\n", name) + for feat, err := range features { + if err != nil { + log.Fatal(err) + } + fmt.Printf("\t%s\n", featName(feat)) + } + fmt.Println() +} diff --git a/examples/completion/main.go b/examples/server/completion/main.go similarity index 100% rename from examples/completion/main.go rename to examples/server/completion/main.go diff --git a/examples/custom-transport/main.go b/examples/server/custom-transport/main.go similarity index 100% rename from examples/custom-transport/main.go rename to examples/server/custom-transport/main.go diff --git a/examples/hello/main.go b/examples/server/hello/main.go similarity index 100% rename from examples/hello/main.go rename to examples/server/hello/main.go diff --git a/examples/memory/kb.go b/examples/server/memory/kb.go similarity index 100% rename from examples/memory/kb.go rename to examples/server/memory/kb.go diff --git a/examples/memory/kb_test.go b/examples/server/memory/kb_test.go similarity index 100% rename from examples/memory/kb_test.go rename to examples/server/memory/kb_test.go diff --git a/examples/memory/main.go b/examples/server/memory/main.go similarity index 100% rename from examples/memory/main.go rename to examples/server/memory/main.go diff --git a/examples/rate-limiting/go.mod b/examples/server/rate-limiting/go.mod similarity index 100% rename from examples/rate-limiting/go.mod rename to examples/server/rate-limiting/go.mod diff --git a/examples/rate-limiting/go.sum b/examples/server/rate-limiting/go.sum similarity index 100% rename from examples/rate-limiting/go.sum rename to examples/server/rate-limiting/go.sum diff --git a/examples/rate-limiting/main.go b/examples/server/rate-limiting/main.go similarity index 100% rename from examples/rate-limiting/main.go rename to examples/server/rate-limiting/main.go diff --git a/examples/sequentialthinking/README.md b/examples/server/sequentialthinking/README.md similarity index 100% rename from examples/sequentialthinking/README.md rename to examples/server/sequentialthinking/README.md diff --git a/examples/sequentialthinking/main.go b/examples/server/sequentialthinking/main.go similarity index 100% rename from examples/sequentialthinking/main.go rename to examples/server/sequentialthinking/main.go diff --git a/examples/sequentialthinking/main_test.go b/examples/server/sequentialthinking/main_test.go similarity index 100% rename from examples/sequentialthinking/main_test.go rename to examples/server/sequentialthinking/main_test.go diff --git a/examples/sse/main.go b/examples/server/sse/main.go similarity index 100% rename from examples/sse/main.go rename to examples/server/sse/main.go