Skip to content

Conversation

@sidhantu123
Copy link

Overview

This PR implements optional progressive disclosure of MCP tools through semantic grouping and lazy-loading. Servers can organize tools into semantic groups with gateway tools that load actual tools on-demand, achieving significant reduction in context token usage.

Problem Being Solved

MCP servers with 50+ tools currently expose all tool definitions upfront, causing significant context bloat. This wastes valuable context budget and makes it harder for LLMs to reason effectively.

Solution

Progressive tool discovery allows servers to:

  1. Organize tools into semantic groups (e.g., math operations, weather services)
  2. Expose only lightweight gateway tools initially
  3. Load full tool definitions on-demand when LLM decides which group to use
  4. Keep unneeded tools out of context entirely

Key Features

  • Opt-in: is_discovery_enabled defaults to False
  • Minimal API: Single method to enable
  • Programmatic: Tool groups defined in Python code
  • Non-blocking: Client refresh happens in background
  • Backward compatible: 100% compatible with existing code

Implementation

New components:

  • ToolGroup: Semantic organization
  • ToolGroupRegistry & ToolGroupManager: Discovery infrastructure
  • Server.enable_discovery_with_groups(): Main API
  • is_discovery_enabled: Status property

Testing

All tests pass:

  • 5 new discovery-specific tests passing
  • 41/44 total tests passing
  • Backward compatibility verified

Backward Compatibility

100% compatible:

  • Discovery is entirely opt-in
  • Existing servers work unchanged
  • Existing clients work unchanged
  • No protocol changes

Benefits

  • Significant token reduction for large tool sets
  • Supports servers with many tools
  • LLM-driven tool discovery
  • Clean semantic organization

Implements optional progressive disclosure of MCP tools through semantic grouping
and lazy-loading. Servers can organize tools into semantic groups with gateway
tools that load actual tools on-demand, achieving significant reduction in context
token usage.

## Architecture

### Core Components
- ToolGroup: Semantic organization of related tools
- ToolGroupRegistry & ToolGroupManager: Discovery infrastructure
- Server.enable_discovery_with_groups(): Simple API to enable discovery
- is_discovery_enabled: Property to check discovery status
- Client-side tool refresh: Automatic handling via ToolListChangedNotification

### Key Features
- Hybrid mode: Mix direct tools with grouped tools
- Lazy loading: Tools load only when needed
- Non-blocking refresh: Tool refresh happens in background
- Backward compatible: Discovery is entirely opt-in
- No protocol changes: Works with existing MCP clients

## Usage Example

\`\`\`python
from mcp.server import Server
from mcp import ToolGroup, Tool

math_group = ToolGroup(
    name='math',
    description='Mathematical operations',
    tools=[
        Tool(name='add', description='Add numbers', inputSchema={...}),
        Tool(name='subtract', description='Subtract numbers', inputSchema={...}),
    ]
)

server = Server('my-service')
server.enable_discovery_with_groups([math_group])
\`\`\`

## Testing

- 5 new discovery-specific tests: All passing
- 41/44 total tests passing (3 pre-existing unrelated failures)
- Backward compatibility verified with SDK examples
- Real-world examples with live weather APIs

## Files Changed

New files:
- src/mcp/server/discovery/__init__.py
- src/mcp/server/discovery/manager.py
- src/mcp/server/discovery/tool_group.py
- tests/test_discovery.py
- tests/test_discovery_integration.py
- examples/discovery/ (with server, agent, and README)

Modified files:
- src/mcp/__init__.py (export ToolGroup)
- src/mcp/client/session.py (callback support)
- src/mcp/client/session_group.py (tool refresh handling)
- src/mcp/server/lowlevel/server.py (discovery integration)
- tests/client/test_session_group.py (5 new tests)

## Benefits

- Token efficiency: Significant reduction in context token usage for large tool sets
- Scalability: Supports servers with many tools
- LLM autonomy: LLM decides which tools to load
- Clean architecture: Semantic grouping is explicit
- Backward compatible: No breaking changes, fully opt-in
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant