84 lines
2.1 KiB
C++
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>
|