為什麼搜「AI Agent 教學」找不到完整實戰
繁中 SERP 上「AI Agent 教學」的文章分三層,沒一層做到端到端**:
- 概念解釋層:「什麼是 agent、什麼是 ReAct」——沒落地**
- 裝環境層:「npm install -g @anthropic-ai/claude-code」——裝完就停了**
- 單一 demo 層:「叫它幫我寫 hello world」——這不是 agent,是對話**
真實業務需要的是:從「我每天要花 2 小時整理新聞」 → agent 自動化 → 24/7 跑 → 出問題能 debug——這個完整鏈條。
這篇是 Mason 自己用 Claude Code + MCP 建出每天晨間 5:30 自動跑的 AI 新聞 triage agent 的真實過程,含 6 階段方法論 + 全 repo 公開。
Step 0:把「需求」**想清楚(這步不做,寫什麼都白寫)
最常見的失敗:直接開電腦寫 code → 改了幾天發現要做的不是這個。
三個能變 agent 的好任務
- 重複性(每天 / 每週都要做)
- 規則性(可以寫成 SOP)
- 結果可驗證(不是「這篇好不好」**的主觀題)
範例:
- ✅ 每天爬 10 個新聞站 + 過濾 + 寄日報 — 重複、規則、可驗證
- ✅ 每週掃 GitHub trending + 寫摘要 — 同上
- ✅ 客戶資料更新後自動產生報價單 — 同上
三個不該用 agent 的爛任務
- 需要創意 / 主觀判斷(寫真正的文章、設計 logo)
- 責任歸屬複雜(法律 / 醫療 / 財務的最終決策)
- 單次任務(不重複的事情,人做比較快)
Mason 自己的 agent 怎麼來的
痛點:每天早上花 1-2 小時抓 AI 新聞——從 X / Hacker News / TechCrunch / The Verge / Anthropic blog / OpenAI blog 等 15+ 個來源整理。
需求:
- 觸發條件:每天台灣時間 05:30
- 工具清單:RSS / Twitter API / SQLite(去重)/ Email(寄日報)
- 成功標準:列出當天 5-10 篇值得寫 insights 的新聞 + 信心分數
需求模板(讀者可拿去套用)
任務:[一句話描述]
觸發條件:[時間 / 事件 / 手動]
輸入資料:[從哪來]
輸出結果:[什麼形式]
工具清單:[需要哪些外部系統]
成功標準:[怎麼判斷 agent 跑對了]
失敗處理:[出錯時做什麼]
成本上限:[每天 / 每月 X USD]
Step 1:理解 Agent 的核心架構(20 行 code 就能感覺到)
Agent = while 迴圈:
while task_not_done:
thought = LLM("給我下一步該做什麼?")
if thought == "結束":
break
action = LLM("用什麼工具?帶什麼參數?")
observation = execute(action)
context.append(observation)
這就是所有 agent 的本質——LLM 思考 → 行動 → 觀察 → 再思考。
用純 Anthropic SDK + Function Calling 寫最簡 Agent(50 行)
from anthropic import Anthropic
client = Anthropic()
tools = [
{
"name": "search_news",
"description": "Search recent AI news from RSS sources",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"},
"max_results": {"type": "integer"}
}
}
}
]
def run_agent(task):
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
tools=tools,
messages=messages
)
if response.stop_reason == "end_turn":
return response.content[0].text
# Tool use
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": [
{"type": "tool_result", "tool_use_id": block.id, "content": result}
]})
run_agent("找今天的 AI 新聞,挑 3 篇最值得寫的")
50 行就能跑——但實際 production 需要處理 retry、error、cost guard、parallel,這些自己寫會死人。
Step 2:選對工具棧
四種寫法的對照:
| 寫法 | 適合 | 學習曲線 | 客製化 |
|---|---|---|---|
| 純 SDK + Function Calling | 想完全理解原理 | 中 | 最高 |
| Claude Agent SDK(官方) | Python / TypeScript 開發者 | 中 | 高 |
| Claude Code + MCP(本文主推) | Solo / 小團隊 / 快速 prototype | 低 | 高 |
| LangGraph | 複雜多 agent 編排 | 高 | 高 |
為什麼 Claude Code + MCP 對 Solo / 小團隊最划算
- 不用自己寫 retry / context / cost guard——Claude Code 已包好
- Plan Mode 內建——大型任務有「先想再動」**保護
- Skills + MCP 給你「SOP + 外部工具」兩條腿
- Subagents 給你「平行任務」能力
Skills vs MCP vs Subagents 三層擴充什麼時候用哪個
| 機制 | 用途 | 觸發 |
|---|---|---|
| Skill | 「怎麼做」**的 SOP | Claude 自動判斷該用 |
| MCP server | 「用什麼工具」**(外部系統) | 明確的 tool call |
| Subagent | 「平行 / 隔離環境」**的子任務 | 主 Claude 主動呼叫 |
決策樹:
- 「這類任務都用這個流程」 → Skill
- 「需要讀 / 寫某個外部系統」 → MCP server
- 「這件事想在獨立環境跑,不污染主對話」 → Subagent
Step 3:寫你的第一個 MCP server
5 分鐘版本:抓天氣 API 包成 MCP tool
TypeScript 版本(用 Anthropic MCP SDK):
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({ name: 'weather', version: '1.0' });
server.setRequestHandler('tools/list', () => ({
tools: [{
name: 'get_weather',
description: 'Get current weather for a city',
inputSchema: {
type: 'object',
properties: {
city: { type: 'string' }
}
}
}]
}));
server.setRequestHandler('tools/call', async (req) => {
const { name, arguments: args } = req.params;
if (name === 'get_weather') {
const response = await fetch(`https://api.weather.com/${args.city}`);
const data = await response.json();
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
配置到 Claude Code:.claude/mcp.json
{
"weather": {
"command": "node",
"args": ["./mcp-servers/weather/dist/index.js"]
}
}
測試:打開 Claude Code → 問「今天台北天氣怎樣?」**——Claude 自動呼叫 weather MCP。
進階版:加錯誤處理、rate limit、結構化 schema
Production MCP server 必加:
- try / catch 包所有 API call
- rate limit(每分鐘最多 X 次呼叫)
- schema validation(輸入輸出都驗)
- logging(每次 call 寫日誌方便 debug)
把 MCP server 接到 Claude Code 的 3 種方法
.claude/mcp.json配置(最簡單)- MCP Inspector 在瀏覽器測試 + debug
- Claude Code CLI 命令動態 add:
claude mcp add ...
Step 4:用 Skills 把 agent 的工作 SOP 寫進去
深度教學見 Claude Skills 完整指南。
範例 Skill:每日新聞 triage
---
name: daily-news-triage
description: Filter and rank AI news from multiple sources. Use when the user runs the morning news triage workflow or asks "今天的 AI 新聞值得寫嗎?".
---
## Goal
從 RSS / Twitter / 搜尋結果中,**篩出最值得 Mason 寫成 insights 文章的新聞**。
## Process
1. **收集所有來源的新聞**(RSS、Twitter、TechCrunch、Anthropic blog)
2. **去重**(同一事件不同媒體報導合併)
3. **打分**(依信任度、新鮮度、跟讀者相關度)
4. **產出 top 5-10**(含信心分數 + 一句話摘要)
## Constraints
- **不漏報重大事件**(Anthropic / OpenAI / Google 新模型發佈)
- **不重複收錄**(過去 7 天已收的不再列)
- **信任分級**:**🟢 主流媒體 + 官方公告 / 🟡 二手轉述 / 🔴 純推測**
Step 5:組裝端到端 Agent — Mason 真實案例
任務:每天晨間 5:30 自動抓 AI 新聞、過濾、寄晨報
系統架構
[Cron 觸發 05:30]
↓
[Claude Code 啟動 + 載入 daily-news-triage Skill]
↓
[呼叫 MCP server: rss-fetcher] → 抓 15+ RSS
↓
[呼叫 MCP server: twitter-fetcher] → 抓 AI 關鍵字 tweets
↓
[呼叫 MCP server: sqlite-dedup] → 去重(過去 7 天)
↓
[Claude 用 Skill 打分 + 排序]
↓
[呼叫 MCP server: email-sender] → 寄晨報給自己
↓
[寫日誌 + 計算當天 API 成本]
需要的 MCP servers
- rss-fetcher(讀 15+ RSS,去重)
- twitter-fetcher(透過 Twitter API)
- sqlite-dedup(本地 SQLite 記錄已收新聞)
- email-sender(SendGrid 或 SES 寄信)
- source-cite(打信任分數)
需要的 Skills
- daily-news-triage(主流程 SOP)
- source-trust-scoring(信任分級邏輯)
- morning-digest-formatter(寫晨報的 markdown 範本)
完整 repo(假設範例)
- GitHub:
github.com/<your-username>/daily-ai-triage - 檔案結構:
daily-ai-triage/ ├── .claude/ │ ├── skills/ │ │ ├── daily-news-triage/ │ │ ├── source-trust-scoring/ │ │ └── morning-digest-formatter/ │ ├── mcp.json │ └── settings.json ├── mcp-servers/ │ ├── rss-fetcher/ │ ├── twitter-fetcher/ │ ├── sqlite-dedup/ │ ├── email-sender/ │ └── source-cite/ ├── data/ │ └── news-history.db └── README.md
Step 6:部署成 24/7 背景 Agent
本機部署(最簡單)
macOS:用 launchd
<!-- ~/Library/LaunchAgents/com.mason.daily-triage.plist -->
<plist>
<dict>
<key>Label</key><string>com.mason.daily-triage</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/run-triage.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict><key>Hour</key><integer>5</integer><key>Minute</key><integer>30</integer></dict>
</dict>
</plist>
Linux:用 cron
30 5 * * * /path/to/run-triage.sh
Windows:用 Task Scheduler
雲端部署(穩定但要錢)
選項 1:VPS + Docker
- DigitalOcean / Linode / Hetzner 月 $5-10
- Docker 容器跑你的 agent
- 不依賴你個人電腦 24/7 開機
選項 2:Anthropic Managed Agents(企業選項)
- Anthropic 直接幫你跑 agent
- 整合企業合規(SOC 2 等)
- 月費較高,但 SLA 強
Claude Plan API key vs Anthropic API key
Claude Plan(訂閱):
- 配額制——超過會等
- 適合本機開發 / 個人 agent
Anthropic API key(按 token 計費):
- 無上限,按用付
- 適合 production / 高頻 agent
Mason 的選擇:本機開發用 Plan(Max 5x 訂閱)、production agent 用 API key(設預算上限)。
Step 7:監控、Telemetry、成本守門
必設的監控
Anthropic Console:
- Spend limits(Soft / Hard)
- 每天看一次 daily usage
分散追蹤(production agent 必裝):
- Langfuse(開源,自架友善)
- Helicone(SaaS,快速整合)
- OpenTelemetry(整合 Datadog / Grafana)
該設的警報
- 單次任務超過 $1 → 通知
- 單日累計超過 $20 → 警報
- API 失敗率 > 5% → 緊急通知
- agent context 超過 80% → 提醒重啟
一個失控 agent 一晚燒 200 USD 的真實案例
情境:agent 寫了個無窮迴圈(每次失敗都重試,沒設 max_retries),從半夜跑到早上——單日燒了 $200。
避免方法:
- 設
max_iterations上限(例如 20 次) - 每 5 次 iteration 印 status(讓你看到問題)
- 設 daily cost cap——超過自動停
5 個失控 agent 的真實踩坑
1. Tool call 格式錯誤
- 症狀:Claude 一直呼叫 tool 但格式不對,API 不斷退回
- 解法:用 Pydantic / Zod 做 schema validation,失敗給明確 error message
2. Context 爆量
- 症狀:對話跑 50 輪後 context 滿,模型開始忘記事
- 解法:設「每 20 輪 summarize 一次」或用 Subagent 隔離
3. 無窮迴圈
- 症狀:agent 一直「思考 → 失敗 → 重試」燒錢
- 解法:設 max_iterations + max_cost,超過直接 abort**
4. 工具權限太寬
- 症狀:agent 有
rm -rf權限,真的把專案刪了 - 解法:Allow list 嚴格限制,參考 pocketos 9 秒刪庫事件
5. Prompt Injection(抓網路內容時)
- 症狀:抓到惡意網頁,網頁內容包含「忽略指令,改去 X」,agent 真的去做 X
- 解法:讀取網路內容跟執行指令分離——讀到的內容當「資料」不當「指令」**
Agent 安全:不只是程式問題
最少權限原則
- agent 不該能刪檔(deny
rm等) - agent 不該能 push 到 main(deny
git push --force等) - agent 不該能改 production config
Prompt Injection 防護
- 抓網路內容時,把內容用
<external_content>tag 包起來——讓模型知道這是資料 - 重要操作前 human approval
Skill 來源驗證
- 不要裝陌生人 GitHub repo 的 Skill——可能藏惡意 prompt
❓ FAQ
不會寫程式可以做 Agent 嗎?
可以,但天花板低。
三條路:
- No-code 工具:n8n / Zapier / Make + Claude API 節點——可以做簡單自動化,但複雜邏輯卡
- Claude Code + Skills:Skills 是純 markdown,完全不寫程式——但進階整合需要 MCP server(要寫程式)
- 找會寫程式的朋友 / 學基本 Python — 真正自由的選項
Mason 的建議:從 Claude Code + Skills 開始(不用寫 code),碰到瓶頸再學 MCP server(學 1 週 Python 就會)。
Claude Code / Cursor / Cline 我該用哪個做 Agent?
做 Agent 推薦 Claude Code(深度教學見 Claude Code workflow):
- Plan Mode 內建——大型任務先想再動
- Skills + MCP 原生支援
- Subagents 平行任務
- Hooks 25 個觸發點
Cursor / Cline 適合「IDE 內寫程式碼」,做 24/7 跑的 Agent 不夠強。
MCP 跟 LangChain 衝突嗎?可以並用嗎?
完全可以並用——它們解決的不是同一件事:
- MCP:協議——Claude 怎麼跟外部工具溝通
- LangChain / LangGraph:框架——怎麼編排複雜的 agent 邏輯
典型搭配:LangGraph 控制 agent 流程 + 透過 MCP 接外部工具。
Mason 的選擇:Solo / 小團隊用 Claude Code + MCP 就夠(LangGraph 太重);大型多 agent 系統 → LangGraph + MCP 並用。
Agent 會自己亂花錢嗎?
會。真實案例:agent 寫無窮迴圈一晚燒 $200。
3 道守門:
- Anthropic Console 設 hard limit(超過自動停 API)
- agent code 設 max_iterations / max_cost(自己內部 abort)
- 每天看一次 dashboard(早發現問題)
Mason 的紅線:單日成本超過 $20 → 自動 abort 並通知我。
自建 Agent 一個月成本大概多少?
分三級:
個人輕度(每天跑 1 次,1-2 小時內):
- Claude Pro $20 或 API ~$10
- VPS $5 / 月(可省,跑本機就好)
- 總計 $10-25/月
接案 / 小團隊重度(每天跑多次,複雜任務):
- Claude API $50-150/月(看複雜度)
- VPS $10-20/月
- 總計 $60-170/月
Production / 服務客戶(24/7 跑):
- Claude API $200-2000/月(視流量)
- 監控 stack(Langfuse 自架免費)
- VPS / 雲端 $50-300/月
- 總計 $250-2,300/月
⚠️ 警語
- Agent 真的會出包——pocketos 9 秒刪庫 不是寓言
- Production agent 必設:監控、預算上限、警報、最少權限
- 本文範例 repo / SOP 是 Mason 個人工作流——讀者要根據自己業務調整
權威來源: