@runhuman/mcp-server 2.0.6 → 2.0.7

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/.env.example CHANGED
@@ -1,12 +1,12 @@
1
- # Runhuman API Configuration
2
-
3
- # API Base URL
4
- # For local development, use http://localhost:3400
5
- # For production, use your deployed API URL
6
- RUNHUMAN_API_URL=http://localhost:3400
7
-
8
- # API Key
9
- # Get this from the API dashboard at http://localhost:3400/app.html
10
- # Or use the default test key below for local development
11
- # Format: qa_live_xxxxxxxxxxxxxxxxxxxxx
12
- RUNHUMAN_API_KEY=qa_live_test_key_for_demo_purposes_only_12345
1
+ # Runhuman API Configuration
2
+
3
+ # API Base URL
4
+ # For local development, use http://localhost:3400
5
+ # For production, use your deployed API URL
6
+ RUNHUMAN_API_URL=http://localhost:3400
7
+
8
+ # API Key
9
+ # Get this from the API dashboard at http://localhost:3400/app.html
10
+ # Or use the default test key below for local development
11
+ # Format: qa_live_xxxxxxxxxxxxxxxxxxxxx
12
+ RUNHUMAN_API_KEY=qa_live_test_key_for_demo_purposes_only_12345
package/README.md CHANGED
@@ -1,243 +1,243 @@
1
- # Runhuman MCP Server
2
-
3
- A Model Context Protocol (MCP) server that allows AI agents to interact with the Runhuman QA testing service.
4
-
5
- ## Overview
6
-
7
- This MCP server provides tools for creating and managing human QA jobs through the Runhuman API. AI agents can use this server to:
8
-
9
- - Create new QA jobs with custom schemas
10
- - Check the status of running jobs
11
- - Retrieve completed job results
12
-
13
- ## Installation
14
-
15
- ### For Claude Desktop (Recommended)
16
-
17
- 1. Get your API key at: https://runhuman.com/dashboard/api-keys
18
-
19
- 2. Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on Mac):
20
-
21
- ```json
22
- {
23
- "mcpServers": {
24
- "runhuman": {
25
- "command": "npx",
26
- "args": ["-y", "@runhuman/mcp-server", "--api-key=qa_live_xxxxxxxxxxxxx"]
27
- }
28
- }
29
- }
30
- ```
31
-
32
- 3. Restart Claude Desktop
33
-
34
- That's it! The server will be automatically downloaded and run by Claude.
35
-
36
- ### For Development
37
-
38
- From the monorepo root:
39
-
40
- ```bash
41
- npm install
42
- npm run build --workspace=@runhuman/mcp-server
43
-
44
- # Run with API key
45
- node packages/mcp-server/dist/index.js --api-key=qa_live_xxxxx
46
- ```
47
-
48
- ### Available Tools
49
-
50
- #### `create_job`
51
- Create a new QA job with human testers.
52
-
53
- **Parameters:**
54
- - `url` (string): The URL to test
55
- - `description` (string): Instructions for the human tester describing what to test
56
- - `schema` (object): Expected result schema that the tester response will be extracted into
57
- - `targetDurationMinutes` (number, optional): Time limit for tester (default: 5, range: 1-60)
58
-
59
- #### `wait_for_result`
60
- Check status, wait, and retrieve results for a QA job in a single convenient call.
61
-
62
- **Parameters:**
63
- - `jobId` (string): The ID of the job to check
64
- - `waitSeconds` (number, optional): How long to wait before checking again (default: 30, range: 1-300)
65
-
66
- **Behavior:**
67
- - Checks status BEFORE waiting (returns immediately if already complete)
68
- - Waits for the specified duration
69
- - Checks status AFTER waiting
70
- - Returns results if complete, otherwise suggests calling again with longer wait time
71
-
72
- **Usage Pattern:**
73
- ```javascript
74
- // After creating a job, call repeatedly with increasing wait times:
75
- let result = await wait_for_result(jobId, { waitSeconds: 30 });
76
- if (result.status !== 'completed') {
77
- result = await wait_for_result(jobId, { waitSeconds: 45 });
78
- }
79
- if (result.status !== 'completed') {
80
- result = await wait_for_result(jobId, { waitSeconds: 60 });
81
- }
82
- ```
83
-
84
- **Returns:**
85
- - `result`: Structured test results extracted from tester's response
86
- - `status`: Job status (completed, failed, timeout, pending, claimed, in_progress)
87
- - `costUsd`: Exact cost in USD with full precision (e.g., 0.396)
88
- - `testDurationSeconds`: Time spent by tester in seconds (rounded up)
89
- - `testerResponse`: Raw natural language feedback from the human tester
90
- - `testerAlias`: Anonymized tester name (e.g., "Tester Alpha")
91
- - `testerAvatarUrl`: Avatar image URL for UI display
92
- - `testerColor`: Hex color code for theming (e.g., "#4A90E2")
93
- - Additional metadata (timestamps, etc.)
94
-
95
- **Cost Calculation:**
96
- - Costs are calculated as: `duration × $0.0018/second` (general-use tier)
97
- - Duration is always rounded UP using Math.ceil (any partial second counts)
98
- - Costs are never $0 unless the tester never actually worked on it
99
- - Full precision maintained (not rounded to cents)
100
-
101
- ## Configuration
102
-
103
- The MCP server needs to be configured with your Runhuman API credentials.
104
-
105
- ### 1. Get an API Key
106
-
107
- **Option A: Via Dashboard**
108
- 1. Start the API server: `npm run dev --workspace=@runhuman/api`
109
- 2. Open http://localhost:3400/api-keys
110
- 3. Click "Create API Key"
111
- 4. Copy the key (starts with `qa_live_`)
112
-
113
- **Option B: Use Default Test Key**
114
- - For local development, you can use: `qa_live_test_key_123`
115
- - This key exists in `packages/api/data/api-keys.json`
116
-
117
- ### 2. Configure Environment Variables
118
-
119
- Create a `.env` file in the MCP server directory:
120
-
121
- ```bash
122
- # For local development
123
- RUNHUMAN_API_URL=http://localhost:3400
124
- RUNHUMAN_API_KEY=qa_live_test_key_123
125
-
126
- # For production
127
- RUNHUMAN_API_URL=https://api.runhuman.com
128
- RUNHUMAN_API_KEY=qa_live_xxxxxxxxxxxxxxxxxxxxx
129
- ```
130
-
131
- **Important:** Never commit `.env` files to git! They're already in `.gitignore`.
132
-
133
- ### 3. Verify Configuration
134
-
135
- Test your API key works:
136
-
137
- ```bash
138
- curl http://localhost:3400/api/jobs \
139
- -H "Authorization: Bearer qa_live_test_key_123" \
140
- -H "Content-Type: application/json" \
141
- -d '{"url":"https://example.com","description":"test","outputSchema":{}}'
142
- ```
143
-
144
- Should return a job ID if authentication works.
145
-
146
- For more details, see [docs/API-AUTHENTICATION.md](docs/API-AUTHENTICATION.md)
147
-
148
- ## Testing
149
-
150
- The MCP server includes automated tests to verify it's working correctly:
151
-
152
- ```bash
153
- # Build first
154
- npm run build --workspace=@runhuman/mcp-server
155
-
156
- # Run simple automated test
157
- npm run test --workspace=@runhuman/mcp-server
158
-
159
- # Or use the MCP Inspector (interactive testing)
160
- npm run test:inspector --workspace=@runhuman/mcp-server
161
- ```
162
-
163
- The test script will:
164
- 1. ✅ Initialize a connection to the MCP server
165
- 2. ✅ List all available tools (create_job, wait_for_result)
166
- 3. ✅ Test calling the create_job tool
167
-
168
- ### Expected Test Output
169
-
170
- ```
171
- ✅ Server initialized successfully
172
- ✅ Tools listed: create_job, wait_for_result
173
- ✅ create_job tool called successfully
174
- ```
175
-
176
- ## Development
177
-
178
- ```bash
179
- # Watch mode (auto-rebuild on changes)
180
- npm run dev --workspace=@runhuman/mcp-server
181
-
182
- # Build
183
- npm run build --workspace=@runhuman/mcp-server
184
-
185
- # Test after building
186
- npm run test --workspace=@runhuman/mcp-server
187
- ```
188
-
189
- ## Integration with Claude Desktop
190
-
191
- To use this MCP server with Claude Desktop, add it to your configuration:
192
-
193
- ```json
194
- {
195
- "mcpServers": {
196
- "runhuman": {
197
- "command": "node",
198
- "args": ["/path/to/qa-experiment/packages/mcp-server/dist/index.js"]
199
- }
200
- }
201
- }
202
- ```
203
-
204
- ## Example Usage
205
-
206
- Once connected to an AI agent (like Claude), the agent can use these tools naturally:
207
-
208
- **User:** "Can someone test my checkout page at https://myapp.com/checkout?"
209
-
210
- **Agent uses create_job:**
211
- ```
212
- ✅ Job created successfully!
213
- Job ID: job_abc123
214
- Status: pending
215
- ...
216
- ```
217
-
218
- **Agent calls wait_for_result repeatedly until complete:**
219
- ```
220
- ⏳ Job Status: in_progress
221
- Waited 30s, job not complete yet.
222
- 💡 Suggestion: Call wait_for_result again with waitSeconds: 45
223
- ```
224
-
225
- **Finally:**
226
- ```
227
- ✅ Test completed!
228
- Results Summary:
229
- - Checkout Flow: ✅ Working
230
- - Payment Processing: ✅ Successful
231
- ...
232
- ```
233
-
234
- ## Developer Documentation
235
-
236
- For developers working on this MCP server:
237
- - [docs/HOW-AGENTS-USE-MCP.md](docs/HOW-AGENTS-USE-MCP.md) - How AI agents discover and use MCP servers
238
- - [docs/TOOL-RESPONSE-BEST-PRACTICES.md](docs/TOOL-RESPONSE-BEST-PRACTICES.md) - Best practices for tool responses
239
-
240
- ## Learn More
241
-
242
- - [Model Context Protocol Documentation](https://modelcontextprotocol.io/)
243
- - [Runhuman API Documentation](../api/README.md)
1
+ # Runhuman MCP Server
2
+
3
+ A Model Context Protocol (MCP) server that allows AI agents to interact with the Runhuman QA testing service.
4
+
5
+ ## Overview
6
+
7
+ This MCP server provides tools for creating and managing human QA jobs through the Runhuman API. AI agents can use this server to:
8
+
9
+ - Create new QA jobs with custom schemas
10
+ - Check the status of running jobs
11
+ - Retrieve completed job results
12
+
13
+ ## Installation
14
+
15
+ ### For Claude Desktop (Recommended)
16
+
17
+ 1. Get your API key at: https://runhuman.com/dashboard/api-keys
18
+
19
+ 2. Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on Mac):
20
+
21
+ ```json
22
+ {
23
+ "mcpServers": {
24
+ "runhuman": {
25
+ "command": "npx",
26
+ "args": ["-y", "@runhuman/mcp-server", "--api-key=qa_live_xxxxxxxxxxxxx"]
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ 3. Restart Claude Desktop
33
+
34
+ That's it! The server will be automatically downloaded and run by Claude.
35
+
36
+ ### For Development
37
+
38
+ From the monorepo root:
39
+
40
+ ```bash
41
+ npm install
42
+ npm run build --workspace=@runhuman/mcp-server
43
+
44
+ # Run with API key
45
+ node packages/mcp-server/dist/index.js --api-key=qa_live_xxxxx
46
+ ```
47
+
48
+ ### Available Tools
49
+
50
+ #### `create_job`
51
+ Create a new QA job with human testers.
52
+
53
+ **Parameters:**
54
+ - `url` (string): The URL to test
55
+ - `description` (string): Instructions for the human tester describing what to test
56
+ - `schema` (object): Expected result schema that the tester response will be extracted into
57
+ - `targetDurationMinutes` (number, optional): Time limit for tester (default: 5, range: 1-60)
58
+
59
+ #### `wait_for_result`
60
+ Check status, wait, and retrieve results for a QA job in a single convenient call.
61
+
62
+ **Parameters:**
63
+ - `jobId` (string): The ID of the job to check
64
+ - `waitSeconds` (number, optional): How long to wait before checking again (default: 30, range: 1-300)
65
+
66
+ **Behavior:**
67
+ - Checks status BEFORE waiting (returns immediately if already complete)
68
+ - Waits for the specified duration
69
+ - Checks status AFTER waiting
70
+ - Returns results if complete, otherwise suggests calling again with longer wait time
71
+
72
+ **Usage Pattern:**
73
+ ```javascript
74
+ // After creating a job, call repeatedly with increasing wait times:
75
+ let result = await wait_for_result(jobId, { waitSeconds: 30 });
76
+ if (result.status !== 'completed') {
77
+ result = await wait_for_result(jobId, { waitSeconds: 45 });
78
+ }
79
+ if (result.status !== 'completed') {
80
+ result = await wait_for_result(jobId, { waitSeconds: 60 });
81
+ }
82
+ ```
83
+
84
+ **Returns:**
85
+ - `result`: Structured test results extracted from tester's response
86
+ - `status`: Job status (completed, failed, timeout, pending, claimed, in_progress)
87
+ - `costUsd`: Exact cost in USD with full precision (e.g., 0.396)
88
+ - `testDurationSeconds`: Time spent by tester in seconds (rounded up)
89
+ - `testerResponse`: Raw natural language feedback from the human tester
90
+ - `testerAlias`: Anonymized tester name (e.g., "Tester Alpha")
91
+ - `testerAvatarUrl`: Avatar image URL for UI display
92
+ - `testerColor`: Hex color code for theming (e.g., "#4A90E2")
93
+ - Additional metadata (timestamps, etc.)
94
+
95
+ **Cost Calculation:**
96
+ - Costs are calculated as: `duration × $0.0018/second` (general-use tier)
97
+ - Duration is always rounded UP using Math.ceil (any partial second counts)
98
+ - Costs are never $0 unless the tester never actually worked on it
99
+ - Full precision maintained (not rounded to cents)
100
+
101
+ ## Configuration
102
+
103
+ The MCP server needs to be configured with your Runhuman API credentials.
104
+
105
+ ### 1. Get an API Key
106
+
107
+ **Option A: Via Dashboard**
108
+ 1. Start the API server: `npm run dev --workspace=@runhuman/api`
109
+ 2. Open http://localhost:3400/api-keys
110
+ 3. Click "Create API Key"
111
+ 4. Copy the key (starts with `qa_live_`)
112
+
113
+ **Option B: Use Default Test Key**
114
+ - For local development, you can use: `qa_live_test_key_123`
115
+ - This key exists in `packages/api/data/api-keys.json`
116
+
117
+ ### 2. Configure Environment Variables
118
+
119
+ Create a `.env` file in the MCP server directory:
120
+
121
+ ```bash
122
+ # For local development
123
+ RUNHUMAN_API_URL=http://localhost:3400
124
+ RUNHUMAN_API_KEY=qa_live_test_key_123
125
+
126
+ # For production
127
+ RUNHUMAN_API_URL=https://api.runhuman.com
128
+ RUNHUMAN_API_KEY=qa_live_xxxxxxxxxxxxxxxxxxxxx
129
+ ```
130
+
131
+ **Important:** Never commit `.env` files to git! They're already in `.gitignore`.
132
+
133
+ ### 3. Verify Configuration
134
+
135
+ Test your API key works:
136
+
137
+ ```bash
138
+ curl http://localhost:3400/api/jobs \
139
+ -H "Authorization: Bearer qa_live_test_key_123" \
140
+ -H "Content-Type: application/json" \
141
+ -d '{"url":"https://example.com","description":"test","outputSchema":{}}'
142
+ ```
143
+
144
+ Should return a job ID if authentication works.
145
+
146
+ For more details, see [docs/API-AUTHENTICATION.md](docs/API-AUTHENTICATION.md)
147
+
148
+ ## Testing
149
+
150
+ The MCP server includes automated tests to verify it's working correctly:
151
+
152
+ ```bash
153
+ # Build first
154
+ npm run build --workspace=@runhuman/mcp-server
155
+
156
+ # Run simple automated test
157
+ npm run test --workspace=@runhuman/mcp-server
158
+
159
+ # Or use the MCP Inspector (interactive testing)
160
+ npm run test:inspector --workspace=@runhuman/mcp-server
161
+ ```
162
+
163
+ The test script will:
164
+ 1. ✅ Initialize a connection to the MCP server
165
+ 2. ✅ List all available tools (create_job, wait_for_result)
166
+ 3. ✅ Test calling the create_job tool
167
+
168
+ ### Expected Test Output
169
+
170
+ ```
171
+ ✅ Server initialized successfully
172
+ ✅ Tools listed: create_job, wait_for_result
173
+ ✅ create_job tool called successfully
174
+ ```
175
+
176
+ ## Development
177
+
178
+ ```bash
179
+ # Watch mode (auto-rebuild on changes)
180
+ npm run dev --workspace=@runhuman/mcp-server
181
+
182
+ # Build
183
+ npm run build --workspace=@runhuman/mcp-server
184
+
185
+ # Test after building
186
+ npm run test --workspace=@runhuman/mcp-server
187
+ ```
188
+
189
+ ## Integration with Claude Desktop
190
+
191
+ To use this MCP server with Claude Desktop, add it to your configuration:
192
+
193
+ ```json
194
+ {
195
+ "mcpServers": {
196
+ "runhuman": {
197
+ "command": "node",
198
+ "args": ["/path/to/qa-experiment/packages/mcp-server/dist/index.js"]
199
+ }
200
+ }
201
+ }
202
+ ```
203
+
204
+ ## Example Usage
205
+
206
+ Once connected to an AI agent (like Claude), the agent can use these tools naturally:
207
+
208
+ **User:** "Can someone test my checkout page at https://myapp.com/checkout?"
209
+
210
+ **Agent uses create_job:**
211
+ ```
212
+ ✅ Job created successfully!
213
+ Job ID: job_abc123
214
+ Status: pending
215
+ ...
216
+ ```
217
+
218
+ **Agent calls wait_for_result repeatedly until complete:**
219
+ ```
220
+ ⏳ Job Status: in_progress
221
+ Waited 30s, job not complete yet.
222
+ 💡 Suggestion: Call wait_for_result again with waitSeconds: 45
223
+ ```
224
+
225
+ **Finally:**
226
+ ```
227
+ ✅ Test completed!
228
+ Results Summary:
229
+ - Checkout Flow: ✅ Working
230
+ - Payment Processing: ✅ Successful
231
+ ...
232
+ ```
233
+
234
+ ## Developer Documentation
235
+
236
+ For developers working on this MCP server:
237
+ - [docs/HOW-AGENTS-USE-MCP.md](docs/HOW-AGENTS-USE-MCP.md) - How AI agents discover and use MCP servers
238
+ - [docs/TOOL-RESPONSE-BEST-PRACTICES.md](docs/TOOL-RESPONSE-BEST-PRACTICES.md) - Best practices for tool responses
239
+
240
+ ## Learn More
241
+
242
+ - [Model Context Protocol Documentation](https://modelcontextprotocol.io/)
243
+ - [Runhuman API Documentation](../api/README.md)
package/dist/index.js CHANGED
File without changes
@@ -3,22 +3,22 @@
3
3
  */
4
4
  export const createJobToolDefinition = {
5
5
  name: 'create_job',
6
- description: `IMPORTANT: This ONLY creates and queues a job. It does NOT perform the test or return results. You MUST follow up with wait_for_result.
7
-
8
- Creates a QA job that will be performed by a REAL HUMAN tester (not AI). The human will manually test your application, describe findings in natural language, and GPT-4o will extract structured data from their response.
9
-
10
- Use this when you need human verification of:
11
- - UI/UX functionality that's hard to automate
12
- - Visual issues, accessibility problems
13
- - Complex user flows (login, checkout, forms)
14
- - Cross-browser compatibility
15
- - Real user experience feedback
16
-
17
- REQUIRED WORKFLOW (do NOT skip steps):
18
- 1. create_job → Returns jobId (job is now QUEUED, not complete!)
19
- 2. wait_for_result → Checks status, waits, and retrieves results (takes 2-10 min total)
20
- 3. If not complete, call wait_for_result again with longer wait time
21
-
6
+ description: `IMPORTANT: This ONLY creates and queues a job. It does NOT perform the test or return results. You MUST follow up with wait_for_result.
7
+
8
+ Creates a QA job that will be performed by a REAL HUMAN tester (not AI). The human will manually test your application, describe findings in natural language, and GPT-4o will extract structured data from their response.
9
+
10
+ Use this when you need human verification of:
11
+ - UI/UX functionality that's hard to automate
12
+ - Visual issues, accessibility problems
13
+ - Complex user flows (login, checkout, forms)
14
+ - Cross-browser compatibility
15
+ - Real user experience feedback
16
+
17
+ REQUIRED WORKFLOW (do NOT skip steps):
18
+ 1. create_job → Returns jobId (job is now QUEUED, not complete!)
19
+ 2. wait_for_result → Checks status, waits, and retrieves results (takes 2-10 min total)
20
+ 3. If not complete, call wait_for_result again with longer wait time
21
+
22
22
  DO NOT treat job creation as completion. You MUST wait for and retrieve results.`,
23
23
  inputSchema: {
24
24
  type: 'object',
@@ -88,13 +88,13 @@ export async function handleCreateJob(args, config) {
88
88
  return {
89
89
  content: [{
90
90
  type: 'text',
91
- text: `Insufficient Credits
92
-
93
- The user's account doesn't have enough credits to run this test.
94
-
95
- IMPORTANT: Tell the user they need to purchase more credits by visiting this link:
96
- ${manageLink}
97
-
91
+ text: `Insufficient Credits
92
+
93
+ The user's account doesn't have enough credits to run this test.
94
+
95
+ IMPORTANT: Tell the user they need to purchase more credits by visiting this link:
96
+ ${manageLink}
97
+
98
98
  Do not attempt to retry this tool until the user confirms they have added credits.`,
99
99
  }],
100
100
  isError: true,
@@ -103,14 +103,14 @@ Do not attempt to retry this tool until the user confirms they have added credit
103
103
  return {
104
104
  content: [{
105
105
  type: 'text',
106
- text: `Failed to create job
107
-
108
- Error: ${error.error || error.message || response.statusText}
109
- Status: ${response.status}
110
-
111
- Please check:
112
- - Your RUNHUMAN_API_KEY is valid
113
- - The API server is running at ${apiUrl}
106
+ text: `Failed to create job
107
+
108
+ Error: ${error.error || error.message || response.statusText}
109
+ Status: ${response.status}
110
+
111
+ Please check:
112
+ - Your RUNHUMAN_API_KEY is valid
113
+ - The API server is running at ${apiUrl}
114
114
  - Your API key has permission to create jobs`,
115
115
  }],
116
116
  isError: true,
@@ -121,22 +121,22 @@ Please check:
121
121
  return {
122
122
  content: [{
123
123
  type: 'text',
124
- text: `Job QUEUED (not complete yet!)
125
-
126
- Job ID: ${data.jobId}
127
- Status: ${data.status}
128
- URL: ${args.url}
129
- Time limit: ${duration} minutes
130
-
131
- The test has been queued for a HUMAN tester. It is NOT complete yet.
132
-
133
- REQUIRED NEXT STEPS:
134
- 1. Call wait_for_result(jobId: "${data.jobId}", waitSeconds: 30)
135
- 2. If not complete, call wait_for_result again with waitSeconds: 45
136
- 3. Continue with increasing wait times (60, 90, etc.) until complete
137
-
138
- Typical completion time: 2-10 minutes total.
139
-
124
+ text: `Job QUEUED (not complete yet!)
125
+
126
+ Job ID: ${data.jobId}
127
+ Status: ${data.status}
128
+ URL: ${args.url}
129
+ Time limit: ${duration} minutes
130
+
131
+ The test has been queued for a HUMAN tester. It is NOT complete yet.
132
+
133
+ REQUIRED NEXT STEPS:
134
+ 1. Call wait_for_result(jobId: "${data.jobId}", waitSeconds: 30)
135
+ 2. If not complete, call wait_for_result again with waitSeconds: 45
136
+ 3. Continue with increasing wait times (60, 90, etc.) until complete
137
+
138
+ Typical completion time: 2-10 minutes total.
139
+
140
140
  DO NOT consider this task done until you have retrieved the results!`,
141
141
  }],
142
142
  };
@@ -145,13 +145,13 @@ DO NOT consider this task done until you have retrieved the results!`,
145
145
  return {
146
146
  content: [{
147
147
  type: 'text',
148
- text: `Error creating job
149
-
150
- ${error instanceof Error ? error.message : 'Unknown error'}
151
-
152
- Please check:
153
- - The API server is running at ${apiUrl}
154
- - Your network connection
148
+ text: `Error creating job
149
+
150
+ ${error instanceof Error ? error.message : 'Unknown error'}
151
+
152
+ Please check:
153
+ - The API server is running at ${apiUrl}
154
+ - Your network connection
155
155
  - Your .env file configuration`,
156
156
  }],
157
157
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-result.tool.d.ts","sourceRoot":"","sources":["../../src/tools/wait-for-result.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAC;AAEnF,eAAO,MAAM,2BAA2B,EAAE,IAwCzC,CAAC;AAyFF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAiHhF"}
1
+ {"version":3,"file":"wait-for-result.tool.d.ts","sourceRoot":"","sources":["../../src/tools/wait-for-result.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAe,MAAM,aAAa,CAAC;AAEnF,eAAO,MAAM,2BAA2B,EAAE,IAwCzC,CAAC;AA6FF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAiHhF"}
@@ -3,27 +3,27 @@
3
3
  */
4
4
  export const waitForResultToolDefinition = {
5
5
  name: 'wait_for_result',
6
- description: `Check status, wait, and retrieve results for a QA job in a single call.
7
-
8
- This tool combines status checking, waiting, and result retrieval into one convenient function:
9
- - Checks status BEFORE waiting (returns immediately if already complete)
10
- - Polls status every 5 seconds during the wait period
11
- - Returns immediately when job completes (no need to wait full duration)
12
- - Returns results if complete, otherwise suggests calling again with longer wait
13
-
14
- Jobs progress through states: pending → waiting → working → completed (or incomplete/abandoned/error)
15
- - pending: Job is being prepared
16
- - waiting: Job posted to Slack, waiting for a tester to claim it
17
- - working: Tester has claimed the job and is actively testing
18
- - completed/incomplete/abandoned/error: Terminal states
19
-
20
- Typical completion time: 2-10 minutes total
21
-
22
- Use this tool repeatedly with increasing wait times until you get results:
23
- - First call: wait_for_result(jobId, { waitSeconds: 30 })
24
- - If not complete: wait_for_result(jobId, { waitSeconds: 45 })
25
- - If still not complete: wait_for_result(jobId, { waitSeconds: 60 })
26
-
6
+ description: `Check status, wait, and retrieve results for a QA job in a single call.
7
+
8
+ This tool combines status checking, waiting, and result retrieval into one convenient function:
9
+ - Checks status BEFORE waiting (returns immediately if already complete)
10
+ - Polls status every 5 seconds during the wait period
11
+ - Returns immediately when job completes (no need to wait full duration)
12
+ - Returns results if complete, otherwise suggests calling again with longer wait
13
+
14
+ Jobs progress through states: pending → waiting → working → completed (or incomplete/abandoned/error)
15
+ - pending: Job is being prepared
16
+ - waiting: Job posted to Slack, waiting for a tester to claim it
17
+ - working: Tester has claimed the job and is actively testing
18
+ - completed/incomplete/abandoned/error: Terminal states
19
+
20
+ Typical completion time: 2-10 minutes total
21
+
22
+ Use this tool repeatedly with increasing wait times until you get results:
23
+ - First call: wait_for_result(jobId, { waitSeconds: 30 })
24
+ - If not complete: wait_for_result(jobId, { waitSeconds: 45 })
25
+ - If still not complete: wait_for_result(jobId, { waitSeconds: 60 })
26
+
27
27
  Returns immediately if job is already complete (no waiting needed).`,
28
28
  inputSchema: {
29
29
  type: 'object',
@@ -61,10 +61,10 @@ function formatCompletedResult(job) {
61
61
  content: [
62
62
  {
63
63
  type: 'text',
64
- text: `Test completed!
65
-
66
- Job ID: ${job.id}
67
-
64
+ text: `Test completed!
65
+
66
+ Job ID: ${job.id}
67
+
68
68
  **Test Results:**`,
69
69
  },
70
70
  {
@@ -75,7 +75,11 @@ Job ID: ${job.id}
75
75
  testerAlias: job.testerAlias,
76
76
  testerAvatarUrl: job.testerAvatarUrl,
77
77
  testerColor: job.testerColor,
78
- testerData: job.testerData,
78
+ testerData: job.testerData ? {
79
+ testDurationSeconds: job.testerData.testDurationSeconds,
80
+ screenshots: job.testerData.screenshots,
81
+ videoUrl: job.testerData.videoUrl,
82
+ } : undefined,
79
83
  }, null, 2),
80
84
  },
81
85
  ],
@@ -85,11 +89,11 @@ function formatIncompleteResult(job) {
85
89
  return {
86
90
  content: [{
87
91
  type: 'text',
88
- text: `Test completed with incomplete data
89
-
90
- Job ID: ${job.id}
91
-
92
- The test was completed but some required data was missing or incomplete.
92
+ text: `Test completed with incomplete data
93
+
94
+ Job ID: ${job.id}
95
+
96
+ The test was completed but some required data was missing or incomplete.
93
97
  ${job.error ? `\nDetails: ${job.error}` : ''}`,
94
98
  }],
95
99
  isError: true,
@@ -99,11 +103,11 @@ function formatAbandonedResult(job) {
99
103
  return {
100
104
  content: [{
101
105
  type: 'text',
102
- text: `Test abandoned
103
-
104
- Job ID: ${job.id}
105
-
106
- The tester abandoned this test.
106
+ text: `Test abandoned
107
+
108
+ Job ID: ${job.id}
109
+
110
+ The tester abandoned this test.
107
111
  ${job.error ? `\nReason: ${job.error}` : ''}`,
108
112
  }],
109
113
  isError: true,
@@ -113,10 +117,10 @@ function formatErrorResult(job) {
113
117
  return {
114
118
  content: [{
115
119
  type: 'text',
116
- text: `Test failed due to system error
117
-
118
- Job ID: ${job.id}
119
-
120
+ text: `Test failed due to system error
121
+
122
+ Job ID: ${job.id}
123
+
120
124
  Error: ${job.error || 'Unknown error'}`,
121
125
  }],
122
126
  isError: true,
@@ -203,15 +207,15 @@ export async function handleWaitForResult(args, config) {
203
207
  return {
204
208
  content: [{
205
209
  type: 'text',
206
- text: `Job Status: ${job.status}
207
-
208
- Job ID: ${job.id}
209
-
210
- ${statusMessage}
211
-
212
- Waited ${waitSeconds}s (polling every ${pollIntervalSeconds}s), job not complete yet.
213
-
214
- Suggestion: Call wait_for_result again with waitSeconds: ${nextWait}
210
+ text: `Job Status: ${job.status}
211
+
212
+ Job ID: ${job.id}
213
+
214
+ ${statusMessage}
215
+
216
+ Waited ${waitSeconds}s (polling every ${pollIntervalSeconds}s), job not complete yet.
217
+
218
+ Suggestion: Call wait_for_result again with waitSeconds: ${nextWait}
215
219
  Typical completion time: 2-10 minutes total.`,
216
220
  }],
217
221
  };
@@ -220,8 +224,8 @@ Typical completion time: 2-10 minutes total.`,
220
224
  return {
221
225
  content: [{
222
226
  type: 'text',
223
- text: `Error waiting for result
224
-
227
+ text: `Error waiting for result
228
+
225
229
  ${error instanceof Error ? error.message : 'Unknown error'}`,
226
230
  }],
227
231
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-result.tool.js","sourceRoot":"","sources":["../../src/tools/wait-for-result.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wait-for-result.tool.js","sourceRoot":"","sources":["../../src/tools/wait-for-result.tool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,81 +1,81 @@
1
- {
2
- "name": "@runhuman/mcp-server",
3
- "version": "2.0.6",
4
- "description": "Model Context Protocol (MCP) server for Runhuman - Human-powered QA testing for AI agents",
5
- "main": "dist/lib.js",
6
- "type": "module",
7
- "exports": {
8
- ".": {
9
- "import": "./dist/lib.js",
10
- "require": "./dist/lib.js",
11
- "types": "./dist/lib.d.ts"
12
- },
13
- "./factory": {
14
- "import": "./dist/mcp-server-factory.js",
15
- "types": "./dist/mcp-server-factory.d.ts"
16
- },
17
- "./types": {
18
- "import": "./dist/types.js",
19
- "types": "./dist/types.d.ts"
20
- }
21
- },
22
- "bin": {
23
- "runhuman-mcp": "dist/index.js"
24
- },
25
- "files": [
26
- "dist",
27
- "README.md",
28
- ".env.example"
29
- ],
30
- "scripts": {
31
- "build": "tsc",
32
- "dev": "tsx watch src/index.ts",
33
- "dev-cli": "npx tsx dev-cli/index.ts",
34
- "start": "node dist/index.js",
35
- "prepublishOnly": "npm run build",
36
- "type-check": "tsc",
37
- "test": "node test-simple.cjs",
38
- "test:all": "node test-all-tools.cjs",
39
- "test:routes": "node test-route-fix.cjs",
40
- "test:endpoints": "node test-api-endpoints.cjs",
41
- "test:ci": "npm run test:endpoints && npm run test:routes",
42
- "test:inspector": "npx @modelcontextprotocol/inspector node dist/index.js"
43
- },
44
- "keywords": [
45
- "mcp",
46
- "model-context-protocol",
47
- "qa",
48
- "testing",
49
- "human-in-the-loop",
50
- "ai-agent",
51
- "claude",
52
- "anthropic",
53
- "qa-testing",
54
- "manual-testing"
55
- ],
56
- "author": "Runhuman <hey@runhuman.com>",
57
- "repository": {
58
- "type": "git",
59
- "url": "git+https://github.com/yueranyuan/qa-experiment.git",
60
- "directory": "packages/mcp-server"
61
- },
62
- "homepage": "https://runhuman.com",
63
- "bugs": {
64
- "url": "https://github.com/yueranyuan/qa-experiment/issues"
65
- },
66
- "license": "ISC",
67
- "engines": {
68
- "node": ">=18.0.0"
69
- },
70
- "dependencies": {
71
- "@modelcontextprotocol/sdk": "latest",
72
- "dotenv": "^17.2.3"
73
- },
74
- "devDependencies": {
75
- "@types/node": "^20.11.17",
76
- "chalk": "^5.6.2",
77
- "commander": "^12.1.0",
78
- "tsx": "^4.7.1",
79
- "typescript": "^5.3.3"
80
- }
81
- }
1
+ {
2
+ "name": "@runhuman/mcp-server",
3
+ "version": "2.0.7",
4
+ "description": "Model Context Protocol (MCP) server for Runhuman - Human-powered QA testing for AI agents",
5
+ "main": "dist/lib.js",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/lib.js",
10
+ "require": "./dist/lib.js",
11
+ "types": "./dist/lib.d.ts"
12
+ },
13
+ "./factory": {
14
+ "import": "./dist/mcp-server-factory.js",
15
+ "types": "./dist/mcp-server-factory.d.ts"
16
+ },
17
+ "./types": {
18
+ "import": "./dist/types.js",
19
+ "types": "./dist/types.d.ts"
20
+ }
21
+ },
22
+ "bin": {
23
+ "runhuman-mcp": "dist/index.js"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md",
28
+ ".env.example"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc",
32
+ "dev": "tsx watch src/index.ts",
33
+ "dev-cli": "npx tsx dev-cli/index.ts",
34
+ "start": "node dist/index.js",
35
+ "prepublishOnly": "npm run build",
36
+ "type-check": "tsc",
37
+ "test": "node test-simple.cjs",
38
+ "test:all": "node test-all-tools.cjs",
39
+ "test:routes": "node test-route-fix.cjs",
40
+ "test:endpoints": "node test-api-endpoints.cjs",
41
+ "test:ci": "npm run test:endpoints && npm run test:routes",
42
+ "test:inspector": "npx @modelcontextprotocol/inspector node dist/index.js"
43
+ },
44
+ "keywords": [
45
+ "mcp",
46
+ "model-context-protocol",
47
+ "qa",
48
+ "testing",
49
+ "human-in-the-loop",
50
+ "ai-agent",
51
+ "claude",
52
+ "anthropic",
53
+ "qa-testing",
54
+ "manual-testing"
55
+ ],
56
+ "author": "Runhuman <hey@runhuman.com>",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "git+https://github.com/yueranyuan/qa-experiment.git",
60
+ "directory": "packages/mcp-server"
61
+ },
62
+ "homepage": "https://runhuman.com",
63
+ "bugs": {
64
+ "url": "https://github.com/yueranyuan/qa-experiment/issues"
65
+ },
66
+ "license": "ISC",
67
+ "engines": {
68
+ "node": ">=18.0.0"
69
+ },
70
+ "dependencies": {
71
+ "@modelcontextprotocol/sdk": "latest",
72
+ "dotenv": "^17.2.3"
73
+ },
74
+ "devDependencies": {
75
+ "@types/node": "^20.11.17",
76
+ "chalk": "^5.6.2",
77
+ "commander": "^12.1.0",
78
+ "tsx": "^4.7.1",
79
+ "typescript": "^5.3.3"
80
+ }
81
+ }