تمت ترجمة هذه الصفحة آليًا. النسخة الإنجليزية هي المصدر وقد تكون أكثر دقة أو أحدث. العرض بالإنجليزية

خادم MCP - دمج المطوّرين

يتناول هذا الدليل الدمج البرمجي مع خادم finlight MCP. استخدمه لبناء تطبيقات ذكاء اصطناعي مخصّصة، أو أتمتة جلب الأخبار، أو دمج الأخبار المالية في أنظمتك الحالية.


INFOنقاط النهاية

معلومات الخادم

البيئةURL
الإنتاجhttps://mcp.finlight.me

ينفّذ الخادم MCP (Model Context Protocol) عبر JSON-RPC 2.0 فوق HTTP.


AUTHمفتاح API

المصادقة

تتطلّب جميع استدعاءات الأدوات مصادقة عبر رمز Bearer. ويعمل مفتاح finlight API الخاص بك كرمز وصول.

Authorization: Bearer YOUR_API_KEY

بالنسبة لتدفّقات OAuth المؤتمتة (مثل Claude Desktop)، ينفّذ الخادم OAuth 2.0 مع PKCE. راجع تدفّق OAuth للتفاصيل.


QUICKSTARTأمثلة

البدء السريع

باستخدام cURL

سرد الأدوات المتاحة:

curl -X POST https://mcp.finlight.me \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'

البحث عن المقالات:

curl -X POST https://mcp.finlight.me \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "search_articles",
      "arguments": {
        "query": "NVIDIA earnings",
        "tickers": ["NVDA"],
        "pageSize": 10
      }
    }
  }'

باستخدام TypeScript

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(
  new URL("https://mcp.finlight.me"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${process.env.FINLIGHT_API_KEY}`,
      },
    },
  }
);

const client = new Client({
  name: "my-app",
  version: "1.0.0",
});

await client.connect(transport);

// List available tools
const tools = await client.listTools();
console.log("Available tools:", tools);

// Search articles
const result = await client.callTool({
  name: "search_articles",
  arguments: {
    query: "Federal Reserve interest rates",
    from: "2024-01-01",
    pageSize: 5,
  },
});

console.log("Articles:", result);

باستخدام Python

import requests
import json

API_KEY = "your-api-key"
MCP_URL = "https://mcp.finlight.me"

def mcp_request(method: str, params: dict = None):
    response = requests.post(
        MCP_URL,
        headers={
            "Content-Type": "application/json",
            "Authorization": f"Bearer {API_KEY}",
        },
        json={
            "jsonrpc": "2.0",
            "id": 1,
            "method": method,
            "params": params or {},
        },
    )
    return response.json()

# List available tools
tools = mcp_request("tools/list")
print("Available tools:", json.dumps(tools, indent=2))

# Search articles
articles = mcp_request("tools/call", {
    "name": "search_articles",
    "arguments": {
        "query": "Tesla Model 3",
        "tickers": ["TSLA"],
        "from": "2024-01-01",
        "pageSize": 10,
    },
})
print("Articles:", json.dumps(articles, indent=2))

TOOLSمرجع

الأدوات المتاحة

search_articles

ابحث في مقالات الأخبار المالية مع تصفية متقدّمة وتحليل للمشاعر.

المعاملات:

المعاملالنوعالوصف
querystringاستعلام بحث بعوامل منطقية (AND، OR، NOT) ومرشّحات حقول (ticker:AAPL، source:reuters.com)
tickersstring[]التصفية حسب رموز التداول (مثل ["AAPL", "NVDA"])
sourcesstring[]القصر على نطاقات مصادر أخبار محدّدة
optInSourcesstring[]إضافة مصادر إلى المجموعة الافتراضية (بدلًا من الاستبدال)
excludeSourcesstring[]استبعاد مصادر محدّدة من النتائج
countriesstring[]التصفية حسب رموز الدول ISO 3166-1 alpha-2
fromstringتاريخ البدء (YYYY-MM-DD أو ISO 8601)
tostringتاريخ الانتهاء (YYYY-MM-DD أو ISO 8601)
languagestringرمز اللغة (الافتراضي: "en")
includeContentbooleanتضمين النص الكامل للمقال (يتطلّب اشتراكًا)
includeEntitiesbooleanتضمين كيانات الشركات الموسومة
excludeEmptyContentbooleanتخطّي المقالات بلا محتوى
order"ASC" | "DESC"ترتيب الفرز (الافتراضي: DESC = الأحدث أولًا)
orderBy"publishDate" | "createdAt" | "revisedDate"حقل الفرز — يفرز revisedDate حسب أحدث تاريخ مراجعة
pageSizenumberالنتائج لكل صفحة (1-100، الافتراضي: 20)
pagenumberرقم الصفحة (الافتراضي: 1)

مثال على الطلب:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_articles",
    "arguments": {
      "query": "earnings report",
      "tickers": ["AAPL", "MSFT"],
      "from": "2024-01-01",
      "to": "2024-03-31",
      "language": "en",
      "pageSize": 20
    }
  }
}

مثال على الاستجابة:

{
  "jsonrpc": "2.0",
  "result": {
    "content": [{
      "type": "text",
      "text": "{\"articles\":[{\"title\":\"Apple Reports Record Q1...\",\"summary\":\"...\",\"link\":\"https://...\",\"publishDate\":\"2024-02-01T16:30:00Z\",\"source\":\"www.reuters.com\",\"sentiment\":\"positive\",\"sentimentConfidence\":0.92}],\"totalResults\":847,\"page\":1,\"pageSize\":20}"
    }]
  },
  "id": 1
}

get_article_by_link

استرجاع مقال محدّد عبر عنوان URL الخاص به.

المعاملات:

المعاملالنوعمطلوبالوصف
linkstringنعمعنوان URL الكامل للمقال
includeContentbooleanلاتضمين النص الكامل للمقال
includeEntitiesbooleanلاتضمين كيانات الشركات الموسومة

مثال على الطلب:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_article_by_link",
    "arguments": {
      "link": "https://www.reuters.com/technology/example-article",
      "includeContent": true,
      "includeEntities": true
    }
  }
}

list_sources

الحصول على جميع مصادر الأخبار المتاحة مع بياناتها الوصفية.

المعاملات: لا شيء

مثال على الطلب:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_sources",
    "arguments": {}
  }
}

تتضمّن الاستجابة:

  • domain - نطاق موقع المصدر
  • isDefaultSource - ما إذا كان مُضمَّنًا في عمليات البحث الافتراضية
  • isContentAvailable - ما إذا كان استرجاع المحتوى الكامل مدعومًا

PROTOCOLJSON-RPC

طرق بروتوكول MCP

ينفّذ الخادم طرق بروتوكول MCP التالية:

الطريقةالوصف
initializeتهيئة جلسة MCP
notifications/initializedتأكيد اكتمال التهيئة
tools/listسرد الأدوات المتاحة ومخطّطاتها
tools/callتنفيذ أداة مع وسائط
pingفحص السلامة

مثال Initialize:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": {
      "name": "my-client",
      "version": "1.0.0"
    }
  }
}

الاستجابة:

{
  "jsonrpc": "2.0",
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "tools": {}
    },
    "serverInfo": {
      "name": "finlight-news-api",
      "version": "1.0.0"
    }
  },
  "id": 1
}

OAUTHالمصادقة

تدفّق OAuth

بالنسبة للعملاء الذين يدعمون OAuth (مثل Claude Desktop)، ينفّذ الخادم OAuth 2.0 مع PKCE.

نقاط النهاية

نقطة النهايةالطريقةالوصف
/.well-known/oauth-protected-resourceGETبيانات وصفية للمورد المحمي
/.well-known/oauth-authorization-serverGETبيانات وصفية لخادم التفويض
/registerPOSTتسجيل العميل الديناميكي
/authorizeGETصفحة التفويض
/authorize/submitPOSTمعالجة التفويض
/tokenPOSTاستبدال الرمز برمز مميّز

نظرة عامة على التدفّق

1. Client discovers OAuth endpoints via .well-known
2. Client optionally registers via /register
3. Client redirects user to /authorize with PKCE challenge
4. User enters API key and submits
5. Server redirects back with authorization code
6. Client exchanges code + verifier for access token
7. Client uses access token as Bearer token for API calls

ميزات الأمان

  • PKCE مطلوب - يمنع اعتراض رمز التفويض
  • رموز ذاتية التشفير - مشفّرة بـ AES-256-GCM، عديمة الحالة
  • رموز قصيرة العمر - تنتهي صلاحيتها خلال 120 ثانية
  • التحقّق من Redirect URI - الرموز مرتبطة بالـ URI الأصلي

ERRORSاستكشاف الأخطاء

معالجة الأخطاء

رموز أخطاء JSON-RPC

الرمزالرسالةالوصف
-32700Parse errorJSON غير صالح
-32600Invalid Requestغياب jsonrpc أو method
-32601Method not foundطريقة غير معروفة
-32602Invalid paramsمعاملات أداة غير صالحة
-32001Unauthorizedمفتاح API مفقود أو غير صالح
-32603Internal errorخطأ من جانب الخادم

استجابات أخطاء API

تُرجِع استدعاءات الأدوات الفاشلة بنية خطأ:

{
  "jsonrpc": "2.0",
  "result": {
    "isError": true,
    "content": [{
      "type": "text",
      "text": "Error: Invalid API key"
    }]
  },
  "id": 1
}

أخطاء شائعة على مستوى HTTP:

الحالةالوصف
401مفتاح API غير صالح
403الاشتراك لا يسمح بهذه العملية
429تم تجاوز حد المعدل
400خطأ في التحقّق

LIMITSالحصص

حدود المعدل

تعتمد حدود المعدل على باقة اشتراك finlight الخاصة بك. وعند تجاوز الحدود، تُرجِع الواجهة رمز الحالة 429.

تحقّق من استخدامك وحدودك الحالية على app.finlight.me.


SUPPORTمساعدة

الدعم