addResource method

  1. @override
void addResource({
  1. required String uri,
  2. required String name,
  3. required String description,
  4. required String mimeType,
  5. Map<String, dynamic>? uriTemplate,
  6. required ResourceHandler handler,
  7. String? title,
  8. List<Map<String, dynamic>>? icons,
  9. Map<String, dynamic>? meta,
  10. int? size,
  11. 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);
}