Discover Awesome MCP Servers
Extend your agent with 26,843 capabilities via MCP servers.
- All26,843
- Developer Tools3,867
- Search1,714
- Research & Data1,557
- AI Integration Systems229
- Cloud Platforms219
- Data & App Analysis181
- Database Interaction177
- Remote Shell Execution165
- Browser Automation147
- Databases145
- Communication137
- AI Content Generation127
- OS Automation120
- Programming Docs Access109
- Content Fetching108
- Note Taking97
- File Systems96
- Version Control93
- Finance91
- Knowledge & Memory90
- Monitoring79
- Security71
- Image & Video Processing69
- Digital Note Management66
- AI Memory Systems62
- Advanced AI Reasoning59
- Git Management Tools58
- Cloud Storage51
- Entertainment & Media43
- Virtualization42
- Location Services35
- Web Automation & Stealth32
- Media Content Processing32
- Calendar Management26
- Ecommerce & Retail18
- Speech Processing18
- Customer Data Platforms16
- Travel & Transportation14
- Education & Learning Tools13
- Home Automation & IoT13
- Web Search Integration12
- Health & Wellness10
- Customer Support10
- Marketing9
- Games & Gamification8
- Google Cloud Integrations7
- Art & Culture4
- Language Translation3
- Legal & Compliance2
unichat-ts-mcp-server
Kirim permintaan ke OpenAI, MistralAI, Anthropic, xAI, atau Google AI menggunakan protokol MCP melalui alat atau perintah yang telah ditentukan sebelumnya. Kunci API Vendor diperlukan. Baik mekanisme transportasi STDIO maupun SSE didukung melalui argumen.
MCP Server Template for Cursor IDE
Berikut adalah templat untuk membuat alat khusus untuk Cursor IDE menggunakan Model Context Protocol (MCP), memungkinkan pengembang untuk memperluas fungsionalitas Cursor dengan alat berbasis server mereka sendiri: ```python # Import necessary libraries import asyncio import json import websockets # Define the server address and port SERVER_ADDRESS = "localhost" SERVER_PORT = 8765 # Define the tool's name and description TOOL_NAME = "My Custom Tool" TOOL_DESCRIPTION = "This tool performs a specific task using a server-side process." # Define the function to handle incoming messages from Cursor async def handle_message(websocket, path): try: async for message in websocket: data = json.loads(message) print(f"Received message: {data}") # Process the message based on its type if data["type"] == "initialize": # Respond to the initialization request response = { "type": "initializeResponse", "toolName": TOOL_NAME, "toolDescription": TOOL_DESCRIPTION, "capabilities": { # Define the tool's capabilities here, e.g., # "codeCompletion": True, # "codeActions": True, # "hoverInformation": True } } await websocket.send(json.dumps(response)) elif data["type"] == "codeCompletionRequest": # Handle code completion requests # Implement your code completion logic here # Example: prefix = data["prefix"] completions = ["completion1", "completion2", "completion3"] # Replace with your logic response = { "type": "codeCompletionResponse", "requestId": data["requestId"], "completions": completions } await websocket.send(json.dumps(response)) elif data["type"] == "codeActionRequest": # Handle code action requests # Implement your code action logic here # Example: code_actions = [{"title": "My Code Action", "command": "my.code.action"}] # Replace with your logic response = { "type": "codeActionResponse", "requestId": data["requestId"], "codeActions": code_actions } await websocket.send(json.dumps(response)) elif data["type"] == "hoverInformationRequest": # Handle hover information requests # Implement your hover information logic here # Example: hover_information = "This is hover information for the selected element." # Replace with your logic response = { "type": "hoverInformationResponse", "requestId": data["requestId"], "hoverInformation": hover_information } await websocket.send(json.dumps(response)) else: # Handle unknown message types print(f"Unknown message type: {data['type']}") except websockets.exceptions.ConnectionClosedError: print("Connection closed unexpectedly.") except Exception as e: print(f"An error occurred: {e}") # Start the WebSocket server async def main(): async with websockets.serve(handle_message, SERVER_ADDRESS, SERVER_PORT): print(f"Server started at ws://{SERVER_ADDRESS}:{SERVER_PORT}") await asyncio.Future() # Run forever if __name__ == "__main__": asyncio.run(main()) ``` **Penjelasan:** * **Import Libraries:** Mengimpor library `asyncio` untuk pemrograman asinkron dan `websockets` untuk komunikasi WebSocket. * **Server Configuration:** Mendefinisikan alamat dan port server. Pastikan port ini tersedia dan tidak digunakan oleh aplikasi lain. * **Tool Information:** Mendefinisikan nama dan deskripsi alat. Informasi ini akan ditampilkan di Cursor. * **`handle_message` Function:** Fungsi ini menangani semua pesan yang diterima dari Cursor. * **`initialize`:** Menanggapi permintaan inisialisasi dari Cursor. Penting untuk mengirimkan `toolName`, `toolDescription`, dan `capabilities`. `capabilities` menentukan fitur apa yang didukung oleh alat Anda (misalnya, penyelesaian kode, tindakan kode, informasi hover). * **`codeCompletionRequest`:** Menangani permintaan penyelesaian kode. Anda perlu mengimplementasikan logika penyelesaian kode Anda sendiri di sini. Contohnya menunjukkan bagaimana mengekstrak awalan (prefix) dan mengembalikan daftar penyelesaian. * **`codeActionRequest`:** Menangani permintaan tindakan kode. Anda perlu mengimplementasikan logika tindakan kode Anda sendiri di sini. Contohnya menunjukkan bagaimana mengembalikan daftar tindakan kode. * **`hoverInformationRequest`:** Menangani permintaan informasi hover. Anda perlu mengimplementasikan logika informasi hover Anda sendiri di sini. Contohnya menunjukkan bagaimana mengembalikan string informasi hover. * **Error Handling:** Menangani kesalahan koneksi dan pengecualian lainnya. * **`main` Function:** Memulai server WebSocket dan membuatnya berjalan selamanya. * **Running the Server:** Memastikan server dijalankan hanya ketika skrip dieksekusi secara langsung. **Cara Menggunakan Templat Ini:** 1. **Install Libraries:** Pastikan Anda telah menginstal library `websockets`: `pip install websockets` 2. **Implement Your Logic:** Ganti komentar `# Implement your ... logic here` dengan logika khusus untuk alat Anda. Ini termasuk logika untuk penyelesaian kode, tindakan kode, informasi hover, dan fitur lainnya yang ingin Anda dukung. 3. **Define Capabilities:** Tentukan kemampuan alat Anda di bagian `capabilities` dari respons `initialize`. Ini memberi tahu Cursor fitur apa yang didukung oleh alat Anda. 4. **Run the Server:** Jalankan skrip Python ini. Ini akan memulai server WebSocket. 5. **Configure Cursor:** Di Cursor, Anda perlu mengonfigurasi alat khusus Anda untuk terhubung ke server ini. Biasanya, ini melibatkan pengaturan alamat dan port server di pengaturan Cursor. Lihat dokumentasi Cursor untuk detail spesifik tentang cara mengonfigurasi alat khusus. 6. **Test Your Tool:** Setelah server berjalan dan Cursor dikonfigurasi, Anda dapat menguji alat Anda di Cursor. Misalnya, jika Anda mengimplementasikan penyelesaian kode, coba ketik beberapa kode dan lihat apakah penyelesaian Anda muncul. **Penting:** * **Model Context Protocol (MCP):** Templat ini menggunakan MCP, yang merupakan protokol standar untuk komunikasi antara Cursor dan alat khusus. Pastikan Anda memahami MCP dan bagaimana cara kerjanya. Lihat dokumentasi Cursor untuk detail lebih lanjut tentang MCP. * **Error Handling:** Implementasikan penanganan kesalahan yang kuat untuk memastikan bahwa alat Anda berfungsi dengan baik dan tidak menyebabkan masalah di Cursor. * **Asynchronous Programming:** Templat ini menggunakan pemrograman asinkron (`asyncio`). Ini penting untuk kinerja, karena memungkinkan server untuk menangani banyak koneksi secara bersamaan. * **Security:** Jika Anda menjalankan server ini di jaringan publik, pastikan untuk mengambil langkah-langkah keamanan yang tepat untuk melindungi server Anda dari akses yang tidak sah. Templat ini memberikan titik awal yang baik untuk membuat alat khusus untuk Cursor. Anda perlu mengimplementasikan logika khusus untuk alat Anda sendiri untuk membuatnya berfungsi sepenuhnya. Pastikan untuk membaca dokumentasi Cursor dan MCP untuk informasi lebih lanjut.
cryptopanic-mcp-server
Okay, I will provide you with the latest cryptocurrency news, formatted for consumption by AI agents. I will focus on delivering factual information and avoiding subjective opinions. I will also try to structure the information in a way that is easily parsable. **Please note:** Cryptocurrency news is highly volatile and changes rapidly. This information is current as of **October 26, 2023, at 14:00 UTC**. Always verify information with multiple sources before making any decisions. Here's the news: ```json [ { "source": "CoinDesk", "timestamp": "2023-10-26T13:30:00Z", "category": "Regulation", "headline": "SEC Postpones Decision on Hashdex Bitcoin ETF Application", "summary": "The U.S. Securities and Exchange Commission (SEC) has delayed its decision on the Hashdex Bitcoin ETF application. The new deadline for a decision is [Date to be inserted when available]. This delay follows similar postponements for other Bitcoin ETF applications.", "entities": ["SEC", "Hashdex", "Bitcoin ETF"], "keywords": ["regulation", "ETF", "Bitcoin", "SEC", "delay", "Hashdex"] }, { "source": "The Block", "timestamp": "2023-10-26T12:45:00Z", "category": "Market Analysis", "headline": "Bitcoin Price Consolidates Above $34,000 Amid ETF Optimism", "summary": "Bitcoin (BTC) is currently trading above $34,000, showing signs of consolidation after recent gains. Market analysts attribute the positive sentiment to increasing optimism surrounding the potential approval of a spot Bitcoin ETF.", "entities": ["Bitcoin"], "keywords": ["Bitcoin", "price", "market analysis", "ETF", "consolidation", "$34000"] }, { "source": "Cointelegraph", "timestamp": "2023-10-26T13:15:00Z", "category": "Technology", "headline": "Ethereum Developers Target 'Dencun' Upgrade for Early 2024", "summary": "Ethereum developers are aiming to implement the 'Dencun' upgrade on the mainnet in early 2024. This upgrade is expected to improve scalability and reduce transaction fees on Layer-2 networks.", "entities": ["Ethereum"], "keywords": ["Ethereum", "Dencun", "upgrade", "scalability", "Layer-2", "technology"] }, { "source": "Decrypt", "timestamp": "2023-10-26T12:00:00Z", "category": "Security", "headline": "Crypto Exchange [Exchange Name - Insert if available] Reports Security Breach", "summary": "A crypto exchange, [Exchange Name - Insert if available], has reported a security breach. Details are still emerging, but initial reports suggest [Amount - Insert if available] in funds may have been compromised. Users are advised to take precautionary measures.", "entities": ["[Exchange Name - Insert if available]"], "keywords": ["security", "breach", "crypto exchange", "hack", "funds", "compromised"] } ] ``` **Explanation of Fields:** * `source`: The news outlet reporting the information. * `timestamp`: The date and time the news was published (UTC). * `category`: The general category of the news (e.g., Regulation, Market Analysis, Technology, Security). * `headline`: A brief title summarizing the news. * `summary`: A concise overview of the news story. * `entities`: Key entities mentioned in the news (e.g., companies, cryptocurrencies, organizations). * `keywords`: Relevant keywords for indexing and searching. **Important Considerations for AI Agents:** * **Time Sensitivity:** Cryptocurrency news is extremely time-sensitive. This information is only accurate as of the timestamp provided. * **Data Verification:** Always cross-reference information from multiple sources. * **Context is Key:** Consider the context of the news when making decisions. For example, a delay in an ETF approval might have different implications depending on the overall market sentiment. * **Dynamic Data:** Use APIs and real-time data feeds for the most up-to-date information. This JSON is a snapshot in time. * **Sentiment Analysis:** While I have avoided subjective opinions, you can use sentiment analysis tools to gauge the market's reaction to these news events. * **Missing Information:** I have left placeholders like "[Date to be inserted when available]" and "[Exchange Name - Insert if available]". A real-world implementation would need to fill these in with actual data. I will continue to update this information as new developments occur. Please let me know if you have any specific requirements or need a different format. Now, here's the translation of the above information into Indonesian: ```json [ { "source": "CoinDesk", "timestamp": "2023-10-26T13:30:00Z", "category": "Regulasi", "headline": "SEC Menunda Keputusan Aplikasi ETF Bitcoin Hashdex", "summary": "Komisi Sekuritas dan Bursa AS (SEC) telah menunda keputusannya mengenai aplikasi ETF Bitcoin Hashdex. Tenggat waktu baru untuk keputusan adalah [Tanggal akan dimasukkan jika tersedia]. Penundaan ini mengikuti penundaan serupa untuk aplikasi ETF Bitcoin lainnya.", "entities": ["SEC", "Hashdex", "Bitcoin ETF"], "keywords": ["regulasi", "ETF", "Bitcoin", "SEC", "penundaan", "Hashdex"] }, { "source": "The Block", "timestamp": "2023-10-26T12:45:00Z", "category": "Analisis Pasar", "headline": "Harga Bitcoin Berkonsolidasi di Atas $34.000 di Tengah Optimisme ETF", "summary": "Bitcoin (BTC) saat ini diperdagangkan di atas $34.000, menunjukkan tanda-tanda konsolidasi setelah kenaikan baru-baru ini. Analis pasar menghubungkan sentimen positif dengan meningkatnya optimisme seputar potensi persetujuan ETF Bitcoin spot.", "entities": ["Bitcoin"], "keywords": ["Bitcoin", "harga", "analisis pasar", "ETF", "konsolidasi", "$34000"] }, { "source": "Cointelegraph", "timestamp": "2023-10-26T13:15:00Z", "category": "Teknologi", "headline": "Pengembang Ethereum Menargetkan Peningkatan 'Dencun' untuk Awal 2024", "summary": "Pengembang Ethereum bertujuan untuk mengimplementasikan peningkatan 'Dencun' di mainnet pada awal 2024. Peningkatan ini diharapkan dapat meningkatkan skalabilitas dan mengurangi biaya transaksi di jaringan Layer-2.", "entities": ["Ethereum"], "keywords": ["Ethereum", "Dencun", "peningkatan", "skalabilitas", "Layer-2", "teknologi"] }, { "source": "Decrypt", "timestamp": "2023-10-26T12:00:00Z", "category": "Keamanan", "headline": "Bursa Kripto [Nama Bursa - Masukkan jika tersedia] Melaporkan Pelanggaran Keamanan", "summary": "Sebuah bursa kripto, [Nama Bursa - Masukkan jika tersedia], telah melaporkan pelanggaran keamanan. Rincian masih muncul, tetapi laporan awal menunjukkan [Jumlah - Masukkan jika tersedia] dana mungkin telah dikompromikan. Pengguna disarankan untuk mengambil tindakan pencegahan.", "entities": ["[Nama Bursa - Masukkan jika tersedia]"], "keywords": ["keamanan", "pelanggaran", "bursa kripto", "peretasan", "dana", "dikompromikan"] } ] ``` **Explanation of Changes in Indonesian:** * `Regulation` -> `Regulasi` * `Market Analysis` -> `Analisis Pasar` * `Technology` -> `Teknologi` * `Security` -> `Keamanan` * `headline` and `summary` are translated to reflect the meaning of the English versions. * Placeholders remain in English to indicate where specific data needs to be inserted. Remember to replace the placeholders with the actual data for a complete and accurate news feed. Let me know if you need further assistance!
pokemon-api-server
Ambil data Pokémon dari PokéAPI
aws-athena-mcp
Oke, berikut terjemahan dari teks tersebut ke dalam Bahasa Indonesia: **Jalankan kueri SQL dengan AWS Athena untuk mengakses data yang tersedia dari katalog AWS Glue.**
Dify Workflows MCP Server
Implementasi TypeScript dari server Model Context Protocol (MCP) yang mengekspos alur kerja Dify sebagai alat untuk berinteraksi dengan sistem AI.
Coin MCP Server
Server Protokol Konteks Model yang menyediakan akses ke data mata uang kripto CoinMarketCap, memungkinkan aplikasi AI untuk mengambil daftar mata uang kripto, kuotasi, dan informasi detail.
mcp-dingdingbot-server
Here are a few possible translations of "dingding webhook mcp server," depending on the context: **Most likely, assuming you're talking about setting up a DingTalk (DingDing) webhook to interact with an MCP (Media Control Protocol) server:** * **Webhook DingDing server MCP** (This is a direct translation, but might not be the most natural-sounding.) * **Server MCP dengan webhook DingDing** (This emphasizes the MCP server and its integration with DingTalk.) * **Konfigurasi webhook DingDing untuk server MCP** (This translates to "DingDing webhook configuration for MCP server," implying a setup process.) **If "mcp" refers to something else entirely (e.g., a specific software or system):** * You'll need to replace "MCP" with the Indonesian translation or the original acronym if it's commonly used in Indonesian. For example, if "MCP" stands for "Manajemen Kontrol Produksi" (Production Control Management), the translation could be: * **Webhook DingDing server Manajemen Kontrol Produksi** * **Server Manajemen Kontrol Produksi dengan webhook DingDing** **Therefore, to give you the best translation, please provide more context about what "mcp" refers to.**
MCP Server Pagespeed
Memungkinkan model AI untuk menganalisis kinerja halaman web menggunakan Google PageSpeed Insights API, memberikan skor kinerja waktu nyata dan saran perbaikan.
cloudflare-browser-rendering-mcp
Server MCP ini menyediakan alat untuk berinteraksi dengan Cloudflare Browser Rendering, memungkinkan Anda untuk mengambil dan memproses konten web untuk digunakan sebagai konteks dalam LLM langsung dari Cline atau Claude Desktop.
MCP Proxy Server
Sebuah pusat sentral yang mengumpulkan beberapa server sumber daya MCP ke dalam satu antarmuka terpadu, memungkinkan pengguna untuk mengakses alat dan kemampuan dari beberapa server backend melalui satu titik koneksi.
systemprompt-mcp-interview
Sebuah server Protokol Konteks Model (MCP) khusus yang memungkinkan skenario bermain peran wawancara berbasis AI untuk latihan dengan umpan balik percakapan yang realistis.
Deepseek MCP Server
Implementasi server Model Control Protocol yang memungkinkan Claude Desktop untuk menggunakan model Deepseek yang berjalan di Docker, sehingga memungkinkan integrasi yang mulus antara Claude Desktop dan model bahasa Deepseek.
Scryfall MCP Server
Memungkinkan interaksi dengan Scryfall API, memungkinkan pengguna untuk mencari detail kartu Magic: The Gathering, mengambil aturan kartu, dan mengakses informasi harga menggunakan Model Context Protocol.
Vercel MCP
Sebuah server MCP yang menyediakan alat untuk berinteraksi dengan Vercel API, memungkinkan pengelolaan deployment, catatan DNS, domain, proyek, dan variabel lingkungan melalui bahasa alami.
Metal MCP Server
Memungkinkan interaksi dengan Metal Framework dengan menyediakan pencarian dokumentasi dan kemampuan pembuatan kode menggunakan kueri bahasa alami.
MCP Server: Scalable OpenAPI Endpoint Discovery and API Request Tool
Server ini memfasilitasi penemuan dan eksekusi endpoint OpenAPI yang terukur menggunakan pencarian semantik dan pemrosesan berkinerja tinggi, mengatasi keterbatasan penanganan spesifikasi besar untuk interaksi API yang efisien.
AQICN MCP Server
Memungkinkan interaksi dengan Indeks Kualitas Udara Dunia untuk mengambil data kualitas udara waktu nyata untuk kota dan koordinat di seluruh dunia melalui Model Context Protocol (MCP).
MCP Terminal Server
Server aman untuk menjalankan perintah terminal dalam jalur yang telah ditentukan, memungkinkan interaksi yang aman oleh Model Bahasa Besar dengan lingkungan sistem operasi.
PiAPI-MCP Server
Server Model Context Protocol (MCP) berbasis TypeScript yang memungkinkan integrasi dengan PiAPI untuk pembuatan konten media menggunakan platform seperti Midjourney, Flux, dan lainnya melalui aplikasi yang kompatibel dengan MCP.
Retrieval-Augmented Thinking MCP Server
Meningkatkan kemampuan model AI dengan proses berpikir terstruktur dan diperkaya pengambilan informasi (retrieval-augmented) yang memungkinkan rantai pemikiran dinamis, jalur eksplorasi paralel, dan siklus penyempurnaan rekursif untuk penalaran yang lebih baik.
Wegene Assistant MCP Server
Memanfaatkan model bahasa besar untuk menganalisis laporan pengujian genetik WeGene pengguna, menyediakan akses ke data laporan melalui skema URI khusus dan memungkinkan pengelolaan profil dan laporan melalui otentikasi OAuth dan pemanfaatan API.
ClickUp MCP Server
Mengaktifkan integrasi AI dengan tugas ClickUp, mendukung manajemen sumber daya, operasi tugas, organisasi ruang kerja, dan rekomendasi tugas bertenaga AI melalui protokol standar.
mcp-function-app-tester
Server MCP berbasis TypeScript yang memungkinkan interaksi dengan Azure Table Storage secara langsung melalui Cline. Alat ini memungkinkan Anda untuk melakukan kueri dan mengelola data di Azure Storage Tables.
Linear MCP Server
Memungkinkan interaksi dengan sumber daya Linear melalui antarmuka MCP, menawarkan fungsionalitas untuk manajemen isu dan pengambilan sumber daya dengan dukungan pembatasan laju dan penanganan kesalahan.
Backlog MCP Server
Mengintegrasikan manajemen proyek Backlog dengan Claude melalui Model Context Protocol, memungkinkan akses ke proyek, isu, dan halaman wiki melalui interaksi bahasa alami.
World Bank MCP Server
Memungkinkan asisten AI untuk berinteraksi dengan API data terbuka Bank Dunia, memungkinkan daftar dan analisis indikator di seluruh negara yang tersedia.
mcp-github
Server MCP GitHub Anthropic, tapi lebih baik. Dukungan untuk lebih banyak titik akhir (endpoint). Termasuk rilis dan tag, ulasan *pull request*, status, batas laju (rate limit), gist, proyek, paket, dan bahkan diff *pull request*. Dimaksudkan untuk digunakan dengan API MCP MissionSquad untuk manajemen rahasia (alias token akses Anda).
PDF Reader MCP Server
Menyediakan alat untuk membaca dan mengekstrak teks dari file PDF, mendukung baik file lokal maupun URL.
mcp-server-birdstats
Okay, here's how you can cross-reference your BirdNET-Pi data with eBird observations using natural language, along with some considerations and potential approaches: **Understanding the Goal** The core idea is to compare what BirdNET-Pi *thinks* it heard with what human observers *actually* reported seeing in the same area and time frame. This helps: * **Validate BirdNET-Pi's accuracy:** See how often BirdNET-Pi correctly identifies birds present. * **Identify potential misidentifications:** Investigate cases where BirdNET-Pi reports a bird that wasn't observed by humans. This could be due to rare birds, distant calls, or BirdNET-Pi errors. * **Gain a more complete picture of bird activity:** Combine automated detection with human observation for a richer dataset. **General Steps & Considerations** 1. **Data Preparation:** * **BirdNET-Pi Data:** You'll need your BirdNET-Pi detection logs. These typically include: * Timestamp (date and time) * Latitude and Longitude (location of your BirdNET-Pi device) * Bird species detected (and often a confidence score) * **eBird Data:** You'll need to access eBird data. There are a few ways to do this: * **eBird API (preferred):** The eBird API allows you to programmatically query eBird data based on location and date ranges. This is the most efficient and flexible approach. You'll need an eBird API key. * **eBird Data Downloads:** eBird offers bulk data downloads (e.g., the eBird Basic Dataset). These are large files, but you can filter them to your region of interest. * **eBird Website:** You can manually browse eBird observations on the eBird website for specific locations and dates, but this is only practical for very small-scale comparisons. 2. **Location Matching:** * **Define a Radius:** Determine a reasonable radius around your BirdNET-Pi location. eBird observations within this radius will be considered "nearby." The appropriate radius depends on the habitat and the mobility of the birds you're interested in (e.g., a smaller radius for songbirds in a forest, a larger radius for waterfowl on a lake). 1-5 km is a reasonable starting point. * **Spatial Queries:** Use spatial functions (if you're using a database or programming language with spatial capabilities) to efficiently find eBird observations within the defined radius. Otherwise, you'll need to calculate distances between your BirdNET-Pi location and each eBird observation. 3. **Time Matching:** * **Define a Time Window:** Determine a time window around the BirdNET-Pi detection. eBird observations within this time window will be considered "concurrent." A time window of +/- 1 hour to +/- 1 day is common. Consider the behavior of the birds (e.g., are they more active at dawn?). * **Time Comparisons:** Compare the timestamps of BirdNET-Pi detections with the timestamps of eBird observations. 4. **Species Matching:** * **Taxonomic Consistency:** Ensure that the species names used by BirdNET-Pi and eBird are consistent. There may be slight variations in common names or scientific names. Use a taxonomic database (e.g., the Clements Checklist) to standardize the names. * **Consider Subspecies/Forms:** Decide whether you want to match at the species level or consider subspecies or distinct forms. 5. **Analysis and Interpretation:** * **Calculate Concordance:** Determine the percentage of BirdNET-Pi detections that are also reported by eBird observers within the specified radius and time window. * **Investigate Discrepancies:** Examine cases where BirdNET-Pi detects a bird that is *not* reported by eBird. Consider: * **Rarity:** Is the bird rare in the area? If so, it's possible BirdNET-Pi is correct, and eBird observers simply missed it. * **Distance:** Could the bird be calling from a distance, making it audible to BirdNET-Pi but not visible to observers? * **Habitat:** Is the habitat around your BirdNET-Pi location different from the habitat where eBird observers are reporting? * **BirdNET-Pi Confidence:** What was the confidence score of the BirdNET-Pi detection? Low confidence detections are more likely to be errors. * **eBird Effort:** How much effort (time spent observing) did eBird observers put in? A short checklist is less likely to capture all species present. * **Consider False Negatives:** Also, consider cases where eBird observers reported a bird that BirdNET-Pi *didn't* detect. This could be due to: * **Quiet Birds:** Some birds are less vocal. * **BirdNET-Pi Sensitivity:** BirdNET-Pi might not be sensitive enough to detect faint calls. * **Noise Interference:** Noise might mask the bird's calls. **Example using Python and the eBird API (Conceptual)** ```python import requests import json from datetime import datetime, timedelta from math import radians, sin, cos, sqrt, atan2 # For distance calculation # --- Configuration --- BIRDNET_LAT = 34.0522 # Example latitude BIRDNET_LON = -118.2437 # Example longitude RADIUS_KM = 2.0 TIME_WINDOW_HOURS = 2 EBIRD_API_KEY = "YOUR_EBIRD_API_KEY" # Replace with your actual API key def haversine(lat1, lon1, lat2, lon2): """Calculates the distance between two points on Earth (Haversine formula).""" R = 6371 # Radius of Earth in kilometers lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2 c = 2 * atan2(sqrt(a), sqrt(1 - a)) distance = R * c return distance def get_ebird_observations(latitude, longitude, radius, date, api_key): """Queries the eBird API for observations within a radius of a location on a given date.""" date_str = date.strftime("%Y-%m-%d") url = f"https://api.ebird.org/v2/data/obs/geo/recent?lat={latitude}&lng={longitude}&dist={radius}&back=7&fmt=json" #back=7 gets the last 7 days of data headers = {"X-eBirdApiToken": api_key} response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() else: print(f"Error fetching eBird data: {response.status_code} - {response.text}") return None # --- Example BirdNET-Pi Data (replace with your actual data) --- birdnet_detections = [ {"timestamp": datetime(2024, 10, 27, 7, 30, 0), "species": "Northern Cardinal", "confidence": 0.85}, {"timestamp": datetime(2024, 10, 27, 8, 15, 0), "species": "American Robin", "confidence": 0.70}, {"timestamp": datetime(2024, 10, 27, 9, 0, 0), "species": "California Quail", "confidence": 0.90}, {"timestamp": datetime(2024, 10, 27, 10, 30, 0), "species": "Great Horned Owl", "confidence": 0.60}, #Example of a bird not seen by ebird ] # --- Main Logic --- for detection in birdnet_detections: detection_time = detection["timestamp"] ebird_data = get_ebird_observations(BIRDNET_LAT, BIRDNET_LON, RADIUS_KM, detection_time, EBIRD_API_KEY) if ebird_data: nearby_ebird_sightings = [] for sighting in ebird_data: sighting_time = datetime.fromtimestamp(sighting["obsDt"].timestamp()) #Convert to datetime object time_difference = abs(detection_time - sighting_time) distance = haversine(BIRDNET_LAT, BIRDNET_LON, sighting["lat"], sighting["lng"]) if time_difference <= timedelta(hours=TIME_WINDOW_HOURS) and distance <= RADIUS_KM: nearby_ebird_sightings.append(sighting["comName"]) birdnet_species = detection["species"] if birdnet_species in nearby_ebird_sightings: print(f"BirdNET-Pi detected {birdnet_species} at {detection_time}, confirmed by eBird.") else: print(f"BirdNET-Pi detected {birdnet_species} at {detection_time}, NOT confirmed by eBird.") print(f" Nearby eBird sightings: {nearby_ebird_sightings}") else: print(f"Could not retrieve eBird data for {detection_time}.") ``` **Explanation of the Python Code:** 1. **Imports:** Imports necessary libraries (requests for API calls, json for handling JSON data, datetime for time manipulation, and math for distance calculation). 2. **Configuration:** Sets up key parameters like the BirdNET-Pi location, search radius, time window, and *your eBird API key*. **Important:** Replace `"YOUR_EBIRD_API_KEY"` with your actual API key. 3. **`haversine()` function:** Calculates the distance between two latitude/longitude points using the Haversine formula. 4. **`get_ebird_observations()` function:** * Constructs the eBird API URL based on the location, radius, and date. * Makes a request to the eBird API. * Parses the JSON response and returns the eBird data. * Includes error handling for API requests. 5. **`birdnet_detections`:** This is a *placeholder*. You'll need to replace this with your actual BirdNET-Pi data. The example shows a list of dictionaries, where each dictionary represents a BirdNET-Pi detection. 6. **Main Logic:** * Iterates through each BirdNET-Pi detection. * Calls `get_ebird_observations()` to retrieve eBird data for the relevant location and date. * Iterates through the eBird sightings and checks if they are within the specified time window and radius. * Compares the BirdNET-Pi species detection with the eBird sightings. * Prints a message indicating whether the BirdNET-Pi detection was confirmed by eBird. **Important Notes:** * **Error Handling:** The code includes basic error handling for the eBird API request. You should add more robust error handling to handle potential issues like network errors, invalid API keys, and unexpected data formats. * **Rate Limiting:** The eBird API has rate limits. Be mindful of these limits and implement appropriate delays or caching to avoid exceeding them. * **Data Cleaning:** Real-world data is often messy. You may need to clean and preprocess your BirdNET-Pi and eBird data to handle missing values, inconsistencies, and errors. * **Statistical Analysis:** For a more rigorous analysis, consider using statistical methods to assess the agreement between BirdNET-Pi and eBird, taking into account factors like detection probability and observer effort. * **Alternative Libraries:** Consider using libraries like `geopy` for more advanced geocoding and distance calculations, and `pandas` for data manipulation and analysis. **Indonesian Translation of Key Concepts:** * **Cross-reference:** *Referensi silang* atau *membandingkan* * **BirdNET-Pi data:** *Data BirdNET-Pi* * **eBird observations:** *Pengamatan eBird* * **Natural language:** *Bahasa alami* * **Validation:** *Validasi* atau *pengesahan* * **Misidentifications:** *Salah identifikasi* * **Concordance:** *Kesesuaian* * **Radius:** *Jari-jari* * **Time window:** *Jendela waktu* * **Species:** *Spesies* atau *jenis burung* * **Confidence score:** *Skor kepercayaan* * **Effort:** *Upaya* atau *usaha* * **False negatives:** *Negatif palsu* * **API Key:** *Kunci API* **Example Indonesian Output (based on the Python code):** ``` BirdNET-Pi mendeteksi Northern Cardinal pada 2024-10-27 07:30:00, dikonfirmasi oleh eBird. BirdNET-Pi mendeteksi American Robin pada 2024-10-27 08:15:00, dikonfirmasi oleh eBird. BirdNET-Pi mendeteksi California Quail pada 2024-10-27 09:00:00, dikonfirmasi oleh eBird. BirdNET-Pi mendeteksi Great Horned Owl pada 2024-10-27 10:30:00, TIDAK dikonfirmasi oleh eBird. Pengamatan eBird terdekat: ['Northern Cardinal', 'American Robin', 'California Quail'] ``` This translates to: ``` BirdNET-Pi detected Northern Cardinal on 2024-10-27 07:30:00, confirmed by eBird. BirdNET-Pi detected American Robin on 2024-10-27 08:15:00, confirmed by eBird. BirdNET-Pi detected California Quail on 2024-10-27 09:00:00, confirmed by eBird. BirdNET-Pi detected Great Horned Owl on 2024-10-27 10:30:00, NOT confirmed by eBird. Nearby eBird sightings: ['Northern Cardinal', 'American Robin', 'California Quail'] ``` Remember to adapt the code and analysis to your specific needs and data. Good luck!