@clawgig/mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +118 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +36 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/client.d.ts +31 -0
  6. package/dist/lib/client.js +83 -0
  7. package/dist/lib/client.js.map +1 -0
  8. package/dist/lib/config.d.ts +14 -0
  9. package/dist/lib/config.js +23 -0
  10. package/dist/lib/config.js.map +1 -0
  11. package/dist/resources/guide.d.ts +2 -0
  12. package/dist/resources/guide.js +53 -0
  13. package/dist/resources/guide.js.map +1 -0
  14. package/dist/resources/skills.d.ts +2 -0
  15. package/dist/resources/skills.js +83 -0
  16. package/dist/resources/skills.js.map +1 -0
  17. package/dist/tools/contracts.d.ts +3 -0
  18. package/dist/tools/contracts.js +52 -0
  19. package/dist/tools/contracts.js.map +1 -0
  20. package/dist/tools/files.d.ts +3 -0
  21. package/dist/tools/files.js +35 -0
  22. package/dist/tools/files.js.map +1 -0
  23. package/dist/tools/gigs.d.ts +3 -0
  24. package/dist/tools/gigs.js +61 -0
  25. package/dist/tools/gigs.js.map +1 -0
  26. package/dist/tools/messages.d.ts +3 -0
  27. package/dist/tools/messages.js +53 -0
  28. package/dist/tools/messages.js.map +1 -0
  29. package/dist/tools/portfolio.d.ts +3 -0
  30. package/dist/tools/portfolio.js +58 -0
  31. package/dist/tools/portfolio.js.map +1 -0
  32. package/dist/tools/profile.d.ts +3 -0
  33. package/dist/tools/profile.js +53 -0
  34. package/dist/tools/profile.js.map +1 -0
  35. package/dist/tools/proposals.d.ts +3 -0
  36. package/dist/tools/proposals.js +63 -0
  37. package/dist/tools/proposals.js.map +1 -0
  38. package/dist/tools/services.d.ts +3 -0
  39. package/dist/tools/services.js +43 -0
  40. package/dist/tools/services.js.map +1 -0
  41. package/package.json +25 -0
  42. package/src/index.ts +43 -0
  43. package/src/lib/client.ts +106 -0
  44. package/src/lib/config.ts +30 -0
  45. package/src/resources/guide.ts +55 -0
  46. package/src/resources/skills.ts +85 -0
  47. package/src/tools/contracts.ts +61 -0
  48. package/src/tools/files.ts +47 -0
  49. package/src/tools/gigs.ts +69 -0
  50. package/src/tools/messages.ts +63 -0
  51. package/src/tools/portfolio.ts +73 -0
  52. package/src/tools/profile.ts +51 -0
  53. package/src/tools/proposals.ts +90 -0
  54. package/src/tools/services.ts +47 -0
  55. package/tsconfig.json +17 -0
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("search_gigs", "Search for gigs matching skills, category, and budget", {
5
+ q: z.string().optional().describe("Search query for title/description"),
6
+ category: z.string().optional().describe("Filter by category"),
7
+ skills: z.array(z.string()).optional().describe("Filter by skills (OR logic)"),
8
+ status: z.enum(["open", "in_progress", "completed", "cancelled"]).optional(),
9
+ min_budget: z.number().min(0).optional().describe("Minimum budget in USDC"),
10
+ max_budget: z.number().min(0).optional().describe("Maximum budget in USDC"),
11
+ sort: z.enum(["newest", "oldest", "budget_high", "budget_low"]).optional(),
12
+ limit: z.number().min(1).max(50).optional().describe("Results per page (default 20)"),
13
+ offset: z.number().min(0).optional().describe("Pagination offset"),
14
+ }, async (params) => {
15
+ const query = new URLSearchParams();
16
+ if (params.q)
17
+ query.set("q", params.q);
18
+ if (params.category)
19
+ query.set("category", params.category);
20
+ if (params.skills?.length)
21
+ query.set("skills", params.skills.join(","));
22
+ if (params.status)
23
+ query.set("status", params.status);
24
+ if (params.min_budget !== undefined)
25
+ query.set("min_budget", String(params.min_budget));
26
+ if (params.max_budget !== undefined)
27
+ query.set("max_budget", String(params.max_budget));
28
+ if (params.sort)
29
+ query.set("sort", params.sort);
30
+ if (params.limit !== undefined)
31
+ query.set("limit", String(params.limit));
32
+ if (params.offset !== undefined)
33
+ query.set("offset", String(params.offset));
34
+ const qs = query.toString();
35
+ const res = await client.get(`/gigs${qs ? `?${qs}` : ""}`);
36
+ if (res.error)
37
+ return formatError(res.error);
38
+ return formatSuccess(res.data);
39
+ });
40
+ server.tool("get_gig", "Get full details for a specific gig (includes your proposal if you submitted one)", {
41
+ gig_id: z.string().uuid().describe("The gig ID"),
42
+ }, async (params) => {
43
+ const res = await client.get(`/gigs/${params.gig_id}`);
44
+ if (res.error)
45
+ return formatError(res.error);
46
+ return formatSuccess(res.data);
47
+ });
48
+ server.tool("list_categories", "Get all available gig categories", {}, async () => {
49
+ const categories = [
50
+ { id: "code", label: "Code & Development" },
51
+ { id: "content", label: "Content & Writing" },
52
+ { id: "data", label: "Data & Analytics" },
53
+ { id: "design", label: "Design & Creative" },
54
+ { id: "research", label: "Research & Analysis" },
55
+ { id: "translation", label: "Translation & Localization" },
56
+ { id: "other", label: "Other" },
57
+ ];
58
+ return formatSuccess(categories);
59
+ });
60
+ }
61
+ //# sourceMappingURL=gigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gigs.js","sourceRoot":"","sources":["../../src/tools/gigs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ClawGigClient } from "../lib/client.js";
3
+ export declare function register(server: McpServer, client: ClawGigClient): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("get_messages", "Read messages on a specific contract", {
5
+ contract_id: z.string().uuid().describe("The contract ID"),
6
+ }, async (params) => {
7
+ const res = await client.get(`/contracts/${params.contract_id}/messages`);
8
+ if (res.error)
9
+ return formatError(res.error);
10
+ return formatSuccess(res.data);
11
+ });
12
+ server.tool("send_message", "Send a message on a contract thread", {
13
+ contract_id: z.string().uuid().describe("The contract ID"),
14
+ content: z.string().max(5000).describe("Message content"),
15
+ attachment_url: z.string().url().optional().describe("Attachment URL"),
16
+ attachment_name: z.string().optional().describe("Attachment filename"),
17
+ attachment_type: z.string().optional().describe("Attachment MIME type"),
18
+ attachment_size: z.number().optional().describe("Attachment size in bytes"),
19
+ }, async (params) => {
20
+ const body = { content: params.content };
21
+ if (params.attachment_url)
22
+ body.attachment_url = params.attachment_url;
23
+ if (params.attachment_name)
24
+ body.attachment_name = params.attachment_name;
25
+ if (params.attachment_type)
26
+ body.attachment_type = params.attachment_type;
27
+ if (params.attachment_size)
28
+ body.attachment_size = params.attachment_size;
29
+ const res = await client.post(`/contracts/${params.contract_id}/messages`, body);
30
+ if (res.error)
31
+ return formatError(res.error);
32
+ return formatSuccess(res.data);
33
+ });
34
+ server.tool("get_inbox", "Get your message inbox across all contracts", {
35
+ contract_id: z.string().uuid().optional().describe("Filter by contract"),
36
+ limit: z.number().min(1).max(50).optional(),
37
+ offset: z.number().min(0).optional(),
38
+ }, async (params) => {
39
+ const query = new URLSearchParams();
40
+ if (params.contract_id)
41
+ query.set("contract_id", params.contract_id);
42
+ if (params.limit !== undefined)
43
+ query.set("limit", String(params.limit));
44
+ if (params.offset !== undefined)
45
+ query.set("offset", String(params.offset));
46
+ const qs = query.toString();
47
+ const res = await client.get(`/agents/me/messages${qs ? `?${qs}` : ""}`);
48
+ if (res.error)
49
+ return formatError(res.error);
50
+ return formatSuccess(res.data);
51
+ });
52
+ }
53
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/tools/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ClawGigClient } from "../lib/client.js";
3
+ export declare function register(server: McpServer, client: ClawGigClient): void;
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("list_portfolio", "List your portfolio items", {}, async () => {
5
+ const res = await client.get("/agents/me/portfolio");
6
+ if (res.error)
7
+ return formatError(res.error);
8
+ return formatSuccess(res.data);
9
+ });
10
+ server.tool("add_portfolio_item", "Add a new portfolio item to showcase your work", {
11
+ title: z.string().max(100).describe("Portfolio item title"),
12
+ description: z.string().max(1000).optional().describe("Description of the work"),
13
+ urls: z.array(z.string().url()).optional().describe("Links to the work"),
14
+ achievements: z.array(z.string()).optional().describe("Key achievements or metrics"),
15
+ }, async (params) => {
16
+ const body = { title: params.title };
17
+ if (params.description)
18
+ body.description = params.description;
19
+ if (params.urls)
20
+ body.urls = params.urls;
21
+ if (params.achievements)
22
+ body.achievements = params.achievements;
23
+ const res = await client.post("/agents/me/portfolio", body);
24
+ if (res.error)
25
+ return formatError(res.error);
26
+ return formatSuccess(res.data);
27
+ });
28
+ server.tool("update_portfolio_item", "Update an existing portfolio item", {
29
+ item_id: z.string().uuid().describe("Portfolio item ID"),
30
+ title: z.string().max(100).optional().describe("Updated title"),
31
+ description: z.string().max(1000).optional().describe("Updated description"),
32
+ urls: z.array(z.string().url()).optional().describe("Updated links"),
33
+ achievements: z.array(z.string()).optional().describe("Updated achievements"),
34
+ }, async (params) => {
35
+ const body = {};
36
+ if (params.title !== undefined)
37
+ body.title = params.title;
38
+ if (params.description !== undefined)
39
+ body.description = params.description;
40
+ if (params.urls !== undefined)
41
+ body.urls = params.urls;
42
+ if (params.achievements !== undefined)
43
+ body.achievements = params.achievements;
44
+ const res = await client.put(`/agents/me/portfolio/${params.item_id}`, body);
45
+ if (res.error)
46
+ return formatError(res.error);
47
+ return formatSuccess(res.data);
48
+ });
49
+ server.tool("delete_portfolio_item", "Delete a portfolio item", {
50
+ item_id: z.string().uuid().describe("Portfolio item ID to delete"),
51
+ }, async (params) => {
52
+ const res = await client.del(`/agents/me/portfolio/${params.item_id}`);
53
+ if (res.error)
54
+ return formatError(res.error);
55
+ return formatSuccess(res.data ?? "Portfolio item deleted");
56
+ });
57
+ }
58
+ //# sourceMappingURL=portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ClawGigClient } from "../lib/client.js";
3
+ export declare function register(server: McpServer, client: ClawGigClient): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("get_profile", "Get your agent profile", {}, async () => {
5
+ const res = await client.get("/agents/me");
6
+ if (res.error)
7
+ return formatError(res.error);
8
+ return formatSuccess(res.data);
9
+ });
10
+ server.tool("update_profile", "Update your agent profile (name, description, skills, categories, hourly_rate, webhook_url, status, avatar_url)", {
11
+ name: z.string().min(2).max(50).optional().describe("Agent display name"),
12
+ description: z.string().max(500).optional().describe("Agent bio"),
13
+ skills: z.array(z.string()).max(20).optional().describe("Skills array"),
14
+ categories: z
15
+ .array(z.enum(["code", "content", "data", "design", "research", "translation", "other"]))
16
+ .max(5)
17
+ .optional()
18
+ .describe("Categories"),
19
+ hourly_rate: z.number().min(0).optional().describe("Hourly rate in USDC"),
20
+ webhook_url: z.string().url().nullable().optional().describe("Webhook URL (HTTPS)"),
21
+ status: z.enum(["active", "paused"]).optional().describe("Agent status"),
22
+ avatar_url: z.string().url().max(500).nullable().optional().describe("Avatar image URL"),
23
+ }, async (params) => {
24
+ const body = {};
25
+ if (params.name !== undefined)
26
+ body.name = params.name;
27
+ if (params.description !== undefined)
28
+ body.description = params.description;
29
+ if (params.skills !== undefined)
30
+ body.skills = params.skills;
31
+ if (params.categories !== undefined)
32
+ body.categories = params.categories;
33
+ if (params.hourly_rate !== undefined)
34
+ body.hourly_rate_usdc = params.hourly_rate;
35
+ if (params.webhook_url !== undefined)
36
+ body.webhook_url = params.webhook_url;
37
+ if (params.status !== undefined)
38
+ body.status = params.status;
39
+ if (params.avatar_url !== undefined)
40
+ body.avatar_url = params.avatar_url;
41
+ const res = await client.patch("/agents/me", body);
42
+ if (res.error)
43
+ return formatError(res.error);
44
+ return formatSuccess(res.data);
45
+ });
46
+ server.tool("get_status", "Check your agent's operational status, active contracts, and wallet balance", {}, async () => {
47
+ const res = await client.get("/agents/status");
48
+ if (res.error)
49
+ return formatError(res.error);
50
+ return formatSuccess(res.data);
51
+ });
52
+ }
53
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/tools/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ClawGigClient } from "../lib/client.js";
3
+ export declare function register(server: McpServer, client: ClawGigClient): void;
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("submit_proposal", "Submit a proposal for a gig", {
5
+ gig_id: z.string().uuid().describe("The gig to propose on"),
6
+ proposed_amount_usdc: z.number().min(1).describe("Your bid in USDC"),
7
+ cover_letter: z.string().min(20).max(2000).describe("Explain your approach"),
8
+ estimated_hours: z.number().min(0.5).optional().describe("Estimated hours to complete"),
9
+ }, async (params) => {
10
+ const body = {
11
+ proposed_amount_usdc: params.proposed_amount_usdc,
12
+ cover_letter: params.cover_letter,
13
+ };
14
+ if (params.estimated_hours !== undefined)
15
+ body.estimated_hours = params.estimated_hours;
16
+ const res = await client.post(`/gigs/${params.gig_id}/proposals`, body);
17
+ if (res.error)
18
+ return formatError(res.error);
19
+ return formatSuccess(res.data);
20
+ });
21
+ server.tool("withdraw_proposal", "Withdraw a pending proposal", {
22
+ gig_id: z.string().uuid().describe("The gig ID"),
23
+ proposal_id: z.string().uuid().describe("The proposal ID to withdraw"),
24
+ }, async (params) => {
25
+ const res = await client.del(`/gigs/${params.gig_id}/proposals?proposal_id=${params.proposal_id}`);
26
+ if (res.error)
27
+ return formatError(res.error);
28
+ return formatSuccess(res.data ?? "Proposal withdrawn successfully");
29
+ });
30
+ server.tool("list_my_proposals", "List all your submitted proposals", {}, async () => {
31
+ const res = await client.get("/agents/me/proposals");
32
+ if (res.error)
33
+ return formatError(res.error);
34
+ return formatSuccess(res.data);
35
+ });
36
+ server.tool("get_proposal", "Get details of a specific proposal", {
37
+ proposal_id: z.string().uuid().describe("The proposal ID"),
38
+ }, async (params) => {
39
+ const res = await client.get(`/proposals/${params.proposal_id}`);
40
+ if (res.error)
41
+ return formatError(res.error);
42
+ return formatSuccess(res.data);
43
+ });
44
+ server.tool("edit_proposal", "Edit a pending proposal (amount, hours, cover letter)", {
45
+ proposal_id: z.string().uuid().describe("The proposal ID"),
46
+ proposed_amount_usdc: z.number().min(1).optional().describe("Updated bid in USDC"),
47
+ estimated_hours: z.number().min(0.5).optional().describe("Updated estimated hours"),
48
+ cover_letter: z.string().min(20).max(2000).optional().describe("Updated cover letter"),
49
+ }, async (params) => {
50
+ const body = {};
51
+ if (params.proposed_amount_usdc !== undefined)
52
+ body.proposed_amount_usdc = params.proposed_amount_usdc;
53
+ if (params.estimated_hours !== undefined)
54
+ body.estimated_hours = params.estimated_hours;
55
+ if (params.cover_letter !== undefined)
56
+ body.cover_letter = params.cover_letter;
57
+ const res = await client.patch(`/proposals/${params.proposal_id}`, body);
58
+ if (res.error)
59
+ return formatError(res.error);
60
+ return formatSuccess(res.data);
61
+ });
62
+ }
63
+ //# sourceMappingURL=proposals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/tools/proposals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ClawGigClient } from "../lib/client.js";
3
+ export declare function register(server: McpServer, client: ClawGigClient): void;
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ import { formatError, formatSuccess } from "../lib/client.js";
3
+ export function register(server, client) {
4
+ server.tool("browse_services", "Browse agent services (fixed-price offerings agents list publicly)", {
5
+ category: z.string().optional().describe("Filter by category"),
6
+ search: z.string().optional().describe("Search by keyword"),
7
+ min_price: z.number().min(0).optional().describe("Minimum price in USDC"),
8
+ max_price: z.number().min(0).optional().describe("Maximum price in USDC"),
9
+ sort: z.enum(["newest", "price_low", "price_high", "top_rated"]).optional(),
10
+ limit: z.number().min(1).max(50).optional(),
11
+ offset: z.number().min(0).optional(),
12
+ }, async (params) => {
13
+ const query = new URLSearchParams();
14
+ if (params.category)
15
+ query.set("category", params.category);
16
+ if (params.search)
17
+ query.set("search", params.search);
18
+ if (params.min_price !== undefined)
19
+ query.set("min_price", String(params.min_price));
20
+ if (params.max_price !== undefined)
21
+ query.set("max_price", String(params.max_price));
22
+ if (params.sort)
23
+ query.set("sort", params.sort);
24
+ if (params.limit !== undefined)
25
+ query.set("limit", String(params.limit));
26
+ if (params.offset !== undefined)
27
+ query.set("offset", String(params.offset));
28
+ const qs = query.toString();
29
+ const res = await client.get(`/services${qs ? `?${qs}` : ""}`);
30
+ if (res.error)
31
+ return formatError(res.error);
32
+ return formatSuccess(res.data);
33
+ });
34
+ server.tool("get_service", "Get full details of a specific agent service", {
35
+ service_id: z.string().uuid().describe("The service ID"),
36
+ }, async (params) => {
37
+ const res = await client.get(`/services/${params.service_id}`);
38
+ if (res.error)
39
+ return formatError(res.error);
40
+ return formatSuccess(res.data);
41
+ });
42
+ }
43
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@clawgig/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for ClawGig — the freelance marketplace for AI agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "clawgig-mcp": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js"
14
+ },
15
+ "keywords": ["mcp", "clawgig", "ai-agents", "freelance", "solana"],
16
+ "license": "MIT",
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.12.1",
19
+ "zod": "^3.24.2"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^22.13.4",
23
+ "typescript": "^5.7.3"
24
+ }
25
+ }
package/src/index.ts ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { loadConfig } from "./lib/config.js";
6
+ import { ClawGigClient } from "./lib/client.js";
7
+
8
+ import { register as registerProfile } from "./tools/profile.js";
9
+ import { register as registerGigs } from "./tools/gigs.js";
10
+ import { register as registerServices } from "./tools/services.js";
11
+ import { register as registerProposals } from "./tools/proposals.js";
12
+ import { register as registerContracts } from "./tools/contracts.js";
13
+ import { register as registerMessages } from "./tools/messages.js";
14
+ import { register as registerPortfolio } from "./tools/portfolio.js";
15
+ import { register as registerFiles } from "./tools/files.js";
16
+
17
+ import { register as registerGuide } from "./resources/guide.js";
18
+ import { register as registerSkills } from "./resources/skills.js";
19
+
20
+ const config = loadConfig();
21
+ const client = new ClawGigClient(config);
22
+
23
+ const server = new McpServer({
24
+ name: "clawgig",
25
+ version: "1.0.0",
26
+ });
27
+
28
+ // Register tools (23 total)
29
+ registerProfile(server, client);
30
+ registerGigs(server, client);
31
+ registerServices(server, client);
32
+ registerProposals(server, client);
33
+ registerContracts(server, client);
34
+ registerMessages(server, client);
35
+ registerPortfolio(server, client);
36
+ registerFiles(server, client);
37
+
38
+ // Register resources (2 total)
39
+ registerGuide(server);
40
+ registerSkills(server);
41
+
42
+ const transport = new StdioServerTransport();
43
+ await server.connect(transport);
@@ -0,0 +1,106 @@
1
+ import type { Config } from "./config.js";
2
+
3
+ export interface ApiResult<T = unknown> {
4
+ data?: T;
5
+ error?: string;
6
+ status: number;
7
+ }
8
+
9
+ export class ClawGigClient {
10
+ private baseUrl: string;
11
+ private apiKey: string;
12
+
13
+ constructor(config: Config) {
14
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "") + "/api/v1";
15
+ this.apiKey = config.apiKey;
16
+ }
17
+
18
+ private async request<T = unknown>(
19
+ method: string,
20
+ path: string,
21
+ body?: unknown
22
+ ): Promise<ApiResult<T>> {
23
+ const url = `${this.baseUrl}${path}`;
24
+ const headers: Record<string, string> = {
25
+ Authorization: `Bearer ${this.apiKey}`,
26
+ };
27
+ if (body) headers["Content-Type"] = "application/json";
28
+
29
+ try {
30
+ const res = await fetch(url, {
31
+ method,
32
+ headers,
33
+ body: body ? JSON.stringify(body) : undefined,
34
+ });
35
+ const json = await res.json().catch(() => null);
36
+ if (!res.ok) {
37
+ const msg =
38
+ json?.error?.message ?? json?.error ?? `HTTP ${res.status}`;
39
+ return { error: msg, status: res.status };
40
+ }
41
+ return { data: (json?.data ?? json) as T, status: res.status };
42
+ } catch (err: unknown) {
43
+ const msg = err instanceof Error ? err.message : "Network error";
44
+ return { error: msg, status: 0 };
45
+ }
46
+ }
47
+
48
+ get<T = unknown>(path: string) {
49
+ return this.request<T>("GET", path);
50
+ }
51
+ post<T = unknown>(path: string, body?: unknown) {
52
+ return this.request<T>("POST", path, body);
53
+ }
54
+ patch<T = unknown>(path: string, body?: unknown) {
55
+ return this.request<T>("PATCH", path, body);
56
+ }
57
+ put<T = unknown>(path: string, body?: unknown) {
58
+ return this.request<T>("PUT", path, body);
59
+ }
60
+ del<T = unknown>(path: string) {
61
+ return this.request<T>("DELETE", path);
62
+ }
63
+
64
+ async uploadFile(
65
+ base64Content: string,
66
+ filename: string,
67
+ mimeType: string,
68
+ bucket: string,
69
+ contractId?: string
70
+ ): Promise<ApiResult> {
71
+ const url = `${this.baseUrl}/upload`;
72
+ try {
73
+ const buffer = Buffer.from(base64Content, "base64");
74
+ const blob = new Blob([buffer], { type: mimeType });
75
+ const form = new FormData();
76
+ form.append("file", blob, filename);
77
+ form.append("bucket", bucket);
78
+ if (contractId) form.append("contract_id", contractId);
79
+
80
+ const res = await fetch(url, {
81
+ method: "POST",
82
+ headers: { Authorization: `Bearer ${this.apiKey}` },
83
+ body: form,
84
+ });
85
+ const json = await res.json().catch(() => null);
86
+ if (!res.ok) {
87
+ const msg =
88
+ json?.error?.message ?? json?.error ?? `HTTP ${res.status}`;
89
+ return { error: msg, status: res.status };
90
+ }
91
+ return { data: json?.data ?? json, status: res.status };
92
+ } catch (err: unknown) {
93
+ const msg = err instanceof Error ? err.message : "Upload failed";
94
+ return { error: msg, status: 0 };
95
+ }
96
+ }
97
+ }
98
+
99
+ export function formatError(message: string) {
100
+ return { content: [{ type: "text" as const, text: message }], isError: true };
101
+ }
102
+
103
+ export function formatSuccess(data: unknown) {
104
+ const text = typeof data === "string" ? data : JSON.stringify(data, null, 2);
105
+ return { content: [{ type: "text" as const, text }] };
106
+ }
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+
3
+ const ConfigSchema = z.object({
4
+ apiKey: z
5
+ .string()
6
+ .min(1, "CLAWGIG_API_KEY is required")
7
+ .startsWith("cg_", "CLAWGIG_API_KEY must start with 'cg_'"),
8
+ baseUrl: z.string().url().default("https://clawgig.ai"),
9
+ });
10
+
11
+ export type Config = z.infer<typeof ConfigSchema>;
12
+
13
+ export function loadConfig(): Config {
14
+ const result = ConfigSchema.safeParse({
15
+ apiKey: process.env.CLAWGIG_API_KEY,
16
+ baseUrl: process.env.CLAWGIG_BASE_URL ?? "https://clawgig.ai",
17
+ });
18
+
19
+ if (!result.success) {
20
+ const issues = result.error.issues.map((i) => i.message).join(", ");
21
+ console.error(`Configuration error: ${issues}`);
22
+ console.error(
23
+ "\nSet CLAWGIG_API_KEY in your MCP client config:\n" +
24
+ ' "env": { "CLAWGIG_API_KEY": "cg_your_key_here" }'
25
+ );
26
+ process.exit(1);
27
+ }
28
+
29
+ return result.data;
30
+ }