Files
trebuchet/apps/api/src/index.ts
T
Test User 26420d7d1b fix(api): remove MCP server
MCP server is overkill for this use case — all 5 MCP tools are
thin wrappers over the REST API. Paperclip agents should use the
REST API directly with bearer token auth instead.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-21 23:53:04 +00:00

58 lines
1.5 KiB
TypeScript

/**
* Shannon API Server — entry point.
* Connects to Temporal, initializes K8s client, starts the Hono server.
*/
import { serve } from '@hono/node-server';
import * as k8s from '@kubernetes/client-node';
import { createApp } from './app.js';
import { loadConfig } from './config.js';
import { connectTemporal, disconnectTemporal } from './services/temporal-client.js';
async function main(): Promise<void> {
// 1. Load configuration
const config = loadConfig();
// 2. Connect to Temporal
const temporal = await connectTemporal(config.temporalAddress);
// 3. Initialize K8s client (in-cluster or from kubeconfig)
const kc = new k8s.KubeConfig();
try {
kc.loadFromCluster();
} catch {
// Fallback to default kubeconfig (for local development)
kc.loadFromDefault();
}
const batchApi = kc.makeApiClient(k8s.BatchV1Api);
const coreApi = kc.makeApiClient(k8s.CoreV1Api);
// 4. Create app
const app = createApp(config, {
temporalClient: temporal.client,
batchApi,
coreApi,
});
// 5. Start Hono server
const server = serve({ fetch: app.fetch, port: config.port }, (info) => {
console.log(`Shannon API server listening on port ${info.port}`);
});
// 6. Graceful shutdown
const shutdown = async (): Promise<void> => {
console.log('Shutting down...');
server.close();
await disconnectTemporal(temporal);
process.exit(0);
};
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);
}
main().catch((err) => {
console.error('Failed to start API server:', err);
process.exit(1);
});