humanpages 1.3.0 → 1.4.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/dist/tools.js +155 -73
- package/package.json +3 -4
- package/playbooks/community-management.md +0 -210
- package/playbooks/competitor-monitoring.md +0 -193
- package/playbooks/directory-submissions.md +0 -331
- package/playbooks/localization.md +0 -199
- package/playbooks/qa-testing.md +0 -187
package/dist/tools.js
CHANGED
|
@@ -1,33 +1,6 @@
|
|
|
1
1
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
2
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
|
|
4
|
-
import { join, dirname } from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
const API_BASE = process.env.API_BASE_URL || 'http://localhost:3001';
|
|
7
|
-
const PLAYBOOKS = [
|
|
8
|
-
{ type: 'directory-submissions', name: 'Directory & Listing Submissions', description: 'Submit your product to 80+ directories with CAPTCHAs, manual forms, and account creation. Includes a curated directory list.' },
|
|
9
|
-
{ type: 'qa-testing', name: 'Real-Device QA Testing', description: 'Test your app on real phones, browsers, and networks. Get bug reports with screenshots and device info.' },
|
|
10
|
-
{ type: 'competitor-monitoring', name: 'Competitor Monitoring', description: 'Track competitor pricing, features, and changes — including pages gated behind "contact sales."' },
|
|
11
|
-
{ type: 'localization', name: 'Localization Smoke Testing', description: 'Native speaker flags mistranslations, cultural mismatches, and text overflow in your localized app.' },
|
|
12
|
-
{ type: 'community-management', name: 'Community Management', description: 'Moderate your Discord, subreddit, or forum. Welcome members, answer questions, enforce rules.' },
|
|
13
|
-
];
|
|
14
|
-
const PLAYBOOK_TYPES = PLAYBOOKS.map(p => p.type);
|
|
15
|
-
function getPlaybookContent(taskType) {
|
|
16
|
-
// Try to find playbooks relative to the compiled output (dist/) or source
|
|
17
|
-
const possibleBases = [
|
|
18
|
-
join(dirname(fileURLToPath(import.meta.url)), '..', 'playbooks'),
|
|
19
|
-
join(dirname(fileURLToPath(import.meta.url)), 'playbooks'),
|
|
20
|
-
];
|
|
21
|
-
for (const base of possibleBases) {
|
|
22
|
-
try {
|
|
23
|
-
return readFileSync(join(base, `${taskType}.md`), 'utf-8');
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
throw new Error(`Playbook not found: ${taskType}. Available: ${PLAYBOOK_TYPES.join(', ')}`);
|
|
30
|
-
}
|
|
3
|
+
const API_BASE = process.env.API_BASE_URL || 'https://api.humanpages.ai';
|
|
31
4
|
async function searchHumans(params) {
|
|
32
5
|
const query = new URLSearchParams();
|
|
33
6
|
if (params.skill)
|
|
@@ -54,6 +27,8 @@ async function searchHumans(params) {
|
|
|
54
27
|
query.set('verified', params.verified);
|
|
55
28
|
if (params.min_experience)
|
|
56
29
|
query.set('minExperience', params.min_experience.toString());
|
|
30
|
+
if (params.fiat_platform)
|
|
31
|
+
query.set('fiatPlatform', params.fiat_platform);
|
|
57
32
|
const res = await fetch(`${API_BASE}/api/humans/search?${query}`);
|
|
58
33
|
if (!res.ok) {
|
|
59
34
|
throw new Error(`API error: ${res.status}`);
|
|
@@ -135,6 +110,10 @@ export function createServer() {
|
|
|
135
110
|
type: 'number',
|
|
136
111
|
description: 'Minimum years of professional experience',
|
|
137
112
|
},
|
|
113
|
+
fiat_platform: {
|
|
114
|
+
type: 'string',
|
|
115
|
+
description: 'Filter by fiat payment platform the human accepts (e.g., "WISE", "PAYPAL", "VENMO", "REVOLUT", "CASHAPP", "ZELLE", "MONZO", "N26", "MERCADOPAGO")',
|
|
116
|
+
},
|
|
138
117
|
},
|
|
139
118
|
},
|
|
140
119
|
},
|
|
@@ -178,6 +157,10 @@ export function createServer() {
|
|
|
178
157
|
type: 'string',
|
|
179
158
|
description: 'Webhook URL for receiving platform events (new job matches, status changes, announcements). Must be a public HTTPS endpoint.',
|
|
180
159
|
},
|
|
160
|
+
wallet_address: {
|
|
161
|
+
type: 'string',
|
|
162
|
+
description: 'Optional EVM wallet address (0x...) for USDC payments. Can also be set later with set_wallet.',
|
|
163
|
+
},
|
|
181
164
|
},
|
|
182
165
|
required: ['name'],
|
|
183
166
|
},
|
|
@@ -196,6 +179,51 @@ export function createServer() {
|
|
|
196
179
|
required: ['agent_id'],
|
|
197
180
|
},
|
|
198
181
|
},
|
|
182
|
+
{
|
|
183
|
+
name: 'set_wallet',
|
|
184
|
+
description: 'Set the wallet address for a registered agent. This is used for receiving USDC payments and checking balance. The address must be a valid EVM address (0x + 40 hex chars). Network defaults to "base" (recommended for low fees).',
|
|
185
|
+
inputSchema: {
|
|
186
|
+
type: 'object',
|
|
187
|
+
properties: {
|
|
188
|
+
agent_id: {
|
|
189
|
+
type: 'string',
|
|
190
|
+
description: 'Your registered agent ID',
|
|
191
|
+
},
|
|
192
|
+
agent_key: {
|
|
193
|
+
type: 'string',
|
|
194
|
+
description: 'Your agent API key (starts with hp_)',
|
|
195
|
+
},
|
|
196
|
+
wallet_address: {
|
|
197
|
+
type: 'string',
|
|
198
|
+
description: 'EVM wallet address (0x...)',
|
|
199
|
+
},
|
|
200
|
+
wallet_network: {
|
|
201
|
+
type: 'string',
|
|
202
|
+
enum: ['base', 'ethereum', 'polygon', 'arbitrum', 'base-sepolia'],
|
|
203
|
+
description: 'Blockchain network (default: "base"). Options: base, ethereum, polygon, arbitrum',
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
required: ['agent_id', 'agent_key', 'wallet_address'],
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'get_funding_info',
|
|
211
|
+
description: 'Get funding instructions and current wallet balance for a registered agent. Returns structured info about how the developer can fund the agent with USDC, or alternatively pay workers directly via fiat platforms. Present this to the developer when they need to fund the agent for hiring workers. Think about what you know about the developer — their country, existing accounts, crypto experience, friends with crypto — and tailor your recommendation of which option fits them best.',
|
|
212
|
+
inputSchema: {
|
|
213
|
+
type: 'object',
|
|
214
|
+
properties: {
|
|
215
|
+
agent_id: {
|
|
216
|
+
type: 'string',
|
|
217
|
+
description: 'Your registered agent ID',
|
|
218
|
+
},
|
|
219
|
+
agent_key: {
|
|
220
|
+
type: 'string',
|
|
221
|
+
description: 'Your agent API key (starts with hp_)',
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
required: ['agent_id', 'agent_key'],
|
|
225
|
+
},
|
|
226
|
+
},
|
|
199
227
|
{
|
|
200
228
|
name: 'verify_agent_domain',
|
|
201
229
|
description: 'Verify domain ownership for a registered agent. The agent must have a websiteUrl set. Supports two methods: "well-known" (place a file at /.well-known/humanpages-verify.txt) or "dns" (add a TXT record at _humanpages.yourdomain.com).',
|
|
@@ -857,29 +885,6 @@ export function createServer() {
|
|
|
857
885
|
required: ['agent_key'],
|
|
858
886
|
},
|
|
859
887
|
},
|
|
860
|
-
{
|
|
861
|
-
name: 'list_playbooks',
|
|
862
|
-
description: 'List available task delegation playbooks. Each playbook contains step-by-step instructions for hiring a human to do a specific type of work (QA testing, competitor monitoring, directory submissions, etc.).',
|
|
863
|
-
inputSchema: {
|
|
864
|
-
type: 'object',
|
|
865
|
-
properties: {},
|
|
866
|
-
},
|
|
867
|
-
},
|
|
868
|
-
{
|
|
869
|
-
name: 'get_playbook',
|
|
870
|
-
description: 'Get the full content of a delegation playbook. Returns detailed instructions including search criteria, job offer templates, pricing, verification steps, and communication templates.',
|
|
871
|
-
inputSchema: {
|
|
872
|
-
type: 'object',
|
|
873
|
-
properties: {
|
|
874
|
-
task_type: {
|
|
875
|
-
type: 'string',
|
|
876
|
-
description: 'The playbook type to retrieve',
|
|
877
|
-
enum: ['qa-testing', 'competitor-monitoring', 'localization', 'directory-submissions', 'community-management'],
|
|
878
|
-
},
|
|
879
|
-
},
|
|
880
|
-
required: ['task_type'],
|
|
881
|
-
},
|
|
882
|
-
},
|
|
883
888
|
],
|
|
884
889
|
}));
|
|
885
890
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -899,6 +904,7 @@ export function createServer() {
|
|
|
899
904
|
work_mode: args?.work_mode,
|
|
900
905
|
verified: args?.verified,
|
|
901
906
|
min_experience: args?.min_experience,
|
|
907
|
+
fiat_platform: args?.fiat_platform,
|
|
902
908
|
});
|
|
903
909
|
const humans = response.results;
|
|
904
910
|
const locationNote = response.resolvedLocation
|
|
@@ -932,6 +938,7 @@ export function createServer() {
|
|
|
932
938
|
Equipment: ${h.equipment.join(', ') || 'None listed'}
|
|
933
939
|
Languages: ${h.languages.join(', ') || 'Not specified'}
|
|
934
940
|
Experience: ${h.yearsOfExperience ? `${h.yearsOfExperience} years` : 'Not specified'}
|
|
941
|
+
Payment methods: ${h.paymentMethods && h.paymentMethods.length > 0 ? h.paymentMethods.join(', ') : 'Not specified'}
|
|
935
942
|
Jobs completed: ${rep?.jobsCompleted || 0}`;
|
|
936
943
|
})
|
|
937
944
|
.join('\n\n');
|
|
@@ -1011,6 +1018,7 @@ ${servicesInfo || 'No services listed'}`;
|
|
|
1011
1018
|
websiteUrl: args?.website_url,
|
|
1012
1019
|
contactEmail: args?.contact_email,
|
|
1013
1020
|
webhookUrl: args?.webhook_url,
|
|
1021
|
+
walletAddress: args?.wallet_address,
|
|
1014
1022
|
}),
|
|
1015
1023
|
});
|
|
1016
1024
|
if (!res.ok) {
|
|
@@ -1069,6 +1077,102 @@ To get a verified badge, set up domain verification using \`verify_agent_domain\
|
|
|
1069
1077
|
content: [{ type: 'text', text: details }],
|
|
1070
1078
|
};
|
|
1071
1079
|
}
|
|
1080
|
+
if (name === 'set_wallet') {
|
|
1081
|
+
const agentKey = args?.agent_key;
|
|
1082
|
+
if (!agentKey) {
|
|
1083
|
+
throw new Error('agent_key is required.');
|
|
1084
|
+
}
|
|
1085
|
+
const res = await fetch(`${API_BASE}/api/agents/${args?.agent_id}/wallet`, {
|
|
1086
|
+
method: 'PATCH',
|
|
1087
|
+
headers: {
|
|
1088
|
+
'Content-Type': 'application/json',
|
|
1089
|
+
'X-Agent-Key': agentKey,
|
|
1090
|
+
},
|
|
1091
|
+
body: JSON.stringify({
|
|
1092
|
+
walletAddress: args?.wallet_address,
|
|
1093
|
+
walletNetwork: args?.wallet_network || 'base',
|
|
1094
|
+
}),
|
|
1095
|
+
});
|
|
1096
|
+
if (!res.ok) {
|
|
1097
|
+
const error = await res.json();
|
|
1098
|
+
throw new Error(error.error || `API error: ${res.status}`);
|
|
1099
|
+
}
|
|
1100
|
+
const result = await res.json();
|
|
1101
|
+
return {
|
|
1102
|
+
content: [{
|
|
1103
|
+
type: 'text',
|
|
1104
|
+
text: `**Wallet Set!**
|
|
1105
|
+
|
|
1106
|
+
**Agent:** ${result.name}
|
|
1107
|
+
**Wallet Address:** \`${result.walletAddress}\`
|
|
1108
|
+
**Network:** ${result.walletNetwork}
|
|
1109
|
+
|
|
1110
|
+
Your wallet is now configured. Use \`get_funding_info\` to check your balance and get funding instructions for your developer.`,
|
|
1111
|
+
}],
|
|
1112
|
+
};
|
|
1113
|
+
}
|
|
1114
|
+
if (name === 'get_funding_info') {
|
|
1115
|
+
const agentKey = args?.agent_key;
|
|
1116
|
+
if (!agentKey) {
|
|
1117
|
+
throw new Error('agent_key is required.');
|
|
1118
|
+
}
|
|
1119
|
+
// Fetch balance
|
|
1120
|
+
const balanceRes = await fetch(`${API_BASE}/api/agents/${args?.agent_id}/balance`);
|
|
1121
|
+
if (!balanceRes.ok) {
|
|
1122
|
+
throw new Error(`Could not fetch balance: ${balanceRes.status}`);
|
|
1123
|
+
}
|
|
1124
|
+
const balanceData = await balanceRes.json();
|
|
1125
|
+
const hasWallet = balanceData.walletAddress != null;
|
|
1126
|
+
const balance = balanceData.balance ?? '0.00';
|
|
1127
|
+
const network = balanceData.network || 'base';
|
|
1128
|
+
const addr = balanceData.walletAddress || '(not set)';
|
|
1129
|
+
// Build Transak URL (pre-filled with wallet, params encoded for safety)
|
|
1130
|
+
const transakUrl = hasWallet
|
|
1131
|
+
? `https://global.transak.com/?cryptoCurrencyCode=USDC&network=${encodeURIComponent(network)}&walletAddress=${encodeURIComponent(addr)}`
|
|
1132
|
+
: 'https://global.transak.com/?cryptoCurrencyCode=USDC&network=base';
|
|
1133
|
+
const fundingMethods = [
|
|
1134
|
+
{ method: 'crypto_transfer', label: 'Send USDC', description: `Send USDC to ${addr} on ${network}` },
|
|
1135
|
+
{ method: 'credit_card', label: 'Buy with card', provider: 'Transak', url: transakUrl },
|
|
1136
|
+
{ method: 'peer_exchange', label: 'Convert via Peer', provider: 'Peer (peer.xyz)', url: 'https://peer.xyz', description: 'Convert from Wise, PayPal, Venmo, or 15+ other platforms to USDC' },
|
|
1137
|
+
{ method: 'ask_friend', label: 'Ask someone with crypto', description: `Have them send USDC to ${addr}` },
|
|
1138
|
+
];
|
|
1139
|
+
const fiatAlternative = {
|
|
1140
|
+
description: 'You can also pay workers directly via shared payment platforms (Wise, PayPal, Venmo, Revolut, etc.) without needing crypto. Search for workers who accept your preferred platform.',
|
|
1141
|
+
useSearchParam: 'fiat_platform',
|
|
1142
|
+
};
|
|
1143
|
+
const message = `I need funding to hire workers on your behalf.
|
|
1144
|
+
|
|
1145
|
+
Current balance: $${balance} USDC${hasWallet ? '' : ' (no wallet set — use set_wallet first)'}
|
|
1146
|
+
Wallet address: ${addr}
|
|
1147
|
+
Network: ${network}
|
|
1148
|
+
|
|
1149
|
+
**Option A — Fund with USDC (for crypto payments):**
|
|
1150
|
+
|
|
1151
|
+
1. Already have crypto? Send USDC to my wallet address above on ${network}.
|
|
1152
|
+
2. Buy with card: [Transak](${transakUrl})
|
|
1153
|
+
3. Convert from Wise/PayPal/Venmo/etc: [Peer (peer.xyz)](https://peer.xyz)
|
|
1154
|
+
4. Know someone with crypto? Ask them to send USDC to my address.
|
|
1155
|
+
|
|
1156
|
+
**Option B — Pay workers directly with fiat:**
|
|
1157
|
+
I can find workers who accept payment platforms you already use (Wise, PayPal, Venmo, Revolut, etc.). You'd pay them directly — no crypto needed.
|
|
1158
|
+
|
|
1159
|
+
**Think about what works best for you** — consider what accounts you already have, whether you or anyone you know holds crypto, and what payment methods are common where you are. I can help figure out the easiest path.
|
|
1160
|
+
|
|
1161
|
+
Which option works best for you?`;
|
|
1162
|
+
return {
|
|
1163
|
+
content: [{
|
|
1164
|
+
type: 'text',
|
|
1165
|
+
text: JSON.stringify({
|
|
1166
|
+
currentBalance: balance,
|
|
1167
|
+
walletAddress: addr,
|
|
1168
|
+
walletNetwork: network,
|
|
1169
|
+
fundingMethods,
|
|
1170
|
+
fiatAlternative,
|
|
1171
|
+
message,
|
|
1172
|
+
}, null, 2),
|
|
1173
|
+
}],
|
|
1174
|
+
};
|
|
1175
|
+
}
|
|
1072
1176
|
if (name === 'verify_agent_domain') {
|
|
1073
1177
|
const res = await fetch(`${API_BASE}/api/agents/${args?.agent_id}/verify-domain`, {
|
|
1074
1178
|
method: 'POST',
|
|
@@ -2108,28 +2212,6 @@ Thank you for your feedback. This helps build the human's reputation.`,
|
|
|
2108
2212
|
],
|
|
2109
2213
|
};
|
|
2110
2214
|
}
|
|
2111
|
-
if (name === 'list_playbooks') {
|
|
2112
|
-
const list = PLAYBOOKS.map(p => `- **${p.name}** (\`${p.type}\`): ${p.description}`).join('\n');
|
|
2113
|
-
return {
|
|
2114
|
-
content: [{
|
|
2115
|
-
type: 'text',
|
|
2116
|
-
text: `**Available Delegation Playbooks**\n\n${list}\n\nUse \`get_playbook(task_type)\` to get full instructions for any playbook.`,
|
|
2117
|
-
}],
|
|
2118
|
-
};
|
|
2119
|
-
}
|
|
2120
|
-
if (name === 'get_playbook') {
|
|
2121
|
-
const taskType = args?.task_type;
|
|
2122
|
-
if (!taskType || !PLAYBOOK_TYPES.includes(taskType)) {
|
|
2123
|
-
return {
|
|
2124
|
-
content: [{ type: 'text', text: `Invalid task_type. Must be one of: ${PLAYBOOK_TYPES.join(', ')}` }],
|
|
2125
|
-
isError: true,
|
|
2126
|
-
};
|
|
2127
|
-
}
|
|
2128
|
-
const content = getPlaybookContent(taskType);
|
|
2129
|
-
return {
|
|
2130
|
-
content: [{ type: 'text', text: content }],
|
|
2131
|
-
};
|
|
2132
|
-
}
|
|
2133
2215
|
return {
|
|
2134
2216
|
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
2135
2217
|
isError: true,
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "humanpages",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"mcpName": "io.github.human-pages-ai/humanpages",
|
|
5
|
-
"description": "MCP server (+ OpenClaw SKILL.md) that gives AI agents access to real-world people who listed themselves to be hired by agents.
|
|
5
|
+
"description": "MCP server (+ OpenClaw SKILL.md) that gives AI agents access to real-world people who listed themselves to be hired by agents. 31 tools including search by skill/location/equipment, job offers, job board listings, in-job messaging, streaming payments, and agent funding.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
@@ -16,8 +16,7 @@
|
|
|
16
16
|
"dist/tools.d.ts",
|
|
17
17
|
"dist/http.js",
|
|
18
18
|
"dist/http.d.ts",
|
|
19
|
-
"README.md"
|
|
20
|
-
"playbooks/"
|
|
19
|
+
"README.md"
|
|
21
20
|
],
|
|
22
21
|
"scripts": {
|
|
23
22
|
"dev": "tsx watch src/index.ts",
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
# Community Management Playbook
|
|
2
|
-
|
|
3
|
-
Hire a human to manage your online community on a daily basis. Community management requires empathy, judgment, cultural awareness, and the ability to de-escalate conflict — tasks that remain firmly human.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## When to Use
|
|
8
|
-
|
|
9
|
-
- Your product has an active community (Discord, Slack, forum, Telegram, subreddit) that needs daily attention
|
|
10
|
-
- User questions are going unanswered for more than 24 hours
|
|
11
|
-
- You're seeing spam, toxicity, or off-topic content that needs moderation
|
|
12
|
-
- You want to build community engagement proactively (not just reactive support)
|
|
13
|
-
- You're launching a community and need someone to seed conversations and welcome new members
|
|
14
|
-
|
|
15
|
-
## Why a Human Is Needed
|
|
16
|
-
|
|
17
|
-
Community management is fundamentally a relationship-building activity. Members need to feel heard by a real person. Moderation decisions require judgment calls about tone, intent, and context that automated systems get wrong. A human community manager can read the room, de-escalate tensions before they become crises, identify power users to elevate, and create the kind of authentic engagement that builds loyalty. Bots managing communities feel like bots — and community members leave.
|
|
18
|
-
|
|
19
|
-
## Search Criteria
|
|
20
|
-
|
|
21
|
-
**Primary search:**
|
|
22
|
-
```json
|
|
23
|
-
{
|
|
24
|
-
"skill": "community management",
|
|
25
|
-
"available_now": true,
|
|
26
|
-
"limit": 10
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**Fallback search:**
|
|
31
|
-
```json
|
|
32
|
-
{
|
|
33
|
-
"skill": "moderation",
|
|
34
|
-
"available_now": true,
|
|
35
|
-
"limit": 10
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Second fallback:**
|
|
40
|
-
```json
|
|
41
|
-
{
|
|
42
|
-
"skill": "customer support",
|
|
43
|
-
"available_now": true,
|
|
44
|
-
"limit": 10
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## Candidate Evaluation
|
|
49
|
-
|
|
50
|
-
Priority criteria when reviewing `get_human_profile` results:
|
|
51
|
-
|
|
52
|
-
1. **Community management experience** — prior experience moderating Discord, Slack, forums, or social media communities
|
|
53
|
-
2. **Communication style** — warm, professional, and empathetic; check their bio for tone
|
|
54
|
-
3. **Timezone coverage** — should be active during your community's peak hours
|
|
55
|
-
4. **Platform familiarity** — experience with the specific platform you use (Discord roles, Slack workflows, Reddit moderation tools, etc.)
|
|
56
|
-
5. **Language skills** — must be fluent in your community's primary language; multilingual is a bonus for international communities
|
|
57
|
-
6. **Availability commitment** — community management requires daily presence, not occasional check-ins
|
|
58
|
-
|
|
59
|
-
## Job Offer Template
|
|
60
|
-
|
|
61
|
-
**Title:** Daily community management for [COMMUNITY_NAME] on [PLATFORM]
|
|
62
|
-
|
|
63
|
-
**Description:**
|
|
64
|
-
```
|
|
65
|
-
Manage the [COMMUNITY_NAME] community on [PLATFORM] ([INVITE_LINK]).
|
|
66
|
-
|
|
67
|
-
Daily responsibilities:
|
|
68
|
-
1. **Welcome new members** — greet new joins within [N] hours, point
|
|
69
|
-
them to introductions channel and key resources
|
|
70
|
-
2. **Answer questions** — respond to user questions or route them to
|
|
71
|
-
the right person/channel. Aim for < [N]-hour first response time
|
|
72
|
-
3. **Moderate content** — remove spam, enforce community guidelines,
|
|
73
|
-
warn or mute rule violators
|
|
74
|
-
4. **Engage proactively** — start [N] conversations/week, share
|
|
75
|
-
relevant content, highlight interesting user contributions
|
|
76
|
-
5. **Escalate issues** — flag technical bugs, feature requests, and
|
|
77
|
-
serious incidents to me immediately via [ESCALATION_CHANNEL]
|
|
78
|
-
6. **Weekly summary** — deliver a structured report every [DAY]
|
|
79
|
-
|
|
80
|
-
Community guidelines: [LINK_TO_GUIDELINES]
|
|
81
|
-
Key resources to share with members: [LINK_TO_FAQ_OR_DOCS]
|
|
82
|
-
Escalation contact: [YOUR_CONTACT]
|
|
83
|
-
|
|
84
|
-
Active hours required: [TIMEZONE] [START_TIME]-[END_TIME], [DAYS]
|
|
85
|
-
|
|
86
|
-
Weekly summary format:
|
|
87
|
-
- New members this week: [count]
|
|
88
|
-
- Messages/posts this week: [count]
|
|
89
|
-
- Questions answered: [count]
|
|
90
|
-
- Issues escalated: [list]
|
|
91
|
-
- Top discussions/threads: [list with links]
|
|
92
|
-
- Spam/moderation actions: [count and summary]
|
|
93
|
-
- Community sentiment: [positive/neutral/negative + explanation]
|
|
94
|
-
- Suggestions for improvement: [2-3 ideas]
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**Suggested price:** $50-100 per week, depending on community size and activity level. Small community (< 100 active members): $50/week. Medium (100-500 active): $75/week. Large (500+ active): $100/week.
|
|
98
|
-
|
|
99
|
-
## Expected Deliverables
|
|
100
|
-
|
|
101
|
-
1. Daily presence in the community during agreed hours (verifiable via message timestamps)
|
|
102
|
-
2. Responses to user questions within the agreed SLA (e.g., 4-hour first response)
|
|
103
|
-
3. Moderation actions logged (spam removed, warnings issued, bans with reason)
|
|
104
|
-
4. Weekly summary report covering all metrics listed in the job description
|
|
105
|
-
5. Escalation of critical issues in real-time via the agreed channel
|
|
106
|
-
6. Proactive engagement: conversation starters, content shares, member highlights
|
|
107
|
-
|
|
108
|
-
## Verification Criteria
|
|
109
|
-
|
|
110
|
-
Before calling `mark_job_paid` (weekly):
|
|
111
|
-
|
|
112
|
-
1. **Presence check** — review message timestamps to confirm daily activity during agreed hours
|
|
113
|
-
2. **Response time** — spot-check 3-5 user questions and measure time-to-first-response against SLA
|
|
114
|
-
3. **Moderation quality** — review moderation log; actions should be justified and proportionate
|
|
115
|
-
4. **Weekly summary delivered** — report should be on time, complete, and contain actionable insights
|
|
116
|
-
5. **No unanswered questions** — scan channels for questions that went unaddressed for more than the SLA period
|
|
117
|
-
6. **Community health** — subjective check: does the community feel more active and welcoming than before?
|
|
118
|
-
|
|
119
|
-
## Communication Template
|
|
120
|
-
|
|
121
|
-
**First message after job offer is accepted:**
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
Hi [NAME], welcome aboard!
|
|
125
|
-
|
|
126
|
-
Here's everything you need to get started:
|
|
127
|
-
|
|
128
|
-
Community access:
|
|
129
|
-
- Platform: [PLATFORM]
|
|
130
|
-
- Invite link: [INVITE_LINK]
|
|
131
|
-
- Your role/permissions: [ROLE] (I'll assign this once you join)
|
|
132
|
-
|
|
133
|
-
Key channels:
|
|
134
|
-
- #general — main discussion
|
|
135
|
-
- #help — user questions (priority channel)
|
|
136
|
-
- #introductions — new member welcomes
|
|
137
|
-
- #announcements — official announcements (only I post here)
|
|
138
|
-
|
|
139
|
-
Community guidelines: [LINK]
|
|
140
|
-
FAQ / documentation: [LINK]
|
|
141
|
-
|
|
142
|
-
Your schedule:
|
|
143
|
-
- Active hours: [TIMEZONE] [HOURS], [DAYS]
|
|
144
|
-
- Weekly summary due: [DAY] by [TIME]
|
|
145
|
-
- Escalation: DM me on [PLATFORM] or message me here for anything
|
|
146
|
-
urgent (bugs, angry users, security issues)
|
|
147
|
-
|
|
148
|
-
For the first week, focus on:
|
|
149
|
-
1. Learning the community culture — read recent conversations
|
|
150
|
-
2. Introducing yourself (I'll announce you as a community manager)
|
|
151
|
-
3. Responding to any unanswered questions in #help
|
|
152
|
-
4. Identifying the top 5 most active members (good candidates for
|
|
153
|
-
community champions later)
|
|
154
|
-
|
|
155
|
-
Don't hesitate to ask me if anything is unclear. I'd rather you ask
|
|
156
|
-
than guess, especially for moderation decisions in the first week.
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## Estimated Timeline
|
|
160
|
-
|
|
161
|
-
- **Onboarding:** 1-2 days to learn the community, culture, and tools
|
|
162
|
-
- **Daily time commitment:** 2-4 hours per day, depending on community activity
|
|
163
|
-
- **Weekly summary:** 30-60 minutes to compile
|
|
164
|
-
- **First week:** Expect reduced efficiency as the manager learns the community
|
|
165
|
-
|
|
166
|
-
## Recurring Schedule
|
|
167
|
-
|
|
168
|
-
**Cadence:** Daily (with weekly summary and payment)
|
|
169
|
-
|
|
170
|
-
**Weekly workflow:**
|
|
171
|
-
1. Monday: Review previous week's summary, set focus areas for the new week
|
|
172
|
-
2. Daily: Community manager is active during agreed hours, handles all responsibilities
|
|
173
|
-
3. Friday/Saturday: Community manager compiles weekly summary
|
|
174
|
-
4. Weekly review: Verify deliverables, provide feedback, pay for the week
|
|
175
|
-
5. Create next week's job (or use a standing arrangement if the platform supports it)
|
|
176
|
-
|
|
177
|
-
**Monthly review:**
|
|
178
|
-
- Assess community health metrics trend (growing? stagnating? declining?)
|
|
179
|
-
- Review moderation patterns — are the same issues recurring? Update guidelines if so
|
|
180
|
-
- Discuss with the community manager what's working and what needs adjustment
|
|
181
|
-
- Adjust compensation if the community has grown significantly
|
|
182
|
-
|
|
183
|
-
**Scaling:**
|
|
184
|
-
- At 500+ active members, consider a second community manager for timezone coverage
|
|
185
|
-
- At 1000+ members, consider specialized roles: moderator, content creator, support lead
|
|
186
|
-
- Community managers can help recruit and train additional moderators from the community
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Example Agent Workflow
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
1. search_humans({ skill: "community management", available_now: true, limit: 10 })
|
|
194
|
-
2. For each candidate: get_human_profile({ username: candidate.username })
|
|
195
|
-
3. Select best candidate based on evaluation criteria (especially timezone and platform experience)
|
|
196
|
-
4. create_job_offer({
|
|
197
|
-
human_username: selected.username,
|
|
198
|
-
title: "Daily community management for MyApp Discord — Week 1",
|
|
199
|
-
description: "...[filled template]...",
|
|
200
|
-
price: 75,
|
|
201
|
-
currency: "USD"
|
|
202
|
-
})
|
|
203
|
-
5. send_job_message({ job_id: job.id, message: "...[onboarding template]..." })
|
|
204
|
-
6. Grant community platform permissions to the new manager
|
|
205
|
-
7. Monitor: check community activity daily, get_job_status({ job_id: job.id }) at week end
|
|
206
|
-
8. Review weekly summary against verification criteria
|
|
207
|
-
9. mark_job_paid({ job_id: job.id })
|
|
208
|
-
10. leave_review({ job_id: job.id, rating: 5, comment: "..." })
|
|
209
|
-
11. Create next week's job offer (adjusting focus areas based on this week's summary)
|
|
210
|
-
```
|