Simplify attribution of elicitation to a tool call
Opened this issue · 1 comments
ochafik commented
Currently one needs to do something like:
server.tool('elicit_inputs', 'Elicitation test tool', {}, async (_request, extra) => {
const result = await server.server.elicitInput(
{
message: 'Please provide inputs for the following fields:',
requestedSchema: ...
},
{
relatedRequestId: extra.requestId,
},
)
...
})I think we should add a zod-typed elicitInput method to tool callback extras + McpServer that then calls the low-level server's elicitInput (related to #662):
// Tool-related elicitation:
server.tool('elicit_inputs', 'Elicitation test tool', {}, async (_request, extra) => {
const result = await extra.elicitInput(
'Please provide inputs for the following fields:',
z.object(...))
...
})
// Non-tool-related elicitation
setInterval(async () => {
const {action, content} = await server.elicitInput('It has been an hour. Wanna post something?', z.object(....), {timeout: 30_000});
if (action == 'accept) ...
}, 3_600_000);
// Note: some connections might need help to stay alive.
setInterval(() => server.ping(), 5_000);KKonstantinov commented
Hi @ochafik , FWIW in our server, we have done similar in our framework anyway, where developers call elicitation in relation to a tool, then that calls the lower level method anyway. I guess I'm saying that the fact we opted in to do it on top of the SDK for me means there's value for it to be in the SDK itself.