addResource method
void
addResource({
- required String uri,
- required String name,
- required String description,
- required String mimeType,
- Map<
String, dynamic> ? uriTemplate, - required ResourceHandler handler,
- String? title,
- List<
Map< ? icons,String, dynamic> > - Map<
String, dynamic> ? meta, - int? size,
- Annotations? annotations,
override
Add a resource to the server
Implementation
@override
void addResource({
required String uri,
required String name,
required String description,
required String mimeType,
Map<String, dynamic>? uriTemplate,
required ResourceHandler handler,
String? title,
List<Map<String, dynamic>>? icons,
Map<String, dynamic>? meta,
int? size,
Annotations? annotations,
}) {
if (_resources.containsKey(uri)) {
throw McpError('Resource with URI "$uri" already exists');
}
// Auto-detect template URIs (containing {param} placeholders)
if (uriTemplate == null && uri.contains('{') && uri.contains('}')) {
uriTemplate = {'isTemplate': true};
}
// Resource URIs (custom schemes included) follow RFC 3986; templates
// follow RFC 6570.
if (uriTemplate == null && !_isResourceUri(uri)) {
throw ArgumentError.value(uri, 'uri', 'not an absolute URI (RFC 3986)');
}
if (uriTemplate != null && !uriTemplateValid(uri)) {
throw ArgumentError.value(uri, 'uri', 'not an RFC 6570 URI template');
}
final resource = Resource(
uri: uri,
name: name,
title: title,
description: description,
mimeType: mimeType,
size: size,
annotations: annotations,
icons: icons?.map(McpIcon.fromJson).toList(),
meta: meta,
);
_resources[uri] = resource;
if (uriTemplate != null) {
_templateResources[uri] = uriTemplate;
} else {
_templateResources.remove(uri);
}
_resourceHandlers[uri] = handler;
// Notify clients about resource changes if connected and supported
if (isConnected &&
capabilities.hasResources &&
capabilities.resourcesListChanged) {
_broadcastNotification('notifications/resources/list_changed', {});
}
// Emit change event
_resourcesChangedController.add(null);
}