.NET 10

.NET 10 MCP 實戰:讓 OpenCode 產生星座運勢並更新 ASP.NET 網站,一個一看就懂的案例

作者

本文透過一個簡單的雙子座運勢頁面,展示如何利用 .NET 10 ASP.NET Core 實作 Model Context Protocol (MCP) Server。開發者可以將網站的功能封裝成 MCP Tool,讓 AI Agent (如 OpenCode) 在產生內容後,直接透過 MCP 接口更新伺服器狀態,實現從 AI 產生到系統執行的自動化流程。

.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 然後改系統內容之類的.