diff --git a/package.json b/package.json index cf6de00..9b90221 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@agentailor/create-mcp-server", - "version": "0.4.0", + "version": "0.4.1", "description": "Create a new MCP (Model Context Protocol) server project", "type": "module", "bin": { diff --git a/src/templates/common/package.json.ts b/src/templates/common/package.json.ts index 1185c18..2bfe150 100644 --- a/src/templates/common/package.json.ts +++ b/src/templates/common/package.json.ts @@ -13,14 +13,17 @@ export function getPackageJsonTemplate( const commonDevDependencies = { typescript: '^5.9.3', '@modelcontextprotocol/inspector': '^0.18.0', + '@types/node': '^25.0.3', }; const zodDependency = { zod: '^4.3.5' }; + const dotEnvDependency = { dotenv: '^17.2.3' }; if (framework === 'fastmcp') { // FastMCP dependencies - simpler setup dependencies = { fastmcp: '^3.26.8', ...zodDependency, + ...dotEnvDependency, }; devDependencies = { @@ -32,16 +35,15 @@ export function getPackageJsonTemplate( '@modelcontextprotocol/sdk': '^1.25.1', express: '^5.2.1', ...zodDependency, + ...dotEnvDependency, }; if (withOAuth) { - dependencies['dotenv'] = '^17.2.3'; dependencies['jose'] = '^6.1.3'; } devDependencies = { '@types/express': '^5.0.6', - '@types/node': '^25.0.3', ...commonDevDependencies, }; } diff --git a/src/templates/common/templates.test.ts b/src/templates/common/templates.test.ts index 18c32c8..0fd9d8c 100644 --- a/src/templates/common/templates.test.ts +++ b/src/templates/common/templates.test.ts @@ -21,6 +21,12 @@ describe('common templates', () => { expect(pkg.dependencies['express']).toBeDefined(); }); + it('should include dotenv for SDK', () => { + const template = getPackageJsonTemplate(projectName); + const pkg = JSON.parse(template); + expect(pkg.dependencies['dotenv']).toBeDefined(); + }); + it('should use FastMCP package when framework is fastmcp', () => { const template = getPackageJsonTemplate(projectName, { framework: 'fastmcp' }); const pkg = JSON.parse(template); @@ -29,10 +35,15 @@ describe('common templates', () => { expect(pkg.dependencies['express']).toBeUndefined(); }); - it('should include OAuth dependencies when withOAuth is true for SDK', () => { - const template = getPackageJsonTemplate(projectName, { framework: 'sdk', withOAuth: true }); + it('should include dotenv for FastMCP', () => { + const template = getPackageJsonTemplate(projectName, { framework: 'fastmcp' }); const pkg = JSON.parse(template); expect(pkg.dependencies['dotenv']).toBeDefined(); + }); + + it('should include jose dependency when withOAuth is true for SDK', () => { + const template = getPackageJsonTemplate(projectName, { framework: 'sdk', withOAuth: true }); + const pkg = JSON.parse(template); expect(pkg.dependencies['jose']).toBeDefined(); }); diff --git a/src/templates/fastmcp/index.ts b/src/templates/fastmcp/index.ts index aaeeb4e..1d3bc60 100644 --- a/src/templates/fastmcp/index.ts +++ b/src/templates/fastmcp/index.ts @@ -6,7 +6,9 @@ export function getIndexTemplate(options?: FastMCPTemplateOptions): string { const statelessConfig = stateless ? '\n stateless: true,' : ''; - return `import { server } from './server.js'; + return ` + import 'dotenv/config'; + import { server } from './server.js'; const PORT = Number(process.env.PORT) || 3000; diff --git a/src/templates/sdk/stateful/index.ts b/src/templates/sdk/stateful/index.ts index 058e50c..94ddee3 100644 --- a/src/templates/sdk/stateful/index.ts +++ b/src/templates/sdk/stateful/index.ts @@ -5,7 +5,8 @@ export function getIndexTemplate(options?: SdkTemplateOptions): string { const withOAuth = options?.withOAuth ?? false; const imports = withOAuth - ? `import { type Request, type Response } from 'express'; + ? `import 'dotenv/config'; + import { type Request, type Response } from 'express'; import { randomUUID } from 'node:crypto'; import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; diff --git a/src/templates/sdk/stateless/index.ts b/src/templates/sdk/stateless/index.ts index 537b727..b470567 100644 --- a/src/templates/sdk/stateless/index.ts +++ b/src/templates/sdk/stateless/index.ts @@ -4,7 +4,8 @@ import type { SdkTemplateOptions } from '../../common/types.js'; // Options parameter added for type consistency with stateful template (OAuth not supported in stateless) // eslint-disable-next-line @typescript-eslint/no-unused-vars export function getIndexTemplate(options?: SdkTemplateOptions): string { - return `import { type Request, type Response } from 'express'; + return `import 'dotenv/config'; + import { type Request, type Response } from 'express'; import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import { getServer } from './server.js';