實現一個免費可用的文生圖的MCP Server

概述

  • 文生圖模型為使用 Cloudflare Worker AI 部署 Flux 模型,是參照視頻https://www.bilibili.com/video/BV1UbkcYcE24/?spm_id_from=333.337.search-card.all.click&vd_source=9ca2da6b1848bc903db417c336f9cb6b的復現
  • Cursor MCP Server實現是參照文章https://juejin.cn/post/7485267450880229402#heading-9實現

Cloudflare部署 Flux 模型

獲取Cloudflare賬號和token

  • 注冊、登錄等步驟省略

管理賬號——賬戶API令牌——Workers AI——使用模版
在這里插入圖片描述
繼續以顯示摘要
在這里插入圖片描述
創建令牌
在這里插入圖片描述

找到文生圖模型github地址

Workers AI——模型——flux-1-schnell——了解更多

在這里插入圖片描述
Guides——Tutorials——How to Build an Image Generator using Workers AI
在這里插入圖片描述

https://developers.cloudflare.com/workers-ai/guides/tutorials/image-generation-playground/image-generator-flux/
在這里插入圖片描述

在這里插入圖片描述

部署文生圖模型

github地址

https://github.com/kristianfreeman/workers-ai-image-playground?tab=readme-ov-file#readme

執行順序:

  1. git clone到本地
  2. 修改配置文件
  • 將.dev.vars.example改為.dev.vars
  • 替換CLOUDFLARE_ACCOUNT_ID(賬號)和CLOUDFLARE_API_TOKEN(令牌)


3. 執行npm install
4. 執行npm run preview(生產為preview)
在這里插入圖片描述
在這里插入圖片描述
5. 打開網頁(http://localhost:8788),選擇flux-1-schnell

在這里插入圖片描述

輸入prompt進行測試
在這里插入圖片描述

Cursor調用MCP Server

實現一個調用Cloudflare Workers AI模型的MCP Server

參照文章(https://juejin.cn/post/7485267450880229402#heading-9)進行項目設置

項目設置

讓我們從創建項目和安裝依賴開始:

mkdir mcp-image-generator
cd mcp-image-generator
npm init -y
npm install @modelcontextprotocol/sdk zod dotenv
npm install --save-dev typescript @types/node

接下來,創建一個基本的TypeScript配置文件。在項目根目錄創建tsconfig.json:

{"compilerOptions": {"target": "ES2020","module": "NodeNext","moduleResolution": "NodeNext","esModuleInterop": true,"outDir": "./dist","strict": true},"include": ["src/**/*"]
}

然后,創建一個.env文件來存儲你的Cloudflare憑證:
ini 體驗AI代碼助手 代碼解讀復制代碼CLOUDFLARE_ACCOUNT_ID=你的賬戶ID
CLOUDFLARE_API_TOKEN=你的API令牌

別忘了將這個文件添加到.gitignore,保護你的API密鑰不被意外公開。

構建MCP服務器

直接替換src/index.ts文件

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import fs from 'fs';
import path from 'path';
import os from 'os';
import * as dotenv from 'dotenv';// 加載環境變量
dotenv.config();// 創建MCP服務器
const server = new McpServer({name: "AI圖片生成助手",version: "1.0.0"
});// 添加一個文生圖工具
server.tool("generate-image-from-text","使用Cloudflare的Flux模型生成圖像",{prompt: z.string().min(1, "提示文本不能為空").max(2048, "提示文本不能超過2048個字符").describe("用于生成圖像的文本描述"),steps: z.number().int("步數必須是整數").max(8, "步數最大為8").default(4).describe("擴散步數,值越高質量越好但耗時更長"),outputPath: z.string().min(1, "輸出路徑不能為空").describe("生成圖片的保存目錄路徑"),filename: z.string().min(1, "文件名不能為空").describe("保存的圖片文件名,不需要包含擴展名")},async ({ prompt, steps = 4, outputPath, filename }) => {const CLOUDFLARE_ACCOUNT_ID = process.env.CLOUDFLARE_ACCOUNT_ID;const CLOUDFLARE_API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;const url = `https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/run/@cf/black-forest-labs/flux-1-schnell`;console.log(url);try {// 調用Cloudflare APIconst response = await fetch(url, {method: 'POST',headers: {'Authorization': `Bearer ${CLOUDFLARE_API_TOKEN}`,'Content-Type': 'application/json'},body: JSON.stringify({prompt: prompt})});// 解析響應const responseData = await response.json() as { image?: string;[key: string]: unknown };if (!response.ok) {return {content: [{ type: "text", text: `調用API失敗: ${response.status} ${response.statusText}` }]};}// 提取圖像數據let imageBase64 = null;if (responseData.image) {imageBase64 = responseData.image as string;} else if (responseData.result && typeof responseData.result === 'object') {const resultObj = responseData.result as Record<string, unknown>;if (resultObj.image) {imageBase64 = resultObj.image as string;} else if (resultObj.data) {imageBase64 = resultObj.data as string;}}if (!imageBase64) {return {content: [{ type: "text", text: "API返回的數據中沒有圖像" }]};}// 圖像處理邏輯將在下一步添加// 保存圖像文件let targetFilePath = path.join(outputPath, `${filename}.jpg`);let actualSavePath = targetFilePath;let message = '';try {// 確保輸出目錄存在if (!fs.existsSync(outputPath)) {fs.mkdirSync(outputPath, { recursive: true });}// 測試目錄是否可寫const testFileName = path.join(outputPath, '.write-test');fs.writeFileSync(testFileName, '');fs.unlinkSync(testFileName);// 將Base64圖像保存為文件const imageBuffer = Buffer.from(imageBase64, 'base64');fs.writeFileSync(targetFilePath, imageBuffer);message = `圖像已成功生成并保存到: ${targetFilePath}`;} catch (fileError) {// 備用方案:保存到臨時目錄const tempDir = path.join(os.tmpdir(), 'mcp_generated_images');if (!fs.existsSync(tempDir)) {fs.mkdirSync(tempDir, { recursive: true });}actualSavePath = path.join(tempDir, `${filename}.jpg`);const imageBuffer = Buffer.from(imageBase64, 'base64');fs.writeFileSync(actualSavePath, imageBuffer);message = `由于權限問題無法保存到 ${targetFilePath},已保存到臨時位置: ${actualSavePath}`;}return {content: [{ type: "text", text: message }]};} catch (error: unknown) {const errorMessage = error instanceof Error ? error.message : String(error);return {content: [{ type: "text", text: `發生錯誤: ${errorMessage}` }]};}
}
);// 啟動服務器
const transport = new StdioServerTransport();
await server.connect(transport);
編譯和運行

在package.json中添加以下腳本:

"scripts": {"build": "tsc","start": "node dist/index.js"
}

然后編譯并運行你的服務器:

npm run build
在Cursor中配置MCP服務

在這里插入圖片描述
在這里插入圖片描述

{"mcpServers": {"imageGenerator": {"command": "node","args": ["/Users/admin/Desktop/work/study/mcp-image-generator/dist/index.js" # 替換為你的路徑]}}
}

重啟Cursor使配置生效

測試效果

輸入

Please generate a picture of an animal fox and save it to the directory /Users/admin/Desktop/work/study/mcp-image-generator/pictures with the filename fox.

在這里插入圖片描述
Run tool,查看圖片
在這里插入圖片描述

參考

https://juejin.cn/post/7485267450880229402
https://www.cnblogs.com/foxhank/p/18378208
https://github.com/fengin/image-gen-server?tab=readme-ov-file
https://cursor.directory/mcp
https://zhuanlan.zhihu.com/p/27327515233
https://blog.csdn.net/m0_65096391/article/details/147570383

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83055.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83055.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83055.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ES6 深克隆與淺克隆詳解:原理、實現與應用場景

ES6 深克隆與淺克隆詳解&#xff1a;原理、實現與應用場景 一、克隆的本質與必要性 在 JavaScript 中&#xff0c;數據分為兩大類型&#xff1a; 基本類型&#xff1a;Number、String、Boolean、null、undefined、Symbol、BigInt引用類型&#xff1a;Object、Array、Functio…

新聞數據加載(鴻蒙App開發實戰)

本案例基于ArkTS的聲明式開發范式&#xff0c;介紹了數據請求和onTouch事件的使用。包含以下功能&#xff1a; 數據請求。列表下拉刷新。列表上拉加載。 網絡數據請求需要權限&#xff1a;ohos.permission.INTERNET 一、案例效果截圖 操作說明&#xff1a; 點擊應用進入主頁…

辦公效率王Word批量轉PDF 50 +文檔一鍵轉換保留原格式零錯亂

各位辦公小能手們&#xff0c;我跟你們說啊&#xff01;在辦公的時候&#xff0c;咱經常會碰到要把一堆Word文檔轉成PDF格式的情況&#xff0c;比如說要統一文件格式、保護文檔內容或者方便分享啥的。這時候&#xff0c;就需要用到Word批量轉換成PDF的軟件啦。下面我就給你們好…

一張Billing項目的流程圖

流程圖 工作記錄 2016-11-11 序號 工作 相關人員 1 修改Payment Posted的導出。 Claim List的頁面加了導出。 Historical Job 加了Applied的顯示和詳細。 郝 識別引擎監控 Ps (iCDA LOG :剔除了160篇ASG_BLANK之后的結果): LOG_File 20161110.txt BLANK_CDA/ALL 45/10…

SpringAI系列4: Tool Calling 工具調用 【感覺這版本有bug】

前言&#xff1a;在最近發布的 Spring AI 1.0.0.M6 版本中&#xff0c;其中一個重大變化是 Function Calling 被廢棄&#xff0c;被 Tool Calling 取代。Tool Calling工具調用&#xff08;也稱為函數調用&#xff09;是AI應用中的常見模式&#xff0c;允許模型通過一組API或工具…

第六十三節:深度學習-模型推理與后處理

深度學習模型訓練完成后,如何高效地將其部署到實際應用中并進行準確預測?這正是模型推理與后處理的核心任務。OpenCV 的 dnn 模塊為此提供了強大支持,本文將深入探討 OpenCV 在深度學習模型推理與后處理中的關鍵技術與實踐。 第一部分:基礎概念與環境搭建 1.1 核心概念解析…

uniapp開發企業微信小程序時 wx.qy.login 在uniapp中使用的時候,需要導包嗎?

在 UniApp 中使用 “wx.qy.login” 不需要手動導包&#xff0c;但需要滿足以下條件&#xff1a; 一、環境要求與配置 1&#xfffd; 企業微信環境判斷 必須確保當前運行環境是企業微信客戶端&#xff0c;通過 “uni.getSystemInfoSync().environment” 判斷是否為 “wxwork”…

ONLYOFFICE文檔API:更強的安全功能

在數字化辦公時代&#xff0c;文檔的安全性與隱私保護已成為企業和個人用戶的核心關切。如何確保信息在存儲、傳輸及協作過程中的安全&#xff0c;是開發者與IT管理者亟需解決的問題。ONLYOFFICE作為一款功能強大的開源辦公套件&#xff0c;不僅提供了高效的文檔編輯與協作體驗…

Linux系統編程之共享內存

概述 在Linux系統中&#xff0c;共享內存也是一種高效的進程間通信機制&#xff0c;允許兩個或多個進程共享同一塊物理內存區域。通過這種方式&#xff0c;不同進程可以直接訪問和操作相同的數據&#xff0c;從而避免了數據的復制。由于數據直接在內存中共享&#xff0c;沒有額…

零知開源——STM32F407VET6驅動Flappy Bird游戲教程

簡介 本教程使用STM32F407VET6零知增強板驅動3.5寸TFT觸摸屏實現經典Flappy Bird游戲。通過觸摸屏控制小鳥跳躍&#xff0c;躲避障礙物柱體&#xff0c;挑戰最高分。項目涉及STM32底層驅動、圖形庫移植、觸摸控制和游戲邏輯設計。 目錄 簡介 一、硬件準備 二、軟件架構 三、…

Elasticsearch創建快照倉庫報錯處理

創建快照倉庫報錯&#xff1a; 根據報錯提示的信息&#xff0c;問題可能出在 Elasticsearch 的配置中。當你嘗試創建一個文件系統&#xff08;fs&#xff09;類型的快照倉庫時&#xff0c;雖然已經指定了 location 參數&#xff0c;但 Elasticsearch 仍然報錯&#xff0c;這通…

服務器如何配置防火墻管理端口訪問?

配置服務器防火墻來管理端口訪問&#xff0c;是保障云服務器安全的核心步驟。下面我將根據你使用的不同操作系統&#xff08;Linux: Ubuntu/Debian/CentOS&#xff1b;Windows Server&#xff09;介紹常用防火墻配置方法。 ? 一、Linux 防火墻配置&#xff08;UFW / firewalld…

Redis最佳實踐——安全與穩定性保障之連接池管理詳解

Redis 在電商應用的連接池管理全面詳解 一、連接池核心原理與架構 1. 連接池工作模型 #mermaid-svg-G7I3ukCljlJZAXaA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G7I3ukCljlJZAXaA .error-icon{fill:#552222;}…

打印機無法遠程打印?可以本地打印,本地網絡打印機設置給異地使用

很多小伙伴常有打印、遠程打印的需求&#xff0c;特別是對于電商人、跨境電商、教師、產品經理、實驗人員等群體來說掌握這項技能可謂是能夠在很多場景下帶來便捷&#xff0c;大幅提升做事效率&#xff01;打印機是家庭和企業經常用到的設備&#xff0c;很多情況下會遇到本地可…

【Linux】進程地址空間揭秘(初步認識)

10.進程地址空間&#xff08;初步認識&#xff09; 文章目錄 10.進程地址空間&#xff08;初步認識&#xff09;一、進程地址空間的實驗現象解析二、進程地址空間三、虛擬內存管理補充&#xff1a;數據的寫時拷貝&#xff08;淺談&#xff09;補充&#xff1a;頁表&#xff08;…

深入探討redis:主從復制

前言 如果某個服務器程序&#xff0c;只部署在一個物理服務器上就可能會面臨一下問題(單點問題) 可用性問題&#xff0c;如果這個機器掛了&#xff0c;那么對應的客戶端服務也相繼斷開性能/支持的并發量有限 所以為了解決這些問題&#xff0c;就要引入分布式系統&#xff0c…

MacOS安裝Docker Desktop并漢化

1. 安裝Docker Desktop 到Docker Desktop For Mac下載對應系統的Docker Desktop 安裝包&#xff0c;下載后安裝&#xff0c;沒有賬號需要注冊&#xff0c;然后登陸即可。 2. 漢化 前往漢化包下載鏈接下載對應系統的.asar文件 然后將安裝好的文件覆蓋原先的文件app.asar文件…

索引的選擇與Change Buffer

1. 索引選擇與Change Buffer 問題引出&#xff1a;普通索引 vs 唯一索引 ——如何選擇&#xff1f; 在實際業務中&#xff0c;如果一個字段的值天然具有唯一性&#xff08;如身份證號&#xff09;&#xff0c;并且業務代碼已確保無重復寫入&#xff0c;那就存在兩種選擇&…

lua注意事項

感覺是lua的一大坑啊&#xff0c;它還不如函數內部就局部變量呢 注意函數等內部&#xff0c;全部給加上local得了

【多線程初階】死鎖的產生 如何避免死鎖

文章目錄 關于死鎖一.死鎖的三種情況1.一個線程,一把鎖,連續多次加鎖2.兩個線程,兩把鎖3.N個線程,M把鎖 --哲學家就餐問題 二.如何避免死鎖死鎖是如何構成的(四個必要條件)打破死鎖 三.死鎖小結 關于死鎖 一.死鎖的三種情況 1.一個線程,一把鎖,連續多次加鎖 -->由synchroni…