2026-09-18

[C#] .NET 10 MCP Authentication:讓 OpenCode 使用 Bearer Token 連 ASP.NET MCP Server

上一篇已經讓 .NET 10 ASP.NET Core 支援 MCP,OpenCode 也可以直接呼叫 UpdateHoroscope 去修改網站上的雙子座運勢

不過上一篇是直接連 http://localhost:5100/mcp

本機測試當然沒差,但如果真的放到 Server 上,這樣我自己是不太敢用

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

案例看起來很簡單,但是如果後面再加 UpdateSeoDescriptionUpdateHomeBannerPublishHoroscope 這些 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

最近常常要幫客戶改後台裡面的 HTML,不過實際上大部分客戶根本不會自己去碰 Code

但如果直接把後台換成純 HTML Editor 也不太實際,客戶看到一堆 HTML 應該只會更不想改,而且像貼文字、改段落、上傳圖片這些操作,Summernote 這種 WYSIWYG 還是比較符合直覺 所以 Summernote 我還是想留著


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 不一定知道這顆模型真正的規格


[C#] .NET 10 動態模板實作:Fluid 讓 HTML 不用重新 Build 就能修改

前一篇測試了 Scriban,主要目的就是希望在 .NET 10 裡面
可以讓前端頁面在執行期直接修改,不用每次都重新 Build、Publish、Deploy..


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

最近一直在測試各種可以產生圖片與影片的 AI API

前一篇測試了 Agnes AI 的圖片生成, 既然圖片可以直接用 API 產生,當然就會想看看影片是不是也可以

結果 Agnes AI 也有提供 agnes-video-v2.0 影片生成模型,而且可以直接透過 API 呼叫

Agnes AI 官方目前也將圖片與影片模型列為可透過 API 使用的多模態功能



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).