这是用户在 2025-6-25 6:13 为 https://claude.easychat.top/chat/eeb50ceb-bb8c-4527-8221-5fa774631f17 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
    BD

    优化它可能的问题,并告诉我具体的使用教程

    我来分析这个 Pixiv MCP 工具的代码,发现了几个潜在问题并提供优化方案。

    代码问题分析

    1. 认证状态检查不足 - 代码没有验证认证是否真正成功
    2. 错误处理不够细致 - 缺少对特定错误类型的处理
    3. API 限流保护缺失 - 没有处理 API 调用频率限制
    4. 缺少输入验证 - 对用户输入参数没有进行验证
    5. 异步处理可能不够优雅 - 某些场景下可能存在性能问题

    详细使用教程

    1. 环境准备

    安装依赖

    bash
    pip install pixivpy3 mcp

    获取 Pixiv Refresh Token

    1. 访问 Pixiv登录页面
    2. 打开浏览器开发者工具(F12)
    3. 登录你的 Pixiv 账号
    4. 在 Network 标签页中找到包含 refresh_token 的请求
    5. 复制 refresh_token 的值

    设置环境变量

    Windows:

    cmd
    set PIXIV_REFRESH_TOKEN=your_refresh_token_here

    macOS/Linux:

    bash
    export PIXIV_REFRESH_TOKEN=your_refresh_token_here

    永久设置(推荐):.bashrc.zshrc 中添加:

    bash
    export PIXIV_REFRESH_TOKEN="your_refresh_token_here"

    2. 配置 Claude Desktop

    编辑 Claude Desktop 配置文件:

    Windows: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["path/to/your/pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "your_refresh_token_here"
          }
        }
      }
    }

    3. 运行服务

    bash
    python pixiv_tool.py

    4. 可用功能

    🔍 搜索插画

    在Pixiv上搜索"初音未来"的插画,显示10张

    📊 获取排行榜

    显示Pixiv今日插画排行榜前5名
    显示本周排行榜
    显示本月排行榜

    💡 获取推荐

    显示推荐的插画作品

    👨‍🎨 查看画师作品

    显示画师ID为123456的作品

    ⭐ 查看我的收藏

    显示我最新收藏的作品

    🔧 检查状态

    检查Pixiv连接状态

    5. 主要改进

    1. 增强的错误处理 - 详细的错误分类和用户友好的错误信息
    2. 输入验证 - 防止无效参数导致的错误
    3. API限流保护 - 避免触发Pixiv的频率限制
    4. 认证状态验证 - 确保API调用前已正确认证
    5. 安全的数据访问 - 防止因API响应格式变化导致的崩溃
    6. 详细日志记录 - 便于问题排查和监控
    7. 状态检查工具 - 方便测试连接和认证状态

    6. 常见问题

    Q: 认证失败怎么办? A: 检查 REFRESH_TOKEN 是否正确,或重新获取新的 token

    Q: 搜索结果为空? A: 尝试使用不同的关键词,或检查网络连接

    Q: API调用失败? A: 可能是频率限制,稍等片刻后重试

    Q: 无法获取收藏? A: 确保你的收藏设置为公开,或检查账号权限

    这个优化版本提供了更稳定、更安全的 Pixiv API 访问体验,同时保持了原有的功能完整性。

    BD

    设置环境变量这一步用来做什么

    设置环境变量 PIXIV_REFRESH_TOKEN 的作用是安全地存储你的 Pixiv 账号认证凭据,让程序能够以你的身份访问 Pixiv API。

    为什么需要这个步骤?

    1. 身份认证

    • Pixiv API 需要验证你的身份才能让你搜索、查看排行榜、获取推荐等
    • REFRESH_TOKEN 就像是你的"数字身份证",证明你是合法的 Pixiv 用户

    2. 安全考虑

    • 如果直接把 token 写在代码里,任何看到代码的人都能盗用你的账号
    • 环境变量把敏感信息与代码分离,更安全

    3. 程序工作原理

    python
    # 程序会读取这个环境变量
    YOUR_REFRESH_TOKEN = os.getenv("PIXIV_REFRESH_TOKEN")
    
    # 然后用它来登录 Pixiv
    api.auth(refresh_token=YOUR_REFRESH_TOKEN)

    具体流程对比

    没有设置环境变量时:

    你的请求 → Pixiv API → ❌ "谁是你?请先登录!"

    设置环境变量后:

    你的请求 → 程序读取 TOKEN → 用 TOKEN 登录 Pixiv → ✅ "欢迎回来!" → 返回搜索结果

    实际例子

    假设你想搜索"猫咪"的插画:

    1. 没有 TOKEN:程序运行后会显示 ❌ 错误:未能在环境变量中找到 PIXIV_REFRESH_TOKEN
    2. 有 TOKEN:程序能成功登录,返回猫咪相关的插画列表

    类比理解

    这就像:

    • 图书馆借书:你需要出示借书证(TOKEN)才能借书(使用API)
    • 酒店入住:你需要身份证(TOKEN)才能办理入住(访问Pixiv数据)
    • 银行取款:你需要银行卡密码(TOKEN)才能取款(获取个人收藏等私人数据)

    总结:环境变量就是让程序知道"你是谁",这样它就能代表你去 Pixiv 获取数据了。没有这一步,程序就像一个没有身份的访客,什么都做不了。

    BD

    为什么llm客户端也有“"PIXIV_REFRESH_TOKEN": "your_refresh_token_here"

    这是个很好的问题!你发现了一个重要的配置细节。让我解释为什么在两个地方都需要设置 PIXIV_REFRESH_TOKEN

    两种设置方式的区别

    1. 系统环境变量(第一种方式)

    bash
    export PIXIV_REFRESH_TOKEN="your_token_here"
    • 这是设置在你的操作系统
    • 所有在这台电脑上运行的程序都能读取到

    2. Claude Desktop 配置文件(第二种方式)

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["path/to/your/pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "your_refresh_token_here"
          }
        }
      }
    }
    • 这是专门为 Claude Desktop 启动的程序设置的环境变量
    • 只有通过 Claude Desktop 运行的这个工具才能看到

    为什么需要在 Claude 配置中设置?

    1. 隔离性

    Claude Desktop 在启动 MCP 服务时,会创建一个独立的运行环境,这个环境可能无法直接访问你的系统环境变量。

    2. 优先级

    程序读取环境变量的优先级通常是:

    Claude配置中的env > 系统环境变量 > 程序默认值

    3. 安全控制

    Claude Desktop 可以精确控制每个 MCP 工具能访问哪些环境变量,而不是让它们访问所有系统变量。

    实际运行流程

    mermaid
    graph TD
        A[你在Claude中发送请求] --> B[Claude Desktop启动MCP服务]
        B --> C[读取claude_desktop_config.json]
        C --> D[使用配置中的env设置环境变量]
        D --> E[启动pixiv_tool.py]
        E --> F[程序读取PIXIV_REFRESH_TOKEN]
        F --> G[连接Pixiv API]

    推荐做法

    最佳实践是只在 Claude 配置文件中设置:

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["C:/path/to/pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "your_actual_token_here"
          }
        }
      }
    }

    这样的好处:

    • ✅ 简单明确,只需要设置一次
    • ✅ 安全性更好,token 只存在于 Claude 的配置中
    • ✅ 便于管理,所有 MCP 工具的配置都在一个地方

    类比理解

    这就像:

    • 系统环境变量 = 你家里的钥匙(所有家庭成员都能用)
    • Claude配置中的env = 专门给保姆的钥匙(只有保姆能用,用来完成特定任务)

    Claude Desktop 就像是"保姆",它需要专门的"钥匙"(token)来帮你完成 Pixiv 相关的任务,而不是使用你的"主钥匙"(系统环境变量)。

    BD

    看到你遇到了 "MCP 服务器启动失败" 的错误。这是一个常见问题,让我帮你逐步排查和解决。

    可能的原因和解决方案

    1. Python 环境问题

    首先检查 Python 是否正确安装:

    bash
    # 检查 Python 版本
    python --version
    # 或者
    python3 --version

    如果提示找不到 Python,你需要:

    • 安装 Python 3.8 或更高版本
    • 确保 Python 添加到了系统 PATH

    2. 依赖库未安装

    在命令行中安装必要的库:

    bash
    pip install pixivpy3 mcp
    # 或者如果上面不行,试试:
    pip3 install pixivpy3 mcp

    3. 文件路径问题

    从你的截图看,路径是 D:\MCP_Projects\Pixiv_MCP_2\pixiv_tool.py

    确保:

    • 文件确实存在于这个路径
    • 路径中没有特殊字符或空格问题
    • 文件有正确的读取权限

    4. 配置文件格式问题

    检查你的 claude_desktop_config.json 格式是否正确:

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["D:\\MCP_Projects\\Pixiv_MCP_2\\pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA"
          }
        }
      }
    }

    注意:

    • Windows 路径需要使用双反斜杠 \\ 或者正斜杠 /
    • JSON 格式必须严格正确(括号、引号、逗号)

    5. 测试运行

    在命令行中直接测试脚本:

    bash
    cd D:\MCP_Projects\Pixiv_MCP_2\
    set PIXIV_REFRESH_TOKEN=33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA
    python pixiv_tool.py

    这会告诉你具体的错误信息。

    6. 常见修复步骤

    1. 重启 Claude Desktop
    2. 检查防火墙设置(确保 Python 和 Claude 没有被阻止)
    3. 使用完整路径指定 Python
    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "C:\\Python\\python.exe",
          "args": ["D:\\MCP_Projects\\Pixiv_MCP_2\\pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA"
          }
        }
      }
    }

    7. 获取详细错误信息

    在你的 pixiv_tool.py 开头添加一些调试信息:

    python
    import sys
    print(f"Python version: {sys.version}")
    print(f"Python path: {sys.executable}")
    print("Script starting...")
    
    # 原有代码...

    立即尝试的解决方案

    1. 重新安装依赖
    bash
    pip uninstall pixivpy3 mcp
    pip install pixivpy3 mcp
    1. 修改配置文件路径格式
    json
    "args": ["D:/MCP_Projects/Pixiv_MCP_2/pixiv_tool.py"]
    1. 在命令行中测试
    bash
    python D:\MCP_Projects\Pixiv_MCP_2\pixiv_tool.py

    请先尝试这些步骤,然后告诉我具体的错误信息,这样我可以提供更精确的帮助。

    BD

    我运行安装依赖的指令后。指定路径并没有出现新的文件夹

    我明白你的困惑。让我澄清一下安装依赖库的过程:

    依赖库安装说明

    pip install 命令不会创建新文件夹

    当你运行 pip install pixivpy3 mcp 时:

    • 这些库被安装到 Python 的系统库目录,不是你的项目文件夹
    • 你的项目文件夹 D:\MCP_Projects\Pixiv_MCP_2\ 不会有任何变化
    • 库被安装到类似这样的位置:
      • C:\Python\Lib\site-packages\pixivpy3\
      • C:\Python\Lib\site-packages\mcp\

    如何验证安装是否成功

    在命令行中运行:

    bash
    python -c "import pixivpy3; print('pixivpy3 安装成功')"
    python -c "import mcp; print('mcp 安装成功')"

    如果没有报错,说明安装成功了。

    你的项目文件夹应该只包含

    D:\MCP_Projects\Pixiv_MCP_2\
    └── pixiv_tool.py  # 你的主程序文件

    就这一个文件就够了!

    现在让我们继续排查 MCP 启动失败的问题

    步骤1:验证文件内容

    确保你的 pixiv_tool.py 文件内容是完整的(使用我之前提供的优化版本)。

    步骤2:手动测试脚本

    在命令行中:

    bash
    cd D:\MCP_Projects\Pixiv_MCP_2\
    set PIXIV_REFRESH_TOKEN=33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA
    python pixiv_tool.py

    这会显示具体的错误信息。

    步骤3:检查 Claude Desktop 配置

    确保你的配置文件格式正确:

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["D:\\MCP_Projects\\Pixiv_MCP_2\\pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA"
          }
        }
      }
    }

    步骤4:尝试简化配置

    如果还是不行,试试使用正斜杠:

    json
    {
      "mcpServers": {
        "pixiv_tool": {
          "command": "python",
          "args": ["D:/MCP_Projects/Pixiv_MCP_2/pixiv_tool.py"],
          "env": {
            "PIXIV_REFRESH_TOKEN": "33Pwq5eJE1lbDTxGyhKV7L9V2XeR8joz_SPBz5uTdbA"
          }
        }
      }
    }

    总结

    • 依赖库安装是隐形的,不会在你的项目文件夹创建新文件
    • 只要没有报错,说明安装成功了
    • 🔍 现在需要找出 MCP 启动失败的真正原因

    请运行步骤2中的命令,然后告诉我显示了什么错误信息。这样我们就能找到问题的根源了!

    已发出:13条 剩余:7条 (9:50重置)

    我的路径只有一个文件pixiv_tool.py没问题吗?

    # 导入我们需要的库 from typing import Literal, List, Optional import asyncio import os import time import logging from pixivpy3 import AppPixivAPI from mcp.server.fastmcp import FastMCP # --- 配置日志 --- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) # --- 初始化设置 --- # 从环境变量中读取 REFRESH_TOKEN YOUR_REFRESH_TOKEN = os.getenv("PIXIV_REFRESH_TOKEN") # 初始化 FastMCP 服务器 mcp = FastMCP("pixiv_tool") # 创建 Pixiv API 的实例 api = AppPixivAPI() # 全局变量用于跟踪认证状态和API调用 is_authenticated = False last_api_call_time = 0 MIN_API_INTERVAL = 1.0 # 最小API调用间隔(秒) # --- 认证和初始化 --- async def authenticate_pixiv(): """认证 Pixiv API""" global is_authenticated if not YOUR_REFRESH_TOKEN: logger.error("❌ 环境变量 PIXIV_REFRESH_TOKEN 未设置") return False try: # 使用异步方式进行认证 await asyncio.to_thread(api.auth, refresh_token=YOUR_REFRESH_TOKEN) # 验证认证是否成功 - 尝试获取用户信息 user_info = await asyncio.to_thread(api.user_detail, api.user_id) if user_info and 'user' in user_info: is_authenticated = True logger.info(f"✅ Pixiv 登录成功!欢迎,{user_info['user']['name']}") return True else: logger.error("❌ 认证验证失败") return False except Exception as e: logger.error(f"❌ Pixiv 登录失败: {str(e)}") return False async def rate_limit_check(): """API 调用频率限制检查""" global last_api_call_time current_time = time.time() if current_time - last_api_call_time < MIN_API_INTERVAL: wait_time = MIN_API_INTERVAL - (current_time - last_api_call_time) await asyncio.sleep(wait_time) last_api_call_time = time.time() # --- 辅助函数 --- def validate_inputs(**kwargs): """输入验证""" for key, value in kwargs.items(): if key == 'count' and (not isinstance(value, int) or value < 1 or value > 50): raise ValueError(f"count 参数必须是 1-50 之间的整数,当前值: {value}") elif key == 'artist_id' and (not isinstance(value, int) or value < 1): raise ValueError(f"artist_id 必须是正整数,当前值: {value}") elif key == 'keyword' and (not isinstance(value, str) or len(value.strip()) == 0): raise ValueError("keyword 不能为空") def format_illust_list(illusts: List[dict], title_prefix: str) -> str: """格式化插画列表为用户友好的字符串""" if not illusts: return f"{title_prefix}没有找到任何结果。" response_parts = [f"{title_prefix}为你找到了 {len(illusts)} 张佳作:"] for i, illust in enumerate(illusts): try: # 安全地获取图片URL image_url = getattr(illust.image_urls, 'medium', '图片链接不可用') # 安全地获取标签 tags = "无标签" if hasattr(illust, 'tags') and illust.tags: tags = ", ".join([tag.name for tag in illust.tags[:3] if hasattr(tag, 'name')]) # 安全地获取用户信息 user_name = getattr(illust.user, 'name', '未知画师') user_id = getattr(illust.user, 'id', 'unknown') # 安全地获取统计数据 bookmarks = getattr(illust, 'total_bookmarks', 0) views = getattr(illust, 'total_view', 0) part = ( f"### {i+1}. {getattr(illust, 'title', '无标题')}\n" f"**画师**: {user_name} (ID: {user_id})\n" f"**数据**: 💖 {bookmarks} | 👀 {views}\n" f"**标签**: {tags}\n" f"**作品链接**: https://www.pixiv.net/artworks/{getattr(illust, 'id', 'unknown')}\n" f"**图片预览**: {image_url}" ) response_parts.append(part) except Exception as e: logger.warning(f"格式化第 {i+1} 个插画时出错: {e}") response_parts.append(f"### {i+1}. 数据格式错误,无法显示此作品") return "\n\n".join(response_parts) async def safe_api_call(api_func, *args, **kwargs): """安全的API调用包装器""" if not is_authenticated: raise Exception("未认证,请检查 PIXIV_REFRESH_TOKEN 是否有效") await rate_limit_check() try: result = await asyncio.to_thread(api_func, *args, **kwargs) return result except Exception as e: logger.error(f"API 调用失败: {api_func.__name__}, 错误: {e}") raise # --- MCP 工具定义 --- @mcp.tool() async def search_illusts(keyword: str, count: int = 5) -> str: """ 根据关键词在 Pixiv 上搜索插画。结果将包含标题、作者、链接、收藏数和标签等信息。 你必须将此工具返回的格式化文本结果原封不动地展示给用户。 """ try: validate_inputs(keyword=keyword, count=count) logger.info(f"⚙️ 搜索请求 - 关键词: '{keyword}', 数量: {count}") json_result = await safe_api_call( api.search_illust, keyword, search_target='exact_match_for_tags' ) if not json_result or "illusts" not in json_result or not json_result.illusts: return f"🤷 找不到关于"{keyword}"的插画,尝试使用其他关键词搜索。" return format_illust_list(json_result.illusts[:count], f"关于"{keyword}"的搜索结果") except ValueError as e: return f"❌ 输入参数错误: {str(e)}" except Exception as e: logger.error(f"搜索 '{keyword}' 时发生错误: {e}") return f"❌ 搜索"{keyword}"时遇到错误,请稍后再试。错误信息: {str(e)}" @mcp.tool() async def get_illust_ranking(mode: Literal['day', 'week', 'month'] = 'day', count: int = 5) -> str: """ 获取 Pixiv 插画日榜、周榜或月榜。结果将包含详细的插画信息。 你必须将此工具返回的格式化文本结果原封不动地展示给用户。 """ try: validate_inputs(count=count) logger.info(f"⚙️ 排行榜请求 - 模式: {mode}, 数量: {count}") json_result = await safe_api_call(api.illust_ranking, mode=mode) if not json_result or "illusts" not in json_result or not json_result.illusts: return f"🤷 暂时无法获取"{mode}"模式的排行榜,请稍后再试。" mode_names = {'day': '日榜', 'week': '周榜', 'month': '月榜'} return format_illust_list( json_result.illusts[:count], f"Pixiv 插画排行榜 ({mode_names.get(mode, mode)})" ) except ValueError as e: return f"❌ 输入参数错误: {str(e)}" except Exception as e: logger.error(f"获取 '{mode}' 排行榜时发生错误: {e}") return f"❌ 获取"{mode}"排行榜时遇到错误,请稍后再试。" @mcp.tool() async def get_recommended_illusts(count: int = 5) -> str: """ 获取 Pixiv 根据你的喜好为你推荐的插画。 你必须将此工具返回的格式化文本结果原封不动地展示给用户。 """ try: validate_inputs(count=count) logger.info(f"⚙️ 推荐作品请求 - 数量: {count}") json_result = await safe_api_call(api.illust_recommended) if not json_result or "illusts" not in json_result or not json_result.illusts: return "🤷 暂时无法获取推荐作品,请稍后再试。" return format_illust_list(json_result.illusts[:count], "为你精选的推荐作品") except ValueError as e: return f"❌ 输入参数错误: {str(e)}" except Exception as e: logger.error(f"获取推荐作品时发生错误: {e}") return "❌ 获取推荐作品时遇到错误,请稍后再试。" @mcp.tool() async def get_artist_illusts(artist_id: int, count: int = 5) -> str: """ 根据画师的用户ID获取其发布的作品列表。 你必须将此工具返回的格式化文本结果原封不动地展示给用户。 """ try: validate_inputs(artist_id=artist_id, count=count) logger.info(f"⚙️ 画师作品请求 - 画师ID: {artist_id}, 数量: {count}") json_result = await safe_api_call(api.user_illusts, artist_id) if not json_result or "illusts" not in json_result or not json_result.illusts: return f"🤷 找不到ID为 {artist_id} 的画师的作品,请检查画师ID是否正确。" artist_name = json_result.illusts[0].user.name if json_result.illusts else "未知画师" return format_illust_list(json_result.illusts[:count], f"画师"{artist_name}"的作品") except ValueError as e: return f"❌ 输入参数错误: {str(e)}" except Exception as e: logger.error(f"获取画师 {artist_id} 的作品时发生错误: {e}") return f"❌ 获取画师作品时遇到错误,请检查画师ID是否正确。" @mcp.tool() async def get_my_bookmarks(count: int = 5) -> str: """ 获取您在 Pixiv 上公开收藏的最新插画。需要有效的登录凭证。 你必须将此工具返回的格式化文本结果原封不动地展示给用户。 """ try: validate_inputs(count=count) if not hasattr(api, 'user_id') or not api.user_id: return "❌ 无法获取用户ID,请检查认证状态。" my_user_id = api.user_id logger.info(f"⚙️ 我的收藏请求 - 用户ID: {my_user_id}, 数量: {count}") json_result = await safe_api_call(api.user_bookmarks_illust, my_user_id) if not json_result or "illusts" not in json_result or not json_result.illusts: return "🤷 您的公开收藏夹是空的,或者暂时无法访问。" return format_illust_list(json_result.illusts[:count], "您最新收藏的作品") except ValueError as e: return f"❌ 输入参数错误: {str(e)}" except Exception as e: logger.error(f"获取我的收藏时发生错误: {e}") return "❌ 获取收藏时遇到错误,请确保您的 REFRESH_TOKEN 有效。" @mcp.tool() async def get_pixiv_status() -> str: """ 检查 Pixiv API 连接和认证状态。 """ try: if not is_authenticated: return "❌ 未认证 - 请检查 PIXIV_REFRESH_TOKEN 环境变量是否正确设置。" # 尝试获取用户信息来验证连接 user_info = await safe_api_call(api.user_detail, api.user_id) if user_info and 'user' in user_info: user = user_info['user'] return ( f"✅ Pixiv API 连接正常\n" f"**用户**: {user.get('name', '未知')}\n" f"**用户ID**: {user.get('id', api.user_id)}\n" f"**关注数**: {user.get('total_follow_users', 0)}\n" f"**粉丝数**: {user.get('total_followers', 0)}" ) else: return "⚠️ 认证状态异常,建议重新设置 REFRESH_TOKEN。" except Exception as e: logger.error(f"检查状态时发生错误: {e}") return f"❌ 连接检查失败: {str(e)}" # --- 启动初始化 --- async def initialize_service(): """初始化服务""" logger.info("🚀 正在初始化 Pixiv MCP 服务...") if await authenticate_pixiv(): logger.info("✅ 服务初始化完成,准备接收请求") else: logger.error("❌ 服务初始化失败,请检查配置") # --- 运行服务器 --- if __name__ == "__main__": if YOUR_REFRESH_TOKEN: # 在事件循环中运行初始化 asyncio.run(initialize_service()) # 启动 MCP 服务器 mcp.run(transport='stdio') else: logger.error("🔴 服务未启动:PIXIV_REFRESH_TOKEN 环境变量未设置") print("请设置环境变量 PIXIV_REFRESH_TOKEN 后重新运行")