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 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
@@ -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
+ }