public MCP: a browser on the bare host goes to the landing page

This commit is contained in:
CRTkafa 2026-11-08 02:27:53 +07:00
parent b82becf7fb
commit 07052cffd2
3 changed files with 6 additions and 1 deletions

View file

@ -3,7 +3,7 @@
## Unreleased
- Public MCP server: the bare host is the endpoint too. `POST /` answers MCP like `/mcp` (someone who pastes `https://mcp.example.com` into a connector gets connected), `GET /` names the connect URL. A signed-in server keeps `/` closed.
- Public MCP server: the bare host is the endpoint too. `POST /` answers MCP like `/mcp` (someone who pastes `https://mcp.example.com` into a connector gets connected), `GET /` sends a browser to the landing page and names the connect URL to any other client. A signed-in server keeps `/` closed.
## 0.8.69 · 2026-11-07

View file

@ -205,6 +205,8 @@ export function startHttp(o: HttpOptions): Promise<{ close: () => void; port: nu
// public: the bare host is the MCP endpoint too (people paste "mcp.example.com" into a connector), and a browser
// opening it gets the connect line instead of a 404
if (pub && path === '/' && req.method === 'GET') {
// a person in a browser goes to the landing page; any other client gets the connect line
if (/text\/html/.test(String(req.headers.accept ?? ''))) { res.writeHead(302, { ...cors, location: 'https://storebound.dev/' }); return res.end(); }
res.writeHead(200, { ...cors, 'content-type': 'text/plain; charset=utf-8' });
return res.end(`storebound MCP server ${pkg.version} (read-only, no key)\nAdd it as a remote MCP server / custom connector with this URL. Claude Code: claude mcp add --transport http storebound <this URL>\n`);
}

View file

@ -244,6 +244,9 @@ describe('http, public mode', () => {
const g = await fetch(`http://127.0.0.1:${s.port}/`);
expect(g.status).toBe(200);
expect(await g.text()).toContain('claude mcp add --transport http storebound');
const b = await fetch(`http://127.0.0.1:${s.port}/`, { headers: { accept: 'text/html,application/xhtml+xml' }, redirect: 'manual' });
expect(b.status).toBe(302);
expect(b.headers.get('location')).toBe('https://storebound.dev/');
expect((await fetch(`http://127.0.0.1:${s.port}/other`)).status).toBe(404);
} finally { s.close(); }
});