@chainlink/mcp-server
Version:
Prototype MCP Server for CLL
112 lines • 4.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateRelevance = exports.searchInCcipDataSources = void 0;
const strings_1 = require("./strings");
const searchInCcipDataSources = (data, query, specificChain, environment, dataType) => {
const results = [];
const lowercaseQuery = query.toLowerCase();
if (typeof data === "object" && data !== null) {
for (const [key, value] of Object.entries(data)) {
const lowercaseKey = key.toLowerCase();
let matches = false;
if (specificChain) {
const normalizedChain = specificChain
.toLowerCase()
.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
matches =
normalizedKey.includes(normalizedChain) ||
normalizedChain.includes(normalizedKey);
}
else {
const normalizedQuery = lowercaseQuery.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
matches =
lowercaseKey.includes(lowercaseQuery) ||
lowercaseQuery.includes(lowercaseKey) ||
normalizedKey.includes(normalizedQuery) ||
normalizedQuery.includes(normalizedKey);
}
if (matches) {
results.push({
environment,
dataType,
key,
data: value,
relevance: (0, exports.calculateRelevance)(key, query, specificChain),
});
}
if (typeof value === "object" && value !== null) {
const nestedResults = (0, exports.searchInCcipDataSources)(value, query, specificChain, environment, `${dataType}.${key}`);
results.push(...nestedResults);
}
}
}
return results;
};
exports.searchInCcipDataSources = searchInCcipDataSources;
const calculateRelevance = (key, query, specificChain) => {
let score = 0;
const lowercaseKey = key.toLowerCase();
const lowercaseQuery = query.toLowerCase();
const normalizedKey = lowercaseKey.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
const normalizedQuery = lowercaseQuery.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
if (lowercaseKey === lowercaseQuery)
score += 100;
else if (normalizedKey === normalizedQuery)
score += 90;
else if (lowercaseKey.includes(lowercaseQuery))
score += 50;
else if (normalizedKey.includes(normalizedQuery))
score += 45;
else if (lowercaseQuery.includes(lowercaseKey))
score += 30;
else if (normalizedQuery.includes(normalizedKey))
score += 25;
if (score === 0) {
const keyParts = lowercaseKey.split(/[-_]/);
for (const part of keyParts) {
if (part.length > 2 && lowercaseQuery.includes(part)) {
score += 40;
break;
}
}
}
if (lowercaseQuery.includes("sepolia")) {
const keyParts = lowercaseKey.split("-");
if (keyParts.includes("sepolia")) {
const contextWords = keyParts.filter((part) => part !== "sepolia" && part.length > 1);
const contextMatches = contextWords.filter((word) => lowercaseQuery.includes(word));
score += contextMatches.length * 15;
if (keyParts.includes("ethereum") && keyParts.includes("testnet")) {
if (contextMatches.length === 0)
score += 10;
}
}
}
if (specificChain) {
const lowercaseChain = specificChain.toLowerCase();
const normalizedChain = lowercaseChain.replace(strings_1.CHAIN_NAME_NORMALIZER, "");
if (lowercaseKey === lowercaseChain) {
score += 200;
const queryParts = lowercaseQuery.replace(/[^\w\s]/g, "").split(/\s+/);
const chainParts = lowercaseChain.split(/[-_]/);
let mentionedParts = 0;
for (const chainPart of chainParts) {
if (chainPart.length > 2 && queryParts.includes(chainPart))
mentionedParts++;
}
if (mentionedParts > 1)
score += 50;
}
else if (normalizedKey === normalizedChain)
score += 180;
else if (lowercaseKey.includes(lowercaseChain))
score += 75;
else if (normalizedKey.includes(normalizedChain))
score += 65;
}
return score;
};
exports.calculateRelevance = calculateRelevance;
//# sourceMappingURL=search.js.map