@mcp-use/cli 2.1.3 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,104 +1,403 @@
1
- # @mcp-use/cli
1
+ <div align="center" style="margin: 0 auto; max-width: 80%;">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/mcp-use/mcp-use-ts/main/packages/mcp-use/static/logo_white.svg">
4
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/mcp-use/mcp-use-ts/main/packages/mcp-use/static/logo_black.svg">
5
+ <img alt="mcp use logo" src="https://raw.githubusercontent.com/mcp-use/mcp-use-ts/main/packages/mcp-use/static/logo_white.svg" width="80%" style="margin: 20px auto;">
6
+ </picture>
7
+ </div>
2
8
 
3
- Build and development tool for MCP servers with UI widgets.
9
+ <h1 align="center">MCP-Use CLI</h1>
4
10
 
5
- ## Install
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/@mcp-use/cli" alt="NPM Downloads">
13
+ <img src="https://img.shields.io/npm/dw/@mcp-use/cli.svg"/></a>
14
+ <a href="https://www.npmjs.com/package/@mcp-use/cli" alt="NPM Version">
15
+ <img src="https://img.shields.io/npm/v/@mcp-use/cli.svg"/></a>
16
+ <a href="https://github.com/mcp-use/mcp-use-ts/blob/main/LICENSE" alt="License">
17
+ <img src="https://img.shields.io/github/license/mcp-use/mcp-use-ts" /></a>
18
+ <a href="https://github.com/mcp-use/mcp-use-ts/stargazers" alt="GitHub stars">
19
+ <img src="https://img.shields.io/github/stars/mcp-use/mcp-use-ts?style=social" /></a>
20
+ <a href="https://discord.gg/XkNkSkMz3V" alt="Discord">
21
+ <img src="https://dcbadge.limes.pink/api/server/XkNkSkMz3V?style=flat" /></a>
22
+ </p>
23
+
24
+ 🛠️ **MCP-Use CLI** is a powerful build and development tool for creating MCP (Model Context Protocol) applications with integrated UI widgets. It enables developers to build MCP servers with custom React components that can be served alongside their MCP tools, providing rich visual interfaces for AI interactions.
25
+
26
+ ## 📦 Related Packages
27
+
28
+ | Package | Description | Version |
29
+ |---------|-------------|---------|
30
+ | [mcp-use](https://github.com/mcp-use/mcp-use-ts/tree/main/packages/mcp-use) | Core MCP framework | [![npm](https://img.shields.io/npm/v/mcp-use.svg)](https://www.npmjs.com/package/mcp-use) |
31
+ | [@mcp-use/inspector](https://github.com/mcp-use/mcp-use-ts/tree/main/packages/inspector) | Web-based MCP inspector | [![npm](https://img.shields.io/npm/v/@mcp-use/inspector.svg)](https://www.npmjs.com/package/@mcp-use/inspector) |
32
+ | [create-mcp-use-app](https://github.com/mcp-use/mcp-use-ts/tree/main/packages/create-mcp-use-app) | Create MCP apps | [![npm](https://img.shields.io/npm/v/create-mcp-use-app.svg)](https://www.npmjs.com/package/create-mcp-use-app) |
33
+
34
+ ---
35
+
36
+ ## ✨ Key Features
37
+
38
+ | Feature | Description |
39
+ |---------|-------------|
40
+ | **🚀 Auto Inspector** | Automatically opens the MCP Inspector in your browser when development server starts |
41
+ | **♻️ Hot Reload** | Development mode with automatic reloading for both server code and UI widgets |
42
+ | **🎨 Widget Builder** | Compiles React components into standalone HTML pages with all dependencies bundled |
43
+ | **📦 Production Ready** | Optimized production builds with hashed assets for caching |
44
+ | **🛠️ TypeScript First** | Full TypeScript support with watch mode compilation |
45
+ | **🖥️ Multi-Environment** | Separate commands for development, build, and production deployment |
46
+
47
+ ---
48
+
49
+ ## 🚀 Installation
6
50
 
7
51
  ```bash
52
+ # Install globally
8
53
  npm install -g @mcp-use/cli
9
- # or
10
- yarn global add @mcp-use/cli
11
- # or
12
- pnpm add -g @mcp-use/cli
54
+
55
+ # Or use with npx (no installation needed)
56
+ npx @mcp-use/cli dev
57
+
58
+ # Install as a project dependency
59
+ npm install --save-dev @mcp-use/cli
13
60
  ```
14
61
 
15
- ## Usage
62
+ ---
63
+
64
+ ## 📖 Usage
16
65
 
17
66
  ### Development Mode
18
67
 
68
+ Start a development server with hot reload, automatic TypeScript compilation, and auto-opening inspector:
69
+
19
70
  ```bash
20
71
  mcp-use dev [options]
21
72
  ```
22
73
 
23
- Runs development server with:
24
- - TypeScript compilation in watch mode
25
- - Widget build in watch mode
26
- - Server with auto-reload (via tsx)
27
- - **Auto-opens inspector in browser** when ready
74
+ **What happens in dev mode:**
75
+ 1. TypeScript files are compiled in watch mode
76
+ 2. UI widgets are built with hot reload
77
+ 3. Server runs with auto-restart on changes (via tsx)
78
+ 4. Inspector automatically opens in your browser at `http://localhost:3000/inspector`
79
+ 5. MCP endpoint is available at `http://localhost:3000/mcp`
28
80
 
29
- Options:
81
+ **Options:**
30
82
  - `-p, --path <path>` - Project directory (default: current directory)
31
83
  - `--port <port>` - Server port (default: 3000)
32
- - `--no-open` - Don't auto-open inspector
84
+ - `--no-open` - Don't auto-open inspector in browser
33
85
 
34
86
  ### Production Build
35
87
 
88
+ Build your MCP application for production deployment:
89
+
36
90
  ```bash
37
91
  mcp-use build [options]
38
92
  ```
39
93
 
40
- Builds TypeScript and bundles all `.tsx` files from `resources/` into standalone HTML pages.
94
+ **What happens during build:**
95
+ 1. TypeScript is compiled to JavaScript
96
+ 2. All `.tsx` files in `resources/` are bundled as standalone HTML pages
97
+ 3. Assets are hashed for optimal caching
98
+ 4. Output is optimized and minified
41
99
 
42
- Options:
100
+ **Options:**
43
101
  - `-p, --path <path>` - Project directory (default: current directory)
44
102
 
45
- Each widget gets:
46
- - Hashed bundle for caching
47
- - Standalone HTML file
48
- - All dependencies bundled
103
+ ### Production Server
49
104
 
50
- ### Production Start
105
+ Start the production server from built files:
51
106
 
52
107
  ```bash
53
108
  mcp-use start [options]
54
109
  ```
55
110
 
56
- Starts the production server from built files.
57
-
58
- Options:
111
+ **Options:**
59
112
  - `-p, --path <path>` - Project directory (default: current directory)
60
113
  - `--port <port>` - Server port (default: 3000)
61
114
 
62
- ## Examples
115
+ ---
116
+
117
+ ## 💡 Examples
118
+
119
+ ### Basic Development Workflow
63
120
 
64
121
  ```bash
122
+ # Create a new MCP app (using create-mcp-use-app)
123
+ npx create-mcp-use-app my-mcp-server
124
+
125
+ # Navigate to project
126
+ cd my-mcp-server
127
+
65
128
  # Start development with auto-reload and inspector
66
129
  mcp-use dev
67
130
 
68
- # Development on custom port
69
- mcp-use dev --port 8080
131
+ # Browser automatically opens to http://localhost:3000/inspector
132
+ ```
70
133
 
71
- # Development without auto-opening inspector
72
- mcp-use dev --no-open
134
+ ### Custom Port Configuration
135
+
136
+ ```bash
137
+ # Development on port 8080
138
+ mcp-use dev --port 8080
73
139
 
74
- # Build for production
140
+ # Production on port 8080
75
141
  mcp-use build
142
+ mcp-use start --port 8080
143
+ ```
76
144
 
77
- # Start production server
78
- mcp-use start
145
+ ### Working with Different Project Structures
79
146
 
80
- # All commands support custom project path
147
+ ```bash
148
+ # Specify custom project path
81
149
  mcp-use dev -p ./my-app
82
150
  mcp-use build -p ./my-app
83
151
  mcp-use start -p ./my-app
152
+
153
+ # Development without auto-opening browser
154
+ mcp-use dev --no-open
155
+ ```
156
+
157
+ ### CI/CD Pipeline Example
158
+
159
+ ```bash
160
+ # In your CI/CD pipeline
161
+ npm install
162
+ npm run build # Uses mcp-use build
163
+ npm run start # Uses mcp-use start
164
+
165
+ # Or with PM2 for production
166
+ npm run build
167
+ pm2 start "mcp-use start" --name my-mcp-server
84
168
  ```
85
169
 
86
- ## Project Structure
170
+ ---
171
+
172
+ ## 📁 Project Structure
173
+
174
+ The CLI expects the following project structure:
87
175
 
88
176
  ```
89
- my-app/
90
- ├── resources/
91
- ├── todo-list.tsx
92
- │ └── kanban-board.tsx
93
- └── dist/
177
+ my-mcp-app/
178
+ ├── package.json
179
+ ├── tsconfig.json
180
+ ├── src/
181
+ └── index.ts # Your MCP server entry point
182
+ ├── resources/ # UI widgets (React components)
183
+ │ ├── todo-list.tsx # Becomes /widgets/todo-list/index.html
184
+ │ └── dashboard.tsx # Becomes /widgets/dashboard/index.html
185
+ └── dist/ # Build output
186
+ ├── index.js # Compiled server
94
187
  └── resources/
95
188
  └── mcp-use/
96
189
  └── widgets/
97
190
  ├── todo-list/
98
191
  │ ├── index.html
99
192
  │ └── assets/
100
- └── kanban-board/
193
+ └── index-[hash].js
194
+ └── dashboard/
101
195
  ├── index.html
102
196
  └── assets/
197
+ └── index-[hash].js
103
198
  ```
104
199
 
200
+ ---
201
+
202
+ ## 🎨 Creating UI Widgets
203
+
204
+ UI widgets are React components that get compiled into standalone HTML pages. They can interact with your MCP server tools using the `useMcp` hook:
205
+
206
+ ```tsx
207
+ // resources/task-manager.tsx
208
+ import React, { useState, useEffect } from 'react'
209
+ import { useMcp } from 'mcp-use/react'
210
+
211
+ export default function TaskManager() {
212
+ const { callTool, status, error } = useMcp()
213
+ const [tasks, setTasks] = useState([])
214
+ const [newTask, setNewTask] = useState('')
215
+
216
+ useEffect(() => {
217
+ loadTasks()
218
+ }, [])
219
+
220
+ const loadTasks = async () => {
221
+ const result = await callTool('list_tasks')
222
+ setTasks(result.tasks)
223
+ }
224
+
225
+ const addTask = async () => {
226
+ if (!newTask.trim()) return
227
+
228
+ await callTool('create_task', {
229
+ title: newTask,
230
+ status: 'pending'
231
+ })
232
+
233
+ setNewTask('')
234
+ await loadTasks()
235
+ }
236
+
237
+ if (status === 'connecting') return <div>Connecting...</div>
238
+ if (error) return <div>Error: {error.message}</div>
239
+
240
+ return (
241
+ <div className="p-4">
242
+ <h1 className="text-2xl font-bold mb-4">Task Manager</h1>
243
+
244
+ <div className="flex gap-2 mb-4">
245
+ <input
246
+ type="text"
247
+ value={newTask}
248
+ onChange={(e) => setNewTask(e.target.value)}
249
+ placeholder="Add a new task..."
250
+ className="flex-1 p-2 border rounded"
251
+ />
252
+ <button
253
+ onClick={addTask}
254
+ className="px-4 py-2 bg-blue-500 text-white rounded"
255
+ >
256
+ Add Task
257
+ </button>
258
+ </div>
259
+
260
+ <ul className="space-y-2">
261
+ {tasks.map(task => (
262
+ <li key={task.id} className="p-2 border rounded">
263
+ {task.title}
264
+ </li>
265
+ ))}
266
+ </ul>
267
+ </div>
268
+ )
269
+ }
270
+ ```
271
+
272
+ This widget will be available at `http://localhost:3000/widgets/task-manager` after building.
273
+
274
+ ---
275
+
276
+ ## 🔧 Configuration
277
+
278
+ ### TypeScript Configuration
279
+
280
+ Ensure your `tsconfig.json` includes:
281
+
282
+ ```json
283
+ {
284
+ "compilerOptions": {
285
+ "target": "ES2020",
286
+ "module": "ESNext",
287
+ "jsx": "react-jsx",
288
+ "esModuleInterop": true,
289
+ "skipLibCheck": true,
290
+ "strict": true,
291
+ "outDir": "./dist",
292
+ "rootDir": "./src"
293
+ },
294
+ "include": ["src/**/*", "resources/**/*"]
295
+ }
296
+ ```
297
+
298
+ ### Package.json Scripts
299
+
300
+ Add these scripts for convenience:
301
+
302
+ ```json
303
+ {
304
+ "scripts": {
305
+ "dev": "mcp-use dev",
306
+ "build": "mcp-use build",
307
+ "start": "mcp-use start",
308
+ "serve": "npm run build && npm run start"
309
+ }
310
+ }
311
+ ```
312
+
313
+ ---
314
+
315
+ ## 🚀 Advanced Usage
316
+
317
+ ### Environment Variables
318
+
319
+ ```bash
320
+ # Custom port via environment variable
321
+ PORT=8080 mcp-use dev
322
+
323
+ # Production build with custom output
324
+ BUILD_DIR=./build mcp-use build
325
+ ```
326
+
327
+ ### Docker Deployment
328
+
329
+ ```dockerfile
330
+ # Dockerfile
331
+ FROM node:20-alpine
332
+ WORKDIR /app
333
+ COPY package*.json ./
334
+ RUN npm ci --production
335
+ COPY . .
336
+ RUN npm run build
337
+ EXPOSE 3000
338
+ CMD ["npm", "start"]
339
+ ```
340
+
341
+ ### Integration with Existing Express Apps
342
+
343
+ If you have an existing Express app, you can mount the built widgets:
344
+
345
+ ```ts
346
+ import express from 'express'
347
+ import path from 'path'
348
+
349
+ const app = express()
350
+
351
+ // Serve MCP widgets
352
+ app.use('/widgets', express.static(
353
+ path.join(__dirname, '../dist/resources/mcp-use/widgets')
354
+ ))
355
+
356
+ // Your other routes...
357
+ ```
358
+
359
+ ---
360
+
361
+ ## 🐛 Troubleshooting
362
+
363
+ ### Common Issues
364
+
365
+ **Port already in use:**
366
+ ```bash
367
+ # Use a different port
368
+ mcp-use dev --port 3001
369
+ ```
370
+
371
+ **TypeScript compilation errors:**
372
+ ```bash
373
+ # Check your tsconfig.json
374
+ # Ensure all dependencies are installed
375
+ npm install
376
+ ```
377
+
378
+ **Widgets not loading:**
379
+ - Ensure `.tsx` files are in the `resources/` directory
380
+ - Check that React dependencies are installed
381
+ - Verify the build output in `dist/resources/mcp-use/widgets/`
382
+
383
+ **Inspector not opening:**
384
+ ```bash
385
+ # Manually open http://localhost:3000/inspector
386
+ # Or disable auto-open
387
+ mcp-use dev --no-open
388
+ ```
389
+
390
+ ---
391
+
392
+ ## 📚 Learn More
393
+
394
+ - [MCP-Use Documentation](https://github.com/mcp-use/mcp-use-ts)
395
+ - [Model Context Protocol](https://modelcontextprotocol.io)
396
+ - [Creating MCP Servers](https://github.com/mcp-use/mcp-use-ts/tree/main/packages/mcp-use#-mcp-server-framework)
397
+ - [MCP Inspector Guide](https://github.com/mcp-use/mcp-use-ts/tree/main/packages/inspector)
398
+
399
+ ---
400
+
401
+ ## 📜 License
402
+
403
+ MIT © [MCP-Use](https://github.com/mcp-use)
package/dist/index.js CHANGED
@@ -155,8 +155,8 @@ async function buildWidgets(projectPath, watch = false) {
155
155
  },
156
156
  plugins: [{
157
157
  name: "html-writer",
158
- setup(build2) {
159
- build2.onEnd(async () => {
158
+ setup(buildPlugin) {
159
+ buildPlugin.onEnd(async () => {
160
160
  try {
161
161
  const files = await import_node_fs.promises.readdir(import_node_path.default.join(pageOutDir, "assets"));
162
162
  const mainJs = files.find((f) => f.startsWith(`${baseName}-`) && f.endsWith(".js"));
@@ -195,13 +195,17 @@ async function buildWidgets(projectPath, watch = false) {
195
195
  // src/index.ts
196
196
  var import_node_child_process = require("child_process");
197
197
  var import_node_fs2 = require("fs");
198
+ var import_promises = require("fs/promises");
198
199
  var import_node_path2 = __toESM(require("path"));
199
200
  var import_open = __toESM(require("open"));
200
201
  var program = new import_commander.Command();
201
- program.name("mcp-use").description("MCP CLI tool").version("2.0.1");
202
+ var packageContent = (0, import_node_fs2.readFileSync)(import_node_path2.default.join(__dirname, "../package.json"), "utf-8");
203
+ var packageJson = JSON.parse(packageContent);
204
+ var packageVersion = packageJson.version || "unknown";
205
+ program.name("mcp-use").description("MCP CLI tool").version(packageVersion);
202
206
  async function isPortAvailable(port) {
203
207
  try {
204
- const response = await fetch(`http://localhost:${port}`);
208
+ await fetch(`http://localhost:${port}`);
205
209
  return false;
206
210
  } catch {
207
211
  return true;
@@ -248,7 +252,8 @@ function runCommand(command, args, cwd) {
248
252
  program.command("build").description("Build TypeScript and MCP UI widgets").option("-p, --path <path>", "Path to project directory", process.cwd()).action(async (options) => {
249
253
  try {
250
254
  const projectPath = import_node_path2.default.resolve(options.path);
251
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
255
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
256
+ `);
252
257
  console.log("Building TypeScript...");
253
258
  await runCommand("npx", ["tsc"], projectPath);
254
259
  console.log("\x1B[32m\u2713\x1B[0m TypeScript build complete!");
@@ -262,18 +267,19 @@ program.command("dev").description("Run development server with auto-reload and
262
267
  try {
263
268
  const projectPath = import_node_path2.default.resolve(options.path);
264
269
  let port = parseInt(options.port, 10);
265
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
270
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
271
+ `);
266
272
  if (!await isPortAvailable(port)) {
267
273
  console.log(`\x1B[33m\u26A0\uFE0F Port ${port} is already in use\x1B[0m`);
268
274
  const availablePort = await findAvailablePort(port);
269
275
  console.log(`\x1B[32m\u2713\x1B[0m Using port ${availablePort} instead`);
270
276
  port = availablePort;
271
277
  }
272
- let serverFile = "src/server.ts";
278
+ let serverFile = "index.ts";
273
279
  try {
274
- await import_node_fs2.promises.access(import_node_path2.default.join(projectPath, serverFile));
280
+ await (0, import_promises.access)(import_node_path2.default.join(projectPath, serverFile));
275
281
  } catch {
276
- serverFile = "src/index.ts";
282
+ serverFile = "src/server.ts";
277
283
  }
278
284
  const processes = [];
279
285
  const tscProc = (0, import_node_child_process.spawn)("npx", ["tsc", "--watch"], {
@@ -294,21 +300,10 @@ program.command("dev").description("Run development server with auto-reload and
294
300
  await new Promise((resolve) => setTimeout(resolve, 2e3));
295
301
  const serverProc = (0, import_node_child_process.spawn)("npx", ["tsx", "watch", serverFile], {
296
302
  cwd: projectPath,
297
- stdio: "pipe",
303
+ stdio: "inherit",
298
304
  shell: false,
299
305
  env: { ...process.env, PORT: String(port) }
300
306
  });
301
- serverProc.stderr?.on("data", (data) => {
302
- const output = data.toString();
303
- if (output.includes("EADDRINUSE")) {
304
- console.log(`\x1B[31m\u2717\x1B[0m Port ${port} is still in use. Please try a different port with --port`);
305
- console.log(`\x1B[90mHint: Use --port 3001 or kill the process using port ${port}\x1B[0m`);
306
- process.exit(1);
307
- }
308
- });
309
- serverProc.stdout?.on("data", (data) => {
310
- process.stdout.write(data);
311
- });
312
307
  processes.push(serverProc);
313
308
  if (options.open !== false) {
314
309
  const startTime = Date.now();
@@ -345,12 +340,13 @@ program.command("start").description("Start production server").option("-p, --pa
345
340
  try {
346
341
  const projectPath = import_node_path2.default.resolve(options.path);
347
342
  const port = parseInt(options.port, 10);
348
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
349
- let serverFile = "dist/server.js";
343
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
344
+ `);
345
+ let serverFile = "dist/index.js";
350
346
  try {
351
- await import_node_fs2.promises.access(import_node_path2.default.join(projectPath, serverFile));
347
+ await (0, import_promises.access)(import_node_path2.default.join(projectPath, serverFile));
352
348
  } catch {
353
- serverFile = "dist/index.js";
349
+ serverFile = "dist/server.js";
354
350
  }
355
351
  console.log("Starting production server...");
356
352
  const serverProc = (0, import_node_child_process.spawn)("node", [serverFile], {
package/dist/index.mjs CHANGED
@@ -132,8 +132,8 @@ async function buildWidgets(projectPath, watch = false) {
132
132
  },
133
133
  plugins: [{
134
134
  name: "html-writer",
135
- setup(build2) {
136
- build2.onEnd(async () => {
135
+ setup(buildPlugin) {
136
+ buildPlugin.onEnd(async () => {
137
137
  try {
138
138
  const files = await fs.readdir(path.join(pageOutDir, "assets"));
139
139
  const mainJs = files.find((f) => f.startsWith(`${baseName}-`) && f.endsWith(".js"));
@@ -171,14 +171,18 @@ async function buildWidgets(projectPath, watch = false) {
171
171
 
172
172
  // src/index.ts
173
173
  import { spawn } from "child_process";
174
- import { promises as fs2 } from "fs";
174
+ import { readFileSync } from "fs";
175
+ import { access } from "fs/promises";
175
176
  import path2 from "path";
176
177
  import open from "open";
177
178
  var program = new Command();
178
- program.name("mcp-use").description("MCP CLI tool").version("2.0.1");
179
+ var packageContent = readFileSync(path2.join(__dirname, "../package.json"), "utf-8");
180
+ var packageJson = JSON.parse(packageContent);
181
+ var packageVersion = packageJson.version || "unknown";
182
+ program.name("mcp-use").description("MCP CLI tool").version(packageVersion);
179
183
  async function isPortAvailable(port) {
180
184
  try {
181
- const response = await fetch(`http://localhost:${port}`);
185
+ await fetch(`http://localhost:${port}`);
182
186
  return false;
183
187
  } catch {
184
188
  return true;
@@ -225,7 +229,8 @@ function runCommand(command, args, cwd) {
225
229
  program.command("build").description("Build TypeScript and MCP UI widgets").option("-p, --path <path>", "Path to project directory", process.cwd()).action(async (options) => {
226
230
  try {
227
231
  const projectPath = path2.resolve(options.path);
228
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
232
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
233
+ `);
229
234
  console.log("Building TypeScript...");
230
235
  await runCommand("npx", ["tsc"], projectPath);
231
236
  console.log("\x1B[32m\u2713\x1B[0m TypeScript build complete!");
@@ -239,18 +244,19 @@ program.command("dev").description("Run development server with auto-reload and
239
244
  try {
240
245
  const projectPath = path2.resolve(options.path);
241
246
  let port = parseInt(options.port, 10);
242
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
247
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
248
+ `);
243
249
  if (!await isPortAvailable(port)) {
244
250
  console.log(`\x1B[33m\u26A0\uFE0F Port ${port} is already in use\x1B[0m`);
245
251
  const availablePort = await findAvailablePort(port);
246
252
  console.log(`\x1B[32m\u2713\x1B[0m Using port ${availablePort} instead`);
247
253
  port = availablePort;
248
254
  }
249
- let serverFile = "src/server.ts";
255
+ let serverFile = "index.ts";
250
256
  try {
251
- await fs2.access(path2.join(projectPath, serverFile));
257
+ await access(path2.join(projectPath, serverFile));
252
258
  } catch {
253
- serverFile = "src/index.ts";
259
+ serverFile = "src/server.ts";
254
260
  }
255
261
  const processes = [];
256
262
  const tscProc = spawn("npx", ["tsc", "--watch"], {
@@ -271,21 +277,10 @@ program.command("dev").description("Run development server with auto-reload and
271
277
  await new Promise((resolve) => setTimeout(resolve, 2e3));
272
278
  const serverProc = spawn("npx", ["tsx", "watch", serverFile], {
273
279
  cwd: projectPath,
274
- stdio: "pipe",
280
+ stdio: "inherit",
275
281
  shell: false,
276
282
  env: { ...process.env, PORT: String(port) }
277
283
  });
278
- serverProc.stderr?.on("data", (data) => {
279
- const output = data.toString();
280
- if (output.includes("EADDRINUSE")) {
281
- console.log(`\x1B[31m\u2717\x1B[0m Port ${port} is still in use. Please try a different port with --port`);
282
- console.log(`\x1B[90mHint: Use --port 3001 or kill the process using port ${port}\x1B[0m`);
283
- process.exit(1);
284
- }
285
- });
286
- serverProc.stdout?.on("data", (data) => {
287
- process.stdout.write(data);
288
- });
289
284
  processes.push(serverProc);
290
285
  if (options.open !== false) {
291
286
  const startTime = Date.now();
@@ -322,12 +317,13 @@ program.command("start").description("Start production server").option("-p, --pa
322
317
  try {
323
318
  const projectPath = path2.resolve(options.path);
324
319
  const port = parseInt(options.port, 10);
325
- console.log("\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: 2.0.1\x1B[0m\n");
326
- let serverFile = "dist/server.js";
320
+ console.log(`\x1B[36m\x1B[1mmcp-use\x1B[0m \x1B[90mVersion: ${packageJson.version}\x1B[0m
321
+ `);
322
+ let serverFile = "dist/index.js";
327
323
  try {
328
- await fs2.access(path2.join(projectPath, serverFile));
324
+ await access(path2.join(projectPath, serverFile));
329
325
  } catch {
330
- serverFile = "dist/index.js";
326
+ serverFile = "dist/server.js";
331
327
  }
332
328
  console.log("Starting production server...");
333
329
  const serverProc = spawn("node", [serverFile], {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-use/cli",
3
- "version": "2.1.3",
3
+ "version": "2.1.6",
4
4
  "description": "Build tool for MCP UI widgets - bundles React components into standalone HTML pages for Model Context Protocol servers",
5
5
  "author": "mcp-use, Inc.",
6
6
  "license": "MIT",
@@ -31,26 +31,24 @@
31
31
  "files": [
32
32
  "dist"
33
33
  ],
34
- "scripts": {
35
- "build": "tsup src/index.ts --format cjs,esm && tsc --emitDeclarationOnly --declaration",
36
- "dev": "tsc --watch",
37
- "test": "vitest"
38
- },
39
34
  "dependencies": {
40
- "mcp-use": "^0.3.0",
41
- "@mcp-use/inspector": "^0.3.2",
42
35
  "commander": "^11.0.0",
43
36
  "esbuild": "^0.19.0",
44
37
  "globby": "^14.0.0",
45
38
  "open": "^10.0.0",
46
- "tsx": "^4.0.0"
39
+ "tsx": "^4.0.0",
40
+ "mcp-use": "1.0.2",
41
+ "@mcp-use/inspector": "0.3.6"
47
42
  },
48
43
  "devDependencies": {
49
44
  "@types/node": "^20.0.0",
50
- "typescript": "^5.0.0",
51
- "vitest": "^1.0.0"
45
+ "typescript": "^5.0.0"
52
46
  },
53
47
  "publishConfig": {
54
48
  "access": "public"
49
+ },
50
+ "scripts": {
51
+ "build": "tsup src/index.ts --format cjs,esm && tsc --emitDeclarationOnly --declaration",
52
+ "dev": "tsc --watch"
55
53
  }
56
- }
54
+ }
package/dist/build.js DELETED
@@ -1,173 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.buildWidgets = buildWidgets;
7
- const node_fs_1 = require("node:fs");
8
- const node_path_1 = __importDefault(require("node:path"));
9
- const esbuild_1 = require("esbuild");
10
- const globby_1 = require("globby");
11
- const ROUTE_PREFIX = '/mcp-use/widgets';
12
- const SRC_DIR = 'resources';
13
- const OUT_DIR = 'dist/resources';
14
- function toRoute(file) {
15
- const rel = file.replace(new RegExp(`^${SRC_DIR}/`), '').replace(/\.tsx?$/, '');
16
- return `${ROUTE_PREFIX}/${rel}`;
17
- }
18
- function outDirForRoute(route) {
19
- return node_path_1.default.join(OUT_DIR, route.replace(/^\//, ''));
20
- }
21
- function htmlTemplate({ title, scriptPath }) {
22
- return `<!doctype html>
23
- <html lang="en">
24
- <head>
25
- <meta charset="UTF-8" />
26
- <meta name="viewport" content="width=device-width,initial-scale=1" />
27
- <title>${title} Widget</title>
28
- <style>
29
- body {
30
- margin: 0;
31
- padding: 20px;
32
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
33
- background: #f5f5f5;
34
- }
35
- #widget-root {
36
- max-width: 1200px;
37
- margin: 0 auto;
38
- }
39
- </style>
40
- </head>
41
- <body>
42
- <div id="widget-root"></div>
43
- <script type="module" src="${scriptPath}"></script>
44
- </body>
45
- </html>`;
46
- }
47
- async function buildWidget(entry, projectPath, minify = true) {
48
- const relativePath = node_path_1.default.relative(projectPath, entry);
49
- const route = toRoute(relativePath);
50
- const pageOutDir = node_path_1.default.join(projectPath, outDirForRoute(route));
51
- const baseName = node_path_1.default.parse(entry).name;
52
- // Build JS/CSS chunks for this page
53
- await (0, esbuild_1.build)({
54
- entryPoints: [entry],
55
- bundle: true,
56
- splitting: true,
57
- format: 'esm',
58
- platform: 'browser',
59
- target: 'es2018',
60
- sourcemap: !minify,
61
- minify,
62
- outdir: node_path_1.default.join(pageOutDir, 'assets'),
63
- logLevel: 'silent',
64
- loader: {
65
- '.svg': 'file',
66
- '.png': 'file',
67
- '.jpg': 'file',
68
- '.jpeg': 'file',
69
- '.gif': 'file',
70
- '.css': 'css',
71
- },
72
- entryNames: `[name]-[hash]`,
73
- chunkNames: `chunk-[hash]`,
74
- assetNames: `asset-[hash]`,
75
- define: {
76
- 'process.env.NODE_ENV': minify ? '"production"' : '"development"',
77
- },
78
- });
79
- // Find the main entry file name
80
- const files = await node_fs_1.promises.readdir(node_path_1.default.join(pageOutDir, 'assets'));
81
- const mainJs = files.find(f => f.startsWith(`${baseName}-`) && f.endsWith('.js'));
82
- if (!mainJs)
83
- throw new Error(`Failed to locate entry JS for ${entry}`);
84
- // Write an index.html that points to the entry
85
- await node_fs_1.promises.mkdir(pageOutDir, { recursive: true });
86
- await node_fs_1.promises.writeFile(node_path_1.default.join(pageOutDir, 'index.html'), htmlTemplate({
87
- title: baseName,
88
- scriptPath: `./assets/${mainJs}`,
89
- }), 'utf8');
90
- return { baseName, route };
91
- }
92
- async function buildWidgets(projectPath, watch = false) {
93
- const srcDir = node_path_1.default.join(projectPath, SRC_DIR);
94
- const outDir = node_path_1.default.join(projectPath, OUT_DIR);
95
- // Clean dist
96
- await node_fs_1.promises.rm(outDir, { recursive: true, force: true });
97
- // Find all TSX entries
98
- const entries = await (0, globby_1.globby)([`${srcDir}/**/*.tsx`]);
99
- if (!watch) {
100
- console.log(`Building ${entries.length} widget files...`);
101
- }
102
- if (watch) {
103
- // Watch mode - create contexts for each entry but don't log individual watching messages
104
- const contexts = [];
105
- for (const entry of entries) {
106
- const relativePath = node_path_1.default.relative(projectPath, entry);
107
- const route = toRoute(relativePath);
108
- const pageOutDir = node_path_1.default.join(projectPath, outDirForRoute(route));
109
- const baseName = node_path_1.default.parse(entry).name;
110
- const ctx = await (0, esbuild_1.context)({
111
- entryPoints: [entry],
112
- bundle: true,
113
- splitting: true,
114
- format: 'esm',
115
- platform: 'browser',
116
- target: 'es2018',
117
- sourcemap: true,
118
- minify: false,
119
- outdir: node_path_1.default.join(pageOutDir, 'assets'),
120
- logLevel: 'silent',
121
- loader: {
122
- '.svg': 'file',
123
- '.png': 'file',
124
- '.jpg': 'file',
125
- '.jpeg': 'file',
126
- '.gif': 'file',
127
- '.css': 'css',
128
- },
129
- entryNames: `[name]-[hash]`,
130
- chunkNames: `chunk-[hash]`,
131
- assetNames: `asset-[hash]`,
132
- define: {
133
- 'process.env.NODE_ENV': '"development"',
134
- },
135
- plugins: [{
136
- name: 'html-writer',
137
- setup(build) {
138
- build.onEnd(async () => {
139
- try {
140
- const files = await node_fs_1.promises.readdir(node_path_1.default.join(pageOutDir, 'assets'));
141
- const mainJs = files.find(f => f.startsWith(`${baseName}-`) && f.endsWith('.js'));
142
- if (mainJs) {
143
- await node_fs_1.promises.mkdir(pageOutDir, { recursive: true });
144
- await node_fs_1.promises.writeFile(node_path_1.default.join(pageOutDir, 'index.html'), htmlTemplate({
145
- title: baseName,
146
- scriptPath: `./assets/${mainJs}`,
147
- }), 'utf8');
148
- }
149
- }
150
- catch (err) {
151
- console.error(`Error writing HTML for ${baseName}:`, err);
152
- }
153
- });
154
- },
155
- }],
156
- });
157
- contexts.push(ctx);
158
- }
159
- // Start watching all contexts
160
- for (const ctx of contexts) {
161
- await ctx.watch();
162
- }
163
- }
164
- else {
165
- // Build once
166
- for (const entry of entries) {
167
- const { baseName, route } = await buildWidget(entry, projectPath);
168
- console.log(`\x1b[32m✓\x1b[0m Built ${baseName} -> ${route}`);
169
- }
170
- console.log('Build complete!');
171
- }
172
- }
173
- //# sourceMappingURL=build.js.map
package/dist/build.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}