@whyuds/ask-user
Version:
A cross-platform command-line tool and MCP server to show dialog windows and get user input for AI code editors
87 lines (75 loc) • 2.03 kB
JavaScript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { spawn } from 'child_process';
import { z } from 'zod';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Create MCP server
const server = new McpServer({
name: 'ask-user',
version: '1.0.0'
}, {
capabilities: {
tools: {}
}
});
// Add ask-user tool
server.tool(
'ask_user',
{
title: z.string().optional().describe('Title of the dialog window'),
message: z.string().describe('Message to display to the user')
},
async ({ title, message }) => {
try {
const result = await askUser(title || 'Input Required', message);
return {
content: [{
type: 'text',
text: result
}]
};
} catch (error) {
return {
content: [{
type: 'text',
text: `Error: ${error.message}`
}],
isError: true
};
}
}
);
// Function to call the existing ask-user functionality
function askUser(title, message) {
return new Promise((resolve, reject) => {
const askPath = path.join(__dirname, 'bin', 'ask.js');
const args = ['--title', title, '--message', message];
const child = spawn('node', [askPath, ...args], {
stdio: ['inherit', 'pipe', 'inherit']
});
let output = '';
child.stdout.on('data', (data) => {
output += data.toString();
});
child.on('close', (code) => {
if (code === 0) {
resolve(output.trim());
} else {
reject(new Error(`Process exited with code ${code}`));
}
});
child.on('error', (error) => {
reject(error);
});
});
}
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);