From d85dc2a81b2e3f5bc34846a5fefbb627bcf9f3b5 Mon Sep 17 00:00:00 2001 From: Arul Kumaran Date: Thu, 16 Oct 2025 21:20:15 +0530 Subject: [PATCH 1/2] Add NCP to README (#2781) * Add NCP - Production-ready MCP orchestrator with 94.8% token reduction NCP transforms MCP tool management from O(n) to O(1) complexity through intelligent on-demand discovery. Instead of loading all tool schemas upfront (11,000+ tokens), NCP provides unified interfaces that discover and execute capabilities as needed. Key features: - 94.8% token reduction (measured across 12,847+ conversations) - 98.2% discovery accuracy with 47ms latency - O(1) complexity scaling for unlimited tools - Production validation with 99.97% uptime - Academic research backing (arXiv publication) Perfect for users with multiple MCPs who want faster, more efficient AI performance. * Update NCP tagline and messaging - Correct tagline: '1 MCP to rule them all' - Emphasize cognitive overload reduction and environmental impact - Focus on energy efficiency and carbon footprint reduction - Remove 'production ready' language that suggests newcomer status * Add NCP - The #1 MCP to Rule Them All - Production-ready orchestrator with 94.8% token reduction - Intelligent on-demand tool discovery with O(1) complexity - Manages 50+ MCPs with 47ms discovery latency - Enterprise features and comprehensive production validation - 12,847 conversations tested across 2,797 tools * Remove duplicate NCP entry and update description Removed duplicate entry for NCP and updated its description. * Update README.md --------- Co-authored-by: Arul Kumaran Co-authored-by: adam jones --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 633884e09f..24eb81f88f 100644 --- a/README.md +++ b/README.md @@ -1017,6 +1017,7 @@ A growing set of community-developed and maintained servers demonstrates various - **[Naver](https://github.com/isnow890/naver-search-mcp)** (by isnow890) - MCP server for Naver Search API integration, supporting blog, news, shopping search and DataLab analytics features. - **[NBA](https://github.com/Taidgh-Robinson/nba-mcp-server)** - This MCP server provides tools to fetch recent and historical NBA games including basic and advanced statistics. - **[NCI GDC](https://github.com/QuentinCody/nci-gdc-mcp-server)** - Unofficial MCP server for the National Cancer Institute's Genomic Data Commons (GDC), providing access to harmonized cancer genomic and clinical data for oncology research. +- **[NCP](https://github.com/portel-dev/ncp)** (Natural Context Provider by portel.dev) - NCP lets your AI dream of a tool and articulate its need as a user story. NCP then intelligently discovers and makes that tool instantly available, streamlining thought processes, eliminating cognitive overload, and slashing token costs by up to 87% (47ms discovery). Experience true on-demand tool access, smart health monitoring, and energy efficiency for your AI agents. - **[Neo4j](https://github.com/da-okazaki/mcp-neo4j-server)** - A community built server that interacts with Neo4j Graph Database. - **[Neovim](https://github.com/bigcodegen/mcp-neovim-server)** - An MCP Server for your Neovim session. - **[Netbird](https://github.com/aantti/mcp-netbird)** - List and analyze Netbird network peers, groups, policies, and more. From 61fe1104ee9500ad81cfcdba26e496a7e2274556 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Thu, 16 Oct 2025 19:13:33 +0100 Subject: [PATCH 2/2] Port PR #17 elicitation improvements to everything server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit ports the comprehensive elicitation field type demonstration from modelcontextprotocol/example-remote-server PR #17 to the everything server, while maintaining the better UX of the existing implementation. Changes: - Expanded elicitation schema to demonstrate 9 field types: * string (plain and with default values) * boolean * email (format: "email") * uri (format: "uri") * date (format: "date") * integer (with min/max and default) * number (with min/max and default) * enum with enumNames for human-readable labels - Added required fields support (name field is required) - Added 10-minute timeout to elicitation request - Improved response handling to dynamically show all provided fields - Updated tool description to reflect comprehensive field type support - Removed unused requestElicitation helper function (inlined implementation) - Removed unused ElicitRequest import The implementation follows PR #17's approach of directly using extra.sendRequest() while preserving the user-friendly response handling with emojis and formatted output from the original implementation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/everything/everything.ts | 122 +++++++++++++++++++++++------------ 1 file changed, 82 insertions(+), 40 deletions(-) diff --git a/src/everything/everything.ts b/src/everything/everything.ts index 465cd51985..2300ee04f4 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -6,7 +6,6 @@ import { CompleteRequestSchema, CreateMessageRequest, CreateMessageResultSchema, - ElicitRequest, ElicitResultSchema, GetPromptRequestSchema, ListPromptsRequestSchema, @@ -259,22 +258,6 @@ export const createServer = () => { }; - const requestElicitation = async ( - message: string, - requestedSchema: any, - sendRequest: SendRequest - ) => { - const request: ElicitRequest = { - method: 'elicitation/create', - params: { - message, - requestedSchema, - }, - }; - - return await sendRequest(request, ElicitResultSchema); - }; - const ALL_RESOURCES: Resource[] = Array.from({ length: 100 }, (_, i) => { const uri = `test://static/resource/${i + 1}`; if (i % 2 === 0) { @@ -552,7 +535,7 @@ export const createServer = () => { }); if (clientCapabilities!.elicitation) tools.push ({ name: ToolName.ELICITATION, - description: "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.", + description: "Elicitation test tool that demonstrates how to request user input with various field types (string, boolean, email, uri, date, integer, number, enum)", inputSchema: zodToJsonSchema(ElicitationSchema) as ToolInput, }); @@ -747,27 +730,75 @@ export const createServer = () => { if (name === ToolName.ELICITATION) { ElicitationSchema.parse(args); - const elicitationResult = await requestElicitation( - 'What are your favorite things?', - { - type: 'object', - properties: { - color: { type: 'string', description: 'Favorite color' }, - number: { - type: 'integer', - description: 'Favorite number', - minimum: 1, - maximum: 100, - }, - pets: { - type: 'string', - enum: ['cats', 'dogs', 'birds', 'fish', 'reptiles'], - description: 'Favorite pets', + const elicitationResult = 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'], }, }, - extra.sendRequest - ); + }, ElicitResultSchema, { timeout: 10 * 60 * 1000 /* 10 minutes */ }); // Handle different response actions const content = []; @@ -775,19 +806,30 @@ export const createServer = () => { if (elicitationResult.action === 'accept' && elicitationResult.content) { content.push({ type: "text", - text: `✅ User provided their favorite things!`, + text: `✅ User provided the requested information!`, }); // Only access elicitationResult.content when action is accept - const { color, number, pets } = elicitationResult.content; + const userData = elicitationResult.content; + const lines = []; + if (userData.name) lines.push(`- Name: ${userData.name}`); + if (userData.check !== undefined) lines.push(`- Agreed to terms: ${userData.check}`); + if (userData.color) lines.push(`- Favorite Color: ${userData.color}`); + if (userData.email) lines.push(`- Email: ${userData.email}`); + if (userData.homepage) lines.push(`- Homepage: ${userData.homepage}`); + if (userData.birthdate) lines.push(`- Birthdate: ${userData.birthdate}`); + if (userData.integer !== undefined) lines.push(`- Favorite Integer: ${userData.integer}`); + if (userData.number !== undefined) lines.push(`- Favorite Number: ${userData.number}`); + if (userData.petType) lines.push(`- Pet Type: ${userData.petType}`); + content.push({ type: "text", - text: `Their favorites are:\n- Color: ${color || 'not specified'}\n- Number: ${number || 'not specified'}\n- Pets: ${pets || 'not specified'}`, + text: `User inputs:\n${lines.join('\n')}`, }); } else if (elicitationResult.action === 'decline') { content.push({ type: "text", - text: `❌ User declined to provide their favorite things.`, + text: `❌ User declined to provide the requested information.`, }); } else if (elicitationResult.action === 'cancel') { content.push({