2026-09-18
2026-09-16
[C#] .NET 10 MCP 實戰:讓 OpenCode 產生星座運勢並更新 ASP.NET 網站,一個一看就懂的案例
最近在測 MCP,一開始看很多範例都是 Echo、GetWeather,Code 可以跑,但是我自己還是覺得有點難看出實際可以拿來幹嘛
所以這次換一個簡單一點的案例,讓你直接體驗 MCP 對於製作網站可以幹嘛
我用 .NET 10 ASP.NET Core 做一個星座頁面,同時讓 Server 支援 MCP
接著把這個 MCP Server 加到 OpenCode,我只要在 OpenCode 輸入:
今天是 2026-09-16
請幫我產生雙子座今天的星座運勢,
使用繁體中文,大約 100 字,
產生完成後更新到網站。
OpenCode 產生完內容之後,再透過 MCP Tool 更新 ASP.NET Core Server,這篇先不接 Database,也不自己串 AI API
先單純測:
OpenCode
↓
產生雙子座運勢
↓
MCP Tool
↓
ASP.NET Core
↓
更新網站
建立 .NET 10 Project
先建立一個最簡單的 ASP.NET Core Project:McpHoroscope
安裝 MCP Package:
dotnet add package ModelContextProtocol.AspNetCore
這次用 ASP.NET Core 直接提供 HTTP MCP Server,這樣可以省很多事情。
HoroscopeService
這篇只是測 MCP,所以資料先放 Memory 就好。
建立 HoroscopeService.cs
namespace McpHoroscope;
public sealed class HoroscopeService
{
private string _content =
"今日雙子座運勢尚未更新。";
private DateTimeOffset? _updatedAt;
public Horoscope Get()
{
return new Horoscope(
_content,
_updatedAt);
}
public void Update(string content)
{
_content = content;
_updatedAt = DateTimeOffset.Now;
}
}
public sealed record Horoscope(
string Content,
DateTimeOffset? UpdatedAt);
現在網站一開始就先顯示:今日雙子座運勢尚未更新。
等等 OpenCode 透過 MCP 把這個值改掉。
建立 MCP Tool
接著建立 HoroscopeTools.cs
using System.ComponentModel;
using ModelContextProtocol.Server;
namespace McpHoroscope;
[McpServerToolType]
public static class HoroscopeTools
{
[McpServerTool]
[Description(
"Update today's Gemini horoscope displayed on the website.")]
public static string UpdateHoroscope(
[Description(
"Traditional Chinese horoscope content displayed on the website.")]
string content,
HoroscopeService horoscopeService)
{
horoscopeService.Update(content);
return "Horoscope updated successfully.";
}
}
這次 MCP 只有一個 Tool:UpdateHoroscope
參數也只有 content。
HoroscopeService 是 ASP.NET Core DI 裡面的 Service,不需要讓 OpenCode 傳進來。
所以 OpenCode 要做的事情其實很單純:
產生運勢
↓
UpdateHoroscope(content)
畢竟我們就是要最簡單的範例,太複雜你就不知道我在寫啥東西。
Program.cs
接著修改 Program.cs
using System.Net;
using McpHoroscope;
using ModelContextProtocol.AspNetCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<HoroscopeService>();
builder.Services
.AddMcpServer()
.WithHttpTransport(options =>
{
options.SessionMode =
HttpServerSessionMode.Stateless;
})
.WithTools<HoroscopeTools>();
var app = builder.Build();
app.MapGet(
"/",
(HoroscopeService horoscopeService) =>
{
var horoscope =
horoscopeService.Get();
var content =
WebUtility.HtmlEncode(
horoscope.Content);
var updatedAt =
horoscope.UpdatedAt is null
? "尚未更新"
: horoscope.UpdatedAt.Value
.ToString("yyyy-MM-dd HH:mm:ss");
var html = $$"""
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="utf-8">
<title>雙子座今日運勢</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 720px;
margin: 80px auto;
padding: 0 20px;
line-height: 1.8;
}
.card {
padding: 30px;
border: 1px solid #ddd;
border-radius: 12px;
}
.time {
margin-top: 20px;
color: #777;
font-size: 14px;
}
</style>
</head>
<body>
<div class="card">
<h1>雙子座今日運勢</h1>
<p>{{content}}</p>
<div class="time">
Updated: {{updatedAt}}
</div>
</div>
</body>
</html>
""";
return Results.Content(
html,
"text/html; charset=utf-8");
});
app.MapMcp("/mcp");
app.Run("http://localhost:5100");
這邊比較重要的就是 app.MapMcp("/mcp");
MCP Endpoint 就會放在:http://localhost:5100/mcp
這個案例沒有 Session 狀態要保存,所以直接使用 Stateless 就好
執行起來後網址在 http://localhost:5100
OpenCode 加入 MCP Server
接著換 OpenCode,在 Project 建立 opencode.jsonc
加入:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"horoscope": {
"type": "remote",
"url": "http://localhost:5100/mcp",
"oauth": false,
"protocol": "auto",
"codemode": false
}
}
}
}
OpenCode 可以直接連 Remote MCP Server,這邊就是連 http://localhost:5100/mcp
設定完成之後可以先確認:
opencode mcp list
正常應該可以看到 horoscope connected
這樣就可以開始測了
直接在 OpenCode 下 Prompt
現在我直接在 OpenCode 輸入
今天是 2026-09-16
請幫我產生雙子座今天的星座運勢,
使用繁體中文,大約 100 字,
適合直接顯示在網站上。
產生完成後,
請更新網站上的雙子座今日運勢。
這邊我故意沒有寫請呼叫 UpdateHoroscope
就是想看 OpenCode 能不能自己判斷,現在 MCP Server 已經提供 UpdateHoroscope
而且 Description 也寫清楚是拿來更新網站上的雙子座運勢
所以 OpenCode 產生完內容之後,就可以自己呼叫這個 Tool
例如產生:
今天雙子座思緒相當活躍,工作上容易出現新的想法,
適合處理需要溝通或整理的事情。感情方面不要急著猜測
對方的想法,多一點直接交流反而比較順利。今天行程
可能有臨時變化,保留一點彈性會比較輕鬆。
接著呼叫 UpdateHoroscope,把剛剛產生的文字放進 content
這時流程就是
OpenCode
↓
MCP
↓
UpdateHoroscope
↓
HoroscopeService.Update()
Server 上面的資料就被改掉了
Result:

簡單結論一下
這個案例比較有意思的是 ASP.NET Core 本身不用另外接 AI,AI 已經在 OpenCode 裡面,.NET 這邊只要把原本可以做的事情透過 MCP Tool 提供出去
所以這次不是讓 OpenCode 去改 Source Code,而是直接透過 MCP 操作正在執行中的 ASP.NET Core Server
案例看起來很簡單,但是如果後面再加 UpdateSeoDescription、UpdateHomeBanner、PublishHoroscope 這些
Tool,就可以讓 OpenCode 根據需求自己選擇要執行哪些動作
這篇先做到 UpdateHoroscope 就好
另外現在 /mcp 沒有 Authentication,只適合 localhost
測試
真的放到外網,而且 Tool 可以修改 Server Data,就一定還要補 Authentication 跟 Authorization
這樣之後你就可以在你網站製作一些MCP,然後透過 AI Agent 去做一些騷操作譬如取得log 然後改系統內容之類的.
2026-09-11
[C#] JavaScript WebCrypto + ASP.NET Core 實作 ECDSA Signature 驗證
最近在看 API Client 驗證這一塊
一般除了 Token 之外,可能還會再加 DeviceId、Fingerprint 之類的資訊,用來判斷是不是原本那台 Client
但這些東西本質上還是 Client 傳一個值給 Server
如果真的想確認 Client 還是不是原本那個,就可以再多一層 Key Proof
2026-09-04
[Javascript] Summernote Codeview 整合 Monaco Editor,每次開啟自動 Format HTML
2026-08-28
[C#] .NET 10 RDP Honeypot:記錄來源 IP、帳號與登入資訊
之前有寫過一篇:
Creating a Mock
RDP Server in C#
那時候主要就是用 C# 做一個假的 RDP Server,讓外面的 Scanner 連過來時,會認為這台機器真的有開 RDP
不過做完之後我一直想知道一件事:
這些一直掃 RDP 的 Bot,到底拿什麼帳號密碼在試,或是你自己密碼有沒有真的被偷走
所以最近把它補完,弄成一個新的專案 FakeRDP
GitHub:
https://github.com/donma/FakeRDP
2026-08-13
[C#] 幾個可以順手增加效能的小技巧
寫 C# 久了之後,會發現效能改善不一定都要做到很複雜
很多時候不是要換架構,也不是一定要上什麼很進階的技巧, 反而只是一些平常寫 Code 時的小習慣
例如少查一次 Dictionary、少產生一個 String、少配置一個 Array,單看一次幾乎沒有差
但如果這段程式每天跑幾十萬、幾百萬次,這些小地方累積起來其實就有差了..
2026-08-12
OpenCode 自接 API 中轉教學:設定 Limit 與 Reasoning 解決上下文壓縮錯誤
最近在 OpenCode IDE 上面接第三方中轉商的 API 中轉。
基本上只要對方有做 OpenAI Compatible API,要接進 OpenCode 都不難
Provider、baseURL、Model 設好,API Key 補上,大部分就可以直接跑
但我後來發現,自接模型雖然可以正常用,OpenCode 不一定知道這顆模型真正的規格
2026-08-11
[C#] .NET 10 使用 Scriban 動態載入 HTML 模板,執行期修改不用重新發布
前一篇測試了 RazorEngineCore,主要目的就是希望在 .NET 10 裡面
可以做到像以前 ASPX 一樣,前端頁面可以直接修改,不用每次都重新 Build、Publish、Deploy..
2026-08-07
[C#] .NET 10 如何動態載入 cshtml?使用 RazorEngineCore 實現免重新編譯
最近在測試 .NET 10 製作網站時,遇到一個很現實的問題
以前使用 ASP.NET Web Forms,只要建立一個 product.aspx?id=1,
我就可以去更改 .aspx 裡面的內容或是樣式
設計師修改版面時,只要替換 .aspx,完全不用重新編譯整個網站
但是到了 ASP.NET Core Razor Pages,.cshtml 預設會在發布時編譯進 DLL
2026-08-04
[C#] Agnes AI 影片生成 API 教學:自動產生影片並下載 MP4
2026-07-31
[C#] 串接 Agnes AI 生圖 API:agnes-image-2.1-flash 完整實作
最近都一直在測試有沒有可以產生圖片的 AI,看到 Agnes AI 有提供圖片生成 API,目前 agnes-image-2.1-flash 產生圖片的價格是 $0 / 張。
這時候我就感興趣了,可以有不用錢又可以透過程式產生圖片的機會,當然要用一波,畢竟現在 token 都好貴 :'(
2026-07-20
Chrome 內建 AI 模型,直接從網頁呼叫
今年 (2026) 2 月,Google 開始陸續推出讓用戶可在 Chrome 設定中輕鬆關閉並移除模型的功能
一旦停用後,模型便不會進行下載或更新,這不就代表,有些電腦如果使用 Chrome 我就可以在裡面調用模型?
這時候就可以在一些環境下使用模型來做一些事情,當然你電腦要有一定等級..
2026-07-10
[C#] 解決 GitHub 圖片 429 錯誤:轉換 jsDelivr CDN 網址
最近我遇到一個 GitHub 圖片載入的問題
我習慣把 Blog 使用的一些圖片放在 GitHub Repository,網站直接使用 GitHub Raw URL 顯示圖片
原本一直都正常,但最近在單一 Client 一次讀取比較多圖片時,突然開始出現下面的錯誤
429: Too Many Requests
For more on scraping GitHub and how it may affect your rights,
please review our Terms of Service
(https://docs.github.com/en/site-policy/github-terms/github-terms-of-service).

2026-06-15
AI 眼中的美到底長怎樣?我燒 token 做了一批網站樣板實驗
最近應該很多人開始用 AI 製作不同的網站,或是產一些 UI 介面,我就很好奇一件事情,AI 對於「美」的看法到底是什麼?
畢竟美這件事情很主觀,有人覺得留白就是高級,有人覺得很空,有人覺得黑底加金色很有質感,有人覺得像詐騙網站,所以我就做了一個無聊、花錢、又有點花命的實驗。
我請不同模型去製作網站,看它們對各產業的配色看法,對於「美」加上「高質感」這種很抽象的要求,最後會做出什麼東西。
2026-05-04
[AI] 小米 Mimo2.5 Pro 免費 Token 實測:接 opencode 掃描 C# 專案心得
最近小米推出了 Mimo2.5 Pro,各家 Token 成本也越來越高。小米官方也推出了百萬億創造者激勵計畫
身為米粉當然一定要申請一波,申請網址:https://100t.xiaomimimo.com/
2026-04-24
[C#] CopilotClawD 開發心得:用 GitHub Copilot 打造可控的 AI Coding Agent
像 OpenClaw 這種東西我其實是會怕的,因為它太強了
越強的 Agent,代表它可以碰的地方越多,能做的事情也越多
可是回到我自己的使用場景,其實很單純,我大部分時間只是想拿來 寫 code、改 code、看 code,沒有真的想把整台機器都交給 Agent
所以後來我就想,那乾脆不要一開始就追求一隻超大超猛的怪獸,先自己開發一隻比較順手、比較可控、比較像工程師日常會真的用的小東西。
也就是這隻 "小蝦":CopilotClawD

2026-04-20
[AI] 一句「幫我編譯、執行、開 Edge、截圖」,Agent 到底跟 LLM 講了什麼?
很多人在看 Agent 系統時,會不小心把所有事情都算在 LLM 身上。
最後文章就會寫成一種很神奇的敘事:彷彿 LLM 看完一句話,突然就自己把專案 build 好、跑起來、開瀏覽器、順便截圖,像一個住在 GPU 裡的 DevOps 工程師。
但實際上不是這樣。
LLM 比較像「負責判斷下一步要做什麼的人」,真正去動手做事的是 Agent。
2026-04-09
不用本地部署也能玩 Gemma 4,OpenCode 搭配 Google AI Studio 實測
本來只是隨手確認一下 Gemma 4 有沒有進 AI Studio,結果測一測發現 OpenCode 也真的能接,這就值得記一篇了
不只可以下載到本地當模型,現在重點來了官方 Google AI Studio 在 2026-04-02
讓我們寫成是可以 白嫖免費使用/測試
gemma-4-26b-a4b-it 跟
gemma-4-31b-it
放進 AI Studio 跟 Gemini API
2026-03-31
NVIDIA Build 太香了吧?搭配 OpenCode 免費幫你寫程式
今天不寫程式,來聊聊好用的東西,如果你沒有使用 ChatGPT Codex 因為要錢,但是想體驗一下用 AI 寫程式的快感
推薦一個我覺得可以 白嫖 免費可以完整體驗 AI 幫你寫程式快感的工具,介紹的人比較少
但是玩了一下,值得推薦,就是 NVIDIA + opencode
2026-03-30
[C#] GitHub Copilot SDK + Shell 實測:讓 AI 直接掃描並修改整個專案
最近 ChatGPT Codex 跟 OpenCode + Github Copilot 玩得很兇,這時候我在想是不是要寫一個
外掛然後可以隨時用任何 IM 叫他繼續寫程式跟外掛,後來其實發現,可以直接透過 Github Copilot SDK + shell
就可以以自動改專案的程式..
2026-03-19
[C#] C# 串 GitHub Copilot CLI 實測,不用 Visual Studio 也能讓 AI 幫忙寫程式
最近朋友問我可不可以不透過 Visual Studio or Visual Code 呼叫 Github Copilot
感覺起來他就是要幹大事,其實問一下 AI 就知道可以不過我還是測試一下
畢竟可以讓程式自己寫程式,一直都是工程師的浪漫?
2026-03-06
[C#] Async 常見誤區:不是所有方法都需要 async Task
很多人一開始看 async/await,都會先把它當成語法糖。
我自己一開始也是這樣想
就覺得不就是把同步改成 await,讓 thread 不要卡住,看起來也比較現代一點,而且你現在用 copilot 應該也是 tab tab 就出來了
但真的在 API、網站服務,或是有點流量的系統裡用久之後,才會慢慢發現
async 不是只有能不能跑而已,它其實還會影響 效能、記憶體使用量,還有整體穩定度
有些 async code 表面上完全沒問題
但如果剛好寫在系統很常被呼叫的地方,它就可能一直默默建立 Task
平常流量小的時候不太有感,等到 request 一多,GC 開始變忙,延遲就會慢慢浮出來
2026-02-24
用 AI 重現 Zune Now Playing 的 Tile 特效
這個東西其實不是最近才想做,是以前就很想做,但一直拖著沒做完
早年我其實很喜歡 Microsoft Zune 那套 Now Playing 畫面,那種黑底、大字、專輯封面拼貼在背景慢慢動的感覺,第一次看到就是整個愛上
現在回頭看還是很有味道。以前有試著用 Silverlight 做過,但那個年代的東西後來也就一起沒了,這個坑就放了很多年..
2026-02-11
KKTICK TANK T6 手錶影片轉檔教學:466x466 AVI 正確 ffmpeg 參數解析
最近買了一隻 CP 值很高的手錶,這次實驗對象是 KKTICK TANK T6(沒有業配就不上連結了)。
因為有一些小需求,我想把自製影片放進手錶裡播放,但一開始就遇到問題
他附的內建轉檔軟體竟然一直出錯..
2026-02-04
[C#] record 與 class 的真正差別,其實不在語法
一開始看到 record,其實完全抓不到重點
看起來跟 class 很像,而 class 又早就被拿來跟 struct 比過無數次
現在再多一個 record,第一反應只覺得,是不是又一個學了也不一定會用到的語法糖..
2026-02-03
[C#] 從 try/catch 到 Result Pattern:讓錯誤回到主流程的寫法
最近在整理一段舊系統的商業邏輯時,發現錯誤處理幾乎清一色都是 try/catch + throw
現在其實已經是 21 世紀了,很多時候有更好的方法可以處理 try catch 跟以前學習的方式有點不同
這篇單純記錄我實際套用 Result Pattern 後的想法與最小可行寫法筆記一下..
2026-01-13
[C#] 處理農曆及潤月自由輸入生日的 DateTime 解析
最近遇到一個老專案,他之前設計都讓客戶自由輸入生日,不過幸好 placeholder 提示
至少他的客戶是乖乖輸入 國曆xx年xx月xx日,或是農曆xx年xx月xx日,但是他現在跟我說要算
天干地支跟五行...WT...
2026-01-12
2026-01-08
[Google 試算表] 指定欄位輸入時自動補日期 (僅限單一 Sheet)
幫一個朋友解決問題,他說他用 AI 嘗試過了,先說一下他的需求 他是在 Google Sheet 中
在 Column D 輸入任意值,如果同一列 ( Row) 的 B 欄位 ( Column) 如果有值就沒事,如果沒有就填入今天的日期
我順手測試一下,其實沒有很難啊,就簡單紀錄一下..
2026-01-07
[C#] Server 與 Client 全程走 MessagePack:一個 .NET 10 Web API 的實作紀錄
很多人聽過 MessagePack,但真正用在 Web API 上的機會其實不多,尤其是完整從 Client 到 Server 都走 binary 傳輸的情境
這篇文章用 .NET 10 示範一個最小可行的案例,實作一個只接受 MessagePack 的 Web API,並搭配一個 Client 呼叫範例
讓整個傳輸流程從頭到尾都清楚可以快速複製貼上了解











