Skip to content
This repository was archived by the owner on May 21, 2026. It is now read-only.

Commit cca5f43

Browse files
committed
chore: update dependencies and improve CLI functionality
- Update `@mcp-ui/server` patch hash in `pnpm-lock.yaml`. - Add new dependencies for `@langchain` packages in `pnpm-lock.yaml`. - Restore `express` version in `pnpm-lock.yaml`. - Enhance CLI to dynamically read package version from `package.json`. - Implement workspace dependency handling in `create-mcp-use-app`. - Add a new standalone example for the MCP server. - Refactor favicon proxy and middleware for improved functionality. - Introduce shared utilities for favicon fetching and caching. - Update inspector package to support new features and improve error handling.
1 parent 424e2e7 commit cca5f43

19 files changed

Lines changed: 1860 additions & 642 deletions

File tree

packages/cli/src/index.ts

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,44 @@
22
import { Command } from 'commander';
33
import { buildWidgets } from './build';
44
import { spawn } from 'node:child_process';
5-
import { promises as fs } from 'node:fs';
5+
import { existsSync, readFileSync } from 'node:fs';
6+
import { access } from 'node:fs/promises';
67
import path from 'node:path';
78
import open from 'open';
8-
99
const program = new Command();
1010

11+
12+
// Find the CLI package.json file
13+
function findPackageJson() {
14+
const possiblePaths = [
15+
path.join(__dirname, '../package.json'), // From dist/
16+
path.join(__dirname, '../../package.json'), // From dist/
17+
path.join(process.cwd(), 'package.json'), // Current working directory
18+
]
19+
20+
for (const packagePath of possiblePaths) {
21+
if (existsSync(packagePath)) {
22+
return packagePath
23+
}
24+
}
25+
26+
throw new Error('Could not find package.json file')
27+
}
28+
29+
const packageContent = readFileSync(findPackageJson(), 'utf-8')
30+
const packageJson = JSON.parse(packageContent)
31+
const packageVersion = packageJson.version || 'unknown'
32+
33+
1134
program
1235
.name('mcp-use')
1336
.description('MCP CLI tool')
14-
.version('2.0.1');
37+
.version(packageVersion);
1538

1639
// Helper to check if port is available
1740
async function isPortAvailable(port: number): Promise<boolean> {
1841
try {
19-
const response = await fetch(`http://localhost:${port}`);
42+
await fetch(`http://localhost:${port}`);
2043
return false; // Port is in use
2144
} catch {
2245
return true; // Port is available
@@ -77,7 +100,7 @@ program
77100
try {
78101
const projectPath = path.resolve(options.path);
79102

80-
console.log('\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: 2.0.1\x1b[0m\n');
103+
console.log(`\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: ${packageJson.version}\x1b[0m\n`);
81104

82105
// Run tsc first
83106
console.log('Building TypeScript...');
@@ -103,7 +126,7 @@ program
103126
const projectPath = path.resolve(options.path);
104127
let port = parseInt(options.port, 10);
105128

106-
console.log('\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: 2.0.1\x1b[0m\n');
129+
console.log(`\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: ${packageJson.version}\x1b[0m\n`);
107130

108131
// Check if port is available, find alternative if needed
109132
if (!(await isPortAvailable(port))) {
@@ -116,7 +139,7 @@ program
116139
// Find the main source file
117140
let serverFile = 'src/server.ts';
118141
try {
119-
await fs.access(path.join(projectPath, serverFile));
142+
await access(path.join(projectPath, serverFile));
120143
} catch {
121144
serverFile = 'src/index.ts';
122145
}
@@ -215,12 +238,12 @@ program
215238
const projectPath = path.resolve(options.path);
216239
const port = parseInt(options.port, 10);
217240

218-
console.log('\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: 2.0.1\x1b[0m\n');
241+
console.log(`\x1b[36m\x1b[1mmcp-use\x1b[0m \x1b[90mVersion: ${packageJson.version}\x1b[0m\n`);
219242

220243
// Find the built server file
221244
let serverFile = 'dist/server.js';
222245
try {
223-
await fs.access(path.join(projectPath, serverFile));
246+
await access(path.join(projectPath, serverFile));
224247
} catch {
225248
serverFile = 'dist/index.js';
226249
}

packages/create-mcp-use-app/src/index.ts

Lines changed: 107 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,93 @@ const packageJson = JSON.parse(
1616
readFileSync(join(__dirname, '../package.json'), 'utf-8')
1717
)
1818

19+
// Read current package versions from workspace
20+
function getCurrentPackageVersions() {
21+
const versions: Record<string, string> = {}
22+
23+
try {
24+
// Try multiple possible workspace root locations
25+
const possibleRoots = [
26+
resolve(__dirname, '../../../..'), // From dist/templates
27+
resolve(__dirname, '../../../../..'), // From dist
28+
resolve(process.cwd(), '.'), // Current working directory
29+
resolve(process.cwd(), '..'), // Parent of current directory
30+
]
31+
32+
let workspaceRoot = null
33+
for (const root of possibleRoots) {
34+
if (existsSync(join(root, 'packages/mcp-use/package.json'))) {
35+
workspaceRoot = root
36+
break
37+
}
38+
}
39+
40+
if (!workspaceRoot) {
41+
throw new Error('Workspace root not found')
42+
}
43+
44+
// Read mcp-use version
45+
const mcpUsePackage = JSON.parse(
46+
readFileSync(join(workspaceRoot, 'packages/mcp-use/package.json'), 'utf-8')
47+
)
48+
versions['mcp-use'] = mcpUsePackage.version
49+
50+
// Read cli version
51+
const cliPackage = JSON.parse(
52+
readFileSync(join(workspaceRoot, 'packages/cli/package.json'), 'utf-8')
53+
)
54+
versions['@mcp-use/cli'] = cliPackage.version
55+
56+
// Read inspector version
57+
const inspectorPackage = JSON.parse(
58+
readFileSync(join(workspaceRoot, 'packages/inspector/package.json'), 'utf-8')
59+
)
60+
versions['@mcp-use/inspector'] = inspectorPackage.version
61+
} catch (error) {
62+
console.warn('⚠️ Could not read workspace package versions, using defaults')
63+
console.warn(` Error: ${error}`)
64+
}
65+
66+
return versions
67+
}
68+
69+
// Process template files to replace version placeholders
70+
function processTemplateFile(filePath: string, versions: Record<string, string>, isDevelopment: boolean = false) {
71+
const content = readFileSync(filePath, 'utf-8')
72+
let processedContent = content
73+
74+
// Replace version placeholders with current versions
75+
for (const [packageName, version] of Object.entries(versions)) {
76+
const placeholder = `{{${packageName}_version}}`
77+
const versionPrefix = isDevelopment ? 'workspace:*' : `^${version}`
78+
processedContent = processedContent.replace(new RegExp(placeholder, 'g'), versionPrefix)
79+
}
80+
81+
// Handle workspace dependencies based on mode
82+
if (isDevelopment) {
83+
// Keep workspace dependencies for development
84+
processedContent = processedContent.replace(/"mcp-use": "\^[^"]+"/, '"mcp-use": "workspace:*"')
85+
processedContent = processedContent.replace(/"@mcp-use\/cli": "\^[^"]+"/, '"@mcp-use/cli": "workspace:*"')
86+
processedContent = processedContent.replace(/"@mcp-use\/inspector": "\^[^"]+"/, '"@mcp-use/inspector": "workspace:*"')
87+
} else {
88+
// Replace workspace dependencies with specific versions for production
89+
processedContent = processedContent.replace(/"mcp-use": "workspace:\*"/, `"mcp-use": "^${versions['mcp-use'] || '1.0.0'}"`)
90+
processedContent = processedContent.replace(/"@mcp-use\/cli": "workspace:\*"/, `"@mcp-use/cli": "^${versions['@mcp-use/cli'] || '2.0.0'}"`)
91+
processedContent = processedContent.replace(/"@mcp-use\/inspector": "workspace:\*"/, `"@mcp-use/inspector": "^${versions['@mcp-use/inspector'] || '0.3.0'}"`)
92+
}
93+
94+
return processedContent
95+
}
96+
1997
program
2098
.name('create-mcp-use-app')
2199
.description('Create a new MCP server project')
22100
.version(packageJson.version)
23101
.argument('[project-name]', 'Name of the MCP server project')
24102
.option('-t, --template <template>', 'Template to use', 'ui')
25103
.option('--no-install', 'Skip installing dependencies')
26-
.action(async (projectName: string | undefined, options: { template: string, install: boolean }) => {
104+
.option('--dev', 'Use workspace dependencies for development')
105+
.action(async (projectName: string | undefined, options: { template: string, install: boolean, dev: boolean }) => {
27106
try {
28107
// If no project name provided, prompt for it
29108
if (!projectName) {
@@ -53,8 +132,11 @@ program
53132
// Create project directory
54133
mkdirSync(projectPath, { recursive: true })
55134

135+
// Get current package versions
136+
const versions = getCurrentPackageVersions()
137+
56138
// Copy template files
57-
await copyTemplate(projectPath, options.template)
139+
await copyTemplate(projectPath, options.template, versions, options.dev)
58140

59141
// Update package.json with project name
60142
updatePackageJson(projectPath, projectName!)
@@ -77,6 +159,9 @@ program
77159
}
78160

79161
console.log('✅ MCP server created successfully!')
162+
if (options.dev) {
163+
console.log('🔧 Development mode: Using workspace dependencies')
164+
}
80165
console.log('')
81166
console.log('📁 Project structure:')
82167
console.log(` ${projectName}/`)
@@ -105,6 +190,10 @@ program
105190
}
106191
console.log(' npm run dev')
107192
console.log('')
193+
if (options.dev) {
194+
console.log('💡 Development mode: Your project uses workspace dependencies')
195+
console.log(' Make sure you\'re in the mcp-use workspace root for development')
196+
}
108197
console.log('📚 Learn more: https://docs.mcp-use.io')
109198
}
110199
catch (error) {
@@ -113,7 +202,7 @@ program
113202
}
114203
})
115204

116-
async function copyTemplate(projectPath: string, template: string) {
205+
async function copyTemplate(projectPath: string, template: string, versions: Record<string, string>, isDevelopment: boolean = false) {
117206
const templatePath = join(__dirname, 'templates', template)
118207

119208
if (!existsSync(templatePath)) {
@@ -123,10 +212,10 @@ async function copyTemplate(projectPath: string, template: string) {
123212
process.exit(1)
124213
}
125214

126-
copyDirectory(templatePath, projectPath)
215+
copyDirectoryWithProcessing(templatePath, projectPath, versions, isDevelopment)
127216
}
128217

129-
function copyDirectory(src: string, dest: string) {
218+
function copyDirectoryWithProcessing(src: string, dest: string, versions: Record<string, string>, isDevelopment: boolean) {
130219
const entries = readdirSync(src, { withFileTypes: true })
131220

132221
for (const entry of entries) {
@@ -135,22 +224,29 @@ function copyDirectory(src: string, dest: string) {
135224

136225
if (entry.isDirectory()) {
137226
mkdirSync(destPath, { recursive: true })
138-
copyDirectory(srcPath, destPath)
227+
copyDirectoryWithProcessing(srcPath, destPath, versions, isDevelopment)
139228
}
140229
else {
141-
copyFileSync(srcPath, destPath)
230+
// Process files that might contain version placeholders
231+
if (entry.name === 'package.json' || entry.name.endsWith('.json')) {
232+
const processedContent = processTemplateFile(srcPath, versions, isDevelopment)
233+
writeFileSync(destPath, processedContent)
234+
} else {
235+
copyFileSync(srcPath, destPath)
236+
}
142237
}
143238
}
144239
}
145240

241+
146242
function updatePackageJson(projectPath: string, projectName: string) {
147243
const packageJsonPath = join(projectPath, 'package.json')
148-
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))
244+
const packageJsonContent = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))
149245

150-
packageJson.name = projectName
151-
packageJson.description = `MCP server: ${projectName}`
246+
packageJsonContent.name = projectName
247+
packageJsonContent.description = `MCP server: ${projectName}`
152248

153-
writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
249+
writeFileSync(packageJsonPath, JSON.stringify(packageJsonContent, null, 2))
154250
}
155251

156252
function promptForProjectName(): Promise<string | null> {

packages/create-mcp-use-app/src/templates/ui/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
"@mcp-ui/server": "^5.11.0",
2525
"cors": "^2.8.5",
2626
"express": "^4.18.0",
27-
"mcp-use": "^1.0.0"
27+
"mcp-use": "workspace:*"
2828
},
2929
"devDependencies": {
30-
"@mcp-use/cli": "^2.0.2",
30+
"@mcp-use/cli": "workspace:*",
31+
"@mcp-use/inspector": "workspace:*",
3132
"@types/cors": "^2.8.0",
3233
"@types/express": "^4.17.0",
3334
"@types/node": "^20.0.0",

packages/inspector/package.json

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"dev:standalone": "tsx watch src/server/server.ts",
3333
"build": "npm run build:client && npm run build:server && npm run build:cli",
3434
"build:client": "vite build",
35-
"build:server": "tsup src/server/index.ts --format esm && tsc -p tsconfig.server.json --emitDeclarationOnly --declaration",
35+
"build:server": "tsup src/server/*.ts --format esm --out-dir dist/server && tsc -p tsconfig.server.json --emitDeclarationOnly --declaration",
3636
"build:cli": "tsup src/cli/inspect.ts --format cjs --out-dir dist/cli",
3737
"start": "node dist/server/server.js",
3838
"preview": "vite preview",
@@ -47,7 +47,11 @@
4747
"lint:pnpm": "pnpm lint:fix"
4848
},
4949
"peerDependencies": {
50-
"express": "^4.18.0"
50+
"@langchain/anthropic": "^0.3.26",
51+
"@langchain/core": "^0.3.72",
52+
"@langchain/google-genai": "^0.2.18",
53+
"@langchain/openai": "^0.6.9",
54+
"express": "^4.21.2"
5155
},
5256
"dependencies": {
5357
"@hono/node-server": "^1.19.5",
@@ -65,7 +69,6 @@
6569
"class-variance-authority": "^0.7.1",
6670
"clsx": "^2.1.1",
6771
"cmdk": "^1.1.1",
68-
"express": "^4.18.0",
6972
"framer-motion": "^12.23.22",
7073
"hono": "^4.0.0",
7174
"lucide-react": "^0.545.0",
@@ -87,6 +90,10 @@
8790
"devDependencies": {
8891
"@antfu/eslint-config": "^5.4.1",
8992
"@eslint-react/eslint-plugin": "^1.38.4",
93+
"@langchain/anthropic": "^0.3.26",
94+
"@langchain/core": "^0.3.72",
95+
"@langchain/google-genai": "^0.2.18",
96+
"@langchain/openai": "^0.6.9",
9097
"@radix-ui/react-slot": "^1.2.3",
9198
"@types/express": "^4.17.0",
9299
"@types/node": "^24.7.0",
@@ -97,6 +104,7 @@
97104
"eslint": "^9.36.0",
98105
"eslint-plugin-react-hooks": "^5.2.0",
99106
"eslint-plugin-react-refresh": "^0.4.0",
107+
"express": "^4.21.2",
100108
"tailwindcss": "^4.1.14",
101109
"tsx": "^4.6.0",
102110
"tw-animate-css": "^1.4.0",

0 commit comments

Comments
 (0)