phinix_experience 0.0.1
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/.claude/settings.local.json +9 -0
- package/README.md +149 -0
- package/debug-client.js +55 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +60 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/searchExperience.d.ts +20 -0
- package/dist/tools/searchExperience.d.ts.map +1 -0
- package/dist/tools/searchExperience.js +133 -0
- package/dist/tools/searchExperience.js.map +1 -0
- package/mcp-config.json +10 -0
- package/package.json +44 -0
- package/quick-test.js +61 -0
- package/remote-install.sh +572 -0
- package/src/index.js +4 -0
- package/src/server.js +85 -0
- package/src/tools/index.js +7 -0
- package/src/tools/searchExperience.js +148 -0
- package/test-mcp.sh +13 -0
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# phinix_experience MCP 服务器
|
|
2
|
+
|
|
3
|
+
phinix_experience 是一个基于 Model Context Protocol (MCP) 的服务器,为 AI 模型提供项目开发经验检索功能,帮助开发者在编码前查阅相关踩坑经验,避免重复犯错。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
### 🔍 经验列表检索 (`search_experience_list`)
|
|
8
|
+
|
|
9
|
+
- 根据关键词搜索项目开发经验库
|
|
10
|
+
- 返回匹配的经验列表(包含 id 和概述)
|
|
11
|
+
- 支持自然语言描述查询
|
|
12
|
+
|
|
13
|
+
### 📄 经验详情获取 (`search_experience_detail`)
|
|
14
|
+
|
|
15
|
+
- 根据经验 ID 获取完整的经验详情
|
|
16
|
+
- 包含详细的问题描述、解决方案和注意事项
|
|
17
|
+
|
|
18
|
+
## 安装和使用
|
|
19
|
+
|
|
20
|
+
### 环境要求
|
|
21
|
+
|
|
22
|
+
- Node.js 18+
|
|
23
|
+
- npm 或 yarn
|
|
24
|
+
|
|
25
|
+
### 安装依赖
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 环境变量
|
|
32
|
+
|
|
33
|
+
| 变量名 | 必需 | 说明 |
|
|
34
|
+
| -------- | ---- | ------------------------- |
|
|
35
|
+
| `APP_ID` | 是 | RAG 应用 ID,用于经验检索 |
|
|
36
|
+
|
|
37
|
+
### 启动服务器
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm start
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 在 IDE 中配置 MCP
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"phinix_experience": {
|
|
49
|
+
"command": "node",
|
|
50
|
+
"args": ["src/index.js"],
|
|
51
|
+
"cwd": "/path/to/phinix_experience",
|
|
52
|
+
"env": {
|
|
53
|
+
"APP_ID": "your-app-id"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## MCP 工具说明
|
|
61
|
+
|
|
62
|
+
### 1. search_experience_list
|
|
63
|
+
|
|
64
|
+
编码前检索项目开发经验库,查找与当前任务相关的踩坑经验。
|
|
65
|
+
|
|
66
|
+
**参数:**
|
|
67
|
+
|
|
68
|
+
| 参数 | 类型 | 必需 | 说明 |
|
|
69
|
+
| ------- | ------ | ---- | ------------------------------ |
|
|
70
|
+
| `query` | string | 是 | 搜索查询词,描述当前任务或问题 |
|
|
71
|
+
|
|
72
|
+
**返回:**
|
|
73
|
+
|
|
74
|
+
匹配的经验列表,每条包含:
|
|
75
|
+
|
|
76
|
+
- `id`: 经验唯一 ID
|
|
77
|
+
- `text`: 经验概述
|
|
78
|
+
|
|
79
|
+
**示例:**
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{"query": "scss 样式"}
|
|
83
|
+
{"query": "表格列配置"}
|
|
84
|
+
{"query": "接口请求错误处理"}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 2. search_experience_detail
|
|
88
|
+
|
|
89
|
+
获取某条经验的完整详情。
|
|
90
|
+
|
|
91
|
+
**参数:**
|
|
92
|
+
|
|
93
|
+
| 参数 | 类型 | 必需 | 说明 |
|
|
94
|
+
| ---- | ------ | ---- | --------------------------------------------- |
|
|
95
|
+
| `id` | number | 是 | 经验唯一 ID(从 search_experience_list 获取) |
|
|
96
|
+
|
|
97
|
+
**返回:**
|
|
98
|
+
|
|
99
|
+
经验的完整详情内容。
|
|
100
|
+
|
|
101
|
+
**示例:**
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{ "id": 123 }
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 推荐使用流程
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
search_experience_list(query="...") → 获取经验列表 → search_experience_detail(id=xxx) → 获取详情
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 项目结构
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
src/
|
|
117
|
+
├── index.js # 入口文件
|
|
118
|
+
├── server.js # MCP 服务器核心,注册工具
|
|
119
|
+
├── config.js # 埋点统计配置
|
|
120
|
+
├── analytics/ # 埋点统计模块
|
|
121
|
+
│ ├── index.ts
|
|
122
|
+
│ ├── reporter.ts
|
|
123
|
+
│ ├── tracker.ts
|
|
124
|
+
│ └── types.ts
|
|
125
|
+
└── tools/
|
|
126
|
+
├── index.js # 工具导出入口
|
|
127
|
+
└── searchExperience.js # 经验检索工具实现
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 技术栈
|
|
131
|
+
|
|
132
|
+
- **MCP SDK**: @modelcontextprotocol/sdk
|
|
133
|
+
- **Schema 验证**: Zod
|
|
134
|
+
- **Transport**: STDIO(标准输入输出)
|
|
135
|
+
- **运行时**: tsx
|
|
136
|
+
|
|
137
|
+
## 开发
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# 开发模式(监听文件变化自动重启)
|
|
141
|
+
npm run dev
|
|
142
|
+
|
|
143
|
+
# 使用 MCP Inspector 调试
|
|
144
|
+
npm run serve
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 许可证
|
|
148
|
+
|
|
149
|
+
MIT License
|
package/debug-client.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
4
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
5
|
+
|
|
6
|
+
async function debugMcpServer() {
|
|
7
|
+
const transport = new StdioClientTransport({
|
|
8
|
+
command: "node",
|
|
9
|
+
args: ["src/index.js"],
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const client = new Client(
|
|
13
|
+
{
|
|
14
|
+
name: "debug-client",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
capabilities: {},
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
console.log("🔌 连接到MCP服务器...");
|
|
24
|
+
await client.connect(transport);
|
|
25
|
+
console.log("✅ 连接成功!");
|
|
26
|
+
|
|
27
|
+
// 1. 获取工具列表
|
|
28
|
+
console.log("\n📋 获取工具列表:");
|
|
29
|
+
const tools = await client.listTools();
|
|
30
|
+
console.log(JSON.stringify(tools, null, 2));
|
|
31
|
+
|
|
32
|
+
// 2. 测试经验检索
|
|
33
|
+
console.log("\n🔍 测试 search_experience_list:");
|
|
34
|
+
const result1 = await client.callTool({
|
|
35
|
+
name: "search_experience_list",
|
|
36
|
+
arguments: { query: "样式问题" },
|
|
37
|
+
});
|
|
38
|
+
console.log("响应:", JSON.stringify(result1, null, 2));
|
|
39
|
+
|
|
40
|
+
// 3. 测试经验详情(使用示例 ID)
|
|
41
|
+
console.log("\n📄 测试 search_experience_detail:");
|
|
42
|
+
const result2 = await client.callTool({
|
|
43
|
+
name: "search_experience_detail",
|
|
44
|
+
arguments: { id: 1 },
|
|
45
|
+
});
|
|
46
|
+
console.log("响应:", JSON.stringify(result2, null, 2));
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error("❌ 调试失败:", error);
|
|
49
|
+
} finally {
|
|
50
|
+
await client.close();
|
|
51
|
+
console.log("\n🔌 连接已关闭");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
debugMcpServer().catch(console.error);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";AAEA,kBAAkB;AAClB,OAAO,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.js"],"names":[],"mappings":""}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
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 { searchExperienceListSchema, searchExperienceList, searchExperienceDetailSchema, searchExperienceDetail, } from "./tools/index.js";
|
|
5
|
+
// 使用功能更完整的McpServer
|
|
6
|
+
const server = new McpServer({
|
|
7
|
+
name: "phinix_experience",
|
|
8
|
+
version: "0.0.1",
|
|
9
|
+
description: `phinix_experience MCP服务器 - 开发经验检索助手
|
|
10
|
+
|
|
11
|
+
🎯 核心功能:
|
|
12
|
+
- 检索项目开发经验库,避免重复踩坑
|
|
13
|
+
- 获取经验详情
|
|
14
|
+
|
|
15
|
+
📊 推荐的工具调用流程:
|
|
16
|
+
1. search_experience_list(搜索相关经验)
|
|
17
|
+
2. search_experience_detail(获取经验详情)`,
|
|
18
|
+
}, {
|
|
19
|
+
capabilities: {
|
|
20
|
+
tools: {},
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
server.tool("search_experience_list", `【编码前必查】检索项目开发经验库
|
|
24
|
+
|
|
25
|
+
### When to Use:
|
|
26
|
+
- 开始新增或修改代码前,检索与任务相关的踩坑经验,避免重复犯错
|
|
27
|
+
|
|
28
|
+
### Input:
|
|
29
|
+
- query: 搜索查询词,描述当前任务或问题
|
|
30
|
+
|
|
31
|
+
### Output:
|
|
32
|
+
返回匹配的经验列表,每条包含:
|
|
33
|
+
- id: 经验唯一ID(可用于调用 search_experience_detail 获取详情)
|
|
34
|
+
- text: 经验概述
|
|
35
|
+
|
|
36
|
+
### Examples:
|
|
37
|
+
- search_experience_list(query="scss 样式")
|
|
38
|
+
- search_experience_list(query="AutoTable 表格列配置")`, searchExperienceListSchema, searchExperienceList);
|
|
39
|
+
server.tool("search_experience_detail", `获取经验详情
|
|
40
|
+
|
|
41
|
+
### When to Use:
|
|
42
|
+
- 在 search_experience_list 返回结果后,根据 id 获取某条经验的完整详情
|
|
43
|
+
|
|
44
|
+
### Input:
|
|
45
|
+
- id: 经验的唯一ID(number类型,从 search_experience_list 结果中获取)
|
|
46
|
+
|
|
47
|
+
### Output:
|
|
48
|
+
返回经验的完整详情`, searchExperienceDetailSchema, searchExperienceDetail);
|
|
49
|
+
// 启动服务器
|
|
50
|
+
async function main() {
|
|
51
|
+
const transport = new StdioServerTransport();
|
|
52
|
+
await server.connect(transport);
|
|
53
|
+
console.error("🚀 phinix_experience MCP Server started on stdio");
|
|
54
|
+
console.error("📋 Available tools: search_experience_list, search_experience_detail");
|
|
55
|
+
}
|
|
56
|
+
main().catch((error) => {
|
|
57
|
+
console.error("Failed to start MCPServer:", error);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.js"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE;;;;;;;;oCAQmB;CACjC,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB;;;;;;;;;;;;;;;kDAegD,EAChD,0BAA0B,EAC1B,oBAAoB,CACrB,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B;;;;;;;;;UASQ,EACR,4BAA4B,EAC5B,sBAAsB,CACvB,CAAC;AAEF,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CACX,sEAAsE,CACvE,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.js"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function searchExperienceList(params: any): Promise<{
|
|
2
|
+
content: {
|
|
3
|
+
type: string;
|
|
4
|
+
text: any;
|
|
5
|
+
}[];
|
|
6
|
+
}>;
|
|
7
|
+
export function searchExperienceDetail(params: any): Promise<{
|
|
8
|
+
content: {
|
|
9
|
+
type: string;
|
|
10
|
+
text: any;
|
|
11
|
+
}[];
|
|
12
|
+
}>;
|
|
13
|
+
export namespace searchExperienceListSchema {
|
|
14
|
+
let query: z.ZodString;
|
|
15
|
+
}
|
|
16
|
+
export namespace searchExperienceDetailSchema {
|
|
17
|
+
let id: z.ZodNumber;
|
|
18
|
+
}
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
//# sourceMappingURL=searchExperience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchExperience.d.ts","sourceRoot":"","sources":["../../src/tools/searchExperience.js"],"names":[],"mappings":"AAaA;;;;;GA6EC;AAMD;;;;;GAmDC;;;;;;;kBAnJiB,KAAK"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// 跳过内网 TLS 证书验证
|
|
3
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
|
4
|
+
const API_URL = "https://giti.lydaas.com/api/ai/exp/rag";
|
|
5
|
+
const APP_ID = process.env.APP_ID;
|
|
6
|
+
const DETAIL_BASE_URL = "https://giti.lydaas.com/api/ai/exp/detail";
|
|
7
|
+
export const searchExperienceListSchema = {
|
|
8
|
+
query: z.string().describe("搜索查询词,描述当前任务或问题"),
|
|
9
|
+
};
|
|
10
|
+
export async function searchExperienceList(params) {
|
|
11
|
+
try {
|
|
12
|
+
const { query } = params;
|
|
13
|
+
const response = await fetch(API_URL, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
appId: APP_ID,
|
|
20
|
+
query,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
|
|
25
|
+
}
|
|
26
|
+
const data = await response.json();
|
|
27
|
+
if (data.code !== 200 || !data.data) {
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: data.message || `未找到与「${query}」相关的经验记录。`,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const text = data.data.output?.text;
|
|
38
|
+
let output = [];
|
|
39
|
+
try {
|
|
40
|
+
output = JSON.parse(text);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: `未找到与「${query}」相关的经验记录。`,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (!Array.isArray(output) || output.length === 0) {
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: `未找到与「${query}」相关的经验记录。`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
text: JSON.stringify(output),
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: `经验检索失败: ${error.message}`,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export const searchExperienceDetailSchema = {
|
|
83
|
+
id: z.number().describe("经验的唯一ID"),
|
|
84
|
+
};
|
|
85
|
+
export async function searchExperienceDetail(params) {
|
|
86
|
+
try {
|
|
87
|
+
const { id } = params;
|
|
88
|
+
const response = await fetch(`${DETAIL_BASE_URL}/${id}`);
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
if (response.status === 404) {
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: "text",
|
|
95
|
+
text: `未找到 id=${id} 的经验`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
|
|
101
|
+
}
|
|
102
|
+
const result = await response.json();
|
|
103
|
+
if (result.code !== 200 || !result.data) {
|
|
104
|
+
return {
|
|
105
|
+
content: [
|
|
106
|
+
{
|
|
107
|
+
type: "text",
|
|
108
|
+
text: result.message || `未找到 id=${id} 的经验`,
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
content: [
|
|
115
|
+
{
|
|
116
|
+
type: "text",
|
|
117
|
+
text: JSON.stringify(result.data),
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: "text",
|
|
127
|
+
text: `经验详情获取失败: ${error.message}`,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=searchExperience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchExperience.js","sourceRoot":"","sources":["../../src/tools/searchExperience.js"],"names":[],"mappings":"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"}
|
package/mcp-config.json
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "phinix_experience",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "phinix_experience - A Model Context Protocol server for searching development experience",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"phinix_experience": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "tsx src/index.js",
|
|
13
|
+
"dev": "tsx --watch src/index.js",
|
|
14
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"serve": "npx @modelcontextprotocol/inspector node dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"model-context-protocol",
|
|
21
|
+
"experience-search",
|
|
22
|
+
"development-experience",
|
|
23
|
+
"analytics"
|
|
24
|
+
],
|
|
25
|
+
"author": "Dataphin Team",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.9.0",
|
|
29
|
+
"tsx": "^4.20.6",
|
|
30
|
+
"typescript": "^5.9.3",
|
|
31
|
+
"zod": "^3.22.4"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/express": "^5.0.3",
|
|
35
|
+
"@types/node": "^20.0.0"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git@gitlab.alibaba-inc.com:nel/phinpilot.git"
|
|
43
|
+
}
|
|
44
|
+
}
|
package/quick-test.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
4
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
5
|
+
|
|
6
|
+
async function quickTest() {
|
|
7
|
+
const transport = new StdioClientTransport({
|
|
8
|
+
command: "node",
|
|
9
|
+
args: ["src/index.js"],
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const client = new Client(
|
|
13
|
+
{
|
|
14
|
+
name: "quick-test",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
capabilities: {},
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
await client.connect(transport);
|
|
24
|
+
|
|
25
|
+
console.log("🧪 测试 phinix_experience MCP 工具集\n");
|
|
26
|
+
|
|
27
|
+
// 测试 search_experience_list
|
|
28
|
+
console.log("🔍 测试 search_experience_list:");
|
|
29
|
+
const listResult = await client.callTool({
|
|
30
|
+
name: "search_experience_list",
|
|
31
|
+
arguments: { query: "scss 样式" },
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (listResult.content && listResult.content[0]) {
|
|
35
|
+
console.log("✅ 经验检索成功");
|
|
36
|
+
console.log("返回内容:", listResult.content[0].text.substring(0, 200));
|
|
37
|
+
} else {
|
|
38
|
+
console.log("❌ 经验检索未返回结果");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 测试 search_experience_detail
|
|
42
|
+
console.log("\n📄 测试 search_experience_detail:");
|
|
43
|
+
const detailResult = await client.callTool({
|
|
44
|
+
name: "search_experience_detail",
|
|
45
|
+
arguments: { id: 1 },
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (detailResult.content && detailResult.content[0]) {
|
|
49
|
+
console.log("✅ 经验详情获取成功");
|
|
50
|
+
console.log("返回内容:", detailResult.content[0].text.substring(0, 200));
|
|
51
|
+
} else {
|
|
52
|
+
console.log("❌ 经验详情未返回结果");
|
|
53
|
+
}
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error("❌ 测试失败:", error);
|
|
56
|
+
} finally {
|
|
57
|
+
await client.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
quickTest().catch(console.error);
|