香港編程學會正聯同學界合作開發一個創新的物聯網平台(IoT Platform),無縫整合到 Semiblock,這是一種旨在以引人入勝且易於理解的方式教導孩子編碼的動態工具。該平台透過用戶友好的基於區塊的編碼介面實現即時數據交換、視覺化和原型設計,使年輕學習者能夠探索物聯網 (IoT)。透過 API 功能,它允許學生創建將實體設備連接到數位系統的互動式項目,促進有關感測器、數據處理和智慧技術的實踐學習。該平台嵌入在 Semiblock 中,簡化了複雜的物聯網概念,使兒童能夠輕鬆理解,同時鼓勵透過Coding發揮創造力和解決問題的能力。這種整合提供了強大的教育體驗,將理論Coding技能與實際的真實世界物聯網應用結合。
黃敬群(Jim Huang,網路暱稱 Jserv、宅色夫),是台灣知名的自由軟體開發者與學者,是一位活躍於科技圈有着非常高動手能力的教授。他對系統級別的東西例如Operating System,Compiler等等有着很全面的了解。訪問當中黃教授介紹了他團隊的作品,由此可以看出他是一位很hands-on之教育家。黃教授幾十年來專注於System Programming,是一位名符其實的學者。
黃教授的Github充份表現出他對寫程式和求真的熱情,他的論文都會實作而不是玩理論,是一位很愛動手的教授
香港編程學會(Hong Kong Programming Society, HKPS)自2023年成立以來,一直致力於推動香港資訊科技行業的發展。為響應全球開源硬體與STEM教育的熱潮,我們隆重推出Open 8項目 : 一個以8位元微控制器(8-bit microcontroller)為核心的開源教育與創新計劃!“Open 8”旨在讓學生、業餘愛好者及專業人士透過動手實踐,探索嵌入式系統的魅力,激發創意,並為香港的科技未來貢獻力量。
“Open 8”是一個以8位元微控制器為基礎的開源項目,專注於提供低成本、可擴展的硬體平台與教育資源,幫助參與者學習編程、電子設計與嵌入式系統應用。我們的目標是打造一個開放的生態系統,讓每個人都能輕鬆上手,無論你是初學者還是資深開發者。
8位元微控制器以其低功耗、低成本與高效能聞名,廣泛應用於物聯網、家電控制與教育領域。雖然32位元MCU功能強大,但8位元MCU的簡單架構更適合初學者理解硬體原理,同時也能滿足多數嵌入式應用的需求。透過“Open 8”,你將掌握這項經典技術,奠定嵌入式開發的堅實基礎。
無論你是學生、教師、DIY愛好者還是專業工程師,“Open 8”都為你提供了獨特的機會:
加入“Open 8”,開啟你的科技冒險!以下是參與方式:
“Open 8”不僅是一個技術項目,更是一個匯聚創意與熱情的平台。我們希望透過開源精神,降低科技學習的門檻,讓香港的年輕一代與科技愛好者都能參與到嵌入式系統的創新浪潮中。你的加入,將為這個願景增添一抹亮色!
不要等待,現在就加入“Open 8”,成為香港開源硬體革命的一部分!訪問 hkcs.org.hk 或在X上搜尋 #Open8HK,了解最新動態。讓我們一起用8位元的簡單力量,創造無限可能!
聯繫我們:
SemiBlock 今季完成了一項重大更新,將書中所有與 Python 相關的語法成功轉化為 Block(積木式編程塊),成為市面上支援 Python 語法最全面的 Block 教學工具之一。這套工具以其直觀、易用和教育導向的設計,特別適合小學生學習編程,幫助他們在輕鬆有趣的環境中掌握 Python 編程基礎。以下將從多個角度詳盡介紹 SemiBlock 的特點、優勢以及其對小學生學習的價值。
SemiBlock 是一款將 Python 語法轉化為視覺化 Block 的教學工具,旨在降低編程學習的門檻。其主要特色包括:
SemiBlock 今季宣布完成了一項突破性更新,將 ESP32 微控制器上使用的 MicroPython 語法全面轉化為視覺化的 Block(積木式編程塊),成為市面上支援 ESP32 語法最全面的 Block 教學工具。這款工具以其直觀、易學且專為教育設計的特性,特別適合小學生學習編程和物聯網(IoT)應用開發。透過將複雜的 ESP32 MicroPython 語法簡化為拖放式 Block,SemiBlock 為年輕學習者提供了一個無障礙的編程環境,幫助他們在探索科技創新的同時,培養邏輯思維和創造力。以下將從功能特色、適合小學生的原因、與其他工具的比較、教育價值以及未來潛力等方面,詳盡介紹 SemiBlock 的這一更新。
ESP32 是一款由 Espressif 開發的低成本、高效能微控制器,廣泛應用於物聯網項目,因其內建 Wi-Fi 和藍牙功能而備受青睞。MicroPython 是 ESP32 上常用的編程語言,提供了簡化的 Python 語法,讓開發者能快速實現硬體控制和網路應用。SemiBlock 的最新更新將 ESP32 的 MicroPython 語法全面轉化為 Block,讓學生無需撰寫文字程式碼即可完成複雜的 ESP32 項目。其核心功能包括:
Model Context Protocol (MCP) 是一個開放協議,它使 LLM 應用與外部資料來源和工具之間的無縫整合成為可能。無論你是建立 AI 驅動的 IDE、改善 chat 交互,還是建立自訂的 AI 工作流程,MCP 提供了一種標準化的方式,將 LLM 與它們所需的上下文連接起來。
目前,MCP 已經累積了足夠的臨界規模和動能,因此它被視為 2023-2025 年「代理開放標準」之爭的潛在贏家。有人預計,以目前的速度,MCP 將在 7 月超OpenAPI:
MCP 的核心是一個 client-server 架構,host 應用程式可以連接到多個伺服器:
MCP客戶端是模型上下文協定(MCP)架構中的核心元件,負責建立和管理與MCP伺服器的連線。它實現了協定的客戶端部分,處理以下功能:
MCP client 的工作流程如下:
MCP伺服器是模型上下文協定(MCP)架構中的基礎元件,為客戶端提供工具、資源和功能。它實現了協定的伺服器端,負責:
1.初始化
2. 訊息交換
初始化後,支援以下模式:
3. 終止
任一方可以終止連線:
SQLite 實作一個集中範例
SQLite MCP 伺服器和你的本機 SQLite 資料庫之間的通訊完全發生在你的機器上 — 你的 SQLite 資料庫不會暴露在網際網路上。 Model Context Protocol 確保 Claude Desktop 只能透過定義良好的介面執行核准的資料庫作。這為你提供了一種安全的方式,讓 Claude 分析和互動你的本地數據,同時完全控制它可以存取的內容。
Example要安裝之軟件:
# 使用 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:
3. 測試
問題:
你能連接到我的 SQLite 資料庫並告訴我有哪些產品及其價格嗎?
Claude Desktop 將會:
背後發生了什麼事?
當你使用 MCP 與 Claude Desktop 互動時:
先決條件
您需要 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 配置, 搭: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
問天氣:
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]與我們聯繫。
期待貴學院的參與,共同打造一個具影響力的技術項目!
PIC18 | ATMEL | Raspberry Pi | ESP32 | STM32 | |
有Dip封裝,直插麵包板 | yes | yes | no | no | no |
JTAG | yes | yes (但用fuse好麻煩,小朋友肯定玩爛) | yes | yes | yes |
組合語言簡單 | yes | yes | yes (但起手難) | yes (但起手難) | yes (但起手難, 但arm系列黎講最易) |
對接C | yes | yes | yes (toolchain比atmel和pic18要好) | yes (toolchain比atmel和pic18要好) | yes (toolchain比atmel和pic18要好) |
學習FreeRTOS | no | no | yes | yes | yes |
學習不同微控制器(MCU)或單板電腦(SBC)的組合語言(Assembly Language)時,會因其架構、應用場景、工具鏈以及學習難度而有所不同。以下是針對 STM32、ESP32、Raspberry Pi、Atmel(AVR)和 PIC18 的組合語言學習對比,涵蓋它們的處理器核心、指令集、開發環境與學習體驗:
隨著大語言模型逐漸成為各種工具與應用的核心,引入外部資源與工具來增強模型能力已成為普遍的技術需求。本文將深入探討MCP(Model Context Protocol),並透過實際範例詳解如何從零開始建立並連結 MCP 工具至主流 AI 應用。
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(Model Context Protocol)是一個開放的通訊協定,透過該協定,所有應用都能以標準化的方式與LLM溝通。因此,MCP並非全能的AI助手、應用程式,或程式語言,而是一個標準化的溝通協定。其目標是有效率地將開發好的外部工具與資源連結到各種AI應用中,概念上與 LangChain 中的 bind_tools 方法,以及 OpenAI 的 Function Calling/tool use 相當,但 MCP 將此概念更進一步擴展至多個AI應用的統一整合。
在未啟用 MCP 前,大型語言模型(LLM)無法直接存取 GitHub 的最新 commit、Google 日曆資訊、Gmail 信件等外部訊息。雖然 Tool use (function calling) 的概念可以在某些特定框架中實現資料調用,但這種方法通常受限於框架綁定,難以快速移植到其他應用,且常面臨呼叫失敗或錯誤處理不足的問題。有了 MCP,透過一個中介伺服器,LLM 能夠統一存取並處理這些外部資料,並進一步生成摘要或其他回應。這不僅簡化了資料調用的流程,還大幅提升了系統的穩定性與擴展性。
MCP 的設計遵循客戶端-伺服器架構,將 AI 應用程式和數據連接器的角色清楚區分。其主要組成部分包括:
這部分指的是利用大型語言模型運作並需要外部資料或功能的應用程式,例如聊天機器人、IDE 或其他嵌入 LLM 的工具。舉例來說,像 Claude Desktop、類似 Cursor 的程式碼編輯器或聊天介面,都可以扮演 MCP 主機的角色。主機負責調度 LLM 的操作、管理多重連線,並將從外部取得的資訊與 AI 的回應整合在一起,通常會結合一個或多個 MCP 客戶端。
客戶端是嵌入在主機內部的元件(通常以函式庫或程序形式存在),負責與 MCP 伺服器建立一對一的連線。每一個數據來源或工具都會有專屬的客戶端實例,用來處理與伺服器之間的訊息往來、請求轉發與回應處理,同時也會記錄伺服器所提供的功能。客戶端還負責連線的初始化和能力協商等細節,確保整個通訊流程順暢無誤。
伺服器則是輕量級的程式或服務,通過 MCP 介面向外部提供特定的數據或功能。這些伺服器可以封裝本地資源(如檔案系統或資料庫),也可以連接遠端服務(例如 Slack、Gmail、GitHub 等)。每個伺服器都以標準化的方式提供一項或多項功能,讓任何 MCP 客戶端都能發送查詢或調用相關服務。這樣一來,主機就不必針對每個外部服務編寫獨立的整合程式,只需通過 MCP 標準與所有伺服器通訊。早期的應用實例包括用於 Google Drive、Slack、Git repo 和 Postgres 資料庫的連接器。
許多人對此感到困惑,讓我們來釐清一些概念:
- ❌ **無法取代 API**: MCP 可以使用 API,但它只是一個標準化介面,並非取代特定 API 功能的工具。
- ❌ **建立並不複雜**: 開發者可以透過簡單的協議來建立 MCP 伺服器。網路上有許多模板、第三方資源可供參考。
- ❌ **並非直接的資料庫**: MCP 伺服器不會直接存儲數據,而只是充當一座橋樑。
此外,MCP 不僅限於遠端伺服器,也可以在本地運行。
MCP 協議定義了客戶端與伺服器之間溝通的語言和規範。它採用 JSON-RPC 2.0 作為訊息格式,並建立了一套針對初始化、列出功能、工具調用等常見任務的標準方法和訊息類型。通訊可以通過多種傳輸方式實現,例如本地伺服器通常使用標準輸入/輸出流(stdio),而遠端伺服器則可利用 HTTP 與 Server-Sent Events(SSE)來維持連線。這一協議層負責訊息的編碼、交換與會話管理,確保連續多個請求能夠在同一連線中順利處理。
由於 LLM 的相關議題範圍極廣,涉及眾多專有名詞,為了讓大家能夠更清楚地理解這些概念,以下整理了各個概念之間的差異與關聯。
AI Agent 是一個能夠代替人類執行一系列操作以達成特定目標的智能系統。與傳統使用者單次輸入 prompt,然後讓 LLM 生成回應的互動模式不同,AI Agent 更像是一位具備目標導向的自主執行者。它會根據目標進行任務分析,將複雜任務拆分為多個子任務,再依照計劃自動做出決策與執行,直到最終完成任務。雖然有時候也稱為智能體、代理人,但為了避免過於抽象,我們更傾向於使用「AI Agent」這一術語,強調它在實際應用中的具體行動與任務完成能力。
在執行任務的過程中,AI Agent 通常需要與外部系統互動,比如存取資料、調用其他服務等。這時,Function Calling 就扮演了一個重要的角色(又稱Tool Use)。它作為一種接口,使得 AI Agent 能夠調用各種外部工具或資源。換句話說,Function Calling 為 AI Agent 提供了擴展其功能的能力,使其不僅僅局限於內部的語言生成,而是能夠進一步完成更複雜的操作,像是數據檢索、記錄更新等。
AI Agent 的核心運作離不開大型語言模型的支撐。LLM 模型負責進行語言理解與生成,協助 Agent 進行任務分析、計劃制定以及步驟拆解。簡單來說,AI Agent 是以任務目標為導向的決策者,而 LLM 則是提供「思考」與回應的引擎。兩者密切合作:Agent 依賴 LLM 來產生合理的操作方案,並透過內部機制執行分解後的子任務,最終實現自動化的工作流程。
回到與本文的主題,雖然 MCP 與 Function Calling 都旨在幫助 AI 系統調用外部工具,但它們在設計理念上存在明顯不同。傳統的 Function Calling 通常需要將特定函式直接嵌入應用程式中,這種方式耦合度較高,每增加一項功能就可能需要撰寫對應的新程式碼。相比之下,MCP 提供了一個標準化的通訊協定,它解耦了 AI 主機與外部服務的關係。只要遵循 MCP 規範,開發者就可以讓 AI 應用透過統一接口調用多個 MCP 伺服器上的功能,而無需對每個外部 API 進行獨立整合。這樣不僅大幅簡化了開發流程,還提高了整體系統的擴展性與靈活性。
MCP 協議允許伺服器向 AI 模型提供三大類功能:資料、工具和提示。這些功能使模型能夠根據需要獲取實時資訊、執行各種操作以及獲得最佳引導。以下分別介紹這三種功能類型:
這三類功能在最終效果上都將資訊傳遞給模型的上下文窗口(通常以文字形式),但區分它們有助於客戶端根據需求進行恰當處理:工具需要參數傳遞和用戶確認,而資料則是直接提取並插入上下文。實際應用中,許多 AI 集成方案重點放在工具上,因為它們實現了主動操作;但資料與提示同樣在提供背景信息與最佳指導方面扮演著關鍵角色。透過這樣的功能組合,MCP 讓 AI 模型能夠更靈活地從各種資源中獲取信息,並在必要時執行具體動作,從而大幅提升整體系統的實用性與效率。
如果對於Python環境搭建需求可以先參考 => 環境安裝指南
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 和機器學習相關技術,無論是初學者還是進階使用者,都可以在這裡找到適合的學習資源和工具。透過社群的力量,平台上的內容持續更新,涵蓋從基礎理論到實務應用,滿足不同層次的學習需求。
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