from mcp.server.fastmcp import FastMCP
import httpx, re, io
from bs4 import BeautifulSoup
from urllib.parse import urljoin

mcp = FastMCP("gd-crawler")

H = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0.0.0 Safari/537.36",
     "Accept-Language": "zh-CN,zh;q=0.9"}

def _norm(u):
    u=u.strip()
    if not re.match(r'^https?://',u,re.I): u='http://'+u
    return u

@mcp.tool()
async def fetch_webpage(url: str) -> str:
    """抓网页正文，返回 Markdown 格式文本"""
    url=_norm(url)
    try:
        async with httpx.AsyncClient(follow_redirects=True,timeout=25,verify=False,headers=H) as c:
            r=await c.get(url); r.raise_for_status()
            soup=BeautifulSoup(r.text,'lxml')
            for t in soup(['script','style','noscript']): t.decompose()
            out=[]
            for el in soup.descendants:
                n=getattr(el,'name',None)
                if n is None:
                    x=str(el).strip()
                    if x: out.append(x)
                elif n=='a':
                    h=el.get('href',''); x=el.get_text(' ',strip=True)
                    if x and h: out.append(f'[{x}]({urljoin(str(r.url),h)})')
                elif n in ('h1','h2','h3'):
                    x=el.get_text(' ',strip=True)
                    if x: out.append('\n'+'#'*int(n[1])+' '+x+'\n')
                elif n in ('p','div','li','tr'):
                    x=el.get_text(' ',strip=True)
                    if x: out.append(x)
            return f'# {r.url}\n\n'+re.sub(r'\n{3,}','\n\n','\n'.join(out))[:80000]
    except Exception as e:
        return f'抓取失败: {e}'

@mcp.tool()
async def extract_links(url: str) -> str:
    """提取网页中所有超链接"""
    url=_norm(url)
    try:
        async with httpx.AsyncClient(follow_redirects=True,timeout=25,verify=False,headers=H) as c:
            r=await c.get(url); r.raise_for_status()
            soup=BeautifulSoup(r.text,'lxml')
            links=[]
            for a in soup.find_all('a',href=True):
                h=urljoin(str(r.url),a['href']); x=a.get_text(' ',strip=True)
                if h.startswith('http'):
                    links.append(f'[{x}]({h})' if x else h)
            return '\n'.join(links[:200])
    except Exception as e:
        return f'提取失败: {e}'

@mcp.tool()
async def search_web(query: str, max_results: int = 10) -> str:
    """联网搜索（DuckDuckGo），返回标题+摘要+链接"""
    try:
        from ddgs import DDGS
    except ImportError:
        from duckduckgo_search import DDGS
    res=[]
    try:
        with DDGS() as d:
            for r in d.text(query,max_results=max_results,region='cn-zh'):
                res.append(f"## {r.get('title','')}\n{r.get('body','')}\n{r.get('href','')}\n")
    except Exception as e:
        return f'搜索失败: {e}'
    return '\n---\n'.join(res) if res else '无结果'

@mcp.tool()
async def fetch_pdf(url: str, max_chars: int = 50000) -> str:
    """下载PDF并提取文本"""
    url=_norm(url)
    try:
        async with httpx.AsyncClient(follow_redirects=True,timeout=60,verify=False,headers=H) as c:
            r=await c.get(url); r.raise_for_status()
            data=r.content
        try:
            import pdfplumber
            parts=[]
            with pdfplumber.open(io.BytesIO(data)) as pdf:
                for i,p in enumerate(pdf.pages[:50]):
                    parts.append(f'--- 第{i+1}页 ---\n'+(p.extract_text() or ''))
            text='\n'.join(parts)
        except ImportError:
            import fitz
            doc=fitz.open(stream=data,filetype='pdf')
            text='\n'.join(f'--- 第{i+1}页 ---\n{p.get_text()}' for i,p in enumerate(doc))
            doc.close()
        return f'# PDF: {url}\n\n'+text[:max_chars]
    except Exception as e:
        return f'PDF失败: {e}'

mcp.run(transport='stdio')
