1- import { ProgressCallback , Protocol } from "../shared/protocol.js" ;
1+ import {
2+ ProgressCallback ,
3+ Protocol ,
4+ ProtocolOptions ,
5+ } from "../shared/protocol.js" ;
26import { Transport } from "../shared/transport.js" ;
37import {
48 CallToolRequest ,
@@ -36,6 +40,13 @@ import {
3640 UnsubscribeRequest ,
3741} from "../types.js" ;
3842
43+ export type ClientOptions = ProtocolOptions & {
44+ /**
45+ * Capabilities to advertise as being supported by this client.
46+ */
47+ capabilities : ClientCapabilities ;
48+ } ;
49+
3950/**
4051 * An MCP client on top of a pluggable transport.
4152 *
@@ -72,15 +83,28 @@ export class Client<
7283> {
7384 private _serverCapabilities ?: ServerCapabilities ;
7485 private _serverVersion ?: Implementation ;
86+ private _capabilities : ClientCapabilities ;
7587
7688 /**
7789 * Initializes this client with the given name and version information.
7890 */
7991 constructor (
8092 private _clientInfo : Implementation ,
81- private _capabilities : ClientCapabilities ,
93+ options : ClientOptions ,
8294 ) {
83- super ( ) ;
95+ super ( options ) ;
96+ this . _capabilities = options . capabilities ;
97+ }
98+
99+ protected assertCapability (
100+ capability : keyof ServerCapabilities ,
101+ method : string ,
102+ ) : void {
103+ if ( ! this . _serverCapabilities ?. [ capability ] ) {
104+ throw new Error (
105+ `Server does not support ${ capability } (required for ${ method } )` ,
106+ ) ;
107+ }
84108 }
85109
86110 override async connect ( transport : Transport ) : Promise < void > {
@@ -136,14 +160,69 @@ export class Client<
136160 return this . _serverVersion ;
137161 }
138162
139- private assertCapability (
140- capability : keyof ServerCapabilities ,
141- method : string ,
142- ) {
143- if ( ! this . _serverCapabilities ?. [ capability ] ) {
144- throw new Error (
145- `Server does not support ${ capability } (required for ${ method } )` ,
146- ) ;
163+ protected assertCapabilityForMethod ( method : RequestT [ "method" ] ) : void {
164+ switch ( method as ClientRequest [ "method" ] ) {
165+ case "logging/setLevel" :
166+ if ( ! this . _serverCapabilities ?. logging ) {
167+ throw new Error (
168+ "Server does not support logging (required for logging/setLevel)" ,
169+ ) ;
170+ }
171+ break ;
172+
173+ case "prompts/get" :
174+ case "prompts/list" :
175+ if ( ! this . _serverCapabilities ?. prompts ) {
176+ throw new Error (
177+ `Server does not support prompts (required for ${ method } )` ,
178+ ) ;
179+ }
180+ break ;
181+
182+ case "resources/list" :
183+ case "resources/templates/list" :
184+ case "resources/read" :
185+ case "resources/subscribe" :
186+ case "resources/unsubscribe" :
187+ if ( ! this . _serverCapabilities ?. resources ) {
188+ throw new Error (
189+ `Server does not support resources (required for ${ method } )` ,
190+ ) ;
191+ }
192+
193+ if (
194+ method === "resources/subscribe" &&
195+ ! this . _serverCapabilities . resources . subscribe
196+ ) {
197+ throw new Error ( "Server does not support resource subscriptions" ) ;
198+ }
199+
200+ break ;
201+
202+ case "tools/call" :
203+ case "tools/list" :
204+ if ( ! this . _serverCapabilities ?. tools ) {
205+ throw new Error (
206+ `Server does not support tools (required for ${ method } )` ,
207+ ) ;
208+ }
209+ break ;
210+
211+ case "completion/complete" :
212+ if ( ! this . _serverCapabilities ?. prompts ) {
213+ throw new Error (
214+ "Server does not support prompts (required for completion/complete)" ,
215+ ) ;
216+ }
217+ break ;
218+
219+ case "initialize" :
220+ // No specific capability required for initialize
221+ break ;
222+
223+ case "ping" :
224+ // No specific capability required for ping
225+ break ;
147226 }
148227 }
149228
@@ -155,7 +234,6 @@ export class Client<
155234 params : CompleteRequest [ "params" ] ,
156235 onprogress ?: ProgressCallback ,
157236 ) {
158- this . assertCapability ( "prompts" , "completion/complete" ) ;
159237 return this . request (
160238 { method : "completion/complete" , params } ,
161239 CompleteResultSchema ,
@@ -164,7 +242,6 @@ export class Client<
164242 }
165243
166244 async setLoggingLevel ( level : LoggingLevel ) {
167- this . assertCapability ( "logging" , "logging/setLevel" ) ;
168245 return this . request (
169246 { method : "logging/setLevel" , params : { level } } ,
170247 EmptyResultSchema ,
@@ -175,7 +252,6 @@ export class Client<
175252 params : GetPromptRequest [ "params" ] ,
176253 onprogress ?: ProgressCallback ,
177254 ) {
178- this . assertCapability ( "prompts" , "prompts/get" ) ;
179255 return this . request (
180256 { method : "prompts/get" , params } ,
181257 GetPromptResultSchema ,
@@ -187,7 +263,6 @@ export class Client<
187263 params ?: ListPromptsRequest [ "params" ] ,
188264 onprogress ?: ProgressCallback ,
189265 ) {
190- this . assertCapability ( "prompts" , "prompts/list" ) ;
191266 return this . request (
192267 { method : "prompts/list" , params } ,
193268 ListPromptsResultSchema ,
@@ -199,7 +274,6 @@ export class Client<
199274 params ?: ListResourcesRequest [ "params" ] ,
200275 onprogress ?: ProgressCallback ,
201276 ) {
202- this . assertCapability ( "resources" , "resources/list" ) ;
203277 return this . request (
204278 { method : "resources/list" , params } ,
205279 ListResourcesResultSchema ,
@@ -211,7 +285,6 @@ export class Client<
211285 params ?: ListResourceTemplatesRequest [ "params" ] ,
212286 onprogress ?: ProgressCallback ,
213287 ) {
214- this . assertCapability ( "resources" , "resources/templates/list" ) ;
215288 return this . request (
216289 { method : "resources/templates/list" , params } ,
217290 ListResourceTemplatesResultSchema ,
@@ -223,7 +296,6 @@ export class Client<
223296 params : ReadResourceRequest [ "params" ] ,
224297 onprogress ?: ProgressCallback ,
225298 ) {
226- this . assertCapability ( "resources" , "resources/read" ) ;
227299 return this . request (
228300 { method : "resources/read" , params } ,
229301 ReadResourceResultSchema ,
@@ -232,15 +304,13 @@ export class Client<
232304 }
233305
234306 async subscribeResource ( params : SubscribeRequest [ "params" ] ) {
235- this . assertCapability ( "resources" , "resources/subscribe" ) ;
236307 return this . request (
237308 { method : "resources/subscribe" , params } ,
238309 EmptyResultSchema ,
239310 ) ;
240311 }
241312
242313 async unsubscribeResource ( params : UnsubscribeRequest [ "params" ] ) {
243- this . assertCapability ( "resources" , "resources/unsubscribe" ) ;
244314 return this . request (
245315 { method : "resources/unsubscribe" , params } ,
246316 EmptyResultSchema ,
@@ -254,7 +324,6 @@ export class Client<
254324 | typeof CompatibilityCallToolResultSchema = CallToolResultSchema ,
255325 onprogress ?: ProgressCallback ,
256326 ) {
257- this . assertCapability ( "tools" , "tools/call" ) ;
258327 return this . request (
259328 { method : "tools/call" , params } ,
260329 resultSchema ,
@@ -266,7 +335,6 @@ export class Client<
266335 params ?: ListToolsRequest [ "params" ] ,
267336 onprogress ?: ProgressCallback ,
268337 ) {
269- this . assertCapability ( "tools" , "tools/list" ) ;
270338 return this . request (
271339 { method : "tools/list" , params } ,
272340 ListToolsResultSchema ,
0 commit comments