Merge pull request #17 from modelcontextprotocol/ochafik/add-elicitation-tool

Add elicitInputs tool to MCP server
This commit is contained in:
bhosmer-ant 2025-10-16 14:47:50 -04:00 • committed by GitHub
commit 2a6413d8e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,6 +4,7 @@ import {
CompleteRequestSchema,
CreateMessageRequest,
CreateMessageResultSchema,
ElicitResultSchema,
GetPromptRequestSchema,
ListPromptsRequestSchema,
ListResourcesRequestSchema,
@ -87,6 +88,7 @@ enum ToolName {
GET_TINY_IMAGE = "getTinyImage",
ANNOTATED_MESSAGE = "annotatedMessage",
GET_RESOURCE_REFERENCE = "getResourceReference",
ELICIT_INPUTS = "elicitInputs",
}
enum PromptName {
@ -446,12 +448,18 @@ export const createMcpServer = (): McpServerWrapper => {
"Returns a resource reference that can be used by MCP clients",
inputSchema: zodToJsonSchema(GetResourceReferenceSchema) as ToolInput,
},
{
name: ToolName.ELICIT_INPUTS,
description:
"Elicitation test tool that demonstrates how to request user input with various field types",
inputSchema: { type: "object" , properties: {} },
},
];
return { tools };
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
const { name, arguments: args } = request.params;
if (name === ToolName.ECHO) {
@ -624,6 +632,90 @@ export const createMcpServer = (): McpServerWrapper => {
return { content };
}
if (name === ToolName.ELICIT_INPUTS) {
const result = await extra.sendRequest({
method: 'elicitation/create',
params: {
message: "Please provide inputs for the following fields:",
requestedSchema: {
type: "object",
properties: {
name: {
title: "Full Name",
type: "string",
description: "Your full, legal name",
},
check: {
title: "Agree to terms",
type: "boolean",
description: "A boolean check",
},
color: {
title: "Favorite Color",
type: "string",
description: "Favorite color (open text)",
default: "blue",
},
email: {
title: "Email Address",
type: "string",
format: "email",
description:
"Your email address (will be verified, and never shared with anyone else)",
},
homepage: {
type: "string",
format: "uri",
description: "Homepage / personal site",
},
birthdate: {
title: "Birthdate",
type: "string",
format: "date",
description:
"Your date of birth (will never be shared with anyone else)",
},
integer: {
title: "Favorite Integer",
type: "integer",
description:
"Your favorite integer (do not give us your phone number, pin, or other sensitive info)",
minimum: 1,
maximum: 100,
default: 42,
},
number: {
title: "Favorite Number",
type: "number",
description: "Favorite number (there are no wrong answers)",
minimum: 0,
maximum: 1000,
default: 3.14,
},
petType: {
title: "Pet type",
type: "string",
enum: ["cats", "dogs", "birds", "fish", "reptiles"],
enumNames: ["Cats", "Dogs", "Birds", "Fish", "Reptiles"],
default: "dogs",
description: "Your favorite pet type",
},
},
required: ["name"],
},
}
}, ElicitResultSchema, {timeout: 10 * 60 * 1000 /* 10 minutes */});
return {
content: [
{
type: "text",
text: `Elicitation result: ${JSON.stringify(result, null, 2)}`,
},
],
};
}
throw new Error(`Unknown tool: ${name}`);
});