okta-mcp-server
Version:
Model Context Protocol (MCP) server for Okta API operations with support for bulk operations and caching
136 lines ⢠4.68 kB
JavaScript
import { spawn } from 'child_process';
import readline from 'readline';
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
async function interactiveTest() {
console.log('Starting Okta MCP Server Interactive Test...\n');
// Spawn the server
const server = spawn('node', ['dist/server.js'], {
stdio: ['pipe', 'pipe', 'pipe'], // pipe stderr separately
env: process.env,
});
let messageId = 1;
let buffer = '';
// Process server stderr (logs) separately
server.stderr.on('data', (data) => {
// Optionally show debug logs
if (process.env['DEBUG']) {
console.error('[LOG]', data.toString());
}
});
// Process server stdout (JSON-RPC responses)
server.stdout.on('data', (data) => {
buffer += data.toString();
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.trim()) {
try {
const response = JSON.parse(line);
if (response.result) {
console.log('\nā
Response:', JSON.stringify(response.result, null, 2));
showMenu();
rl.question('Select option: ', () => { });
}
else if (response.error) {
console.error('\nā Error:', response.error);
showMenu();
rl.question('Select option: ', () => { });
}
}
catch (e) {
console.error('Failed to parse:', line);
}
}
}
});
// Helper to send request
function sendRequest(method, params) {
const request = {
jsonrpc: '2.0',
id: messageId++,
method,
params: params || {},
};
server.stdin.write(JSON.stringify(request) + '\n');
}
// Wait for server to start
await new Promise((resolve) => setTimeout(resolve, 1000));
// Initialize
console.log('Initializing connection...');
sendRequest('initialize', {
protocolVersion: '2024-11-05',
capabilities: {},
clientInfo: {
name: 'interactive-test',
version: '1.0.0',
},
});
await new Promise((resolve) => setTimeout(resolve, 500));
// Show menu
function showMenu() {
console.log('\nš Available Commands:');
console.log(' 1. List tools');
console.log(' 2. List 5 users');
console.log(' 3. Search active users');
console.log(' 4. Get specific user');
console.log(' 5. List resources');
console.log(' 6. Exit');
console.log('');
}
// Show initial menu and prompt
showMenu();
rl.question('Select option: ', () => { });
// Interactive prompt handler
rl.on('line', async (input) => {
switch (input.trim()) {
case '1':
console.log('\nListing tools...');
sendRequest('tools/list');
break;
case '2':
console.log('\nListing 5 users...');
sendRequest('tools/call', {
name: 'listUsers',
arguments: { limit: 5 },
});
break;
case '3':
console.log('\nSearching for active users...');
sendRequest('tools/call', {
name: 'listUsers',
arguments: {
filter: 'status eq "ACTIVE"',
limit: 5,
},
});
break;
case '4':
rl.question('Enter user ID or email: ', (userId) => {
sendRequest('tools/call', {
name: 'getUser',
arguments: { userIdOrLogin: userId },
});
});
break;
case '5':
console.log('\nListing resources...');
sendRequest('resources/list');
break;
case '6':
console.log('\nShutting down...');
server.kill();
process.exit(0);
break;
default:
console.log('Invalid option');
showMenu();
rl.question('Select option: ', () => { });
}
});
}
interactiveTest().catch(console.error);
//# sourceMappingURL=test-interactive.js.map