From 27b338aaff348a5ec355d79eac56c2e8ca5ce3ad Mon Sep 17 00:00:00 2001 From: piyook Date: Tue, 17 Jun 2025 15:24:29 +0100 Subject: [PATCH 1/5] chore(): update server and log page html and css --- src/utilities/log-page.ts | 8 +- src/utilities/server-page.ts | 394 +++++++++++++++++++++++++++-------- 2 files changed, 314 insertions(+), 88 deletions(-) diff --git a/src/utilities/log-page.ts b/src/utilities/log-page.ts index aacf026..ed2a1b3 100644 --- a/src/utilities/log-page.ts +++ b/src/utilities/log-page.ts @@ -28,7 +28,7 @@ const createHtml = () => {
API Request Log
- +

API Requests Made

File can be viewed in /src/logs folder in container or local machine

LOG_REQUESTS env var must be set to 'ON' to log requests
@@ -69,7 +69,7 @@ ol.json-lines >li::marker { font-family: system-ui, sans-serif; font-weight: nor /* Dark Mode */ - .json-container { background-color: #00200B; } + .json-container { background-color: #20232a; } .json-key { color: indianred; } .json-string { color: khaki} .json-number { color: deepskyblue; } @@ -81,8 +81,8 @@ ol.json-lines >li::marker { font-family: system-ui, sans-serif; font-weight: nor a.json-link:hover { color: violet; } a.json-link:active { color: slategray; } ol.json-lines >li::marker { color: silver; } - ol.json-lines >li:nth-child(odd) { background-color: #293829; } - ol.json-lines >li:nth-child(even) { background-color: #354135; } + ol.json-lines >li:nth-child(odd) { background-color:rgb(67, 67, 67); } + ol.json-lines >li:nth-child(even) { background-color:rgb(40, 40, 40); } ol.json-lines >li:hover { background-color: dimgray; } diff --git a/src/utilities/server-page.ts b/src/utilities/server-page.ts index 9216017..633ff50 100644 --- a/src/utilities/server-page.ts +++ b/src/utilities/server-page.ts @@ -2,99 +2,325 @@ import 'dotenv/config'; import { http, HttpResponse } from 'msw'; import { env, prefix } from './env'; -const homePage = (apiPaths: string[]) => { - const htmlString = ` - - - -
-

Mock Server: Running

-
- -
-

Server Address: localhost

-

Server Port: ${env?.SERVER_PORT?.toUpperCase() ?? 'NONE'}

-

Server URL Prefix: ${env?.USE_API_URL_PREFIX?.toLowerCase() ?? 'NONE'}

- -

API endpoints*:

-
- - ${apiPaths.map((path) => '

/' + prefix + path + '

').join('')} - -
- -

Logs URL: localhost:${process.env?.SERVER_PORT}/logs

- -

* Add new api endpoints to the api folder.
For media endpoints include the media name in the url E.g /images/placeholder.png

- - -
- - - - + @media (max-width: 700px) { + main { + max-width: 99vw; + padding: 18px 1vw; + gap: 16px; + } + h1 { + font-size: 1.5rem; + } + } + @media (min-width: 900px) { + main { + width: 60vw; + max-width: 600px; + padding: 64px 56px 48px 56px; + } + h1 { + font-size: 2.4rem; + } + } + @media (min-width: 1200px) { + main { + width: 40vw; + max-width: 800px; + padding: 72px 80px 56px 80px; + } + h1 { + font-size: 2.8rem; + } + } + @media (min-width: 1600px) { + main { + width: 32vw; + max-width: 900px; + padding: 84px 120px 72px 120px; + } + h1 { + font-size: 3.2rem; + } + } + .endpoints { + display: flex; + flex-direction: column; + gap: 14px; + margin: 18px 0 12px 0; + align-items: center; + } + .endpoint-link { + display: block; + background: #5b8ca6; + color: #fff; + text-decoration: none; + padding: 12px 0; + border-radius: 8px; + font-size: 1.06rem; + font-weight: 500; + border: 1.5px solid #446a7c; + box-shadow: 0 1.5px 6px rgba(30,60,90,0.07); + transition: 1s ease-in-out; + width: 100%; + max-width: 520px; + text-align: center; + letter-spacing: 0.5px; + cursor: pointer; + } + .endpoint-link:hover, .endpoint-link:focus { + background: #22496a; + color: #fff; + box-shadow: 0 4px 16px rgba(1,25,75,0.14); + outline: none; + + } + h1 { + font-size: 2.4rem; + font-weight: 700; + margin: 0 0 12px 0; + letter-spacing: 1px; + text-align: center; + } + .status { + display: inline-block; + background: var(--accent); + color: #fff; + border-radius: 8px; + padding: 8px 16px; + font-size: 1.1rem; + font-weight: 600; + margin-left: 10px; + letter-spacing: 0.5px; + box-shadow: 0 2px 8px rgba(79,138,139,0.12); + position: relative; + } + section.info { + margin-bottom: 16px; + } + .info-list { + list-style: none; + padding: 0; + margin: 0; + } + .info-list li { + margin-bottom: 10px; + font-size: 1.1rem; + color: var(--text-main); + } + .info-label { + color: var(--text-muted); + font-weight: 500; + margin-right: 8px; + } + .highlight { + background: var(--accent2); + padding: 4px 10px; + border-radius: 6px; + color: #fff; + font-weight: 600; + letter-spacing: 0.5px; + font-size: 1rem; + } + .endpoints { + display: flex; + flex-direction: column; + gap: 12px; + margin: 18px 0 12px 0; + } + .endpoint-link { + display: inline-block; + background: var(--accent); + color: #fff; + text-decoration: none; + padding: 10px 18px; + border-radius: 8px; + font-size: 1.04rem; + font-weight: 500; + box-shadow: 0 2px 8px rgba(79,138,139,0.06); + transition: background 0.2s, color 0.2s, box-shadow 0.2s; + border: none; + } + .endpoint-link:hover, .endpoint-link:focus { + background: var(--accent2); + color: #fff; + box-shadow: 0 4px 16px rgba(255,92,88,0.14); + outline: none; + } + .logs-link { + color: var(--accent1); + text-decoration: underline; + font-weight: 500; + transition: color 0.2s; + + } + .logs-link:hover, .logs-link:focus { + color: var(--accent); + } + .note { + color: var(--text-muted); + font-size: 0.98rem; + margin-top: 18px; + text-align: center; + } + +
+
+

Mock Server

+
+ +Running
+
    +
  • Server Address:localhost
  • +
  • Server Port:${env?.SERVER_PORT?.toUpperCase() ?? 'NONE'}
  • +
  • Server URL Prefix:${env?.USE_API_URL_PREFIX?.toLowerCase() ?? 'NONE'}
  • +
+
+
+
API endpoints*
+
+ ${apiPaths.map((path) => `/${prefix}${path}`).join('')} +
+
+
+
Logs URL:  localhost:${process.env?.SERVER_PORT}/logs
+ +
+
+ * Add new API endpoints to the api folder.
+ For media endpoints, include the media name in the URL (e.g., /images/placeholder.png). +
+
+ + + `; - - return [ - http.get(`/`, () => { - return new HttpResponse(htmlString, { - status: 200, - headers: { - 'Content-Type': 'text/html', - }, - }); - }), - ]; -}; + return new HttpResponse(htmlString, { + headers: { 'Content-Type': 'text/html' }, + }); + }), +]; export default homePage; From ec29e8fb0576c9279581fb71a775cb87a56d300e Mon Sep 17 00:00:00 2001 From: piyook Date: Tue, 17 Jun 2025 18:52:57 +0100 Subject: [PATCH 2/5] chore(): add a dynamic server status check --- src/utilities/server-page.ts | 82 ++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/src/utilities/server-page.ts b/src/utilities/server-page.ts index 633ff50..74e4576 100644 --- a/src/utilities/server-page.ts +++ b/src/utilities/server-page.ts @@ -112,6 +112,12 @@ const homePage = (apiPaths: string[]) => [ padding-right:0.2em; } + .status-online { + background: var(--accent); + } + .status-offline { + background: #ff4136; /* Red color for offline */ + } @media (max-width: 700px) { main { @@ -194,8 +200,7 @@ const homePage = (apiPaths: string[]) => [ } .status { display: inline-block; - background: var(--accent); - color: #fff; + color: #fff; /* Removed background here to be set dynamically */ border-radius: 8px; padding: 8px 16px; font-size: 1.1rem; @@ -277,9 +282,15 @@ const homePage = (apiPaths: string[]) => [

Mock Server

-
- -Running
+
+ + + + + Checking... + + +
  • Server Address:localhost
  • Server Port:${env?.SERVER_PORT?.toUpperCase() ?? 'NONE'}
  • @@ -304,14 +315,58 @@ const homePage = (apiPaths: string[]) => [ @@ -321,6 +376,9 @@ const homePage = (apiPaths: string[]) => [ headers: { 'Content-Type': 'text/html' }, }); }), + http.get(`/ping`, () => { + return new HttpResponse(null, { status: 200 }); + }), ]; export default homePage; From d4a74dc43ec6b1eb1ef4e3327f6eedca908b86f6 Mon Sep 17 00:00:00 2001 From: piyook Date: Tue, 17 Jun 2025 18:58:15 +0100 Subject: [PATCH 3/5] chore(): add a connect mcp button --- src/utilities/server-page.ts | 132 +++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/src/utilities/server-page.ts b/src/utilities/server-page.ts index 74e4576..8844268 100644 --- a/src/utilities/server-page.ts +++ b/src/utilities/server-page.ts @@ -278,6 +278,86 @@ const homePage = (apiPaths: string[]) => [ margin-top: 18px; text-align: center; } + .mcp-connect-btn { + display: inline-block; + margin: 12px auto 0 auto; + padding: 10px 22px; + background: var(--accent2); + color: #fff; + border: none; + border-radius: 8px; + font-size: 1.08rem; + font-weight: 600; + letter-spacing: 0.5px; + box-shadow: 0 2px 8px rgba(1,25,75,0.10); + cursor: pointer; + transition: background 0.2s, color 0.2s, box-shadow 0.2s; + } + .mcp-connect-btn:hover, .mcp-connect-btn:focus { + background: var(--accent); + color: #fff; + box-shadow: 0 4px 16px rgba(79,138,139,0.18); + outline: none; + } + .mcp-modal { + display: none; + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + background: rgba(0,0,0,0.45); + justify-content: center; + align-items: center; + } + .mcp-modal.active { + display: flex; + } + .mcp-modal-content { + background: var(--bg-card); + color: var(--text-main); + padding: 32px 24px 24px 24px; + border-radius: 14px; + box-shadow: 0 8px 32px rgba(0,0,0,0.25); + max-width: 480px; + width: 95vw; + text-align: left; + position: relative; + } + .mcp-modal-content pre { + background: #181c23; + color: #fff; + padding: 14px; + border-radius: 8px; + font-size: 0.98rem; + overflow-x: auto; + margin-bottom: 18px; + } + .mcp-modal-content button.copy-btn { + background: var(--accent); + color: #fff; + border: none; + border-radius: 6px; + padding: 7px 16px; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + margin-right: 8px; + } + .mcp-modal-content button.close-btn { + background: #444; + color: #fff; + border: none; + border-radius: 6px; + padding: 7px 16px; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + position: absolute; + top: 12px; + right: 12px; + }
    @@ -311,6 +391,27 @@ const homePage = (apiPaths: string[]) => [ * Add new API endpoints to the api folder.
    For media endpoints, include the media name in the URL (e.g., /images/placeholder.png).
+ +
+
+ +

Connect to MCP Server

+

Copy and paste the following configuration into your client (Claude, Windsurf, Cursor, etc.):

+
{
+  "mcpServers": {
+    "LocalMockAPIServer": {
+      "command": "node",
+      "args": [
+        "<absolute-path-to-your-project>/src/mcp/server.js"
+      ]
+    }
+  }
+}
+ + +

Replace <absolute-path-to-your-project> with the full path to your project directory.

+
+
From 60038e34a85ff48bd2588353620321a026447510 Mon Sep 17 00:00:00 2001 From: piyook Date: Tue, 17 Jun 2025 19:31:19 +0100 Subject: [PATCH 4/5] chore(): update readme --- README.md | 2 +- images/image.png | Bin 51403 -> 123617 bytes images/logs.png | Bin 57463 -> 75010 bytes src/utilities/log-page.ts | 2 +- src/utilities/server-page.ts | 4 ++-- 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 61c7e74..676c4bf 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ npm start The list of available APIs can be viewed on localhost:8000/api by default but this can be customised - see later. -A list of all endpoints can be viewed on http://localhost:8000/. +A list of all endpoints can be viewed on the mock server dashboard at http://localhost:8000/. The project has been set-up with demo endpoints that can be removed or modified as needed. diff --git a/images/image.png b/images/image.png index f37bdf872b1ebb56d63b4bf9b84739d26546e630..7cfc1e26c2116ee48461027b1b547e3035228ed6 100644 GIT binary patch literal 123617 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