خادم MCP - دمج المطوّرين
يتناول هذا الدليل الدمج البرمجي مع خادم finlight MCP. استخدمه لبناء تطبيقات ذكاء اصطناعي مخصّصة، أو أتمتة جلب الأخبار، أو دمج الأخبار المالية في أنظمتك الحالية.
معلومات الخادم
| البيئة | URL |
|---|---|
| الإنتاج | https://mcp.finlight.me |
ينفّذ الخادم MCP (Model Context Protocol) عبر JSON-RPC 2.0 فوق HTTP.
المصادقة
تتطلّب جميع استدعاءات الأدوات مصادقة عبر رمز Bearer. ويعمل مفتاح finlight API الخاص بك كرمز وصول.
Authorization: Bearer YOUR_API_KEY
بالنسبة لتدفّقات OAuth المؤتمتة (مثل Claude Desktop)، ينفّذ الخادم OAuth 2.0 مع PKCE. راجع تدفّق OAuth للتفاصيل.
البدء السريع
باستخدام 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))
الأدوات المتاحة
search_articles
ابحث في مقالات الأخبار المالية مع تصفية متقدّمة وتحليل للمشاعر.
المعاملات:
| المعامل | النوع | الوصف |
|---|---|---|
query | string | استعلام بحث بعوامل منطقية (AND، OR، NOT) ومرشّحات حقول (ticker:AAPL، source:reuters.com) |
tickers | string[] | التصفية حسب رموز التداول (مثل ["AAPL", "NVDA"]) |
sources | string[] | القصر على نطاقات مصادر أخبار محدّدة |
optInSources | string[] | إضافة مصادر إلى المجموعة الافتراضية (بدلًا من الاستبدال) |
excludeSources | string[] | استبعاد مصادر محدّدة من النتائج |
countries | string[] | التصفية حسب رموز الدول ISO 3166-1 alpha-2 |
from | string | تاريخ البدء (YYYY-MM-DD أو ISO 8601) |
to | string | تاريخ الانتهاء (YYYY-MM-DD أو ISO 8601) |
language | string | رمز اللغة (الافتراضي: "en") |
includeContent | boolean | تضمين النص الكامل للمقال (يتطلّب اشتراكًا) |
includeEntities | boolean | تضمين كيانات الشركات الموسومة |
excludeEmptyContent | boolean | تخطّي المقالات بلا محتوى |
order | "ASC" | "DESC" | ترتيب الفرز (الافتراضي: DESC = الأحدث أولًا) |
orderBy | "publishDate" | "createdAt" | "revisedDate" | حقل الفرز — يفرز revisedDate حسب أحدث تاريخ مراجعة |
pageSize | number | النتائج لكل صفحة (1-100، الافتراضي: 20) |
page | number | رقم الصفحة (الافتراضي: 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 الخاص به.
المعاملات:
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
link | string | نعم | عنوان URL الكامل للمقال |
includeContent | boolean | لا | تضمين النص الكامل للمقال |
includeEntities | boolean | لا | تضمين كيانات الشركات الموسومة |
مثال على الطلب:
{
"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- ما إذا كان استرجاع المحتوى الكامل مدعومًا
طرق بروتوكول 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 (مثل Claude Desktop)، ينفّذ الخادم OAuth 2.0 مع PKCE.
نقاط النهاية
| نقطة النهاية | الطريقة | الوصف |
|---|---|---|
/.well-known/oauth-protected-resource | GET | بيانات وصفية للمورد المحمي |
/.well-known/oauth-authorization-server | GET | بيانات وصفية لخادم التفويض |
/register | POST | تسجيل العميل الديناميكي |
/authorize | GET | صفحة التفويض |
/authorize/submit | POST | معالجة التفويض |
/token | POST | استبدال الرمز برمز مميّز |
نظرة عامة على التدفّق
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 الأصلي
معالجة الأخطاء
رموز أخطاء JSON-RPC
| الرمز | الرسالة | الوصف |
|---|---|---|
| -32700 | Parse error | JSON غير صالح |
| -32600 | Invalid Request | غياب jsonrpc أو method |
| -32601 | Method not found | طريقة غير معروفة |
| -32602 | Invalid params | معاملات أداة غير صالحة |
| -32001 | Unauthorized | مفتاح API مفقود أو غير صالح |
| -32603 | Internal error | خطأ من جانب الخادم |
استجابات أخطاء API
تُرجِع استدعاءات الأدوات الفاشلة بنية خطأ:
{
"jsonrpc": "2.0",
"result": {
"isError": true,
"content": [{
"type": "text",
"text": "Error: Invalid API key"
}]
},
"id": 1
}
أخطاء شائعة على مستوى HTTP:
| الحالة | الوصف |
|---|---|
| 401 | مفتاح API غير صالح |
| 403 | الاشتراك لا يسمح بهذه العملية |
| 429 | تم تجاوز حد المعدل |
| 400 | خطأ في التحقّق |
حدود المعدل
تعتمد حدود المعدل على باقة اشتراك finlight الخاصة بك. وعند تجاوز الحدود، تُرجِع الواجهة رمز الحالة 429.
تحقّق من استخدامك وحدودك الحالية على app.finlight.me.
الدعم
- الوثائق: docs.finlight.me
- لوحة التحكم: app.finlight.me
- الدعم: تواصل معنا