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
19 changes: 19 additions & 0 deletions src/modules/example-apps/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { ITokenValidator } from '../../interfaces/auth-validator.js';
import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';

// Import createServer from each example package (compiled JS)
// All packages are published on the public npm registry
Expand Down Expand Up @@ -115,6 +116,24 @@ export class ExampleAppsModule {
}

try {
// Log initialization requests to inspect client capabilities/extensions
if (isInitializeRequest(req.body)) {
const initParams = req.body?.params;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const capabilities = initParams?.capabilities as Record<string, any> | undefined;
console.log(JSON.stringify({
severity: 'INFO',
message: `=== MCP INITIALIZE REQUEST (${slug}) ===`,
timestamp: new Date().toISOString(),
slug,
clientInfo: initParams?.clientInfo,
protocolVersion: initParams?.protocolVersion,
capabilities,
hasExtensions: !!capabilities?.extensions,
extensions: capabilities?.extensions,
}));
}

// Create fresh server and transport for each request (stateless mode)
const server = createServer();
const transport = new StreamableHTTPServerTransport({
Expand Down
13 changes: 9 additions & 4 deletions src/modules/mcp/handlers/shttp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,16 @@ export async function handleStreamableHTTP(req: Request, res: Response) {
shttpTransport = await getShttpTransport(sessionId, onsessionclosed, isGetRequest);
} else if (isInitializeRequest(req.body)) {
// New initialization request - use JSON response mode
logger.debug('Processing initialize request', {
body: req.body,
const initParams = req.body?.params;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const capabilities = initParams?.capabilities as Record<string, any> | undefined;
logger.info('=== MCP INITIALIZE REQUEST ===', {
userId,
headerSessionId: sessionId, // This is the sessionId from header (should be undefined for init)
isInitializeRequest: true
clientInfo: initParams?.clientInfo,
protocolVersion: initParams?.protocolVersion,
capabilities,
hasExtensions: !!capabilities?.extensions,
extensions: capabilities?.extensions,
});

const onsessioninitialized = async (sessionId: string) => {
Expand Down