@agentsbazaar/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.
@@ -0,0 +1,211 @@
1
+ import { z } from "zod";
2
+ import { api } from "../api.js";
3
+ import { walletExists, loadWallet, createWallet } from "../wallet.js";
4
+ import { formatAgent, formatAgentShort } from "../format.js";
5
+ export function registerAgentTools(server) {
6
+ // ── search_agents ──
7
+ server.tool("search_agents", "Search for AI agents by skill, capability, or keyword. Returns matching agents with pricing and ratings.", {
8
+ query: z.string().describe("Skills or keywords to search (e.g. 'summarize', 'audit solana', 'translate')"),
9
+ limit: z.number().min(1).max(50).default(10).describe("Max results (default 10)"),
10
+ active_only: z.boolean().default(true).describe("Only show active agents"),
11
+ }, async ({ query, limit, active_only }) => {
12
+ try {
13
+ const params = new URLSearchParams({
14
+ skills: query,
15
+ limit: String(limit),
16
+ active_only: String(active_only),
17
+ });
18
+ const result = await api.get(`/agents?${params}`);
19
+ if (result.agents.length === 0) {
20
+ return { content: [{ type: "text", text: `No agents found matching "${query}".` }] };
21
+ }
22
+ const text = [
23
+ `Found ${result.pagination.total} agent(s) matching "${query}":`,
24
+ ``,
25
+ ...result.agents.map(formatAgentShort),
26
+ ].join("\n\n");
27
+ return { content: [{ type: "text", text }] };
28
+ }
29
+ catch (err) {
30
+ return { content: [{ type: "text", text: `Search failed: ${err instanceof Error ? err.message : err}` }] };
31
+ }
32
+ });
33
+ // ── list_agents ──
34
+ server.tool("list_agents", "List all registered AI agents sorted by popularity (jobs completed).", {
35
+ limit: z.number().min(1).max(100).default(20).describe("Max results (default 20)"),
36
+ active_only: z.boolean().default(true).describe("Only show active agents"),
37
+ }, async ({ limit, active_only }) => {
38
+ try {
39
+ const params = new URLSearchParams({
40
+ limit: String(limit),
41
+ active_only: String(active_only),
42
+ });
43
+ const result = await api.get(`/agents?${params}`);
44
+ if (result.agents.length === 0) {
45
+ return { content: [{ type: "text", text: "No agents registered yet." }] };
46
+ }
47
+ const text = [`${result.pagination.total} agent(s) total:`, ``, ...result.agents.map(formatAgentShort)].join("\n\n");
48
+ return { content: [{ type: "text", text }] };
49
+ }
50
+ catch (err) {
51
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
52
+ }
53
+ });
54
+ // ── get_agent ──
55
+ server.tool("get_agent", "Get detailed information about a specific agent by pubkey, slug, or exact name.", {
56
+ identifier: z.string().describe("Agent pubkey (base58), slug, or exact name"),
57
+ }, async ({ identifier }) => {
58
+ try {
59
+ // Try pubkey first (32-44 chars, base58)
60
+ if (identifier.length >= 32 && identifier.length <= 44 && /^[1-9A-HJ-NP-Za-km-z]+$/.test(identifier)) {
61
+ try {
62
+ const agent = await api.get(`/agents/${identifier}`);
63
+ return { content: [{ type: "text", text: formatAgent(agent) }] };
64
+ }
65
+ catch {
66
+ // Not a pubkey, try other methods
67
+ }
68
+ }
69
+ // Try as slug or name via search
70
+ const result = await api.get(`/agents?skills=${encodeURIComponent(identifier)}&limit=5`);
71
+ const exact = result.agents.find((a) => a.slug === identifier.toLowerCase() || a.name.toLowerCase() === identifier.toLowerCase());
72
+ if (exact) {
73
+ return { content: [{ type: "text", text: formatAgent(exact) }] };
74
+ }
75
+ if (result.agents.length > 0) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: "text",
80
+ text: [
81
+ `No exact match for "${identifier}". Did you mean:`,
82
+ ``,
83
+ ...result.agents.map(formatAgentShort),
84
+ ].join("\n\n"),
85
+ },
86
+ ],
87
+ };
88
+ }
89
+ return { content: [{ type: "text", text: `Agent "${identifier}" not found.` }] };
90
+ }
91
+ catch (err) {
92
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
93
+ }
94
+ });
95
+ // ── register_agent ──
96
+ server.tool("register_agent", "Register a new AI agent on AgentBazaar. Creates a wallet if you don't have one. Your agent gets an ERC-8004 NFT identity and is discoverable via A2A protocol.", {
97
+ name: z.string().min(1).max(64).describe("Agent name (max 64 characters)"),
98
+ skills: z
99
+ .string()
100
+ .min(1)
101
+ .max(256)
102
+ .describe("Comma-separated skills (e.g. 'code audit, summarization, translation')"),
103
+ description: z.string().max(512).optional().describe("Agent description (max 512 characters)"),
104
+ price: z.string().describe("Price per request in USDC (e.g. '0.10' for $0.10)"),
105
+ mode: z
106
+ .enum(["push", "ws"])
107
+ .default("ws")
108
+ .describe("Delivery mode: 'ws' (WebSocket, no server needed) or 'push' (your own HTTPS endpoint)"),
109
+ endpoint: z.string().url().optional().describe("Agent HTTPS endpoint URL (required for push mode)"),
110
+ }, async ({ name, skills, description, price, mode, endpoint }) => {
111
+ try {
112
+ if (mode === "push" && !endpoint) {
113
+ return { content: [{ type: "text", text: "Error: --endpoint is required for push mode." }] };
114
+ }
115
+ // Auto-create wallet if needed
116
+ let keypair;
117
+ let walletNote = "";
118
+ if (!walletExists()) {
119
+ const { keypair: kp, privateKeyBase58 } = createWallet();
120
+ keypair = kp;
121
+ walletNote = [
122
+ ``,
123
+ `---`,
124
+ `**New wallet created!**`,
125
+ `**Public Key:** \`${keypair.publicKey.toBase58()}\``,
126
+ `**Private Key:** \`${privateKeyBase58}\``,
127
+ `> Save your private key now — it won't be shown again.`,
128
+ ].join("\n");
129
+ }
130
+ else {
131
+ keypair = loadWallet();
132
+ }
133
+ // Convert human price to micro-units
134
+ const priceFloat = parseFloat(price);
135
+ if (isNaN(priceFloat) || priceFloat <= 0) {
136
+ return { content: [{ type: "text", text: "Error: Price must be a positive number (e.g. '0.10')." }] };
137
+ }
138
+ const pricePerRequest = Math.round(priceFloat * 1_000_000);
139
+ const result = await api.postAuthenticated("/agents/register", {
140
+ name,
141
+ skills,
142
+ description: description || "",
143
+ pricePerRequest,
144
+ deliveryMode: mode,
145
+ endpoint: endpoint || "",
146
+ }, keypair, "register");
147
+ const lines = [
148
+ `Agent registered successfully!`,
149
+ ``,
150
+ `**${result.agent.name}** (${result.agent.is_active ? "Active" : "Inactive"})`,
151
+ `- Wallet: \`${result.agent.authority}\``,
152
+ `- Skills: ${result.agent.skills}`,
153
+ `- Price: $${(pricePerRequest / 1_000_000).toFixed(2)} USDC/request`,
154
+ `- Mode: ${mode === "ws" ? "WebSocket" : "Push (HTTPS)"}`,
155
+ ];
156
+ if (result.agent.slug) {
157
+ lines.push(`- A2A Card: https://agentbazaar.dev/a2a/${result.agent.slug}/.well-known/agent.json`);
158
+ }
159
+ if (result.agent.nft_8004) {
160
+ lines.push(`- 8004 NFT: \`${result.agent.nft_8004}\``);
161
+ }
162
+ else {
163
+ lines.push(`- 8004 NFT: Minting in progress...`);
164
+ }
165
+ if (result.websocket) {
166
+ lines.push(``);
167
+ lines.push(`**WebSocket Connection:**`);
168
+ lines.push(`- URL: ${result.websocket.url}`);
169
+ lines.push(`- Token: \`${result.websocket.token}\``);
170
+ lines.push(`- Poll Fallback: ${result.websocket.pollUrl}`);
171
+ }
172
+ lines.push(``);
173
+ lines.push(`Deposit USDC (Solana) to \`${result.agent.authority}\` to start hiring other agents.`);
174
+ if (walletNote)
175
+ lines.push(walletNote);
176
+ return { content: [{ type: "text", text: lines.join("\n") }] };
177
+ }
178
+ catch (err) {
179
+ return {
180
+ content: [{ type: "text", text: `Registration failed: ${err instanceof Error ? err.message : err}` }],
181
+ };
182
+ }
183
+ });
184
+ // ── my_agents ──
185
+ server.tool("my_agents", "Show all agents owned by your wallet.", {}, async () => {
186
+ try {
187
+ if (!walletExists()) {
188
+ return { content: [{ type: "text", text: "No wallet found. Use `setup_wallet` first." }] };
189
+ }
190
+ const keypair = loadWallet();
191
+ const wallet = keypair.publicKey.toBase58();
192
+ const result = await api.get(`/agents/authority/${wallet}`);
193
+ if (!result.agent) {
194
+ return { content: [{ type: "text", text: `No agents found for wallet \`${wallet}\`.` }] };
195
+ }
196
+ return { content: [{ type: "text", text: formatAgent(result.agent) }] };
197
+ }
198
+ catch (err) {
199
+ const msg = err instanceof Error ? err.message : String(err);
200
+ if (msg.includes("not found") || msg.includes("404")) {
201
+ return {
202
+ content: [
203
+ { type: "text", text: "No agents registered with this wallet yet. Use `register_agent` to create one." },
204
+ ],
205
+ };
206
+ }
207
+ return { content: [{ type: "text", text: `Failed: ${msg}` }] };
208
+ }
209
+ });
210
+ }
211
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/tools/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDiscoveryTools(server: McpServer): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { api } from "../api.js";
3
+ import { formatRating } from "../format.js";
4
+ export function registerDiscoveryTools(server) {
5
+ // ── get_ratings ──
6
+ server.tool("get_ratings", "Get ratings and reviews for a specific agent.", {
7
+ agent_pubkey: z.string().min(32).max(44).describe("Agent pubkey (base58)"),
8
+ limit: z.number().min(1).max(50).default(10).describe("Max ratings to show"),
9
+ }, async ({ agent_pubkey, limit }) => {
10
+ try {
11
+ const params = new URLSearchParams({ limit: String(limit) });
12
+ const result = await api.get(`/agents/${agent_pubkey}/ratings?${params}`);
13
+ if (result.ratings.length === 0) {
14
+ return { content: [{ type: "text", text: "No ratings yet for this agent." }] };
15
+ }
16
+ const avg = result.ratings.reduce((sum, r) => sum + r.score, 0) / result.ratings.length;
17
+ const text = [
18
+ `**Ratings for agent** \`${agent_pubkey}\``,
19
+ `Average: ${avg.toFixed(1)}/5 (${result.pagination.total} total)`,
20
+ ``,
21
+ ...result.ratings.map(formatRating),
22
+ ].join("\n\n");
23
+ return { content: [{ type: "text", text }] };
24
+ }
25
+ catch (err) {
26
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
27
+ }
28
+ });
29
+ // ── platform_stats ──
30
+ server.tool("platform_stats", "Get AgentBazaar marketplace statistics — total agents, jobs, and volume.", {}, async () => {
31
+ try {
32
+ const stats = await api.get("/stats");
33
+ const text = [
34
+ `**AgentBazaar Platform Stats**`,
35
+ ``,
36
+ `- Active Agents: ${stats.total_agents}`,
37
+ `- Total Jobs: ${stats.total_jobs}`,
38
+ `- Total Volume: $${stats.total_volume_usdc} USDC`,
39
+ `- Platform Fees: $${stats.platform_fees_usdc} USDC`,
40
+ ``,
41
+ `**Identity:** ERC-8004 NFTs on Solana`,
42
+ `**Payments:** x402 USDC micropayments`,
43
+ `**Registration:** Free`,
44
+ `**A2A Compatible:** Google ADK, Amazon Bedrock, LangSmith, Spring AI`,
45
+ ].join("\n");
46
+ return { content: [{ type: "text", text }] };
47
+ }
48
+ catch (err) {
49
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/tools/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerHiringTools(server: McpServer): void;
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ import { walletExists, loadWallet } from "../wallet.js";
3
+ import { api } from "../api.js";
4
+ import { postWithPayment } from "../payment.js";
5
+ import { formatUsdc } from "../format.js";
6
+ export function registerHiringTools(server) {
7
+ // ── hire_agent ──
8
+ server.tool("hire_agent", "Hire an AI agent to perform a task. Finds the best agent, pays via x402, and returns the result with verification score.", {
9
+ task: z.string().min(1).describe("Task for the agent to perform"),
10
+ skills: z.string().optional().describe("Filter agents by skills (e.g. 'summarization, research')"),
11
+ agent: z.string().optional().describe("Target specific agent by wallet address (bypasses discovery)"),
12
+ }, async ({ task, skills, agent }) => {
13
+ try {
14
+ if (!walletExists()) {
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: "No wallet found. Use `setup_wallet` to create one and deposit USDC before hiring agents.",
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ const keypair = loadWallet();
25
+ const baseUrl = api.getBaseUrl();
26
+ const body = { task };
27
+ if (skills)
28
+ body.skills = skills;
29
+ if (agent)
30
+ body.agent = agent;
31
+ const result = await postWithPayment(`${baseUrl}/call`, body, keypair);
32
+ const output = typeof result.result === "string" ? result.result : JSON.stringify(result.result, null, 2);
33
+ const lines = [
34
+ `**Agent:** ${result.agent.name} (\`${result.agent.authority}\`)`,
35
+ `**Price:** $${result.agent.price} USDC`,
36
+ `**Verification:** ${result.verification.score}/100 — ${result.verification.action}`,
37
+ `**Job:** #${result.job.id} (${result.job.status})`,
38
+ `**Latency:** ${result.meta.agentLatencyMs}ms (total: ${result.meta.totalMs}ms)`,
39
+ ];
40
+ if (result.verification.quality?.reasoning) {
41
+ lines.push(`**Quality:** ${result.verification.quality.reasoning}`);
42
+ }
43
+ lines.push(``);
44
+ lines.push(`---`);
45
+ lines.push(`**Result:**`);
46
+ lines.push(output);
47
+ return { content: [{ type: "text", text: lines.join("\n") }] };
48
+ }
49
+ catch (err) {
50
+ const msg = err instanceof Error ? err.message : String(err);
51
+ if (msg.includes("insufficient") || msg.includes("balance")) {
52
+ const keypair = loadWallet();
53
+ return {
54
+ content: [
55
+ {
56
+ type: "text",
57
+ text: [
58
+ `Insufficient USDC balance to hire an agent.`,
59
+ ``,
60
+ `Deposit USDC (Solana) to: \`${keypair.publicKey.toBase58()}\``,
61
+ `Use \`check_balance\` to see your current balance.`,
62
+ ].join("\n"),
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ return { content: [{ type: "text", text: `Hiring failed: ${msg}` }] };
68
+ }
69
+ });
70
+ // ── get_hire_instructions ──
71
+ server.tool("get_hire_instructions", "Get code examples and instructions for hiring a specific agent via x402, A2A, or direct call.", {
72
+ agent_pubkey: z.string().min(32).max(44).describe("Agent pubkey (base58)"),
73
+ }, async ({ agent_pubkey }) => {
74
+ try {
75
+ const agent = await api.get(`/agents/${agent_pubkey}`);
76
+ const baseUrl = api.getBaseUrl();
77
+ const price = formatUsdc(agent.price_per_request);
78
+ const text = [
79
+ `# How to hire **${agent.name}**`,
80
+ ``,
81
+ `**Price:** $${price} USDC/request`,
82
+ ``,
83
+ `## Option 1: Use this MCP (simplest)`,
84
+ ``,
85
+ "```",
86
+ `hire_agent with task: "your task here" and agent: "${agent_pubkey}"`,
87
+ "```",
88
+ ``,
89
+ `## Option 2: One-Call via x402`,
90
+ ``,
91
+ "```bash",
92
+ `curl -X POST ${baseUrl}/call \\`,
93
+ ` -H "Content-Type: application/json" \\`,
94
+ ` -H "X-Payment: <x402-payment-header>" \\`,
95
+ ` -d '{"task": "your task", "agent": "${agent.authority}"}'`,
96
+ "```",
97
+ ``,
98
+ `## Option 3: A2A Protocol`,
99
+ ``,
100
+ ];
101
+ if (agent.slug) {
102
+ text.push("```bash");
103
+ text.push(`curl -X POST ${baseUrl}/a2a/${agent.slug}/ \\`);
104
+ text.push(` -H "Content-Type: application/json" \\`);
105
+ text.push(` -d '{"jsonrpc":"2.0","id":1,"method":"tasks/send","params":{"message":{"parts":[{"type":"text","text":"your task"}]}}}'`);
106
+ text.push("```");
107
+ text.push(``);
108
+ text.push(`**A2A Agent Card:** ${baseUrl}/a2a/${agent.slug}/.well-known/agent.json`);
109
+ }
110
+ else {
111
+ text.push(`This agent does not have an A2A slug configured.`);
112
+ }
113
+ return { content: [{ type: "text", text: text.join("\n") }] };
114
+ }
115
+ catch (err) {
116
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=hiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hiring.js","sourceRoot":"","sources":["../../src/tools/hiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerJobTools(server: McpServer): void;
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { walletExists, loadWallet } from "../wallet.js";
3
+ import { api } from "../api.js";
4
+ import { formatJob } from "../format.js";
5
+ export function registerJobTools(server) {
6
+ // ── my_jobs ──
7
+ server.tool("my_jobs", "Show job history for your wallet — both jobs you hired (as buyer) and jobs your agents completed (as seller).", {
8
+ role: z
9
+ .enum(["buyer", "seller", "both"])
10
+ .default("both")
11
+ .describe("Filter by role: buyer (hired agents), seller (received jobs), or both"),
12
+ limit: z.number().min(1).max(50).default(20).describe("Max results per role"),
13
+ }, async ({ role, limit }) => {
14
+ try {
15
+ if (!walletExists()) {
16
+ return { content: [{ type: "text", text: "No wallet found. Use `setup_wallet` first." }] };
17
+ }
18
+ const keypair = loadWallet();
19
+ const wallet = keypair.publicKey.toBase58();
20
+ const sections = [];
21
+ if (role === "buyer" || role === "both") {
22
+ const params = new URLSearchParams({ buyer: wallet, limit: String(limit) });
23
+ const result = await api.get(`/jobs?${params}`);
24
+ if (result.jobs.length > 0) {
25
+ sections.push(`## Jobs You Hired (${result.pagination.total} total)\n`);
26
+ sections.push(...result.jobs.map(formatJob));
27
+ }
28
+ else {
29
+ sections.push(`## Jobs You Hired\nNo jobs found.`);
30
+ }
31
+ }
32
+ if (role === "seller" || role === "both") {
33
+ const params = new URLSearchParams({ seller: wallet, limit: String(limit) });
34
+ const result = await api.get(`/jobs?${params}`);
35
+ if (result.jobs.length > 0) {
36
+ sections.push(`## Jobs Your Agents Completed (${result.pagination.total} total)\n`);
37
+ sections.push(...result.jobs.map(formatJob));
38
+ }
39
+ else {
40
+ sections.push(`## Jobs Your Agents Completed\nNo jobs found.`);
41
+ }
42
+ }
43
+ return { content: [{ type: "text", text: sections.join("\n\n") }] };
44
+ }
45
+ catch (err) {
46
+ return { content: [{ type: "text", text: `Failed: ${err instanceof Error ? err.message : err}` }] };
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerWalletTools(server: McpServer): void;