ultimate-mcp-server
Version:
The definitive all-in-one Model Context Protocol server for AI-assisted coding across 30+ platforms
65 lines • 2.32 kB
JavaScript
import { Logger } from "../utils/logger.js";
export class ResourceRegistry {
resources = new Map();
logger;
constructor() {
this.logger = new Logger("ResourceRegistry");
}
register(resource) {
if (this.resources.has(resource.uri)) {
throw new Error(`Resource ${resource.uri} is already registered`);
}
this.resources.set(resource.uri, resource);
this.logger.info(`Registered resource: ${resource.uri}`);
}
unregister(uri) {
this.resources.delete(uri);
this.logger.info(`Unregistered resource: ${uri}`);
}
async listResources() {
return Array.from(this.resources.values()).map((resource) => ({
uri: resource.uri,
name: resource.name,
description: resource.description,
mimeType: resource.mimeType,
}));
}
async readResource(uri) {
const resource = this.resources.get(uri);
if (!resource) {
throw new Error(`Resource ${uri} not found`);
}
try {
const content = await resource.handler();
// Handle different content types
if (typeof content === "string") {
return { text: content, mimeType: resource.mimeType };
}
else if (content && typeof content === "object" && "text" in content) {
return { text: content.text, mimeType: content.mimeType || resource.mimeType };
}
else {
return { text: JSON.stringify(content, null, 2), mimeType: "application/json" };
}
}
catch (error) {
this.logger.error(`Failed to read resource ${uri}:`, error);
throw error;
}
}
getResourceCount() {
return this.resources.size;
}
getResource(uri) {
return this.resources.get(uri);
}
getResourcesByTag(tag) {
return Array.from(this.resources.values()).filter((resource) => resource.tags?.includes(tag));
}
// Pattern matching for dynamic resources
findMatchingResources(pattern) {
const regex = new RegExp(pattern);
return Array.from(this.resources.values()).filter((resource) => regex.test(resource.uri));
}
}
//# sourceMappingURL=resource-registry.js.map