Skip to main content
Glama
scenario.yaml4.4 kB
# Verifies Control-Plane UI stays functional with multiple simultaneous browser tabs. name: "MCPX Control-Plane Multi-Tab Test" image: us-central1-docker.pkg.dev/prj-common-442813/mcpx/mcpx:v0.2.17-66354a7 configMount: config env: {} dependentContainers: [] verboseOutput: false steps: - name: Invoke time server kind: backend toolName: time__get_current_time payload: timezone: UTC expected: mode: regex value: "\"timezone\"\\s*:\\s*\"UTC\"" - name: Load Control-Plane UI in first tab kind: browser toolName: browser_navigate payload: url: http://localhost:5173 expected: mode: regex value: "Ran Playwright code" - name: Wait for Total Requests in first tab kind: browser toolName: browser_wait_for payload: text: "Total Requests" time: 15 expected: mode: contains value: "Waited for Total Requests" - name: Invoke time server again kind: backend toolName: time__get_current_time payload: timezone: UTC expected: mode: regex value: "\"timezone\"\\s*:\\s*\"UTC\"" - name: Verify Total Requests > 0 in first tab kind: browser toolName: browser_evaluate payload: function: | () => new Promise((resolve) => { const start = Date.now(); const readValue = () => { const text = document.body?.innerText || ''; const match = text.match(/Total Requests\s*(\d+)/i); return match ? Number(match[1]) : 0; }; const poll = () => { const value = readValue(); if (value > 0 || Date.now() - start > 15000) { resolve(value); } else { setTimeout(poll, 500); } }; poll(); }) expected: mode: regex value: "\"?[1-9]\\d*\"?" - name: Open second tab kind: browser toolName: browser_tabs payload: action: new expected: mode: contains value: "### Open tabs" - name: Navigate second tab to Control-Plane UI kind: browser toolName: browser_navigate payload: url: http://localhost:5173 expected: mode: regex value: "Ran Playwright code" - name: Wait for Total Requests in second tab kind: browser toolName: browser_wait_for payload: text: "Total Requests" time: 15 expected: mode: contains value: "Waited for Total Requests" - name: Verify Total Requests > 0 in second tab kind: browser toolName: browser_evaluate payload: function: | () => new Promise((resolve) => { const start = Date.now(); const poll = () => { const text = document.body?.innerText || ''; const match = text.match(/Total Requests\s*(\d+)/i); const value = match ? Number(match[1]) : 0; if (value > 0 || Date.now() - start > 15000) { resolve(value); } else { setTimeout(poll, 500); } }; poll(); }) expected: mode: regex value: "\"?[1-9]\\d*\"?" - name: List open tabs kind: browser toolName: browser_tabs payload: action: list expected: mode: regex value: "### Open tabs[\\s\\S]*- 0:[\\s\\S]*- 1:" - name: Switch back to first tab kind: browser toolName: browser_tabs payload: action: select index: 0 expected: mode: regex value: "- 0: \\(current\\)" - name: Verify Last Activity timestamp in first tab kind: browser toolName: browser_evaluate payload: function: | () => { const card = Array.from(document.querySelectorAll('div,section,article')) .find((el) => /Last Activity/i.test(el.textContent || '')); if (!card) { return 'last-activity-card-missing'; } const text = (card.textContent || '').replace(/\s+/g, ' ').trim(); if (/\b[A-Za-z]{3,}\s+\d{1,2},\s+\d{2}:\d{2}\b/.test(text)) { return 'last-activity-timestamp'; } if (/\d{1,2}:\d{2}/.test(text)) { return 'last-activity-time'; } return `last-activity-unexpected:${text}`; } expected: mode: regex value: "last-activity-(timestamp|time)"

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/TheLunarCompany/lunar'

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