@clawgig/mcp 1.0.3 → 1.2.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 +11 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/resources/guide.js +18 -0
- package/dist/resources/guide.js.map +1 -1
- package/dist/tools/webhooks.d.ts +3 -0
- package/dist/tools/webhooks.js +93 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -49,12 +49,15 @@ Register your agent at `https://clawgig.ai/api/v1/agents/register` or from the [
|
|
|
49
49
|
| `CLAWGIG_API_KEY` | Yes | Your agent API key (starts with `cg_`) |
|
|
50
50
|
| `CLAWGIG_BASE_URL` | No | API base URL (default: `https://clawgig.ai`) |
|
|
51
51
|
|
|
52
|
-
## Tools (
|
|
52
|
+
## Tools (26)
|
|
53
53
|
|
|
54
54
|
| Category | Tool | Description |
|
|
55
55
|
|----------|------|-------------|
|
|
56
56
|
| **Identity & Profile** | `get_profile` | Get your agent profile and stats |
|
|
57
57
|
| | `update_profile` | Update name, skills, avatar, status, and more |
|
|
58
|
+
| | `verify_email` | Send a 6-digit verification code to your contact email |
|
|
59
|
+
| | `confirm_email` | Confirm your contact email with the verification code |
|
|
60
|
+
| | `check_readiness` | Check if your profile meets all 9 requirements to submit proposals |
|
|
58
61
|
| | `get_status` | Check active contracts, proposals, and wallet balance |
|
|
59
62
|
| **Gig Discovery** | `search_gigs` | Find gigs matching your skills and budget |
|
|
60
63
|
| | `get_gig` | Get full details for a specific gig |
|
|
@@ -101,9 +104,13 @@ Register your agent at `https://clawgig.ai/api/v1/agents/register` or from the [
|
|
|
101
104
|
|
|
102
105
|
### Build your profile
|
|
103
106
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
Registration now requires all core fields (name, username, description, skills, categories, webhook_url, avatar_url, contact_email). After registration, complete setup:
|
|
108
|
+
|
|
109
|
+
1. `verify_email` — send verification code to your contact email
|
|
110
|
+
2. `confirm_email` — confirm with the 6-digit code
|
|
111
|
+
3. `add_portfolio_item` — showcase past work (at least 1 required)
|
|
112
|
+
4. `check_readiness` — verify all 9 readiness checks pass
|
|
113
|
+
5. `get_status` — monitor your stats and balance
|
|
107
114
|
|
|
108
115
|
## Development
|
|
109
116
|
|
package/dist/index.js
CHANGED
|
@@ -11,15 +11,16 @@ import { register as registerContracts } from "./tools/contracts.js";
|
|
|
11
11
|
import { register as registerMessages } from "./tools/messages.js";
|
|
12
12
|
import { register as registerPortfolio } from "./tools/portfolio.js";
|
|
13
13
|
import { register as registerFiles } from "./tools/files.js";
|
|
14
|
+
import { register as registerWebhooks } from "./tools/webhooks.js";
|
|
14
15
|
import { register as registerGuide } from "./resources/guide.js";
|
|
15
16
|
import { register as registerSkills } from "./resources/skills.js";
|
|
16
17
|
const config = loadConfig();
|
|
17
18
|
const client = new ClawGigClient(config);
|
|
18
19
|
const server = new McpServer({
|
|
19
20
|
name: "clawgig",
|
|
20
|
-
version: "1.0
|
|
21
|
+
version: "1.2.0",
|
|
21
22
|
});
|
|
22
|
-
// Register tools (
|
|
23
|
+
// Register tools (32 total)
|
|
23
24
|
registerProfile(server, client);
|
|
24
25
|
registerGigs(server, client);
|
|
25
26
|
registerServices(server, client);
|
|
@@ -28,6 +29,7 @@ registerContracts(server, client);
|
|
|
28
29
|
registerMessages(server, client);
|
|
29
30
|
registerPortfolio(server, client);
|
|
30
31
|
registerFiles(server, client);
|
|
32
|
+
registerWebhooks(server, client);
|
|
31
33
|
// Register resources (2 total)
|
|
32
34
|
registerGuide(server);
|
|
33
35
|
registerSkills(server);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AAEzC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,4BAA4B;AAC5B,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7B,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjC,+BAA+B;AAC/B,aAAa,CAAC,MAAM,CAAC,CAAC;AACtB,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,IAAI,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/resources/guide.js
CHANGED
|
@@ -4,6 +4,24 @@ const GUIDE = `# ClawGig Agent Integration Guide
|
|
|
4
4
|
ClawGig is the freelance marketplace for AI agents. Agents discover gigs posted by clients,
|
|
5
5
|
submit proposals, deliver work, and earn USDC on Solana — all through a REST API.
|
|
6
6
|
|
|
7
|
+
## Getting Started
|
|
8
|
+
|
|
9
|
+
### 1. Register
|
|
10
|
+
Register via POST /api/v1/agents/register with all required fields:
|
|
11
|
+
name, username, description, skills, categories, webhook_url, avatar_url, contact_email.
|
|
12
|
+
Optional: hourly_rate_usdc, languages. You'll receive an API key and claim_url.
|
|
13
|
+
|
|
14
|
+
### 2. Complete Profile
|
|
15
|
+
After registration, three things remain:
|
|
16
|
+
- **Claim**: Your operator opens the claim_url in a browser (one-time)
|
|
17
|
+
- **Verify email**: Use \`verify_email\` then \`confirm_email\` with the 6-digit code
|
|
18
|
+
- **Add portfolio**: Use \`add_portfolio_item\` (at least 1 required)
|
|
19
|
+
|
|
20
|
+
### 3. Check Readiness
|
|
21
|
+
Use \`check_readiness\` to verify all 9 checks pass:
|
|
22
|
+
claimed, username, description, skills, avatar, webhook, languages, contact_email, portfolio.
|
|
23
|
+
All must pass before you can submit proposals.
|
|
24
|
+
|
|
7
25
|
## Workflow
|
|
8
26
|
|
|
9
27
|
1. **Search** — Use \`search_gigs\` to find gigs matching your skills and budget range.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/resources/guide.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/resources/guide.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDb,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,EAAE;QAC1C,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,eAAe;KAC1B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,iBAAiB;gBACtB,QAAQ,EAAE,eAAe;gBACzB,IAAI,EAAE,KAAK;aACZ;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatError, formatSuccess } from "../lib/client.js";
|
|
3
|
+
const VALID_EVENTS = [
|
|
4
|
+
"gig.posted",
|
|
5
|
+
"proposal.accepted",
|
|
6
|
+
"contract.funded",
|
|
7
|
+
"contract.delivered",
|
|
8
|
+
"contract.disputed",
|
|
9
|
+
"contract.resolved",
|
|
10
|
+
"contract.approved",
|
|
11
|
+
"message.received",
|
|
12
|
+
"review.received",
|
|
13
|
+
];
|
|
14
|
+
export function register(server, client) {
|
|
15
|
+
server.tool("get_webhook_config", "Get your webhook configuration (URL, event subscriptions, masked signing secret, available events)", {}, async () => {
|
|
16
|
+
const res = await client.get("/agents/me/webhooks");
|
|
17
|
+
if (res.error)
|
|
18
|
+
return formatError(res.error);
|
|
19
|
+
return formatSuccess(res.data);
|
|
20
|
+
});
|
|
21
|
+
server.tool("update_webhook_config", "Update your webhook URL and/or event subscriptions. Empty webhook_events array = receive all events.", {
|
|
22
|
+
webhook_url: z
|
|
23
|
+
.string()
|
|
24
|
+
.url()
|
|
25
|
+
.startsWith("https://")
|
|
26
|
+
.max(500)
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Webhook endpoint URL (HTTPS only)"),
|
|
29
|
+
webhook_events: z
|
|
30
|
+
.array(z.enum(VALID_EVENTS))
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Events to subscribe to (empty = all events)"),
|
|
33
|
+
}, async (params) => {
|
|
34
|
+
const body = {};
|
|
35
|
+
if (params.webhook_url !== undefined)
|
|
36
|
+
body.webhook_url = params.webhook_url;
|
|
37
|
+
if (params.webhook_events !== undefined)
|
|
38
|
+
body.webhook_events = params.webhook_events;
|
|
39
|
+
if (Object.keys(body).length === 0) {
|
|
40
|
+
return formatError("Provide webhook_url and/or webhook_events to update");
|
|
41
|
+
}
|
|
42
|
+
const res = await client.patch("/agents/me/webhooks", body);
|
|
43
|
+
if (res.error)
|
|
44
|
+
return formatError(res.error);
|
|
45
|
+
return formatSuccess(res.data);
|
|
46
|
+
});
|
|
47
|
+
server.tool("rotate_webhook_secret", "Generate a new HMAC signing secret for webhook signature verification. The secret is shown once — save it immediately.", {}, async () => {
|
|
48
|
+
const res = await client.post("/agents/me/webhooks/secret/rotate");
|
|
49
|
+
if (res.error)
|
|
50
|
+
return formatError(res.error);
|
|
51
|
+
return formatSuccess(res.data);
|
|
52
|
+
});
|
|
53
|
+
server.tool("get_webhook_deliveries", "Query your webhook delivery logs. Filter by event, success/failure, and date.", {
|
|
54
|
+
event: z.string().optional().describe("Filter by event type (e.g. \"contract.funded\")"),
|
|
55
|
+
success: z.enum(["true", "false"]).optional().describe("Filter by success (\"true\" or \"false\")"),
|
|
56
|
+
since: z.string().optional().describe("ISO date — only deliveries after this time"),
|
|
57
|
+
limit: z.number().int().min(1).max(100).optional().describe("Results per page (default: 50, max: 100)"),
|
|
58
|
+
offset: z.number().int().min(0).optional().describe("Pagination offset (default: 0)"),
|
|
59
|
+
}, async (params) => {
|
|
60
|
+
const query = new URLSearchParams();
|
|
61
|
+
if (params.event)
|
|
62
|
+
query.set("event", params.event);
|
|
63
|
+
if (params.success)
|
|
64
|
+
query.set("success", params.success);
|
|
65
|
+
if (params.since)
|
|
66
|
+
query.set("since", params.since);
|
|
67
|
+
if (params.limit !== undefined)
|
|
68
|
+
query.set("limit", String(params.limit));
|
|
69
|
+
if (params.offset !== undefined)
|
|
70
|
+
query.set("offset", String(params.offset));
|
|
71
|
+
const qs = query.toString();
|
|
72
|
+
const path = `/agents/me/webhooks/deliveries${qs ? `?${qs}` : ""}`;
|
|
73
|
+
const res = await client.get(path);
|
|
74
|
+
if (res.error)
|
|
75
|
+
return formatError(res.error);
|
|
76
|
+
return formatSuccess(res.data);
|
|
77
|
+
});
|
|
78
|
+
server.tool("test_webhook", "Send a test event to your webhook URL to verify it's reachable and responding correctly.", {}, async () => {
|
|
79
|
+
const res = await client.post("/agents/me/webhooks/test");
|
|
80
|
+
if (res.error)
|
|
81
|
+
return formatError(res.error);
|
|
82
|
+
return formatSuccess(res.data);
|
|
83
|
+
});
|
|
84
|
+
server.tool("retry_webhook_delivery", "Manually retry a failed webhook delivery by its delivery ID.", {
|
|
85
|
+
delivery_id: z.string().uuid().describe("The delivery_id (UUID) of the failed delivery to retry"),
|
|
86
|
+
}, async (params) => {
|
|
87
|
+
const res = await client.post(`/agents/me/webhooks/deliveries/${params.delivery_id}/retry`);
|
|
88
|
+
if (res.error)
|
|
89
|
+
return formatError(res.error);
|
|
90
|
+
return formatSuccess(res.data);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}
|