@oevortex/ddg_search 1.2.0 → 1.3.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.
- package/CHANGELOG.md +47 -26
- package/README.md +3 -3
- package/babel.config.js +11 -11
- package/bin/cli.js +6 -6
- package/package.json +2 -2
- package/src/tools/searchTool.js +40 -40
- package/src/utils/search.js +322 -322
- package/src/utils/search_iask.js +228 -228
- package/src/utils/search_monica.js +238 -238
- package/test.setup.js +72 -119
package/CHANGELOG.md
CHANGED
|
@@ -1,29 +1,50 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.3.0] - 2026-02-09
|
|
6
|
+
|
|
7
|
+
### Removed
|
|
8
|
+
- Brave AI Search provider and tool
|
|
9
|
+
- Brave AI search utility with streaming response parsing
|
|
10
|
+
- Brave AI tool tests and MCP integration coverage
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Updated package.json version to 1.3.0
|
|
14
|
+
|
|
15
|
+
## [1.2.1] - 2026-01-19
|
|
16
|
+
### Added
|
|
17
|
+
- Brave AI Search provider and tool with research mode toggle
|
|
18
|
+
- Brave AI search utility with streaming response parsing
|
|
19
|
+
- Brave AI tool tests and MCP integration coverage
|
|
20
|
+
- Updated CLI help text and README documentation for Brave AI
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Server and CLI tool registry to include brave-search
|
|
24
|
+
|
|
25
|
+
## [1.2.0] - 2025-12-21
|
|
26
|
+
### Added
|
|
27
|
+
- Comprehensive Jest testing framework with ES module support
|
|
28
|
+
- Complete unit test suite for all utility functions (search, user_agents, search_iask, search_monica)
|
|
29
|
+
- Integration tests for MCP server functionality and tool routing
|
|
30
|
+
- Test infrastructure with mocking for all external dependencies
|
|
31
|
+
- Input validation across all search modules and tools
|
|
32
|
+
- Enhanced error handling with specific network error types
|
|
33
|
+
- Performance optimizations with timeout management and caching
|
|
34
|
+
- Improved logging and monitoring capabilities
|
|
35
|
+
- Fixed JSON parsing error in searchTool handler (1.1.9 regression)
|
|
36
|
+
- Updated package.json with comprehensive test scripts
|
|
37
|
+
- Added Babel configuration for test compatibility
|
|
38
|
+
|
|
39
|
+
### Improved
|
|
40
|
+
- Search module robustness with AbortController and timeout management
|
|
41
|
+
- IAsk AI WebSocket connection handling with enhanced error reporting
|
|
42
|
+
- Monica AI stream processing with improved validation
|
|
43
|
+
- Tool schema validation with comprehensive parameter checking
|
|
44
|
+
- User agent rotation consistency and logging
|
|
45
|
+
- Cache management with hit detection and size controls
|
|
46
|
+
|
|
47
|
+
## [1.1.9] - 2025-12-21
|
|
27
48
|
### Added
|
|
28
49
|
- Added new `getRandomUserAgent` function to rotate user agents
|
|
29
50
|
- Added new `src/utils/user_agents.js` file containing list of user agents
|
package/README.md
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
<a href="https://youtube.com/@OEvortex">
|
|
9
9
|
<img src="https://img.shields.io/badge/YouTube-%40OEvortex-red.svg" alt="YouTube Channel" />
|
|
10
10
|
</a>
|
|
11
|
-
<h1>DuckDuckGo, IAsk AI &
|
|
11
|
+
<h1>DuckDuckGo, IAsk AI, Monica & Brave AI Search MCP <span style="font-size:2.2rem;">🔍🧠</span></h1>
|
|
12
12
|
<p style="font-size:1.15rem; max-width:600px; margin:0 auto;">
|
|
13
13
|
<strong>Lightning-fast, privacy-first Model Context Protocol (MCP) server for web search and AI-powered answers.<br>
|
|
14
|
-
Powered by DuckDuckGo, IAsk AI and
|
|
14
|
+
Powered by DuckDuckGo, IAsk AI, Monica, and Brave AI.</strong>
|
|
15
15
|
</p>
|
|
16
16
|
<a href="https://glama.ai/mcp/servers/@OEvortex/ddg_search">
|
|
17
17
|
<img width="380" height="200" src="https://glama.ai/mcp/servers/@OEvortex/ddg_search/badge" alt="DuckDuckGo Search MCP server" />
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
## ✨ Features
|
|
31
31
|
|
|
32
32
|
<div style="display: flex; flex-wrap: wrap; gap: 1.5em; margin-bottom: 1.5em;"> <div><b>🌐 Web search</b> using DuckDuckGo HTML</div>
|
|
33
|
-
<div><b>🧠 AI search</b> using IAsk AI &
|
|
33
|
+
<div><b>🧠 AI search</b> using IAsk AI, Monica & Brave AI</div>
|
|
34
34
|
<div><b>⚡ Performance optimized</b> with caching</div>
|
|
35
35
|
<div><b>🛡️ Security features</b> including rate limiting and rotating user agents</div>
|
|
36
36
|
<div><b>🔌 MCP-compliant</b> server implementation</div>
|
package/babel.config.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
presets: [
|
|
3
|
-
[
|
|
4
|
-
'@babel/preset-env',
|
|
5
|
-
{
|
|
6
|
-
targets: {
|
|
7
|
-
node: 'current'
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
]
|
|
1
|
+
export default {
|
|
2
|
+
presets: [
|
|
3
|
+
[
|
|
4
|
+
'@babel/preset-env',
|
|
5
|
+
{
|
|
6
|
+
targets: {
|
|
7
|
+
node: 'current'
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
]
|
|
12
12
|
};
|
package/bin/cli.js
CHANGED
|
@@ -18,8 +18,8 @@ async function startServer() {
|
|
|
18
18
|
// Create the MCP server
|
|
19
19
|
const server = new Server({
|
|
20
20
|
id: 'ddg-search-mcp',
|
|
21
|
-
name: 'DuckDuckGo, IAsk AI & Monica Search MCP',
|
|
22
|
-
description: 'A Model Context Protocol server for web search using DuckDuckGo, IAsk AI and Monica',
|
|
21
|
+
name: 'DuckDuckGo, IAsk AI & Monica AI Search MCP',
|
|
22
|
+
description: 'A Model Context Protocol server for web search using DuckDuckGo, IAsk AI, and Monica AI',
|
|
23
23
|
version: '1.1.8'
|
|
24
24
|
}, {
|
|
25
25
|
capabilities: {
|
|
@@ -92,7 +92,7 @@ async function startServer() {
|
|
|
92
92
|
}); // Display promotional message
|
|
93
93
|
console.error('\n\x1b[36m╔════════════════════════════════════════════════════════════╗');
|
|
94
94
|
console.error('║ ║');
|
|
95
|
-
console.error('║ \x1b[1m\x1b[31mDuckDuckGo &
|
|
95
|
+
console.error('║ \x1b[1m\x1b[31mDuckDuckGo & AI Search MCP\x1b[0m\x1b[36m by \x1b[1m\x1b[33m@OEvortex\x1b[0m\x1b[36m ║');
|
|
96
96
|
console.error('║ ║');
|
|
97
97
|
console.error('║ \x1b[0m👉 Subscribe to \x1b[1m\x1b[37myoutube.com/@OEvortex\x1b[0m\x1b[36m for more tools! ║');
|
|
98
98
|
console.error('║ ║');
|
|
@@ -101,7 +101,7 @@ async function startServer() {
|
|
|
101
101
|
// Start the server with stdio transport
|
|
102
102
|
const transport = new StdioServerTransport();
|
|
103
103
|
await server.connect(transport);
|
|
104
|
-
console.error('DuckDuckGo, IAsk AI & Monica Search MCP server started and listening on stdio');
|
|
104
|
+
console.error('DuckDuckGo, IAsk AI & Monica AI Search MCP server started and listening on stdio');
|
|
105
105
|
} catch (error) {
|
|
106
106
|
console.error('Failed to start server:', error);
|
|
107
107
|
process.exit(1);
|
|
@@ -115,7 +115,7 @@ const versionFlag = args.includes('--version') || args.includes('-v');
|
|
|
115
115
|
|
|
116
116
|
if (helpFlag) {
|
|
117
117
|
console.log(`
|
|
118
|
-
DuckDuckGo, IAsk AI & Monica Search MCP - A Model Context Protocol server for web search
|
|
118
|
+
DuckDuckGo, IAsk AI & Monica AI Search MCP - A Model Context Protocol server for web search
|
|
119
119
|
|
|
120
120
|
Usage:
|
|
121
121
|
npx -y @oevortex/ddg_search@latest [options]
|
|
@@ -145,7 +145,7 @@ if (versionFlag) {
|
|
|
145
145
|
const packageJson = JSON.parse(
|
|
146
146
|
await readFile(new URL('../package.json', import.meta.url), 'utf8')
|
|
147
147
|
);
|
|
148
|
-
console.log(`DuckDuckGo &
|
|
148
|
+
console.log(`DuckDuckGo & AI Search MCP v${packageJson.version}\nCreated by @OEvortex - Subscribe to youtube.com/@OEvortex!`);
|
|
149
149
|
process.exit(0);
|
|
150
150
|
} catch (err) {
|
|
151
151
|
console.error('Error reading version information:', err);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oevortex/ddg_search",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "A Model Context Protocol server for web search using DuckDuckGo and
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "A Model Context Protocol server for web search using DuckDuckGo, IAsk AI, and Monica AI",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"module": "src/index.ts",
|
|
7
7
|
"exports": {
|
package/src/tools/searchTool.js
CHANGED
|
@@ -37,43 +37,43 @@ export const searchToolDefinition = {
|
|
|
37
37
|
* @param {Object} params - The tool parameters
|
|
38
38
|
* @returns {Promise<Object>} - The tool result
|
|
39
39
|
*/
|
|
40
|
-
export async function searchToolHandler(params) {
|
|
41
|
-
const { query, numResults = 3, mode = 'short' } = params;
|
|
42
|
-
console.log(`Searching for: ${query} (${numResults} results, mode: ${mode})`);
|
|
43
|
-
|
|
44
|
-
const results = await searchDuckDuckGo(query, numResults, mode);
|
|
45
|
-
console.log(`Found ${results.length} results`);
|
|
46
|
-
|
|
47
|
-
// Format results as readable text, similar to other search tools
|
|
48
|
-
const formattedResults = results.map((result, index) => {
|
|
49
|
-
let formatted = `${index + 1}. **${result.title}**\n`;
|
|
50
|
-
formatted += `URL: ${result.url}\n`;
|
|
51
|
-
|
|
52
|
-
if (result.displayUrl) {
|
|
53
|
-
formatted += `Display URL: ${result.displayUrl}\n`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (result.snippet) {
|
|
57
|
-
formatted += `Snippet: ${result.snippet}\n`;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (mode === 'detailed' && result.description) {
|
|
61
|
-
formatted += `Content: ${result.description}\n`;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (result.favicon) {
|
|
65
|
-
formatted += `Favicon: ${result.favicon}\n`;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return formatted;
|
|
69
|
-
}).join('\n');
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
content: [
|
|
73
|
-
{
|
|
74
|
-
type: 'text',
|
|
75
|
-
text: formattedResults || 'No results found.'
|
|
76
|
-
}
|
|
77
|
-
]
|
|
78
|
-
};
|
|
79
|
-
}
|
|
40
|
+
export async function searchToolHandler(params) {
|
|
41
|
+
const { query, numResults = 3, mode = 'short' } = params;
|
|
42
|
+
console.log(`Searching for: ${query} (${numResults} results, mode: ${mode})`);
|
|
43
|
+
|
|
44
|
+
const results = await searchDuckDuckGo(query, numResults, mode);
|
|
45
|
+
console.log(`Found ${results.length} results`);
|
|
46
|
+
|
|
47
|
+
// Format results as readable text, similar to other search tools
|
|
48
|
+
const formattedResults = results.map((result, index) => {
|
|
49
|
+
let formatted = `${index + 1}. **${result.title}**\n`;
|
|
50
|
+
formatted += `URL: ${result.url}\n`;
|
|
51
|
+
|
|
52
|
+
if (result.displayUrl) {
|
|
53
|
+
formatted += `Display URL: ${result.displayUrl}\n`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (result.snippet) {
|
|
57
|
+
formatted += `Snippet: ${result.snippet}\n`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (mode === 'detailed' && result.description) {
|
|
61
|
+
formatted += `Content: ${result.description}\n`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (result.favicon) {
|
|
65
|
+
formatted += `Favicon: ${result.favicon}\n`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return formatted;
|
|
69
|
+
}).join('\n');
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: formattedResults || 'No results found.'
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
}
|