metal-kompanion/src/main.cpp

84 lines
2.1 KiB
C++

// Minimal CLI runner that registers Kompanion MCP tools and dispatches requests.
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include "mcp/KomMcpServer.hpp"
#include "mcp/RegisterTools.hpp"
namespace {
std::string read_all(std::istream& in) {
std::ostringstream oss;
oss << in.rdbuf();
return oss.str();
}
std::string load_request(int argc, char** argv) {
if (argc < 3) {
return read_all(std::cin);
}
std::string arg = argv[2];
if (arg == "-") {
return read_all(std::cin);
}
std::filesystem::path p{arg};
if (std::filesystem::exists(p)) {
std::ifstream file(p);
if (!file) throw std::runtime_error("unable to open request file: " + p.string());
return read_all(file);
}
return arg;
}
void print_usage(const char* exe, KomMcpServer& server) {
std::cerr << "Usage: " << exe << " <tool-name> [request-json|-|path]\n";
std::cerr << "Available tools:\n";
for (const auto& name : server.listTools()) {
std::cerr << " - " << name << "\n";
}
}
} // namespace
int main(int argc, char** argv) {
KomMcpServer server;
register_default_tools(server);
const char* pgDsn = std::getenv("PG_DSN");
if (!pgDsn || !*pgDsn) {
std::cerr << "[kom_mcp] PG_DSN not set; fallback DAL will be used if available.\n";
}
if (argc < 2) {
print_usage(argv[0], server);
return 1;
}
std::string tool = argv[1];
if (tool == "--list") {
for (const auto& name : server.listTools()) {
std::cout << name << "\n";
}
return 0;
}
if (!server.hasTool(tool)) {
std::cerr << "Unknown tool: " << tool << "\n";
print_usage(argv[0], server);
return 1;
}
try {
std::string request = load_request(argc, argv);
std::string response = server.dispatch(tool, request);
std::cout << response << std::endl;
return 0;
} catch (const std::exception& ex) {
std::cerr << "Error: " << ex.what() << "\n";
return 1;
}
}
#include <cstdlib>