Skip to content

Commit a556d78

Browse files
Merge branch 'main' into fweinberger/sep-1699
2 parents 2242fc9 + 4debc74 commit a556d78

22 files changed

+3532
-226
lines changed

README.md

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ await server.connect(transport);
11751175

11761176
### Eliciting User Input
11771177

1178-
MCP servers can request additional information from users through the elicitation feature. This is useful for interactive workflows where the server needs user input or confirmation:
1178+
MCP servers can request non-sensitive information from users through the form elicitation capability. This is useful for interactive workflows where the server needs user input or confirmation:
11791179

11801180
```typescript
11811181
// Server-side: Restaurant booking tool that asks for alternatives
@@ -1208,6 +1208,7 @@ server.registerTool(
12081208
if (!available) {
12091209
// Ask user if they want to try alternative dates
12101210
const result = await server.server.elicitInput({
1211+
mode: 'form',
12111212
message: `No tables available at ${restaurant} on ${date}. Would you like to check alternative dates?`,
12121213
requestedSchema: {
12131214
type: 'object',
@@ -1274,7 +1275,7 @@ server.registerTool(
12741275
);
12751276
```
12761277

1277-
Client-side: Handle elicitation requests
1278+
On the client side, handle form elicitation requests:
12781279

12791280
```typescript
12801281
// This is a placeholder - implement based on your UI framework
@@ -1299,7 +1300,85 @@ client.setRequestHandler(ElicitRequestSchema, async request => {
12991300
});
13001301
```
13011302

1302-
**Note**: Elicitation requires client support. Clients must declare the `elicitation` capability during initialization.
1303+
When calling `server.elicitInput`, prefer to explicitly set `mode: 'form'` for new code. Omitting the mode continues to work for backwards compatibility and defaults to form elicitation.
1304+
1305+
Elicitation is a client capability. Clients must declare the `elicitation` capability during initialization:
1306+
1307+
```typescript
1308+
const client = new Client(
1309+
{
1310+
name: 'example-client',
1311+
version: '1.0.0'
1312+
},
1313+
{
1314+
capabilities: {
1315+
elicitation: {
1316+
form: {}
1317+
}
1318+
}
1319+
}
1320+
);
1321+
```
1322+
1323+
**Note**: Form elicitation **must** only be used to gather non-sensitive information. For sensitive information such as API keys or secrets, use URL elicitation instead.
1324+
1325+
### Eliciting URL Actions
1326+
1327+
MCP servers can prompt the user to perform a URL-based action through URL elicitation. This is useful for securely gathering sensitive information such as API keys or secrets, or for redirecting users to secure web-based flows.
1328+
1329+
```typescript
1330+
// Server-side: Prompt the user to navigate to a URL
1331+
const result = await server.server.elicitInput({
1332+
mode: 'url',
1333+
message: 'Please enter your API key',
1334+
elicitationId: '550e8400-e29b-41d4-a716-446655440000',
1335+
url: 'http://localhost:3000/api-key'
1336+
});
1337+
1338+
// Alternative, return an error from within a tool:
1339+
throw new UrlElicitationRequiredError([
1340+
{
1341+
mode: 'url',
1342+
message: 'This tool requires a payment confirmation. Open the link to confirm payment!',
1343+
url: `http://localhost:${MCP_PORT}/confirm-payment?session=${sessionId}&elicitation=${elicitationId}&cartId=${encodeURIComponent(cartId)}`,
1344+
elicitationId: '550e8400-e29b-41d4-a716-446655440000'
1345+
}
1346+
]);
1347+
```
1348+
1349+
On the client side, handle URL elicitation requests:
1350+
1351+
```typescript
1352+
client.setRequestHandler(ElicitRequestSchema, async request => {
1353+
if (request.params.mode !== 'url') {
1354+
throw new McpError(ErrorCode.InvalidParams, `Unsupported elicitation mode: ${request.params.mode}`);
1355+
}
1356+
1357+
// At a minimum, implement a UI that:
1358+
// - Display the full URL and server reason to prevent phishing
1359+
// - Explicitly ask the user for consent, with clear decline/cancel options
1360+
// - Open the URL in the system (not embedded) browser
1361+
// Optionally, listen for a `nofifications/elicitation/complete` message from the server
1362+
});
1363+
```
1364+
1365+
Elicitation is a client capability. Clients must declare the `elicitation` capability during initialization:
1366+
1367+
```typescript
1368+
const client = new Client(
1369+
{
1370+
name: 'example-client',
1371+
version: '1.0.0'
1372+
},
1373+
{
1374+
capabilities: {
1375+
elicitation: {
1376+
url: {}
1377+
}
1378+
}
1379+
}
1380+
);
1381+
```
13031382

13041383
### Writing MCP Clients
13051384

0 commit comments

Comments
 (0)