anttask-mcp-test 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 +77 -0
- package/content/available-skills.md +70 -0
- package/content/user-guide.md +175 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/skills.d.ts +10 -0
- package/dist/data/skills.d.ts.map +1 -0
- package/dist/data/skills.js +26 -0
- package/dist/data/skills.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +10 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +53 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/anttest.d.ts +145 -0
- package/dist/schemas/anttest.d.ts.map +1 -0
- package/dist/schemas/anttest.js +84 -0
- package/dist/schemas/anttest.js.map +1 -0
- package/dist/schemas/example.d.ts +22 -0
- package/dist/schemas/example.d.ts.map +1 -0
- package/dist/schemas/example.js +25 -0
- package/dist/schemas/example.js.map +1 -0
- package/dist/schemas/humans.d.ts +19 -0
- package/dist/schemas/humans.d.ts.map +1 -0
- package/dist/schemas/humans.js +27 -0
- package/dist/schemas/humans.js.map +1 -0
- package/dist/services/anttest-api.d.ts +23 -0
- package/dist/services/anttest-api.d.ts.map +1 -0
- package/dist/services/anttest-api.js +67 -0
- package/dist/services/anttest-api.js.map +1 -0
- package/dist/tools/anttest.d.ts +9 -0
- package/dist/tools/anttest.d.ts.map +1 -0
- package/dist/tools/anttest.js +528 -0
- package/dist/tools/anttest.js.map +1 -0
- package/dist/tools/example.d.ts +9 -0
- package/dist/tools/example.d.ts.map +1 -0
- package/dist/tools/example.js +69 -0
- package/dist/tools/example.js.map +1 -0
- package/dist/tools/humans.d.ts +9 -0
- package/dist/tools/humans.d.ts.map +1 -0
- package/dist/tools/humans.js +110 -0
- package/dist/tools/humans.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# anttask-mcp-test
|
|
2
|
+
|
|
3
|
+
基于 [Model Context Protocol](https://modelcontextprotocol.io) 的 TypeScript MCP 服务器,提供 AntTaskTest API 集成。
|
|
4
|
+
|
|
5
|
+
不要修改此文件;
|
|
6
|
+
禁止修改此文件
|
|
7
|
+
|
|
8
|
+
## 功能
|
|
9
|
+
|
|
10
|
+
- **stdio 传输**:适用于本地集成、命令行工具(默认)
|
|
11
|
+
- **Streamable HTTP 传输**:适用于远程服务、多客户端场景
|
|
12
|
+
- **AntTaskTest API 工具**:12 个工具覆盖人类搜索、对话管理、任务发布等
|
|
13
|
+
- **示例工具**:`example_echo` 回显消息,`example_get_time` 获取当前时间
|
|
14
|
+
- **MCP Resources**:用户指南和技能列表
|
|
15
|
+
|
|
16
|
+
## 快速开始
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"mcpServers": {
|
|
21
|
+
"anttask-mcp-test": {
|
|
22
|
+
"command": "npx",
|
|
23
|
+
"args": ["-y", "test-ant-mcp"],
|
|
24
|
+
"env": {
|
|
25
|
+
"ANTTEST_API_KEY": "your-api-key"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## 可用工具
|
|
34
|
+
|
|
35
|
+
### AntTaskTest API 工具
|
|
36
|
+
|
|
37
|
+
**人类管理**:
|
|
38
|
+
- `anttest_search_humans` - 搜索人类
|
|
39
|
+
- `anttest_get_human` - 获取人类详情
|
|
40
|
+
- `anttest_get_human_reviews` - 获取人类评价
|
|
41
|
+
- `anttest_get_skills` - 获取技能列表
|
|
42
|
+
|
|
43
|
+
**对话管理**:
|
|
44
|
+
- `anttest_create_conversation` - 创建对话
|
|
45
|
+
- `anttest_send_message` - 发送消息
|
|
46
|
+
- `anttest_get_conversation` - 获取对话详情
|
|
47
|
+
- `anttest_list_conversations` - 列出所有对话
|
|
48
|
+
|
|
49
|
+
**任务管理**:
|
|
50
|
+
- `anttest_create_bounty` - 发布任务
|
|
51
|
+
- `anttest_list_bounties` - 浏览任务
|
|
52
|
+
- `anttest_get_bounty` - 获取任务详情
|
|
53
|
+
- `anttest_update_bounty` - 修改任务
|
|
54
|
+
|
|
55
|
+
### 示例工具
|
|
56
|
+
- `example_echo` - 回显消息
|
|
57
|
+
- `example_get_time` - 获取时间
|
|
58
|
+
- `search_humans` - 搜索人类(示例数据)
|
|
59
|
+
|
|
60
|
+
## 环境变量
|
|
61
|
+
|
|
62
|
+
| 变量 | 必填 | 默认值 | 说明 |
|
|
63
|
+
|------|------|--------|------|
|
|
64
|
+
| `ANTTEST_API_KEY` | ✅ | `demo-api-key` | AntTaskTest API 密钥 |
|
|
65
|
+
|
|
66
|
+
## 依赖
|
|
67
|
+
|
|
68
|
+
- Node.js >= 18
|
|
69
|
+
- `@modelcontextprotocol/sdk` ^1.26.0
|
|
70
|
+
- `zod` ^3.23.8
|
|
71
|
+
- `axios` ^1.7.9
|
|
72
|
+
- `express` ^4.21.0(仅 HTTP 模式)
|
|
73
|
+
|
|
74
|
+
## 参考
|
|
75
|
+
|
|
76
|
+
- [MCP 规范](https://modelcontextprotocol.io/specification)
|
|
77
|
+
- [TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# 可用的人类技能列表
|
|
2
|
+
|
|
3
|
+
以下技能来自 AntTaskTest 平台,可通过 `anttest_search_humans` 和 `anttest_get_skills` 工具进行搜索和查询。
|
|
4
|
+
|
|
5
|
+
> 💡 使用 `anttest_get_skills` 工具可获取最新的技能列表。
|
|
6
|
+
|
|
7
|
+
## In-Person Meetings
|
|
8
|
+
- **描述**: 线下会议支持,包括商务会议、客户拜访、高管对接等
|
|
9
|
+
- **搜索关键字**: `In-Person Meetings` 或 `Meetings`
|
|
10
|
+
- **适用场景**: 需要人类代表出席线下活动、会议、产品演示等
|
|
11
|
+
|
|
12
|
+
## Jars
|
|
13
|
+
- **描述**: 罐子相关任务,如罐装、包装、运输等
|
|
14
|
+
- **搜索关键字**: `Jars`
|
|
15
|
+
- **适用场景**: 手工制作、食品包装、物品整理等需要处理罐子的任务
|
|
16
|
+
|
|
17
|
+
## Packages
|
|
18
|
+
- **描述**: 包裹处理,包括收发、运送、整理等
|
|
19
|
+
- **搜索关键字**: `Packages`
|
|
20
|
+
- **适用场景**: 快递代收代发、包裹配送、仓库整理等
|
|
21
|
+
|
|
22
|
+
## Errands
|
|
23
|
+
- **描述**: 跑腿服务,包括购物、取件、送件等日常事务
|
|
24
|
+
- **搜索关键字**: `Errands`
|
|
25
|
+
- **适用场景**: 代购、代办、杂务处理等需要人类执行的琐碎任务
|
|
26
|
+
|
|
27
|
+
## Research
|
|
28
|
+
- **描述**: 调研工作,包括市场调研、信息收集、数据分析等
|
|
29
|
+
- **搜索关键字**: `Research`
|
|
30
|
+
- **适用场景**: 竞品分析、用户访谈、实地调查等需要人类洞察的研究工作
|
|
31
|
+
|
|
32
|
+
## Food Tasting
|
|
33
|
+
- **描述**: 食品品鉴,包括试吃、评价、反馈等
|
|
34
|
+
- **搜索关键字**: `Food Tasting`
|
|
35
|
+
- **适用场景**: 餐厅试吃、产品测试、美食评测等
|
|
36
|
+
|
|
37
|
+
## Photography
|
|
38
|
+
- **描述**: 摄影服务,包括拍照、摄像、图片编辑等
|
|
39
|
+
- **搜索关键字**: `Photography`
|
|
40
|
+
- **适用场景**: 活动拍摄、产品摄影、实地取景等
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 使用示例
|
|
45
|
+
|
|
46
|
+
### 搜索具备 "Meetings" 技能的人类
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"tool": "anttest_search_humans",
|
|
51
|
+
"arguments": {
|
|
52
|
+
"skill": "Meetings",
|
|
53
|
+
"maxRate": 50,
|
|
54
|
+
"limit": 5
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 获取所有可用技能
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"tool": "anttest_get_skills",
|
|
64
|
+
"arguments": {}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
**注意**: 以上技能列表基于 AntTaskTest API。实际可用技能可能随平台更新而变化,建议使用 `anttest_get_skills` 工具获取最新列表。
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# test-ant-mcp 用户使用指南
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
test-ant-mcp 是一个 MCP (Model Context Protocol) 服务器,集成 AntTaskTest API,提供人类资源搜索、对话管理、任务发布等能力,可在 Cursor、Claude 等 AI 工具中通过 MCP 协议调用。
|
|
5
|
+
|
|
6
|
+
**核心功能**:
|
|
7
|
+
- 🔍 搜索和管理人类资源
|
|
8
|
+
- 💬 创建和管理对话
|
|
9
|
+
- 📋 发布和管理任务
|
|
10
|
+
- 📚 提供用户指南和技能列表资源
|
|
11
|
+
|
|
12
|
+
## 可用工具
|
|
13
|
+
|
|
14
|
+
### AntTaskTest API 工具
|
|
15
|
+
|
|
16
|
+
#### 人类管理
|
|
17
|
+
- **anttest_search_humans**: 搜索人类资源
|
|
18
|
+
- **anttest_get_human**: 获取人类详细资料
|
|
19
|
+
- **anttest_get_human_reviews**: 获取人类评价
|
|
20
|
+
- **anttest_get_skills**: 获取所有可用技能
|
|
21
|
+
|
|
22
|
+
#### 对话管理
|
|
23
|
+
- **anttest_create_conversation**: 创建新对话
|
|
24
|
+
- **anttest_send_message**: 发送消息
|
|
25
|
+
- **anttest_get_conversation**: 获取对话详情
|
|
26
|
+
- **anttest_list_conversations**: 列出所有对话
|
|
27
|
+
|
|
28
|
+
#### 任务管理
|
|
29
|
+
- **anttest_create_bounty**: 发布新任务
|
|
30
|
+
- **anttest_list_bounties**: 浏览任务列表
|
|
31
|
+
- **anttest_get_bounty**: 获取任务详情
|
|
32
|
+
- **anttest_update_bounty**: 修改任务状态
|
|
33
|
+
|
|
34
|
+
### 示例工具
|
|
35
|
+
|
|
36
|
+
#### search_humans
|
|
37
|
+
按技能和费率搜索人员(示例数据)。
|
|
38
|
+
|
|
39
|
+
**参数:**
|
|
40
|
+
- `skill` (必填): 技能名称,如 "In-Person Meetings"
|
|
41
|
+
- `maxRate` (可选): 最大小时费率(元)
|
|
42
|
+
- `limit` (可选): 返回数量上限,默认 10
|
|
43
|
+
|
|
44
|
+
#### example_echo
|
|
45
|
+
回显用户输入的消息,用于测试 MCP 连接是否正常。
|
|
46
|
+
|
|
47
|
+
#### example_get_time
|
|
48
|
+
返回服务器当前 UTC 时间,用于验证服务可用性。
|
|
49
|
+
|
|
50
|
+
## 环境变量
|
|
51
|
+
|
|
52
|
+
| 变量 | 必填 | 默认值 | 说明 |
|
|
53
|
+
|------|------|--------|------|
|
|
54
|
+
| `ANTTEST_API_KEY` | ✅ | `demo-api-key` | AntTaskTest API 密钥 |
|
|
55
|
+
| `ANTTEST_API_URL` | ❌ | `https://anttest-next-backend.vercel.app/api` | API 基础 URL |
|
|
56
|
+
| `TRANSPORT` | ❌ | `stdio` | 传输方式 (`stdio` 或 `http`) |
|
|
57
|
+
| `PORT` | ❌ | `3000` | HTTP 模式端口 |
|
|
58
|
+
|
|
59
|
+
## 传输方式
|
|
60
|
+
|
|
61
|
+
- **stdio**(默认): 本地集成,由 Cursor 等客户端以子进程方式启动
|
|
62
|
+
- **HTTP**: 设置环境变量 `TRANSPORT=http`,服务监听 3000 端口
|
|
63
|
+
|
|
64
|
+
## 配置示例
|
|
65
|
+
|
|
66
|
+
在 Cursor 的 `.cursor/mcp.json` 中:
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"test-ant-mcp": {
|
|
71
|
+
"command": "node",
|
|
72
|
+
"args": ["dist/index.js"],
|
|
73
|
+
"cwd": "${workspaceFolder}"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
或使用 npx(推荐):
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"test-ant-mcp": {
|
|
84
|
+
"command": "npx",
|
|
85
|
+
"args": ["-y", "test-ant-mcp"],
|
|
86
|
+
"env": {
|
|
87
|
+
"ANTTEST_API_KEY": "your-api-key-here"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 使用示例
|
|
95
|
+
|
|
96
|
+
### 1. 搜索人类资源
|
|
97
|
+
|
|
98
|
+
查找具备会议技能、费率不超过 $50/小时的人类:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"tool": "anttest_search_humans",
|
|
103
|
+
"arguments": {
|
|
104
|
+
"skill": "Meetings",
|
|
105
|
+
"maxRate": 50,
|
|
106
|
+
"limit": 5
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 2. 创建对话
|
|
112
|
+
|
|
113
|
+
与人类开始新对话:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"tool": "anttest_create_conversation",
|
|
118
|
+
"arguments": {
|
|
119
|
+
"humanId": "human_test_001",
|
|
120
|
+
"agentType": "my-agent",
|
|
121
|
+
"subject": "Need help with package",
|
|
122
|
+
"message": "Hi! Can you help me pick up a package tomorrow?"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 3. 发布任务
|
|
128
|
+
|
|
129
|
+
创建新任务供人类申请:
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"tool": "anttest_create_bounty",
|
|
134
|
+
"arguments": {
|
|
135
|
+
"agentType": "my-agent",
|
|
136
|
+
"title": "Attend Product Demo",
|
|
137
|
+
"description": "Represent our company at the 2pm product demo",
|
|
138
|
+
"estimatedHours": 2,
|
|
139
|
+
"priceType": "fixed",
|
|
140
|
+
"price": 100,
|
|
141
|
+
"requiredSkills": ["Meetings", "Note Taking"]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 4. 查看可用技能
|
|
147
|
+
|
|
148
|
+
获取平台所有技能列表:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"tool": "anttest_get_skills",
|
|
153
|
+
"arguments": {}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 常见问题
|
|
158
|
+
|
|
159
|
+
### Q: 如何设置 API Key?
|
|
160
|
+
A: 在配置 MCP 服务器时,在 `env` 字段中设置 `ANTTEST_API_KEY` 环境变量。如使用默认的 `demo-api-key` 可能无法访问完整数据。
|
|
161
|
+
|
|
162
|
+
### Q: 支持哪些技能?
|
|
163
|
+
A: 使用 `anttest_get_skills` 工具获取最新技能列表,或查看 `test-ant-mcp://available-skills` 资源。
|
|
164
|
+
|
|
165
|
+
### Q: 如何测试连接?
|
|
166
|
+
A: 使用 `example_echo` 工具发送测试消息,或使用 `example_get_time` 验证服务是否正常运行。
|
|
167
|
+
|
|
168
|
+
## 资源访问
|
|
169
|
+
|
|
170
|
+
服务器提供以下 MCP Resources:
|
|
171
|
+
|
|
172
|
+
- **test-ant-mcp://user-guide** - 本用户指南
|
|
173
|
+
- **test-ant-mcp://available-skills** - 可用技能列表
|
|
174
|
+
|
|
175
|
+
在支持 MCP 的 AI 工具中,这些资源可自动被读取并用于提供上下文信息。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,aAAa;AACb,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,aAAa;AACb,eAAO,MAAM,SAAS,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iBAAiB;AACjB,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAErC,aAAa;AACb,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,aAAa;AACb,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/data/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAqBvC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 可用的人类技能数据
|
|
3
|
+
*/
|
|
4
|
+
export const AVAILABLE_SKILLS = [
|
|
5
|
+
{
|
|
6
|
+
name: "In-Person Meetings",
|
|
7
|
+
description: "线下会议支持,包括商务会议、客户拜访、高管对接等",
|
|
8
|
+
keyword: "In-Person Meetings",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "Remote Support",
|
|
12
|
+
description: "远程技术支持、在线会议、远程协作",
|
|
13
|
+
keyword: "Remote Support",
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "Data Analysis",
|
|
17
|
+
description: "数据分析、报表制作、数据可视化",
|
|
18
|
+
keyword: "Data Analysis",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "Project Management",
|
|
22
|
+
description: "项目管理、进度跟踪、资源协调",
|
|
23
|
+
keyword: "Project Management",
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/data/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,oBAAoB;KAC9B;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,gBAAgB;KAC1B;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,eAAe;KACzB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,gBAAgB;QAC7B,OAAO,EAAE,oBAAoB;KAC9B;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server 入口
|
|
4
|
+
*
|
|
5
|
+
* 支持两种传输方式:
|
|
6
|
+
* - stdio: 本地集成,通过环境变量 TRANSPORT=stdio(默认)
|
|
7
|
+
* - http: 远程服务,通过环境变量 TRANSPORT=http
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
11
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
13
|
+
import { registerExampleTools } from "./tools/example.js";
|
|
14
|
+
import { registerHumansTools } from "./tools/humans.js";
|
|
15
|
+
import { registerAntTestTools } from "./tools/anttest.js";
|
|
16
|
+
import { registerResources } from "./resources/index.js";
|
|
17
|
+
function createServer() {
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: "anttask-mcp-test",
|
|
20
|
+
version: "1.0.0",
|
|
21
|
+
});
|
|
22
|
+
registerExampleTools(server);
|
|
23
|
+
registerHumansTools(server);
|
|
24
|
+
registerAntTestTools(server);
|
|
25
|
+
registerResources(server);
|
|
26
|
+
return server;
|
|
27
|
+
}
|
|
28
|
+
async function runStdio() {
|
|
29
|
+
const server = createServer();
|
|
30
|
+
const transport = new StdioServerTransport();
|
|
31
|
+
await server.connect(transport);
|
|
32
|
+
console.error("MCP 服务已启动 (stdio)");
|
|
33
|
+
}
|
|
34
|
+
async function runHttp() {
|
|
35
|
+
const app = createMcpExpressApp();
|
|
36
|
+
app.post("/mcp", async (req, res) => {
|
|
37
|
+
const server = createServer();
|
|
38
|
+
const transport = new StreamableHTTPServerTransport({
|
|
39
|
+
sessionIdGenerator: undefined,
|
|
40
|
+
enableJsonResponse: true,
|
|
41
|
+
});
|
|
42
|
+
res.on("close", () => {
|
|
43
|
+
transport.close();
|
|
44
|
+
server.close();
|
|
45
|
+
});
|
|
46
|
+
await server.connect(transport);
|
|
47
|
+
await transport.handleRequest(req, res, req.body);
|
|
48
|
+
});
|
|
49
|
+
const port = parseInt(process.env.PORT ?? "3000", 10);
|
|
50
|
+
app.listen(port, () => {
|
|
51
|
+
console.error(`MCP 服务已启动 http://localhost:${port}/mcp`);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const transport = process.env.TRANSPORT ?? "stdio";
|
|
55
|
+
if (transport === "http") {
|
|
56
|
+
runHttp().catch((err) => {
|
|
57
|
+
console.error("服务启动失败:", err);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
runStdio().catch((err) => {
|
|
63
|
+
console.error("服务启动失败:", err);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resources 实现
|
|
3
|
+
* 从 content/*.md 文件读取内容
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
/**
|
|
7
|
+
* 注册 MCP Resources
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerResources(server: McpServer): void;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsCzD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Resources 实现
|
|
3
|
+
* 从 content/*.md 文件读取内容
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const CONTENT_DIR = join(__dirname, "..", "..", "content");
|
|
10
|
+
const USER_GUIDE_URI = "test-ant-mcp://user-guide";
|
|
11
|
+
const AVAILABLE_SKILLS_URI = "test-ant-mcp://available-skills";
|
|
12
|
+
async function loadMarkdown(filename) {
|
|
13
|
+
const filepath = join(CONTENT_DIR, filename);
|
|
14
|
+
try {
|
|
15
|
+
return await readFile(filepath, "utf-8");
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
19
|
+
return `# 加载失败\n\n无法读取文件 \`${filename}\`: ${msg}`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 注册 MCP Resources
|
|
24
|
+
*/
|
|
25
|
+
export function registerResources(server) {
|
|
26
|
+
server.registerResource("user-guide", USER_GUIDE_URI, {
|
|
27
|
+
title: "用户使用指南",
|
|
28
|
+
description: "test-ant-mcp 的完整使用说明,包括工具介绍、参数说明和配置方法",
|
|
29
|
+
mimeType: "text/markdown",
|
|
30
|
+
}, async () => ({
|
|
31
|
+
contents: [
|
|
32
|
+
{
|
|
33
|
+
uri: USER_GUIDE_URI,
|
|
34
|
+
mimeType: "text/markdown",
|
|
35
|
+
text: await loadMarkdown("user-guide.md"),
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
}));
|
|
39
|
+
server.registerResource("available-skills", AVAILABLE_SKILLS_URI, {
|
|
40
|
+
title: "可用的人类技能",
|
|
41
|
+
description: "系统支持的技能列表,用于 search_humans 的 skill 参数",
|
|
42
|
+
mimeType: "text/markdown",
|
|
43
|
+
}, async () => ({
|
|
44
|
+
contents: [
|
|
45
|
+
{
|
|
46
|
+
uri: AVAILABLE_SKILLS_URI,
|
|
47
|
+
mimeType: "text/markdown",
|
|
48
|
+
text: await loadMarkdown("available-skills.md"),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAE3D,MAAM,cAAc,GAAG,2BAA2B,CAAC;AACnD,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,sBAAsB,QAAQ,OAAO,GAAG,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,cAAc,EACd;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,cAAc;gBACnB,QAAQ,EAAE,eAAe;gBACzB,IAAI,EAAE,MAAM,YAAY,CAAC,eAAe,CAAC;aAC1C;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,oBAAoB,EACpB;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,oBAAoB;gBACzB,QAAQ,EAAE,eAAe;gBACzB,IAAI,EAAE,MAAM,YAAY,CAAC,qBAAqB,CAAC;aAChD;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|