tak-server-mcp-skyfi
Version:
Model Context Protocol (MCP) server for TAK Server integration with geospatial support
100 lines • 4.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getConfig = getConfig;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const joi_1 = __importDefault(require("joi"));
const configSchema = joi_1.default.object({
takServer: joi_1.default.object({
url: joi_1.default.string().uri().required(),
apiToken: joi_1.default.string().optional(),
clientCert: joi_1.default.string().optional(),
clientKey: joi_1.default.string().optional(),
verifySsl: joi_1.default.boolean().default(true)
}).required(),
mcp: joi_1.default.object({
transport: joi_1.default.string().valid('stdio', 'http', 'sse').default('stdio'),
port: joi_1.default.number().port().when('transport', {
is: joi_1.default.string().valid('http', 'sse'),
then: joi_1.default.required(),
otherwise: joi_1.default.optional()
}),
auth: joi_1.default.object({
enabled: joi_1.default.boolean().default(false),
method: joi_1.default.string().valid('oauth2', 'apikey', 'basic').optional(),
oauth: joi_1.default.object({
clientId: joi_1.default.string().required(),
clientSecret: joi_1.default.string().required(),
authorizationUrl: joi_1.default.string().uri().optional(),
tokenUrl: joi_1.default.string().uri().optional(),
scope: joi_1.default.string().optional()
}).optional()
}).optional()
}).required(),
tools: joi_1.default.object({
enabledTools: joi_1.default.array().items(joi_1.default.string()).optional(),
geospatial: joi_1.default.object({
defaultRadius: joi_1.default.number().default(1000),
coordinateSystem: joi_1.default.string().valid('wgs84', 'mgrs').default('wgs84'),
h3Resolution: joi_1.default.number().min(0).max(15).default(9)
}).default(),
cache: joi_1.default.object({
enabled: joi_1.default.boolean().default(true),
ttl: joi_1.default.number().default(3600),
maxSize: joi_1.default.number().default(1000)
}).default()
}).default()
});
function getConfig() {
let config = {};
// Load from config file if exists
const configPath = process.env.TAK_MCP_CONFIG || path_1.default.join(process.cwd(), 'config.json');
if (fs_1.default.existsSync(configPath)) {
try {
const fileConfig = JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
config = { ...config, ...fileConfig };
}
catch (error) {
console.error(`Failed to load config from ${configPath}:`, error);
}
}
// Override with environment variables
config.takServer = {
...config.takServer,
url: process.env.TAK_SERVER_URL || config.takServer?.url || '',
apiToken: process.env.TAK_SERVER_API_TOKEN || config.takServer?.apiToken,
clientCert: process.env.TAK_SERVER_CLIENT_CERT || config.takServer?.clientCert,
clientKey: process.env.TAK_SERVER_CLIENT_KEY || config.takServer?.clientKey,
verifySsl: process.env.TAK_SERVER_VERIFY_SSL !== 'false'
};
config.mcp = {
...config.mcp,
transport: process.env.MCP_TRANSPORT || config.mcp?.transport || 'stdio',
port: process.env.MCP_PORT ? parseInt(process.env.MCP_PORT) : config.mcp?.port
};
if (process.env.MCP_AUTH_ENABLED === 'true') {
config.mcp.auth = {
enabled: true,
method: process.env.MCP_AUTH_METHOD || config.mcp?.auth?.method || 'apikey'
};
if (config.mcp.auth.method === 'oauth2') {
config.mcp.auth.oauth = {
clientId: process.env.MCP_OAUTH_CLIENT_ID || config.mcp.auth.oauth?.clientId || '',
clientSecret: process.env.MCP_OAUTH_CLIENT_SECRET || config.mcp.auth.oauth?.clientSecret || '',
authorizationUrl: process.env.MCP_OAUTH_AUTH_URL || config.mcp.auth.oauth?.authorizationUrl,
tokenUrl: process.env.MCP_OAUTH_TOKEN_URL || config.mcp.auth.oauth?.tokenUrl,
scope: process.env.MCP_OAUTH_SCOPE || config.mcp.auth.oauth?.scope
};
}
}
// Validate configuration
const { error, value } = configSchema.validate(config);
if (error) {
throw new Error(`Invalid configuration: ${error.message}`);
}
return value;
}
//# sourceMappingURL=index.js.map