#!/usr/bin/env node
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { createMcpServer } from './mcpServer.js'
import { startRemoteServer, type RemoteAuthMode } from './remoteServer.js'
async function main() {
const args = process.argv.slice(2)
const firstArg = args[0]
const mode = (
getArgValue(args, '--mode')
?? (!firstArg || firstArg.startsWith('--') ? undefined : firstArg)
?? process.env.TOGELLO_MCP_MODE
?? 'stdio'
).toLowerCase()
if (mode === 'remote') {
const host = getArgValue(args, '--host') ?? process.env.TOGELLO_MCP_HOST ?? '0.0.0.0'
const portString = getArgValue(args, '--port') ?? process.env.TOGELLO_MCP_PORT ?? '8081'
const authMode = parseRemoteAuthMode(getArgValue(args, '--auth-mode') ?? process.env.TOGELLO_MCP_AUTH_MODE)
const keepAliveMsString = process.env.TOGELLO_MCP_SSE_KEEPALIVE_MS
const port = Number(portString)
if (!Number.isFinite(port) || !Number.isInteger(port) || port < 1 || port > 65535) {
throw new Error(`Invalid port: ${portString}`)
}
let keepAliveMs: number | undefined
if (keepAliveMsString !== undefined) {
keepAliveMs = Number(keepAliveMsString)
if (!Number.isFinite(keepAliveMs) || keepAliveMs < 0) {
throw new Error(`Invalid TOGELLO_MCP_SSE_KEEPALIVE_MS: ${keepAliveMsString}`)
}
}
await startRemoteServer({
host,
port,
authMode,
sseKeepAliveMs: keepAliveMs,
})
return
}
if (mode !== 'stdio') {
throw new Error(`Unknown mode: ${mode}`)
}
const server = createMcpServer()
await server.connect(new StdioServerTransport())
}
main().catch((error) => {
console.error('Fatal error in main():', error)
process.exit(1)
})
function getArgValue(args: string[], key: string): string | undefined {
const index = args.indexOf(key)
if (index === -1) {
return undefined
}
return args[index + 1]
}
function parseRemoteAuthMode(value: string | undefined): RemoteAuthMode {
if (value === undefined) {
return 'passthrough'
}
const normalized = value.trim().toLowerCase()
if (normalized === 'passthrough' || normalized === 'env') {
return normalized
}
throw new Error(`Invalid TOGELLO_MCP_AUTH_MODE: ${value}`)
}