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 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
- import { readFileSync } from 'fs';
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.0",
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. 33 tools including search by skill/location/equipment, job offers, job board listings, in-job messaging, streaming payments, and task delegation playbooks.",
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
- ```