breathe-api
Version:
Model Context Protocol server for Breathe HR APIs with Swagger/OpenAPI support - also works with custom APIs
96 lines • 3.29 kB
JavaScript
import { resourceManager } from '../utils/resource-manager.js';
import { BaseError } from '../utils/errors.js';
export async function handleListResources(_request) {
try {
const resources = await resourceManager.listResources();
const mcpResources = resources.map(res => ({
uri: res.uri,
name: res.name,
description: res.description,
mimeType: res.mimeType
}));
return {
resources: mcpResources
};
}
catch (error) {
throw new BaseError(`Failed to list resources: ${error.message}`, 'RESOURCE_LIST_ERROR', { error: error.message });
}
}
export async function handleReadResource(request) {
try {
const { uri } = request.params;
const content = await resourceManager.readResource(uri);
const mcpContent = content.text
? {
uri: content.uri,
mimeType: content.mimeType,
text: content.text
}
: {
uri: content.uri,
mimeType: content.mimeType,
blob: content.blob || ''
};
return {
contents: [mcpContent]
};
}
catch (error) {
throw new BaseError(`Failed to read resource: ${error.message}`, 'RESOURCE_READ_ERROR', { uri: request.params.uri, error: error.message });
}
}
export async function handleListResourceTemplates(_request) {
try {
const templates = resourceManager.getResourceTemplates();
const mcpTemplates = templates.map(template => ({
uriTemplate: template.uriTemplate,
name: template.name,
description: template.description,
mimeType: template.mimeType
}));
return {
resourceTemplates: mcpTemplates
};
}
catch (error) {
throw new BaseError(`Failed to list resource templates: ${error.message}`, 'RESOURCE_TEMPLATE_ERROR', { error: error.message });
}
}
export async function handleResourceSubscribe(uri, callback) {
let intervalId = null;
let lastContent = null;
const checkForUpdates = async () => {
try {
const content = await resourceManager.readResource(uri);
const currentContent = content.text || content.blob || '';
if (currentContent !== lastContent) {
lastContent = currentContent;
const mcpContent = content.text
? {
uri: content.uri,
mimeType: content.mimeType,
text: content.text
}
: {
uri: content.uri,
mimeType: content.mimeType,
blob: content.blob || ''
};
callback(mcpContent);
}
}
catch (error) {
console.error(`Error checking resource updates for ${uri}:`, error);
}
};
checkForUpdates();
intervalId = setInterval(checkForUpdates, 30000);
return () => {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
}
};
}
//# sourceMappingURL=handler.js.map