Skip to content

Commit 601fd36

Browse files
authored
feat(copilotchat): add support for resource templates (#219)
After CopilotC-Nvim/CopilotChat.nvim@950fdb6 the plugin now parses schemas from URI templates automatically so adding this is now easy. Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
1 parent 9b4d511 commit 601fd36

1 file changed

Lines changed: 42 additions & 22 deletions

File tree

lua/mcphub/extensions/copilotchat/functions.lua

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ function M.register(opts)
7070
end
7171

7272
local async = require("plenary.async")
73+
local chat_functions = require("CopilotChat.functions")
7374
local shared = require("mcphub.extensions.shared")
7475

7576
-- Cleanup existing mcphub functions
@@ -208,6 +209,7 @@ function M.register(opts)
208209
for safe_server_name, data in pairs(server_data) do
209210
local server_name = data.server_name
210211
local resources = data.resources
212+
local resource_templates = data.resource_templates
211213

212214
-- Handle regular resources
213215
for _, resource in ipairs(resources) do
@@ -250,28 +252,46 @@ function M.register(opts)
250252
end
251253
end
252254

253-
--TODO: Handle resource templates
254-
-- local resource_templates = data.resource_templates
255-
-- for _, template in ipairs(resource_templates) do
256-
-- local template_name = template.name or extract_name_from_uri(template.uriTemplate)
257-
-- local function_name = create_function_name(safe_server_name, template_name, opts)
258-
--
259-
-- -- Check for function name conflicts
260-
-- if chat.config.functions[function_name] then
261-
-- table.insert(skipped_functions, function_name)
262-
-- else
263-
-- chat.config.functions[function_name] = {
264-
-- _mcphub = true,
265-
-- uri = template.uriTemplate,
266-
-- description = template.description or "No description provided",
267-
-- resolve = function()
268-
-- -- Resource templates need URI parameters filled in
269-
-- -- This would require additional UI for parameter collection
270-
-- error("Resource templates not yet supported")
271-
-- end,
272-
-- }
273-
-- end
274-
-- end
255+
-- Handle resource templates
256+
for _, template in ipairs(resource_templates) do
257+
local template_name = template.name or extract_name_from_uri(template.uriTemplate)
258+
local function_name = create_function_name(safe_server_name, template_name, opts)
259+
260+
-- Check for function name conflicts
261+
if chat.config.functions[function_name] then
262+
table.insert(skipped_functions, function_name)
263+
else
264+
chat.config.functions[function_name] = {
265+
_mcphub = true,
266+
uri = template.uriTemplate,
267+
description = template.description or "No description provided",
268+
resolve = function(input)
269+
local url = chat_functions.uri_to_url(template.uriTemplate, input or {})
270+
local res, err = access_resource(server_name, url)
271+
if err then
272+
error(err)
273+
end
274+
275+
res = res or {}
276+
local result_data = res.result or {}
277+
local content = result_data.contents or {}
278+
local out = {}
279+
280+
for _, message in ipairs(content) do
281+
if message.text then
282+
table.insert(out, {
283+
uri = message.uri,
284+
data = message.text,
285+
mimetype = message.mimeType,
286+
})
287+
end
288+
end
289+
290+
return out
291+
end,
292+
}
293+
end
294+
end
275295
end
276296
end
277297

0 commit comments

Comments
 (0)