-
Notifications
You must be signed in to change notification settings - Fork 263
Implement SEP-973 #570
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement SEP-973 #570
Changes from 7 commits
2b368a3
085099e
970671b
24947b3
ec8b14a
dc32c43
1fb3343
6d6107f
5092e10
47f6939
8ab66a9
80ef38b
dc75b26
eb96101
e74e5c9
33fc556
b4f4f0d
b706c83
114c59f
9646ab2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -135,19 +135,36 @@ 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": | ||
| AddTool(s, &Tool{ | ||
| 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) | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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. | ||
| // | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the actual data does not matter, can we please make this "foobar".
I don't want arbitrary, unreviewable data to be checked into the repo (I don't know what this data represents).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed it to foobar. Its a base64 version of official MCP logo. You can check this at https://jaredwinick.github.io/base64-image-viewer/