index.ts•1.87 kB
#!/usr/bin/env node
import { config as loadEnv } from 'dotenv';
// Load environment variables
const envResult = loadEnv();
if (envResult.parsed) {
const envCount = Object.keys(envResult.parsed).length;
console.log(`[dotenv@16.6.1] injecting env (${envCount}) from .env -- tip: 📡 auto-backup env with Radar: https://dotenvx.com/radar`);
}
import { loadConfig } from './config.js';
import { parseArgs } from './cli.js';
import { ExaServer } from './server.js';
import { runStdioTransport, startHttpTransport } from './transport/index.js';
/**
* Main entry point for the Exa MCP Server
*
* Transport selection logic:
* 1. --stdio flag forces STDIO transport
* 2. --port flag or PORT env var triggers HTTP transport
* 3. Default: STDIO for local development
*/
async function main() {
try {
const config = loadConfig();
const cliOptions = parseArgs();
// Determine transport mode
const shouldUseHttp = cliOptions.port || (process.env.PORT && !cliOptions.stdio);
const port = cliOptions.port || config.port;
if (shouldUseHttp) {
// HTTP transport for production/cloud deployment
startHttpTransport({
apiKey: config.apiKey,
port,
enabledTools: config.enabledTools,
debug: Boolean(cliOptions.debug || config.debug)
});
} else {
// STDIO transport for local development
const server = new ExaServer(
config.apiKey,
config.enabledTools,
Boolean(cliOptions.debug || config.debug)
);
await runStdioTransport(server.getServer());
}
} catch (error) {
console.error("Fatal error running Exa server:", error);
process.exit(1);
}
}
// Run the server
main();