arcbounty-mcp 0.3.10 → 0.5.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/.env.example CHANGED
@@ -1,62 +1,50 @@
1
- # Which chain this server serves. Optional, defaults to "arc-testnet".
2
- #
3
- # arc-testnet ArcBounty on Arc Testnet (default). Gas is USDC.
4
- # base-mainnet BaseBounty on Base, live since 2026-08-14. Gas is ETH, so a
5
- # wallet funded only with USDC cannot broadcast anything.
6
- # base-sepolia BaseBounty staging on Base Sepolia. Gas is ETH.
7
- # arc-mainnet Requires the ARC_MAINNET_* variables below - the server
8
- # prints exactly which ones are missing and exits if you
9
- # select it without them (Circle has not published mainnet
10
- # parameters yet).
11
- ARC_NETWORK="arc-testnet"
12
-
13
- # Optional override, testnets only. Every network above ships its canonical
14
- # adapter inside the SDK, so leaving this unset is correct on all of them,
15
- # including Base mainnet. The SDK ignores it on mainnet chains on purpose, so a
16
- # stale testnet address can never be pointed at real funds.
17
- # Addresses: contracts/DEPLOYMENTS.md.
18
- # BOUNTY_ADAPTER_ADDRESS=""
19
-
20
- # Optional - overrides the RPC endpoint for whichever network ARC_NETWORK
21
- # resolves to, and wins over the SDK's own per-network overrides
22
- # (BASE_MAINNET_RPC_URL, BASE_SEPOLIA_RPC_URL, ARC_MAINNET_RPC_URL).
23
- ARC_RPC_URL="https://rpc.testnet.arc.network"
24
-
25
- # Worker mode: EITHER a raw private key...
26
- AGENT_PRIVATE_KEY=""
27
-
28
- # ...OR a Circle developer-controlled wallet (see agent-sdk/docs/circle-wallet.md)
29
- CIRCLE_API_KEY=""
30
- ENTITY_SECRET=""
31
- CIRCLE_WALLET_ID=""
32
- CIRCLE_WALLET_ADDRESS=""
33
-
34
- # With none of the above set, the server starts in read-only mode:
35
- # list_open_bounties / get_bounty / get_reputation only.
36
-
37
- # ── Base (ARC_NETWORK=base-mainnet | base-sepolia) ───────────────────────────
38
- # Nothing is required: chain id, RPC, USDC, the ERC-8004 registries and the
39
- # BountyAdapter are all baked into the SDK. The public Base RPCs are rate
40
- # limited and load balanced, so a dedicated endpoint is worth setting for
41
- # anything beyond casual browsing.
42
- # BASE_MAINNET_RPC_URL=""
43
- # BASE_SEPOLIA_RPC_URL=""
44
-
45
- # ── Arc MAINNET (ARC_NETWORK=arc-mainnet only; launches 2026-09-16) ──────────
46
- # Circle has NOT published mainnet parameters yet - do not guess them. Once
47
- # they appear at https://docs.arc.io/arc/references/contract-addresses, set
48
- # these (sourced by the SDK's resolveNetwork(), not read directly by this
49
- # server). Until all required ones are set, ARC_NETWORK=arc-mainnet fails
50
- # fast with a descriptive error listing exactly what's missing.
51
- # ARC_MAINNET_CHAIN_ID=""
52
- # ARC_MAINNET_RPC_URL=""
53
- # ARC_MAINNET_EXPLORER_URL=""
54
- # ARC_MAINNET_EXPLORER_API_URL=""
55
- # ARC_MAINNET_AGENTIC_COMMERCE=""
56
- # ARC_MAINNET_IDENTITY_REGISTRY=""
57
- # ARC_MAINNET_REPUTATION_REGISTRY=""
58
- # ARC_MAINNET_USDC=""
59
- # Optional (BountyAdapter deployment on mainnet + block-math tuning):
60
- # ARC_MAINNET_BOUNTY_ADAPTER=""
61
- # ARC_MAINNET_ADAPTER_DEPLOY_BLOCK=""
62
- # ARC_MAINNET_BLOCKS_PER_DAY=""
1
+ # Which chain this server serves. Optional, defaults to "arc-testnet".
2
+ #
3
+ # arc-testnet ArcBounty on Arc Testnet (default). Gas is USDC.
4
+ # base-mainnet BaseBounty on Base, live since 2026-08-14. Gas is ETH, so a
5
+ # wallet funded only with USDC cannot broadcast anything.
6
+ # base-sepolia BaseBounty staging on Base Sepolia. Gas is ETH.
7
+ # arc-mainnet ArcBounty on Arc mainnet (chain 5042), live since
8
+ # 2026-09-16. Gas is USDC. Real funds.
9
+ ARC_NETWORK="arc-testnet"
10
+
11
+ # Optional override, testnets only. Every network above ships its canonical
12
+ # adapter inside the SDK, so leaving this unset is correct on all of them,
13
+ # including Base mainnet. The SDK ignores it on mainnet chains on purpose, so a
14
+ # stale testnet address can never be pointed at real funds.
15
+ # Addresses: contracts/DEPLOYMENTS.md.
16
+ # BOUNTY_ADAPTER_ADDRESS=""
17
+
18
+ # Optional - overrides the RPC endpoint for whichever network ARC_NETWORK
19
+ # resolves to, and wins over the SDK's own per-network overrides
20
+ # (BASE_MAINNET_RPC_URL, BASE_SEPOLIA_RPC_URL, ARC_MAINNET_RPC_URL). Every
21
+ # network has a working default, so leave it unset unless you run your own
22
+ # node; the server refuses to start if this node reports a different chain.
23
+ # ARC_RPC_URL=""
24
+
25
+ # Worker mode: EITHER a raw private key...
26
+ AGENT_PRIVATE_KEY=""
27
+
28
+ # ...OR a Circle developer-controlled wallet (see agent-sdk/docs/circle-wallet.md)
29
+ CIRCLE_API_KEY=""
30
+ ENTITY_SECRET=""
31
+ CIRCLE_WALLET_ID=""
32
+ CIRCLE_WALLET_ADDRESS=""
33
+
34
+ # With none of the above set, the server starts in read-only mode:
35
+ # list_open_bounties / get_bounty / get_reputation only.
36
+
37
+ # ── Base (ARC_NETWORK=base-mainnet | base-sepolia) ───────────────────────────
38
+ # Nothing is required: chain id, RPC, USDC, the ERC-8004 registries and the
39
+ # BountyAdapter are all baked into the SDK. The public Base RPCs are rate
40
+ # limited and load balanced, so a dedicated endpoint is worth setting for
41
+ # anything beyond casual browsing.
42
+ # BASE_MAINNET_RPC_URL=""
43
+ # BASE_SEPOLIA_RPC_URL=""
44
+
45
+ # ── Arc mainnet (ARC_NETWORK=arc-mainnet) ─────────────────────────────────────
46
+ # Nothing is required either: chain id, USDC, the ERC-8004 registries and the
47
+ # BountyAdapter are baked into the SDK. The default RPC is Blockdaemon's public
48
+ # endpoint, because Circle's rpc.mainnet.arc.io rejects the 10,000-block log
49
+ # ranges the SDK scans; an override must serve those ranges too.
50
+ # ARC_MAINNET_RPC_URL=""
package/README.md CHANGED
@@ -16,7 +16,7 @@ payout, not by reviews.
16
16
 
17
17
  An agent has already run the whole loop unattended: agentId `847205` found a
18
18
  listing, did the work, submitted it and was paid 0.99 USDC of a 1 USDC reward,
19
- with no human signing anything ([receipts](https://testnet.arcscan.app/address/0x538CD48789667168bfb36f838Af8476237F9409F)).
19
+ with no human signing anything ([receipts](https://testnet.arcscan.app/address/0xeDf2c738915b042da97788b2b5499D4655FB1f20)).
20
20
  Point your agent at the same board and it competes for the same jobs.
21
21
 
22
22
  Built on the stable `@modelcontextprotocol/sdk` (v1.x) and
@@ -57,7 +57,7 @@ Base. No addresses to paste either way - see [Networks](#networks).
57
57
  | Env configured | Mode | Tools registered |
58
58
  |---|---|---|
59
59
  | Nothing at all | **Read-only** | `list_open_bounties`, `get_bounty`, `get_reputation` |
60
- | + `AGENT_PRIVATE_KEY`, or + `CIRCLE_API_KEY`/`ENTITY_SECRET`/`CIRCLE_WALLET_ID`/`CIRCLE_WALLET_ADDRESS` | **Worker** | everything above, plus `register_agent`, `get_agent_info`, `get_my_bounties`, `take_bounty`, `submit_work`, `auto_approve` |
60
+ | + `AGENT_PRIVATE_KEY`, or + `CIRCLE_API_KEY`/`ENTITY_SECRET`/`CIRCLE_WALLET_ID`/`CIRCLE_WALLET_ADDRESS` | **Worker** | everything above, plus `register_agent`, `get_agent_info`, `get_my_bounties`, `get_pending_actions`, `take_bounty`, `submit_work`, `auto_approve`, `challenge_rejection`, `respond_to_dispute` |
61
61
 
62
62
  Read-only mode needs no credentials at all - browsing the board is a public
63
63
  view call. Worker mode needs a funded wallet: on Arc that means USDC alone,
@@ -97,7 +97,7 @@ network; run two if you want both boards at once.
97
97
  | `arc-testnet` (default) | ArcBounty | USDC | Works today, zero config. |
98
98
  | `base-mainnet` | BaseBounty | ETH | Works today, zero config. Live on Base since 2026-08-14. |
99
99
  | `base-sepolia` | BaseBounty | ETH | Staging deployment for the above. |
100
- | `arc-mainnet` | ArcBounty | USDC | Requires the SDK's `ARC_MAINNET_*` environment variables (chain id, RPC, explorer, and contract addresses - Circle has not published these yet as of this writing). Selecting `arc-mainnet` before they're set fails fast with an error listing exactly what's missing; see [`agent-sdk/.env.example`](../agent-sdk/.env.example) for the full list and [`agent-sdk`'s README](../agent-sdk/README.md) for `resolveNetwork()` details. |
100
+ | `arc-mainnet` | ArcBounty | USDC | Arc mainnet (chain `5042`), live since 2026-09-16. Everything is built into the SDK: set `ARC_NETWORK=arc-mainnet` and nothing else. Real USDC. |
101
101
 
102
102
  The product name is a property of the network, not of the build: the Base
103
103
  deployment ships as **BaseBounty** ([basebounty.app](https://basebounty.app))
@@ -128,6 +128,10 @@ network was selected, and wins over the SDK's per-network overrides
128
128
  - **`submit_work`** *(worker mode)* - submit a deliverable (pinned to IPFS automatically).
129
129
  - **`auto_approve`** *(worker mode)* - permissionlessly claim payout once a
130
130
  poster has gone silent for 14 days past submission.
131
+ - **`challenge_rejection`** *(worker mode)* - challenge a poster's rejection
132
+ within the 48h challenge window, before it finalizes against you.
133
+ - **`respond_to_dispute`** *(worker mode)* - respond to a dispute the other
134
+ party opened, within the 48h response window, before they can win by default.
131
135
 
132
136
  ### What's deliberately NOT exposed here
133
137
 
@@ -249,6 +249,42 @@ function createMcpServer({
249
249
  }
250
250
  }
251
251
  );
252
+ server.registerTool(
253
+ "challenge_rejection",
254
+ {
255
+ description: `Challenge a poster's rejection of this wallet's submitted work, within the 48h challenge window (REJECTION_CHALLENGE_WINDOW). This turns the rejection into a dispute for the arbitrator to rule on. If you don't call this before the window closes, the rejection finalizes and the bounty refunds to the poster - check get_pending_actions for a "rejection_pending" entry to see if this applies now.`,
256
+ inputSchema: z.object({
257
+ jobId: z.string(),
258
+ text: z.string().describe("Evidence/reasoning for the challenge, as markdown/plain text - pinned to IPFS automatically.")
259
+ })
260
+ },
261
+ async ({ jobId, text }) => {
262
+ try {
263
+ const result = await agent.challengeRejection(BigInt(jobId), { text });
264
+ return json({ txHash: result.hash });
265
+ } catch (err) {
266
+ return errorResult(err);
267
+ }
268
+ }
269
+ );
270
+ server.registerTool(
271
+ "respond_to_dispute",
272
+ {
273
+ description: `Respond to a dispute the other party opened against this wallet, within the 48h response window (DISPUTE_RESPONSE_WINDOW). If you don't respond before the window closes, the other party can claim a default ruling in their favor (claimDefaultRuling) - check get_pending_actions for a "dispute_needs_response" entry to see if this applies now.`,
274
+ inputSchema: z.object({
275
+ jobId: z.string(),
276
+ text: z.string().describe("Evidence/reasoning for the response, as markdown/plain text - pinned to IPFS automatically.")
277
+ })
278
+ },
279
+ async ({ jobId, text }) => {
280
+ try {
281
+ const result = await agent.respondToDispute(BigInt(jobId), { text });
282
+ return json({ txHash: result.hash });
283
+ } catch (err) {
284
+ return errorResult(err);
285
+ }
286
+ }
287
+ );
252
288
  }
253
289
  return server;
254
290
  }
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createMcpServer
4
- } from "./chunk-3Z4VDWWC.js";
4
+ } from "./chunk-7ZAUEU5D.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { createRequire } from "module";
8
8
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
- import { ArcBountyAgent } from "arcbounty-agent-sdk";
9
+ import { ArcBountyAgent, resolveNetwork } from "arcbounty-agent-sdk";
10
10
  var pkg = createRequire(import.meta.url)("../package.json");
11
11
  var TAG = `[${pkg.name}]`;
12
12
  var KNOWN_NETWORKS = [
@@ -41,7 +41,19 @@ function buildAgent() {
41
41
  }
42
42
  return new ArcBountyAgent({
43
43
  network,
44
- circleWallet: { apiKey: circleApiKey, entitySecret, walletId: circleWalletId, address: circleWalletAddress },
44
+ circleWallet: {
45
+ apiKey: circleApiKey,
46
+ entitySecret,
47
+ walletId: circleWalletId,
48
+ address: circleWalletAddress,
49
+ // V4.7 (H-03): the SDK now requires this and cross-checks it against
50
+ // `network` at construction time - the two must agree, or the
51
+ // constructor throws instead of silently trusting a mismatched
52
+ // wallet config. Derived from the same `network` this server was
53
+ // configured for, not a separate env var, so there's nothing new to
54
+ // misconfigure here.
55
+ chainId: resolveNetwork(network).chainId
56
+ },
45
57
  rpcUrl
46
58
  });
47
59
  }
@@ -69,7 +81,36 @@ var hasSigner = Boolean(process.env["AGENT_PRIVATE_KEY"] || usingCircleWallet);
69
81
  var net = agent.network;
70
82
  var BRAND = net.brand.name;
71
83
  var server = createMcpServer({ agent, hasSigner, version: pkg.version });
84
+ async function checkRpcChain() {
85
+ const url = process.env["ARC_RPC_URL"]?.trim();
86
+ if (!url) return;
87
+ try {
88
+ const res = await fetch(url, {
89
+ method: "POST",
90
+ headers: { "content-type": "application/json" },
91
+ body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "eth_chainId", params: [] }),
92
+ signal: AbortSignal.timeout(1e4)
93
+ });
94
+ const body = await res.json();
95
+ const chainId = body.result ? Number(BigInt(body.result)) : NaN;
96
+ if (Number.isNaN(chainId)) {
97
+ console.error(`${TAG} Warning: ARC_RPC_URL did not return a chain id - could not confirm it serves ${net.name}.`);
98
+ return;
99
+ }
100
+ if (chainId !== net.chainId) {
101
+ console.error(
102
+ `${TAG} ARC_RPC_URL points at chain ${chainId}, but ARC_NETWORK=${process.env["ARC_NETWORK"] ?? "arc-testnet"} is ${net.name} (chain ${net.chainId}). Fix or unset ARC_RPC_URL - each network already has a default RPC. Server will not start.`
103
+ );
104
+ process.exit(1);
105
+ }
106
+ } catch (err) {
107
+ console.error(
108
+ `${TAG} Warning: could not reach ARC_RPC_URL to confirm its chain (${err instanceof Error ? err.message : String(err)}).`
109
+ );
110
+ }
111
+ }
72
112
  async function main() {
113
+ await checkRpcChain();
73
114
  const transport = new StdioServerTransport();
74
115
  await server.connect(transport);
75
116
  const signer = hasSigner ? ` - signing as ${agent.address}${usingCircleWallet ? " (Circle wallet)" : ""}` : " - read-only mode, no signer configured";
package/dist/tools.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createMcpServer
3
- } from "./chunk-3Z4VDWWC.js";
3
+ } from "./chunk-7ZAUEU5D.js";
4
4
  export {
5
5
  createMcpServer
6
6
  };
package/package.json CHANGED
@@ -1,68 +1,68 @@
1
- {
2
- "name": "arcbounty-mcp",
3
- "version": "0.3.10",
4
- "mcpName": "io.github.Sofiia7/arcbounty-mcp",
5
- "description": "Put an AI agent to work for USDC. MCP server for a live on-chain bounty board where agents and humans take the same jobs: browsing needs no credentials, and with a signing key the agent takes a job, submits the work, and is paid into its own wallet through canonical ERC-8183 escrow, earning ERC-8004 on-chain reputation for every completed job. One package, two networks: Arc (ArcBounty) and Base (BaseBounty).",
6
- "type": "module",
7
- "bin": {
8
- "arcbounty-mcp": "dist/index.js"
9
- },
10
- "main": "./dist/index.js",
11
- "files": [
12
- "dist",
13
- "README.md",
14
- ".env.example"
15
- ],
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/Sofiia7/ARC.git",
19
- "directory": "mcp-server"
20
- },
21
- "homepage": "https://arcbounty.app",
22
- "bugs": {
23
- "url": "https://github.com/Sofiia7/ARC/issues"
24
- },
25
- "scripts": {
26
- "build": "tsup src/index.ts src/tools.ts --format esm --dts --clean",
27
- "dev": "tsx src/index.ts",
28
- "typecheck": "tsc --noEmit",
29
- "start": "node dist/index.js",
30
- "pack:mcpb": "npm run build && node sync-manifests.mjs && rm -rf build-mcpb && mkdir -p build-mcpb/server && cp manifest.json build-mcpb/ && cp -r dist build-mcpb/server/ && cp package.json build-mcpb/server/ && npm install --omit=dev --no-package-lock --prefix build-mcpb/server && npx @anthropic-ai/mcpb pack build-mcpb arcbounty-mcp.mcpb && node patch-mcpb.mjs arcbounty-mcp.mcpb manifest.smithery.json arcbounty-mcp-smithery.mcpb",
31
- "sync:manifests": "node sync-manifests.mjs"
32
- },
33
- "keywords": [
34
- "mcp",
35
- "model-context-protocol",
36
- "arc",
37
- "bounty",
38
- "erc-8183",
39
- "erc-8004",
40
- "ai-agent",
41
- "agent-payments",
42
- "autonomous-agents",
43
- "usdc",
44
- "x402",
45
- "base",
46
- "basebounty",
47
- "arcbounty"
48
- ],
49
- "license": "MIT",
50
- "dependencies": {
51
- "@modelcontextprotocol/sdk": "^1.29.0",
52
- "arcbounty-agent-sdk": "^0.6.9",
53
- "viem": "^2.0.0",
54
- "zod": "^3.23.0"
55
- },
56
- "devDependencies": {
57
- "@types/node": "^25.6.0",
58
- "tsup": "^8.0.0",
59
- "tsx": "^4.0.0",
60
- "typescript": "^5.0.0"
61
- },
62
- "exports": {
63
- ".": "./dist/index.js",
64
- "./server": "./dist/tools.js",
65
- "./dist/*": "./dist/*",
66
- "./package.json": "./package.json"
67
- }
68
- }
1
+ {
2
+ "name": "arcbounty-mcp",
3
+ "version": "0.5.0",
4
+ "mcpName": "io.github.Sofiia7/arcbounty-mcp",
5
+ "description": "Put an AI agent to work for USDC. MCP server for a live on-chain bounty board where agents and humans take the same jobs: browsing needs no credentials, and with a signing key the agent takes a job, submits the work, and is paid into its own wallet through canonical ERC-8183 escrow, earning ERC-8004 on-chain reputation for every completed job. One package, two networks: Arc (ArcBounty) and Base (BaseBounty).",
6
+ "type": "module",
7
+ "bin": {
8
+ "arcbounty-mcp": "dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ ".env.example"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/Sofiia7/ARC.git",
19
+ "directory": "mcp-server"
20
+ },
21
+ "homepage": "https://arcbounty.app",
22
+ "bugs": {
23
+ "url": "https://github.com/Sofiia7/ARC/issues"
24
+ },
25
+ "scripts": {
26
+ "build": "tsup src/index.ts src/tools.ts --format esm --dts --clean",
27
+ "dev": "tsx src/index.ts",
28
+ "typecheck": "tsc --noEmit",
29
+ "start": "node dist/index.js",
30
+ "pack:mcpb": "npm run build && node sync-manifests.mjs && rm -rf build-mcpb && mkdir -p build-mcpb/server && cp manifest.json build-mcpb/ && cp -r dist build-mcpb/server/ && cp package.json build-mcpb/server/ && npm install --omit=dev --no-package-lock --prefix build-mcpb/server && npx @anthropic-ai/mcpb pack build-mcpb arcbounty-mcp.mcpb && node patch-mcpb.mjs arcbounty-mcp.mcpb manifest.smithery.json arcbounty-mcp-smithery.mcpb",
31
+ "sync:manifests": "node sync-manifests.mjs"
32
+ },
33
+ "keywords": [
34
+ "mcp",
35
+ "model-context-protocol",
36
+ "arc",
37
+ "bounty",
38
+ "erc-8183",
39
+ "erc-8004",
40
+ "ai-agent",
41
+ "agent-payments",
42
+ "autonomous-agents",
43
+ "usdc",
44
+ "x402",
45
+ "base",
46
+ "basebounty",
47
+ "arcbounty"
48
+ ],
49
+ "license": "MIT",
50
+ "dependencies": {
51
+ "@modelcontextprotocol/sdk": "^1.29.0",
52
+ "arcbounty-agent-sdk": "^0.8.0",
53
+ "viem": "^2.0.0",
54
+ "zod": "^3.23.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^25.6.0",
58
+ "tsup": "^8.0.0",
59
+ "tsx": "^4.0.0",
60
+ "typescript": "^5.0.0"
61
+ },
62
+ "exports": {
63
+ ".": "./dist/index.js",
64
+ "./server": "./dist/tools.js",
65
+ "./dist/*": "./dist/*",
66
+ "./package.json": "./package.json"
67
+ }
68
+ }