2026-10-16
2026-10-15
[C#] Tavily Extract Keyless 教學:不用 API Key,免費將網頁轉成 Markdown
前面研究過 Tavily Search API,可以讓自己的 Web Agent 直接搜尋網路
後來翻了一下官方文件,發現 Tavily 還有 Extract API,可以直接讀取網頁內容,再轉成 Markdown 給 LLM 使用
這功能跟之前介紹的 Jina Reader 很像,不過 Tavily 還有個 Keyless 模式,不用註冊、不用 API Key,也不用綁信用卡
這個就有點意思了,這次直接用 C# HttpClient 來試試看
2026-10-14
[C#] AI Agent 免費網路搜尋教學:Tavily Search API 實作,每月 1,000 次免費搜尋
最近在開發 Web Agent,一直在找免費的 Web Search API
前面研究過 Exa、Jina,這次換來試試 Tavily
Tavily 是專門給 AI Agent 使用的搜尋 API,可以直接回傳網頁標題、網址與內容摘要,不需要自己解析 Google 搜尋頁面
重點是有免費額度,而且不用綁信用卡。
2026-10-13
[C#] AI Agent 實作 Web Fetch,使用 Jina Reader 免費將網頁轉成 Markdown
上一篇介紹了 Exa Search API,讓 AI Agent 可以直接搜尋網路,不需要再透過 Playwright 開啟瀏覽器,也不用自己解析 Google 的搜尋結果
不過搜尋只解決了一半的問題
AI Agent 找到網址之後,總要能讀取網頁內容吧,不然只有 Title、URL 跟幾段 Snippet,有些問題根本回答不了...
2026-10-12
[C#] 免費 Web Search 實作:HttpClient 抓 Bing 搜尋結果並轉成 JSON
最近在開發 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
[C#] AI Agent 如何搜尋網路?Exa Search API 免費額度與實作教學
如果你有在寫 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 美元額度,而且不需要信用卡 ,所以簡單的說就是還是得花錢
2026-10-07
[C#] Cloudflare FLUX.2 Klein 4B C# 教學:用 Workers AI 直接產生 16:9 AI 圖片
上一篇測了 Cloudflare Workers AI 的 FLUX.1 Schnell
這次換另外一顆:
@cf/black-forest-labs/flux-2-klein-4b
這顆我覺得比 Schnell 更適合真的拿來做 Blog 圖片
原因很簡單,它可以直接設定圖片的寬高,也支援 seed , width , height ,所以如果我要 16:9,不用自己再裁圖
直接指定 1280 x 720 就可以
[C#] Cloudflare FLUX.1 Schnell C# 教學:用 Workers AI API 免費產生 AI 圖片
最近我一直在找可以直接用 API 產圖,而且成本不要太誇張的服務
最後又回頭看了一下 Cloudflare Workers AI
Cloudflare 其實不只有文字模型,它也有提供圖片生成模型,其中一個就是
@cf/black-forest-labs/flux-1-schnell
(這張就是透過 black-forest-labs/flux-1-schnell 生成的)
FLUX.1 Schnell 是 Black Forest Labs 的文字產圖模型,目前 Cloudflare 直接 Hosted,所以目前還免費,免費就是要給他用一下
對我來說比較重要的是,它可以直接透過 REST API 呼叫,所以 C# 要串其實非常簡單
2026-09-18
[C#] .NET 10 MCP Authentication:讓 OpenCode 使用 Bearer Token 連 ASP.NET 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
案例看起來很簡單,但是如果後面再加 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,單看一次幾乎沒有差
但如果這段程式每天跑幾十萬、幾百萬次,這些小地方累積起來其實就有差了..









