
1. 企业舆情监控为什么需要 MCPLLMAgent 这套组合企业舆情监控这件事说穿了就是三件事的循环把散落在各处的信息捞回来、判断这些信息是正面还是负面、在出现异常时第一时间通知到人。传统做法要么是买一套 SaaS 舆情系统要么是写一堆爬虫脚本加人工看板前者贵且不灵活后者维护成本高得离谱。我试过用 MCPLLMAgent 这套组合重新搭了一遍发现它刚好能把这三件事拆得干干净净。MCP 全称 Model Context Protocol你可以把它理解成给大模型用的「USB 接口标准」。以前我们想让模型调用外部工具得自己写 function calling 的胶水代码每个工具一套参数格式换一个模型就得重写一遍。MCP 把这个过程标准化了工具提供方按协议暴露能力模型侧按协议发现和调用两边解耦。对企业舆情场景来说这意味着搜索新闻、情感分析、发邮件这些能力可以各自独立成 MCP ServerAgent 只负责编排。LLM 在这里承担的是「判断」角色。舆情监控最怕的是关键词误报比如「某公司产品爆炸」可能是负面新闻也可能是游戏里「伤害爆炸」的正面评价。纯规则引擎搞不定这种语义歧义但 LLM 可以结合上下文给出情感倾向和原因说明。Agent 则是「调度」角色它根据用户输入规划出「先搜索、再分析、最后通知」的工具调用链把 LLM 的判断能力和 MCP 的工具能力串起来。这套架构适合谁适合有一定 Python 基础、想快速搭出可运行原型的开发者也适合企业内部做技术预研的团队。你不需要从头训练模型也不需要买昂贵的舆情系统用现成的 LLM API 加几个 MCP 工具就能跑起来。下面我会把完整的配置、代码骨架和验证步骤都贴出来跟着做就能在本地跑通一条「输入关键词→自动搜索→情感分析→生成报告→邮件推送」的链路。在开始之前你需要准备一个能调用 LLM 的 API 入口。我这边用的是 TaoToken 提供的统一接入服务它兼容 OpenAI 的接口格式配置起来比较省事。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 后面配置 Base URL 的时候会用到。如果你已经有其他兼容 OpenAI 格式的服务也可以替换但本文的配置示例以 TaoToken 为准。2. TaoToken 前置准备与 MCP 项目初始化2.1 获取 API Key 与模型 ID第一步是拿到调用凭证。打开 TaoToken 的控制台页面路径是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在里面创建一个 API Key。创建的时候注意权限范围舆情监控这个场景只需要对话补全权限就够了不需要开太多。拿到 Key 之后先存好后面写进.env文件。模型 ID 这块TaoToken 支持多种模型你可以根据预算和效果需求选。舆情分析对语义理解要求比较高建议选一个中等以上能力的模型。具体可用的模型列表可以在模型对话页面查看 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。选好之后把模型 ID 记下来比如类似gpt-4o-mini或者claude-3-5-sonnet这种格式的字符串。如果你打算长期跑这个监控链路或者后面要接更多 Agent 任务可以了解一下 Coding Plan 的额度方案 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。不过对于原型验证阶段按量付费的 API Key 就足够了。2.2 初始化 Python 项目环境准备我用的是 uv 这个包管理工具它比 pip 快很多而且能自动管理虚拟环境。如果你还没装 uv先执行pip install uv然后创建项目目录并初始化uv init mcp-sentiment-agent cd mcp-sentiment-agent初始化完成后项目根目录下会有pyproject.toml文件。接下来安装依赖uv add mcp openai httpx python-dotenv这里解释一下每个依赖的作用mcp是 MCP 协议的 Python SDK提供 FastMCP 服务端和 ClientSession 客户端openai用来调用 LLM 接口httpx做异步 HTTP 请求搜索新闻的时候用python-dotenv负责加载.env环境变量。2.3 配置 .env 文件在项目根目录创建.env文件内容如下# TaoToken 接入配置 BASE_URLhttps://taotoken.net/api MODEL你的模型ID API_KEY你的TaoToken API Key # 搜索服务配置这里以 Serper 为例你也可以换成其他搜索 API SERPER_API_KEY你的搜索服务Key # 邮件推送配置以 163 邮箱为例 SMTP_SERVERsmtp.163.com SMTP_PORT465 EMAIL_USERyour_email163.com EMAIL_PASS你的授权码这里有几个坑要提前说。第一BASE_URL末尾不要加/v1TaoToken 的 API 端点直接就是https://taotoken.net/apiOpenAI SDK 会自动拼接路径。第二邮箱的EMAIL_PASS填的是授权码不是登录密码163 邮箱需要在设置里开启 SMTP 服务并生成授权码。第三搜索服务的 Key 如果你暂时没有可以先留空后面验证的时候只跑情感分析部分。3. 可复制的 MCP Server 配置与 Agent 提示词骨架3.1 MCP Server 的 settings.json 配置MCP 的配置方式取决于你用的客户端。如果你是在 Claude Code 或者 Cline 这类支持 MCP 的编辑器里接入配置通常写在settings.json或者mcp.json里。下面是一个标准的 MCP Server 配置片段路径和字段名保持和官方一致{ mcpServers: { sentiment-news-server: { command: python, args: [/absolute/path/to/server_local.py], env: { BASE_URL: https://taotoken.net/api, MODEL: 你的模型ID, API_KEY: 你的TaoToken API Key, SERPER_API_KEY: 你的搜索服务Key, SMTP_SERVER: smtp.163.com, SMTP_PORT: 465, EMAIL_USER: your_email163.com, EMAIL_PASS: 你的授权码 } } } }注意args里的路径要写绝对路径Windows 下用双反斜杠或者正斜杠都行。env字段里把.env的内容直接内联进去这样 MCP 客户端启动 Server 子进程的时候能直接读到环境变量不依赖.env文件的加载时机。如果你用的是 Cline 的 MCP 配置格式类似只是外层字段名可能叫mcpServers或者servers具体看你用的版本。CC Switch 这类工具也是同样的思路Base URL、Key、Model ID 三件套填对剩下的交给协议层。3.2 Agent 提示词骨架Agent 的核心能力是「规划工具调用链」。我在客户端里用了一个plan_tool_usage方法让 LLM 根据用户输入输出一个 JSON 数组描述先调哪个工具、再调哪个工具。提示词骨架是这样的system_prompt { role: system, content: ( 你是一个智能任务规划助手用户会给你一句自然语言请求。\n 你只能从以下工具中选择严格使用工具名称\n f{tool_list_text}\n 如果多个工具需要串联后续步骤中可以使用 {{上一步工具名}} 占位。\n 返回格式JSON 数组每个对象包含 name 和 arguments 字段。\n 不要返回自然语言不要使用未列出的工具名。 ) }这个提示词的关键点在于「占位符」机制。比如用户说「分析小米汽车的舆情」模型会规划出[ { name: search_google_news, arguments: {keyword: 小米汽车} }, { name: analyze_sentiment, arguments: { text: {{search_google_news}}, filename: sentiment_小米汽车.md } } ]执行的时候客户端会先调search_google_news把返回结果替换掉{{search_google_news}}再传给analyze_sentiment。这种设计让工具链的编排完全由 LLM 动态决定你新增一个工具只需要在 Server 里加一个mcp.tool()装饰的函数Agent 侧不用改代码。3.3 三个核心 MCP 工具的实现要点Server 端我用 FastMCP 框架三个工具分别是search_google_news、analyze_sentiment、send_email_with_attachment。搜索工具负责调外部搜索 API 拿新闻列表分析工具负责调 LLM 做情感判断并生成 Markdown 报告邮件工具负责把报告作为附件发出去。这里重点说分析工具的实现。它内部会创建一个 OpenAI 客户端base_url指向 TaoToken 的 API 端点client OpenAI( api_keyos.getenv(API_KEY), base_urlos.getenv(BASE_URL) )然后构造 prompt 调用client.chat.completions.create把模型返回的内容写进 Markdown 文件。这个过程中最容易出问题的是response.choices[0].message.content可能为空后面排障章节会详细说。4. 本地启动与验证监控链路4.1 启动 MCP Server 和客户端Server 端代码写完后直接运行python server_local.py如果用的是 stdio 传输模式Server 会阻塞在那里等待客户端连接这是正常的。客户端这边单独开一个终端python client_local.py客户端启动后会打印「已连接到服务器支持以下工具」然后列出三个工具名。看到这个说明 MCP 握手成功工具发现没问题。4.2 验证一次完整的监控请求在客户端输入分析小米汽车的舆情正常情况下你会看到以下流程客户端先调用plan_tool_usage让 LLM 规划工具链打印出规划结果然后依次执行搜索、分析、邮件发送最后在sentiment_reports目录下生成一个 Markdown 报告文件在llm_outputs目录下生成对话记录。验证成功的关键标志有三个第一sentiment_reports目录下有新生成的.md文件打开能看到情感分析结论第二终端打印了「邮件已成功发送给 xxx」第三llm_outputs目录下有对应的对话记录文件。如果你只想验证 LLM 分析部分可以暂时把邮件工具的调用从规划里去掉或者把EMAIL_USER留空让邮件工具返回错误但不影响主流程。4.3 用模型对话页面快速验证 API 连通性在跑完整链路之前建议先单独验证 TaoToken 的 API 能不能通。打开模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 随便发一句话看能不能正常返回。这一步能排除掉大部分 Key 配置错误和网络问题。如果模型对话页面正常但代码里报错那问题大概率出在base_url拼接或者环境变量加载上。检查.env文件是否在项目根目录、load_dotenv()是否在读取环境变量之前调用。5. 本篇常见错误排查5.1 401 错误API Key 无效或未加载报错信息通常是openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key}}原因有三种可能Key 复制的时候多了空格、.env文件没被正确加载、或者base_url写错了导致请求发到了错误的端点。排查方法是先在 Python 里打印os.getenv(API_KEY)看能不能读到值再确认base_url是https://taotoken.net/api而不是其他地址。5.2 local proxy failed本地代理拦截了请求这个报错在 Windows 环境下比较常见完整信息类似httpx.ConnectError: [Errno 11001] getaddrinfo failed或者openai.APIConnectionError: Connection error.这通常是因为系统里配置了本地代理但 httpx 没有走代理或者走了错误的代理。解决办法是在创建 OpenAI 客户端的时候显式传入http_client或者检查系统环境变量里有没有HTTP_PROXY、HTTPS_PROXY这类设置。如果你不需要代理把它们清掉如果需要确保代理地址正确。5.3 reading choices 报错响应结构不符合预期报错信息AttributeError: NoneType object has no attribute choices或者IndexError: list index out of range这说明response.choices是空的。常见原因是模型返回了错误信息但 HTTP 状态码是 200或者模型 ID 写错了导致服务端返回了非预期结构。排查方法是把完整的response对象打印出来看确认choices字段是否存在、message.content是否有值。5.4 OAuth 相关报错认证方式不匹配如果你在配置 MCP 客户端的时候看到了 OAuth 相关的错误比如OAuth token exchange failed这通常是因为客户端尝试用 OAuth 方式认证但你的 Server 配置的是 API Key 方式。检查settings.json里有没有多余的oauth字段或者客户端版本是否默认开启了 OAuth 流程。把认证方式统一成 API Key 就能解决。5.5 工具调用链规划失败如果终端打印了「工具调用链规划失败」说明 LLM 返回的内容不是合法的 JSON。可能原因是模型没有严格按照提示词输出或者返回内容里带了 Markdown 代码块标记。我的处理方式是用正则先把json和剥掉再尝试json.loads。如果还是失败就把原始返回内容打印出来看调整提示词里的格式约束。6. 把监控链路接到你的日常工作流跑通原型之后下一步是让它真正产生价值。我自己的做法是把客户端封装成一个定时任务每天早上九点自动跑一次「竞品舆情扫描」把报告发到企业微信或者钉钉群。MCP 的好处是工具可以随时替换搜索源从 Google News 换成微博热搜只需要改 Server 里的一个函数通知方式从邮件换成 webhook也只需要加一个工具。如果你想让 Agent 更智能可以在提示词里加入「如果情感倾向为负面且置信度高于 0.8则触发告警邮件否则只记录不通知」这类条件逻辑。LLM 能理解这种自然语言规则不需要你写复杂的 if-else。对于需要长期运行、调用量比较大的场景建议关注一下 Coding Plan 的额度方案比按量付费更划算 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有更详细的参数说明和错误码对照表。API Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 可以随时查看余额和调用记录。最后说一个实际踩过的坑MCP Server 用 stdio 传输的时候如果 Server 端有print输出到 stdout会污染协议通信导致客户端解析失败。所有调试信息都要用sys.stderr输出或者写到日志文件里。这个坑我排查了大半天才定位到希望你能避开。