transn-yapi-mcp 0.1.0 → 0.1.2
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/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/tools.js +23 -4
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +5 -1
- package/src/tools.ts +26 -5
package/dist/index.js
CHANGED
|
@@ -3,8 +3,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { tools } from "./tools.js";
|
|
5
5
|
const server = new McpServer({
|
|
6
|
-
name: "
|
|
7
|
-
version: "0.1.
|
|
6
|
+
name: "transn-yapi-mcp",
|
|
7
|
+
version: "0.1.2"
|
|
8
8
|
});
|
|
9
9
|
// 注册工具
|
|
10
10
|
for (const tool of tools) {
|
|
@@ -15,4 +15,8 @@ for (const tool of tools) {
|
|
|
15
15
|
}
|
|
16
16
|
const transport = new StdioServerTransport();
|
|
17
17
|
await server.connect(transport);
|
|
18
|
+
// 确保在无输入时进程不立即退出,便于被 MCP 客户端保持长连接
|
|
19
|
+
process.stdin.resume();
|
|
20
|
+
// 兜底保活,避免在某些环境下事件循环清空直接退出
|
|
21
|
+
setInterval(() => { }, 1 << 30);
|
|
18
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,OAAO;AACP,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,kCAAkC;AAClC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AACvB,0BAA0B;AAC1B,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC"}
|
package/dist/tools.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
// src/tools.ts
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
import { getInterface, getInterfaceByPath } from "./yapi.js";
|
|
3
4
|
export const tools = [
|
|
4
5
|
{
|
|
5
|
-
|
|
6
|
+
// 工具名用简单下划线,避免客户端再做转换
|
|
7
|
+
name: "yapi_get_api_context",
|
|
6
8
|
description: "Get structured API context from YAPI",
|
|
7
9
|
inputSchema: z.object({
|
|
8
10
|
projectId: z.number().optional(),
|
|
@@ -12,7 +14,7 @@ export const tools = [
|
|
|
12
14
|
const api = projectId
|
|
13
15
|
? await getInterface(projectId, interfaceId)
|
|
14
16
|
: await getInterface(interfaceId);
|
|
15
|
-
|
|
17
|
+
const payload = {
|
|
16
18
|
name: api.title,
|
|
17
19
|
path: api.path,
|
|
18
20
|
method: api.method,
|
|
@@ -23,10 +25,19 @@ export const tools = [
|
|
|
23
25
|
},
|
|
24
26
|
response: api.res_body
|
|
25
27
|
};
|
|
28
|
+
// ★ 关键:返回 MCP 标准的 CallToolResult
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: JSON.stringify(payload) // 先用 text,保证协议合法
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
};
|
|
26
37
|
}
|
|
27
38
|
},
|
|
28
39
|
{
|
|
29
|
-
name: "
|
|
40
|
+
name: "yapi_get_api_context_by_path",
|
|
30
41
|
description: "Get API context by path within a YAPI project",
|
|
31
42
|
inputSchema: z.object({
|
|
32
43
|
projectId: z.number(),
|
|
@@ -35,7 +46,7 @@ export const tools = [
|
|
|
35
46
|
}),
|
|
36
47
|
handler: async ({ projectId, path, method }) => {
|
|
37
48
|
const api = await getInterfaceByPath(projectId, path, method);
|
|
38
|
-
|
|
49
|
+
const payload = {
|
|
39
50
|
name: api.title,
|
|
40
51
|
path: api.path,
|
|
41
52
|
method: api.method,
|
|
@@ -46,6 +57,14 @@ export const tools = [
|
|
|
46
57
|
},
|
|
47
58
|
response: api.res_body
|
|
48
59
|
};
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{
|
|
63
|
+
type: "text",
|
|
64
|
+
text: JSON.stringify(payload)
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
};
|
|
49
68
|
}
|
|
50
69
|
}
|
|
51
70
|
];
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAA+C,EAAE,EAAE;YACzF,MAAM,GAAG,GAAG,SAAS;gBACnB,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC;gBAC5C,CAAC,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAEpC,OAAO;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;QACE,sBAAsB;QACtB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAA+C,EAAE,EAAE;YACzF,MAAM,GAAG,GAAG,SAAS;gBACnB,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC;gBAC5C,CAAC,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAEpC,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,GAAG,CAAC,KAAK;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,WAAW,EAAE,GAAG,CAAC,IAAI;gBACrB,OAAO,EAAE;oBACP,KAAK,EAAE,GAAG,CAAC,SAAS;oBACpB,IAAI,EAAE,GAAG,CAAC,cAAc;iBACzB;gBACD,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;YAEF,iCAAiC;YACjC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,iBAAiB;qBAChD;iBACF;aACF,CAAC;QACJ,CAAC;KACF;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC9B,CAAC;QACF,OAAO,EAAE,KAAK,EACZ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAwD,EACjF,EAAE;YACF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,GAAG,CAAC,KAAK;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,WAAW,EAAE,GAAG,CAAC,IAAI;gBACrB,OAAO,EAAE;oBACP,KAAK,EAAE,GAAG,CAAC,SAAS;oBACpB,IAAI,EAAE,GAAG,CAAC,cAAc;iBACzB;gBACD,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;qBAC9B;iBACF;aACF,CAAC;QACJ,CAAC;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { tools } from "./tools.js";
|
|
|
5
5
|
|
|
6
6
|
const server = new McpServer({
|
|
7
7
|
name: "transn-yapi-mcp",
|
|
8
|
-
version: "0.1.
|
|
8
|
+
version: "0.1.2"
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
// 注册工具
|
|
@@ -18,3 +18,7 @@ for (const tool of tools) {
|
|
|
18
18
|
|
|
19
19
|
const transport = new StdioServerTransport();
|
|
20
20
|
await server.connect(transport);
|
|
21
|
+
// 确保在无输入时进程不立即退出,便于被 MCP 客户端保持长连接
|
|
22
|
+
process.stdin.resume();
|
|
23
|
+
// 兜底保活,避免在某些环境下事件循环清空直接退出
|
|
24
|
+
setInterval(() => {}, 1 << 30);
|
package/src/tools.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
// src/tools.ts
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
import { getInterface, getInterfaceByPath } from "./yapi.js";
|
|
3
4
|
|
|
4
5
|
export const tools = [
|
|
5
6
|
{
|
|
6
|
-
|
|
7
|
+
// 工具名用简单下划线,避免客户端再做转换
|
|
8
|
+
name: "yapi_get_api_context",
|
|
7
9
|
description: "Get structured API context from YAPI",
|
|
8
10
|
inputSchema: z.object({
|
|
9
11
|
projectId: z.number().optional(),
|
|
@@ -14,7 +16,7 @@ export const tools = [
|
|
|
14
16
|
? await getInterface(projectId, interfaceId)
|
|
15
17
|
: await getInterface(interfaceId);
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
const payload = {
|
|
18
20
|
name: api.title,
|
|
19
21
|
path: api.path,
|
|
20
22
|
method: api.method,
|
|
@@ -25,10 +27,20 @@ export const tools = [
|
|
|
25
27
|
},
|
|
26
28
|
response: api.res_body
|
|
27
29
|
};
|
|
30
|
+
|
|
31
|
+
// ★ 关键:返回 MCP 标准的 CallToolResult
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: "text",
|
|
36
|
+
text: JSON.stringify(payload) // 先用 text,保证协议合法
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
};
|
|
28
40
|
}
|
|
29
41
|
},
|
|
30
42
|
{
|
|
31
|
-
name: "
|
|
43
|
+
name: "yapi_get_api_context_by_path",
|
|
32
44
|
description: "Get API context by path within a YAPI project",
|
|
33
45
|
inputSchema: z.object({
|
|
34
46
|
projectId: z.number(),
|
|
@@ -40,7 +52,7 @@ export const tools = [
|
|
|
40
52
|
) => {
|
|
41
53
|
const api = await getInterfaceByPath(projectId, path, method);
|
|
42
54
|
|
|
43
|
-
|
|
55
|
+
const payload = {
|
|
44
56
|
name: api.title,
|
|
45
57
|
path: api.path,
|
|
46
58
|
method: api.method,
|
|
@@ -51,6 +63,15 @@ export const tools = [
|
|
|
51
63
|
},
|
|
52
64
|
response: api.res_body
|
|
53
65
|
};
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: JSON.stringify(payload)
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
};
|
|
54
75
|
}
|
|
55
76
|
}
|
|
56
|
-
];
|
|
77
|
+
];
|