Kunna MCP Client has no runtime environment variables or dotenv files — all configuration lives inDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/vancovx/KunnaClienteMCP/llms.txt
Use this file to discover all available pages before exploring further.
vite.config.js (build tooling), Dockerfile (containerization), and nginx.conf (static serving). There is no server process to configure at runtime; the application is a fully static single-page app once built. This page documents every configuration point and explains the reasoning behind each choice.
Vite Configuration
The Vite configuration invite.config.js is intentionally minimal. The only plugin in use is @vitejs/plugin-react, which enables JSX transform, Fast Refresh during development, and Babel-based optimisations in production builds.
server.port, server.proxy, or resolve.alias entries are needed — the MCP client connects directly to the target server from the browser.
vite-plugin-node-polyfills is listed as a dev dependency (^0.28.0). It is not active in the current config but is available if the @modelcontextprotocol/sdk bundle ever requires Node.js built-in polyfills (such as EventEmitter or Buffer) in the browser build. To enable it, add nodePolyfills() to the plugins array.npm Scripts
All development and deployment tasks are available as npm scripts defined inpackage.json.
| Script | Command | Purpose |
|---|---|---|
dev | vite | Start the Vite dev server with HMR on http://localhost:5173 |
build | vite build | Compile a production bundle into the dist/ directory |
preview | vite preview | Serve the dist/ production bundle locally for inspection |
lint | eslint . | Run ESLint across all source files |
build-docker | docker build . -t kunnaclientemcp-frontend:latest | Build the Docker image with the multi-stage Dockerfile |
Docker Configuration
TheDockerfile uses a two-stage build. The first stage compiles the React app with Node 20; the second stage copies only the static output into an nginx image, keeping the final image small.
| Setting | Value | Notes |
|---|---|---|
| Build base image | node:20-alpine | Node 20 LTS, minimal Alpine variant |
| Build working directory | /app | All source and install steps run here |
| Serve base image | nginx:stable-alpine | Lightweight nginx for static hosting |
| Static file root | /usr/share/nginx/html | Receives the Vite dist/ output |
| Exposed port | 5173 | Matches the nginx listen directive |
http://localhost:5173 in your browser.
nginx Configuration
The customnginx.conf replaces nginx’s default configuration entirely to give precise control over the port and SPA routing behaviour.
listen 5173
nginx binds to port
5173 to match the EXPOSE instruction in the Dockerfile and the Vite dev server default, so the port is consistent across development and production.try_files … /index.html
Critical for React Router. When a user navigates directly to a sub-route (e.g.
/inspector), nginx looks for a real file first, then falls back to index.html — letting React Router handle the path on the client side.include mime.types
Ensures JavaScript bundles are served as
application/javascript and CSS as text/css. Without this, some browsers refuse to execute scripts delivered with the wrong MIME type.error_page 404 /index.html
Secondary SPA safety net. Even if the
try_files directive doesn’t catch a missing path, 404 responses are redirected back to index.html so React Router can display the correct page or a not-found state.MCP Client Identity
McpConnection identifies itself to MCP servers during the initialize handshake using a hardcoded client descriptor defined in src/lib/mcpClient.js:
| Field | Value |
|---|---|
| Client name | "mi-inspector-tfg-web" |
| Client version | "0.1.0" |
| Declared capabilities | {} (none — the client is a consumer, not a provider) |
These values are hardcoded constants. If you fork Kunna for a different project, update them in
src/lib/mcpClient.js to reflect your application’s identity.Theme Persistence
Kunna supports light and dark themes. The user’s preference is persisted across page loads usinglocalStorage:
| Detail | Value |
|---|---|
localStorage key | "inspector-theme" |
| Stored values | "light" or "dark" |
| First-visit fallback | window.matchMedia('(prefers-color-scheme: dark)') — respects the OS preference |