weflow-mcp 0.1.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 +86 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# weflow-mcp
|
|
2
|
+
|
|
3
|
+
TypeScript MCP server for calling the local [WeFlow](https://github.com/hicccc77/WeFlow) HTTP API.
|
|
4
|
+
|
|
5
|
+
WeFlow must be running locally with **API 服务** enabled. The default API base URL is `http://127.0.0.1:5031`. Except for health checks, WeFlow `/api/v1/*` endpoints require an access token.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Use directly with `npx`:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx -y weflow-mcp
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or install from source:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install
|
|
19
|
+
npm run build
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Configuration
|
|
23
|
+
|
|
24
|
+
Set these environment variables in your MCP client:
|
|
25
|
+
|
|
26
|
+
| Variable | Default | Description |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| `WEFLOW_BASE_URL` | `http://127.0.0.1:5031` | WeFlow HTTP API base URL |
|
|
29
|
+
| `WEFLOW_ACCESS_TOKEN` | empty | WeFlow API token |
|
|
30
|
+
| `WEFLOW_API_TOKEN` | empty | Fallback token name, used if `WEFLOW_ACCESS_TOKEN` is empty |
|
|
31
|
+
| `WEFLOW_TIMEOUT_MS` | `30000` | Request timeout in milliseconds |
|
|
32
|
+
|
|
33
|
+
## MCP client example
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"mcpServers": {
|
|
38
|
+
"weflow": {
|
|
39
|
+
"command": "node",
|
|
40
|
+
"args": ["/home/projects/wechat-tool/weflow-mcp/dist/index.js"],
|
|
41
|
+
"env": {
|
|
42
|
+
"WEFLOW_BASE_URL": "http://127.0.0.1:5031",
|
|
43
|
+
"WEFLOW_ACCESS_TOKEN": "YOUR_TOKEN"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
After npm publish, you can use `npx` instead:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"mcpServers": {
|
|
55
|
+
"weflow": {
|
|
56
|
+
"command": "npx",
|
|
57
|
+
"args": ["-y", "weflow-mcp"],
|
|
58
|
+
"env": {
|
|
59
|
+
"WEFLOW_BASE_URL": "http://127.0.0.1:5031",
|
|
60
|
+
"WEFLOW_ACCESS_TOKEN": "YOUR_TOKEN"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Tools
|
|
68
|
+
|
|
69
|
+
- `weflow_health`: check WeFlow API health.
|
|
70
|
+
- `weflow_list_sessions`: list chat sessions.
|
|
71
|
+
- `weflow_get_messages`: get messages from a chat session.
|
|
72
|
+
- `weflow_get_session_messages_chatlab`: pull one session in ChatLab format.
|
|
73
|
+
- `weflow_list_contacts`: list contacts.
|
|
74
|
+
- `weflow_get_group_members`: list group members.
|
|
75
|
+
- `weflow_sns_timeline`: get Moments timeline.
|
|
76
|
+
- `weflow_sns_usernames`: list Moments publishers.
|
|
77
|
+
- `weflow_sns_export_stats`: get Moments export stats.
|
|
78
|
+
- `weflow_sns_export`: start a Moments export.
|
|
79
|
+
- `weflow_sns_block_delete`: get/install/uninstall Moments anti-delete status.
|
|
80
|
+
- `weflow_request`: call any supported WeFlow API endpoint with custom method/query/body.
|
|
81
|
+
|
|
82
|
+
## Notes
|
|
83
|
+
|
|
84
|
+
- WeFlow's API only listens on `127.0.0.1` by default.
|
|
85
|
+
- Before using data tools, connect WeFlow to the WeChat database in the WeFlow app.
|
|
86
|
+
- Media URLs returned by message APIs are usable after calling messages with `media=1`.
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const DEFAULT_BASE_URL = "http://127.0.0.1:5031";
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
7
|
+
const config = {
|
|
8
|
+
baseUrl: normalizeBaseUrl(process.env.WEFLOW_BASE_URL ?? DEFAULT_BASE_URL),
|
|
9
|
+
accessToken: process.env.WEFLOW_ACCESS_TOKEN ?? process.env.WEFLOW_API_TOKEN ?? "",
|
|
10
|
+
timeoutMs: parsePositiveInteger(process.env.WEFLOW_TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
|
|
11
|
+
};
|
|
12
|
+
const server = new McpServer({
|
|
13
|
+
name: "weflow-mcp",
|
|
14
|
+
version: "0.1.0",
|
|
15
|
+
});
|
|
16
|
+
const boolish = z
|
|
17
|
+
.union([z.boolean(), z.literal(0), z.literal(1), z.literal("0"), z.literal("1"), z.literal("true"), z.literal("false")])
|
|
18
|
+
.optional();
|
|
19
|
+
const pagination = {
|
|
20
|
+
limit: z.number().int().positive().optional(),
|
|
21
|
+
offset: z.number().int().min(0).optional(),
|
|
22
|
+
};
|
|
23
|
+
const dateRange = {
|
|
24
|
+
start: z.union([z.string(), z.number().int()]).optional(),
|
|
25
|
+
end: z.union([z.string(), z.number().int()]).optional(),
|
|
26
|
+
};
|
|
27
|
+
server.tool("weflow_health", "Check whether the local WeFlow HTTP API is reachable.", {}, async () => {
|
|
28
|
+
const data = await weflowRequest("/health", { authenticated: false });
|
|
29
|
+
return jsonResponse(data);
|
|
30
|
+
});
|
|
31
|
+
server.tool("weflow_list_sessions", "List WeFlow chat sessions. Use keyword to search username or display name.", {
|
|
32
|
+
keyword: z.string().optional(),
|
|
33
|
+
limit: z.number().int().positive().optional(),
|
|
34
|
+
format: z.enum(["json", "chatlab"]).optional(),
|
|
35
|
+
}, async (args) => {
|
|
36
|
+
const data = await weflowRequest("/api/v1/sessions", { query: cleanQuery(args) });
|
|
37
|
+
return jsonResponse(data);
|
|
38
|
+
});
|
|
39
|
+
server.tool("weflow_get_messages", "Get messages from one WeFlow session by talker ID. Supports date ranges, keyword filtering, ChatLab format, and media export flags.", {
|
|
40
|
+
talker: z.string().min(1).describe("Session ID. Private chats are usually wxid values; groups usually end with @chatroom."),
|
|
41
|
+
...pagination,
|
|
42
|
+
...dateRange,
|
|
43
|
+
keyword: z.string().optional(),
|
|
44
|
+
chatlab: boolish,
|
|
45
|
+
format: z.enum(["json", "chatlab"]).optional(),
|
|
46
|
+
media: boolish,
|
|
47
|
+
image: boolish,
|
|
48
|
+
voice: boolish,
|
|
49
|
+
video: boolish,
|
|
50
|
+
emoji: boolish,
|
|
51
|
+
}, async (args) => {
|
|
52
|
+
const data = await weflowRequest("/api/v1/messages", { query: cleanQuery(args) });
|
|
53
|
+
return jsonResponse(data);
|
|
54
|
+
});
|
|
55
|
+
server.tool("weflow_get_session_messages_chatlab", "Pull one session in ChatLab format using WeFlow's /api/v1/sessions/:id/messages endpoint.", {
|
|
56
|
+
id: z.string().min(1).describe("Session ID, for example wxid_xxx or xxx@chatroom."),
|
|
57
|
+
since: z.number().int().optional(),
|
|
58
|
+
end: z.number().int().optional(),
|
|
59
|
+
limit: z.number().int().positive().max(5000).optional(),
|
|
60
|
+
offset: z.number().int().min(0).optional(),
|
|
61
|
+
}, async ({ id, ...query }) => {
|
|
62
|
+
const data = await weflowRequest(`/api/v1/sessions/${encodeURIComponent(id)}/messages`, { query: cleanQuery(query) });
|
|
63
|
+
return jsonResponse(data);
|
|
64
|
+
});
|
|
65
|
+
server.tool("weflow_list_contacts", "List WeFlow contacts. Use keyword to search username, nickname, remark, or display name.", {
|
|
66
|
+
keyword: z.string().optional(),
|
|
67
|
+
limit: z.number().int().positive().optional(),
|
|
68
|
+
}, async (args) => {
|
|
69
|
+
const data = await weflowRequest("/api/v1/contacts", { query: cleanQuery(args) });
|
|
70
|
+
return jsonResponse(data);
|
|
71
|
+
});
|
|
72
|
+
server.tool("weflow_get_group_members", "List members of a WeChat group from WeFlow, optionally including message counts.", {
|
|
73
|
+
chatroomId: z.string().min(1).describe("Group ID, usually ending with @chatroom."),
|
|
74
|
+
includeMessageCounts: boolish,
|
|
75
|
+
withCounts: boolish,
|
|
76
|
+
forceRefresh: boolish,
|
|
77
|
+
}, async (args) => {
|
|
78
|
+
const data = await weflowRequest("/api/v1/group-members", { query: cleanQuery(args) });
|
|
79
|
+
return jsonResponse(data);
|
|
80
|
+
});
|
|
81
|
+
server.tool("weflow_sns_timeline", "Get WeFlow Moments timeline entries.", {
|
|
82
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
83
|
+
offset: z.number().int().min(0).optional(),
|
|
84
|
+
usernames: z.string().optional().describe("Comma-separated publisher usernames."),
|
|
85
|
+
keyword: z.string().optional(),
|
|
86
|
+
...dateRange,
|
|
87
|
+
media: boolish,
|
|
88
|
+
replace: boolish,
|
|
89
|
+
inline: boolish,
|
|
90
|
+
}, async (args) => {
|
|
91
|
+
const data = await weflowRequest("/api/v1/sns/timeline", { query: cleanQuery(args) });
|
|
92
|
+
return jsonResponse(data);
|
|
93
|
+
});
|
|
94
|
+
server.tool("weflow_sns_usernames", "List WeFlow Moments publishers.", {}, async () => {
|
|
95
|
+
const data = await weflowRequest("/api/v1/sns/usernames");
|
|
96
|
+
return jsonResponse(data);
|
|
97
|
+
});
|
|
98
|
+
server.tool("weflow_sns_export_stats", "Get WeFlow Moments export statistics.", {
|
|
99
|
+
fast: boolish,
|
|
100
|
+
}, async (args) => {
|
|
101
|
+
const data = await weflowRequest("/api/v1/sns/export/stats", { query: cleanQuery(args) });
|
|
102
|
+
return jsonResponse(data);
|
|
103
|
+
});
|
|
104
|
+
server.tool("weflow_sns_export", "Export WeFlow Moments to a local directory from the WeFlow app process.", {
|
|
105
|
+
outputDir: z.string().min(1),
|
|
106
|
+
format: z.enum(["json", "html", "arkmejson", "arkme-json"]).optional(),
|
|
107
|
+
usernames: z.string().optional(),
|
|
108
|
+
keyword: z.string().optional(),
|
|
109
|
+
exportMedia: z.boolean().optional(),
|
|
110
|
+
exportImages: z.boolean().optional(),
|
|
111
|
+
exportLivePhotos: z.boolean().optional(),
|
|
112
|
+
exportVideos: z.boolean().optional(),
|
|
113
|
+
...dateRange,
|
|
114
|
+
}, async (args) => {
|
|
115
|
+
const data = await weflowRequest("/api/v1/sns/export", { method: "POST", body: args });
|
|
116
|
+
return jsonResponse(data);
|
|
117
|
+
});
|
|
118
|
+
server.tool("weflow_sns_block_delete", "Manage WeFlow Moments anti-delete status. Actions map to status, install, and uninstall endpoints.", {
|
|
119
|
+
action: z.enum(["status", "install", "uninstall"]),
|
|
120
|
+
}, async ({ action }) => {
|
|
121
|
+
const method = action === "status" ? "GET" : "POST";
|
|
122
|
+
const data = await weflowRequest(`/api/v1/sns/block-delete/${action}`, { method });
|
|
123
|
+
return jsonResponse(data);
|
|
124
|
+
});
|
|
125
|
+
server.tool("weflow_request", "Call a custom WeFlow API endpoint. Use this for endpoints not covered by dedicated tools.", {
|
|
126
|
+
method: z.enum(["GET", "POST", "DELETE"]).default("GET"),
|
|
127
|
+
path: z
|
|
128
|
+
.string()
|
|
129
|
+
.min(1)
|
|
130
|
+
.refine((value) => value.startsWith("/"), "path must start with /")
|
|
131
|
+
.refine((value) => !value.startsWith("//"), "path must be relative, not a protocol-relative URL"),
|
|
132
|
+
query: z.record(z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),
|
|
133
|
+
body: z.unknown().optional(),
|
|
134
|
+
authenticated: z.boolean().default(true),
|
|
135
|
+
}, async ({ method, path, query, body, authenticated }) => {
|
|
136
|
+
const data = await weflowRequest(path, { method, query: cleanQuery(query ?? {}), body, authenticated });
|
|
137
|
+
return jsonResponse(data);
|
|
138
|
+
});
|
|
139
|
+
const transport = new StdioServerTransport();
|
|
140
|
+
await server.connect(transport);
|
|
141
|
+
function normalizeBaseUrl(value) {
|
|
142
|
+
const trimmed = value.trim();
|
|
143
|
+
return trimmed.endsWith("/") ? trimmed.slice(0, -1) : trimmed;
|
|
144
|
+
}
|
|
145
|
+
function parsePositiveInteger(value, fallback) {
|
|
146
|
+
if (!value) {
|
|
147
|
+
return fallback;
|
|
148
|
+
}
|
|
149
|
+
const parsed = Number.parseInt(value, 10);
|
|
150
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
151
|
+
}
|
|
152
|
+
function cleanQuery(input) {
|
|
153
|
+
return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined && value !== null && value !== ""));
|
|
154
|
+
}
|
|
155
|
+
async function weflowRequest(path, options = {}) {
|
|
156
|
+
const method = options.method ?? "GET";
|
|
157
|
+
const url = new URL(path, config.baseUrl);
|
|
158
|
+
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
159
|
+
if (value !== undefined && value !== null) {
|
|
160
|
+
url.searchParams.set(key, String(value));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const headers = new Headers();
|
|
164
|
+
if (options.authenticated ?? true) {
|
|
165
|
+
if (!config.accessToken) {
|
|
166
|
+
throw new Error("WEFLOW_ACCESS_TOKEN is required for this WeFlow API endpoint.");
|
|
167
|
+
}
|
|
168
|
+
headers.set("Authorization", `Bearer ${config.accessToken}`);
|
|
169
|
+
}
|
|
170
|
+
let body;
|
|
171
|
+
if (method !== "GET" && options.body !== undefined) {
|
|
172
|
+
headers.set("Content-Type", "application/json");
|
|
173
|
+
body = JSON.stringify(options.body);
|
|
174
|
+
}
|
|
175
|
+
const controller = new AbortController();
|
|
176
|
+
const timeout = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
177
|
+
try {
|
|
178
|
+
const response = await fetch(url, {
|
|
179
|
+
method,
|
|
180
|
+
headers,
|
|
181
|
+
body,
|
|
182
|
+
signal: controller.signal,
|
|
183
|
+
});
|
|
184
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
185
|
+
const payload = contentType.includes("application/json") ? await response.json() : await response.text();
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
throw new Error(`WeFlow API ${method} ${url.pathname} failed with HTTP ${response.status}: ${stringify(payload)}`);
|
|
188
|
+
}
|
|
189
|
+
return payload;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
193
|
+
throw new Error(`WeFlow API request timed out after ${config.timeoutMs}ms: ${method} ${url.pathname}`);
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
clearTimeout(timeout);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function jsonResponse(data) {
|
|
202
|
+
return {
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
205
|
+
type: "text",
|
|
206
|
+
text: stringify(data),
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function stringify(data) {
|
|
212
|
+
if (typeof data === "string") {
|
|
213
|
+
return data;
|
|
214
|
+
}
|
|
215
|
+
return JSON.stringify(data, null, 2);
|
|
216
|
+
}
|
|
217
|
+
//# 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,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "weflow-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for calling the local WeFlow HTTP API.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"weflow-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsx src/index.ts",
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"publish:npm": "npm publish --access public",
|
|
26
|
+
"start": "node dist/index.js",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mcp",
|
|
31
|
+
"weflow",
|
|
32
|
+
"wechat",
|
|
33
|
+
"model-context-protocol"
|
|
34
|
+
],
|
|
35
|
+
"homepage": "https://github.com/L-Chris/weflow-mcp#readme",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/L-Chris/weflow-mcp/issues"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/L-Chris/weflow-mcp.git"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.15.0",
|
|
49
|
+
"zod": "^3.25.76"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/node": "^22.13.14",
|
|
53
|
+
"tsx": "^4.20.3",
|
|
54
|
+
"typescript": "^5.8.3"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=20.0.0"
|
|
58
|
+
}
|
|
59
|
+
}
|