import dotenv from 'dotenv';
import { fileURLToPath } from 'url';
import { dirname, resolve } from 'path';
// Load env vars FIRST
const __dirname = dirname(fileURLToPath(import.meta.url));
dotenv.config({ path: resolve(__dirname, '../.env') });
const apiKey = process.env.CLICKUP_API_KEY;
const teamId = process.env.CLICKUP_TEAM_ID;
if (!apiKey || !teamId) {
console.error("Missing env vars CLICKUP_API_KEY or CLICKUP_TEAM_ID");
process.exit(1);
}
async function main() {
// Dynamic imports to ensure env vars are loaded before config modules
const { ChatService } = await import('../src/services/clickup/chat.js');
const { clickUpServices } = await import('../src/services/shared.js'); // Initialize shared services
console.log(`Initializing ChatService with Team ID: ${teamId}`);
const chatService = new ChatService(apiKey!, teamId!);
// Check V2 access
console.log("--- TEST: V2 Access Check ---");
try {
const { WorkspaceService } = await import('../src/services/clickup/workspace.js');
const wsService = new WorkspaceService(apiKey!, teamId!);
const members = await wsService.getWorkspaceMembers();
console.log(`V2 Access OK. Found ${members.length} members.`);
} catch (e: any) {
console.error("V2 Access Failed:", e.message);
}
console.log("\n--- TEST: Get Channels (V3) ---");
try {
const channelsResponse = await chatService.getChannels(teamId!);
if (!channelsResponse.success) {
console.error("Failed to get channels:", channelsResponse.error);
return;
}
let channels = channelsResponse.data;
console.log(`Found ${channels?.length || 0} channels.`);
// console.log(`Debug: Channels value:`, JSON.stringify(channels));
if (!channels || channels.length === 0) {
console.log("No channels found. Attempting to create one...");
// Need a space ID to create a channel usually? Or can we create workspace level?
// Let's try to get a space first.
let spaceId: string | undefined;
try {
const { WorkspaceService } = await import('../src/services/clickup/workspace.js');
const wsService = new WorkspaceService(apiKey!, teamId!);
const spaces = await wsService.getSpaces();
if (spaces.length > 0) {
spaceId = spaces[0].id;
console.log(`Found ${spaces.length} spaces.`);
}
} catch (e) { console.error("Could not fetch spaces"); }
if (spaceId) {
// Try to create channel
try {
const uniqueName = "MCP Test Channel " + Date.now();
const createRes = await chatService.createChannel(teamId!, {
name: uniqueName,
space_id: spaceId
});
if (createRes.success && createRes.data) {
console.log("Channel created!", createRes.data);
// Update channels list
channels = [createRes.data];
} else {
console.error("Failed to create channel:", createRes.error);
}
} catch (e: any) {
console.error("Exception creating channel (Status " + e.response?.status + "):");
if (e.response?.data) console.log("Error Data:", JSON.stringify(e.response.data, null, 2));
else console.log(e.message);
}
} else {
console.log("No space found to create channel in.");
}
}
if (channels && channels.length > 0) {
// Find a public channel to test with, avoid DMs
const targetChannel = channels.find(c => c.type === 'CHANNEL') || channels[0];
console.log("Target channel:", targetChannel);
const channelId = targetChannel.id;
console.log("\n--- TEST: Create Message ---");
try {
const msgResponse = await chatService.createMessage(channelId, {
comment_text: "Hello from MCP test! This is a **markdown** message.",
notify_all: false
});
if (!msgResponse.success) {
console.error("Failed to create message:", msgResponse.error);
} else {
console.log("Message created:", msgResponse.data);
}
} catch (e: any) {
console.error("Create Message Failed:", e.message);
if (e.response) console.error("Details:", e.response.data);
}
console.log("\n--- TEST: Get Messages ---");
try {
const messagesResponse = await chatService.getMessages(channelId);
if (!messagesResponse.success) {
console.error("Failed to get messages:", messagesResponse.error);
} else {
console.log(`Retrieved ${messagesResponse.data?.length} messages.`);
// if (messagesResponse.data && messagesResponse.data.length > 0) {
// console.log("Last message:", messagesResponse.data[0]);
//}
}
} catch (e: any) {
console.error("Get Messages Failed:", e.message);
if (e.response) console.error("Details:", e.response.data);
}
console.log("\n--- TEST: Name Resolution ---");
try {
const targetName = targetChannel.name;
console.log(`Testing name resolution for: "${targetName}"`);
const { findChannelIDByName } = await import('../src/tools/chat/utils.js');
const resolved = await findChannelIDByName(targetName);
if (resolved && resolved.id === targetChannel.id) {
console.log("Name Resolution SUCCESS:", resolved);
console.log("Resolved ID:", resolved.id);
} else {
console.error("Name Resolution FAILED:", resolved);
console.log("Expected ID:", targetChannel.id);
}
} catch (e: any) {
console.error("Name Resolution Test Failed:", e.message);
}
}
} catch (e: any) {
console.error("Exception:", e.message);
if (e.response) {
console.error("API Response:", e.response.data);
}
}
}
main();