Initial commit: jina-scraper-agent-v2 with 1 tools - src/server/mcp_server.py

This commit is contained in:
2026-02-01 16:43:29 +00:00
parent 186eeee891
commit 3179b08c41
+136
View File
@@ -0,0 +1,136 @@
"""
MCP 服务器 - jina-scraper-agent-v2-754266
Agent with 1 external tools
使用 Pydantic AI 和 FastMCP 框架。
自动生成时间: 2026-02-01T16:43:20.045391
"""
import json
import os
from typing import Optional
import httpx
from mcp.server.fastmcp import FastMCP
from pydantic_ai import Agent
# ==================== 配置 ====================
# LiteLLM Gateway 配置
_BASE_URL = os.getenv('OPENAI_BASE_URL',
os.getenv('LLM_BASE_URL', 'https://litellm.graystone-fb459c5d.southeastasia.azurecontainerapps.io/v1'))
_API_KEY = os.getenv('OPENAI_API_KEY', 'sk')
os.environ.setdefault('OPENAI_API_KEY', _API_KEY)
os.environ.setdefault('OPENAI_BASE_URL', _BASE_URL)
# 模型名称(pydantic_ai 需要 openai: 前缀)
def _get_model_name() -> str:
model = os.getenv('MODEL_NAME', os.getenv('LITELLM_MODEL', 'taiji/gpt-4o-mini'))
return model if ':' in model else f'openai:{model}'
MODEL_NAME = _get_model_name()
# ==================== MCP 服务器 ====================
server = FastMCP('jina-scraper-agent-v2-754266')
# 系统提示词
SYSTEM_PROMPT = """你是 jina-scraper-agent-v2-754266,一个专业的 AI 智能助手。
## 角色定位
Agent with 1 external tools
## 可用工具
- jina-web-scraper: Jina AI 网页爬虫工具,用于抓取网页内容
## 工作原则
1. 理解用户意图:仔细分析用户的请求,确保准确理解需求
2. 选择合适工具:根据需求选择最合适的工具来完成任务
3. 清晰反馈:以用户友好的方式呈现结果
4. 错误处理:遇到问题时提供有用的错误信息和建议
## 响应格式
- 对于数据查询:返回结构化的 JSON 数据
- 对于操作请求:返回操作状态和结果
- 始终使用中文与用户交流(除非用户使用其他语言)"""
def get_agent() -> Agent:
"""创建 Agent 实例(每次调用使用最新的 API Key)"""
return Agent(MODEL_NAME, system_prompt=SYSTEM_PROMPT)
# ==================== MCP 工具定义 ====================
@server.tool()
async def jina_web_scraper(url: str) -> str:
"""
Jina AI 网页爬虫工具,用于抓取网页内容
Args:
url: url 参数
Returns:
str: JSON 格式的响应结果
"""
try:
api_key = os.getenv("TOOL_API_KEY")
if not api_key:
return json.dumps({"error": "TOOL_API_KEY environment variable not set"})
headers = {
"Authorization": f"Bearer {api_key}"
}
target_url = f"https://r.jina.ai/{url}"
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
target_url,
headers=headers
)
response.raise_for_status()
return json.dumps({
"status_code": response.status_code,
"content": response.text,
"headers": dict(response.headers)
})
except httpx.HTTPStatusError as e:
return json.dumps({
"error": f"HTTP error occurred: {str(e)}",
"status_code": e.response.status_code,
"response": e.response.text
})
except httpx.RequestError as e:
return json.dumps({
"error": f"Request error occurred: {str(e)}"
})
except Exception as e:
return json.dumps({
"error": f"Unexpected error: {str(e)}"
})
# ==================== 工具映射(供 API 使用)====================
TOOL_MAP = {
'jina_web_scraper': jina_web_scraper,
}
TOOL_LIST = [
{
"name": "jina_web_scraper",
"description": "Jina AI 网页爬虫工具,用于抓取网页内容",
"inputSchema": {
"type": "object",
"properties": {"url": {"type": "string", "description": "url 参数"}},
"required": []
}
},
]
if __name__ == '__main__':
server.run()