Skip to content

Commit 1a6ee6a

Browse files
committed
update everything example
1 parent 5fa9116 commit 1a6ee6a

File tree

2 files changed

+40
-136
lines changed

2 files changed

+40
-136
lines changed

README.md

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,6 @@ func main() {
160160
return mcp.NewToolResultText(fmt.Sprintf("%.2f", result)), nil
161161
})
162162

163-
// Add a simple resource
164-
s.AddResource("docs://help/calculator", func() ([]interface{}, error) {
165-
return []interface{}{
166-
mcp.TextResourceContents{
167-
ResourceContents: mcp.ResourceContents{
168-
URI: "docs://help/calculator",
169-
MIMEType: "text/plain",
170-
},
171-
Text: "This calculator supports basic arithmetic operations: add, subtract, multiply, and divide.",
172-
},
173-
}, nil
174-
})
175-
176163
// Start the server
177164
if err := server.ServeStdio(s); err != nil {
178165
fmt.Printf("Server error: %v\n", err)
@@ -206,68 +193,6 @@ s := server.NewMCPServer(
206193
"1.0.0", // Version
207194
)
208195

209-
// Create a server with all capabilities enabled
210-
s := server.NewMCPServer(
211-
"Full Featured Server",
212-
"1.0.0",
213-
server.WithResourceCapabilities(true, true), // Enable resource subscriptions and list change notifications
214-
server.WithPromptCapabilities(true), // Enable prompt list change notifications
215-
server.WithLogging(), // Enable logging support
216-
)
217-
218-
// Add a notification handler
219-
s.AddNotificationHandler(func(notification mcp.JSONRPCNotification) {
220-
log.Printf("Received notification: %s", notification.Method)
221-
})
222-
223-
// Add a simple resource
224-
s.AddResource("test://example", func() ([]interface{}, error) {
225-
return []interface{}{
226-
mcp.TextResourceContents{
227-
ResourceContents: mcp.ResourceContents{
228-
URI: "test://example",
229-
MIMEType: "text/plain",
230-
},
231-
Text: "This is an example resource",
232-
},
233-
}, nil
234-
})
235-
236-
// Add a resource template
237-
s.AddResourceTemplate("test://users/{id}", func() (mcp.ResourceTemplate, error) {
238-
return mcp.ResourceTemplate{
239-
Name: "User Profile",
240-
Description: "Returns user profile information",
241-
MIMEType: "application/json",
242-
}, nil
243-
})
244-
245-
// Add a prompt
246-
s.AddPrompt(mcp.NewPrompt("greeting",
247-
mcp.WithPromptDescription("A friendly greeting prompt"),
248-
mcp.WithArgument("name",
249-
mcp.ArgumentDescription("Name of the person to greet"),
250-
),
251-
), func(args map[string]string) (*mcp.GetPromptResult, error) {
252-
name := args["name"]
253-
if name == "" {
254-
name = "friend"
255-
}
256-
257-
return mcp.NewGetPromptResult(
258-
"A friendly greeting",
259-
[]mcp.PromptMessage{
260-
{
261-
Role: mcp.RoleAssistant,
262-
Content: mcp.TextContent{
263-
Type: "text",
264-
Text: fmt.Sprintf("Hello, %s! How can I help you today?", name),
265-
},
266-
},
267-
},
268-
), nil
269-
})
270-
271196
// Start the server using stdio
272197
if err := server.ServeStdio(s); err != nil {
273198
log.Fatalf("Server error: %v", err)

examples/server/everything/stdio/main.go

Lines changed: 40 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -66,55 +66,35 @@ func NewMCPServer() *MCPServer {
6666
mcp.RequiredArgument(),
6767
),
6868
), s.handleComplexPrompt)
69-
s.server.AddTool(mcp.Tool{
70-
Name: string(ECHO),
71-
Description: "Echoes back the input",
72-
InputSchema: mcp.ToolInputSchema{
73-
Type: "object",
74-
Properties: map[string]interface{}{
75-
"message": map[string]interface{}{
76-
"type": "string",
77-
"description": "Message to echo",
78-
},
79-
},
80-
},
81-
}, s.handleEchoTool)
82-
s.server.AddTool(mcp.Tool{
83-
Name: string(ADD),
84-
Description: "Adds two numbers",
85-
InputSchema: mcp.ToolInputSchema{
86-
Type: "object",
87-
Properties: map[string]interface{}{
88-
"a": map[string]interface{}{
89-
"type": "number",
90-
"description": "First number",
91-
},
92-
"b": map[string]interface{}{
93-
"type": "number",
94-
"description": "Second number",
95-
},
96-
},
97-
},
98-
}, s.handleAddTool)
99-
s.server.AddTool(mcp.Tool{
100-
Name: string(LONG_RUNNING_OPERATION),
101-
Description: "Demonstrates a long running operation with progress updates",
102-
InputSchema: mcp.ToolInputSchema{
103-
Type: "object",
104-
Properties: map[string]interface{}{
105-
"duration": map[string]interface{}{
106-
"type": "number",
107-
"description": "Duration of the operation in seconds",
108-
"default": 10,
109-
},
110-
"steps": map[string]interface{}{
111-
"type": "number",
112-
"description": "Number of steps in the operation",
113-
"default": 5,
114-
},
115-
},
116-
},
117-
}, s.handleLongRunningOperationTool)
69+
s.server.AddTool(mcp.NewTool(string(ECHO),
70+
mcp.WithDescription("Echoes back the input"),
71+
mcp.WithString("message",
72+
mcp.Description("Message to echo"),
73+
mcp.Required(),
74+
),
75+
), s.handleEchoTool)
76+
s.server.AddTool(mcp.NewTool(string(ADD),
77+
mcp.WithDescription("Adds two numbers"),
78+
mcp.WithNumber("a",
79+
mcp.Description("First number"),
80+
mcp.Required(),
81+
),
82+
mcp.WithNumber("b",
83+
mcp.Description("Second number"),
84+
mcp.Required(),
85+
),
86+
), s.handleAddTool)
87+
s.server.AddTool(mcp.NewTool(string(LONG_RUNNING_OPERATION),
88+
mcp.WithDescription("Demonstrates a long running operation with progress updates"),
89+
mcp.WithNumber("duration",
90+
mcp.Description("Duration of the operation in seconds"),
91+
mcp.DefaultNumber(10),
92+
),
93+
mcp.WithNumber("steps",
94+
mcp.Description("Number of steps in the operation"),
95+
mcp.DefaultNumber(5),
96+
),
97+
), s.handleLongRunningOperationTool)
11898
// s.server.AddTool(mcp.Tool{
11999
// Name: string(SAMPLE_LLM),
120100
// Description: "Samples from an LLM using MCP's sampling feature",
@@ -133,14 +113,9 @@ func NewMCPServer() *MCPServer {
133113
// },
134114
// },
135115
// }, s.handleSampleLLMTool)
136-
s.server.AddTool(mcp.Tool{
137-
Name: string(GET_TINY_IMAGE),
138-
Description: "Returns the MCP_TINY_IMAGE",
139-
InputSchema: mcp.ToolInputSchema{
140-
Type: "object",
141-
Properties: map[string]interface{}{},
142-
},
143-
}, s.handleGetTinyImageTool)
116+
s.server.AddTool(mcp.NewTool(string(GET_TINY_IMAGE),
117+
mcp.WithDescription("Returns the MCP_TINY_IMAGE"),
118+
), s.handleGetTinyImageTool)
144119

145120
s.server.AddNotificationHandler(s.handleNotification)
146121

@@ -191,7 +166,9 @@ func (s *MCPServer) runUpdateInterval() {
191166
// }
192167
}
193168

194-
func (s *MCPServer) handleReadResource(arguments map[string]interface{}) ([]interface{}, error) {
169+
func (s *MCPServer) handleReadResource(
170+
arguments map[string]interface{},
171+
) ([]interface{}, error) {
195172
return []interface{}{
196173
mcp.TextResourceContents{
197174
ResourceContents: mcp.ResourceContents{
@@ -203,10 +180,12 @@ func (s *MCPServer) handleReadResource(arguments map[string]interface{}) ([]inte
203180
}, nil
204181
}
205182

206-
func (s *MCPServer) handleResourceTemplate(arguments map[string]interface{}) (mcp.ResourceTemplate, error) {
183+
func (s *MCPServer) handleResourceTemplate(
184+
arguments map[string]interface{},
185+
) (mcp.ResourceTemplate, error) {
207186
return mcp.ResourceTemplate{
208187
URITemplate: "test://static/resource/{id}",
209-
Name: "Static Resource",
188+
Name: "Static Resource",
210189
Description: "A static resource with a numeric ID",
211190
}, nil
212191
}
@@ -404,4 +383,4 @@ func main() {
404383
}
405384
}
406385

407-
const MCP_TINY_IMAGE = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="
386+
const MCP_TINY_IMAGE = "iVBORw0KGgoAAAANSUhEUgAAARgAAAEYCAIAAAAI7H7bAAAZyUlEQVR4nOzce1RVZd4H8MM5BwERQUDxQpCoI0RajDWjomSEkOaltDBvaaIVy5aJltNkadkSdXJoWs6IKZko6bh0aABXxDTCKFgwgwalOKCICiJyEY7cz+Fw3rV63nnWb/a5eNSfWNP389fZt2dvNvu797Of5zlHazKZVABwZ9T3+gAA/hcgSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABho7/UBwM9L9w9M/43OkZ/FyhaXqlQqOp+uJrYy/qCrq0t87urqMhqN3d3dKpWq6wdiUi7t6uoSJZhvJRaZTCYxKTY0Go0eHh7Lly/v06eP+LsQpJ8vcZUYDAb9D8SFJSfF5SU+GwwGcQnq/0NuaDAYxIaKRWKp0Wg0mUzyYqUXrtFoFBe9nJRXv7hY5YaKRWJDOikS0pO8vLwyMzNlin56QZJ3I4vzzT/f6srimuj6D/n/MxgM8o5lMBjkZSEW0f863Zbe6hRligLpYciixFJ6uSgORnH7VCxSXLt0qVikOI2KU2r/pO01/1e5uLjMmzfv9ddfDwwMpPNvEiSDwXD06FHxH6VPUvn0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2rVrtPNq4MCB1tqIc3Nzb+Xf/l/i4uIslqnoJzhz5gz9lgSvkJAQnU73u9/97uDBg6J6cuzYsfj4+NWrV+fk5BQVFcmjio+PF52tPj4+u3btMr9a7om7HqScnBxaSTPvWBDkqIIDBw6YL1X8uMK6deto/dDZ2dnaaOIvv/ySbrh79276ew/+/v4Wt1L0HcfGxup0OtpTPm/ePIsbKrpEXVxcTp8+be3MKL4PsmTJkhMnTtBOgtDQ0JaWFtoxOnbsWGulKb6Lbj+tViu/fqeg+GJlSkqK4jnMZfTo0eIYXnrppdLS0uLiYrVaffXq1V//+tfiZwLE92EbGhrEC3avXr0WLFhAv3B5z931xgbR2iM+9+nTZ9y4cRZXmzJlimg8ffrpp82XKt6RCgoK6IDr8PBwa+PKFJX4oqIi2ixm7UdU5s6dS4cL7dmzp6SkhDbjWvyJQJVK9eSTT7722mtysr29feHChdaGOSve1oYOHXr+/HnaRPHwww8rvvwTFBRksSgxtMzaItvmzZtn8Yux5iNNs7KybPzy220QnXjbt28/ceKEOIby8vIPP/xQ9G5t3LgxODj4hRdeWLx4cUVFRV5e3iOPPPLVV1+99dZbpaWl+/btszik61656z/HJX6G9/935uBgrQ1H/OipWq221tZko3NGo9FYexURdUs5qVar6ZVqY3ei7VhOarVag8EgH61ardbar+SIn8+mc6z15yjWFH8CbZURe+no6JD7tfGX0vN8S+w/ew4ODFeLqDzLv06j0dCHsDjtckdardZoNDo4OOTm5s6YMaO1tfXw4cOzZ8++w2O4G/C7dvCj1tbW9u67737wwQdBQUFbt26dOnXqvT4iy35iP6IPPysVFRXR0dFarTYtLS0iIsLen5i7F36SP+oNPwepqamRkZELFiz45ptvZsyY8WNOEZ5I8GOUn58fFxcXGBiYl5d3S1/av4fwjgQ/LhcvXoyIiNi/f/89Gelz2/BEgh+XwsLCo0ePKoa//PjhiQTAAI0NAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAwQJAAGCBIAAwQJgAGCBMAAQQJggCABMECQABggSAAMECQABggSAAMECYABggTAAEECYIAgATBAkAAYIEgADBAkAAYIEgADBAmAAYIEwABBAmCAIAEwQJAAGCBIAAz+LwAA///FzJto8JNVBwAAAABJRU5ErkJggg=="

0 commit comments

Comments
 (0)