@decaf-ts/decorator-validation
Version:
simple decorator based validation engine
74 lines • 8.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelContextProtocol = void 0;
const fastmcp_1 = require("fastmcp");
const logging_1 = require("@decaf-ts/logging");
function validateVersion(version) {
const regexp = /(\d+)\.(\d+)\.(\d+)/g;
const match = regexp.exec(version);
if (!match)
throw new Error(`Invalid version string. should obey semantic versioning: ${version}`);
return `${match[1]}.${match[2]}.${match[3]}`;
}
class Builder {
constructor() {
this.tools = {};
this.log = logging_1.Logging.for("MCP Builder");
}
setName(value) {
this.name = value;
this.log.debug(`name set to ${value}`);
return this;
}
setVersion(value) {
this.version = validateVersion(value);
this.log.debug(`version set to ${value}`);
return this;
}
addTool(config) {
const { name } = config;
if (name in this.tools)
throw new Error(`tool ${name} already registered`);
this.tools[name] = config;
this.log.debug(`tool ${name} added`);
return this;
}
build() {
if (!this.name)
throw new Error("name is required");
if (!this.version)
throw new Error("version is required");
const mcp = new fastmcp_1.FastMCP({
name: this.name,
version: this.version,
});
Object.values(this.tools).forEach((tool) => {
try {
mcp.addTool(tool);
}
catch (e) {
throw new Error(`Failed to add tool ${tool.name}: ${e}`);
}
});
this.log.info(`${this.name} MCP built`);
this.log.debug(`${this.name} MCP - available tools: ${Object.keys(this.tools).join(", ")}`);
return new ModelContextProtocol(mcp);
}
}
class ModelContextProtocol {
get log() {
return logging_1.Logging.for(this);
}
constructor(mcp) {
this.mcp = mcp;
}
static { this.Builder = Builder; }
static get builder() {
return new ModelContextProtocol.Builder();
}
static validateVersion(version) {
return validateVersion(version);
}
}
exports.ModelContextProtocol = ModelContextProtocol;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxDb250ZXh0UHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWNwL01vZGVsQ29udGV4dFByb3RvY29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUF3QztBQUN4QywrQ0FBb0Q7QUFHcEQsU0FBUyxlQUFlLENBQUMsT0FBZTtJQUN0QyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxLQUFLO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQsT0FBTyxFQUFFLENBQ3RFLENBQUM7SUFDSixPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQXFDLENBQUM7QUFDbEYsQ0FBQztBQUVELE1BQU0sT0FBTztJQU9YO1FBSkEsVUFBSyxHQUFtQyxFQUFFLENBQUM7UUFFM0MsUUFBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRWxCLENBQUM7SUFFaEIsT0FBTyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sQ0FDTCxNQUF1QjtRQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSztRQUdILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBTyxDQUFPO1lBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUM7Z0JBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osR0FBRyxJQUFJLENBQUMsSUFBSSwyQkFBMkIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzVFLENBQUM7UUFDRixPQUFPLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBRUQsTUFBYSxvQkFBb0I7SUFDL0IsSUFBYyxHQUFHO1FBQ2YsT0FBTyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxJQUFXLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBK0IsR0FBa0I7UUFBbEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtJQUFHLENBQUM7YUFFckMsWUFBTyxHQUFHLE9BQU8sQ0FBQztJQUVsQyxNQUFNLEtBQUssT0FBTztRQUNoQixPQUFPLElBQUksb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQzVCLE9BQWU7UUFFZixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDOztBQWpCSCxvREFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXN0TUNQLCBUb29sIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFzdE1DUFNlc3Npb25BdXRoIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IGAke251bWJlcn0uJHtudW1iZXJ9LiR7bnVtYmVyfWAge1xuICBjb25zdCByZWdleHAgPSAvKFxcZCspXFwuKFxcZCspXFwuKFxcZCspL2c7XG4gIGNvbnN0IG1hdGNoID0gcmVnZXhwLmV4ZWModmVyc2lvbik7XG4gIGlmICghbWF0Y2gpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgdmVyc2lvbiBzdHJpbmcuIHNob3VsZCBvYmV5IHNlbWFudGljIHZlcnNpb25pbmc6ICR7dmVyc2lvbn1gXG4gICAgKTtcbiAgcmV0dXJuIGAke21hdGNoWzFdfS4ke21hdGNoWzJdfS4ke21hdGNoWzNdfWAgYXMgYCR7bnVtYmVyfS4ke251bWJlcn0uJHtudW1iZXJ9YDtcbn1cblxuY2xhc3MgQnVpbGRlciB7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIHZlcnNpb24hOiBgJHtudW1iZXJ9LiR7bnVtYmVyfS4ke251bWJlcn1gO1xuICB0b29sczogUmVjb3JkPHN0cmluZywgVG9vbDxhbnksIGFueT4+ID0ge307XG5cbiAgbG9nID0gTG9nZ2luZy5mb3IoXCJNQ1AgQnVpbGRlclwiKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc2V0TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gdmFsdWU7XG4gICAgdGhpcy5sb2cuZGVidWcoYG5hbWUgc2V0IHRvICR7dmFsdWV9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRWZXJzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2YWxpZGF0ZVZlcnNpb24odmFsdWUpO1xuICAgIHRoaXMubG9nLmRlYnVnKGB2ZXJzaW9uIHNldCB0byAke3ZhbHVlfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkVG9vbDxBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoID0gdW5kZWZpbmVkPihcbiAgICBjb25maWc6IFRvb2w8QXV0aCwgYW55PlxuICApIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGNvbmZpZztcbiAgICBpZiAobmFtZSBpbiB0aGlzLnRvb2xzKSB0aHJvdyBuZXcgRXJyb3IoYHRvb2wgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLnRvb2xzW25hbWVdID0gY29uZmlnO1xuICAgIHRoaXMubG9nLmRlYnVnKGB0b29sICR7bmFtZX0gYWRkZWRgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkPFxuICAgIEF1dGggZXh0ZW5kcyBGYXN0TUNQU2Vzc2lvbkF1dGggPSB1bmRlZmluZWQsXG4gID4oKTogTW9kZWxDb250ZXh0UHJvdG9jb2w8QXV0aD4ge1xuICAgIGlmICghdGhpcy5uYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIGlmICghdGhpcy52ZXJzaW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJ2ZXJzaW9uIGlzIHJlcXVpcmVkXCIpO1xuICAgIGNvbnN0IG1jcCA9IG5ldyBGYXN0TUNQPEF1dGg+KHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICB9KTtcbiAgICBPYmplY3QudmFsdWVzKHRoaXMudG9vbHMpLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1jcC5hZGRUb29sKHRvb2wpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhZGQgdG9vbCAke3Rvb2wubmFtZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmxvZy5pbmZvKGAke3RoaXMubmFtZX0gTUNQIGJ1aWx0YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgJHt0aGlzLm5hbWV9IE1DUCAtIGF2YWlsYWJsZSB0b29sczogJHtPYmplY3Qua2V5cyh0aGlzLnRvb2xzKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnRleHRQcm90b2NvbChtY3ApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbENvbnRleHRQcm90b2NvbDxBdXRoIGV4dGVuZHMgRmFzdE1DUFNlc3Npb25BdXRoID0gdW5kZWZpbmVkPiB7XG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBtY3A6IEZhc3RNQ1A8QXV0aD4pIHt9XG5cbiAgc3RhdGljIHJlYWRvbmx5IEJ1aWxkZXIgPSBCdWlsZGVyO1xuXG4gIHN0YXRpYyBnZXQgYnVpbGRlcigpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsQ29udGV4dFByb3RvY29sLkJ1aWxkZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlVmVyc2lvbihcbiAgICB2ZXJzaW9uOiBzdHJpbmdcbiAgKTogYCR7bnVtYmVyfS4ke251bWJlcn0uJHtudW1iZXJ9YCB7XG4gICAgcmV0dXJuIHZhbGlkYXRlVmVyc2lvbih2ZXJzaW9uKTtcbiAgfVxufVxuIl19