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,aA2ChC,CAAC"}
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
- const url = new URL("/v0.1/servers", BASE_URL);
15
- url.searchParams.set("limit", String(Math.min(limit, 96)));
16
- if (query)
17
- url.searchParams.set("search", query);
18
- url.searchParams.set("version", "latest");
19
- const controller = new AbortController();
20
- const timer = setTimeout(() => controller.abort(), timeout);
21
- const res = await fetch(url.toString(), { signal: controller.signal });
22
- clearTimeout(timer);
23
- if (!res.ok)
24
- return [];
25
- const data = await res.json();
26
- const rawServers = data.servers ?? data.data ?? [];
27
- // MCP registry wraps in { server: {...} } objects
28
- const servers = rawServers.map((item) => item.server ?? item);
29
- return servers.slice(0, limit).map((server) => mapMcpServer(server));
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":"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"}
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.12.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
- try {
30
- const url = new URL("/v0.1/servers", BASE_URL);
31
- url.searchParams.set("limit", String(Math.min(limit, 96)));
32
- if (query) url.searchParams.set("search", query);
33
- url.searchParams.set("version", "latest");
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
- const controller = new AbortController();
36
- const timer = setTimeout(() => controller.abort(), timeout);
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
- const res = await fetch(url.toString(), { signal: controller.signal });
39
- clearTimeout(timer);
44
+ const res = await fetch(url.toString(), { signal: AbortSignal.timeout(timeout) });
45
+ if (!res.ok) return [];
40
46
 
41
- if (!res.ok) return [];
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 data = await res.json();
44
- const rawServers = data.servers ?? data.data ?? [];
45
- // MCP registry wraps in { server: {...} } objects
46
- const servers: McpServer[] = rawServers.map((item: any) => item.server ?? item);
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 servers.slice(0, limit).map((server) => mapMcpServer(server));
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[] = [];