Files
2026-07-13 13:31:35 +08:00

35 KiB

جامعه و مشارکت‌ها

چگونه به MCP کمک کنیم: ابزارها، مستندات، کد و بیشتر

(برای مشاهده ویدیو این درس روی تصویر بالا کلیک کنید)

مروری کلی

این درس بر چگونگی مشارکت در جامعه MCP، کمک به اکوسیستم MCP و پیروی از بهترین شیوه‌ها برای توسعه مشارکتی تمرکز دارد. درک نحوه شرکت در پروژه‌های متن‌باز MCP برای کسانی که می‌خواهند آینده این فناوری را شکل دهند، ضروری است.

اهداف یادگیری

در پایان این درس، قادر خواهید بود:

  • ساختار جامعه و اکوسیستم MCP را درک کنید
  • به طور مؤثر در انجمن‌ها و بحث‌های جامعه MCP شرکت کنید
  • به مخازن متن‌باز MCP کمک کنید
  • ابزارها و سرورهای سفارشی MCP را ایجاد و به اشتراک بگذارید
  • بهترین شیوه‌ها را برای توسعه و همکاری در MCP دنبال کنید
  • منابع و چارچوب‌های جامعه برای توسعه MCP را کشف کنید

اکوسیستم جامعه MCP

اکوسیستم MCP از اجزای مختلف و شرکت‌کنندگانی تشکیل شده است که با هم برای پیشرفت پروتکل همکاری می‌کنند.

اجزای کلیدی جامعه

  1. نگهدارندگان اصلی پروتکل: سازمان گیت‌هاب رسمی Model Context Protocol مشخصات اصلی MCP و پیاده‌سازی‌های مرجع را نگه‌داری می‌کند
  2. توسعه‌دهندگان ابزارها: افراد و تیم‌هایی که ابزارها و سرورهای MCP را می‌سازند
  3. ارائه‌دهندگان ادغام: شرکت‌هایی که MCP را در محصولات و خدمات خود ادغام می‌کنند
  4. کاربران نهایی: توسعه‌دهندگان و سازمان‌هایی که MCP را در برنامه‌های خود استفاده می‌کنند
  5. مشارکت‌کنندگان: اعضای جامعه که کد، مستندات یا سایر منابع را ارائه می‌دهند

منابع جامعه

کانال‌های رسمی

منابع جامعه‌محور

  • کلاینت‌های MCP - فهرستی از کلاینت‌هایی که از ادغام MCP پشتیبانی می‌کنند
  • سرورهای جامعه MCP - فهرست در حال رشد سرورهای توسعه‌یافته توسط جامعه MCP
  • سرورهای عالی MCP - فهرست منتخب سرورهای MCP
  • PulseMCP - مرکز و خبرنامه جامعه برای کشف منابع MCP
  • سرور دیسکورد - ارتباط با توسعه‌دهندگان MCP
  • پیاده‌سازی‌های SDK مخصوص زبان‌ها
  • پست‌های وبلاگی و آموزش‌ها

مشارکت در MCP

انواع مشارکت‌ها

اکوسیستم MCP انواع مختلفی از مشارکت‌ها را می‌پذیرد:

  1. مشارکت‌های کد:

    • بهبودهای اصلی پروتکل
    • رفع اشکال
    • پیاده‌سازی ابزارها و سرورها
    • کتابخانه‌های کلاینت/سرور در زبان‌های مختلف
  2. مستندسازی:

    • بهبود مستندات موجود
    • ایجاد آموزش‌ها و راهنماها
    • ترجمه مستندات
    • ساخت نمونه‌ها و برنامه‌های نمونه
  3. پشتیبانی جامعه:

    • پاسخ به سوالات در انجمن‌ها و بحث‌ها
    • تست و گزارش مشکلات
    • سازماندهی رویدادهای جامعه
    • راهنمایی و مربی‌گری مشارکت‌کنندگان جدید

روند مشارکت: پروتکل اصلی

برای مشارکت در پروتکل اصلی MCP یا پیاده‌سازی‌های رسمی، اصول زیر از راهنمای مشارکت رسمی را دنبال کنید:

  1. سادگی و مینیمالیسم: مشخصات MCP معیار بالایی برای اضافه کردن مفاهیم جدید دارد. اضافه کردن چیزها به مشخصات آسان‌تر از حذف آن‌ها است.

  2. رویکرد مشخص و ملموس: تغییرات مشخصات باید بر اساس چالش‌های پیاده‌سازی خاص باشد، نه ایده‌های احتمالی.

  3. مراحل پیشنهاد:

    • تعریف: بررسی فضای مسئله و اطمینان از اینکه سایر کاربران MCP با مشکل مشابهی مواجه هستند
    • نمونه‌سازی: ساختن یک راه‌حل نمونه و نمایش کاربرد عملی آن
    • نوشتن: نوشتن پیشنهاد مشخصات بر اساس نمونه اولیه

راه‌اندازی محیط توسعه

# بازکردن شاخه جداگانه از مخزن
git clone https://github.com/YOUR-USERNAME/modelcontextprotocol.git
cd modelcontextprotocol

# نصب وابستگی‌ها
npm install

# برای تغییرات ساختار، اعتبارسنجی و ایجاد schema.json:
npm run check:schema:ts
npm run generate:schema

# برای تغییرات مستندسازی
npm run check:docs
npm run format

# پیش‌نمایش مستندات به‌صورت محلی (اختیاری):
npm run serve:docs

مثال: مشارکت با رفع اشکال

// کد اصلی با باگی در typescript-sdk
export function validateResource(resource: unknown): resource is MCPResource {
  if (!resource || typeof resource !== 'object') {
    return false;
  }
  
  // باگ: عدم وجود اعتبارسنجی ویژگی
  // پیاده‌سازی فعلی:
  const hasName = 'name' in resource;
  const hasSchema = 'schema' in resource;
  
  return hasName && hasSchema;
}

// پیاده‌سازی اصلاح‌شده در یک مشارکت
export function validateResource(resource: unknown): resource is MCPResource {
  if (!resource || typeof resource !== 'object') {
    return false;
  }
  
  // اعتبارسنجی بهبود یافته
  const hasName = 'name' in resource && typeof (resource as MCPResource).name === 'string';
  const hasSchema = 'schema' in resource && typeof (resource as MCPResource).schema === 'object';
  const hasDescription = !('description' in resource) || typeof (resource as MCPResource).description === 'string';
  
  return hasName && hasSchema && hasDescription;
}

مثال: مشارکت با افزودن ابزار جدید به کتابخانه استاندارد

# ابزار پردازش داده CSV برای کتابخانه استاندارد MCP

from mcp_tools import Tool, ToolRequest, ToolResponse, ToolExecutionException
import pandas as pd
import io
import json
from typing import Dict, Any, List, Optional

class CsvProcessingTool(Tool):
    """
    Tool for processing and analyzing CSV data.
    
    This tool allows models to extract information from CSV files,
    run basic analysis, and convert data between formats.
    """
    
    def get_name(self):
        return "csvProcessor"
        
    def get_description(self):
        return "Processes and analyzes CSV data"
    
    def get_schema(self):
        return {
            "type": "object",
            "properties": {
                "csvData": {
                    "type": "string", 
                    "description": "CSV data as a string"
                },
                "csvUrl": {
                    "type": "string",
                    "description": "URL to a CSV file (alternative to csvData)"
                },
                "operation": {
                    "type": "string",
                    "enum": ["summary", "filter", "transform", "convert"],
                    "description": "Operation to perform on the CSV data"
                },
                "filterColumn": {
                    "type": "string",
                    "description": "Column to filter by (for filter operation)"
                },
                "filterValue": {
                    "type": "string",
                    "description": "Value to filter for (for filter operation)"
                },
                "outputFormat": {
                    "type": "string",
                    "enum": ["json", "csv", "markdown"],
                    "default": "json",
                    "description": "Output format for the processed data"
                }
            },
            "oneOf": [
                {"required": ["csvData", "operation"]},
                {"required": ["csvUrl", "operation"]}
            ]
        }
    
    async def execute_async(self, request: ToolRequest) -> ToolResponse:
        try:
            # استخراج پارامترها
            operation = request.parameters.get("operation")
            output_format = request.parameters.get("outputFormat", "json")
            
            # دریافت داده‌های CSV از داده مستقیم یا URL
            df = await self._get_dataframe(request)
            
            # پردازش بر اساس عملیات درخواستی
            result = {}
            
            if operation == "summary":
                result = self._generate_summary(df)
            elif operation == "filter":
                column = request.parameters.get("filterColumn")
                value = request.parameters.get("filterValue")
                if not column:
                    raise ToolExecutionException("filterColumn is required for filter operation")
                result = self._filter_data(df, column, value)
            elif operation == "transform":
                result = self._transform_data(df, request.parameters)
            elif operation == "convert":
                result = self._convert_format(df, output_format)
            else:
                raise ToolExecutionException(f"Unknown operation: {operation}")
            
            return ToolResponse(result=result)
        
        except Exception as e:
            raise ToolExecutionException(f"CSV processing failed: {str(e)}")
    
    async def _get_dataframe(self, request: ToolRequest) -> pd.DataFrame:
        """Gets a pandas DataFrame from either CSV data or URL"""
        if "csvData" in request.parameters:
            csv_data = request.parameters.get("csvData")
            return pd.read_csv(io.StringIO(csv_data))
        elif "csvUrl" in request.parameters:
            csv_url = request.parameters.get("csvUrl")
            return pd.read_csv(csv_url)
        else:
            raise ToolExecutionException("Either csvData or csvUrl must be provided")
    
    def _generate_summary(self, df: pd.DataFrame) -> Dict[str, Any]:
        """Generates a summary of the CSV data"""
        return {
            "columns": df.columns.tolist(),
            "rowCount": len(df),
            "columnCount": len(df.columns),
            "numericColumns": df.select_dtypes(include=['number']).columns.tolist(),
            "categoricalColumns": df.select_dtypes(include=['object']).columns.tolist(),
            "sampleRows": json.loads(df.head(5).to_json(orient="records")),
            "statistics": json.loads(df.describe().to_json())
        }
    
    def _filter_data(self, df: pd.DataFrame, column: str, value: str) -> Dict[str, Any]:
        """Filters the DataFrame by a column value"""
        if column not in df.columns:
            raise ToolExecutionException(f"Column '{column}' not found")
            
        filtered_df = df[df[column].astype(str).str.contains(value)]
        
        return {
            "originalRowCount": len(df),
            "filteredRowCount": len(filtered_df),
            "data": json.loads(filtered_df.to_json(orient="records"))
        }
    
    def _transform_data(self, df: pd.DataFrame, params: Dict[str, Any]) -> Dict[str, Any]:
        """Transforms the data based on parameters"""
        # پیاده‌سازی شامل تبدیل‌های مختلف خواهد بود
        return {
            "status": "success",
            "message": "Transformation applied"
        }
    
    def _convert_format(self, df: pd.DataFrame, format: str) -> Dict[str, Any]:
        """Converts the DataFrame to different formats"""
        if format == "json":
            return {
                "data": json.loads(df.to_json(orient="records")),
                "format": "json"
            }
        elif format == "csv":
            return {
                "data": df.to_csv(index=False),
                "format": "csv"
            }
        elif format == "markdown":
            return {
                "data": df.to_markdown(),
                "format": "markdown"
            }
        else:
            raise ToolExecutionException(f"Unsupported output format: {format}")

دستورالعمل‌های مشارکت

برای یک مشارکت موفق در پروژه‌های MCP:

  1. کوچک شروع کنید: با مستندسازی، رفع اشکال یا بهبودهای کوچک شروع کنید
  2. دستورالعمل سبک کدنویسی را دنبال کنید: به سبک کد و قراردادهای پروژه احترام بگذارید
  3. تست بنویسید: شامل تست‌های واحد برای مشارکت‌های کدتان باشید
  4. کار خود را مستندسازی کنید: مستندسازی واضح برای ویژگی‌ها یا تغییرات جدید اضافه کنید
  5. درخواست‌های کشش هدفمند ارسال کنید: درخواست‌ها را برای یک مسئله یا ویژگی خاص نگه دارید
  6. به بازخورد پاسخ دهید: نسبت به بازخوردهای ارائه‌شده پاسخگو باشید

نمونه روند مشارکت

# مخزن را کلون کنید
git clone https://github.com/modelcontextprotocol/typescript-sdk.git
cd typescript-sdk

# یک شاخه‌ی جدید برای مشارکت خود ایجاد کنید
git checkout -b feature/my-contribution

# تغییرات خود را اعمال کنید
# …

# تست‌ها را اجرا کنید تا مطمئن شوید تغییرات شما عملکرد موجود را خراب نمی‌کند
npm test

# تغییرات خود را با یک پیام توصیفی ارسال کنید
git commit -am "Fix validation in resource handler"

# شاخه‌ی خود را به فورک خود پوش کنید
git push origin feature/my-contribution

# یک درخواست Pull از شاخه‌تان به مخزن اصلی ایجاد کنید
# سپس با بازخوردها در تعامل باشید و در صورت نیاز روی PR خود اصلاحات انجام دهید

ایجاد و به اشتراک‌گذاری سرورهای MCP

یکی از ارزشمندترین روش‌ها برای کمک به اکوسیستم MCP، ایجاد و به اشتراک‌گذاری سرورهای سفارشی MCP است. جامعه تاکنون صدها سرور برای خدمات و موارد استفاده مختلف ساخته است.

چارچوب‌های توسعه سرور MCP

چندین چارچوب برای ساده‌سازی توسعه سرور MCP موجود است:

  1. SDKهای رسمی (مطابق با مشخصات MCP 2025-11-25):

  2. چارچوب‌های جامعه‌محور:

توسعه ابزارهای قابل اشتراک‌گذاری

مثال .NET: ساخت بسته ابزار قابل اشتراک‌گذاری

// Create a new .NET library project
// dotnet new classlib -n McpFinanceTools

using Microsoft.Mcp.Tools;
using System.Threading.Tasks;
using System.Net.Http;
using System.Text.Json;

namespace McpFinanceTools
{
    // Stock quote tool
    public class StockQuoteTool : IMcpTool
    {
        private readonly HttpClient _httpClient;
        
        public StockQuoteTool(HttpClient httpClient = null)
        {
            _httpClient = httpClient ?? new HttpClient();
        }
        
        public string Name => "stockQuote";
        public string Description => "Gets current stock quotes for specified symbols";
        
        public object GetSchema()
        {
            return new {
                type = "object",
                properties = new {
                    symbol = new { 
                        type = "string",
                        description = "Stock symbol (e.g., MSFT, AAPL)" 
                    },
                    includeHistory = new { 
                        type = "boolean",
                        description = "Whether to include historical data",
                        default = false
                    }
                },
                required = new[] { "symbol" }
            };
        }
        
        public async Task<ToolResponse> ExecuteAsync(ToolRequest request)
        {
            // Extract parameters
            string symbol = request.Parameters.GetProperty("symbol").GetString();
            bool includeHistory = false;
            
            if (request.Parameters.TryGetProperty("includeHistory", out var historyProp))
            {
                includeHistory = historyProp.GetBoolean();
            }
            
            // Call external API (example)
            var quoteResult = await GetStockQuoteAsync(symbol);
            
            // Add historical data if requested
            if (includeHistory)
            {
                var historyData = await GetStockHistoryAsync(symbol);
                quoteResult.Add("history", historyData);
            }
            
            // Return formatted result
            return new ToolResponse {
                Result = JsonSerializer.SerializeToElement(quoteResult)
            };
        }
        
        private async Task<Dictionary<string, object>> GetStockQuoteAsync(string symbol)
        {
            // Implementation would call a real stock API
            // This is a simplified example
            return new Dictionary<string, object>
            {
                ["symbol"] = symbol,
                ["price"] = 123.45,
                ["change"] = 2.5,
                ["percentChange"] = 1.2,
                ["lastUpdated"] = DateTime.UtcNow
            };
        }
        
        private async Task<object> GetStockHistoryAsync(string symbol)
        {
            // Implementation would get historical data
            // Simplified example
            return new[]
            {
                new { date = DateTime.Now.AddDays(-7).Date, price = 120.25 },
                new { date = DateTime.Now.AddDays(-6).Date, price = 122.50 },
                new { date = DateTime.Now.AddDays(-5).Date, price = 121.75 }
                // More historical data...
            };
        }
    }
}

// Create package and publish to NuGet
// dotnet pack -c Release
// dotnet nuget push bin/Release/McpFinanceTools.1.0.0.nupkg -s https://api.nuget.org/v3/index.json -k YOUR_API_KEY

مثال جاوا: ساخت بسته Maven برای ابزارها

// پیکربندی pom.xml برای بسته ابزار MCP قابل اشتراک گذاری
<!-- 
<project>
    <groupId>com.example</groupId>
    <artifactId>mcp-weather-tools</artifactId>
    <version>1.0.0</version>
    
    <dependencies>
        <dependency>
            <groupId>com.mcp</groupId>
            <artifactId>mcp-server</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    
    <distributionManagement>
        <repository>
            <id>github</id>
            <name>GitHub Packages</name>
            <url>https://maven.pkg.github.com/username/mcp-weather-tools</url>
        </repository>
    </distributionManagement>
</project>
-->

package com.example.mcp.weather;

import com.mcp.tools.Tool;
import com.mcp.tools.ToolRequest;
import com.mcp.tools.ToolResponse;
import com.mcp.tools.ToolExecutionException;

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

public class WeatherForecastTool implements Tool {
    private final HttpClient httpClient;
    private final String apiKey;
    
    public WeatherForecastTool(String apiKey) {
        this.httpClient = HttpClient.newHttpClient();
        this.apiKey = apiKey;
    }
    
    @Override
    public String getName() {
        return "weatherForecast";
    }
    
    @Override
    public String getDescription() {
        return "Gets weather forecast for a specified location";
    }
    
    @Override
    public Object getSchema() {
        Map<String, Object> schema = new HashMap<>();
        // تعریف طرح‌واره...
        return schema;
    }
    
    @Override
    public ToolResponse execute(ToolRequest request) {
        try {
            String location = request.getParameters().get("location").asText();
            int days = request.getParameters().has("days") ? 
                request.getParameters().get("days").asInt() : 3;
            
            // فراخوانی API آب و هوا
            Map<String, Object> forecast = getForecast(location, days);
            
            // ساخت پاسخ
            return new ToolResponse.Builder()
                .setResult(forecast)
                .build();
        } catch (Exception ex) {
            throw new ToolExecutionException("Weather forecast failed: " + ex.getMessage(), ex);
        }
    }
    
    private Map<String, Object> getForecast(String location, int days) {
        // پیاده‌سازی فراخوانی API آب و هوا خواهد بود
        // مثال ساده‌شده
        Map<String, Object> result = new HashMap<>();
        // افزودن داده‌های پیش‌بینی...
        return result;
    }
}

// ساخت و انتشار با استفاده از Maven
// mvn clean package
// mvn deploy

مثال پایتون: انتشار بسته در PyPI

# ساختار دایرکتوری برای یک بسته PyPI:
# mcp_nlp_tools/
# ├── LICENSE
# ├── README.md
# ├── setup.py
# ├── mcp_nlp_tools/
# │   ├── __init__.py
# │   ├── sentiment_tool.py
# │   └── translation_tool.py

# مثال setup.py
"""
from setuptools import setup, find_packages

setup(
    name="mcp_nlp_tools",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "mcp_server>=1.0.0",
        "transformers>=4.0.0",
        "torch>=1.8.0"
    ],
    author="Your Name",
    author_email="your.email@example.com",
    description="MCP tools for natural language processing tasks",
    long_description=open("README.md").read(),
    long_description_content_type="text/markdown",
    url="https://github.com/username/mcp_nlp_tools",
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires=">=3.8",
)
"""

# نمونه پیاده‌سازی ابزار پردازش زبان طبیعی (sentiment_tool.py)
from mcp_tools import Tool, ToolRequest, ToolResponse, ToolExecutionException
from transformers import pipeline
import torch

class SentimentAnalysisTool(Tool):
    """MCP tool for sentiment analysis of text"""
    
    def __init__(self, model_name="distilbert-base-uncased-finetuned-sst-2-english"):
        # بارگذاری مدل تحلیل احساسات
        self.sentiment_analyzer = pipeline("sentiment-analysis", model=model_name)
    
    def get_name(self):
        return "sentimentAnalysis"
        
    def get_description(self):
        return "Analyzes the sentiment of text, classifying it as positive or negative"
    
    def get_schema(self):
        return {
            "type": "object",
            "properties": {
                "text": {
                    "type": "string", 
                    "description": "The text to analyze for sentiment"
                },
                "includeScore": {
                    "type": "boolean",
                    "description": "Whether to include confidence scores",
                    "default": True
                }
            },
            "required": ["text"]
        }
    
    async def execute_async(self, request: ToolRequest) -> ToolResponse:
        try:
            # استخراج پارامترها
            text = request.parameters.get("text")
            include_score = request.parameters.get("includeScore", True)
            
            # تحلیل احساسات
            sentiment_result = self.sentiment_analyzer(text)[0]
            
            # فرمت‌بندی نتیجه
            result = {
                "sentiment": sentiment_result["label"],
                "text": text
            }
            
            if include_score:
                result["score"] = sentiment_result["score"]
            
            # بازگرداندن نتیجه
            return ToolResponse(result=result)
            
        except Exception as e:
            raise ToolExecutionException(f"Sentiment analysis failed: {str(e)}")

# برای انتشار:
# python setup.py sdist bdist_wheel
# python -m twine upload dist/*

اشتراک بهترین شیوه‌ها

هنگام به اشتراک‌گذاری ابزارهای MCP با جامعه:

  1. مستندات کامل:

    • هدف، استفاده و نمونه‌ها را مستندسازی کنید
    • پارامترها و مقادیر بازگشتی را توضیح دهید
    • وابستگی‌های خارجی را مستندسازی کنید
  2. مدیریت خطا:

    • مدیریت خطای قوی پیاده‌سازی کنید
    • پیام‌های خطای مفید ارائه دهید
    • حالت‌های کران را به درستی هندل کنید
  3. ملاحظات عملکردی:

    • برای سرعت و مصرف منابع بهینه کنید
    • در صورت لزوم کشینگ را پیاده‌سازی کنید
    • مقیاس‌پذیری را در نظر بگیرید
  4. امنیت:

    • از کلیدها و اعتبارسنجی‌های ایمن استفاده کنید
    • ورودی‌ها را اعتبارسنجی و پاکسازی کنید
    • محدودیت نرخ برای تماس‌های API خارجی اعمال کنید
  5. آزمایش:

    • پوشش تست جامع داشته باشید
    • با انواع ورودی و حالت‌های کران تست کنید
    • روش‌های تست را مستندسازی کنید

همکاری در جامعه و بهترین شیوه‌ها

همکاری مؤثر کلید یک اکوسیستم MCP پویا است.

کانال‌های ارتباطی

  • Issues و Discussions در گیت‌هاب
  • جامعه فنی مایکروسافت
  • کانال‌های Discord و Slack
  • Stack Overflow (برچسب: model-context-protocol یا mcp)

بازبینی کد

هنگام بازبینی مشارکت‌های MCP:

  1. وضوح: آیا کد واضح و مستندسازی شده است؟
  2. درستی: آیا طبق انتظار کار می‌کند؟
  3. یکدستی: آیا با قراردادهای پروژه مطابقت دارد؟
  4. کامل بودن: آیا تست و مستندات اضافه شده است؟
  5. امنیت: آیا نگرانی‌های امنیتی وجود دارد؟

سازگاری نسخه

هنگام توسعه برای MCP:

  1. نسخه پروتکل: با نسخه پروتکلی که ابزار شما پشتیبانی می‌کند همسو باشید
  2. سازگاری کلاینت: سازگاری به عقب را در نظر بگیرید
  3. سازگاری سرور: دستورالعمل‌های پیاده‌سازی سرور را دنبال کنید
  4. تغییرات شکستن‌ساز: هر تغییر شکستن‌سازی به وضوح مستندسازی شود

پروژه نمونه جامعه: رجیستری ابزار MCP

یکی از مشارکت‌های مهم جامعه می‌تواند ایجاد یک رجیستری عمومی برای ابزارهای MCP باشد.

# نمونه طرح برای رابط برنامه‌نویسی ثبت ابزار جامعه

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, Field, HttpUrl
from typing import List, Optional
import datetime
import uuid

# مدل‌ها برای ثبت ابزار
class ToolSchema(BaseModel):
    """JSON Schema for a tool"""
    type: str
    properties: dict
    required: List[str] = []

class ToolRegistration(BaseModel):
    """Information for registering a tool"""
    name: str = Field(..., description="Unique name for the tool")
    description: str = Field(..., description="Description of what the tool does")
    version: str = Field(..., description="Semantic version of the tool")
    schema: ToolSchema = Field(..., description="JSON Schema for tool parameters")
    author: str = Field(..., description="Author of the tool")
    repository: Optional[HttpUrl] = Field(None, description="Repository URL")
    documentation: Optional[HttpUrl] = Field(None, description="Documentation URL")
    package: Optional[HttpUrl] = Field(None, description="Package URL")
    tags: List[str] = Field(default_factory=list, description="Tags for categorization")
    examples: List[dict] = Field(default_factory=list, description="Example usage")

class Tool(ToolRegistration):
    """Tool with registry metadata"""
    id: uuid.UUID = Field(default_factory=uuid.uuid4)
    created_at: datetime.datetime = Field(default_factory=datetime.datetime.now)
    updated_at: datetime.datetime = Field(default_factory=datetime.datetime.now)
    downloads: int = Field(default=0)
    rating: float = Field(default=0.0)
    ratings_count: int = Field(default=0)

# برنامه FastAPI برای ثبت
app = FastAPI(title="MCP Tool Registry")

# پایگاه داده در حافظه برای این نمونه
tools_db = {}

@app.post("/tools", response_model=Tool)
async def register_tool(tool: ToolRegistration):
    """Register a new tool in the registry"""
    if tool.name in tools_db:
        raise HTTPException(status_code=400, detail=f"Tool '{tool.name}' already exists")
    
    new_tool = Tool(**tool.dict())
    tools_db[tool.name] = new_tool
    return new_tool

@app.get("/tools", response_model=List[Tool])
async def list_tools(tag: Optional[str] = None):
    """List all registered tools, optionally filtered by tag"""
    if tag:
        return [tool for tool in tools_db.values() if tag in tool.tags]
    return list(tools_db.values())

@app.get("/tools/{tool_name}", response_model=Tool)
async def get_tool(tool_name: str):
    """Get information about a specific tool"""
    if tool_name not in tools_db:
        raise HTTPException(status_code=404, detail=f"Tool '{tool_name}' not found")
    return tools_db[tool_name]

@app.delete("/tools/{tool_name}")
async def delete_tool(tool_name: str):
    """Delete a tool from the registry"""
    if tool_name not in tools_db:
        raise HTTPException(status_code=404, detail=f"Tool '{tool_name}' not found")
    del tools_db[tool_name]
    return {"message": f"Tool '{tool_name}' deleted"}

نکات کلیدی

  • جامعه MCP متنوع است و انواع مشارکت‌ها را می‌پذیرد
  • مشارکت در MCP می‌تواند از بهبود پروتکل اصلی تا ابزارهای سفارشی متغیر باشد
  • پیروی از راهنمایی‌های مشارکت شانس پذیرش درخواست‌های کشش شما را افزایش می‌دهد
  • ایجاد و به اشتراک‌گذاری ابزارهای MCP راهی ارزشمند برای بهبود اکوسیستم است
  • همکاری جامعه برای رشد و بهبود MCP ضروری است

تمرین

  1. یک حوزه در اکوسیستم MCP که بر اساس مهارت‌ها و علاقه‌مندی‌های خود می‌توانید مشارکت کنید را شناسایی کنید
  2. مخزن MCP را فورک کنید و محیط توسعه محلی را راه‌اندازی کنید
  3. یک بهبود کوچک، رفع اشکال یا ابزار مفید برای جامعه ایجاد کنید
  4. مشارکت خود را با تست‌های مناسب و مستندسازی مستند کنید
  5. یک درخواست کشش به مخزن مناسب ارسال کنید

منابع بیشتر


ادامه بعدی

بعدی: درس‌هایی از پذیرش زودهنگام


سلب مسئولیت: این سند با استفاده از سرویس ترجمه ماشینی Co-op Translator ترجمه شده است. هرچند ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نواقصی باشند. سند اصلی به زبان مبدأ باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، استفاده از ترجمه تخصصی انسانی توصیه می‌شود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.