上一篇使用 Cloudflare Clef 測試 XSS 字串,主要是利用 Decision Model 的 noul 判斷是否具有 XSS
特徵,再把機率輸出
後來翻了一下官方文件,發現 Clef 不只能處理文字,也可以直接傳圖片進去,而且也是不用花到錢
我自己平常有接觸泰國佛牌,我就想到有沒有可能直接用 Clef 來判斷法相-必打、七龍佛、坤平、崇迪、師父自身這些不同法像
目前就不苛責他能夠判斷來源年分,只要法相能對,這就有搞頭,畢竟可以做圖片初步分類..
兼任的偽善者,part-time的故事家,業餘的code generator,不服輸的夢想家,長不大的幼稚鬼,一個撿技術破爛的中年大叔
上一篇使用 Cloudflare Clef 測試 XSS 字串,主要是利用 Decision Model 的 noul 判斷是否具有 XSS
特徵,再把機率輸出
後來翻了一下官方文件,發現 Clef 不只能處理文字,也可以直接傳圖片進去,而且也是不用花到錢
我自己平常有接觸泰國佛牌,我就想到有沒有可能直接用 Clef 來判斷法相-必打、七龍佛、坤平、崇迪、師父自身這些不同法像
目前就不苛責他能夠判斷來源年分,只要法相能對,這就有搞頭,畢竟可以做圖片初步分類..
前陣子 JEV 這個 Decision Model 還蠻紅的,它跟一般 LLM 不太一樣,不是拿來聊天或產生長篇文字,而是針對問題直接做判斷,然後回傳機率
當然用法很多,就詳細去看其他大大的介紹文..
最近在翻 Cloudflare Workers AI 的模型清單,意外發現 Cloudflare 竟然也推出了類似的東西,叫做 Clef,而且 API 跟 JEV 的 System One 相容,而且免綁信用卡免費...
前面研究過 Tavily Search API,可以讓自己的 Web Agent 直接搜尋網路
後來翻了一下官方文件,發現 Tavily 還有 Extract API,可以直接讀取網頁內容,再轉成 Markdown 給 LLM 使用
這功能跟之前介紹的 Jina Reader 很像,不過 Tavily 還有個 Keyless 模式,不用註冊、不用 API Key,也不用綁信用卡
這個就有點意思了,這次直接用 C# HttpClient 來試試看
最近在開發 Web Agent,一直在找免費的 Web Search API
前面研究過 Exa、Jina,這次換來試試 Tavily
Tavily 是專門給 AI Agent 使用的搜尋 API,可以直接回傳網頁標題、網址與內容摘要,不需要自己解析 Google 搜尋頁面
重點是有免費額度,而且不用綁信用卡。
上一篇介紹了 Exa Search API,讓 AI Agent 可以直接搜尋網路,不需要再透過 Playwright 開啟瀏覽器,也不用自己解析 Google 的搜尋結果
不過搜尋只解決了一半的問題
AI Agent 找到網址之後,總要能讀取網頁內容吧,不然只有 Title、URL 跟幾段 Snippet,有些問題根本回答不了...
最近在開發 Web Agent,一直想弄個免費的 Web Search 備援
原本第一個想到 Google Search API,結果查了一下官方文件,Google 的 Custom Search JSON API 已經停止接受新用戶,既有用戶也得在 2027 年 1 月 1 日前完成遷移
以前好歹還有每天 100 次免費搜尋,現在連申請的機會都沒了 :'(
之前研究過 Exa Web Search API,直接回傳 JSON,還能取得網頁內容,確實方便,但免費額度用完還是得花錢
原本以為 DuckDuckGo 可以取代 Google,畢竟有純 HTML 搜尋頁面,用 C# HttpClient 抓下來 Parse 一下應該就搞定了
結果本機連續測試三次,全部 HTTP 403,沒想到 DuckDuckGo 防爬蟲也這麼兇...
後來把腦筋動到 Bing 頭上,測試發現一般搜尋頁面還能直接抓 HTML,不需要 Playwright,也不用啟動 Chromium
乾脆把 Bing 加進自己的 Web Agent,當作 DuckDuckGo 的 Fallback
如果你有在寫 AI Agent,你就知道搜尋(Web Search)是一件麻煩的事情
如果要用 Google,你別傻了,它們是最麻煩的,光是 API 申請、設定跟計費就夠煩了,當然你可以用 Playwright 直接開瀏覽器搜尋
但是就很消耗資源,你知道的...
我之前也試過用 C# HttpClient 直接抓 DuckDuckGo,原本以為只要解析搜尋結果的 HTML 就搞定了
結果連續三次 HTTP 403,連搜尋都還沒開始就被擋下來了 XD
其實 AI Agent 根本不需要一個完整的瀏覽器,它要的就是搜尋結果,最好直接給 JSON,包含標題、網址跟網頁內容,這樣才方便拿去餵給 LLM
最近找到一個不錯的服務 Exa,專門提供 AI Agent 使用的 Web Search API,不需要開瀏覽器,也不用自己解析 HTML,直接丟關鍵字就能取得搜尋結果
更吸引我的是 每個月免費提供 10 美元額度,而且不需要信用卡 ,所以簡單的說就是還是得花錢
上一篇測了 Cloudflare Workers AI 的 FLUX.1 Schnell
這次換另外一顆:
@cf/black-forest-labs/flux-2-klein-4b
這顆我覺得比 Schnell 更適合真的拿來做 Blog 圖片
原因很簡單,它可以直接設定圖片的寬高,也支援 seed , width , height ,所以如果我要 16:9,不用自己再裁圖
直接指定 1280 x 720 就可以
最近我一直在找可以直接用 API 產圖,而且成本不要太誇張的服務
最後又回頭看了一下 Cloudflare Workers AI
Cloudflare 其實不只有文字模型,它也有提供圖片生成模型,其中一個就是
@cf/black-forest-labs/flux-1-schnell
FLUX.1 Schnell 是 Black Forest Labs 的文字產圖模型,目前 Cloudflare 直接 Hosted,所以目前還免費,免費就是要給他用一下
對我來說比較重要的是,它可以直接透過 REST API 呼叫,所以 C# 要串其實非常簡單
最近在測 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
↓
更新網站
先建立一個最簡單的 ASP.NET Core Project:McpHoroscope
安裝 MCP Package:
dotnet add package ModelContextProtocol.AspNetCore
這次用 ASP.NET Core 直接提供 HTTP MCP Server,這樣可以省很多事情。
這篇只是測 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 把這個值改掉。
接著建立 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
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,在 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 輸入
今天是 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 然後改系統內容之類的.
最近在看 API Client 驗證這一塊
一般除了 Token 之外,可能還會再加 DeviceId、Fingerprint 之類的資訊,用來判斷是不是原本那台 Client
但這些東西本質上還是 Client 傳一個值給 Server
如果真的想確認 Client 還是不是原本那個,就可以再多一層 Key Proof