refactor: deduplicate URL generation and standardize on localhost
- Extract duplicated URL generation code into getClientUrl() helper function in start.js - Replace all 127.0.0.1 references with localhost for consistency across codebase - Update server to respect HOST environment variable for URL generation - Remove 127.0.0.1 from default allowed origins in CORS configuration - Update documentation to use localhost instead of 127.0.0.1 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
9c5c7575c0
commit
fe2c5c767d
5 changed files with 21 additions and 20 deletions
|
|
@ -7,7 +7,7 @@ Thanks for your interest in contributing! This guide explains how to get involve
|
|||
1. Fork the repository and clone it locally
|
||||
2. Install dependencies with `npm install`
|
||||
3. Run `npm run dev` to start both client and server in development mode
|
||||
4. Use the web UI at http://127.0.0.1:6274 to interact with the inspector
|
||||
4. Use the web UI at http://localhost:6274 to interact with the inspector
|
||||
|
||||
## Development Process & Pull Requests
|
||||
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ DANGEROUSLY_OMIT_AUTH=true npm start
|
|||
|
||||
#### Local-only Binding
|
||||
|
||||
By default, both the MCP Inspector proxy server and client bind only to `127.0.0.1` (localhost) to prevent network access. This ensures they are not accessible from other devices on the network. If you need to bind to all interfaces for development purposes, you can override this with the `HOST` environment variable:
|
||||
By default, both the MCP Inspector proxy server and client bind only to `localhost` to prevent network access. This ensures they are not accessible from other devices on the network. If you need to bind to all interfaces for development purposes, you can override this with the `HOST` environment variable:
|
||||
|
||||
```bash
|
||||
HOST=0.0.0.0 npm start
|
||||
|
|
@ -181,7 +181,7 @@ HOST=0.0.0.0 npm start
|
|||
To prevent DNS rebinding attacks, the MCP Inspector validates the `Origin` header on incoming requests. By default, only requests from the client origin are allowed (respects `CLIENT_PORT` if set, defaulting to port 6274). You can configure additional allowed origins by setting the `ALLOWED_ORIGINS` environment variable (comma-separated list):
|
||||
|
||||
```bash
|
||||
ALLOWED_ORIGINS=http://localhost:6274,http://127.0.0.1:6274,http://localhost:8000 npm start
|
||||
ALLOWED_ORIGINS=http://localhost:6274,http://localhost:8000 npm start
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ const server = http.createServer((request, response) => {
|
|||
});
|
||||
|
||||
const port = process.env.PORT || 6274;
|
||||
const host = process.env.HOST || "127.0.0.1";
|
||||
const host = process.env.HOST || "localhost";
|
||||
server.on("listening", () => {
|
||||
console.log(
|
||||
`🔍 MCP Inspector is up and running at http://${host}:${port} 🚀`,
|
||||
|
|
|
|||
|
|
@ -12,6 +12,14 @@ function delay(ms) {
|
|||
return new Promise((resolve) => setTimeout(resolve, ms, true));
|
||||
}
|
||||
|
||||
function getClientUrl(port, authDisabled, sessionToken) {
|
||||
const host = process.env.HOST || "localhost";
|
||||
const baseUrl = `http://${host}:${port}`;
|
||||
return authDisabled
|
||||
? baseUrl
|
||||
: `${baseUrl}/?MCP_PROXY_AUTH_TOKEN=${sessionToken}`;
|
||||
}
|
||||
|
||||
async function startDevServer(serverOptions) {
|
||||
const { SERVER_PORT, CLIENT_PORT, sessionToken, envVars, abort } =
|
||||
serverOptions;
|
||||
|
|
@ -102,7 +110,7 @@ async function startDevClient(clientOptions) {
|
|||
const { CLIENT_PORT, authDisabled, sessionToken, abort, cancelled } =
|
||||
clientOptions;
|
||||
const clientCommand = "npx";
|
||||
const host = process.env.HOST || "127.0.0.1";
|
||||
const host = process.env.HOST || "localhost";
|
||||
const clientArgs = ["vite", "--port", CLIENT_PORT, "--host", host];
|
||||
|
||||
const client = spawn(clientCommand, clientArgs, {
|
||||
|
|
@ -114,10 +122,7 @@ async function startDevClient(clientOptions) {
|
|||
|
||||
// Auto-open browser after vite starts
|
||||
if (process.env.MCP_AUTO_OPEN_ENABLED !== "false") {
|
||||
const clientHost = process.env.HOST || "127.0.0.1";
|
||||
const url = authDisabled
|
||||
? `http://${clientHost}:${CLIENT_PORT}`
|
||||
: `http://${clientHost}:${CLIENT_PORT}/?MCP_PROXY_AUTH_TOKEN=${sessionToken}`;
|
||||
const url = getClientUrl(CLIENT_PORT, authDisabled, sessionToken);
|
||||
|
||||
// Give vite time to start before opening browser
|
||||
setTimeout(() => {
|
||||
|
|
@ -153,10 +158,7 @@ async function startProdClient(clientOptions) {
|
|||
|
||||
// Only auto-open browser if not cancelled
|
||||
if (process.env.MCP_AUTO_OPEN_ENABLED !== "false" && !cancelled) {
|
||||
const clientHost = process.env.HOST || "127.0.0.1";
|
||||
const url = authDisabled
|
||||
? `http://${clientHost}:${CLIENT_PORT}`
|
||||
: `http://${clientHost}:${CLIENT_PORT}/?MCP_PROXY_AUTH_TOKEN=${sessionToken}`;
|
||||
const url = getClientUrl(CLIENT_PORT, authDisabled, sessionToken);
|
||||
open(url);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -104,12 +104,10 @@ const originValidationMiddleware = (
|
|||
|
||||
// Default origins based on CLIENT_PORT or use environment variable
|
||||
const clientPort = process.env.CLIENT_PORT || "6274";
|
||||
const defaultOrigins = [
|
||||
`http://localhost:${clientPort}`,
|
||||
`http://127.0.0.1:${clientPort}`,
|
||||
const defaultOrigin = `http://localhost:${clientPort}`;
|
||||
const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(",") || [
|
||||
defaultOrigin,
|
||||
];
|
||||
const allowedOrigins =
|
||||
process.env.ALLOWED_ORIGINS?.split(",") || defaultOrigins;
|
||||
|
||||
if (origin && !allowedOrigins.includes(origin)) {
|
||||
console.error(`Invalid origin: ${origin}`);
|
||||
|
|
@ -531,7 +529,7 @@ app.get("/config", originValidationMiddleware, authMiddleware, (req, res) => {
|
|||
});
|
||||
|
||||
const PORT = parseInt(process.env.PORT || "6277", 10);
|
||||
const HOST = process.env.HOST || "127.0.0.1";
|
||||
const HOST = process.env.HOST || "localhost";
|
||||
|
||||
const server = app.listen(PORT, HOST);
|
||||
server.on("listening", () => {
|
||||
|
|
@ -544,7 +542,8 @@ server.on("listening", () => {
|
|||
|
||||
// Display clickable URL with pre-filled token
|
||||
const clientPort = process.env.CLIENT_PORT || "6274";
|
||||
const clientUrl = `http://localhost:${clientPort}/?MCP_PROXY_AUTH_TOKEN=${sessionToken}`;
|
||||
const clientHost = process.env.HOST || "localhost";
|
||||
const clientUrl = `http://${clientHost}:${clientPort}/?MCP_PROXY_AUTH_TOKEN=${sessionToken}`;
|
||||
console.log(
|
||||
`\n🔗 Open inspector with token pre-filled:\n ${clientUrl}\n`,
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in a new issue