63b203b937
* feat(mcp): resource notifications, subscriptions, and read_resource builtin tool - Add MCP resource subscription lifecycle (subscribe/unsubscribe on connect/disconnect) - Wire mcp.notifications setting with live toggle support - Add debounced followUp injection for resource change notifications - Add global read_resource builtin tool with server resolution by URI/template scheme - Add MCP prompt commands (buildMCPPromptCommands) with array content support - Add server instructions injection into system prompt with attribution - Add mcp.notificationDebounceMs configurable setting Client (client.ts): listResources, listResourceTemplates, readResource with pagination subscribeToResources, unsubscribeFromResources listPrompts, getPrompt, serverSupportsPrompts serverSupportsResources, serverSupportsResourceSubscriptions Manager (manager.ts): Notification dispatch with subscribed-URI guard Concurrent refresh deduplication via pending promise map setNotificationsEnabled with subscribe/unsubscribe toggle Tests: client-resources.test.ts (31 tests) client-prompts.test.ts (20 tests) mcp-read-resource.test.ts (13 tests) * fix(mcp): address PR review - eager prompt init and stale subscription cleanup P1: Make setOnPromptsChanged eagerly fire for servers that already have prompts loaded. The callback is registered after MCP discovery has already loaded prompts and fired the hook, so without this the handler is never called on the common startup path. The fix is in the manager itself (not the caller), eliminating the race condition regardless of when the callback is wired. P2: Unsubscribe removed resource URIs on resource refresh. refreshServerResources was subscribing to the new URI set and overwriting #subscribedResources without unsubscribing URIs that were previously subscribed but no longer present, leaving stale subscriptions active on the server. * fix(mcp): add resources and prompts to /mcp help text and subcommand completions * feat(mcp): add /mcp notifications command Shows per-server notification capabilities with subscription state: - Lists supported notification types (tools/list_changed, resources/list_changed, prompts/list_changed) with check marks - Shows resources/subscribe status with active subscription count - Lists subscribed URIs with green ticks when notifications are enabled - Displays overall enabled/disabled state (mcp.notifications setting) * fix(mcp): address PR review comments on race conditions and stale state - Await subscribe/unsubscribe in refreshServerResources so the refresh promise doesn't resolve before subscriptions are settled, preventing a second refresh from racing and overwriting tracking state (P2 #3) - Guard setNotificationsEnabled subscribe .then() against a disable that happens while the subscribe request is in-flight (P2 #5) - Re-check mcp.notifications setting inside debounce setTimeout callback so toggling off mid-window actually suppresses the follow-up message (P2 #4) - Fire onToolsChanged and onPromptsChanged callbacks in disconnectServer so stale slash commands and tool registrations are cleaned up when a server is removed (P2 #2) --------- Co-authored-by: Miroslav Drbal <miroslav.drbal@gendigital.com>
30 lines
723 B
TypeScript
30 lines
723 B
TypeScript
/**
|
|
* MCP (Model Context Protocol) support.
|
|
*
|
|
* Provides per-project .mcp.json configuration for connecting to
|
|
* MCP servers via stdio or HTTP transports.
|
|
*/
|
|
|
|
// Client
|
|
export * from "./client";
|
|
// Config
|
|
export * from "./config";
|
|
export * from "./config-writer";
|
|
// JSON-RPC (lightweight HTTP-based MCP calls)
|
|
export { callMCP, parseSSE } from "./json-rpc";
|
|
// Loader (for SDK integration)
|
|
export * from "./loader";
|
|
// Manager
|
|
export * from "./manager";
|
|
// OAuth Discovery
|
|
export * from "./oauth-discovery";
|
|
// Tool bridge
|
|
export * from "./tool-bridge";
|
|
// Tool cache
|
|
export * from "./tool-cache";
|
|
// Transports
|
|
export * from "./transports/http";
|
|
export * from "./transports/stdio";
|
|
// Types
|
|
export * from "./types";
|