Skip to main content
Glama
dashboard.html15.9 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Rezoomex MCP Server - Dashboard</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f7fa; min-height: 100vh; } .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .header h1 { font-size: 2em; margin-bottom: 5px; } .header p { opacity: 0.9; } .container { max-width: 1200px; margin: 0 auto; padding: 30px 20px; } .tools-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 20px; margin-bottom: 30px; } .tool-card { background: white; border-radius: 15px; padding: 25px; box-shadow: 0 5px 15px rgba(0,0,0,0.08); transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; } .tool-card:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0,0,0,0.15); } .tool-card h3 { color: #333; margin-bottom: 10px; font-size: 1.3em; } .tool-card p { color: #666; margin-bottom: 15px; line-height: 1.5; } .tool-params { background: #f8f9fa; border-radius: 8px; padding: 10px; margin-bottom: 15px; } .tool-params strong { color: #495057; font-size: 0.9em; } .tool-params span { color: #6c757d; font-size: 0.85em; } .execute-btn { background: #28a745; color: white; border: none; padding: 10px 20px; border-radius: 8px; font-weight: 600; cursor: pointer; transition: background 0.3s ease; width: 100%; } .execute-btn:hover { background: #218838; } .category-header { color: #333; font-size: 1.5em; margin: 30px 0 15px 0; padding-bottom: 10px; border-bottom: 2px solid #e9ecef; } .session-info { background: white; border-radius: 15px; padding: 20px; margin-bottom: 30px; box-shadow: 0 5px 15px rgba(0,0,0,0.08); } .session-info h2 { color: #333; margin-bottom: 15px; } .session-details { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; } .session-detail { background: #f8f9fa; padding: 15px; border-radius: 8px; } .session-detail strong { color: #495057; display: block; margin-bottom: 5px; } .logout-btn { background: #dc3545; color: white; border: none; padding: 10px 20px; border-radius: 8px; font-weight: 600; cursor: pointer; float: right; } .logout-btn:hover { background: #c82333; } .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); } .modal-content { background-color: white; margin: 5% auto; padding: 30px; border-radius: 15px; width: 90%; max-width: 600px; max-height: 80vh; overflow-y: auto; } .close { color: #aaa; float: right; font-size: 28px; font-weight: bold; cursor: pointer; } .close:hover { color: #000; } .form-group { margin-bottom: 15px; } .form-group label { display: block; margin-bottom: 5px; font-weight: 600; color: #333; } .form-group input, .form-group select { width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 8px; font-size: 1em; } .form-group input:focus, .form-group select:focus { outline: none; border-color: #28a745; } .result-area { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 8px; padding: 15px; margin-top: 20px; min-height: 200px; font-family: 'Courier New', monospace; white-space: pre-wrap; overflow-y: auto; } </style> </head> <body> <div class="header"> <h1>🚀 Rezoomex MCP Server Dashboard</h1> <p>Model Context Protocol Tools & API Interface</p> </div> <div class="container"> <div class="session-info"> <h2>📊 Session Information</h2> <button class="logout-btn" onclick="logout()">🚪 Logout</button> <div class="session-details"> <div class="session-detail"> <strong>Session ID:</strong> <span id="sessionId">Loading...</span> </div> <div class="session-detail"> <strong>User:</strong> <span id="userName">Loading...</span> </div> <div class="session-detail"> <strong>NDA Status:</strong> <span id="ndaStatus">Loading...</span> </div> <div class="session-detail"> <strong>Status:</strong> <span style="color: #28a745; font-weight: 600;">✅ Authenticated</span> </div> </div> </div> <h2 class="category-header">🔧 Core MCP Tools</h2> <div class="tools-grid" id="coreTools"></div> <h2 class="category-header">👤 Name-Based Tools (User-Friendly)</h2> <div class="tools-grid" id="nameTools"></div> <h2 class="category-header">🔄 Legacy Tools (Backward Compatibility)</h2> <div class="tools-grid" id="legacyTools"></div> </div> <!-- Tool Execution Modal --> <div id="toolModal" class="modal"> <div class="modal-content"> <span class="close">&times;</span> <h2 id="modalTitle">Execute Tool</h2> <form id="toolForm"> <div id="toolParams"></div> <button type="submit" class="execute-btn">🚀 Execute Tool</button> </form> <div class="result-area" id="resultArea">Results will appear here...</div> </div> </div> <script> let sessionId = null; let currentTool = null; // Tool categories const toolCategories = { core: [ 'list_user_stories', 'get_story_range', 'get_single_story_details', 'get_project_overview', 'get_persona_profile', 'get_user_journey', 'get_jobs_to_be_done', 'get_user_info', 'get_project_environment', 'check_nda_status', 'get_product_info' ], name: [ 'list_projects', 'find_project_by_name', 'find_persona_by_name', 'get_user_stories_by_name', 'get_persona_by_name' ], legacy: [ 'mcp0_getUserInfo', 'mcp0_fetchPersona', 'mcp0_fetchElevatorPitch', 'mcp0_fetchVisionStatement', 'mcp0_fetchProductInfo', 'mcp0_fetchProjectEnvironment', 'mcp0_checkNdaStatus' ] }; window.addEventListener('load', async () => { await checkAuth(); await loadTools(); }); async function checkAuth() { try { const response = await fetch('/auth/status'); const data = await response.json(); if (!data.authenticated) { window.location.href = '/'; return; } sessionId = data.sessionId; document.getElementById('sessionId').textContent = data.sessionId; document.getElementById('userName').textContent = data.user?.fullName || 'Unknown'; document.getElementById('ndaStatus').textContent = data.user?.ndaStatus || 'Unknown'; } catch (error) { window.location.href = '/'; } } async function loadTools() { try { const response = await fetch('/mcp/tools'); const tools = await response.json(); renderToolsByCategory(tools); } catch (error) { console.error('Failed to load tools:', error); } } function renderToolsByCategory(tools) { const coreContainer = document.getElementById('coreTools'); const nameContainer = document.getElementById('nameTools'); const legacyContainer = document.getElementById('legacyTools'); tools.forEach(tool => { const toolCard = createToolCard(tool); if (toolCategories.core.includes(tool.name)) { coreContainer.appendChild(toolCard); } else if (toolCategories.name.includes(tool.name)) { nameContainer.appendChild(toolCard); } else if (toolCategories.legacy.includes(tool.name)) { legacyContainer.appendChild(toolCard); } }); } function createToolCard(tool) { const card = document.createElement('div'); card.className = 'tool-card'; const requiredParams = tool.inputSchema.required || []; const paramsText = requiredParams.length > 0 ? requiredParams.join(', ') : 'None'; card.innerHTML = ` <h3>${tool.name}</h3> <p>${tool.description}</p> <div class="tool-params"> <strong>Required Parameters:</strong> <span>${paramsText}</span> </div> <button class="execute-btn" onclick="openToolModal('${tool.name}')"> 🚀 Execute </button> `; return card; } function openToolModal(toolName) { currentTool = toolName; document.getElementById('modalTitle').textContent = `Execute: ${toolName}`; // Load tool schema and create form fetch('/mcp/tools') .then(response => response.json()) .then(tools => { const tool = tools.find(t => t.name === toolName); if (tool) { createToolForm(tool); document.getElementById('toolModal').style.display = 'block'; } }); } function createToolForm(tool) { const paramsContainer = document.getElementById('toolParams'); paramsContainer.innerHTML = ''; const properties = tool.inputSchema.properties || {}; const required = tool.inputSchema.required || []; Object.keys(properties).forEach(paramName => { const param = properties[paramName]; const isRequired = required.includes(paramName); const formGroup = document.createElement('div'); formGroup.className = 'form-group'; formGroup.innerHTML = ` <label for="${paramName}"> ${paramName}${isRequired ? ' *' : ''} </label> <input type="text" id="${paramName}" name="${paramName}" placeholder="${param.description || ''}" ${isRequired ? 'required' : ''} > `; paramsContainer.appendChild(formGroup); }); document.getElementById('resultArea').textContent = 'Results will appear here...'; } document.getElementById('toolForm').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const params = {}; for (let [key, value] of formData.entries()) { if (value.trim()) { params[key] = value.trim(); } } await executeTool(currentTool, params); }); async function executeTool(toolName, params) { const resultArea = document.getElementById('resultArea'); resultArea.textContent = '🔄 Executing tool...'; try { const response = await fetch(`/mcp/execute/${toolName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Session-ID': sessionId }, body: JSON.stringify(params) }); const result = await response.json(); if (response.ok) { resultArea.textContent = JSON.stringify(result, null, 2); } else { resultArea.textContent = `❌ Error: ${result.error || 'Unknown error'}`; } } catch (error) { resultArea.textContent = `❌ Network Error: ${error.message}`; } } async function logout() { try { await fetch('/auth/session', { method: 'DELETE' }); } catch (error) { console.error('Logout error:', error); } window.location.href = '/'; } // Modal close functionality document.querySelector('.close').onclick = function() { document.getElementById('toolModal').style.display = 'none'; } window.onclick = function(event) { const modal = document.getElementById('toolModal'); if (event.target === modal) { modal.style.display = 'none'; } } </script> </body> </html>

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Pratik-911/Rmx-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server