Skip to content

Latest commit

 

History

History
852 lines (684 loc) · 37.7 KB

File metadata and controls

852 lines (684 loc) · 37.7 KB

Κοινότητα και Συνεισφορές

Πώς να συνεισφέρετε στο MCP: Εργαλεία, Τεκμηρίωση, Κώδικας και Περισσότερα

(Κάντε κλικ στην εικόνα παραπάνω για να δείτε το βίντεο αυτού του μαθήματος)

Επισκόπηση

Αυτό το μάθημα επικεντρώνεται στο πώς να συμμετέχετε στην κοινότητα MCP, να συνεισφέρετε στο οικοσύστημα MCP και να ακολουθείτε τις βέλτιστες πρακτικές για συνεργατική ανάπτυξη. Η κατανόηση του τρόπου συμμετοχής σε έργα ανοιχτού κώδικα MCP είναι απαραίτητη για όσους θέλουν να διαμορφώσουν το μέλλον αυτής της τεχνολογίας.

Στόχοι Μάθησης

Μέχρι το τέλος αυτού του μαθήματος, θα μπορείτε να:

  • Κατανοείτε τη δομή της κοινότητας και του οικοσυστήματος MCP
  • Συμμετέχετε αποτελεσματικά σε φόρουμ και συζητήσεις της κοινότητας MCP
  • Συνεισφέρετε σε αποθετήρια ανοιχτού κώδικα MCP
  • Δημιουργείτε και μοιράζεστε προσαρμοσμένα εργαλεία και διακομιστές MCP
  • Ακολουθείτε βέλτιστες πρακτικές για ανάπτυξη και συνεργασία MCP
  • Ανακαλύπτετε πόρους και πλαίσια της κοινότητας για ανάπτυξη MCP

Το Οικοσύστημα της Κοινότητας MCP

Το οικοσύστημα MCP αποτελείται από διάφορα στοιχεία και συμμετέχοντες που συνεργάζονται για την εξέλιξη του πρωτοκόλλου.

Βασικά Στοιχεία της Κοινότητας

  1. Διαχειριστές Πυρήνα Πρωτοκόλλου: Η επίσημη οργάνωση Model Context Protocol στο GitHub διαχειρίζεται τις βασικές προδιαγραφές MCP και τις υλοποιήσεις αναφοράς.
  2. Προγραμματιστές Εργαλείων: Άτομα και ομάδες που δημιουργούν εργαλεία και διακομιστές MCP.
  3. Πάροχοι Ενσωμάτωσης: Εταιρείες που ενσωματώνουν το MCP στα προϊόντα και τις υπηρεσίες τους.
  4. Τελικοί Χρήστες: Προγραμματιστές και οργανισμοί που χρησιμοποιούν το MCP στις εφαρμογές τους.
  5. Συνεισφέροντες: Μέλη της κοινότητας που συνεισφέρουν κώδικα, τεκμηρίωση ή άλλους πόρους.

Πόροι της Κοινότητας

Επίσημα Κανάλια

Πόροι που Δημιουργούνται από την Κοινότητα

  • Πελάτες MCP - Λίστα πελατών που υποστηρίζουν ενσωματώσεις MCP.
  • Διακομιστές MCP της Κοινότητας - Αυξανόμενη λίστα διακομιστών MCP που έχουν αναπτυχθεί από την κοινότητα.
  • Awesome MCP Servers - Επιλεγμένη λίστα διακομιστών MCP.
  • PulseMCP - Κέντρο κοινότητας & ενημερωτικό δελτίο για την ανακάλυψη πόρων MCP.
  • Discord Server - Συνδεθείτε με προγραμματιστές MCP.
  • Υλοποιήσεις SDK για συγκεκριμένες γλώσσες.
  • Αναρτήσεις σε ιστολόγια και οδηγίες.

Συνεισφορά στο MCP

Τύποι Συνεισφορών

Το οικοσύστημα MCP καλωσορίζει διάφορους τύπους συνεισφορών:

  1. Συνεισφορές Κώδικα:

    • Βελτιώσεις του πυρήνα του πρωτοκόλλου.
    • Διορθώσεις σφαλμάτων.
    • Υλοποιήσεις εργαλείων και διακομιστών.
    • Βιβλιοθήκες πελάτη/διακομιστή σε διαφορετικές γλώσσες.
  2. Τεκμηρίωση:

    • Βελτίωση της υπάρχουσας τεκμηρίωσης.
    • Δημιουργία οδηγών και εκπαιδευτικών υλικών.
    • Μετάφραση τεκμηρίωσης.
    • Δημιουργία παραδειγμάτων και εφαρμογών δείγματος.
  3. Υποστήριξη Κοινότητας:

    • Απαντήσεις σε ερωτήσεις σε φόρουμ και συζητήσεις.
    • Δοκιμή και αναφορά προβλημάτων.
    • Οργάνωση εκδηλώσεων της κοινότητας.
    • Καθοδήγηση νέων συνεισφερόντων.

Διαδικασία Συνεισφοράς: Πυρήνας Πρωτοκόλλου

Για να συνεισφέρετε στον πυρήνα του πρωτοκόλλου MCP ή στις επίσημες υλοποιήσεις, ακολουθήστε αυτές τις αρχές από τις επίσημες οδηγίες συνεισφοράς:

  1. Απλότητα και Ελαχιστοποίηση: Η προδιαγραφή MCP διατηρεί υψηλό επίπεδο για την προσθήκη νέων εννοιών. Είναι πιο εύκολο να προσθέσετε κάτι σε μια προδιαγραφή παρά να το αφαιρέσετε.

  2. Συγκεκριμένη Προσέγγιση: Οι αλλαγές στην προδιαγραφή πρέπει να βασίζονται σε συγκεκριμένες προκλήσεις υλοποίησης, όχι σε υποθετικές ιδέες.

  3. Στάδια μιας Πρότασης:

    • Ορισμός: Εξερευνήστε τον χώρο του προβλήματος, επιβεβαιώστε ότι άλλοι χρήστες MCP αντιμετωπίζουν παρόμοιο ζήτημα.
    • Πρωτότυπο: Δημιουργήστε μια λύση παραδείγματος και δείξτε την πρακτική εφαρμογή της.
    • Συγγραφή: Με βάση το πρωτότυπο, γράψτε μια πρόταση προδιαγραφής.

Ρύθμιση Περιβάλλοντος Ανάπτυξης

# Fork the repository
git clone https://github.com/YOUR-USERNAME/modelcontextprotocol.git
cd modelcontextprotocol

# Install dependencies
npm install

# For schema changes, validate and generate schema.json:
npm run check:schema:ts
npm run generate:schema

# For documentation changes
npm run check:docs
npm run format

# Preview documentation locally (optional):
npm run serve:docs

Παράδειγμα: Συνεισφορά Διόρθωσης Σφάλματος

// Original code with bug in the typescript-sdk
export function validateResource(resource: unknown): resource is MCPResource {
  if (!resource || typeof resource !== 'object') {
    return false;
  }
  
  // Bug: Missing property validation
  // Current implementation:
  const hasName = 'name' in resource;
  const hasSchema = 'schema' in resource;
  
  return hasName && hasSchema;
}

// Fixed implementation in a contribution
export function validateResource(resource: unknown): resource is MCPResource {
  if (!resource || typeof resource !== 'object') {
    return false;
  }
  
  // Improved validation
  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;
}

Παράδειγμα: Συνεισφορά Νέου Εργαλείου στη Βιβλιοθήκη Προτύπων

# Example contribution: A CSV data processing tool for the MCP standard library

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:
            # Extract parameters
            operation = request.parameters.get("operation")
            output_format = request.parameters.get("outputFormat", "json")
            
            # Get CSV data from either direct data or URL
            df = await self._get_dataframe(request)
            
            # Process based on requested operation
            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"""
        # Implementation would include various transformations
        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. Υποβάλετε Στοχευμένα PRs: Κρατήστε τα pull requests εστιασμένα σε ένα μόνο ζήτημα ή δυνατότητα.
  6. Ανταποκριθείτε στην Ανατροφοδότηση: Να είστε δεκτικοί στην ανατροφοδότηση για τις συνεισφορές σας.

Παράδειγμα Ροής Εργασίας Συνεισφοράς

# Clone the repository
git clone https://github.com/modelcontextprotocol/typescript-sdk.git
cd typescript-sdk

# Create a new branch for your contribution
git checkout -b feature/my-contribution

# Make your changes
# ...

# Run tests to ensure your changes don't break existing functionality
npm test

# Commit your changes with a descriptive message
git commit -am "Fix validation in resource handler"

# Push your branch to your fork
git push origin feature/my-contribution

# Create a pull request from your branch to the main repository
# Then engage with feedback and iterate on your PR as needed

Δημιουργία και Μοιρασιά Διακομιστών MCP

Ένας από τους πιο πολύτιμους τρόπους συνεισφοράς στο οικοσύστημα MCP είναι η δημιουργία και μοιρασιά προσαρμοσμένων διακομιστών MCP. Η κοινότητα έχει ήδη αναπτύξει εκατοντάδες διακομιστές για διάφορες υπηρεσίες και περιπτώσεις χρήσης.

Πλαίσια Ανάπτυξης Διακομιστών MCP

Διατίθενται διάφορα πλαίσια για την απλοποίηση της ανάπτυξης διακομιστών MCP:

  1. Επίσημα SDKs:

  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

Παράδειγμα Java: Δημιουργία Πακέτου Maven για Εργαλεία

// pom.xml configuration for a shareable MCP tool package
<!-- 
<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<>();
        // Schema definition...
        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;
            
            // Call weather API
            Map<String, Object> forecast = getForecast(location, days);
            
            // Build response
            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) {
        // Implementation would call weather API
        // Simplified example
        Map<String, Object> result = new HashMap<>();
        // Add forecast data...
        return result;
    }
}

// Build and publish using Maven
// mvn clean package
// mvn deploy

Παράδειγμα Python: Δημοσίευση Πακέτου PyPI

# Directory structure for a PyPI package:
# mcp_nlp_tools/
# ├── LICENSE
# ├── README.md
# ├── setup.py
# ├── mcp_nlp_tools/
# │   ├── __init__.py
# │   ├── sentiment_tool.py
# │   └── translation_tool.py

# Example 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",
)
"""

# Example NLP tool implementation (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"):
        # Load the sentiment analysis model
        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:
            # Extract parameters
            text = request.parameters.get("text")
            include_score = request.parameters.get("includeScore", True)
            
            # Analyze sentiment
            sentiment_result = self.sentiment_analyzer(text)[0]
            
            # Format result
            result = {
                "sentiment": sentiment_result["label"],
                "text": text
            }
            
            if include_score:
                result["score"] = sentiment_result["score"]
            
            # Return result
            return ToolResponse(result=result)
            
        except Exception as e:
            raise ToolExecutionException(f"Sentiment analysis failed: {str(e)}")

# To publish:
# python setup.py sdist bdist_wheel
# python -m twine upload dist/*

Μοιρασιά Βέλτιστων Πρακτικών

Όταν μοιράζεστε εργαλεία MCP με την κοινότητα:

  1. Πλήρης Τεκμηρίωση:

    • Τεκμηριώστε τον σκοπό, τη χρήση και τα παραδείγματα.
    • Εξηγήστε παραμέτρους και τιμές επιστροφής.
    • Τεκμηριώστε τυχόν εξωτερικές εξαρτήσεις.
  2. Διαχείριση Σφαλμάτων:

    • Εφαρμόστε ισχυρή διαχείριση σφαλμάτων.
    • Παρέχετε χρήσιμα μηνύματα σφαλμάτων.
    • Αντιμετωπίστε περιπτώσεις άκρων με χάρη.
  3. Επιδόσεις:

    • Βελτιστοποιήστε για ταχύτητα και χρήση πόρων.
    • Εφαρμόστε caching όπου είναι κατάλληλο.
    • Σκεφτείτε την κλιμάκωση.
  4. Ασφάλεια:

    • Χρησιμοποιήστε ασφαλή κλειδιά API και αυθεντικοποίηση.
    • Επικυρώστε και καθαρίστε τις εισόδους.
    • Εφαρμόστε περιορισμό ρυθμού για εξωτερικές κλήσεις API.
  5. Δοκιμές:

    • Συμπεριλάβετε εκτεταμένη κάλυψη δοκιμών.
    • Δοκιμάστε με διαφορετικούς τύπους εισόδου και περιπτώσεις άκρων.
    • Τεκμηριώστε τις διαδικασίες δοκιμών.

Συνεργασία Κοινότητας και Βέλτιστες Πρακτικές

Η αποτελεσματική συνεργασία είναι το κλειδί για ένα ακμάζον οικοσύστημα MCP.

Κανάλια Επικοινωνίας

  • Θέματα και Συζητήσεις στο GitHub.
  • Microsoft Tech Community.
  • Κανάλια Discord και Slack.
  • Stack Overflow (ετικέτα: model-context-protocol ή mcp).

Ανασκοπήσεις Κώδικα

Κατά την ανασκόπηση συνεισφορών MCP:

  1. Σαφήνεια: Είναι ο κώδικας σαφής και καλά τεκμηριωμένος;
  2. Ορθότητα: Λειτουργεί όπως αναμένεται;
  3. Συνέπεια: Ακολουθεί τις συμβάσεις του έργου;
  4. Πληρότητα: Περιλαμβάνονται δοκιμές και τεκμηρίωση;
  5. Ασφάλεια: Υπάρχουν ανησυχίες για την ασφάλεια;

Συμβατότητα Έκδοσης

Κατά την ανάπτυξη για MCP:

  1. Έκδοση Πρωτοκόλλου: Τηρήστε την έκδοση πρωτοκόλλου MCP που υποστηρίζει το εργαλείο σας.
  2. Συμβατότητα Πελάτη: Σκεφτείτε την συμβατότητα προς τα πίσω.
  3. Συμβατότητα Διακομιστή: Ακολουθήστε τις οδηγίες υλοποίησης διακομιστή.
  4. Σημαντικές Αλλαγές: Τεκμηριώστε σαφώς τυχόν σημαντικές αλλαγές.

Παράδειγμα Κοινοτικού Έργου: Καταχώρηση Εργαλείων MCP

Μια σημαντική συνεισφορά της κοινότητας θα μπορούσε να είναι η ανάπτυξη ενός δημόσιου μητρώου για εργαλεία MCP.

# Example schema for a community tool registry API

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

# Models for the tool registry
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 application for the registry
app = FastAPI(title="MCP Tool Registry")

# In-memory database for this example
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 μπορεί να κυμαίνεται από βελτιώσεις του πυρήνα του πρωτοκόλλου έως προσαρμοσμένα εργαλεία.
  • Η τήρηση των οδηγιών συνεισφοράς αυξάνει τις πιθανότητες αποδοχής του PR σας.
  • Η δημιουργία και μοιρασιά εργαλείων MCP είναι ένας πολύτιμος τρόπος για την ενίσχυση του οικοσυστήματος.
  • Η συνεργασία της κοινότητας είναι απαραίτητη για την ανάπτυξη και βελτίωση του MCP.

Άσκηση

  1. Εντοπίστε έναν τομέα στο οικοσύστημα MCP όπου μπορείτε να κάνετε μια συνεισφορά βάσει των δεξιοτήτων και των ενδιαφερόντων σας.
  2. Κάντε fork το αποθετήριο MCP και ρυθμίστε ένα τοπικό περιβάλλον ανάπτυξης.
  3. Δημιουργήστε μια μικρή βελτίωση, διόρθωση σφάλματος ή εργαλείο που θα ωφελήσει την κοινότητα.
  4. Τεκμηριώστε τη συνεισφορά σας με κατάλληλες δοκιμές και τεκμηρίωση.
  5. Υποβάλετε ένα pull request στο κατάλληλο αποθετήριο.

Πρόσθετοι Πόροι


Επόμενο: Μαθήματα από την Πρώιμη Υιοθέτηση

Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.