Skip to main content

Overview

import { ResourceRegistry } from '@frontmcp/sdk';

// Access via scope
const resources = scope.resources;

// List all static resources
const allResources = resources.getResources();

// List all resource templates
const templates = resources.getResourceTemplates();

// Find by URI
const resource = resources.findByUri('file:///config.json');

Methods

getResources()

Get all static resources (not templates).
getResources(includeHidden?: boolean): ReadonlyArray<ResourceEntry>
ParameterTypeDefaultDescription
includeHiddenbooleanfalseInclude hidden resources
Example:
// Get all visible resources
const resources = registry.getResources();

// Include hidden resources
const allResources = registry.getResources(true);

getResourceTemplates()

Get all resource templates.
getResourceTemplates(): ReadonlyArray<ResourceEntry>
Example:
const templates = registry.getResourceTemplates();
for (const template of templates) {
  console.log(`Template: ${template.uriTemplate}`);
}

findByUri()

Find a resource by exact URI match.
findByUri(uri: string): ResourceEntry | undefined
Example:
const resource = registry.findByUri('file:///config.json');
if (resource) {
  console.log(`Found: ${resource.name}`);
}

matchTemplateByUri()

Match a URI against template resources.
matchTemplateByUri(uri: string): {
  template: ResourceEntry;
  params: Record<string, string>;
} | undefined
Example:
// Given template: 'file:///users/{userId}/profile'
const match = registry.matchTemplateByUri('file:///users/123/profile');
if (match) {
  console.log(match.template.name); // user-profile
  console.log(match.params); // { userId: '123' }
}

findResourceForUri()

Find resource by URI (exact match or template).
findResourceForUri(uri: string): ResourceEntry | undefined
Example:
// Will try exact match first, then template matching
const resource = registry.findResourceForUri('file:///users/123/profile');

findByName()

Find a resource by its base name.
findByName(name: string): ResourceEntry | undefined

findByQualifiedName()

Find a resource by its fully qualified name.
findByQualifiedName(qualifiedName: string): ResourceEntry | undefined
Example:
const resource = registry.findByQualifiedName('my-app:config');

getExported()

Lookup a resource by its exported (resolved) name.
getExported(name: string, opts?: { ignoreCase?: boolean }): ResourceEntry | undefined

exportResolvedNames()

Produce unique, conflict-aware exported names.
exportResolvedNames(opts?: ExportResolvedNamesOptions): Map<string, ResourceEntry>

getInlineResources()

Get resources defined inline (local only).
getInlineResources(): ReadonlyArray<ResourceEntry>

listAllInstances()

List all resource instances (locals + adopted).
listAllInstances(): ReadonlyArray<ResourceEntry>

listByOwner()

List resources by owner path.
listByOwner(ownerPath: string): ReadonlyArray<ResourceEntry>

registerResourceInstance()

Register a pre-constructed ResourceEntry directly.
registerResourceInstance(resource: ResourceEntry): void

registerDynamicResource()

Register a resource or template at runtime.
registerDynamicResource(resourceDef: DynamicResourceDef): ResourceEntry
Example:
// Register a dynamic resource
const entry = registry.registerDynamicResource({
  name: 'dynamic-config',
  uri: 'config://runtime',
  description: 'Runtime configuration',
  mimeType: 'application/json',
  read: async () => ({ text: JSON.stringify(config) }),
});

subscribe()

Subscribe to resource change events.
subscribe(
  opts: SubscribeOptions,
  cb: (event: ResourceChangeEvent) => void
): () => void
Returns: Unsubscribe function. Example:
const unsubscribe = registry.subscribe({}, (event) => {
  console.log(`Resource ${event.kind}:`, event.entry?.uri);
});

// Later
unsubscribe();

getCapabilities()

Get MCP capabilities for resources.
getCapabilities(): { subscribe: boolean; listChanged: boolean }
Example:
const caps = registry.getCapabilities();
// { subscribe: false, listChanged: true }

hasAny()

Check if any resources exist.
hasAny(): boolean

adoptFromChild()

Adopt resources from a child registry.
adoptFromChild(child: ResourceRegistry, childOwner: Owner): void

Change Events

interface ResourceChangeEvent {
  kind: 'added' | 'updated' | 'removed' | 'reset';
  changeScope: 'global' | 'session';
  version: number;
  snapshot: ReadonlyArray<ResourceEntry>;
  entry?: ResourceEntry;
  sessionId?: string;
  relatedRequestId?: string;
}

Indexes

IndexKeyDescription
byQualifiedIdqualifiedIdUnique identifier lookup
byNamenameBase name lookup
byUriuriStatic resource URI lookup
byUriTemplateuriTemplateTemplate URI lookup
byOwnerownerPathAll resources by owner

Static vs Template Resources

Static Resources

Have a fixed uri property. Found via findByUri().

Template Resources

Have a uriTemplate with parameters. Matched via matchTemplateByUri().
Example:
// Static resource
@Resource({
  name: 'config',
  uri: 'file:///config.json',
})
class ConfigResource extends ResourceContext { }

// Template resource
@ResourceTemplate({
  name: 'user-profile',
  uriTemplate: 'file:///users/{userId}/profile',
})
class UserProfileResource extends ResourceContext<{ userId: string }> { }