humanpages 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 +109 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +492 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Human Pages MCP Server
|
|
2
|
+
|
|
3
|
+
An MCP (Model Context Protocol) server that enables AI agents to search for and hire humans for real-world tasks via [humanpages.ai](https://humanpages.ai).
|
|
4
|
+
|
|
5
|
+
## Quick Install
|
|
6
|
+
|
|
7
|
+
### Claude Code
|
|
8
|
+
```bash
|
|
9
|
+
claude mcp add humanpages -- npx -y humanpages
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Claude Desktop
|
|
13
|
+
Add to your `claude_desktop_config.json`:
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"mcpServers": {
|
|
17
|
+
"humanpages": {
|
|
18
|
+
"command": "npx",
|
|
19
|
+
"args": ["-y", "humanpages"],
|
|
20
|
+
"env": {
|
|
21
|
+
"API_BASE_URL": "https://api.humanpages.ai"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### npm Global Install
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g humanpages
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Tools
|
|
34
|
+
|
|
35
|
+
### search_humans
|
|
36
|
+
Search for humans available for hire.
|
|
37
|
+
|
|
38
|
+
**Parameters:**
|
|
39
|
+
- `skill` (string, optional): Filter by skill (e.g., "photography", "driving")
|
|
40
|
+
- `equipment` (string, optional): Filter by equipment (e.g., "car", "drone")
|
|
41
|
+
- `language` (string, optional): Filter by language ISO code (e.g., "en", "es")
|
|
42
|
+
- `location` (string, optional): Filter by location name
|
|
43
|
+
- `lat`, `lng`, `radius` (number, optional): Radius search in km
|
|
44
|
+
- `max_rate` (number, optional): Maximum hourly rate in USDC
|
|
45
|
+
- `available_only` (boolean, default: true): Only show available humans
|
|
46
|
+
|
|
47
|
+
### get_human
|
|
48
|
+
Get detailed information about a specific human.
|
|
49
|
+
|
|
50
|
+
**Parameters:**
|
|
51
|
+
- `id` (string, required): The human's ID
|
|
52
|
+
|
|
53
|
+
### create_job_offer
|
|
54
|
+
Create a job offer for a human.
|
|
55
|
+
|
|
56
|
+
**Parameters:**
|
|
57
|
+
- `human_id` (string, required): The human's ID
|
|
58
|
+
- `title` (string, required): Job title
|
|
59
|
+
- `description` (string, required): What needs to be done
|
|
60
|
+
- `price_usdc` (number, required): Price in USDC
|
|
61
|
+
- `agent_id` (string, required): Your agent identifier
|
|
62
|
+
|
|
63
|
+
### get_job_status
|
|
64
|
+
Check the status of a job offer.
|
|
65
|
+
|
|
66
|
+
**Parameters:**
|
|
67
|
+
- `job_id` (string, required): The job ID
|
|
68
|
+
|
|
69
|
+
### mark_job_paid
|
|
70
|
+
Record payment for an accepted job.
|
|
71
|
+
|
|
72
|
+
**Parameters:**
|
|
73
|
+
- `job_id` (string, required): The job ID
|
|
74
|
+
- `payment_tx_hash` (string, required): Transaction hash
|
|
75
|
+
- `payment_network` (string, required): Blockchain network
|
|
76
|
+
- `payment_amount` (number, required): Amount paid in USDC
|
|
77
|
+
|
|
78
|
+
### leave_review
|
|
79
|
+
Leave a review for a completed job.
|
|
80
|
+
|
|
81
|
+
**Parameters:**
|
|
82
|
+
- `job_id` (string, required): The job ID
|
|
83
|
+
- `rating` (number, required): Rating 1-5
|
|
84
|
+
- `comment` (string, optional): Review comment
|
|
85
|
+
|
|
86
|
+
## Environment Variables
|
|
87
|
+
|
|
88
|
+
| Variable | Description | Default |
|
|
89
|
+
|----------|-------------|---------|
|
|
90
|
+
| `API_BASE_URL` | Base URL of the Human Pages API | `https://api.humanpages.ai` |
|
|
91
|
+
|
|
92
|
+
## Development
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm install
|
|
96
|
+
npm run dev # Development mode
|
|
97
|
+
npm run build # Build for production
|
|
98
|
+
npm start # Start production server
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Testing
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npx @modelcontextprotocol/inspector npx -y humanpages
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## License
|
|
108
|
+
|
|
109
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'dotenv/config';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
const API_BASE = process.env.API_BASE_URL || 'http://localhost:3001';
|
|
7
|
+
async function searchHumans(params) {
|
|
8
|
+
const query = new URLSearchParams();
|
|
9
|
+
if (params.skill)
|
|
10
|
+
query.set('skill', params.skill);
|
|
11
|
+
if (params.equipment)
|
|
12
|
+
query.set('equipment', params.equipment);
|
|
13
|
+
if (params.language)
|
|
14
|
+
query.set('language', params.language);
|
|
15
|
+
if (params.location)
|
|
16
|
+
query.set('location', params.location);
|
|
17
|
+
if (params.lat)
|
|
18
|
+
query.set('lat', params.lat.toString());
|
|
19
|
+
if (params.lng)
|
|
20
|
+
query.set('lng', params.lng.toString());
|
|
21
|
+
if (params.radius)
|
|
22
|
+
query.set('radius', params.radius.toString());
|
|
23
|
+
if (params.max_rate)
|
|
24
|
+
query.set('maxRate', params.max_rate.toString());
|
|
25
|
+
if (params.available_only)
|
|
26
|
+
query.set('available', 'true');
|
|
27
|
+
const res = await fetch(`${API_BASE}/api/humans/search?${query}`);
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
throw new Error(`API error: ${res.status}`);
|
|
30
|
+
}
|
|
31
|
+
return res.json();
|
|
32
|
+
}
|
|
33
|
+
async function getHuman(id) {
|
|
34
|
+
const res = await fetch(`${API_BASE}/api/humans/${id}`);
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
throw new Error(`Human not found: ${id}`);
|
|
37
|
+
}
|
|
38
|
+
return res.json();
|
|
39
|
+
}
|
|
40
|
+
const server = new Server({
|
|
41
|
+
name: 'humanpages',
|
|
42
|
+
version: '1.0.0',
|
|
43
|
+
}, {
|
|
44
|
+
capabilities: {
|
|
45
|
+
tools: {},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
49
|
+
tools: [
|
|
50
|
+
{
|
|
51
|
+
name: 'search_humans',
|
|
52
|
+
description: 'Search for humans available for hire. Supports filtering by skill, equipment, language, location (text or coordinates), and rate. Returns profiles with contact info, wallet addresses, and reputation stats.',
|
|
53
|
+
inputSchema: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
skill: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
description: 'Filter by skill tag (e.g., "photography", "driving", "notary")',
|
|
59
|
+
},
|
|
60
|
+
equipment: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Filter by equipment (e.g., "car", "drone", "camera")',
|
|
63
|
+
},
|
|
64
|
+
language: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
description: 'Filter by language ISO code (e.g., "en", "es", "zh")',
|
|
67
|
+
},
|
|
68
|
+
location: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Filter by location name (partial match, e.g., "San Francisco")',
|
|
71
|
+
},
|
|
72
|
+
lat: {
|
|
73
|
+
type: 'number',
|
|
74
|
+
description: 'Latitude for radius search (requires lng and radius)',
|
|
75
|
+
},
|
|
76
|
+
lng: {
|
|
77
|
+
type: 'number',
|
|
78
|
+
description: 'Longitude for radius search (requires lat and radius)',
|
|
79
|
+
},
|
|
80
|
+
radius: {
|
|
81
|
+
type: 'number',
|
|
82
|
+
description: 'Search radius in kilometers (requires lat and lng)',
|
|
83
|
+
},
|
|
84
|
+
max_rate: {
|
|
85
|
+
type: 'number',
|
|
86
|
+
description: 'Maximum hourly rate in USDC (filters by minRateUsdc)',
|
|
87
|
+
},
|
|
88
|
+
available_only: {
|
|
89
|
+
type: 'boolean',
|
|
90
|
+
description: 'Only return humans who are currently available (default: true)',
|
|
91
|
+
default: true,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'get_human',
|
|
98
|
+
description: 'Get detailed information about a specific human by their ID, including their bio, skills, contact info, wallet addresses, and service offerings.',
|
|
99
|
+
inputSchema: {
|
|
100
|
+
type: 'object',
|
|
101
|
+
properties: {
|
|
102
|
+
id: {
|
|
103
|
+
type: 'string',
|
|
104
|
+
description: 'The unique ID of the human',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
required: ['id'],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'create_job_offer',
|
|
112
|
+
description: 'Create a job offer for a human. The human must ACCEPT the offer before you can proceed with payment. RATE LIMIT: 5 offers per hour per agent_id. SPAM FILTERS: Humans can set minOfferPrice and maxOfferDistance - if your offer violates these, it will be rejected with a specific error code (PRICE_TOO_LOW, BELOW_MIN_RATE, TOO_FAR, LOCATION_REQUIRED). The error will tell you exactly what the human requires.',
|
|
113
|
+
inputSchema: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: {
|
|
116
|
+
human_id: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: 'The ID of the human to hire',
|
|
119
|
+
},
|
|
120
|
+
title: {
|
|
121
|
+
type: 'string',
|
|
122
|
+
description: 'Title of the job/task',
|
|
123
|
+
},
|
|
124
|
+
description: {
|
|
125
|
+
type: 'string',
|
|
126
|
+
description: 'Detailed description of what needs to be done',
|
|
127
|
+
},
|
|
128
|
+
category: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'Category of the task (e.g., "photography", "research", "delivery")',
|
|
131
|
+
},
|
|
132
|
+
price_usdc: {
|
|
133
|
+
type: 'number',
|
|
134
|
+
description: 'Agreed price in USDC. Must meet the human\'s minOfferPrice if set.',
|
|
135
|
+
},
|
|
136
|
+
agent_id: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: 'Your unique agent identifier',
|
|
139
|
+
},
|
|
140
|
+
agent_name: {
|
|
141
|
+
type: 'string',
|
|
142
|
+
description: 'Display name for your agent (optional)',
|
|
143
|
+
},
|
|
144
|
+
agent_lat: {
|
|
145
|
+
type: 'number',
|
|
146
|
+
description: 'Agent latitude for distance filtering. Required if human has maxOfferDistance set.',
|
|
147
|
+
},
|
|
148
|
+
agent_lng: {
|
|
149
|
+
type: 'number',
|
|
150
|
+
description: 'Agent longitude for distance filtering. Required if human has maxOfferDistance set.',
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
required: ['human_id', 'title', 'description', 'price_usdc', 'agent_id'],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: 'get_job_status',
|
|
158
|
+
description: 'Check the status of a job offer. Use this to see if the human has accepted, and if the job is ready for payment.',
|
|
159
|
+
inputSchema: {
|
|
160
|
+
type: 'object',
|
|
161
|
+
properties: {
|
|
162
|
+
job_id: {
|
|
163
|
+
type: 'string',
|
|
164
|
+
description: 'The job ID returned from create_job_offer',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
required: ['job_id'],
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'mark_job_paid',
|
|
172
|
+
description: 'Record that payment has been sent for an ACCEPTED job. The job must be accepted by the human first. Payment amount must match or exceed the agreed price.',
|
|
173
|
+
inputSchema: {
|
|
174
|
+
type: 'object',
|
|
175
|
+
properties: {
|
|
176
|
+
job_id: {
|
|
177
|
+
type: 'string',
|
|
178
|
+
description: 'The job ID',
|
|
179
|
+
},
|
|
180
|
+
payment_tx_hash: {
|
|
181
|
+
type: 'string',
|
|
182
|
+
description: 'The on-chain transaction hash',
|
|
183
|
+
},
|
|
184
|
+
payment_network: {
|
|
185
|
+
type: 'string',
|
|
186
|
+
description: 'The blockchain network (e.g., "ethereum", "solana")',
|
|
187
|
+
},
|
|
188
|
+
payment_amount: {
|
|
189
|
+
type: 'number',
|
|
190
|
+
description: 'The amount paid in USDC',
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
required: ['job_id', 'payment_tx_hash', 'payment_network', 'payment_amount'],
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'leave_review',
|
|
198
|
+
description: 'Leave a review for a COMPLETED job. Reviews are only allowed after the human marks the job as complete.',
|
|
199
|
+
inputSchema: {
|
|
200
|
+
type: 'object',
|
|
201
|
+
properties: {
|
|
202
|
+
job_id: {
|
|
203
|
+
type: 'string',
|
|
204
|
+
description: 'The job ID',
|
|
205
|
+
},
|
|
206
|
+
rating: {
|
|
207
|
+
type: 'number',
|
|
208
|
+
description: 'Rating from 1-5 stars',
|
|
209
|
+
},
|
|
210
|
+
comment: {
|
|
211
|
+
type: 'string',
|
|
212
|
+
description: 'Optional review comment',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
required: ['job_id', 'rating'],
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
}));
|
|
220
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
221
|
+
const { name, arguments: args } = request.params;
|
|
222
|
+
try {
|
|
223
|
+
if (name === 'search_humans') {
|
|
224
|
+
const humans = await searchHumans({
|
|
225
|
+
skill: args?.skill,
|
|
226
|
+
equipment: args?.equipment,
|
|
227
|
+
language: args?.language,
|
|
228
|
+
location: args?.location,
|
|
229
|
+
lat: args?.lat,
|
|
230
|
+
lng: args?.lng,
|
|
231
|
+
radius: args?.radius,
|
|
232
|
+
max_rate: args?.max_rate,
|
|
233
|
+
available_only: args?.available_only !== false,
|
|
234
|
+
});
|
|
235
|
+
if (humans.length === 0) {
|
|
236
|
+
return {
|
|
237
|
+
content: [{ type: 'text', text: 'No humans found matching the criteria.' }],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const summary = humans
|
|
241
|
+
.map((h) => {
|
|
242
|
+
const primaryWallet = h.wallets.find((w) => w.isPrimary) || h.wallets[0];
|
|
243
|
+
const walletInfo = primaryWallet
|
|
244
|
+
? `${primaryWallet.chain || primaryWallet.network}: ${primaryWallet.address}`
|
|
245
|
+
: 'No wallet';
|
|
246
|
+
const contact = [h.contactEmail, h.telegram, h.signal].filter(Boolean).join(' | ');
|
|
247
|
+
const rep = h.reputation;
|
|
248
|
+
const rating = rep && rep.avgRating > 0 ? `${rep.avgRating}★ (${rep.reviewCount} reviews)` : 'No reviews';
|
|
249
|
+
return `- **${h.name}**${h.username ? ` (@${h.username})` : ''} [${h.location || 'Location not specified'}]
|
|
250
|
+
${h.isAvailable ? '✅ Available' : '❌ Busy'} | ${h.minRateUsdc ? `$${h.minRateUsdc}+` : 'Rate negotiable'} | ${rating}
|
|
251
|
+
Skills: ${h.skills.join(', ') || 'None listed'}
|
|
252
|
+
Equipment: ${h.equipment.join(', ') || 'None listed'}
|
|
253
|
+
Languages: ${h.languages.join(', ') || 'Not specified'}
|
|
254
|
+
Contact: ${contact || 'See profile'}
|
|
255
|
+
Wallet: ${walletInfo}
|
|
256
|
+
Jobs completed: ${rep?.jobsCompleted || 0}`;
|
|
257
|
+
})
|
|
258
|
+
.join('\n\n');
|
|
259
|
+
return {
|
|
260
|
+
content: [{ type: 'text', text: `Found ${humans.length} human(s):\n\n${summary}` }],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
if (name === 'get_human') {
|
|
264
|
+
const human = await getHuman(args?.id);
|
|
265
|
+
const primaryWallet = human.wallets.find((w) => w.isPrimary) || human.wallets[0];
|
|
266
|
+
const walletInfo = human.wallets
|
|
267
|
+
.map((w) => `- ${w.chain || w.network}${w.label ? ` (${w.label})` : ''}${w.isPrimary ? ' ⭐' : ''}: ${w.address}`)
|
|
268
|
+
.join('\n');
|
|
269
|
+
const servicesInfo = human.services
|
|
270
|
+
.map((s) => `- **${s.title}** [${s.category}]\n ${s.description}\n Price: ${s.priceRange || 'Negotiable'}`)
|
|
271
|
+
.join('\n\n');
|
|
272
|
+
const socialLinks = [
|
|
273
|
+
human.linkedinUrl && `- LinkedIn: ${human.linkedinUrl}`,
|
|
274
|
+
human.twitterUrl && `- Twitter: ${human.twitterUrl}`,
|
|
275
|
+
human.githubUrl && `- GitHub: ${human.githubUrl}`,
|
|
276
|
+
human.instagramUrl && `- Instagram: ${human.instagramUrl}`,
|
|
277
|
+
human.youtubeUrl && `- YouTube: ${human.youtubeUrl}`,
|
|
278
|
+
human.websiteUrl && `- Website: ${human.websiteUrl}`,
|
|
279
|
+
].filter(Boolean).join('\n');
|
|
280
|
+
const rep = human.reputation;
|
|
281
|
+
const rating = rep && rep.avgRating > 0 ? `${rep.avgRating}★ (${rep.reviewCount} reviews)` : 'No reviews yet';
|
|
282
|
+
const details = `# ${human.name}${human.username ? ` (@${human.username})` : ''}
|
|
283
|
+
${human.isAvailable ? '✅ Available' : '❌ Not Available'}
|
|
284
|
+
|
|
285
|
+
## Reputation
|
|
286
|
+
- Jobs completed: ${rep?.jobsCompleted || 0}
|
|
287
|
+
- Rating: ${rating}
|
|
288
|
+
|
|
289
|
+
## Bio
|
|
290
|
+
${human.bio || 'No bio provided'}
|
|
291
|
+
|
|
292
|
+
## Location
|
|
293
|
+
${human.location || 'Not specified'}
|
|
294
|
+
|
|
295
|
+
## Capabilities
|
|
296
|
+
- **Skills:** ${human.skills.join(', ') || 'None listed'}
|
|
297
|
+
- **Equipment:** ${human.equipment.join(', ') || 'None listed'}
|
|
298
|
+
- **Languages:** ${human.languages.join(', ') || 'Not specified'}
|
|
299
|
+
|
|
300
|
+
## Economics
|
|
301
|
+
- **Minimum Rate:** ${human.minRateUsdc ? `$${human.minRateUsdc} USDC` : 'Negotiable'}
|
|
302
|
+
- **Rate Type:** ${human.rateType || 'NEGOTIABLE'}
|
|
303
|
+
|
|
304
|
+
## Contact
|
|
305
|
+
- Email: ${human.contactEmail || 'Not provided'}
|
|
306
|
+
- Telegram: ${human.telegram || 'Not provided'}
|
|
307
|
+
- Signal: ${human.signal || 'Not provided'}
|
|
308
|
+
|
|
309
|
+
## Payment Wallets
|
|
310
|
+
${walletInfo || 'No wallets added'}
|
|
311
|
+
${primaryWallet ? `\n**Preferred wallet:** ${primaryWallet.chain || primaryWallet.network} - ${primaryWallet.address}` : ''}
|
|
312
|
+
|
|
313
|
+
## Social Profiles (Trust Verification)
|
|
314
|
+
${socialLinks || 'No social profiles added'}
|
|
315
|
+
|
|
316
|
+
## Services Offered
|
|
317
|
+
${servicesInfo || 'No services listed'}`;
|
|
318
|
+
return {
|
|
319
|
+
content: [{ type: 'text', text: details }],
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
if (name === 'create_job_offer') {
|
|
323
|
+
const res = await fetch(`${API_BASE}/api/jobs`, {
|
|
324
|
+
method: 'POST',
|
|
325
|
+
headers: { 'Content-Type': 'application/json' },
|
|
326
|
+
body: JSON.stringify({
|
|
327
|
+
humanId: args?.human_id,
|
|
328
|
+
agentId: args?.agent_id,
|
|
329
|
+
agentName: args?.agent_name,
|
|
330
|
+
title: args?.title,
|
|
331
|
+
description: args?.description,
|
|
332
|
+
category: args?.category,
|
|
333
|
+
priceUsdc: args?.price_usdc,
|
|
334
|
+
}),
|
|
335
|
+
});
|
|
336
|
+
if (!res.ok) {
|
|
337
|
+
const error = await res.json();
|
|
338
|
+
throw new Error(error.error || `API error: ${res.status}`);
|
|
339
|
+
}
|
|
340
|
+
const job = await res.json();
|
|
341
|
+
const human = await getHuman(args?.human_id);
|
|
342
|
+
return {
|
|
343
|
+
content: [
|
|
344
|
+
{
|
|
345
|
+
type: 'text',
|
|
346
|
+
text: `**Job Offer Created!**
|
|
347
|
+
|
|
348
|
+
**Job ID:** ${job.id}
|
|
349
|
+
**Status:** ${job.status}
|
|
350
|
+
**Human:** ${human.name}
|
|
351
|
+
**Price:** $${args?.price_usdc} USDC
|
|
352
|
+
|
|
353
|
+
⏳ **Next Step:** Wait for ${human.name} to accept the offer.
|
|
354
|
+
Use \`get_job_status\` with job_id "${job.id}" to check if they've accepted.
|
|
355
|
+
|
|
356
|
+
Once accepted, you can send payment to their wallet and use \`mark_job_paid\` to record the transaction.`,
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
if (name === 'get_job_status') {
|
|
362
|
+
const res = await fetch(`${API_BASE}/api/jobs/${args?.job_id}`);
|
|
363
|
+
if (!res.ok) {
|
|
364
|
+
throw new Error(`Job not found: ${args?.job_id}`);
|
|
365
|
+
}
|
|
366
|
+
const job = await res.json();
|
|
367
|
+
const statusEmoji = {
|
|
368
|
+
PENDING: '⏳',
|
|
369
|
+
ACCEPTED: '✅',
|
|
370
|
+
REJECTED: '❌',
|
|
371
|
+
PAID: '💰',
|
|
372
|
+
COMPLETED: '🎉',
|
|
373
|
+
CANCELLED: '🚫',
|
|
374
|
+
DISPUTED: '⚠️',
|
|
375
|
+
};
|
|
376
|
+
let nextStep = '';
|
|
377
|
+
switch (job.status) {
|
|
378
|
+
case 'PENDING':
|
|
379
|
+
nextStep = 'Waiting for the human to accept or reject.';
|
|
380
|
+
break;
|
|
381
|
+
case 'ACCEPTED':
|
|
382
|
+
nextStep = `Human accepted! Send $${job.priceUsdc} USDC to their wallet, then use \`mark_job_paid\` with the transaction hash.`;
|
|
383
|
+
break;
|
|
384
|
+
case 'REJECTED':
|
|
385
|
+
nextStep = 'The human rejected this offer. Consider adjusting your offer or finding another human.';
|
|
386
|
+
break;
|
|
387
|
+
case 'PAID':
|
|
388
|
+
nextStep = 'Payment recorded. Work is in progress. The human will mark it complete when done.';
|
|
389
|
+
break;
|
|
390
|
+
case 'COMPLETED':
|
|
391
|
+
nextStep = job.review
|
|
392
|
+
? `Review submitted: ${job.review.rating}/5 stars`
|
|
393
|
+
: 'Job complete! You can now use `leave_review` to rate the human.';
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
content: [
|
|
398
|
+
{
|
|
399
|
+
type: 'text',
|
|
400
|
+
text: `**Job Status**
|
|
401
|
+
|
|
402
|
+
**Job ID:** ${job.id}
|
|
403
|
+
**Status:** ${statusEmoji[job.status] || ''} ${job.status}
|
|
404
|
+
**Title:** ${job.title}
|
|
405
|
+
**Price:** $${job.priceUsdc} USDC
|
|
406
|
+
**Human:** ${job.human.name}
|
|
407
|
+
|
|
408
|
+
**Next Step:** ${nextStep}`,
|
|
409
|
+
},
|
|
410
|
+
],
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
if (name === 'mark_job_paid') {
|
|
414
|
+
const res = await fetch(`${API_BASE}/api/jobs/${args?.job_id}/paid`, {
|
|
415
|
+
method: 'PATCH',
|
|
416
|
+
headers: { 'Content-Type': 'application/json' },
|
|
417
|
+
body: JSON.stringify({
|
|
418
|
+
paymentTxHash: args?.payment_tx_hash,
|
|
419
|
+
paymentNetwork: args?.payment_network,
|
|
420
|
+
paymentAmount: args?.payment_amount,
|
|
421
|
+
}),
|
|
422
|
+
});
|
|
423
|
+
if (!res.ok) {
|
|
424
|
+
const error = await res.json();
|
|
425
|
+
throw new Error(error.reason || error.error || `API error: ${res.status}`);
|
|
426
|
+
}
|
|
427
|
+
const result = await res.json();
|
|
428
|
+
return {
|
|
429
|
+
content: [
|
|
430
|
+
{
|
|
431
|
+
type: 'text',
|
|
432
|
+
text: `**Payment Recorded!**
|
|
433
|
+
|
|
434
|
+
**Job ID:** ${result.id}
|
|
435
|
+
**Status:** ${result.status}
|
|
436
|
+
**Transaction:** ${args?.payment_tx_hash}
|
|
437
|
+
**Network:** ${args?.payment_network}
|
|
438
|
+
**Amount:** $${args?.payment_amount} USDC
|
|
439
|
+
|
|
440
|
+
The human can now begin work. They will mark the job as complete when finished.
|
|
441
|
+
After completion, you can leave a review using \`leave_review\`.`,
|
|
442
|
+
},
|
|
443
|
+
],
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
if (name === 'leave_review') {
|
|
447
|
+
const res = await fetch(`${API_BASE}/api/jobs/${args?.job_id}/review`, {
|
|
448
|
+
method: 'POST',
|
|
449
|
+
headers: { 'Content-Type': 'application/json' },
|
|
450
|
+
body: JSON.stringify({
|
|
451
|
+
rating: args?.rating,
|
|
452
|
+
comment: args?.comment,
|
|
453
|
+
}),
|
|
454
|
+
});
|
|
455
|
+
if (!res.ok) {
|
|
456
|
+
const error = await res.json();
|
|
457
|
+
throw new Error(error.reason || error.error || `API error: ${res.status}`);
|
|
458
|
+
}
|
|
459
|
+
const _review = await res.json();
|
|
460
|
+
return {
|
|
461
|
+
content: [
|
|
462
|
+
{
|
|
463
|
+
type: 'text',
|
|
464
|
+
text: `**Review Submitted!**
|
|
465
|
+
|
|
466
|
+
**Rating:** ${'⭐'.repeat(args?.rating)}
|
|
467
|
+
${args?.comment ? `**Comment:** ${args?.comment}` : ''}
|
|
468
|
+
|
|
469
|
+
Thank you for your feedback. This helps build the human's reputation.`,
|
|
470
|
+
},
|
|
471
|
+
],
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
return {
|
|
475
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
476
|
+
isError: true,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
return {
|
|
481
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
482
|
+
isError: true,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
async function main() {
|
|
487
|
+
const transport = new StdioServerTransport();
|
|
488
|
+
await server.connect(transport);
|
|
489
|
+
console.error('Human Pages MCP Server running on stdio');
|
|
490
|
+
}
|
|
491
|
+
main().catch(console.error);
|
|
492
|
+
//# 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,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "humanpages",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP Server for AI agents to discover and hire humans for real-world tasks via humanpages.ai",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"humanpages": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"dev": "tsx watch src/index.ts",
|
|
16
|
+
"build": "tsc && node -e \"const fs=require('fs');const f='dist/index.js';const c=fs.readFileSync(f,'utf8');fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)\"",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"prepublishOnly": "npm run build",
|
|
19
|
+
"build:bundle": "cd bundle && npm install && cd .. && zip -r humans.mcpb bundle/*"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"ai",
|
|
25
|
+
"agents",
|
|
26
|
+
"humans",
|
|
27
|
+
"humanpages",
|
|
28
|
+
"marketplace",
|
|
29
|
+
"tasks",
|
|
30
|
+
"hire",
|
|
31
|
+
"freelance"
|
|
32
|
+
],
|
|
33
|
+
"author": "Human Pages",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"homepage": "https://humanpages.ai/dev",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/humanpages/humanpages"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
42
|
+
"dotenv": "^16.4.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^20.11.16",
|
|
46
|
+
"tsx": "^4.7.0",
|
|
47
|
+
"typescript": "^5.3.3"
|
|
48
|
+
}
|
|
49
|
+
}
|