@@ -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 ( / " m c p - u s e " : " \^ [ ^ " ] + " / , '"mcp-use": "workspace:*"' )
85+ processedContent = processedContent . replace ( / " @ m c p - u s e \/ c l i " : " \^ [ ^ " ] + " / , '"@mcp-use/cli": "workspace:*"' )
86+ processedContent = processedContent . replace ( / " @ m c p - u s e \/ i n s p e c t o r " : " \^ [ ^ " ] + " / , '"@mcp-use/inspector": "workspace:*"' )
87+ } else {
88+ // Replace workspace dependencies with specific versions for production
89+ processedContent = processedContent . replace ( / " m c p - u s e " : " w o r k s p a c e : \* " / , `"mcp-use": "^${ versions [ 'mcp-use' ] || '1.0.0' } "` )
90+ processedContent = processedContent . replace ( / " @ m c p - u s e \/ c l i " : " w o r k s p a c e : \* " / , `"@mcp-use/cli": "^${ versions [ '@mcp-use/cli' ] || '2.0.0' } "` )
91+ processedContent = processedContent . replace ( / " @ m c p - u s e \/ i n s p e c t o r " : " w o r k s p a c e : \* " / , `"@mcp-use/inspector": "^${ versions [ '@mcp-use/inspector' ] || '0.3.0' } "` )
92+ }
93+
94+ return processedContent
95+ }
96+
1997program
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+
146242function 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
156252function promptForProjectName ( ) : Promise < string | null > {
0 commit comments