Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
6 changes: 4 additions & 2 deletions src/templates/common/package.json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand All @@ -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,
};
}
Expand Down
15 changes: 13 additions & 2 deletions src/templates/common/templates.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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();
});

Expand Down
4 changes: 3 additions & 1 deletion src/templates/fastmcp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
3 changes: 2 additions & 1 deletion src/templates/sdk/stateful/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
3 changes: 2 additions & 1 deletion src/templates/sdk/stateless/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down