#!/usr/bin/env node
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
import cors from 'cors';
import { registerExchangeRateTools } from './tools/exchangeRate.js';
import { registerStockDataTools } from './tools/stockData.js';
import { registerTransactionTools } from './tools/transactions.js';
// Initialize the MCP server
const server = new McpServer({
name: 'financial-mcp-server',
version: '1.0.0'
});
// Register all tools
registerExchangeRateTools(server);
registerStockDataTools(server);
registerTransactionTools(server);
async function main() {
const args = process.argv.slice(2);
const mode = args.includes('serve') ? 'http' : 'stdio';
if (mode === 'http') {
const app = express();
app.use(cors());
// Simple in-memory transport store
// In production, you'd want something more robust
let transport: SSEServerTransport | null = null;
app.get('/sse', async (req, res) => {
console.log('New SSE connection');
transport = new SSEServerTransport('/messages', res);
await server.connect(transport);
});
app.post('/messages', async (req, res) => {
if (transport) {
await transport.handlePostMessage(req, res);
} else {
res.status(404).send('No active connection');
}
});
const port = process.env.PORT ? parseInt(process.env.PORT) : 3000;
app.listen(port, () => {
console.log(`MCP Server running on port ${port} (HTTP/SSE mode)`);
});
} else {
// Start with stdio transport
console.error('Starting in Stdio mode...');
const transport = new StdioServerTransport();
await server.connect(transport);
}
}
main().catch(console.error);