kompass-sdk 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../../src/sources/mcp-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAcnF,eAAO,MAAM,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../../src/sources/mcp-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAcnF,eAAO,MAAM,kBAAkB,EAAE,aA2DhC,CAAC"}
|
|
@@ -10,23 +10,36 @@ export const mcpRegistryAdapter = {
|
|
|
10
10
|
async search(query, options) {
|
|
11
11
|
const limit = options?.limit ?? 50;
|
|
12
12
|
const timeout = options?.timeout ?? 10000;
|
|
13
|
+
// MCP Registry uses keyword search, not semantic.
|
|
14
|
+
// Expand user intent into multiple keyword searches to improve recall.
|
|
15
|
+
const searchTerms = expandQueryToKeywords(query);
|
|
16
|
+
const allServers = [];
|
|
17
|
+
const seenNames = new Set();
|
|
13
18
|
try {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
url.searchParams.set("
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
// Run searches in parallel for speed (max 3 terms)
|
|
20
|
+
const results = await Promise.allSettled(searchTerms.slice(0, 3).map(async (term) => {
|
|
21
|
+
const url = new URL("/v0.1/servers", BASE_URL);
|
|
22
|
+
url.searchParams.set("limit", String(Math.min(limit, 20)));
|
|
23
|
+
url.searchParams.set("search", term);
|
|
24
|
+
url.searchParams.set("version", "latest");
|
|
25
|
+
const res = await fetch(url.toString(), { signal: AbortSignal.timeout(timeout) });
|
|
26
|
+
if (!res.ok)
|
|
27
|
+
return [];
|
|
28
|
+
const data = await res.json();
|
|
29
|
+
const rawServers = data.servers ?? data.data ?? [];
|
|
30
|
+
return rawServers.map((item) => item.server ?? item);
|
|
31
|
+
}));
|
|
32
|
+
for (const result of results) {
|
|
33
|
+
if (result.status === "fulfilled") {
|
|
34
|
+
for (const server of result.value) {
|
|
35
|
+
if (!seenNames.has(server.name)) {
|
|
36
|
+
seenNames.add(server.name);
|
|
37
|
+
allServers.push(server);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return allServers.slice(0, limit).map((server) => mapMcpServer(server));
|
|
30
43
|
}
|
|
31
44
|
catch {
|
|
32
45
|
return [];
|
|
@@ -65,6 +78,54 @@ function mapMcpServer(server) {
|
|
|
65
78
|
raw: server,
|
|
66
79
|
};
|
|
67
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Expand natural language query into MCP Registry keyword searches.
|
|
83
|
+
* "search the web for DeFi news" → ["web search", "exa", "DeFi", "news"]
|
|
84
|
+
* "query postgres database" → ["postgres", "database", "sql"]
|
|
85
|
+
*/
|
|
86
|
+
function expandQueryToKeywords(query) {
|
|
87
|
+
const terms = [];
|
|
88
|
+
const lower = query.toLowerCase();
|
|
89
|
+
// Always include the raw query words (2+ chars)
|
|
90
|
+
const words = lower.split(/\s+/).filter((w) => w.length > 2);
|
|
91
|
+
terms.push(...words.slice(0, 3));
|
|
92
|
+
// Intent → tool name mappings (what users say → what MCP servers are called)
|
|
93
|
+
const expansions = {
|
|
94
|
+
"search": ["exa", "web search", "tavily", "search"],
|
|
95
|
+
"web": ["exa", "web", "browser", "scrape"],
|
|
96
|
+
"scrape": ["scrape", "crawl", "browser", "firecrawl"],
|
|
97
|
+
"database": ["postgres", "mysql", "sqlite", "database", "sql"],
|
|
98
|
+
"sql": ["postgres", "mysql", "sql", "database"],
|
|
99
|
+
"postgres": ["postgres"],
|
|
100
|
+
"weather": ["weather"],
|
|
101
|
+
"email": ["email", "gmail", "mail"],
|
|
102
|
+
"github": ["github", "git"],
|
|
103
|
+
"slack": ["slack"],
|
|
104
|
+
"file": ["file", "filesystem", "s3"],
|
|
105
|
+
"image": ["image", "dalle", "vision"],
|
|
106
|
+
"code": ["code", "github", "lint"],
|
|
107
|
+
"defi": ["defi", "exa", "blockchain"],
|
|
108
|
+
"crypto": ["crypto", "blockchain", "exa"],
|
|
109
|
+
"news": ["news", "exa", "search"],
|
|
110
|
+
"data": ["data", "analytics"],
|
|
111
|
+
"deploy": ["deploy", "vercel", "aws"],
|
|
112
|
+
"document": ["document", "pdf", "markdown"],
|
|
113
|
+
"translate": ["translate", "language"],
|
|
114
|
+
"calendar": ["calendar", "google"],
|
|
115
|
+
"map": ["map", "location", "geo"],
|
|
116
|
+
"payment": ["payment", "stripe"],
|
|
117
|
+
"ai": ["openai", "anthropic", "ai"],
|
|
118
|
+
"research": ["exa", "search", "research"],
|
|
119
|
+
"analyze": ["analytics", "data", "chart"],
|
|
120
|
+
};
|
|
121
|
+
for (const word of words) {
|
|
122
|
+
if (expansions[word]) {
|
|
123
|
+
terms.push(...expansions[word]);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Deduplicate
|
|
127
|
+
return [...new Set(terms)];
|
|
128
|
+
}
|
|
68
129
|
function extractCategories(text) {
|
|
69
130
|
const lower = text.toLowerCase();
|
|
70
131
|
const cats = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../../src/sources/mcp-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,QAAQ,GAAG,0CAA0C,CAAC;AAY5D,MAAM,CAAC,MAAM,kBAAkB,GAAkB;IAC/C,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,0BAA0B;IAEvC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAA6B;QACvD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QAE1C,
|
|
1
|
+
{"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../../src/sources/mcp-registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kompass-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Get any job done. Universal agent capability discovery + coordination across ACP, MCP, x402, A2A, skills, L402, and ERC-8004.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,26 +26,42 @@ export const mcpRegistryAdapter: SourceAdapter = {
|
|
|
26
26
|
const limit = options?.limit ?? 50;
|
|
27
27
|
const timeout = options?.timeout ?? 10000;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
// MCP Registry uses keyword search, not semantic.
|
|
30
|
+
// Expand user intent into multiple keyword searches to improve recall.
|
|
31
|
+
const searchTerms = expandQueryToKeywords(query);
|
|
32
|
+
const allServers: McpServer[] = [];
|
|
33
|
+
const seenNames = new Set<string>();
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
try {
|
|
36
|
+
// Run searches in parallel for speed (max 3 terms)
|
|
37
|
+
const results = await Promise.allSettled(
|
|
38
|
+
searchTerms.slice(0, 3).map(async (term) => {
|
|
39
|
+
const url = new URL("/v0.1/servers", BASE_URL);
|
|
40
|
+
url.searchParams.set("limit", String(Math.min(limit, 20)));
|
|
41
|
+
url.searchParams.set("search", term);
|
|
42
|
+
url.searchParams.set("version", "latest");
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
const res = await fetch(url.toString(), { signal: AbortSignal.timeout(timeout) });
|
|
45
|
+
if (!res.ok) return [];
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
const data = await res.json();
|
|
48
|
+
const rawServers = data.servers ?? data.data ?? [];
|
|
49
|
+
return rawServers.map((item: any) => item.server ?? item) as McpServer[];
|
|
50
|
+
})
|
|
51
|
+
);
|
|
42
52
|
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
for (const result of results) {
|
|
54
|
+
if (result.status === "fulfilled") {
|
|
55
|
+
for (const server of result.value) {
|
|
56
|
+
if (!seenNames.has(server.name)) {
|
|
57
|
+
seenNames.add(server.name);
|
|
58
|
+
allServers.push(server);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
47
63
|
|
|
48
|
-
return
|
|
64
|
+
return allServers.slice(0, limit).map((server) => mapMcpServer(server));
|
|
49
65
|
} catch {
|
|
50
66
|
return [];
|
|
51
67
|
}
|
|
@@ -86,6 +102,59 @@ function mapMcpServer(server: McpServer): UnifiedAgent {
|
|
|
86
102
|
};
|
|
87
103
|
}
|
|
88
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Expand natural language query into MCP Registry keyword searches.
|
|
107
|
+
* "search the web for DeFi news" → ["web search", "exa", "DeFi", "news"]
|
|
108
|
+
* "query postgres database" → ["postgres", "database", "sql"]
|
|
109
|
+
*/
|
|
110
|
+
function expandQueryToKeywords(query: string): string[] {
|
|
111
|
+
const terms: string[] = [];
|
|
112
|
+
const lower = query.toLowerCase();
|
|
113
|
+
|
|
114
|
+
// Always include the raw query words (2+ chars)
|
|
115
|
+
const words = lower.split(/\s+/).filter((w) => w.length > 2);
|
|
116
|
+
terms.push(...words.slice(0, 3));
|
|
117
|
+
|
|
118
|
+
// Intent → tool name mappings (what users say → what MCP servers are called)
|
|
119
|
+
const expansions: Record<string, string[]> = {
|
|
120
|
+
"search": ["exa", "web search", "tavily", "search"],
|
|
121
|
+
"web": ["exa", "web", "browser", "scrape"],
|
|
122
|
+
"scrape": ["scrape", "crawl", "browser", "firecrawl"],
|
|
123
|
+
"database": ["postgres", "mysql", "sqlite", "database", "sql"],
|
|
124
|
+
"sql": ["postgres", "mysql", "sql", "database"],
|
|
125
|
+
"postgres": ["postgres"],
|
|
126
|
+
"weather": ["weather"],
|
|
127
|
+
"email": ["email", "gmail", "mail"],
|
|
128
|
+
"github": ["github", "git"],
|
|
129
|
+
"slack": ["slack"],
|
|
130
|
+
"file": ["file", "filesystem", "s3"],
|
|
131
|
+
"image": ["image", "dalle", "vision"],
|
|
132
|
+
"code": ["code", "github", "lint"],
|
|
133
|
+
"defi": ["defi", "exa", "blockchain"],
|
|
134
|
+
"crypto": ["crypto", "blockchain", "exa"],
|
|
135
|
+
"news": ["news", "exa", "search"],
|
|
136
|
+
"data": ["data", "analytics"],
|
|
137
|
+
"deploy": ["deploy", "vercel", "aws"],
|
|
138
|
+
"document": ["document", "pdf", "markdown"],
|
|
139
|
+
"translate": ["translate", "language"],
|
|
140
|
+
"calendar": ["calendar", "google"],
|
|
141
|
+
"map": ["map", "location", "geo"],
|
|
142
|
+
"payment": ["payment", "stripe"],
|
|
143
|
+
"ai": ["openai", "anthropic", "ai"],
|
|
144
|
+
"research": ["exa", "search", "research"],
|
|
145
|
+
"analyze": ["analytics", "data", "chart"],
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
for (const word of words) {
|
|
149
|
+
if (expansions[word]) {
|
|
150
|
+
terms.push(...expansions[word]);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Deduplicate
|
|
155
|
+
return [...new Set(terms)];
|
|
156
|
+
}
|
|
157
|
+
|
|
89
158
|
function extractCategories(text: string): string[] {
|
|
90
159
|
const lower = text.toLowerCase();
|
|
91
160
|
const cats: string[] = [];
|