Skip to main content
Glama

MCP News Scraper

by sdk03
app.py4.27 kB
from flask import Flask, jsonify, request from mcp.server.fastmcp import FastMCP import logging import requests import time import json # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = Flask(__name__) # MCP server URL with trailing slash MCP_SERVER_URL = "http://localhost:8000/mcp/" def call_mcp_tool(tool_name: str, **kwargs): """Helper function to call MCP tools using JSON-RPC format""" try: payload = { "jsonrpc": "2.0", "id": "1", "method": tool_name, "params": kwargs } headers = { "Content-Type": "application/json", "Accept": "application/json" } response = requests.post( MCP_SERVER_URL, json=payload, headers=headers, timeout=5, allow_redirects=True ) response.raise_for_status() # Parse JSON response result = response.json() if "error" in result: raise Exception(result["error"]) return result.get("result") except requests.exceptions.RequestException as e: logger.error(f"Error calling MCP tool {tool_name}: {str(e)}") raise @app.route('/') def home(): """Home endpoint that shows available endpoints""" return jsonify({ "service": "News Scraper API", "version": "1.0.0", "endpoints": { "/": "This help message", "/ping": "Health check endpoint to verify service status", "/khaleej-times": "Get latest headline from Khaleej Times", "/khaleej-times/all": "Get all main headlines from Khaleej Times", "/khaleej-times/article": "Get full article content (POST with url parameter)" } }) @app.route('/ping') def ping(): """Health check endpoint that verifies both Flask app and MCP server are running""" start_time = time.time() health_status = { "status": "healthy", "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "components": { "flask_app": "healthy", "mcp_server": "unhealthy" }, "response_time_ms": 0 } try: # Check MCP server health using JSON-RPC result = call_mcp_tool("ping") if result == "pong": health_status["components"]["mcp_server"] = "healthy" except requests.exceptions.RequestException as e: logger.error(f"MCP server health check failed: {str(e)}") health_status["status"] = "degraded" # Calculate response time health_status["response_time_ms"] = round((time.time() - start_time) * 1000, 2) # Set overall status if health_status["components"]["mcp_server"] == "unhealthy": health_status["status"] = "degraded" return jsonify(health_status) @app.route('/khaleej-times') def khaleej_times(): """Get latest headline from Khaleej Times""" try: result = call_mcp_tool("get_khaleej_times") return jsonify({"headline": result}) except Exception as e: logger.error(f"Error fetching Khaleej Times headline: {str(e)}") return jsonify({"error": str(e)}), 500 @app.route('/khaleej-times/all') def khaleej_times_all(): """Get all main headlines from Khaleej Times""" try: result = call_mcp_tool("get_khaleej_times_all") return jsonify({"headlines": result}) except Exception as e: logger.error(f"Error fetching all Khaleej Times headlines: {str(e)}") return jsonify({"error": str(e)}), 500 @app.route('/khaleej-times/article', methods=['POST']) def khaleej_times_article(): """Get the full content of a Khaleej Times article""" try: data = request.get_json() if not data or 'url' not in data: return jsonify({"error": "URL parameter is required"}), 400 result = call_mcp_tool("get_khaleej_times_article", url=data['url']) return jsonify(result) except Exception as e: logger.error(f"Error fetching Khaleej Times article: {str(e)}") return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True, port=5000)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sdk03/mcp-news'

If you have feedback or need assistance with the MCP directory API, please join our Discord server