Docs: https://mcp-z.github.io/server Shared utilities for building MCP servers with stdio + HTTP transports, middleware composition, and file serving.
npm install @mcp-z/server
Peer dependencies:
npm install @modelcontextprotocol/sdk express
import express from 'express';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { parseConfig, connectStdio, connectHttp } from '@mcp-z/server';
const mcpServer = new McpServer({ name: 'my-server', version: '1.0.0' });
const config = parseConfig(process.argv.slice(2), process.env);
if (config.transport.type === 'stdio') {
await connectStdio(mcpServer, { logger: console });
} else {
const app = express();
await connectHttp(mcpServer, { logger: console, app, port: config.transport.port });
}
registerTools(server, tools)registerResources(server, resources)registerPrompts(server, prompts)Use composeMiddleware with middleware layers (auth, logging, etc.):
import { composeMiddleware, createLoggingMiddleware } from '@mcp-z/server';
const logging = createLoggingMiddleware({ logger: console });
const composed = composeMiddleware({ tools, resources, prompts }, [
{ withTool: authMiddleware.withToolAuth, withResource: authMiddleware.withResourceAuth, withPrompt: authMiddleware.withPromptAuth },
{ withTool: logging.withToolLogging, withResource: logging.withResourceLogging, withPrompt: logging.withPromptLogging }
]);
For servers that generate files (PDFs, CSVs, images):
reserveFile() - Reserve a file path for streaming writeswriteFile() - Write a buffer directlygetFileUri() - file:// or http:// URI based on transportcreateFileServingRouter() - Express router to serve filesimport { reserveFile, getFileUri, createFileServingRouter } from '@mcp-z/server';
const reservation = await reserveFile('report.csv', { resourceStoreUri: 'file:///tmp/files' });
const uri = getFileUri(reservation.storedName, transport, {
resourceStoreUri: 'file:///tmp/files',
baseUrl: 'https://example.com',
endpoint: '/files'
});
const router = createFileServingRouter({ resourceStoreUri: 'file:///tmp/files' }, { contentType: 'text/csv' });
app.use('/files', router);
Helpers for consistent tool inputs and output shaping:
createFieldsSchema() / parseFields() / filterFields()createPaginationSchema()createShapeSchema() / toColumnarFormat()