Semiblock的物聯網平台

Back
Category : Home

香港編程學會正聯同學界合作開發一個創新的物聯網平台(IoT Platform),無縫整合到 Semiblock,這是一種旨在以引人入勝且易於理解的方式教導孩子編碼的動態工具。該平台透過用戶友好的基於區塊的編碼介面實現即時數據交換、視覺化和原型設計,使年輕學習者能夠探索物聯網 (IoT)。透過 API 功能,它允許學生創建將實體設備連接到數位系統的互動式項目,促進有關感測器、數據處理和智慧技術的實踐學習。該平台嵌入在 Semiblock 中,簡化了複雜的物聯網概念,使兒童能夠輕鬆理解,同時鼓勵透過Coding發揮創造力和解決問題的能力。這種整合提供了強大的教育體驗,將理論Coding技能與實際的真實世界物聯網應用結合。

黃敬群(Jim Huang,網路暱稱 Jserv、宅色夫),是台灣知名的自由軟體開發者與學者,是一位活躍於科技圈有着非常高動手能力的教授。他對系統級別的東西例如Operating System,Compiler等等有着很全面的了解。訪問當中黃教授介紹了他團隊的作品,由此可以看出他是一位很hands-on之教育家。黃教授幾十年來專注於System Programming,是一位名符其實的學者。

黃教授的Github充份表現出他對寫程式和求真的熱情,他的論文都會實作而不是玩理論,是一位很愛動手的教授

個人特質

  • 工程師精神:黃敬群自述從聯發科「科技新貴」到技術長,再到學術研究者,始終以工程師身份為傲,追求技術創新與終身學習。
  • 影響力:被譽為「有生命溫度的工程師」,其從業經歷與自學故事激勵許多學生與年輕工程師。https://blog.tiandiren.tw/archives/10043

CodeQuestHK係一個有意義的比賽,係無老師底下好多學生自願參加,好有熱情

引言

香港編程學會(Hong Kong Programming Society, HKPS)自2023年成立以來,一直致力於推動香港資訊科技行業的發展。為響應全球開源硬體與STEM教育的熱潮,我們隆重推出Open 8項目 : 一個以8位元微控制器(8-bit microcontroller)為核心的開源教育與創新計劃!“Open 8”旨在讓學生、業餘愛好者及專業人士透過動手實踐,探索嵌入式系統的魅力,激發創意,並為香港的科技未來貢獻力量。

什麼是“Open 8”?

“Open 8”是一個以8位元微控制器為基礎的開源項目,專注於提供低成本、可擴展的硬體平台與教育資源,幫助參與者學習編程、電子設計與嵌入式系統應用。我們的目標是打造一個開放的生態系統,讓每個人都能輕鬆上手,無論你是初學者還是資深開發者。

項目特色

  • 開源硬體設計:基於Microchip PIC或Atmel AVR等8位元微控制器,提供免費的電路圖與KiCad設計檔案,鼓勵自製與改進。
  • 教育資源:提供C語言與組合語言的教學課程,涵蓋從基礎GPIO控制到進階感測器整合的實作範例。
  • 模組化開發板:設計一款易於擴展的“Open 8”開發板,支援SPI、I2C、UART等介面,兼容多種感測器與模組。
  • 社群驅動:加入我們的GitHub儲存庫,與全球開發者共同優化程式碼、分享專案,並參與年度“Open 8”Hackathon!

為什麼選擇8位元微控制器?

8位元微控制器以其低功耗、低成本與高效能聞名,廣泛應用於物聯網、家電控制與教育領域。雖然32位元MCU功能強大,但8位元MCU的簡單架構更適合初學者理解硬體原理,同時也能滿足多數嵌入式應用的需求。透過“Open 8”,你將掌握這項經典技術,奠定嵌入式開發的堅實基礎。

為什麼加入“Open 8”?

無論你是學生、教師、DIY愛好者還是專業工程師,“Open 8”都為你提供了獨特的機會:

  • 學生:透過動手實作,學習編程與電子知識,為STEM競賽或未來科技職業鋪路。
  • 教師:獲取免費的課程資源,將“Open 8”融入課堂,激發學生的創造力。
  • 業餘愛好者:打造屬於自己的智慧家居設備、機器人或復古遊戲機,實現創意無極限。
  • 專業人士:探索8位元MCU在低功耗應用中的潛力,參與開源社群,為履歷增添亮點。

成功案例

  • 智慧農業感測器:一位中學生利用“Open 8”開發板,設計了土壤濕度監測器,幫助農夫優化灌溉。
  • 復古遊戲機:一位業餘愛好者基於“Open 8”打造了一款8位元像素風格遊戲機,重現經典街機體驗。
  • 教育工作坊:香港某小學採用“Open 8”套件,讓學生在3小時內完成LED燈控專案,點燃對科技的熱情。

如何參與?

加入“Open 8”,開啟你的科技冒險!以下是參與方式:

  1. 註冊會員:訪問香港編程學會官網(hkcs.org.hk),加入“Open 8”項目社群,免費獲取資源。
  2. 下載套件:從我們的GitHub頁面下載硬體設計與程式碼範例,開始你的第一個專案。
  3. 參加活動:報名我們的線上/線下工作坊,學習如何使用“Open 8”開發板,或參加年度Hackathon,展示你的創意。
  4. 分享成果:在社群論壇或X平台分享你的專案,與其他開發者交流,贏得獎勵與認可!

我們的願景

“Open 8”不僅是一個技術項目,更是一個匯聚創意與熱情的平台。我們希望透過開源精神,降低科技學習的門檻,讓香港的年輕一代與科技愛好者都能參與到嵌入式系統的創新浪潮中。你的加入,將為這個願景增添一抹亮色!

立即行動!

不要等待,現在就加入“Open 8”,成為香港開源硬體革命的一部分!訪問 hkcs.org.hk 或在X上搜尋 #Open8HK,了解最新動態。讓我們一起用8位元的簡單力量,創造無限可能!

聯繫我們

SemiBlock 今季完成了一項重大更新,將書中所有與 Python 相關的語法成功轉化為 Block(積木式編程塊),成為市面上支援 Python 語法最全面的 Block 教學工具之一。這套工具以其直觀、易用和教育導向的設計,特別適合小學生學習編程,幫助他們在輕鬆有趣的環境中掌握 Python 編程基礎。以下將從多個角度詳盡介紹 SemiBlock 的特點、優勢以及其對小學生學習的價值。

1. SemiBlock 的核心特色

SemiBlock 是一款將 Python 語法轉化為視覺化 Block 的教學工具,旨在降低編程學習的門檻。其主要特色包括:

  • 全面支援 Python 語法
    今季更新後,SemiBlock 已將書中涵蓋的所有 Python 語法(如變數、條件語句、迴圈、函數、列表、字典等)轉化為拖放式的 Block。這意味著學生無需直接撰寫複雜的程式碼,只需透過拖曳積木塊即可完成 Python 程式設計,減少語法錯誤的挫敗感。
  • 直觀的視覺化介面
    SemiBlock 的 Block 設計色彩鮮明、分類清晰,每個 Block 都對應特定的 Python 功能。例如,條件語句可能用藍色 Block 表示,迴圈用綠色 Block 表示,幫助學生快速辨識並理解不同語法的用途。
  • 即時程式碼對照
    在拖放 Block 的同時,SemiBlock 會即時顯示對應的 Python 程式碼,讓學生在操作視覺化介面的同時,逐漸熟悉 Python 的文字語法,為未來過渡到純文字編程打下基礎。
  • 跨平台支援
    SemiBlock 提供網頁版和應用程式版本,兼容多種設備(如平板、電腦),方便學校和家庭使用。

SemiBlock 今季宣布完成了一項突破性更新,將 ESP32 微控制器上使用的 MicroPython 語法全面轉化為視覺化的 Block(積木式編程塊),成為市面上支援 ESP32 語法最全面的 Block 教學工具。這款工具以其直觀、易學且專為教育設計的特性,特別適合小學生學習編程和物聯網(IoT)應用開發。透過將複雜的 ESP32 MicroPython 語法簡化為拖放式 Block,SemiBlock 為年輕學習者提供了一個無障礙的編程環境,幫助他們在探索科技創新的同時,培養邏輯思維和創造力。以下將從功能特色、適合小學生的原因、與其他工具的比較、教育價值以及未來潛力等方面,詳盡介紹 SemiBlock 的這一更新。

1. SemiBlock 的核心功能與 ESP32 語法支持

ESP32 是一款由 Espressif 開發的低成本、高效能微控制器,廣泛應用於物聯網項目,因其內建 Wi-Fi 和藍牙功能而備受青睞。MicroPython 是 ESP32 上常用的編程語言,提供了簡化的 Python 語法,讓開發者能快速實現硬體控制和網路應用。SemiBlock 的最新更新將 ESP32 的 MicroPython 語法全面轉化為 Block,讓學生無需撰寫文字程式碼即可完成複雜的 ESP32 項目。其核心功能包括:

  • 全面的 MicroPython 語法覆蓋
    SemiBlock 將 ESP32 的 MicroPython 語法(如 GPIO 控制、PWM、I2C/SPI 通訊、Wi-Fi 連線、藍牙功能、ADC/DAC、計時器、中斷處理等)轉化為直觀的 Block。這些 Block 涵蓋了 ESP32 的核心功能,例如:
    • GPIO 操作:控制數位輸入/輸出,如點亮 LED 或讀取按鈕狀態。
    • 感測器互動:讀取溫度、濕度或距離感測器的資料(如 DHT11、超音波感測器)。
    • 網路功能:配置 Wi-Fi 連線、發送 HTTP 請求或建立簡單的網頁伺服器。
    • 進階功能:支援藍牙通訊、檔案系統操作(如 SPIFFS)以及低功耗模式。 每個 Block 都對應特定的 MicroPython 函數,例如 machine.Pin 或 network.WLAN,讓學生能輕鬆實現硬體控制。
  • 直觀的視覺化設計
    SemiBlock 的 Block 採用色彩編碼和圖標提示,幫助學生快速識別功能。例如,GPIO 相關 Block 可能用紅色表示,Wi-Fi 功能用藍色,感測器操作用綠色。Block 的形狀設計確保只有正確的組合才能拼合,減少語法錯誤的可能性。
  • 即時程式碼對照與 MicroPython 輸出
    在拖放 Block 的過程中,SemiBlock 會即時顯示對應的 MicroPython 程式碼,讓學生在操作視覺化介面的同時,逐步熟悉文字編程的語法結構。例如,當學生拖放一個「點亮 LED」的 Block 時,平台會顯示如 pin = machine.Pin(13, machine.Pin.OUT); pin.value(1) 的程式碼。這一功能為學生從 Block 編程過渡到文字編程提供了橋樑。
  • ESP32 硬體整合
    SemiBlock 提供專屬的 ESP32 模組支持,學生可以透過 USB 或 OTA(無線更新)將 Block 生成的程式碼直接上傳到 ESP32 板(如 ESP32-DevKitC 或 NodeMCU)。平台還內建硬體偵錯工具,幫助學生檢查連線問題或硬體配置錯誤。
  • 跨平台與多語言支持
    SemiBlock 提供網頁版、桌面版和行動應用程式,兼容 Windows、macOS、Linux 以及平板設備。介面支援多語言(包括繁體中文),確保小學生能以母語學習,降低語言障礙。

什麼是 MCP

Model Context Protocol (MCP) 是一個開放協議,它使 LLM 應用與外部資料來源和工具之間的無縫整合成為可能。無論你是建立 AI 驅動的 IDE、改善 chat 交互,還是建立自訂的 AI 工作流程,MCP 提供了一種標準化的方式,將 LLM 與它們所需的上下文連接起來。

目前,MCP 已經累積了足夠的臨界規模和動能,因此它被視為 2023-2025 年「代理開放標準」之爭的潛在贏家。有人預計,以目前的速度,MCP 將在 7 月超OpenAPI:

MCP 如何運作

通用架構

MCP 的核心是一個 client-server 架構,host 應用程式可以連接到多個伺服器:

  • MCP Hosts: 像 Claude Desktop、IDEs 或 AI 工具這樣的程序,它們希望透過 MCP 存取資源
  • MCP Clients: 維護與伺服器 1:1 連線的協定用戶端
  • MCP Servers: 輕量級程序,透過標準化的 Model Context Protocol 暴露特定功能
  • Local Resources: 你的電腦資源(資料庫、檔案、服務),MCP 伺服器可以安全地存取這些資源
  • Remote Resources: 透過網際網路可用的資源(例如,透過 APIs),MCP 伺服器可以連接到這些資源

MCP 用戶端

MCP客戶端是模型上下文協定(MCP)架構中的核心元件,負責建立和管理與MCP伺服器的連線。它實現了協定的客戶端部分,處理以下功能:

  • 協議版本協商以確保與伺服器的兼容性
  • 能力協商以確定可用功能
  • 訊息傳輸和JSON-RPC通信
  • 工具發現與執行
  • 資源存取和管理
  • 提示系統交互
  • 選用功能如根目錄管理和取樣支持

MCP client 的工作流程如下:

  • MCP client 首先從 MCP server 取得可用的工具清單。
  • 將使用者的查詢連同工具描述透過 function calling 一起傳送給 LLM。
  • LLM 決定是否需要使用工具以及使用哪些工具。
  • 如果需要使用工具,MCP client 會透過 MCP server 執行對應的工具呼叫。
  • 工具呼叫的結果會被傳回 LLM。
  • LLM 基於所有資訊產生自然語言回應。
  • 最後將回應展示給用戶。

MCP 服務端

MCP伺服器是模型上下文協定(MCP)架構中的基礎元件,為客戶端提供工具、資源和功能。它實現了協定的伺服器端,負責:

  • 暴露客戶端可以發現和執行的工具
  • 管理基於URI的資源存取模式
  • 提供提示範本並處理提示請求
  • 支援與客戶端的能力協商
  • 實作伺服器端協定操作
  • 管理並發客戶端連接
  • 提供結構化日誌和通知

連結生命週期

1.初始化

  • Client 發送包含協定版本和能力的 initialize 請求
  • Server 以其協定版本和能力回應
  • Client 發送 initialized 通知作為確認
  • 開始正常訊息交換

2. 訊息交換

初始化後,支援以下模式:

  • 請求-回應:客戶端或伺服器發送請求,另一方回應
  • 通知:任一方發送單向訊息

3. 終止

任一方可以終止連線:

  • 透過 close() 進行乾淨關閉
  • 傳輸斷開
  • 錯誤條件

快速入門

SQLite 實作一個集中範例

  • Claude Desktop 作為我們的 MCP 用戶端
  • 一個 SQLite MCP 伺服器提供安全的資料庫訪問
  • 你的本地 SQLite 資料庫儲存實際數據

SQLite MCP 伺服器和你的本機 SQLite 資料庫之間的通訊完全發生在你的機器上 — 你的 SQLite 資料庫不會暴露在網際網路上。 Model Context Protocol 確保 Claude Desktop 只能透過定義良好的介面執行核准的資料庫作。這為你提供了一種安全的方式,讓 Claude 分析和互動你的本地數據,同時完全控制它可以存取的內容。

Example要安裝之軟件:

  • macOS 或 Windows
  • 安裝最新版本的 Claude Desktop
  • UV 0.4.18 或更高版本( 檢查)uv –version
  • Git( 檢查)git –version
  • SQLite( 檢查)sqlite3 –version
# 使用 winget
winget install --id=astral-sh.uv -e
winget install git.git sqlite.sqlite

# 或直接下载:
# uv: https://docs.astral.sh/uv/
# Git: https://git-scm.com
# SQLite: https://www.sqlite.org/download.html

建立一個簡單Windows的 SQLite 資料庫進行測試:

# 创建一个新的 SQLite 数据库
$sql = @'
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  price REAL
);

INSERT INTO products (name, price) VALUES
  ('Widget', 19.99),
  ('Gadget', 29.99),
  ('Gizmo', 39.99),
  ('Smart Watch', 199.99),
  ('Wireless Earbuds', 89.99),
  ('Portable Charger', 24.99),
  ('Bluetooth Speaker', 79.99),
  ('Phone Stand', 15.99),
  ('Laptop Sleeve', 34.99),
  ('Mini Drone', 299.99),
  ('LED Desk Lamp', 45.99),
  ('Keyboard', 129.99),
  ('Mouse Pad', 12.99),
  ('USB Hub', 49.99),
  ('Webcam', 69.99),
  ('Screen Protector', 9.99),
  ('Travel Adapter', 27.99),
  ('Gaming Headset', 159.99),
  ('Fitness Tracker', 119.99),
  ('Portable SSD', 179.99);
'@

cd ~
& sqlite3 test.db $sql

配置 Claude Desktop:

在文字編輯器中開啟 中的 Claude Desktop 應用程式配置。 %APPDATA%\Claude\claude_desktop_config.json

新增以下配置(將 YOUR_USERNAME 替換為您的實際使用者名稱):

{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": [
        "mcp-server-sqlite",
        "--db-path",
        "C:\\Users\\YOUR_USERNAME\\test.db"
      ]
    }
  }
}

這告訴 Claude Desktop:

  • 有一個名為 “sqlite” 的 MCP 伺服器
  • 透過運行 啟動它uvx mcp-server-sqlite
  • 將其連接到你的測試資料庫
  • 儲存文件,並重新啟動 Claude Desktop。

3. 測試

問題:

你能連接到我的 SQLite 資料庫並告訴我有哪些產品及其價格嗎?

Claude Desktop 將會:

  • 連接到 SQLite MCP 伺服器
  • 查詢你的本地資料庫
  • 格式化並展示結果

原理解析

背後發生了什麼事?

當你使用 MCP 與 Claude Desktop 互動時:

  1. 伺服器發現:Claude Desktop 在啟動時連接到你設定的 MCP 伺服器
  2. 協議握手:當你詢問數據時,Claude Desktop:
    • 確定哪個 MCP 伺服器可以提供幫助(在本例中是 sqlite)
    • 透過協議協商能力
    • 從 MCP 伺服器請求資料或作
  3. 交互流程:見下圖
  4. 安全性:
    • MCP 伺服器僅暴露特定、受控的功能
    • MCP 伺服器在你的機器上本地運行,它們訪問的資源不會暴露在互聯網上
    • Claude Desktop 需要使用者確認以進行敏感作

Python 创建一个简单的 MCP 服务器

先決條件
您需要 Python 3.10 或更高版本:

python --version # Should be 3.10 或 higher

透過 homebrew 安裝 uv

brew install uv
uv --version # Should be 0.4.18 或 higher
有關更多信息,請參閱 https://docs.astral.sh/uv/

使用 MCP 專案建立器建立新專案

uvx create-mcp-server --path weather_service
cd weather_service

安裝其他依賴項

uv add httpx python-dotenv

設定環境

OPENWEATHER_API_KEY=your-api-key-here #創造:.env

创建您的服务器

新增基本導入和設定, 在weather_service/src/weather_service/server.py

import os
import json
import logging
from datetime import datetime, timedelta
from collections.abc import Sequence
from functools import lru_cache
from typing import Any

import httpx
import asyncio
from dotenv import load_dotenv
from mcp.server import Server
from mcp.types import (
    Resource,
    Tool,
    TextContent,
    ImageContent,
    EmbeddedResource,
    LoggingLevel
)
from pydantic import AnyUrl

# Load environment variables
load_dotenv()

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("weather-server")

# API configuration
API_KEY = os.getenv("OPENWEATHER_API_KEY")
if not API_KEY:
    raise ValueError("OPENWEATHER_API_KEY environment variable required")

API_BASE_URL = "http://api.openweathermap.org/data/2.5"
DEFAULT_CITY = "London"
CURRENT_WEATHER_ENDPOINT = "weather"
FORECAST_ENDPOINT = "forecast"

# The rest of our server implementation will go here

新增天氣取得功能

# Create reusable params
http_params = {
    "appid": API_KEY,
    "units": "metric"
}

async def fetch_weather(city: str) -> dict[str, Any]:
    async with httpx.AsyncClient() as client:
        response = await client.get(
            f"{API_BASE_URL}/weather",
            params={"q": city, **http_params}
        )
        response.raise_for_status()
        data = response.json()

    return {
        "temperature": data["main"]["temp"],
        "conditions": data["weather"][0]["description"],
        "humidity": data["main"]["humidity"],
        "wind_speed": data["wind"]["speed"],
        "timestamp": datetime.now().isoformat()
    }


app = Server("weather-server")

實作資源處理程序, 將這些與資源相關的處理程序加入到我們的 main 函數中:

app = Server("weather-server")

@app.list_resources()
async def list_resources() -> list[Resource]:
    """List available weather resources."""
    uri = AnyUrl(f"weather://{DEFAULT_CITY}/current")
    return [
        Resource(
            uri=uri,
            name=f"Current weather in {DEFAULT_CITY}",
            mimeType="application/json",
            description="Real-time weather data"
        )
    ]

@app.read_resource()
async def read_resource(uri: AnyUrl) -> str:
    """Read current weather data for a city."""
    city = DEFAULT_CITY
    if str(uri).startswith("weather://") and str(uri).endswith("/current"):
        city = str(uri).split("/")[-2]
    else:
        raise ValueError(f"Unknown resource: {uri}")

    try:
        weather_data = await fetch_weather(city)
        return json.dumps(weather_data, indent=2)
    except httpx.HTTPError as e:
        raise RuntimeError(f"Weather API error: {str(e)}")

實施工具處理程序, 新增以下與工具相關的處理程序:

app = Server("weather-server")

# Resource implementation ...

@app.list_tools()
async def list_tools() -> list[Tool]:
    """List available weather tools."""
    return [
        Tool(
            name="get_forecast",
            description="Get weather forecast for a city",
            inputSchema={
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "City name"
                    },
                    "days": {
                        "type": "number",
                        "description": "Number of days (1-5)",
                        "minimum": 1,
                        "maximum": 5
                    }
                },
                "required": ["city"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: Any) -> Sequence[TextContent | ImageContent | EmbeddedResource]:
    """Handle tool calls for weather forecasts."""
    if name != "get_forecast":
        raise ValueError(f"Unknown tool: {name}")

    if not isinstance(arguments, dict) or "city" not in arguments:
        raise ValueError("Invalid forecast arguments")

    city = arguments["city"]
    days = min(int(arguments.get("days", 3)), 5)

    try:
        async with httpx.AsyncClient() as client:
            response = await client.get(
                f"{API_BASE_URL}/{FORECAST_ENDPOINT}",
                params={
                    "q": city,
                    "cnt": days * 8,  # API returns 3-hour intervals
                    **http_params,
                }
            )
            response.raise_for_status()
            data = response.json()

        forecasts = []
        for i in range(0, len(data["list"]), 8):
            day_data = data["list"][i]
            forecasts.append({
                "date": day_data["dt_txt"].split()[0],
                "temperature": day_data["main"]["temp"],
                "conditions": day_data["weather"][0]["description"]
            })

        return [
            TextContent(
                type="text",
                text=json.dumps(forecasts, indent=2)
            )
        ]
    except httpx.HTTPError as e:
        logger.error(f"Weather API error: {str(e)}")
        raise RuntimeError(f"Weather API error: {str(e)}")

新增 main 函數, 將此新增至 的結尾:weather_service/src/weather_service/server.py

async def main():
    # Import here to avoid issues with event loops
    from mcp.server.stdio import stdio_server

    async with stdio_server() as (read_stream, write_stream):
        await app.run(
            read_stream,
            write_stream,
            app.create_initialization_options()
        )

在 init.py 中檢查您的切入點, 將此加入到 的結尾:weather_service/src/weather_service/init.py

from . import server
import asyncio

def main():
   """Main entry point for the package."""
   asyncio.run(server.main())

# Optionally expose other important items at package level
__all__ = ['main', 'server']

連接到 Claude Desktop

更新 Claude 配置, 搭:claude_desktop_config.json

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "path/to/your/project",
        "run",
        "weather-service"
      ],
      "env": {
        "OPENWEATHER_API_KEY": "your-api-key"
      }
    }
  }
}

重啟 Claude

  1. 徹底退出 Claude
  2. 再次啟動 Claude
  3. 在🔌選單中尋找您的天氣伺服器

測試

問天氣:

What’s the current weather in San Francisco? Can you analyze the conditions and tell me if it’s a good day for outdoor activities?

比較天氣

Can you analyze the forecast for both Tokyo and San Francisco and tell me which city would be better for outdoor photography this week?

參考理解:

Python SDK: https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file#documentation

MCP中文文件: https://mcp-docs.cn/clients
————————————————

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本聲明。

原文連結:https://blog.csdn.net/qq_45066628/article/details/146225428

主題:邀請參與編程學會8位微控制器短期開發計劃

您好!
編程學會誠摯邀請貴學院參與我們即將推出的短期計劃,旨在設計並開發一款簡單的8位微控制器。此計劃不僅為學生提供實踐編程與硬件設計的機會,亦促進學術交流與創新技術的探索。


計劃詳情:
• 目標:開發一款功能簡潔的8位微控制器,適用於教育用途及基礎嵌入式系統應用。
• 時間:2025年7月至9月,為期三個月。
• 參與形式:學生與導師組成團隊,進行架構設計、指令集開發、模擬測試及原型製作。
• 支持:編程學會將提供技術資源。


參與優勢:
• 學生可獲得嵌入式系統設計的實戰經驗,提升技術能力。
• 促進跨學院合作,激發創新思維。
• 優秀項目將有機會於學會年度展示會中展出,並獲推薦至業界。

我們相信貴學院在資訊科技及工程領域的卓越表現將為計劃增色不少。請於2025年5月30日前回覆此邀請,並提供初步參與意向或聯繫人資料。如有任何疑問,歡迎透過電郵 [email protected]與我們聯繫。
期待貴學院的參與,共同打造一個具影響力的技術項目!

PIC18ATMELRaspberry PiESP32STM32
有Dip封裝,直插麵包板yesyesnonono
JTAGyesyes (但用fuse好麻煩,小朋友肯定玩爛)yesyesyes
組合語言簡單yesyesyes (但起手難)yes (但起手難)yes (但起手難, 但arm系列黎講最易)
對接Cyesyesyes (toolchain比atmel和pic18要好)yes (toolchain比atmel和pic18要好)yes (toolchain比atmel和pic18要好)
學習FreeRTOSnonoyesyesyes

學習不同微控制器(MCU)或單板電腦(SBC)的組合語言(Assembly Language)時,會因其架構、應用場景、工具鏈以及學習難度而有所不同。以下是針對 STM32、ESP32、Raspberry Pi、Atmel(AVR)和 PIC18 的組合語言學習對比,涵蓋它們的處理器核心、指令集、開發環境與學習體驗:


1. STM32

  • 處理器核心: ARM Cortex-M 系列(例如 Cortex-M0、M3、M4、M7),32 位元 RISC 架構。
  • 指令集: ARMv6-M(M0/M0+)或 ARMv7-M(M3/M4/M7),Thumb 和 Thumb-2 指令集。
  • 組合語言特性:
    • 指令集較統一且現代化,支援高效的 16 位和 32 位指令。
    • 有豐富的暫存器(R0-R15),包括程式計數器(PC)和堆疊指標(SP)。
    • 中斷處理(NVIC)是其核心功能,需熟悉向量表和異常處理。
  • 開發環境:
    • 使用 STM32CubeIDE 或 Keil MDK,支援組合語言編程。
    • 需要搭配 ARM 的組合器(如 arm-none-eabi-as)。
  • 學習難度: 中等偏高。ARM 指令集相對複雜,但文檔完善,適合有一定基礎的學習者。
  • 應用場景: 工業控制、嵌入式系統、高性能應用。
  • 優勢: 指令集標準化,學習後可應用於其他 ARM 架構 MCU。

2. ESP32

  • 處理器核心: Tensilica Xtensa LX6(雙核或單核版本),32 位元 RISC 架構。
  • 指令集: Xtensa 專有指令集,可選配浮點運算單元(FPU)和 DSP 指令。
  • 組合語言特性:
    • 指令集非標準化,與 ARM 或 AVR 不同,需專門學習 Tensilica 的文檔。
    • 支援窗口暫存器(Register Windowing),減少函數調用的開銷,但增加學習曲線。
    • 內建 Wi-Fi 和藍牙功能,涉及通訊相關的特殊指令。
  • 開發環境:
    • Espressif 提供的 ESP-IDF,支援 Xtensa 的組合器(xtensa-esp32-elf-as)。
    • 官方文檔較少針對組合語言,需自行探索。
  • 學習難度: 中等到高。因指令集不常見且文檔資源不如 ARM 豐富,學習門檻較高。
  • 應用場景: 物聯網(IoT)、無線通訊設備。
  • 優勢: 適合需要無線功能的專案,但組合語言學習的實用性不如高階語言(C/C++)。

3. Raspberry Pi

  • 處理器核心: Broadcom BCM 系列(如 BCM2711 上的 ARM Cortex-A72),64 位元 ARMv8-A 架構。
  • 指令集: AArch64(64 位),向下相容 AArch32(32 位 ARMv7-A)。
  • 組合語言特性:
    • 指令集現代且複雜,支援 64 位運算和多核心處理。
    • 有 31 個通用暫存器(X0-X30),加上專用暫存器(如 XZR)。
    • 需理解作業系統(通常是 Linux)下的記憶體管理和上下文切換。
  • 開發環境:
    • 使用 GNU 工具鏈(如 aarch64-linux-gnu-as),可在 Linux 上直接編寫。
    • 通常搭配高階語言(C/Python),純組合語言應用較少。
  • 學習難度: 高。Raspberry Pi 作為單板電腦,組合語言需與 OS 交互,學習曲線陡峭。
  • 應用場景: 教育、伺服器、桌面應用,非典型嵌入式場景。
  • 優勢: 學習 AArch64 可應用於其他高階 ARM 設備,但實務中很少直接用組合語言。

4. Atmel (AVR)

  • 處理器核心: AVR 8 位元 RISC 架構(如 ATmega328P)。
  • 指令集: AVR 專有指令集,簡單且高效。
  • 組合語言特性:
    • 指令集精簡,只有約 130 條指令,多為單週期執行。
    • 32 個 8 位通用暫存器(R0-R31),部分有特殊用途。
    • 直接支援堆疊操作,但堆疊指標(SP)需手動管理。
  • 開發環境:
    • 使用 AVR-GCC(含 avr-as)或 Atmel Studio。
    • 燒錄工具如 avrdude,支援 Arduino 生態。
  • 學習難度: 低到中等。指令集簡單,適合初學者入門。
  • 應用場景: 教育(Arduino)、低功耗設備、簡單控制系統。
  • 優勢: 學習資源豐富(尤其因 Arduino 普及),是嵌入式組合語言的入門首選。

5. PIC18

  • 處理器核心: Microchip PIC18 系列,8 位元 RISC 架構。
  • 指令集: PIC 專有指令集,約 75 條指令。
  • 組合語言特性:
    • 指令集極為精簡,單字長(16 位)設計。
    • 僅一個工作暫存器(WREG),操作需頻繁與記憶體交互。
    • 堆疊為硬體實現,深度有限(通常 31 級)。
  • 開發環境:
    • 使用 MPLAB X IDE,搭配 PIC 組合器(mpasm)。
    • 文檔和範例豐富,支援燒錄工具如 PICkit。
  • 學習難度: 中等。指令集簡單但邏輯獨特,需適應其限制(如單暫存器設計)。
  • 應用場景: 低成本設備、家電控制、汽車電子。
  • 優勢: 學習後可快速上手其他 PIC 系列,但指令集限制靈活性。

隨著大語言模型逐漸成為各種工具與應用的核心,引入外部資源與工具來增強模型能力已成為普遍的技術需求。本文將深入探討MCP(Model Context Protocol),並透過實際範例詳解如何從零開始建立並連結 MCP 工具至主流 AI 應用。

什麼是 MCP?

MCP 全名為 Model Context Protocol,中文稱作「模型上下文協定」,是一種開放標準協定,由開發知名 AI 模型「Claude」的美國新創公司 Anthropic 於 2024 年 11 月所推出。MCP 提供一種標準化的方式,讓 AI 模型可以向外部工具或服務請求數據並使用相關功能。這個協議提供了一個統一介面,可將自訂工具與資源整合至不同的 AI 應用中,從而讓開發者可以輕鬆連結各種自定義工具(例如文件檢索、資料庫查詢)至 Cursor、Windsurf、Claude Desktop、GitHub Copilot 等多種平台。目前已有數個工具和供應商支援 MCP,這使得其應用範圍更加豐富且靈活。

圖片來源

我們可以將 MCP 視為 AI 應用程式中的「USB-C 介面」,它提供一個標準化且即插即用的方式來連接各種工具和數據。就像 USB-C 可讓不同品牌的設備彼此兼容,MCP 也制定了一套通用規範,使得任何基於大型語言模型的客戶端都能與所有符合 MCP 標準的伺服器進行互動。從架構上看,MCP 透過內嵌於應用程式中的客戶端連接 AI 主機(例如 Claude 或各種 IDE),再與各個 MCP 伺服器對接,而這些伺服器則猶如各類外接裝置,不論是遠端服務(如 Slack、Gmail、日曆 API 等)或是本地資料(例如文件和資料庫),皆能透過統一的 MCP 介面實現連結,讓 AI 助手得以輕鬆存取並整合多元數據和工具。

對於 AI 工具開發者來說,只需建立一個 MCP 伺服器,便能讓所有大型語言模型輕鬆存取各種工具和數據來源,無需為每個模型獨立開發 API。

為何需要 MCP?

MCP(Model Context Protocol)是一個開放的通訊協定,透過該協定,所有應用都能以標準化的方式與LLM溝通。因此,MCP並非全能的AI助手、應用程式,或程式語言,而是一個標準化的溝通協定。其目標是有效率地將開發好的外部工具與資源連結到各種AI應用中,概念上與 LangChain 中的 bind_tools 方法,以及 OpenAI 的 Function Calling/tool use 相當,但 MCP 將此概念更進一步擴展至多個AI應用的統一整合。

  • MCP 不是全能的 AI 助手,只是一個統一的溝通橋樑。
  • MCP 不是一款應用程式,而是一個標準化協定。
  • MCP 不是一種獨立的服務,而是一個連接多種服務的介面。
  • MCP 不是一個 LLM,其作用在於連接 LLM 與外部資源。
  • MCP 不是一種程式語言,而是用來定義如何進行跨平台溝通的規範。
  • MCP 不是一個單一工具,而是連接各種外部工具和資源的橋樑。

MCP 解決什麼問題?

在未啟用 MCP 前,大型語言模型(LLM)無法直接存取 GitHub 的最新 commit、Google 日曆資訊、Gmail 信件等外部訊息。雖然 Tool use (function calling) 的概念可以在某些特定框架中實現資料調用,但這種方法通常受限於框架綁定,難以快速移植到其他應用,且常面臨呼叫失敗或錯誤處理不足的問題。有了 MCP,透過一個中介伺服器,LLM 能夠統一存取並處理這些外部資料,並進一步生成摘要或其他回應。這不僅簡化了資料調用的流程,還大幅提升了系統的穩定性與擴展性。

MCP 如何運作?

MCP 的設計遵循客戶端-伺服器架構,將 AI 應用程式和數據連接器的角色清楚區分。其主要組成部分包括:

圖片來源

MCP 主機(Host)

這部分指的是利用大型語言模型運作並需要外部資料或功能的應用程式,例如聊天機器人、IDE 或其他嵌入 LLM 的工具。舉例來說,像 Claude Desktop、類似 Cursor 的程式碼編輯器或聊天介面,都可以扮演 MCP 主機的角色。主機負責調度 LLM 的操作、管理多重連線,並將從外部取得的資訊與 AI 的回應整合在一起,通常會結合一個或多個 MCP 客戶端。

MCP 客戶端(Client)

客戶端是嵌入在主機內部的元件(通常以函式庫或程序形式存在),負責與 MCP 伺服器建立一對一的連線。每一個數據來源或工具都會有專屬的客戶端實例,用來處理與伺服器之間的訊息往來、請求轉發與回應處理,同時也會記錄伺服器所提供的功能。客戶端還負責連線的初始化和能力協商等細節,確保整個通訊流程順暢無誤。

MCP 伺服器(Server)

伺服器則是輕量級的程式或服務,通過 MCP 介面向外部提供特定的數據或功能。這些伺服器可以封裝本地資源(如檔案系統或資料庫),也可以連接遠端服務(例如 Slack、Gmail、GitHub 等)。每個伺服器都以標準化的方式提供一項或多項功能,讓任何 MCP 客戶端都能發送查詢或調用相關服務。這樣一來,主機就不必針對每個外部服務編寫獨立的整合程式,只需通過 MCP 標準與所有伺服器通訊。早期的應用實例包括用於 Google Drive、Slack、Git repo 和 Postgres 資料庫的連接器。

許多人對此感到困惑,讓我們來釐清一些概念:
- ❌ **無法取代 API**: MCP 可以使用 API,但它只是一個標準化介面,並非取代特定 API 功能的工具。
- ❌ **建立並不複雜**: 開發者可以透過簡單的協議來建立 MCP 伺服器。網路上有許多模板、第三方資源可供參考。
- ❌ **並非直接的資料庫**: MCP 伺服器不會直接存儲數據,而只是充當一座橋樑。

此外,MCP 不僅限於遠端伺服器,也可以在本地運行。

MCP 協議(Protocol)

MCP 協議定義了客戶端與伺服器之間溝通的語言和規範。它採用 JSON-RPC 2.0 作為訊息格式,並建立了一套針對初始化、列出功能、工具調用等常見任務的標準方法和訊息類型。通訊可以通過多種傳輸方式實現,例如本地伺服器通常使用標準輸入/輸出流(stdio),而遠端伺服器則可利用 HTTP 與 Server-Sent Events(SSE)來維持連線。這一協議層負責訊息的編碼、交換與會話管理,確保連續多個請求能夠在同一連線中順利處理。

其他名詞解釋(補充)

由於 LLM 的相關議題範圍極廣,涉及眾多專有名詞,為了讓大家能夠更清楚地理解這些概念,以下整理了各個概念之間的差異與關聯。

什麼是 AI agent?

AI Agent 是一個能夠代替人類執行一系列操作以達成特定目標的智能系統。與傳統使用者單次輸入 prompt,然後讓 LLM 生成回應的互動模式不同,AI Agent 更像是一位具備目標導向的自主執行者。它會根據目標進行任務分析,將複雜任務拆分為多個子任務,再依照計劃自動做出決策與執行,直到最終完成任務。雖然有時候也稱為智能體、代理人,但為了避免過於抽象,我們更傾向於使用「AI Agent」這一術語,強調它在實際應用中的具體行動與任務完成能力。

圖片來源

AI Agent 與 Function Calling 的關係

在執行任務的過程中,AI Agent 通常需要與外部系統互動,比如存取資料、調用其他服務等。這時,Function Calling 就扮演了一個重要的角色(又稱Tool Use)。它作為一種接口,使得 AI Agent 能夠調用各種外部工具或資源。換句話說,Function Calling 為 AI Agent 提供了擴展其功能的能力,使其不僅僅局限於內部的語言生成,而是能夠進一步完成更複雜的操作,像是數據檢索、記錄更新等。

AI Agent 與 LLM 模型的關係

AI Agent 的核心運作離不開大型語言模型的支撐。LLM 模型負責進行語言理解與生成,協助 Agent 進行任務分析、計劃制定以及步驟拆解。簡單來說,AI Agent 是以任務目標為導向的決策者,而 LLM 則是提供「思考」與回應的引擎。兩者密切合作:Agent 依賴 LLM 來產生合理的操作方案,並透過內部機制執行分解後的子任務,最終實現自動化的工作流程。

MCP 跟 Function Calling 差異在哪?

回到與本文的主題,雖然 MCP 與 Function Calling 都旨在幫助 AI 系統調用外部工具,但它們在設計理念上存在明顯不同。傳統的 Function Calling 通常需要將特定函式直接嵌入應用程式中,這種方式耦合度較高,每增加一項功能就可能需要撰寫對應的新程式碼。相比之下,MCP 提供了一個標準化的通訊協定,它解耦了 AI 主機與外部服務的關係。只要遵循 MCP 規範,開發者就可以讓 AI 應用透過統一接口調用多個 MCP 伺服器上的功能,而無需對每個外部 API 進行獨立整合。這樣不僅大幅簡化了開發流程,還提高了整體系統的擴展性與靈活性。

MCP 功能說明

MCP 協議允許伺服器向 AI 模型提供三大類功能:資料、工具和提示。這些功能使模型能夠根據需要獲取實時資訊、執行各種操作以及獲得最佳引導。以下分別介紹這三種功能類型:

  • 資料(Resources):提供只讀、靜態內容(例如文件、資料庫記錄、維基頁面),使模型能動態獲取最新上下文資訊。
  • 工具(Tools):定義可執行的函數或動作(如計算、API 查詢、訊息發送或記錄更新),讓模型能執行操作,通常需用戶確認以確保安全。
  • 提示(Prompts):提供預設模板或多輪對話流程,引導模型完成特定任務,確保輸出一致並符合最佳實踐。

這三類功能在最終效果上都將資訊傳遞給模型的上下文窗口(通常以文字形式),但區分它們有助於客戶端根據需求進行恰當處理:工具需要參數傳遞和用戶確認,而資料則是直接提取並插入上下文。實際應用中,許多 AI 集成方案重點放在工具上,因為它們實現了主動操作;但資料與提示同樣在提供背景信息與最佳指導方面扮演著關鍵角色。透過這樣的功能組合,MCP 讓 AI 模型能夠更靈活地從各種資源中獲取信息,並在必要時執行具體動作,從而大幅提升整體系統的實用性與效率。

MCP 應用於 Claude Desktop (簡單實作)

先參考影片~文章我近日趕工補上! 先參考方說明

如果對於Python環境搭建需求可以先參考 => 環境安裝指南

延伸閱讀: Python 環境建置與套件管理工具:pip、conda、mamba、uv 詳細比較

from mcp.server.fastmcp import FastMCP

# 建立一個 MCP 伺服器,這裡設定名稱為 "MCP-demo"
mcp = FastMCP(name="MCP-demo")

# 定義一個工具函式,用來計算傳入字串中 'r' 字母的出現次數
@mcp.tool()
def count_r(word: str) -> int:
"""
計算傳入字串中 'r' 字母出現的次數
參數:
word (str): 要檢查的字串
回傳:
int: 'r' 字母的數量,若輸入不是字串則回傳 0
"""
if not isinstance(word, str):
return 0
# 轉成小寫後計算 'r' 的數量
return word.lower().count("r")

# 定義一個資源函式,當客戶端請求 URI 為 "docs://document" 時,會回傳文件內容
@mcp.resource("docs://document")
def get_all_langgraph_docs() -> str:
"""
取得所有文件內容,回傳檔案內的文字
參數: 無
回傳:
str: LangGraph 文件的內容;若讀取失敗則回傳錯誤訊息
"""
# 設定本地文件所在的路徑
PATH = '/Users/yilintsai/Desktop/Demo/'
doc_path = PATH + "doc.txt"
try:
with open(doc_path, 'r') as file:
return file.read()
except Exception as e:
return f"讀取檔案錯誤:{str(e)}"

if __name__ == "__main__":
# 啟動 MCP 伺服器,這裡使用 stdio 作為傳輸方式
mcp.run(transport='stdio')
@@@的首都在台北
@@@的英文名稱為Taiwan
@@@最著名的美食為小籠包
{
"mcpServers": {
"MCP-demo": {
"command": "/Users/yilintsai/Desktop/MCP-countr/.venv/bin/python",
"args": [
"/Users/yilintsai/Desktop/MCP-countr/server.py"
]
}
}
}

如果你對 LLM 技術感到興趣,歡迎參考我的免費電子書《全民瘋AI系列 [大語言模型應用與實戰]》。本系列將會介紹基礎 LLM 觀念與實戰應用,手把手教您如何從環境建置到模型部署。此外,書中也整理了市面上各家語言模型供應商提供的免費額度資源,讓您輕鬆入門體驗 AI 的魅力。

全民瘋AI系列電子書
全民瘋AI系列 是一個專為 AI 學習資源打造的開源平台,由一群熱愛資料科學的工程師所組成。這個平台的宗旨是提供一個開放、協作的環境,讓更多人能夠方便地學習 AI 和機器學習相關技術,無論是初學者還是進階使用者,都可以在這裡找到適合的學習資源和工具。透過社群的力量,平台上的內容持續更新,涵蓋從基礎理論到實務應用,滿足不同層次的學習需求。

https://medium.com/@andy6804tw/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-mcp-model-context-protocol-%E6%90%AD%E9%85%8D%E7%B0%A1%E6%98%93%E5%AF%A6%E4%BD%9C-0e3f975155db

Joined ESF COCO 2024 to give a talk to students. Attending the ESF COCO 2024 was an enriching experience that highlighted the excitement and potential of programming. This event provided an excellent opportunity to explore the latest technologies, share learning experiences, and connect with like-minded individuals.

First, the various keynote speeches offered valuable insights. Experts discussed emerging trends in artificial intelligence, data science, and cybersecurity. These topics not only broadened my understanding but also ignited my enthusiasm for future learning. Hearing from industry leaders about their journeys helped clarify my own career aspirations.

Additionally, the hands-on workshops were incredibly practical, allowing me to apply what I had learned. Collaborating with other participants enhanced my communication and teamwork skills, which are crucial for any programmer. Through practical exercises, I identified areas for improvement in my programming abilities, motivating me to continue honing my skills.

Finally, interacting with participants from diverse backgrounds showcased the inclusivity and vibrancy of the programming community. Everyone shared a passion for technology, exchanging stories and challenges, which solidified my commitment to pursuing programming.

In summary, ESF COCO 2024 not only enhanced my programming skills but also deepened my understanding of this rapidly evolving field. I look forward to attending similar events in the future to continue learning and growing.Share