Merge pull request #17 from modelcontextprotocol/ochafik/add-elicitation-tool
Add elicitInputs tool to MCP server
This commit is contained in:
commit
2a6413d8e5
1 changed files with 93 additions and 1 deletions
|
|
@ -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}`);
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue