tududi/backend/modules/mcp/controller.js

121 lines
3 KiB
JavaScript

'use strict';
const { handleMcpHttpRequest } = require('./httpTransport');
/**
* Get MCP configuration for Claude Desktop
* Returns JSON that user can paste into Claude Desktop config
*/
async function getMcpConfig(req, res) {
try {
// Get base URL from request
const protocol = req.protocol;
const host = req.get('host');
const baseUrl = `${protocol}://${host}`;
// Generate HTTP-based config for remote access
const claudeConfig = {
mcpServers: {
tududi: {
command: 'npx',
args: [
'-y',
'mcp-remote',
`${baseUrl}/api/mcp`,
'--header',
'Authorization:Bearer ${TUDUDI_API_TOKEN}',
],
env: {
TUDUDI_API_TOKEN: 'YOUR_API_TOKEN_HERE',
},
},
},
};
res.json(claudeConfig);
} catch (error) {
console.error('Error generating MCP config:', error);
res.status(500).json({
error: 'Failed to generate MCP configuration',
message: error.message,
});
}
}
/**
* Handle MCP protocol message
* This is called by the POST /api/mcp endpoint
*/
async function handleMcpMessage(req, res) {
try {
const user = req.mcpUser;
const apiToken = req.mcpApiToken;
// Delegate to HTTP transport handler
await handleMcpHttpRequest(req, res, user, apiToken);
} catch (error) {
console.error('Error handling MCP message:', error);
// Only send response if headers haven't been sent
if (!res.headersSent) {
res.status(500).json({
error: 'Failed to process MCP message',
message: error.message,
});
}
}
}
/**
* Get MCP feature flag status
*/
async function getMcpStatus(req, res) {
const mcpEnabled = process.env.FF_ENABLE_MCP === 'true';
res.json({ enabled: mcpEnabled });
}
/**
* List available MCP tools
*/
async function listMcpTools(req, res) {
const tools = [
{
category: 'Tasks',
count: 8,
tools: [
'list_tasks',
'get_task',
'create_task',
'update_task',
'complete_task',
'delete_task',
'add_subtask',
'get_task_metrics',
],
},
{
category: 'Projects',
count: 3,
tools: ['list_projects', 'create_project', 'update_project'],
},
{
category: 'Inbox',
count: 2,
tools: ['list_inbox', 'add_to_inbox'],
},
{
category: 'Misc',
count: 3,
tools: ['list_areas', 'list_tags', 'search'],
},
];
res.json({ tools });
}
module.exports = {
getMcpConfig,
getMcpStatus,
listMcpTools,
handleMcpMessage,
};