clickup-mcp-server
Version:
A Model Context Protocol (MCP) server that provides a standardized interface for AI assistants to interact with the ClickUp API
160 lines • 7.21 kB
JavaScript
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { createClickUpClient } from '../clickup-client/index.js';
import { createFoldersClient } from '../clickup-client/folders.js';
// Create clients
const clickUpClient = createClickUpClient();
const foldersClient = createFoldersClient(clickUpClient);
export function setupFolderResources(server) {
// Register space folders resource
server.resource('space-folders', new ResourceTemplate('clickup://space/{space_id}/folders', { list: undefined }), {
description: 'Get all folders in a ClickUp space, including their names, settings, and contained lists.'
}, async (uri, params) => {
try {
const space_id = params.space_id;
console.log('[FolderResources] Fetching folders for space:', space_id);
const foldersResponse = await foldersClient.getFoldersFromSpace(space_id);
console.log('[FolderResources] Got folders:', foldersResponse);
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(foldersResponse, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching space folders:', error);
throw new Error(`Error fetching space folders: ${error.message}`);
}
});
// Register folder details resource
server.resource('folder-details', new ResourceTemplate('clickup://folder/{folder_id}', { list: undefined }), {
description: 'Get detailed information about a specific ClickUp folder, including its name, settings, and metadata.'
}, async (uri, params) => {
try {
const folder_id = params.folder_id;
console.log('[FolderResources] Fetching folder:', folder_id);
// Note: The ClickUp API doesn't have a direct endpoint to get folder details
// We would need to implement this in the foldersClient if API supports it
// For now, return a placeholder response
// Create a folder object with the ID and a message
const folder = {
id: folder_id,
message: "Folder details endpoint not available in ClickUp API"
};
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(folder, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching folder:', error);
throw new Error(`Error fetching folder: ${error.message}`);
}
});
// Register folder lists resource
server.resource('folder-lists', new ResourceTemplate('clickup://folder/{folder_id}/lists', { list: undefined }), {
description: 'Get all lists contained within a specific ClickUp folder, including their names and settings.'
}, async (uri, params) => {
try {
const folder_id = params.folder_id;
console.log('[FolderResources] Fetching lists for folder:', folder_id);
const lists = await foldersClient.getListsFromFolder(folder_id);
console.log('[FolderResources] Got lists:', lists);
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(lists, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching folder lists:', error);
throw new Error(`Error fetching folder lists: ${error.message}`);
}
});
// Add some example static resources for discoverability
server.resource('example-space-folders', 'clickup://space/90113637923/folders', {
description: 'An example space folders resource demonstrating the folder list format.'
}, async (uri) => {
try {
const space_id = '90113637923';
console.log('[FolderResources] Fetching folders for example space:', space_id);
const foldersResponse = await foldersClient.getFoldersFromSpace(space_id);
console.log('[FolderResources] Got folders:', foldersResponse);
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(foldersResponse, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching example space folders:', error);
throw new Error(`Error fetching example space folders: ${error.message}`);
}
});
server.resource('example-folder', 'clickup://folder/90115795569', {
description: 'An example folder resource demonstrating the folder details format.'
}, async (uri) => {
try {
const folder_id = '90115795569';
console.log('[FolderResources] Fetching example folder:', folder_id);
// Create a folder object with the ID and a message
const folder = {
id: folder_id,
message: "Folder details endpoint not available in ClickUp API"
};
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(folder, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching example folder:', error);
throw new Error(`Error fetching example folder: ${error.message}`);
}
});
server.resource('example-folder-lists', 'clickup://folder/90115795569/lists', {
description: 'An example folder lists resource demonstrating the list data format.'
}, async (uri) => {
try {
const folder_id = '90115795569';
console.log('[FolderResources] Fetching lists for example folder:', folder_id);
const lists = await foldersClient.getListsFromFolder(folder_id);
console.log('[FolderResources] Got lists:', lists);
return {
contents: [
{
uri: uri.toString(),
mimeType: 'application/json',
text: JSON.stringify(lists, null, 2),
},
],
};
}
catch (error) {
console.error('[FolderResources] Error fetching example folder lists:', error);
throw new Error(`Error fetching example folder lists: ${error.message}`);
}
});
}
//# sourceMappingURL=folder-resources.js.map