@@ -83,6 +83,77 @@ func registerExampleResources(s *mcp.Server) {
8383
8484 s .RegisterResource (imageResource , imageHandler )
8585 log .Printf ("Registered image resource: %s" , imageResource .Name )
86+
87+ // Register resource completion.
88+ textResourceCompletion := & mcp.Resource {
89+ URI : "resource://example/completion" ,
90+ Name : "example-text-completion" ,
91+ Description : "Example text resource with completion" ,
92+ MimeType : "text/plain" ,
93+ }
94+
95+ // Define completion resource handler
96+ resourceCompletionHandler := func (ctx context.Context , req * mcp.CompleteCompletionRequest ) (* mcp.CompleteCompletionResult , error ) {
97+ result := & mcp.CompleteCompletionResult {}
98+ if req .Params .Argument .Name == "query" {
99+ if req .Params .Context .Arguments != nil {
100+ // Use context argument if provided
101+ context , ok := req .Params .Context .Arguments ["context" ]
102+ if ok && context != "" {
103+ result .Completion .Values = []string {fmt .Sprintf ("Context: %s" , context )}
104+ } else {
105+ result .Completion .Values = []string {"Context is empty" }
106+ }
107+ } else {
108+ result .Completion .Values = []string {"First document text" , "Second document text" , "Third document text" }
109+ }
110+ } else {
111+ result .Completion .Values = []string {"Unknown argument" }
112+ }
113+ result .Completion .Total = len (result .Completion .Values )
114+ result .Completion .HasMore = false
115+ return result , nil
116+ }
117+ s .RegisterResource (textResourceCompletion , nil ,
118+ mcp .WithResourceCompletion (resourceCompletionHandler ),
119+ )
120+ log .Printf ("Registered text resource completion: %s" , textResourceCompletion .Name )
121+
122+ // Register resource template with completion
123+ fileTemplate := mcp .NewResourceTemplate (
124+ "file://{path}" ,
125+ "example-file-template-completion" ,
126+ mcp .WithTemplateDescription ("Example file resource template with completion" ),
127+ mcp .WithTemplateMIMEType ("text/plain" ),
128+ )
129+
130+ // Define completion handler for file paths
131+ fileCompletionHandler := func (ctx context.Context , req * mcp.CompleteCompletionRequest , params map [string ]string ) (* mcp.CompleteCompletionResult , error ) {
132+ result := & mcp.CompleteCompletionResult {}
133+ if req .Params .Argument .Name == "keyword" {
134+ keyword := req .Params .Argument .Value
135+ result .Completion .Values = []string {
136+ fmt .Sprint ("file://" , params ["path" ], "_1?keyword=" , keyword ),
137+ fmt .Sprint ("file://" , params ["path" ], "_2?keyword=" , keyword ),
138+ fmt .Sprint ("file://" , params ["path" ], "_3?keyword=" , keyword ),
139+ }
140+ } else {
141+ result .Completion .Values = []string {"unknown argument" }
142+ }
143+
144+ total := len (result .Completion .Values )
145+ result .Completion .Total = total
146+ result .Completion .HasMore = false
147+
148+ return result , nil
149+ }
150+
151+ s .RegisterResourceTemplate (
152+ fileTemplate ,
153+ nil ,
154+ mcp .WithTemplateCompletion (fileCompletionHandler ),
155+ )
156+ log .Printf ("Registered file resource template completion: %s" , fileTemplate .Name )
86157}
87158
88159// Register example prompts.
@@ -162,6 +233,73 @@ func registerExamplePrompts(s *mcp.Server) {
162233
163234 s .RegisterPrompt (advancedPrompt , advancedPromptHandler )
164235 log .Printf ("Registered advanced prompt: %s" , advancedPrompt .Name )
236+
237+ // Register prompt with completion support
238+ codeReviewPrompt := & mcp.Prompt {
239+ Name : "code_review" ,
240+ Description : "Code review prompt completion" ,
241+ Arguments : []mcp.PromptArgument {
242+ {
243+ Name : "language" ,
244+ Description : "Programming language of the code" ,
245+ Required : true ,
246+ },
247+ },
248+ }
249+
250+ // Define completion prompt handler
251+ codeReviewPromptHandler := func (ctx context.Context , req * mcp.GetPromptRequest ) (* mcp.GetPromptResult , error ) {
252+ return & mcp.GetPromptResult {
253+ Messages : []mcp.PromptMessage {
254+ {
255+ Role : "user" ,
256+ Content : mcp.TextContent {
257+ Type : "text" ,
258+ Text : fmt .Sprintf ("Please review the following %s code:\n %s" , req .Params .Arguments ["language" ], req .Params .Arguments ["code" ]),
259+ },
260+ },
261+ },
262+ }, nil
263+ }
264+
265+ // Define completion handler for prompt arguments
266+ codeReviewPromptCompletionHandler := func (ctx context.Context , req * mcp.CompleteCompletionRequest ) (* mcp.CompleteCompletionResult , error ) {
267+ result := & mcp.CompleteCompletionResult {}
268+ if req .Params .Argument .Name == "language" {
269+ prefix := req .Params .Argument .Value
270+ categories := []string {
271+ "python" , "pytorch" , "javascript" , "typescript" ,
272+ "go" , "java" , "c++" , "c#" , "ruby" , "php" ,
273+ }
274+
275+ var matches []string
276+ for _ , cat := range categories {
277+ if prefix == "" || len (prefix ) == 0 {
278+ matches = append (matches , cat )
279+ } else if len (cat ) >= len (prefix ) && cat [:len (prefix )] == prefix {
280+ matches = append (matches , cat )
281+ }
282+ }
283+
284+ // Limit to first 10 matches
285+ if len (matches ) > 10 {
286+ matches = matches [:10 ]
287+ }
288+
289+ result .Completion .Values = matches
290+ } else {
291+ result .Completion .Values = []string {"unknown argument" }
292+ }
293+
294+ total := len (result .Completion .Values )
295+ result .Completion .Total = total
296+ result .Completion .HasMore = false
297+
298+ return result , nil
299+ }
300+
301+ s .RegisterPrompt (codeReviewPrompt , codeReviewPromptHandler , mcp .WithPromptCompletion (codeReviewPromptCompletionHandler ))
302+ log .Printf ("Registered prompt completion: %s" , codeReviewPrompt .Name )
165303}
166304
167305// Register example tools.
0 commit comments