From 2b368a3bf9bddf06cb4145c4749b1379aa66199a Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sat, 11 Oct 2025 19:42:52 +0530 Subject: [PATCH 1/6] Implement SEP-973 --- mcp/protocol.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mcp/protocol.go b/mcp/protocol.go index 1312dfbd..9514ffbc 100644 --- a/mcp/protocol.go +++ b/mcp/protocol.go @@ -658,6 +658,21 @@ type ProgressNotificationParams struct { func (*ProgressNotificationParams) isParams() {} +// Icon provides visual identifiers for their resources, tools, prompts, and implementations +// See [/specification/draft/basic/index#icons] for notes on icons + +// TODO(iamsurajbobade): update specification url from draft. +type Icon struct { + // Source is A URI pointing to the icon resource (required). This can be: + // - An HTTP/HTTPS URL pointing to an image file + // - A data URI with base64-encoded image data + Source string `json:"src"` + // Optional MIME type if the server's type is missing or generic + MIMEType string `json:"mimeType,omitempty"` + // Optional size specification (e.g., ["48x48"], ["any"] for scalable formats like SVG, or ["48x48", "96x96"] for multiple sizes) + Sizes []string `json:"sizes,omitempty"` +} + // A prompt or prompt template that the server offers. type Prompt struct { // See [specification/2025-06-18/basic/index#general-fields] for notes on _meta @@ -673,6 +688,8 @@ type Prompt struct { // Intended for UI and end-user contexts — optimized to be human-readable and // easily understood, even by those unfamiliar with domain-specific terminology. Title string `json:"title,omitempty"` + // Icons for the prompt, if any. + Icons []Icon `json:"icons,omitempty"` } // Describes an argument that a prompt can accept. @@ -782,6 +799,8 @@ type Resource struct { Title string `json:"title,omitempty"` // The URI of this resource. URI string `json:"uri"` + // Icons for the resource, if any. + Icons []Icon `json:"icons,omitempty"` } type ResourceListChangedParams struct { @@ -948,6 +967,8 @@ type Tool struct { // If not provided, Annotations.Title should be used for display if present, // otherwise Name. Title string `json:"title,omitempty"` + // Icons for the tool, if any. + Icons []Icon `json:"icons,omitempty"` } // Additional properties describing a Tool to clients. @@ -1090,6 +1111,10 @@ type Implementation struct { // easily understood, even by those unfamiliar with domain-specific terminology. Title string `json:"title,omitempty"` Version string `json:"version"` + // WebsiteURL for the server, if any. + WebsiteURL string `json:"websiteUrl,omitempty"` + // Icons for the Server, if any. + Icons []Icon `json:"icons,omitempty"` } // Present if the server supports argument autocompletion suggestions. From 085099e78950fdfb1a04fbafa2d27d20f0cf6929 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sat, 11 Oct 2025 20:37:16 +0530 Subject: [PATCH 2/6] update tests --- mcp/mcp_test.go | 9 ++++++++- mcp/streamable_test.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mcp/mcp_test.go b/mcp/mcp_test.go index 0e1ee1f2..13582896 100644 --- a/mcp/mcp_test.go +++ b/mcp/mcp_test.go @@ -1646,7 +1646,14 @@ func TestNoDistributedDeadlock(t *testing.T) { } } -var testImpl = &Implementation{Name: "test", Version: "v1.0.0"} +var testImpl = &Implementation{ + Name: "test", Version: "v1.0.0", Title: "test-mcp-server", + WebsiteURL: "http://example.com", + Icons: []Icon{{ + Source: "data:image/png;base64,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", + MIMEType: "image/png", + Sizes: []string{"48x48", "96x96"}, + }}} // This test checks that when we use pointer types for tools, we get the same // schema as when using the non-pointer types. It is too much of a footgun for diff --git a/mcp/streamable_test.go b/mcp/streamable_test.go index 6ccaebf7..540a059c 100644 --- a/mcp/streamable_test.go +++ b/mcp/streamable_test.go @@ -1192,7 +1192,7 @@ func TestStreamableStateless(t *testing.T) { Tools: &ToolCapabilities{ListChanged: true}, }, ProtocolVersion: latestProtocolVersion, - ServerInfo: &Implementation{Name: "test", Version: "v1.0.0"}, + ServerInfo: testImpl, }, nil) // This version of sayHi expects // that request from our client). From 24947b35b2f8aba0b46be09964dc8249bab78930 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sun, 19 Oct 2025 15:59:13 +0530 Subject: [PATCH 3/6] revert tests --- mcp/mcp_test.go | 9 +-------- mcp/streamable_test.go | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/mcp/mcp_test.go b/mcp/mcp_test.go index c9ec98d4..a78c1525 100644 --- a/mcp/mcp_test.go +++ b/mcp/mcp_test.go @@ -1637,14 +1637,7 @@ func TestNoDistributedDeadlock(t *testing.T) { } } -var testImpl = &Implementation{ - Name: "test", Version: "v1.0.0", Title: "test-mcp-server", - WebsiteURL: "http://example.com", - Icons: []Icon{{ - Source: "data:image/png;base64,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", - MIMEType: "image/png", - Sizes: []string{"48x48", "96x96"}, - }}} +var testImpl = &Implementation{Name: "test", Version: "v1.0.0"} // This test checks that when we use pointer types for tools, we get the same // schema as when using the non-pointer types. It is too much of a footgun for diff --git a/mcp/streamable_test.go b/mcp/streamable_test.go index 8688df01..a0893689 100644 --- a/mcp/streamable_test.go +++ b/mcp/streamable_test.go @@ -1288,7 +1288,7 @@ func TestStreamableStateless(t *testing.T) { Tools: &ToolCapabilities{ListChanged: true}, }, ProtocolVersion: latestProtocolVersion, - ServerInfo: testImpl, + ServerInfo: &Implementation{Name: "test", Version: "v1.0.0"}, }, nil) // This version of sayHi expects // that request from our client). From ec8b14aaefbef0b5f1e465a42f2ee9b48f1d1f00 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sun, 19 Oct 2025 16:41:13 +0530 Subject: [PATCH 4/6] add draft protocol version --- mcp/shared.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mcp/shared.go b/mcp/shared.go index e90bcbd8..4fc88b87 100644 --- a/mcp/shared.go +++ b/mcp/shared.go @@ -33,8 +33,10 @@ const ( // // It is the version that the client sends in the initialization request, and // the default version used by the server. - latestProtocolVersion = protocolVersion20250618 - protocolVersion20250618 = "2025-06-18" + latestProtocolVersion = protocolVersion20250618 + + protocolVersionDraft = "draft" // draft protocol version with experimental features for testing + protocolVersion20250618 = "2025-06-18" // latest stable version protocolVersion20250326 = "2025-03-26" protocolVersion20241105 = "2024-11-05" ) @@ -48,6 +50,12 @@ var supportedProtocolVersions = []string{ // negotiatedVersion returns the effective protocol version to use, given a // client version. func negotiatedVersion(clientVersion string) string { + // If client sends protocol version draft, enable draft features. + if clientVersion == protocolVersionDraft { + log.Printf("Using draft protocol version features") + return protocolVersionDraft + } + // In general, prefer to use the clientVersion, but if we don't support the // client's version, use the latest version. // From dc32c434831793eeecf774c7bae98b4d6090abb9 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sun, 19 Oct 2025 16:41:51 +0530 Subject: [PATCH 5/6] Add conformance test for Icon and websiteUrl metadata --- mcp/conformance_test.go | 33 +++- .../conformance/server/version-draft.txtar | 149 ++++++++++++++++++ 2 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 mcp/testdata/conformance/server/version-draft.txtar diff --git a/mcp/conformance_test.go b/mcp/conformance_test.go index 3393efcb..6b2c19bf 100644 --- a/mcp/conformance_test.go +++ b/mcp/conformance_test.go @@ -135,12 +135,23 @@ func incTool(_ context.Context, _ *CallToolRequest, args incInput) (*CallToolRes return nil, incOutput{args.X + 1}, nil } +var iconObj = Icon{Source: "data:image/png;base64,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", + MIMEType: "image/png", Sizes: []string{"48x48", "96x96"}} + // runServerTest runs the server conformance test. // It must be executed in a synctest bubble. func runServerTest(t *testing.T, test *conformanceTest) { ctx := t.Context() // Construct the server based on features listed in the test. - s := NewServer(&Implementation{Name: "testServer", Version: "v1.0.0"}, nil) + impl := &Implementation{Name: "testServer", Version: "v1.0.0"} + + // TODO(IAmSurajBobade): Remove this hack once we have a client protocol specific handling. + if test.name == "version-draft.txtar" { + impl.Icons = []Icon{iconObj} + impl.WebsiteURL = "https://modelcontextprotocol.io" + } + + s := NewServer(impl, nil) for _, tn := range test.tools { switch tn { case "greet": @@ -148,6 +159,12 @@ func runServerTest(t *testing.T, test *conformanceTest) { Name: "greet", Description: "say hi", }, sayHi) + case "greetWithIcon": + AddTool(s, &Tool{ + Name: "greetWithIcon", + Description: "say hi", + Icons: []Icon{iconObj}, + }, sayHi) case "structured": AddTool(s, &Tool{Name: "structured"}, structuredTool) case "tomorrow": @@ -167,6 +184,13 @@ func runServerTest(t *testing.T, test *conformanceTest) { switch pn { case "code_review": s.AddPrompt(codeReviewPrompt, codReviewPromptHandler) + case "code_reviewWithIcon": + s.AddPrompt(&Prompt{ + Name: "code_review", + Description: "do a code review", + Arguments: []*PromptArgument{{Name: "Code", Required: true}}, + Icons: []Icon{iconObj}, + }, codReviewPromptHandler) default: t.Fatalf("unknown prompt %q", pn) } @@ -177,6 +201,13 @@ func runServerTest(t *testing.T, test *conformanceTest) { s.AddResource(resource1, readHandler) case "info": s.AddResource(resource3, handleEmbeddedResource) + case "infoWithIcon": + s.AddResource(&Resource{ + Name: "info", + MIMEType: "text/plain", + URI: "embedded:info", + Icons: []Icon{iconObj}, + }, handleEmbeddedResource) default: t.Fatalf("unknown resource %q", rn) } diff --git a/mcp/testdata/conformance/server/version-draft.txtar b/mcp/testdata/conformance/server/version-draft.txtar new file mode 100644 index 00000000..408f5502 --- /dev/null +++ b/mcp/testdata/conformance/server/version-draft.txtar @@ -0,0 +1,149 @@ +Check that when the client sends an arbitrary later version, the server +response with its latest supported version. + +-- tools -- +greetWithIcon + +-- prompts -- +code_reviewWithIcon + +-- resources -- +infoWithIcon + +-- client -- +{ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "draft", + "capabilities": {}, + "clientInfo": { "name": "ExampleClient", "version": "1.0.0" } + } +} +{ "jsonrpc": "2.0", "method": "notifications/initialized" } +{ "jsonrpc": "2.0", "id": 2, "method": "tools/list" } +{ "jsonrpc": "2.0", "id": 3, "method": "resources/list" } +{ "jsonrpc": "2.0", "id": 4, "method": "prompts/list" } + +-- server -- +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "capabilities": { + "logging": {}, + "prompts": { + "listChanged": true + }, + "resources": { + "listChanged": true + }, + "tools": { + "listChanged": true + } + }, + "protocolVersion": "draft", + "serverInfo": { + "name": "testServer", + "version": "v1.0.0", + "websiteUrl": "https://modelcontextprotocol.io", + "icons": [ + { + "src": "data:image/png;base64,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", + "mimeType": "image/png", + "sizes": [ + "48x48", + "96x96" + ] + } + ] + } + } +} +{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "tools": [ + { + "description": "say hi", + "inputSchema": { + "type": "object", + "required": [ + "Name" + ], + "properties": { + "Name": { + "type": "string" + } + }, + "additionalProperties": false + }, + "name": "greetWithIcon", + "icons": [ + { + "src": "data:image/png;base64,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", + "mimeType": "image/png", + "sizes": [ + "48x48", + "96x96" + ] + } + ] + } + ] + } +} +{ + "jsonrpc": "2.0", + "id": 3, + "result": { + "resources": [ + { + "mimeType": "text/plain", + "name": "info", + "uri": "embedded:info", + "icons": [ + { + "src": "data:image/png;base64,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", + "mimeType": "image/png", + "sizes": [ + "48x48", + "96x96" + ] + } + ] + } + ] + } +} +{ + "jsonrpc": "2.0", + "id": 4, + "result": { + "prompts": [ + { + "arguments": [ + { + "name": "Code", + "required": true + } + ], + "description": "do a code review", + "name": "code_review", + "icons": [ + { + "src": "data:image/png;base64,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", + "mimeType": "image/png", + "sizes": [ + "48x48", + "96x96" + ] + } + ] + } + ] + } +} + From 1fb33435b309af909efa28548599573de5af4548 Mon Sep 17 00:00:00 2001 From: iamsurajbobade Date: Sun, 19 Oct 2025 17:01:30 +0530 Subject: [PATCH 6/6] update test description --- mcp/testdata/conformance/server/version-draft.txtar | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mcp/testdata/conformance/server/version-draft.txtar b/mcp/testdata/conformance/server/version-draft.txtar index 408f5502..f218fa57 100644 --- a/mcp/testdata/conformance/server/version-draft.txtar +++ b/mcp/testdata/conformance/server/version-draft.txtar @@ -1,5 +1,13 @@ -Check that when the client sends an arbitrary later version, the server -response with its latest supported version. +Check behavior of server with Icons and websiteUrl metadata added as part of SEP-973 specification. + +check modelcontextprotocol/go-sdk/issues/552 for more details. + +Checks following: +- If client sends protocolVersion as "draft", server responds with same +- Test setting websiteUrl, icons for mcp.Implementation +- Test setting icons for mcp.Prompt +- Test setting icons for mcp.Tool +- Test setting icons for mcp.Resource -- tools -- greetWithIcon