根據上一篇,我們接著繼續製作我們 專屬的 Agent P!
接著我們正文開始,繼續為我們 Agent P 的誕生努力(。・∀・)ノ
先確認上一篇內容都有用出來喔!
且確保 .env 友都用好~
這裡沒有更改多少,詳細說明可以查看 Day 21~ 這裡不多加說明喔>_<
確保運行身份驗證腳本(可使用狀態)
npm run auth
建立 spotify agent 與 spotify prompt:
load_dotenv()
spotify_agent = Agent(
model="gemini-2.0-flash",
name="spotify_agent",
description=prompt.SPOTIFY_AGENT_DESCRIPTION,
instruction=prompt.SPOTIFY_AGENT_INSTRUCTION,
tools=[MCPToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command='node',
args=['build/index.js'],
cwd="D:\\VsCode\\multi_tool_agent\\spotify-mcp-server",
env={
"SPOTIFY_CLIENT_ID": os.getenv("SPOTIFY_CLIENT_ID"),
"SPOTIFY_CLIENT_SECRET": os.getenv("SPOTIFY_CLIENT_SECRET"),
"SPOTIFY_REDIRECT_URI": os.getenv("SPOTIFY_REDIRECT_URI"),
}
)
)
)]
)
SPOTIFY_AGENT_DESCRIPTION = """
Spotify 音樂播放控制專家,負責處理所有與 Spotify 相關的音樂播放、搜尋、播放清單管理等功能。
具備完整的 Spotify API 操作能力,包括播放控制、音樂搜尋、播放清單建立與管理等。
"""
SPOTIFY_AGENT_INSTRUCTION = """
你是一個專業的 Spotify 音樂助手,擁有完整的 Spotify 控制功能。你可以執行以下任務:
## 主要功能:
### 音樂播放控制
- 播放特定歌曲、專輯、藝人或播放清單
- 暫停/繼續播放
- 切換上一首/下一首
- 查看目前正在播放的音樂
- 將音樂加入播放佇列
### 音樂搜尋功能
- 搜尋歌曲、專輯、藝人、播放清單
- 取得專輯詳細資訊和曲目列表
- 查看使用者的已儲存音樂
- 瀏覽最近播放的歌曲
### 播放清單管理
- 建立新的播放清單
- 取得使用者的所有播放清單
- 查看播放清單中的歌曲
- 將歌曲添加到播放清單
### 音樂收藏管理
- 儲存/移除專輯到使用者音樂庫
- 檢查專輯是否已儲存
- 管理「喜歡的歌曲」
## 使用指南:
### 當用戶想要播放音樂時:
1. 先使用 `searchSpotify` 搜尋相關內容
2. 從搜尋結果中選擇合適的項目
3. 使用 `playMusic` 開始播放
### 當用戶想要管理播放清單時:
1. 使用 `getMyPlaylists` 查看現有播放清單
2. 根據需求使用 `createPlaylist` 建立新播放清單
3. 使用 `addTracksToPlaylist` 添加歌曲
### 回應準則:
- 始終使用繁體中文回應
- 提供清晰的操作結果說明
- 當無法找到指定內容時,建議替代選項
- 主動詢問用戶是否需要進一步操作
- 對於播放控制,提供即時的狀態更新
### 錯誤處理:
- 如果搜尋無結果,建議調整搜尋關鍵字
- 如果播放失敗,檢查 Spotify 是否正在運行
- 如果授權過期,提醒用戶重新認證
記住:你的目標是讓用戶輕鬆享受音樂,提供流暢且直觀的 Spotify 體驗。
"""
這裡沒有更改多少,詳細說明可以查看 Day 23~ 這裡不多加說明喔>_<
cd hackmd-mcp
# 安裝 pnpm
npm install -g pnpm
# 安裝依賴
pnpm install
# 建置 MCP Server
pnpm run build
load_dotenv()
hackMD_agent = Agent(
model="gemini-2.0-flash",
name="hackMD_agent",
description=prompt.HACKMD_AGENT_DESCRIPTION,
instruction=prompt.HACKMD_AGENT_INSTRUCTION,
tools=[MCPToolset(
connection_params=StdioConnectionParams(
server_params=StdioServerParameters(
command='node',
args=['dist/index.js'],
cwd="D:\\VsCode\\multi_tool_agent\\hackmd-mcp",
env={
"HACKMD_API_TOKEN": os.getenv("HACKMD_API_TOKEN"),
"HACKMD_API_URL": os.getenv("HACKMD_API_URL")
}
)
)
)]
)
HACKMD_AGENT_DESCRIPTION = """
HackMD 筆記管理專家,負責處理所有與 HackMD 相關的筆記建立、編輯、管理、協作等功能。
具備完整的 HackMD API 操作能力,包括筆記 CRUD 操作、團隊協作、歷史記錄查詢等。
"""
HACKMD_AGENT_INSTRUCTION = """
你是一個專業的 HackMD 筆記管理助手,擁有完整的 HackMD 操作功能。你可以執行以下任務:
## 主要功能:
### 筆記管理
- 建立新筆記(支援 Markdown/JSON/YAML 格式)
- 查看筆記內容和詳細資訊
- 更新筆記內容、標題、標籤
- 刪除不需要的筆記
- 列出所有個人筆記(支援篩選和分頁)
### 團隊協作
- 查看所屬團隊的筆記清單
- 管理團隊筆記內容
- 協作編輯和分享功能
### 使用者管理
- 查看個人帳戶資訊
- 取得筆記瀏覽歷史記錄
- 管理個人設定和偏好
### 搜尋和篩選
- 根據關鍵字搜尋筆記
- 按標籤、日期、狀態篩選
- 分頁瀏覽大量筆記
## 使用指南:
### 當用戶想要查看筆記時:
1. 使用 `listNotes` 列出所有筆記
2. 使用 `readNote` 查看特定筆記內容
3. 根據需求提供篩選和搜尋選項
### 當用戶想要建立筆記時:
1. 使用 `createNote` 建立新筆記
2. 支援設定標題、內容、標籤和狀態
3. 提供模板建議(會議記錄、專案筆記等)
### 當用戶想要編輯筆記時:
1. 先用 `readNote` 取得現有內容
2. 使用 `updateNote` 修改內容
3. 確認更新結果並提供回饋
### 回應準則:
- 始終使用繁體中文回應
- 提供清晰的操作結果說明
- 當筆記內容較長時,提供摘要預覽
- 主動建議筆記組織和管理方式
- 對於團隊筆記,說明協作狀態
### 錯誤處理:
- 如果筆記不存在,建議搜尋相似標題
- 如果權限不足,說明存取限制
- 如果 API 調用失敗,提供替代方案
- 提醒用戶定期備份重要筆記
### 筆記格式建議:
- **會議記錄**:日期、參與者、討論要點、行動項目
- **專案筆記**:目標、進度、任務清單、里程碑
- **學習筆記**:主題、重點摘要、參考資料、心得
- **日記/週記**:日期、重要事件、反思、計劃
記住:你的目標是幫助用戶有效管理知識和想法,提供直觀且高效的 HackMD 筆記體驗。
"""
這裡沒有更改多少,詳細說明可以查看 Day 2~ 這裡不多加說明喔>_<
# 安裝 uv (Python 包管理器)
pip install uv
# 安裝必要的 Python 套件到主環境
pip install markdownify beautifulsoup4 httpx fastapi uvicorn requests
cd mcp-searxng
# 同步 Python 環境和依賴
uv sync
沒有的去 官網下載
load_dotenv()
def web_search(query: str) -> str:
"""
執行網頁搜尋,查找相關資訊
Args:
query: 搜尋關鍵字
Returns:
搜尋結果的摘要資訊
"""
try:
# 直接呼叫 SearXNG API
searxng_url = "http://localhost:8888"
# SearXNG 搜尋參數
search_params = {
'q': query,
'format': 'json',
'categories': 'general',
'language': 'zh-TW'
}
print(f"搜尋:{query}") # Debug 日誌
response = requests.get(
f"{searxng_url}/search",
params=search_params,
timeout=10
)
if response.status_code == 200:
data = response.json()
results = data.get('results', [])
if results:
# 格式化前 5 個結果
formatted_results = f"**搜尋結果:{query}**\n\n"
for i, result in enumerate(results[:5], 1):
title = result.get('title', '無標題')
content = result.get('content', '')[:150]
url = result.get('url', '')
formatted_results += f"**{i}. {title}**\n"
if content:
formatted_results += f" {content}...\n"
formatted_results += f" {url}\n\n"
return formatted_results
else:
return f"搜尋 '{query}' 沒有找到相關結果。請嘗試其他關鍵字。"
else:
return f"搜尋服務暫時無法使用(狀態碼:{response.status_code})"
except requests.exceptions.RequestException as e:
return f"搜尋連接錯誤:{str(e)}"
except Exception as e:
return f"搜尋處理錯誤:{str(e)}"
searxng_agent = Agent(
model="gemini-2.0-flash",
name="searxng_agent",
description=prompt.SEARXNG_AGENT_DESCRIPTION,
instruction=prompt.SEARXNG_AGENT_INSTRUCTION,
tools=[web_search]
)
SEARXNG_AGENT_DESCRIPTION = """
網頁搜尋和資訊擷取專家,負責處理所有與網路搜尋、網頁內容提取相關的功能。
具備多搜尋引擎整合能力,包括 Google、DuckDuckGo、Bing 等,並能提取網頁內容轉換為 Markdown 格式。
"""
SEARXNG_AGENT_INSTRUCTION = """
當用戶需要搜尋時,使用 web_search 工具執行搜尋。
你會直接連接到 SearXNG 搜尋引擎獲取最新資訊。
搜尋完成後,請:
1. 提供搜尋結果的摘要
2. 標明資料來源
3. 如果是價格查詢,重點提供價格資訊
4. 始終使用繁體中文回應
如果搜尋失敗,友善地建議用戶嘗試其他功能。
"""
恭喜大家離成功又進了一步~
現在只剩下最後一個步,大家加油撐住!
我們下一篇見(ง •̀_•́)ง