MCP Servers

ๆจกๅž‹ไธŠไธ‹ๆ–‡ๅ่ฎฎๆœๅŠกๅ™จใ€ๆก†ๆžถใ€SDK ๅ’Œๆจกๆฟ็š„็ปผๅˆ็›ฎๅฝ•ใ€‚

๐Ÿค– ๅŸบไบŽ MCP ๅ่ฎฎ็š„ๆ™บ่ƒฝ Agent ็ณป็ปŸ | ๆ”ฏๆŒๅคšๆŠ€่ƒฝ่ฐƒๅบฆใ€ๅทฅๅ…ท่ฐƒ็”จไธŽ RAG ๅขžๅผบ | Ollama + Vue 3 + FastAPI

ๅˆ›ๅปบไบŽ 1/19/2026
ๆ›ดๆ–ฐไบŽ 1 day ago
Repository documentation and setup instructions

SkillMCP-Agent

SkillMCP-Agent Banner

๐Ÿค– ๅŸบไบŽ MCP ๅ่ฎฎ็š„ๆ™บ่ƒฝ Agent ็ณป็ปŸ

ๆ”ฏๆŒๅคšๆŠ€่ƒฝ่ฐƒๅบฆใ€ๅทฅๅ…ท่ฐƒ็”จไธŽ RAG ๅขžๅผบ | 100% ็œŸๅฎžๆ•ฐๆฎ | ้›ถ่™šๆ‹Ÿ

Python FastAPI Vue License MCP GitHub release GitHub stars

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ | ๐Ÿ“– ่ฏฆ็ป†ๆ–‡ๆกฃ | ๐ŸŽฏ ๅŠŸ่ƒฝ็‰นๆ€ง | ๐Ÿ—บ๏ธ ่ทฏ็บฟๅ›พ | ๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—


๐ŸŽฏ ้กน็›ฎๆฆ‚่ฟฐ

SkillMCP-Agent ๆ˜ฏไธ€ไธช็”Ÿไบง็บง็š„ AI Agent ็ณป็ปŸ๏ผŒ้‡‡็”จๆจกๅ—ๅŒ–ๆžถๆž„่ฎพ่ฎก๏ผŒๅฎž็Žฐไบ†๏ผš

  • ๐Ÿง  ๆ™บ่ƒฝ่ง„ๅˆ’๏ผšๅคš่ฝฎๅฏน่ฏ็†่งฃ + ๆ„ๅ›พ่ฏ†ๅˆซ + ไปปๅŠกๅˆ†่งฃ
  • โšก ๆŠ€่ƒฝ่ฐƒๅบฆ๏ผšๅŸบไบŽ่ฏญไน‰ๅŒน้…็š„ๆŠ€่ƒฝ้€‰ๆ‹ฉไธŽๆ‰ง่กŒ
  • ๐Ÿ”ง MCP ๅทฅๅ…ท๏ผš้ตๅพช Model Context Protocol ่ง„่Œƒ็š„ๅทฅๅ…ท่ฐƒ็”จ
  • ๐Ÿ“š RAG ๅขžๅผบ๏ผšๅ‘้‡ๆฃ€็ดขๅขžๅผบ็”Ÿๆˆ๏ผŒๆ”ฏๆŒ็Ÿฅ่ฏ†ๅบ“้—ฎ็ญ”
  • ๐ŸŽจ ๅฏ่ง†ๅŒ–ๆŽงๅˆถๅฐ๏ผšVue 3 + Element Plus ๆž„ๅปบ็š„ Agent Console

ๆŠ€ๆœฏไบฎ็‚น

| ็‰นๆ€ง | ่ฏดๆ˜Ž | |------|------| | MCP ๅ่ฎฎ | ๅฎž็Žฐๆ ‡ๅ‡† MCP Server/Client๏ผŒๆ”ฏๆŒๅทฅๅ…ทๅ‘็ŽฐไธŽ่ฐƒ็”จ | | ๅคšๆจกๅž‹ๆ”ฏๆŒ | ๆ”ฏๆŒ OpenAIใ€Ollama ๆœฌๅœฐๆจกๅž‹ใ€่‡ชๅฎšไน‰ LLM | | ๆตๅผๅ“ๅบ” | SSE ๅฎžๆ—ถๆŽจ้€ Agent ๆ€่€ƒ่ฟ‡็จ‹ไธŽๆ‰ง่กŒ็Šถๆ€ | | ๆ‰ง่กŒ่ฟฝ่ธช | ๅฎŒๆ•ด็š„ๆ‰ง่กŒ้“พ่ทฏ่ฟฝ่ธชไธŽๅทฅๅ…ท่ฐƒ็”จ่ฎฐๅฝ• | | ็ƒญๆ’ๆ‹”ๆŠ€่ƒฝ | ้€š่ฟ‡่ฃ…้ฅฐๅ™จๅฟซ้€Ÿๆณจๅ†Œๆ–ฐๆŠ€่ƒฝ๏ผŒๆ— ้œ€ไฟฎๆ”นๆ ธๅฟƒไปฃ็  |


๐Ÿ— ๆžถๆž„่ฎพ่ฎก

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        Frontend (Vue 3)                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ ChatInput   โ”‚  โ”‚ MessageView โ”‚  โ”‚ DebugPanel / AgentTrace โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚ HTTP/SSE
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      FastAPI Backend                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚   /chat     โ”‚  โ”‚  /stream    โ”‚  โ”‚  /health  /sessions     โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
                              โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Agent Orchestrator                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ Planner  โ”‚โ†’ โ”‚ SkillSelectorโ”‚โ†’ โ”‚  Executor  โ”‚โ†’ โ”‚ Reasoner  โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚        โ†“              โ†“                โ†“                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚  Memory  โ”‚  โ”‚   Tracer     โ”‚  โ”‚ ToolRecord โ”‚                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                              โ”‚
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ–ผ               โ–ผ               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Skills Layer  โ”‚  โ”‚  MCP Client  โ”‚  โ”‚ RAG Pipeline โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚              โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ travel    โ”‚  โ”‚  โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚  โ”‚Embedderโ”‚  โ”‚
โ”‚  โ”‚ weather   โ”‚  โ”‚  โ”‚   โ”‚Tools โ”‚  โ”‚  โ”‚  โ”‚Chunker โ”‚  โ”‚
โ”‚  โ”‚ knowledge โ”‚  โ”‚  โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ”‚  โ”‚Retriev โ”‚  โ”‚
โ”‚  โ”‚ summarize โ”‚  โ”‚  โ”‚              โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
                             โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚    MCP Server    โ”‚
                   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
                   โ”‚  โ”‚train_query โ”‚  โ”‚
                   โ”‚  โ”‚weather_api โ”‚  โ”‚
                   โ”‚  โ”‚system_time โ”‚  โ”‚
                   โ”‚  โ”‚rag_retriev โ”‚  โ”‚
                   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ ธๅฟƒๆจกๅ—

| ๆจกๅ— | ่Œ่ดฃ | ๅ…ณ้”ฎ็ฑป | |------|------|--------| | Core | ๅŸบ็ก€่ฎพๆ–ฝ๏ผš้…็ฝฎใ€ๆ—ฅๅฟ—ใ€ๅผ‚ๅธธ | Settings, get_logger | | Agent | ไปปๅŠก่ง„ๅˆ’ไธŽๆ‰ง่กŒ่ฐƒๅบฆ | AgentOrchestrator, Planner, Executor | | Skills | ไธšๅŠกๆŠ€่ƒฝๅฐ่ฃ… | BaseSkill, SkillRegistry | | MCP | ๅทฅๅ…ทๅ่ฎฎๅฎž็Žฐ | MCPServer, MCPClient, BaseTool | | RAG | ๆฃ€็ดขๅขžๅผบ็”Ÿๆˆ | RAGPipeline, Embedder, VectorStore | | API | HTTP ๆŽฅๅฃๅฑ‚ | FastAPI, ChatService |


๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

็Žฏๅขƒ่ฆๆฑ‚

  • Python 3.10+
  • Node.js 18+ (ๅ‰็ซฏ)
  • Ollama (ๆœฌๅœฐๆจกๅž‹) ๆˆ– OpenAI API Key

ๅฎ‰่ฃ…ๆญฅ้ชค

# 1. ๅ…‹้š†้กน็›ฎ
git clone https://github.com/yourusername/SkillMCP-Agent.git
cd SkillMCP-Agent

# 2. ๅˆ›ๅปบ่™šๆ‹Ÿ็Žฏๅขƒ
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 3. ๅฎ‰่ฃ…ไพ่ต–
pip install -r requirements.txt

# 4. ้…็ฝฎ็Žฏๅขƒๅ˜้‡
cp .env.example .env
# ็ผ–่พ‘ .env ้…็ฝฎ LLM ๅ‚ๆ•ฐ

# 5. ๅฏๅŠจๅŽ็ซฏ
python -m uvicorn src.api.app:app --reload --port 8000

# 6. ๅฏๅŠจๅ‰็ซฏ (ๆ–ฐ็ปˆ็ซฏ)
cd frontend
npm install
npm run dev

้…็ฝฎ่ฏดๆ˜Ž

# .env ๆ–‡ไปถ

# LLM ้…็ฝฎ
LLM_PROVIDER=ollama              # ollama / openai
OLLAMA_MODEL=gemma3:latest       # Ollama ๆจกๅž‹ๅ
OLLAMA_EMBEDDING_MODEL=nomic-embed-text:latest

# OpenAI ้…็ฝฎ (ๅฏ้€‰)
OPENAI_API_KEY=sk-xxx
OPENAI_MODEL=gpt-4o-mini

# RAG ้…็ฝฎ
RAG_EMBEDDER_TYPE=ollama
EMBEDDING_DIMENSION=768

# ๆ—ฅๅฟ—
LOG_LEVEL=INFO

ๅฟซ้€Ÿ้ชŒ่ฏ

# ๅฅๅบทๆฃ€ๆŸฅ
curl http://localhost:8000/api/v1/health

# ๅ‘้€ๆถˆๆฏ
curl -X POST http://localhost:8000/api/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "ๅŒ—ไบฌไปŠๅคฉๅคฉๆฐ”ๆ€Žไนˆๆ ท๏ผŸ"}'

๐Ÿ”Œ ๆ‰ฉๅฑ•ๆŒ‡ๅ—

ๆ–ฐๅขž Skill

ๆŠ€่ƒฝๆ˜ฏไธšๅŠก้€ป่พ‘็š„ๅฐ่ฃ…ๅ•ๅ…ƒ๏ผŒ้€š่ฟ‡่ฃ…้ฅฐๅ™จๆณจๅ†Œ๏ผš

# src/skills/my_skill.py

from src.skills.base import BaseSkill, skill_registry

@skill_registry.register("my_skill")
class MySkill(BaseSkill):
    """ๆˆ‘็š„่‡ชๅฎšไน‰ๆŠ€่ƒฝ"""
    
    name = "my_skill"
    description = "่ฟ™ๆ˜ฏไธ€ไธช่‡ชๅฎšไน‰ๆŠ€่ƒฝ๏ผŒ็”จไบŽๅค„็†็‰นๅฎšไปปๅŠก"
    
    # ๆŠ€่ƒฝ่งฆๅ‘ๅ…ณ้”ฎ่ฏ
    keywords = ["ๅ…ณ้”ฎ่ฏ1", "ๅ…ณ้”ฎ่ฏ2", "็‰นๅฎšๅœบๆ™ฏ"]
    
    async def execute(self, query: str, context: dict = None) -> dict:
        """
        ๆ‰ง่กŒๆŠ€่ƒฝ้€ป่พ‘
        
        Args:
            query: ็”จๆˆท่พ“ๅ…ฅ
            context: ไธŠไธ‹ๆ–‡ไฟกๆฏ๏ผˆๅŒ…ๅซๅކๅฒๅฏน่ฏใ€็”จๆˆทไฟกๆฏ็ญ‰๏ผ‰
        
        Returns:
            dict: ๅŒ…ๅซ success, data, message ็š„็ป“ๆžœ
        """
        # 1. ่งฃๆž็”จๆˆทๆ„ๅ›พ
        intent = self._parse_intent(query)
        
        # 2. ่ฐƒ็”จ MCP ๅทฅๅ…ท (ๅฆ‚้œ€่ฆ)
        from src.mcp import get_mcp_client
        mcp = get_mcp_client()
        tool_result = await mcp.call_tool("my_tool", {"param": "value"})
        
        # 3. ๅค„็†็ป“ๆžœ
        return {
            "success": True,
            "data": {
                "result": tool_result,
                "processed": self._process(tool_result)
            },
            "message": "ๅค„็†ๅฎŒๆˆ"
        }
    
    def _parse_intent(self, query: str) -> str:
        # ๆ„ๅ›พ่งฃๆž้€ป่พ‘
        return "default"
    
    def _process(self, data: dict) -> dict:
        # ๆ•ฐๆฎๅค„็†้€ป่พ‘
        return data

ๆ–ฐๅขž MCP Tool

MCP ๅทฅๅ…ทๆ˜ฏๅฏ่ขซ Agent ่ฐƒ็”จ็š„ๅŽŸๅญ่ƒฝๅŠ›๏ผš

# src/mcp/tools/my_tool.py

from src.mcp.base import BaseTool, tool_registry

@tool_registry.register("my_tool")
class MyTool(BaseTool):
    """ๆˆ‘็š„ MCP ๅทฅๅ…ท"""
    
    name = "my_tool"
    description = "ๆ‰ง่กŒ็‰นๅฎšๆ“ไฝœ็š„ๅทฅๅ…ท"
    
    # ๅ‚ๆ•ฐ Schema (JSON Schema ๆ ผๅผ)
    parameters = {
        "type": "object",
        "properties": {
            "param1": {
                "type": "string",
                "description": "ๅ‚ๆ•ฐ1่ฏดๆ˜Ž"
            },
            "param2": {
                "type": "integer",
                "description": "ๅ‚ๆ•ฐ2่ฏดๆ˜Ž",
                "default": 10
            }
        },
        "required": ["param1"]
    }
    
    async def execute(self, **kwargs) -> dict:
        """
        ๆ‰ง่กŒๅทฅๅ…ท้€ป่พ‘
        
        Args:
            **kwargs: ๆ นๆฎ parameters schema ไผ ๅ…ฅ็š„ๅ‚ๆ•ฐ
        
        Returns:
            dict: ๅทฅๅ…ทๆ‰ง่กŒ็ป“ๆžœ
        """
        param1 = kwargs.get("param1")
        param2 = kwargs.get("param2", 10)
        
        # ๆ‰ง่กŒๅ…ทไฝ“้€ป่พ‘
        result = await self._do_something(param1, param2)
        
        return {
            "success": True,
            "data": result
        }
    
    async def _do_something(self, p1: str, p2: int) -> dict:
        # ๅฎž้™…ไธšๅŠก้€ป่พ‘
        return {"processed": f"{p1}-{p2}"}

ๆ–ฐๅขž RAG ๆ•ฐๆฎๆบ

# ๆทปๅŠ ๆ–‡ๆกฃๅˆฐ RAG ็Ÿฅ่ฏ†ๅบ“

from src.rag import get_rag_pipeline

pipeline = get_rag_pipeline()

# ๆ–นๅผ1: ไปŽๆ–‡ไปถๅŠ ่ฝฝ
await pipeline.load_documents("path/to/documents/")

# ๆ–นๅผ2: ็›ดๆŽฅๆทปๅŠ ๆ–‡ๆœฌ
await pipeline.add_texts([
    "่ฟ™ๆ˜ฏ็ฌฌไธ€ๆฎต็Ÿฅ่ฏ†ๅ†…ๅฎน...",
    "่ฟ™ๆ˜ฏ็ฌฌไบŒๆฎต็Ÿฅ่ฏ†ๅ†…ๅฎน...",
], metadata=[
    {"source": "manual", "category": "FAQ"},
    {"source": "manual", "category": "Guide"},
])

# ๆฃ€็ดข้ชŒ่ฏ
results = await pipeline.retrieve("็›ธๅ…ณ้—ฎ้ข˜", top_k=3)

๐Ÿ“ก API ๆ–‡ๆกฃ

POST /api/v1/chat

ๅ‘้€ๆถˆๆฏๅนถ่Žทๅ– Agent ๅ“ๅบ”

Request:

{
  "message": "ๅŒ—ไบฌๆ˜Žๅคฉ็š„ๅคฉๆฐ”ๆ€Žไนˆๆ ท๏ผŸ",
  "session_id": "optional-session-id",
  "stream": false
}

Response:

{
  "success": true,
  "data": {
    "response": "ๅŒ—ไบฌๆ˜Žๅคฉๆ™ด๏ผŒๆฐ”ๆธฉ 15-25ยฐC๏ผŒ้€‚ๅˆๅ‡บ่กŒใ€‚",
    "structured": {
      "intent": "weather",
      "skill": "weather_skill",
      "tools_called": ["weather_query"],
      "execution_time_ms": 1234
    }
  },
  "session_id": "sess_abc123",
  "trace_id": "trace_xyz789"
}

GET /api/v1/chat/stream

SSE ๆตๅผๅ“ๅบ”

Event Types:

  • thinking: Agent ๆ€่€ƒ่ฟ‡็จ‹
  • tool_call: ๅทฅๅ…ท่ฐƒ็”จไบ‹ไปถ
  • content: ๅ“ๅบ”ๅ†…ๅฎน็‰‡ๆฎต
  • done: ๅฎŒๆˆไฟกๅท

GET /api/v1/health

ๅฅๅบทๆฃ€ๆŸฅ

Response:

{
  "status": "healthy",
  "version": "1.0.0",
  "components": {
    "llm": "ok",
    "mcp": "ok",
    "rag": "ok"
  }
}

๐Ÿ“Š ๆ‰ง่กŒ่ฟฝ่ธช

็ณป็ปŸๅ†…็ฝฎๅฎŒๆ•ด็š„ๆ‰ง่กŒ่ฟฝ่ธช่ƒฝๅŠ›๏ผš

from src.agent import create_tracer, TraceEventType

# ๅˆ›ๅปบ่ฟฝ่ธชๅ™จ
tracer = create_tracer()
tracer.start(query="็”จๆˆทๆŸฅ่ฏข")

# ่ฟฝ่ธช่ง„ๅˆ’้˜ถๆฎต
with tracer.trace(TraceEventType.PLANNER_START):
    tracer.log_intent("weather")
    tracer.log_plan(["่งฃๆžๅŸŽๅธ‚", "ๆŸฅ่ฏขๅคฉๆฐ”", "ๆ ผๅผๅŒ–็ป“ๆžœ"])

# ่ฟฝ่ธชๅทฅๅ…ท่ฐƒ็”จ
tracer.log_tool_call(
    tool_name="weather_query",
    arguments={"city": "ๅŒ—ไบฌ"},
    result={"temp": 25},
    duration_ms=150
)

# ่Žทๅ–่ฟฝ่ธชๆŠฅๅ‘Š
report = tracer.get_report()
timeline = tracer.get_timeline()

ๆŽงๅˆถๅฐ่พ“ๅ‡บ็คบไพ‹:

๐Ÿš€ [agent_start] {"query": "ๅŒ—ไบฌๅคฉๆฐ”"}
  ๐ŸŽฏ [planner_start]
    ๐Ÿ’ก [planner_intent] {"intent": "weather"}
    ๐Ÿ“‹ [planner_plan] {"step_count": 3}
  โœ“ [planner_end] (15.2ms)
  โšก [skill_selected] {"skill": "weather_skill"}
  ๐Ÿ”ง [mcp_call_start] {"tool": "weather_query"}
  โœ“ [mcp_call_end] (150.3ms)
โœ… [agent_end] (320.5ms) {"total_tool_calls": 1}

๐Ÿงช ๆต‹่ฏ•

# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
pytest tests/ -v

# ่ฟ่กŒ็‰นๅฎšๆต‹่ฏ•
pytest tests/test_ollama.py -v

# ๆต‹่ฏ•่ฆ†็›–็އ
pytest tests/ --cov=src --cov-report=html

๐Ÿ“ ้กน็›ฎ็ป“ๆž„

SkillMCP-Agent/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ core/                # ๆ ธๅฟƒๅŸบ็ก€่ฎพๆ–ฝ
โ”‚   โ”‚   โ”œโ”€โ”€ config.py        # ้…็ฝฎ็ฎก็†
โ”‚   โ”‚   โ”œโ”€โ”€ logging.py       # ๆ—ฅๅฟ—็ณป็ปŸ
โ”‚   โ”‚   โ”œโ”€โ”€ exceptions.py    # ๅผ‚ๅธธๅฎšไน‰
โ”‚   โ”‚   โ””โ”€โ”€ ollama.py        # Ollama ๅฎขๆˆท็ซฏ
โ”‚   โ”œโ”€โ”€ agent/               # Agent ๆ ธๅฟƒ
โ”‚   โ”‚   โ”œโ”€โ”€ orchestrator.py  # ็ผ–ๆŽ’ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ planner.py       # ่ง„ๅˆ’ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ executor.py      # ๆ‰ง่กŒๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ reasoner.py      # ๆŽจ็†ๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ tracer.py        # ๆ‰ง่กŒ่ฟฝ่ธช
โ”‚   โ”‚   โ””โ”€โ”€ tool_recorder.py # ๅทฅๅ…ท่ฎฐๅฝ•
โ”‚   โ”œโ”€โ”€ skills/              # ๆŠ€่ƒฝๅฑ‚
โ”‚   โ”‚   โ”œโ”€โ”€ base.py          # ๆŠ€่ƒฝๅŸบ็ฑป
โ”‚   โ”‚   โ”œโ”€โ”€ registry.py      # ๆŠ€่ƒฝๆณจๅ†Œ่กจ
โ”‚   โ”‚   โ””โ”€โ”€ impl/            # ๆŠ€่ƒฝๅฎž็Žฐ
โ”‚   โ”œโ”€โ”€ mcp/                 # MCP ๅ่ฎฎๅฑ‚
โ”‚   โ”‚   โ”œโ”€โ”€ server.py        # MCP ๆœๅŠก็ซฏ
โ”‚   โ”‚   โ”œโ”€โ”€ client.py        # MCP ๅฎขๆˆท็ซฏ
โ”‚   โ”‚   โ”œโ”€โ”€ base.py          # ๅทฅๅ…ทๅŸบ็ฑป
โ”‚   โ”‚   โ””โ”€โ”€ tools/           # ๅทฅๅ…ทๅฎž็Žฐ
โ”‚   โ”œโ”€โ”€ rag/                 # RAG ๅญ็ณป็ปŸ
โ”‚   โ”‚   โ”œโ”€โ”€ pipeline.py      # RAG ๆตๆฐด็บฟ
โ”‚   โ”‚   โ”œโ”€โ”€ embedder.py      # ๅ‘้‡ๅŒ–
โ”‚   โ”‚   โ”œโ”€โ”€ chunker.py       # ๆ–‡ๆกฃๅˆ‡ๅˆ†
โ”‚   โ”‚   โ””โ”€โ”€ retriever.py     # ๆฃ€็ดขๅ™จ
โ”‚   โ””โ”€โ”€ api/                 # API ๅฑ‚
โ”‚       โ”œโ”€โ”€ app.py           # FastAPI ๅบ”็”จ
โ”‚       โ”œโ”€โ”€ routes/          # ่ทฏ็”ฑ
โ”‚       โ””โ”€โ”€ schemas/         # ๆ•ฐๆฎๆจกๅž‹
โ”œโ”€โ”€ frontend/                # Vue 3 ๅ‰็ซฏ
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ views/           # ้กต้ข
โ”‚   โ”‚   โ”œโ”€โ”€ components/      # ็ป„ไปถ
โ”‚   โ”‚   โ””โ”€โ”€ api/             # API ่ฐƒ็”จ
โ”‚   โ””โ”€โ”€ vite.config.js
โ”œโ”€โ”€ tests/                   # ๆต‹่ฏ•
โ”œโ”€โ”€ docs/                    # ๆ–‡ๆกฃ
โ””โ”€โ”€ requirements.txt

๐Ÿ›  ๆŠ€ๆœฏๆ ˆ

ๅŽ็ซฏ:

  • Python 3.10+
  • FastAPI - ้ซ˜ๆ€ง่ƒฝ Web ๆก†ๆžถ
  • Pydantic - ๆ•ฐๆฎ้ชŒ่ฏ
  • httpx - ๅผ‚ๆญฅ HTTP ๅฎขๆˆท็ซฏ
  • FAISS - ๅ‘้‡ๅญ˜ๅ‚จ

ๅ‰็ซฏ:

  • Vue 3 - ๅ“ๅบ”ๅผๆก†ๆžถ
  • Vite - ๆž„ๅปบๅทฅๅ…ท
  • Element Plus - UI ็ป„ไปถๅบ“
  • Pinia - ็Šถๆ€็ฎก็†

LLM:

  • Ollama - ๆœฌๅœฐๆจกๅž‹้ƒจ็ฝฒ
  • OpenAI API - ไบ‘็ซฏๆจกๅž‹

๐Ÿ“ License

MIT License


๐Ÿค Contributing

ๆฌข่ฟŽๆไบค Issue ๅ’Œ Pull Request๏ผ

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบ็‰นๆ€งๅˆ†ๆ”ฏ (git checkout -b feature/amazing-feature)
  3. ๆไบคๆ›ดๆ”น (git commit -m 'Add amazing feature')
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (git push origin feature/amazing-feature)
  5. ๆไบค Pull Request

ๅฆ‚ๆžœ่ฟ™ไธช้กน็›ฎๅฏนไฝ ๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท็ป™ไธ€ไธช โญ Star๏ผ

ๅฟซ้€Ÿ่ฎพ็ฝฎ
ๆญคๆœๅŠกๅ™จ็š„ๅฎ‰่ฃ…ๆŒ‡ๅ—

ๅฎ‰่ฃ…ๅŒ… ๏ผˆๅฆ‚ๆžœ้œ€่ฆ๏ผ‰

uvx skillmcp-agent

Cursor ้…็ฝฎ (mcp.json)

{ "mcpServers": { "shihan-1147-skillmcp-agent": { "command": "uvx", "args": [ "skillmcp-agent" ] } } }