Skip to content

Commit 6599248

Browse files
ochafikclaude
andcommitted
Add server selector to basic-host example
- Add ServerSelector component to switch between MCP servers - Run all example servers concurrently on ports 3101-3107 - Update examples:start to launch all servers with assigned ports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 1e96882 commit 6599248

File tree

3 files changed

+102
-7
lines changed

3 files changed

+102
-7
lines changed

examples/basic-host/src/index.module.css

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,35 @@
1+
.serverSelector {
2+
max-width: 480px;
3+
margin: 0 auto 1rem;
4+
padding: 1rem;
5+
border: 1px solid #ddd;
6+
border-radius: 4px;
7+
background-color: #f9f9f9;
8+
9+
label {
10+
display: flex;
11+
flex-direction: column;
12+
gap: 0.25rem;
13+
font-weight: 600;
14+
}
15+
16+
select {
17+
padding: 0.5rem;
18+
border: 1px solid #ccc;
19+
border-radius: 4px;
20+
font-family: monospace;
21+
font-size: inherit;
22+
}
23+
}
24+
25+
.connecting {
26+
max-width: 480px;
27+
margin: 0 auto;
28+
padding: 1rem;
29+
text-align: center;
30+
color: #666;
31+
}
32+
133
.callToolPanel, .toolCallInfoPanel {
234
margin: 0 auto;
335
padding: 1rem;

examples/basic-host/src/index.tsx

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,20 @@ import { callTool, connectToServer, hasAppHtml, initializeApp, loadSandboxProxy,
44
import styles from "./index.module.css";
55

66

7-
const MCP_SERVER_URL = new URL("http://localhost:3001/mcp");
7+
// Available MCP servers - using ports 3101+ to avoid conflicts with common dev ports
8+
const SERVERS = [
9+
{ name: "Basic React", port: 3101 },
10+
{ name: "Vanilla JS", port: 3102 },
11+
{ name: "Budget Allocator", port: 3103 },
12+
{ name: "Cohort Heatmap", port: 3104 },
13+
{ name: "Customer Segmentation", port: 3105 },
14+
{ name: "Scenario Modeler", port: 3106 },
15+
{ name: "System Monitor", port: 3107 },
16+
] as const;
17+
18+
function serverUrl(port: number): string {
19+
return `http://localhost:${port}/mcp`;
20+
}
821

922

1023
interface HostProps {
@@ -186,10 +199,55 @@ class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
186199
}
187200

188201

202+
interface ServerSelectorProps {
203+
selectedPort: number;
204+
onSelect: (port: number) => void;
205+
}
206+
function ServerSelector({ selectedPort, onSelect }: ServerSelectorProps) {
207+
return (
208+
<div className={styles.serverSelector}>
209+
<label>
210+
Server
211+
<select
212+
value={selectedPort}
213+
onChange={(e) => onSelect(Number(e.target.value))}
214+
>
215+
{SERVERS.map(({ name, port }) => (
216+
<option key={port} value={port}>
217+
{name} (:{port})
218+
</option>
219+
))}
220+
</select>
221+
</label>
222+
</div>
223+
);
224+
}
225+
226+
227+
function App() {
228+
const [selectedPort, setSelectedPort] = useState(SERVERS[0].port);
229+
const [serverInfoPromise, setServerInfoPromise] = useState(
230+
() => connectToServer(new URL(serverUrl(selectedPort)))
231+
);
232+
233+
const handleServerChange = (port: number) => {
234+
setSelectedPort(port);
235+
setServerInfoPromise(connectToServer(new URL(serverUrl(port))));
236+
};
237+
238+
return (
239+
<>
240+
<ServerSelector selectedPort={selectedPort} onSelect={handleServerChange} />
241+
<Suspense fallback={<p className={styles.connecting}>Connecting to {serverUrl(selectedPort)}...</p>}>
242+
<Host key={selectedPort} serverInfoPromise={serverInfoPromise} />
243+
</Suspense>
244+
</>
245+
);
246+
}
247+
248+
189249
createRoot(document.getElementById("root")!).render(
190250
<StrictMode>
191-
<Suspense fallback={<p>Connecting to server ({MCP_SERVER_URL.href})...</p>}>
192-
<Host serverInfoPromise={connectToServer(MCP_SERVER_URL)} />
193-
</Suspense>
251+
<App />
194252
</StrictMode>,
195253
);

package.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,15 @@
3030
"build:all": "npm run build && npm run examples:build",
3131
"test": "bun test",
3232
"examples:build": "find examples -maxdepth 1 -mindepth 1 -type d -exec printf '%s\\0' 'npm run --workspace={} build' ';' | xargs -0 concurrently --kill-others-on-fail",
33-
"examples:start": "NODE_ENV=development npm run build && concurrently 'npm run examples:start:basic-host' 'npm run examples:start:basic-server-react'",
33+
"examples:start": "NODE_ENV=development npm run build && concurrently 'npm run examples:start:basic-host' 'npm run examples:start:basic-server-react' 'npm run examples:start:basic-server-vanillajs' 'npm run examples:start:budget-allocator-server' 'npm run examples:start:cohort-heatmap-server' 'npm run examples:start:customer-segmentation-server' 'npm run examples:start:scenario-modeler-server' 'npm run examples:start:system-monitor-server'",
3434
"examples:start:basic-host": "npm run --workspace=examples/basic-host start",
35-
"examples:start:basic-server-react": "npm run --workspace=examples/basic-server-react start",
36-
"examples:start:basic-server-vanillajs": "npm run --workspace=examples/basic-server-vanillajs start",
35+
"examples:start:basic-server-react": "PORT=3101 npm run --workspace=examples/basic-server-react start",
36+
"examples:start:basic-server-vanillajs": "PORT=3102 npm run --workspace=examples/basic-server-vanillajs start",
37+
"examples:start:budget-allocator-server": "PORT=3103 npm run --workspace=examples/budget-allocator-server start",
38+
"examples:start:cohort-heatmap-server": "PORT=3104 npm run --workspace=examples/cohort-heatmap-server start",
39+
"examples:start:customer-segmentation-server": "PORT=3105 npm run --workspace=examples/customer-segmentation-server start",
40+
"examples:start:scenario-modeler-server": "PORT=3106 npm run --workspace=examples/scenario-modeler-server start",
41+
"examples:start:system-monitor-server": "PORT=3107 npm run --workspace=examples/system-monitor-server start",
3742
"watch": "nodemon --watch src --ext ts,tsx --exec 'bun build.bun.ts'",
3843
"examples:dev": "NODE_ENV=development concurrently 'npm run watch' 'npm run examples:dev:basic-host' 'npm run examples:dev:basic-server-react'",
3944
"examples:dev:basic-host": "npm run --workspace=examples/basic-host dev",

0 commit comments

Comments
 (0)