modelcontextprotocol/typescript-sdk

Simplify attribution of elicitation to a tool call

Opened this issue · 1 comments

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);

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.