/**
* Resource Registry
* Central registry for all MCP resources (documentation, context)
*/
import type {
Resource,
ReadResourceResult,
} from '@modelcontextprotocol/sdk/types.js';
/**
* Resource handler function type
*/
export type ResourceHandler = () => Promise<ReadResourceResult>;
/**
* Resource definition with handler
*/
export interface ResourceDefinition {
definition: Resource;
handler: ResourceHandler;
}
/**
* Registry of all available resources
*/
const resources = new Map<string, ResourceDefinition>();
/**
* Register a new resource
*/
export function registerResource(resource: ResourceDefinition): void {
resources.set(resource.definition.uri, resource);
}
/**
* Get all registered resources
*/
export function getAllResources(): Resource[] {
return Array.from(resources.values()).map((r) => r.definition);
}
/**
* Get a resource handler by URI
*/
export function getResourceHandler(uri: string): ResourceHandler | undefined {
return resources.get(uri)?.handler;
}
/**
* Check if a resource exists
*/
export function hasResource(uri: string): boolean {
return resources.has(uri);
}
// Import resource handlers
import {
workspaceSchemaResource,
getWorkspaceSchemaContent,
} from './schema-workspace.js';
// Register Attio Workspace Schema Resource
registerResource({
definition: {
uri: workspaceSchemaResource.uri,
name: workspaceSchemaResource.name,
description: workspaceSchemaResource.description,
mimeType: workspaceSchemaResource.mimeType,
},
handler: async () => {
const apiKey = process.env['ATTIO_API_KEY'];
if (!apiKey) {
throw new Error('ATTIO_API_KEY not configured');
}
const content = await getWorkspaceSchemaContent(apiKey);
return {
contents: [
{
uri: workspaceSchemaResource.uri,
mimeType: workspaceSchemaResource.mimeType,
text: content,
},
],
};
},
});