8. 集成MCP服务实现文案创作

MCP介绍

MCP:Model Context Protocol(模型上下文协议)。

简单来说,MCP 是一个标准化的“沟通桥梁”协议,它让 AI 应用(如 Dify 中构建的助手)能够安全、高效地访问和使用外部的工具、数据源和计算资源。

你可以把它理解成 AI 世界的 USB 协议应用商店

  • 就像 USB 协议:定义了键盘、鼠标、U盘等外部设备如何与电脑主机通信。MCP 定义了外部工具和数据如何与 AI 模型“对话”。
  • 就像应用商店:为手机提供了各种各样的 App 来扩展功能。MCP 为 AI 模型提供了各种各样的“工具App”来扩展其能力。

为什么需要 MCP?它解决了什么问题?

在没有 MCP 之前,如果你想让你基于大模型的 AI 助手能做一些特定的事,比如:

  • 查询公司内部的数据库
  • 操作 GitHub 仓库
  • 控制家里的智能电器
  • 访问特定的 API

开发者需要为每一个功能编写大量的、定制化的代码来连接和调试。这个过程非常繁琐、容易出错,且难以复用。

MCP 的出现,就是为了将“工具本身的功能”和“AI 如何使用这个工具”分离开来,实现标准化。


MCP 的核心工作原理

MCP 主要包含三个核心概念,它们之间的协作关系可以用下图清晰地展示:

外部世界示例
MCP Server 管理的核心资源
执行 Git 操作
读取数据库信息
获取写代码的模板
工具 (Tools)
可执行的操作
MCP 服务器 (Server)
提供标准化服务的独立进程
资源 (Resources)
可读取的数据
提示词模板 (Prompts)
可复用的指令
AI 应用 (Client)
例如: Dify 中构建的助手
MCP 协议 (标准通信规范)
JSON-RPC over SSE/STDIO

其工作流程遵循严格的客户端-服务器架构,如下图所示,展示了从发起到执行的完整过程:

AI 应用 (Client) MCP 协议 MCP 服务器 (Server) 外部世界 (DB/Git/API等) 1. 建立连接 (SSE or STDIO) 2. 列出可用工具 3. 返回工具列表及描述 4. 请求调用特定工具(含参数) 5. 执行实际操作(如查数据库、调API) 6. 返回操作结果 7. 将结果返回给AI应用 8. AI模型处理结果并生成回复 loop [循环等待] AI 应用 (Client) MCP 协议 MCP 服务器 (Server) 外部世界 (DB/Git/API等)

通过这种设计,MCP 成功地将 AI 模型与外部工具解耦,使得能力的扩展变得标准、安全和高效。


MCP 在 Dify 中的巨大价值

Dify 是一个用于构建和运营 AI 应用的平台。MCP 与 Dify 的结合是天作之合,它为 Dify 带来了前所未有的能力:

  1. 极致的功能扩展:你不再受限于 Dify 官方内置的几种工具。你可以通过 MCP 为你的 AI 助手接入任何你能想到的工具

    • 例如:为你公司内部开发的系统、一个特殊的数据库、一个硬件设备编写一个 MCP Server,然后就能在 Dify 工作流中像使用普通工具一样使用它。
  2. 增强的 RAG 能力:MCP 的 “Resources” 可以用来构建更强大的 RAG(检索增强生成)应用。你可以写一个 MCP Server 来连接:

    • 公司内部的 Confluence、Jira、Notion。
    • 你的 GitHub/GitLab 仓库。
    • 任何支持 API 的数据源。
      这样,你的 AI 助手就能实时读取这些最新信息来回答问题,而不是仅仅依赖一个静态的知识库。
  3. 安全性与隔离性:MCP Server 是独立的进程。这意味着:

    • 更安全:AI 应用(Dify)本身不需要知道你的数据库密码或 API 密钥,这些敏感信息只保存在 MCP Server 端。
    • 更稳定:一个工具的崩溃不会导致整个 AI 应用崩溃。
    • 语言无关:你可以用任何语言(Python, JavaScript, Go, Java…)来编写 MCP Server,只要遵守协议即可。
  4. 生态与复用:MCP 正在形成一个活跃的开源生态。很多常用的工具(如 Web Browser、GitHub、SQL 数据库等)都已经有社区写好的 MCP Server。你可以在 Dify 中直接使用它们,无需重复造轮子。

总结

MCP 是一套规则,它让 AI 模型可以安全、方便地使用外部工具和数据,从而极大地扩展了 AI 的能力边界。

对于 Dify 用户来说:

  • 作为使用者:你将来可以通过一个简单的界面,一键添加由 MCP 提供的各种强大工具(如操作 Excel、发送邮件、查询股票等)到你的 AI 助手中。
  • 作为开发者:如果你有独特的需求,可以为自己或公司编写自定义的 MCP Server,然后在 Dify 中无缝集成,打造出真正强大和专属的 AI 应用。

以上来自deepseek


需要引入两个插件:MCP serverMCP SSE / StreamableHTTP
MCP server里面设置schema

{
  "name": "poem",
  "description": "模仿输入的作者风格写诗歌",
  "inputSchema": {
    "title": "poem",
    "type": "object",
    "properties": {
      "author": {
        "title": "author",
        "description": "作者",
        "type": "string"
      }
    },
    "required": [
      "author"
    ]
  }
}

点击保存后,可以获取到mcp-server
获取到https://xxx.ai-plugin.io/sse,然后

放到MCP SSE / StreamableHTTP的里面:

{
  "server_name": {
    "url": "https://xxx.ai-plugin.io/sse",
    "headers": {},
    "timeout": 50,
    "sse_read_timeout": 50
  }
}

配置做完后,建一个agent,关键词:调用 mcp 工具回答用户问题,先获取工具列表,再选中可用的工具,最后返回工具结果中的诗歌原文及解析,然后引入MCP SSE / StreamableHTTP的两个插件,即可

MCP这个例子,没有搞成功

老报错:

调用工具时出现错误,错误信息为 “Arguments must be a valid JSON string: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)”。这意味着传递给 mcp_sse_call_tool 函数的参数 arguments 不是一个有效的JSON字符串。请检查参数格式是否正确。通常,需要将参数表示为一个正确格式的JSON字符串,例如 {“author”: “李白”}。请确保参数在传递时遵循正确的JSON语法。如果问题仍然存在,请提供更多上下文信息,以便进一步排查

按着视频一步一步做的,连续看了两遍,都一样,但是就是报错。网上查了资料,没解决。先放一放

ModelScopeMCP 广场


9. 生成PPT

这个就比较简单了,直接用一个PPT插件即可
在这里插入图片描述

在这里插入图片描述


10. Dify整合Ollama访问本地大模型

Docker Desktop 可以用来管理Dify,也就是,部署到本地,而不是用Dify里面的cloud

下载Docker Desktop

一、安装Docker Desktop

访问Docker官网,下载MAc适配的Docker Desktop

二、拉取Dify源代码

打开终端,执行git命令克隆Dify仓库
git clone https://github.com/langgenius/dify.git

或者,直接下载Dify的源码到本地

三、进入Docker目录并配置环境

进入dify/docker目录下,复制环境配置文件
cd dify/docker
cd .env.example .env

或者,进入到dify/docker文件夹下,将.env.example复制一份,然后改名字:.env

四、启动dify服务

docker compose up -d

遇到很多次网络错误,记得开🚀

在这里插入图片描述

五、打开Dify平台

打开浏览器,访问http://localhost/apps,进入Dify平台,填写账号登录
在这里插入图片描述

Ollama

Ollama用于部署大模型

下载对应的版本后,可以在命令行查看是否安装成功,以及安装的版本号:

ollama -v

可以看到:ollama version is 0.11.8

现在,就可以下载你想用的模型了

在这里插入图片描述
由于电脑配置不高,所以,选了1.5b的模型

在命令行执行:ollama run deepseek-r1:1.5b,下载即可

在这里插入图片描述

Ollama部署了本地模型,现在就可以在Docker里面,用自己的模型了

在设置Ollama的时候,老报错:

An error occurred during credentials validation: HTTPConnectionPool(host=‘192.168.66.89’, port=11434): Max retries exceeded with url: /api/chat (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x7f6253d8bd10>: Failed to establish a new connection: [Errno 111] Connection refused’))

需要在命令行执行:launchctl setenv OLLAMA_HOST "0.0.0.0"
然后,再在配置Ollama处填入:http://host.docker.internal:11434保存即可
另外,模型名称 不要瞎填

之后,就可以在Dify里面,使用自己部署的Ollama模型了

另外,也可以分享出去,让别人使用。就跟其他大模型一样,拿到key就行


11. 基于Echarts插件打造可视化报表

Echarts,有很多可视化视图等

找到想要的图,然后复制里面的js代码,转换成python代码,然后调用即可,比较简单

在这里插入图片描述

还有一种方法,直接使用插件:Echarts图表生成,也比较简单

在这里插入图片描述

Excel输出图表

在这里插入图片描述

倒也还好,主要是几个步骤

首先要上传一个Excel文件:

在这里插入图片描述

然后通过第一个LLM,提取数据,并且转换成csv格式

角色
你是一个数据整理的专家,擅长数据格式的整合和数据的转换
数据
{{#1756717165651.text#}}
任务
先从数据中提取出满足用户要求的数据 {{#sys.query#}} 然后把数据转换为 csv 格式
输出
把 csv 格式的数据输出

然后,提取参数(参数提取器)

然后,将csv格式转换成json数据

# 角色
你是一个csv格式数据转json数据的技术专家,擅长把csv转换为对应的json数据,
# 数据
{{#1756717327951.CSV_Data#}}这个数据只有两列
# 任务
把csv中的两列数据转换对应的json 数据

比如:
水果,数量,价格\n 苹果,10,50 \n 香蕉,12,38 \n 荔枝,15,60 \n 梨子,13,35

转换为:
{
  "name":["《苹果》","《香蕉》","《荔枝》","《梨子》"]
  "values":[10,12,15,13]
}

# 输出
把上面转换得到的json数据输出即可

然后,再提取,最后执行代码:

其中,代码执行的代码:

import json
import re

def main(jsonData: str) -> dict:
    # 解析外层JSON数据
    # data = json.loads(jsonData)
    # query_str = data['query']
    
    # 去除换行符和制表符
    clean_str = re.sub(r'[\n\t]', '', jsonData)
    
    # 去除转义的双引号(将\"替换为")
    clean_str = re.sub(r'\\"', '"', clean_str)
    
    # 提取name和values的值
    name_pattern = r'"name":\s*\[(.*?)\]'
    values_pattern = r'"values":\s*\[(.*?)\]'
    
    name_match = re.search(name_pattern, clean_str)
    values_match = re.search(values_pattern, clean_str)
    
    names = []
    if name_match:
        names = re.findall(r'"([^"]*)"', name_match.group(1))
    
    values = []
    if values_match:
        values = [float(num.strip()) for num in values_match.group(1).split(',')]
    
    option = {
        "xAxis": {
            "type": 'category',
            "data": names
        },
        "yAxis": {
            "type": 'value'
        },
        "series": [
            {
                "data": values,
                "type": 'bar',
                "showBackground": True,
                "backgroundStyle": {
                    "color": 'rgba(180, 180, 180, 0.2)'
                }
            }
        ]
    }
    
    # 生成输出文件
    output = f'```echarts\n{json.dumps(option, ensure_ascii=False)}\n```'
    return {
        "result": output,
    }

# 如果您想要直接运行这个脚本,可以添加以下代码
if __name__ == "__main__":
    # 示例输入
    sample_data = '{"name": ["A", "B", "C"], "values": [10, 20, 30]}'
    result = main(sample_data)
    print(result["result"])

一键生成图文

首先,我们创建一个Agent,做一个输入文字就可以生成图片的功能

在这里插入图片描述

然后,使用硅基流动生成图片的API,文档地址

在这里插入图片描述

Authorization的value,直接使用 Bearer token即可

Body填入:

{
  "model": "Kwai-Kolors/Kolors",
  "prompt": "{{#1756733391329.imgDesc#}}",
  "image_size": "1024x1024",
  "batch_size": 1,
  "num_inference_steps": 20,
  "guidance_scale": 7.5
}

参数提取器:在这里插入图片描述

代码执行的地方:

from typing import Any, Union

def extract_url(value: Union[dict, list, str]) -> str:
    """递归提取的核心逻辑"""
    if isinstance(value, str):
        # 检查字符串是否以 http://、https:// 或 data:image 开头
        if value.startswith(('http://', 'https://', 'data:image')):
            return value
        return ''
    elif isinstance(value, dict):
        # 优先检查单数形式字段(url、image、link、src)
        for field in ['url', 'image', 'link', 'src']:
            if field in value:
                found = extract_url(value[field])
                if found:
                    return found
        # 检查复数形式字段(urls、images、links、sources)
        for list_field in ['urls', 'images', 'links', 'sources']:
            list_value = value.get(list_field)
            if isinstance(list_value, list):
                found = extract_url(list_value)
                if found:
                    return found
        # 深度搜索字典的值
        for v in value.values():
            found = extract_url(v)
            if found:
                return found
    elif isinstance(value, list):
        # 遍历列表中的每个元素
        for item in value:
            found = extract_url(item)
            if found:
                return found
    return ''

def main(data: Any) -> dict:
    """
    从复杂数据结构中安全提取第一个URL(优化版)
    :param data: 支持 dict/list/str 的任意嵌套数据结构
    :return: 总是返回包含字符串类型结果的字典,找不到时结果为空字符串
    """
    return {"result": extract_url(data)}

举例:一只老虎在跳舞
在这里插入图片描述

接下来,就可以做法朋友圈文案了:
在这里插入图片描述

LLM参考提示词:

请根据 {{#sys.query#}} 和今天的天气情况 {{#1756736659044.weather#}}

写几句有诗意的散文诗,并且生成一段话描述这个场景的画面感。

诗词或者散文请富有文学性和哲理,诗句示例:
万千生命如画卷徐徐展开,恍若荷叶晨露,转瞬即逝。
诗词请保持输出两句话,不一定需要城市名称,但要突出城市或者当天的天气

请严格按照以下格式输出
{
"poetry":<输出散文诗>,
"img_des":< 输出描述诗词画面感的语句 >,
"date":< 今天的日期,格式示例:1128 日周四 >
}
今天的日期是:{{#1756736688627.text#}}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐