momei-mcp-server 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 +86 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +247 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Momei MCP Server
|
|
2
|
+
|
|
3
|
+
墨梅博客 MCP (Model Context Protocol) 服务器,允许 Claude Desktop 等 AI 客户端通过标准化协议与墨梅博客进行交互,实现 AI 驱动的自动化博客管理。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
本服务器提供了一系列工具(Tools),使 AI 助手能够:
|
|
8
|
+
|
|
9
|
+
- **列表查询 (`list_posts`)**: 分页查询文章列表,支持状态、语言过滤及搜索。
|
|
10
|
+
- **获取详情 (`get_post`)**: 根据 ID 获取文章的完整元数据与内容。
|
|
11
|
+
- **创建草稿 (`create_post`)**: 快速创建新文章草稿。
|
|
12
|
+
- **更新文章 (`update_post`)**: 修改现有文章的内容、标题或标签。
|
|
13
|
+
- **发布文章 (`publish_post`)**: 将文章状态从草稿或待审核更改为已发布。
|
|
14
|
+
- **删除文章 (`delete_post`)**: 移除文章(需显式开启危险工具开关)。
|
|
15
|
+
|
|
16
|
+
## 安装与构建
|
|
17
|
+
|
|
18
|
+
### 从源码构建
|
|
19
|
+
|
|
20
|
+
在项目根目录下或 `packages/mcp-server` 目录下执行:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
cd packages/mcp-server
|
|
24
|
+
pnpm install
|
|
25
|
+
pnpm build
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
构建完成后,入口文件位于 `dist/index.mjs`。
|
|
29
|
+
|
|
30
|
+
## 配置
|
|
31
|
+
|
|
32
|
+
MCP 服务器通过环境变量进行配置:
|
|
33
|
+
|
|
34
|
+
| 环境变量 | 说明 | 默认值 |
|
|
35
|
+
|----------|------|--------|
|
|
36
|
+
| `MOMEI_API_URL` | 墨梅博客主应用的 API 地址 | `http://localhost:3000` |
|
|
37
|
+
| `MOMEI_API_KEY` | 墨梅博客的 Open API Key (可在后台生成) | (必需) |
|
|
38
|
+
| `MOMEI_ENABLE_DANGEROUS_TOOLS` | 是否启用危险工具(如删除文章)。设为 `true` 以启用 | `false` |
|
|
39
|
+
|
|
40
|
+
## Claude Desktop 集成
|
|
41
|
+
|
|
42
|
+
要将此服务器集成到 Claude Desktop,请编辑您的 `claude_desktop_config.json` 文件:
|
|
43
|
+
|
|
44
|
+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
45
|
+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
46
|
+
|
|
47
|
+
添加以下配置项:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"mcpServers": {
|
|
52
|
+
"momei": {
|
|
53
|
+
"command": "node",
|
|
54
|
+
"args": ["D:/Projects/typescript-projects/momei/packages/mcp-server/dist/index.mjs"],
|
|
55
|
+
"env": {
|
|
56
|
+
"MOMEI_API_URL": "http://localhost:3000",
|
|
57
|
+
"MOMEI_API_KEY": "你的_API_KEY_在此"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**注意**:请将 `args` 中的路径替换为您本地 `momei` 项目的实际绝对路径。
|
|
65
|
+
|
|
66
|
+
## 安全建议
|
|
67
|
+
|
|
68
|
+
1. **最小权限原则**:在墨梅后台生成的 API Key 应仅授予必要的权限。
|
|
69
|
+
2. **危险操作保护**:默认情况下,删除文章功能是禁用的。除非您完全信任 AI 的操作,否则不建议开启。
|
|
70
|
+
3. **日志监控**:主应用会记录所有外部 API 的调用审计日志,建议定期检查。
|
|
71
|
+
|
|
72
|
+
## 开发
|
|
73
|
+
|
|
74
|
+
### 调试
|
|
75
|
+
|
|
76
|
+
由于 MCP 使用标准输入输出(stdio)进行通信,**请勿在代码中使用 `console.log`**。所有调试信息应使用 `console.error` 输出,这样它们会显示在 Claude Desktop 的日志窗口中。
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pnpm dev
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 测试
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pnpm test
|
|
86
|
+
```
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
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
|
+
|
|
6
|
+
//#region src/lib/api.ts
|
|
7
|
+
var MomeiApi = class {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
async request(path, options = {}) {
|
|
12
|
+
const url = `${this.config.apiUrl}${path}`;
|
|
13
|
+
const response = await fetch(url, {
|
|
14
|
+
...options,
|
|
15
|
+
headers: {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
"X-API-Key": this.config.apiKey,
|
|
18
|
+
...options.headers
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const errorText = await response.text();
|
|
23
|
+
throw new Error(`API Error (${response.status} ${response.statusText}): ${errorText}`);
|
|
24
|
+
}
|
|
25
|
+
return response.json();
|
|
26
|
+
}
|
|
27
|
+
async listPosts(query = {}) {
|
|
28
|
+
const searchParams = new URLSearchParams();
|
|
29
|
+
Object.entries(query).forEach(([key, value]) => {
|
|
30
|
+
if (value !== void 0 && value !== null) searchParams.append(key, typeof value === "object" ? JSON.stringify(value) : String(value));
|
|
31
|
+
});
|
|
32
|
+
const queryString = searchParams.toString();
|
|
33
|
+
return this.request(`/api/external/posts${queryString ? `?${queryString}` : ""}`);
|
|
34
|
+
}
|
|
35
|
+
async getPost(id) {
|
|
36
|
+
return this.request(`/api/external/posts/${id}`);
|
|
37
|
+
}
|
|
38
|
+
async createPost(data) {
|
|
39
|
+
return this.request("/api/external/posts", {
|
|
40
|
+
method: "POST",
|
|
41
|
+
body: JSON.stringify(data)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async updatePost(id, data) {
|
|
45
|
+
return this.request(`/api/external/posts/${id}`, {
|
|
46
|
+
method: "PATCH",
|
|
47
|
+
body: JSON.stringify(data)
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async publishPost(id) {
|
|
51
|
+
return this.request(`/api/external/posts/${id}/publish`, { method: "POST" });
|
|
52
|
+
}
|
|
53
|
+
async deletePost(id) {
|
|
54
|
+
return this.request(`/api/external/posts/${id}`, { method: "DELETE" });
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/tools/posts.ts
|
|
60
|
+
function registerPostTools(server, config) {
|
|
61
|
+
const api = new MomeiApi(config);
|
|
62
|
+
server.registerTool("list_posts", {
|
|
63
|
+
description: "List blog posts with filtering options",
|
|
64
|
+
inputSchema: {
|
|
65
|
+
status: z.enum([
|
|
66
|
+
"draft",
|
|
67
|
+
"pending",
|
|
68
|
+
"published",
|
|
69
|
+
"rejected",
|
|
70
|
+
"hidden"
|
|
71
|
+
]).optional(),
|
|
72
|
+
language: z.string().optional(),
|
|
73
|
+
search: z.string().optional().describe("Search in title"),
|
|
74
|
+
page: z.number().int().min(1).default(1),
|
|
75
|
+
limit: z.number().int().min(1).max(100).default(10)
|
|
76
|
+
}
|
|
77
|
+
}, async (params) => {
|
|
78
|
+
try {
|
|
79
|
+
const result = await api.listPosts(params);
|
|
80
|
+
return { content: [{
|
|
81
|
+
type: "text",
|
|
82
|
+
text: JSON.stringify(result.data, null, 2)
|
|
83
|
+
}] };
|
|
84
|
+
} catch (error) {
|
|
85
|
+
return {
|
|
86
|
+
content: [{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: error.message
|
|
89
|
+
}],
|
|
90
|
+
isError: true
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
server.registerTool("get_post", {
|
|
95
|
+
description: "Get detailed information about a specific post",
|
|
96
|
+
inputSchema: { id: z.string().describe("The ID of the post") }
|
|
97
|
+
}, async ({ id }) => {
|
|
98
|
+
try {
|
|
99
|
+
const result = await api.getPost(id);
|
|
100
|
+
return { content: [{
|
|
101
|
+
type: "text",
|
|
102
|
+
text: JSON.stringify(result.data, null, 2)
|
|
103
|
+
}] };
|
|
104
|
+
} catch (error) {
|
|
105
|
+
return {
|
|
106
|
+
content: [{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: error.message
|
|
109
|
+
}],
|
|
110
|
+
isError: true
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
server.registerTool("create_post", {
|
|
115
|
+
description: "Create a new blog post as draft",
|
|
116
|
+
inputSchema: {
|
|
117
|
+
title: z.string().min(1),
|
|
118
|
+
content: z.string().min(1),
|
|
119
|
+
language: z.string().default("zh-CN"),
|
|
120
|
+
tags: z.array(z.string()).optional(),
|
|
121
|
+
category: z.string().optional().describe("Category slug or ID")
|
|
122
|
+
}
|
|
123
|
+
}, async (data) => {
|
|
124
|
+
try {
|
|
125
|
+
return { content: [{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: `Post created successfully! ID: ${(await api.createPost({
|
|
128
|
+
...data,
|
|
129
|
+
status: "draft"
|
|
130
|
+
})).data.id}`
|
|
131
|
+
}] };
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return {
|
|
134
|
+
content: [{
|
|
135
|
+
type: "text",
|
|
136
|
+
text: error.message
|
|
137
|
+
}],
|
|
138
|
+
isError: true
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
server.registerTool("update_post", {
|
|
143
|
+
description: "Update an existing blog post",
|
|
144
|
+
inputSchema: {
|
|
145
|
+
id: z.string(),
|
|
146
|
+
title: z.string().optional(),
|
|
147
|
+
content: z.string().optional(),
|
|
148
|
+
tags: z.array(z.string()).optional()
|
|
149
|
+
}
|
|
150
|
+
}, async ({ id, ...data }) => {
|
|
151
|
+
try {
|
|
152
|
+
await api.updatePost(id, data);
|
|
153
|
+
return { content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: `Post ${id} updated successfully.`
|
|
156
|
+
}] };
|
|
157
|
+
} catch (error) {
|
|
158
|
+
return {
|
|
159
|
+
content: [{
|
|
160
|
+
type: "text",
|
|
161
|
+
text: error.message
|
|
162
|
+
}],
|
|
163
|
+
isError: true
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
server.registerTool("publish_post", {
|
|
168
|
+
description: "Publish a post (move from draft/pending to published)",
|
|
169
|
+
inputSchema: { id: z.string() }
|
|
170
|
+
}, async ({ id }) => {
|
|
171
|
+
try {
|
|
172
|
+
await api.publishPost(id);
|
|
173
|
+
return { content: [{
|
|
174
|
+
type: "text",
|
|
175
|
+
text: `Post ${id} has been published.`
|
|
176
|
+
}] };
|
|
177
|
+
} catch (error) {
|
|
178
|
+
return {
|
|
179
|
+
content: [{
|
|
180
|
+
type: "text",
|
|
181
|
+
text: error.message
|
|
182
|
+
}],
|
|
183
|
+
isError: true
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
if (config.enableDangerousTools) server.registerTool("delete_post", {
|
|
188
|
+
description: "Delete a post (DANGEROUS: Physical deletion)",
|
|
189
|
+
inputSchema: { id: z.string() }
|
|
190
|
+
}, async ({ id }) => {
|
|
191
|
+
try {
|
|
192
|
+
await api.deletePost(id);
|
|
193
|
+
return { content: [{
|
|
194
|
+
type: "text",
|
|
195
|
+
text: `Post ${id} deleted successfully.`
|
|
196
|
+
}] };
|
|
197
|
+
} catch (error) {
|
|
198
|
+
return {
|
|
199
|
+
content: [{
|
|
200
|
+
type: "text",
|
|
201
|
+
text: error.message
|
|
202
|
+
}],
|
|
203
|
+
isError: true
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/lib/config.ts
|
|
211
|
+
function loadConfig() {
|
|
212
|
+
return {
|
|
213
|
+
apiUrl: process.env.MOMEI_API_URL || "http://localhost:3000",
|
|
214
|
+
apiKey: process.env.MOMEI_API_KEY || "",
|
|
215
|
+
enableDangerousTools: process.env.MOMEI_ENABLE_DANGEROUS_TOOLS === "true"
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
//#endregion
|
|
220
|
+
//#region src/index.ts
|
|
221
|
+
const SERVER_NAME = "momei-blog";
|
|
222
|
+
const SERVER_VERSION = "1.0.0";
|
|
223
|
+
async function main() {
|
|
224
|
+
const config = loadConfig();
|
|
225
|
+
if (!config.apiKey) {
|
|
226
|
+
console.error("Error: MOMEI_API_KEY environment variable is required");
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
const server = new McpServer({
|
|
230
|
+
name: SERVER_NAME,
|
|
231
|
+
version: SERVER_VERSION
|
|
232
|
+
});
|
|
233
|
+
registerPostTools(server, config);
|
|
234
|
+
const transport = new StdioServerTransport();
|
|
235
|
+
await server.connect(transport);
|
|
236
|
+
console.error(`Momei MCP Server v${SERVER_VERSION} running on stdio`);
|
|
237
|
+
console.error(`Connected to: ${config.apiUrl}`);
|
|
238
|
+
if (config.enableDangerousTools) console.error("WARNING: Dangerous tools (delete) are ENABLED.");
|
|
239
|
+
}
|
|
240
|
+
main().catch((error) => {
|
|
241
|
+
console.error("Fatal error starting MCP server:", error);
|
|
242
|
+
process.exit(1);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
//#endregion
|
|
246
|
+
export { };
|
|
247
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/api.ts","../src/tools/posts.ts","../src/lib/config.ts","../src/index.ts"],"sourcesContent":["import type { MomeiApiConfig } from './config.js'\n\nexport class MomeiApi {\n constructor(private config: MomeiApiConfig) {}\n\n private async request(path: string, options: RequestInit = {}) {\n const url = `${this.config.apiUrl}${path}`\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`API Error (${response.status} ${response.statusText}): ${errorText}`)\n }\n\n return response.json()\n }\n\n async listPosts(query: Record<string, any> = {}) {\n const searchParams = new URLSearchParams()\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value))\n }\n })\n const queryString = searchParams.toString()\n return this.request(`/api/external/posts${queryString ? `?${queryString}` : ''}`)\n }\n\n async getPost(id: string) {\n return this.request(`/api/external/posts/${id}`)\n }\n\n async createPost(data: any) {\n return this.request('/api/external/posts', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n async updatePost(id: string, data: any) {\n return this.request(`/api/external/posts/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n })\n }\n\n async publishPost(id: string) {\n return this.request(`/api/external/posts/${id}/publish`, {\n method: 'POST',\n })\n }\n\n async deletePost(id: string) {\n return this.request(`/api/external/posts/${id}`, {\n method: 'DELETE',\n })\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport { MomeiApi } from '../lib/api.js'\nimport type { MomeiApiConfig } from '../lib/config.js'\n\nexport function registerPostTools(server: McpServer, config: MomeiApiConfig) {\n const api = new MomeiApi(config)\n\n // 1. List Posts\n server.registerTool(\n 'list_posts',\n {\n description: 'List blog posts with filtering options',\n inputSchema: {\n status: z.enum(['draft', 'pending', 'published', 'rejected', 'hidden']).optional(),\n language: z.string().optional(),\n search: z.string().optional().describe('Search in title'),\n page: z.number().int().min(1).default(1),\n limit: z.number().int().min(1).max(100).default(10),\n },\n },\n async (params) => {\n try {\n const result = await api.listPosts(params)\n return {\n content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n\n // 2. Get Post\n server.registerTool(\n 'get_post',\n {\n description: 'Get detailed information about a specific post',\n inputSchema: {\n id: z.string().describe('The ID of the post'),\n },\n },\n async ({ id }) => {\n try {\n const result = await api.getPost(id)\n return {\n content: [{ type: 'text', text: JSON.stringify(result.data, null, 2) }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n\n // 3. Create Post\n server.registerTool(\n 'create_post',\n {\n description: 'Create a new blog post as draft',\n inputSchema: {\n title: z.string().min(1),\n content: z.string().min(1),\n language: z.string().default('zh-CN'),\n tags: z.array(z.string()).optional(),\n category: z.string().optional().describe('Category slug or ID'),\n },\n },\n async (data) => {\n try {\n const result = await api.createPost({ ...data, status: 'draft' })\n return {\n content: [{ type: 'text', text: `Post created successfully! ID: ${result.data.id}` }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n\n // 4. Update Post\n server.registerTool(\n 'update_post',\n {\n description: 'Update an existing blog post',\n inputSchema: {\n id: z.string(),\n title: z.string().optional(),\n content: z.string().optional(),\n tags: z.array(z.string()).optional(),\n },\n },\n async ({ id, ...data }) => {\n try {\n const result = await api.updatePost(id, data)\n return {\n content: [{ type: 'text', text: `Post ${id} updated successfully.` }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n\n // 5. Publish Post\n server.registerTool(\n 'publish_post',\n {\n description: 'Publish a post (move from draft/pending to published)',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n await api.publishPost(id)\n return {\n content: [{ type: 'text', text: `Post ${id} has been published.` }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n\n // 6. Delete Post (Dangerous tool, conditionally registered)\n if (config.enableDangerousTools) {\n server.registerTool(\n 'delete_post',\n {\n description: 'Delete a post (DANGEROUS: Physical deletion)',\n inputSchema: {\n id: z.string(),\n },\n },\n async ({ id }) => {\n try {\n await api.deletePost(id)\n return {\n content: [{ type: 'text', text: `Post ${id} deleted successfully.` }],\n }\n } catch (error: any) {\n return { content: [{ type: 'text', text: error.message }], isError: true }\n }\n },\n )\n }\n}\n","export interface MomeiApiConfig {\n apiUrl: string\n apiKey: string\n enableDangerousTools: boolean\n}\n\nexport function loadConfig(): MomeiApiConfig {\n return {\n apiUrl: process.env.MOMEI_API_URL || 'http://localhost:3000',\n apiKey: process.env.MOMEI_API_KEY || '',\n enableDangerousTools: process.env.MOMEI_ENABLE_DANGEROUS_TOOLS === 'true',\n }\n}\n","#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { registerPostTools } from './tools/posts.js'\nimport { loadConfig } from './lib/config.js'\n\nconst SERVER_NAME = 'momei-blog'\nconst SERVER_VERSION = '1.0.0'\n\nasync function main() {\n const config = loadConfig()\n\n if (!config.apiKey) {\n console.error('Error: MOMEI_API_KEY environment variable is required')\n process.exit(1)\n }\n\n const server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n })\n\n // Register Tools\n registerPostTools(server, config)\n\n // Use stdio transport\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n console.error(`Momei MCP Server v${SERVER_VERSION} running on stdio`)\n console.error(`Connected to: ${config.apiUrl}`)\n if (config.enableDangerousTools) {\n console.error('WARNING: Dangerous tools (delete) are ENABLED.')\n }\n}\n\nmain().catch((error) => {\n console.error('Fatal error starting MCP server:', error)\n process.exit(1)\n})\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "momei-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Momei MCP Server - AI automation via Model Context Protocol",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"momei-mcp": "dist/index.mjs"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.mjs",
|
|
10
|
+
"module": "./dist/index.mjs",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.mjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsdown",
|
|
21
|
+
"dev": "tsdown --watch",
|
|
22
|
+
"start": "node dist/index.mjs",
|
|
23
|
+
"lint": "eslint src --fix --no-warn-ignored",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
30
|
+
"zod": "^3.24.1"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.13.1",
|
|
34
|
+
"eslint": "^9.19.0",
|
|
35
|
+
"eslint-config-cmyr": "^2.1.3",
|
|
36
|
+
"tsdown": "^0.20.3",
|
|
37
|
+
"typescript": "^5.7.3",
|
|
38
|
+
"vitest": "^3.0.5"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20"
|
|
42
|
+
}
|
|
43
|
+
}
|