crawlforge-mcp-server 3.0.13 → 3.0.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crawlforge-mcp-server",
3
- "version": "3.0.13",
3
+ "version": "3.0.15",
4
4
  "description": "CrawlForge MCP Server - Professional Model Context Protocol server with 19 comprehensive web scraping, crawling, and content processing tools.",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -738,14 +738,16 @@ export class ResearchOrchestrator extends EventEmitter {
738
738
  }
739
739
  });
740
740
 
741
- if (summary.keyPoints) {
742
- summary.keyPoints.forEach((point, index) => {
741
+ // Handle both keypoints (tool output) and keyPoints (legacy) property names
742
+ const keyPoints = summary.keypoints || summary.keyPoints || [];
743
+ if (keyPoints.length > 0) {
744
+ keyPoints.forEach((point, index) => {
743
745
  claims.push({
744
746
  id: `${source.link}_claim_${index}`,
745
747
  claim: point,
746
748
  source: source.link,
747
749
  sourceTitle: source.title,
748
- credibility: source.overallCredibility || 0.5,
750
+ credibility: source.overallCredibility || 0.65,
749
751
  context: summary.supporting?.[index] || '',
750
752
  extractedAt: new Date().toISOString()
751
753
  });
@@ -1080,7 +1082,7 @@ export class ResearchOrchestrator extends EventEmitter {
1080
1082
 
1081
1083
  generateKeyFindings(claimGroups, sources) {
1082
1084
  return claimGroups
1083
- .filter(group => group.avgCredibility >= 0.6)
1085
+ .filter(group => group.avgCredibility >= 0.3)
1084
1086
  .sort((a, b) => b.consensusStrength - a.consensusStrength)
1085
1087
  .slice(0, 10)
1086
1088
  .map(group => ({
@@ -1093,7 +1095,7 @@ export class ResearchOrchestrator extends EventEmitter {
1093
1095
 
1094
1096
  compileSupportingEvidence(sources) {
1095
1097
  return sources
1096
- .filter(source => source.overallCredibility >= 0.7)
1098
+ .filter(source => source.overallCredibility >= 0.3)
1097
1099
  .map(source => ({
1098
1100
  title: source.title,
1099
1101
  url: source.link,
@@ -219,8 +219,8 @@ export class SnapshotManager extends EventEmitter {
219
219
  let isCompressed = false;
220
220
  let isDelta = false;
221
221
 
222
- // Apply delta storage if similar snapshot found
223
- if (deltaInfo && deltaInfo.similarity > this.retentionPolicy.deltaThreshold) {
222
+ // Apply delta storage if similar snapshot found (skip if base content is null, e.g. exact hash match)
223
+ if (deltaInfo && deltaInfo.content && deltaInfo.similarity > this.retentionPolicy.deltaThreshold) {
224
224
  const deltaData = this.createDelta(deltaInfo.content, content);
225
225
  if (deltaData.length < content.length * 0.7) { // Only use delta if it's significantly smaller
226
226
  finalContent = deltaData;
@@ -389,7 +389,7 @@ export class ContentAnalyzer {
389
389
  summarySentences = await this.createAbstractiveSummary(text, targetSentences);
390
390
  }
391
391
 
392
- const summaryText = summarySentences.join('. ').trim() + '.';
392
+ const summaryText = summarySentences.map(s => s.replace(/[.!?]+$/, '').trim()).join('. ').trim() + '.';
393
393
  const compressionRatio = summaryText.length / text.length;
394
394
 
395
395
  return {
@@ -411,8 +411,8 @@ export class ContentAnalyzer {
411
411
  type: 'fallback',
412
412
  length: 'short',
413
413
  sentences: fallbackSentences,
414
- text: fallbackSentences.join('. ').trim() + '.',
415
- compressionRatio: fallbackSentences.join('. ').length / text.length
414
+ text: fallbackSentences.map(s => s.replace(/[.!?]+$/, '').trim()).join('. ').trim() + '.',
415
+ compressionRatio: fallbackSentences.map(s => s.replace(/[.!?]+$/, '').trim()).join('. ').length / text.length
416
416
  };
417
417
  }
418
418
  }