mcp-ktt-ocr 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +237 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# MCP Order OCR Service
|
|
2
|
+
|
|
3
|
+
基于阿里云百炼 qwen-vl 模型的订单截图 OCR 识别 MCP 服务。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- **订单截图识别** (`recognize_order_screenshot`):识别订单截图,提取订单号、商品信息、物流信息等结构化数据
|
|
8
|
+
- **通用 OCR** (`general_ocr`):通用图片文字识别,提取图片中的所有文字内容
|
|
9
|
+
- **图片内容分析** (`analyze_image_content`):分析图片内容,判断图片类型并提取关键信息
|
|
10
|
+
|
|
11
|
+
## 安装
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install mcp-order-ocr
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 配置
|
|
18
|
+
|
|
19
|
+
### 环境变量
|
|
20
|
+
|
|
21
|
+
在使用前需要设置阿里云 DashScope API Key:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
export DASHSCOPE_API_KEY=your_api_key_here
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 在百炼平台配置 MCP 服务
|
|
28
|
+
|
|
29
|
+
1. 登录百炼控制台:https://bailian.console.aliyun.com/
|
|
30
|
+
2. 进入「插件」->「MCP 服务」
|
|
31
|
+
3. 点击「新增自定义 MCP」
|
|
32
|
+
4. 填写 npm 包名:`mcp-order-ocr`
|
|
33
|
+
5. 配置环境变量:`DASHSCOPE_API_KEY`
|
|
34
|
+
6. 保存并在智能体应用中启用
|
|
35
|
+
|
|
36
|
+
## 工具说明
|
|
37
|
+
|
|
38
|
+
### 1. recognize_order_screenshot
|
|
39
|
+
|
|
40
|
+
识别订单截图,返回结构化的订单信息。
|
|
41
|
+
|
|
42
|
+
**参数:**
|
|
43
|
+
- `image_url` (string, 必填):订单截图的 URL 地址
|
|
44
|
+
|
|
45
|
+
**返回示例:**
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"order_id": "250704-308244682452790",
|
|
49
|
+
"group_name": "团团优选",
|
|
50
|
+
"product_name": "【厚底小金豆双带勃肯凉拖鞋】",
|
|
51
|
+
"product_spec": "金豆粉色,36-37",
|
|
52
|
+
"quantity": "1",
|
|
53
|
+
"price": "29.9",
|
|
54
|
+
"order_status": "已发货",
|
|
55
|
+
"logistics_company": "邮政快递",
|
|
56
|
+
"tracking_number": "9879437921211",
|
|
57
|
+
"create_time": "2025-07-04 15:30",
|
|
58
|
+
"buyer_remark": null
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 2. general_ocr
|
|
63
|
+
|
|
64
|
+
通用图片文字识别。
|
|
65
|
+
|
|
66
|
+
**参数:**
|
|
67
|
+
- `image_url` (string, 必填):图片的 URL 地址
|
|
68
|
+
- `custom_prompt` (string, 可选):自定义提示词
|
|
69
|
+
|
|
70
|
+
### 3. analyze_image_content
|
|
71
|
+
|
|
72
|
+
分析图片内容和类型。
|
|
73
|
+
|
|
74
|
+
**参数:**
|
|
75
|
+
- `image_url` (string, 必填):图片的 URL 地址
|
|
76
|
+
|
|
77
|
+
**返回示例:**
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"image_type": "订单截图",
|
|
81
|
+
"key_info": {
|
|
82
|
+
"order_id": "250704-308244682452790",
|
|
83
|
+
"product": "凉拖鞋"
|
|
84
|
+
},
|
|
85
|
+
"suggested_action": "可以查询该订单的物流信息"
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 本地开发
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# 克隆项目
|
|
93
|
+
git clone <repo_url>
|
|
94
|
+
cd mcp-ocr-service
|
|
95
|
+
|
|
96
|
+
# 安装依赖
|
|
97
|
+
npm install
|
|
98
|
+
|
|
99
|
+
# 编译
|
|
100
|
+
npm run build
|
|
101
|
+
|
|
102
|
+
# 运行(需要设置 DASHSCOPE_API_KEY)
|
|
103
|
+
npm start
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 技术栈
|
|
107
|
+
|
|
108
|
+
- TypeScript
|
|
109
|
+
- @modelcontextprotocol/sdk
|
|
110
|
+
- 阿里云 DashScope qwen-vl-max 模型
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT
|
|
115
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Order OCR Service
|
|
4
|
+
*
|
|
5
|
+
* 提供订单截图 OCR 识别功能的 MCP 服务
|
|
6
|
+
* 使用阿里云百炼 qwen-vl 模型进行图片理解
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
// 环境变量配置
|
|
12
|
+
const DASHSCOPE_API_KEY = process.env.DASHSCOPE_API_KEY || "";
|
|
13
|
+
const DASHSCOPE_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";
|
|
14
|
+
// 创建 MCP 服务器
|
|
15
|
+
const server = new McpServer({
|
|
16
|
+
name: "mcp-ktt-ocr",
|
|
17
|
+
version: "1.0.0",
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* 调用阿里云百炼 qwen-vl 模型进行图片理解
|
|
21
|
+
*/
|
|
22
|
+
async function analyzeImage(imageUrl, prompt) {
|
|
23
|
+
if (!DASHSCOPE_API_KEY) {
|
|
24
|
+
throw new Error("DASHSCOPE_API_KEY environment variable is not set");
|
|
25
|
+
}
|
|
26
|
+
const requestBody = {
|
|
27
|
+
model: "qwen-vl-max",
|
|
28
|
+
messages: [
|
|
29
|
+
{
|
|
30
|
+
role: "user",
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: "image_url",
|
|
34
|
+
image_url: {
|
|
35
|
+
url: imageUrl,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: prompt,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
max_tokens: 2000,
|
|
46
|
+
};
|
|
47
|
+
const response = await fetch(`${DASHSCOPE_BASE_URL}/chat/completions`, {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: {
|
|
50
|
+
"Content-Type": "application/json",
|
|
51
|
+
Authorization: `Bearer ${DASHSCOPE_API_KEY}`,
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify(requestBody),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const errorText = await response.text();
|
|
57
|
+
throw new Error(`API request failed: ${response.status} - ${errorText}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await response.json());
|
|
60
|
+
const content = data.choices?.[0]?.message?.content;
|
|
61
|
+
if (!content) {
|
|
62
|
+
throw new Error("No content in API response");
|
|
63
|
+
}
|
|
64
|
+
return content;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 解析订单信息的结构化 prompt
|
|
68
|
+
*/
|
|
69
|
+
const ORDER_OCR_PROMPT = `请仔细分析这张订单截图,提取以下信息并以JSON格式返回:
|
|
70
|
+
|
|
71
|
+
{
|
|
72
|
+
"order_id": "订单编号(格式如:250704-308244682452790 或 PO-开头的编号)",
|
|
73
|
+
"group_name": "团长名称或店铺名称(如果可见)",
|
|
74
|
+
"product_name": "商品名称",
|
|
75
|
+
"product_spec": "商品规格(如:颜色、尺码等)",
|
|
76
|
+
"quantity": "数量",
|
|
77
|
+
"price": "价格",
|
|
78
|
+
"order_status": "订单状态(如:待发货、已发货、已完成等)",
|
|
79
|
+
"logistics_company": "快递公司(如果可见)",
|
|
80
|
+
"tracking_number": "快递单号(如果可见)",
|
|
81
|
+
"create_time": "下单时间(如果可见)",
|
|
82
|
+
"buyer_remark": "买家备注(如果可见)"
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
注意事项:
|
|
86
|
+
1. 如果某个字段在图片中不可见或无法识别,请设置为 null
|
|
87
|
+
2. 订单编号是最重要的信息,请务必准确识别
|
|
88
|
+
3. 如果图片模糊或信息不完整,请在返回的 JSON 中添加 "confidence" 字段说明可信度
|
|
89
|
+
4. 如果图片不是订单截图,请返回 {"error": "这不是一张订单截图"}`;
|
|
90
|
+
/**
|
|
91
|
+
* 通用图片 OCR prompt
|
|
92
|
+
*/
|
|
93
|
+
const GENERAL_OCR_PROMPT = `请识别这张图片中的所有文字内容,并按照从上到下、从左到右的顺序返回文字。
|
|
94
|
+
|
|
95
|
+
如果图片中有表格,请尽量保持表格结构。
|
|
96
|
+
如果图片中有重要的数字(如订单号、金额、电话等),请特别标注。`;
|
|
97
|
+
// 注册工具
|
|
98
|
+
// 工具1:订单截图识别
|
|
99
|
+
server.tool("recognize_order_screenshot", "识别订单截图,提取订单号、商品信息、物流信息等结构化数据", {
|
|
100
|
+
image_url: z.string().describe("订单截图的 URL 地址(支持 http/https 链接或 base64 编码)"),
|
|
101
|
+
}, async ({ image_url }) => {
|
|
102
|
+
try {
|
|
103
|
+
const result = await analyzeImage(image_url, ORDER_OCR_PROMPT);
|
|
104
|
+
// 尝试解析 JSON 结果
|
|
105
|
+
let parsedResult;
|
|
106
|
+
try {
|
|
107
|
+
// 提取 JSON 部分(模型可能会在 JSON 前后添加说明文字)
|
|
108
|
+
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
109
|
+
if (jsonMatch) {
|
|
110
|
+
parsedResult = JSON.parse(jsonMatch[0]);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
parsedResult = { raw_text: result };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
parsedResult = { raw_text: result };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: JSON.stringify(parsedResult, null, 2),
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
130
|
+
return {
|
|
131
|
+
content: [
|
|
132
|
+
{
|
|
133
|
+
type: "text",
|
|
134
|
+
text: JSON.stringify({ error: errorMessage }),
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
isError: true,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
// 工具2:通用 OCR 识别
|
|
142
|
+
server.tool("general_ocr", "通用图片文字识别,提取图片中的所有文字内容", {
|
|
143
|
+
image_url: z.string().describe("图片的 URL 地址(支持 http/https 链接或 base64 编码)"),
|
|
144
|
+
custom_prompt: z.string().optional().describe("自定义提示词(可选,用于指定识别重点)"),
|
|
145
|
+
}, async ({ image_url, custom_prompt }) => {
|
|
146
|
+
try {
|
|
147
|
+
const prompt = custom_prompt || GENERAL_OCR_PROMPT;
|
|
148
|
+
const result = await analyzeImage(image_url, prompt);
|
|
149
|
+
return {
|
|
150
|
+
content: [
|
|
151
|
+
{
|
|
152
|
+
type: "text",
|
|
153
|
+
text: result,
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: JSON.stringify({ error: errorMessage }),
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
isError: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// 工具3:图片内容分析
|
|
172
|
+
server.tool("analyze_image_content", "分析图片内容,判断图片类型并提取关键信息", {
|
|
173
|
+
image_url: z.string().describe("图片的 URL 地址"),
|
|
174
|
+
}, async ({ image_url }) => {
|
|
175
|
+
try {
|
|
176
|
+
const prompt = `请分析这张图片:
|
|
177
|
+
|
|
178
|
+
1. 图片类型:判断这是什么类型的图片(订单截图、商品图片、物流截图、聊天截图、其他)
|
|
179
|
+
2. 关键信息:提取图片中的关键信息
|
|
180
|
+
3. 建议操作:基于图片内容,建议下一步应该做什么
|
|
181
|
+
|
|
182
|
+
请以JSON格式返回:
|
|
183
|
+
{
|
|
184
|
+
"image_type": "图片类型",
|
|
185
|
+
"key_info": {
|
|
186
|
+
// 根据图片类型返回相应的关键信息
|
|
187
|
+
},
|
|
188
|
+
"suggested_action": "建议操作"
|
|
189
|
+
}`;
|
|
190
|
+
const result = await analyzeImage(image_url, prompt);
|
|
191
|
+
// 尝试解析 JSON
|
|
192
|
+
let parsedResult;
|
|
193
|
+
try {
|
|
194
|
+
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
195
|
+
if (jsonMatch) {
|
|
196
|
+
parsedResult = JSON.parse(jsonMatch[0]);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
parsedResult = { raw_text: result };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
parsedResult = { raw_text: result };
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
content: [
|
|
207
|
+
{
|
|
208
|
+
type: "text",
|
|
209
|
+
text: JSON.stringify(parsedResult, null, 2),
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
216
|
+
return {
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: JSON.stringify({ error: errorMessage }),
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
isError: true,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
// 启动服务器
|
|
228
|
+
async function main() {
|
|
229
|
+
const transport = new StdioServerTransport();
|
|
230
|
+
await server.connect(transport);
|
|
231
|
+
console.error("MCP KTT OCR Service started");
|
|
232
|
+
}
|
|
233
|
+
main().catch((error) => {
|
|
234
|
+
console.error("Failed to start server:", error);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
});
|
|
237
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-ktt-ocr",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP service for order screenshot OCR recognition using Alibaba Cloud Bailian qwen-vl model",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp-ktt-ocr": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"dev": "tsc -w",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"ocr",
|
|
19
|
+
"order-recognition",
|
|
20
|
+
"alibaba-cloud",
|
|
21
|
+
"bailian",
|
|
22
|
+
"qwen-vl"
|
|
23
|
+
],
|
|
24
|
+
"author": "AICustomerService",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^25.0.6",
|
|
28
|
+
"typescript": "^5.9.3"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
32
|
+
"zod": "^4.3.5"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist/**/*"
|
|
39
|
+
]
|
|
40
|
+
}
|