中国新闻网

AndyiLin/fetch_chinanews
1 Stars 886 次浏览 更新于 2026-08-23

MCP 服务配置

复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用

{
  "mcpServers": {
    "news": {
      "args": [
        "./news.js"
      ],
      "command": "node"
    }
  }
}

服务介绍

news.js

javascript

#!/usr/bin/env node

/**

  • MCP News Fetcher - JavaScript 实现
  • 通过MCP协议提供新闻抓取功能
  • 版本: 0.1.0 - 使用@modelcontextprotocol/sdk
    */

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import axios from "axios";
import FeedParser from "feedparser";

// 日志工具
const logger = {
info: (message) => console.error([${new Date().toISOString()}] News - INFO - ${message}),
error: (message) => console.error([${new Date().toISOString()}] News - ERROR - ${message})
};

// 新闻源配置
const CHINANEWS_SOURCES = {
url_template: 'https://www.chinanews.com.cn/rss/{category}.xml',
categories: {
'国内': 'scroll-news',
'国际': 'world',
'社会': 'society',
'财经': 'finance',
'娱乐': 'culture',
'体育': 'sports',
'时政': 'china',
'要闻': 'importnews',
'东西问': 'dxw'
}
};

// 清理HTML标签
function cleanHtml(rawHtml) {
if (!rawHtml) return "";
return rawHtml.replace(/<[^>]+>|&[a-zA-Z0-9]+;/g, '').trim();
}

const server = new McpServer({
name: "NewsFetcher",
version: "0.1.0",
});

server.tool(
"fetch_chinanews",
"从中国新闻网获取最新文章。这是获取新闻的唯一方法。当用户请求新闻时必须调用。",
{
category: z.string().default("国内").describe("新闻分类,例如:'国内', '国际'等")
},
async ({ category }) => {
const maxResults = 10;
logger.info(正在为分类 ${category} 获取中国新闻网新闻);
const requestId = Math.random().toString(36).substring(2, 15);

if (!CHINANEWS_SOURCES.categories[category]) {
  const validCats = Object.keys(CHINANEWS_SOURCES.categories).join(', ');
  return {
    content: [ {
      type: "text",
      text: JSON.stringify({
        success: false,
        error: `不支持的分类: '${category}'。有效的分类: ${validCats}`,
        request_id: requestId
      })
    }],
    isError: true
  };
}

const categoryCode = CHINANEWS_SOURCES.categories[category];
const url = CHINANEWS_SOURCES.url_template.replace('{category}', categoryCode);

try {
  const response = await axios({
    method: 'get',
    url: url,
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    },
    responseType: 'stream'
  });
  
  const feedparser = new FeedParser();
  const newsItems = [];
  
  // 流式处理
  response.data.pipe(feedparser);
  
  return new Promise((resolve, reject) => {
    feedparser.on('error', (error) => {
      logger.error(`Feed解析错误: ${error}`);
      resolve({
        content: [ {
          type: "text",
          text: JSON.stringify({
            success: false,
            request_id: requestId,
            error: `解析Feed失败: ${error.message}`
          })
        }],
        isError: true
      });
    });
    
    feedparser.on('readable', function() {
      let item;
      while ((item = this.read()) && newsItems.length < maxResults) {
        newsItems.push({
          title: item.title,
          summary: cleanHtml(item.description)
        });
      }
    });
    
    feedparser.on('end', () => {
      resolve({
        content: [ {
          type: "text",
          text: JSON.stringify({
            success: true,
            request_id: requestId,
            results: newsItems,
            count: newsItems.length
          })
        }]
      });
    });
  });
} catch (error) {
  logger.error(`请求错误: ${error}`);
  return {
    content: [ {
      type: "text",
      text: JSON.stringify({
        success: false,
        request_id: requestId,
        error: `请求失败: ${error.message}`
      })
    }],
    isError: true
  };
}

}
);javascript
} catch (error) {
logger.error(请求错误: ${error});
return {
content: [{
type: "text",
text: JSON.stringify({
success: false,
request_id: requestId,
error: 请求失败: ${error.message}
})
}],
isError: true
};
}

javascript
} catch (error) {
logger.error(请求错误: ${error});
return {
content: [{
type: "text",
text: JSON.stringify({
success: false,
request_id: requestId,
error: 请求失败: ${error.message}
})
}],
isError: true
};
}

javascript
} catch (error) {
logger.error(请求失败: ${error});
return {
content: [{
type: "text",
text: JSON.stringify({
success: false,
request_id: requestId,
error: 网络错误: ${error.message}
})
}],
isError: true
};
}

javascript
// 启动服务
async function main() {
logger.info("正在启动MCP News服务器");
const transport = new StdioServerTransport();
await server.connect(transport);
logger.info("新闻服务器正在stdio上运行");
}

import { fileURLToPath } from 'node:url';
if (fileURLToPath(import.meta.url) === process.argv[1]) {
main().catch(error => {
logger.error(服务器启动失败: ${error.message});
process.exit(1);
});
}

export default server;

相关 MCP 服务