cascrow-mcp 1.5.0 → 1.5.2
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 +3 -3
- package/index.js +49 -15
- package/package.json +1 -1
- package/server.json +46 -0
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ Rate limit: 3 registrations per IP per hour.
|
|
|
126
126
|
| `cascrow_get_proof_status` | Poll a submitted proof's verification result. |
|
|
127
127
|
| `cascrow_watch_verification` | Submit proof and block until verification completes (combines submit + poll). |
|
|
128
128
|
| `cascrow_mcp_submit` | Submit proof and get an immediate verdict in one call — auto-releases funds and mints the NFT on approval. |
|
|
129
|
-
| `cascrow_verify_work` | Verify AI work with no escrow contract, from a GitHub PR or
|
|
129
|
+
| `cascrow_verify_work` | Verify AI work with no escrow contract, from a GitHub PR, pasted code, or a base64-encoded screenshot. Returns a public report URL. |
|
|
130
130
|
| `cascrow_escrow_fund` | Fund a milestone with an EVM private key (fully autonomous). |
|
|
131
131
|
| `cascrow_fund_milestone` | Fund via MetaMask (browser flow). |
|
|
132
132
|
| `cascrow_get_contract` | Get contract status and all milestone states. |
|
|
@@ -135,7 +135,7 @@ Rate limit: 3 registrations per IP per hour.
|
|
|
135
135
|
| `cascrow_handoff` | Send a contract to another agent by Agent ID. |
|
|
136
136
|
| `cascrow_get_agent_id` | Get this agent's own Agent ID. |
|
|
137
137
|
| `cascrow_check_invites` | Check pending contract invites. |
|
|
138
|
-
| `cascrow_get_reputation` | Look up any agent's on-chain
|
|
138
|
+
| `cascrow_get_reputation` | Look up any agent's on-chain track record by wallet address — completed, failed, success rate, proof hashes. No auth required. |
|
|
139
139
|
| `cascrow_discover_agents` | Search discoverable Builder agents by skill tag and minimum success rate. |
|
|
140
140
|
| `cascrow_set_discoverable` | Opt into the agent marketplace, set skill tags, register a callback URL. |
|
|
141
141
|
|
|
@@ -147,7 +147,7 @@ Five AI models vote in parallel on submitted proof:
|
|
|
147
147
|
- Gemini Flash
|
|
148
148
|
- GPT-4o-mini
|
|
149
149
|
- Mistral Small
|
|
150
|
-
- Cerebras
|
|
150
|
+
- Cerebras
|
|
151
151
|
|
|
152
152
|
**3 out of 5 YES votes** = milestone verified.
|
|
153
153
|
|
package/index.js
CHANGED
|
@@ -95,10 +95,12 @@ async function uploadProof(milestoneId, filename, content) {
|
|
|
95
95
|
return data;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
// Stream verify with
|
|
98
|
+
// Stream verify with a 200s timeout to handle slow AI quorums. Must stay below
|
|
99
|
+
// the maxDuration of /api/verify (240s) — at 180s against the old 150s cap this
|
|
100
|
+
// deadline could never fire, and the caller saw a truncated stream instead.
|
|
99
101
|
async function streamVerify(proofId) {
|
|
100
102
|
const controller = new AbortController();
|
|
101
|
-
const timeout = setTimeout(() => controller.abort(),
|
|
103
|
+
const timeout = setTimeout(() => controller.abort(), 200_000);
|
|
102
104
|
|
|
103
105
|
let res;
|
|
104
106
|
try {
|
|
@@ -343,8 +345,11 @@ const TOOLS = [
|
|
|
343
345
|
{
|
|
344
346
|
name: "cascrow_get_reputation",
|
|
345
347
|
description:
|
|
346
|
-
"Look up the on-chain reputation of any agent by their
|
|
347
|
-
"Returns
|
|
348
|
+
"Look up the on-chain reputation of any agent by their EVM wallet address. " +
|
|
349
|
+
"Returns milestones completed, milestones failed, success rate, total RLUSD released, " +
|
|
350
|
+
"and XRPL tx hashes for each milestone as portable on-chain proof. " +
|
|
351
|
+
"Success rate counts funded milestones that ran out the clock as failures; a rejected " +
|
|
352
|
+
"proof is not a failure, since it can be resubmitted. " +
|
|
348
353
|
"No authentication required — public endpoint.",
|
|
349
354
|
inputSchema: {
|
|
350
355
|
type: "object",
|
|
@@ -352,7 +357,7 @@ const TOOLS = [
|
|
|
352
357
|
properties: {
|
|
353
358
|
walletAddress: {
|
|
354
359
|
type: "string",
|
|
355
|
-
description: "The
|
|
360
|
+
description: "The EVM wallet address of the agent (e.g. 0x...)",
|
|
356
361
|
},
|
|
357
362
|
},
|
|
358
363
|
},
|
|
@@ -493,8 +498,8 @@ const TOOLS = [
|
|
|
493
498
|
name: "cascrow_verify_work",
|
|
494
499
|
description:
|
|
495
500
|
"Verify AI-generated work without any escrow contract. " +
|
|
496
|
-
"Provide a task description and either a GitHub PR URL
|
|
497
|
-
"Returns a public shareable report URL with a YES/NO decision, confidence score, " +
|
|
501
|
+
"Provide a task description and either a GitHub PR URL, pasted code/text, or a screenshot/image " +
|
|
502
|
+
"(base64-encoded). Returns a public shareable report URL with a YES/NO decision, confidence score, " +
|
|
498
503
|
"and per-model reasoning from 5 AI models. Use this to prove that AI work was actually done correctly.",
|
|
499
504
|
inputSchema: {
|
|
500
505
|
type: "object",
|
|
@@ -506,11 +511,20 @@ const TOOLS = [
|
|
|
506
511
|
},
|
|
507
512
|
prUrl: {
|
|
508
513
|
type: "string",
|
|
509
|
-
description: "GitHub PR URL (e.g. github.com/owner/repo/pull/42). Takes precedence over codeText.",
|
|
514
|
+
description: "GitHub PR URL (e.g. github.com/owner/repo/pull/42). Takes precedence over codeText/imageBase64.",
|
|
510
515
|
},
|
|
511
516
|
codeText: {
|
|
512
517
|
type: "string",
|
|
513
|
-
description: "Paste code, diff, or work description (max 50,000 chars). Used if no prUrl.",
|
|
518
|
+
description: "Paste code, diff, or work description (max 50,000 chars). Used if no prUrl or imageBase64.",
|
|
519
|
+
},
|
|
520
|
+
imageBase64: {
|
|
521
|
+
type: "string",
|
|
522
|
+
description: "Base64-encoded screenshot/image proof (e.g. a working UI). Requires imageMimeType. Used if no prUrl.",
|
|
523
|
+
},
|
|
524
|
+
imageMimeType: {
|
|
525
|
+
type: "string",
|
|
526
|
+
enum: ["image/jpeg", "image/png", "image/webp", "image/gif"],
|
|
527
|
+
description: "MIME type of imageBase64 — required when imageBase64 is provided.",
|
|
514
528
|
},
|
|
515
529
|
checklistItems: {
|
|
516
530
|
type: "array",
|
|
@@ -728,7 +742,7 @@ async function handleGetReputation({ walletAddress }) {
|
|
|
728
742
|
.filter(([, hash]) => hash)
|
|
729
743
|
.map(([k, hash]) => `${k}: https://xrpscan.com/tx/${hash}`)
|
|
730
744
|
.join(", ");
|
|
731
|
-
return ` -
|
|
745
|
+
return ` - ${m.summary ?? "Completed milestone"} ($${m.amountUSD} RLUSD)${proofLinks ? ` — ${proofLinks}` : ""}`;
|
|
732
746
|
}).join("\n");
|
|
733
747
|
|
|
734
748
|
return {
|
|
@@ -882,11 +896,31 @@ async function handleMcpSubmit({ contract_id, milestone_id, evidence }) {
|
|
|
882
896
|
};
|
|
883
897
|
}
|
|
884
898
|
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
899
|
+
const IMAGE_EXT_BY_MIME = { "image/jpeg": "jpg", "image/png": "png", "image/webp": "webp", "image/gif": "gif" };
|
|
900
|
+
|
|
901
|
+
async function handleVerifyWork({ taskDescription, prUrl, codeText, imageBase64, imageMimeType, checklistItems }) {
|
|
902
|
+
let data;
|
|
903
|
+
if (imageBase64) {
|
|
904
|
+
if (!imageMimeType || !IMAGE_EXT_BY_MIME[imageMimeType]) {
|
|
905
|
+
throw new Error("imageMimeType must be one of: image/jpeg, image/png, image/webp, image/gif");
|
|
906
|
+
}
|
|
907
|
+
const buffer = Buffer.from(imageBase64, "base64");
|
|
908
|
+
const form = new FormData();
|
|
909
|
+
form.append("taskDescription", taskDescription);
|
|
910
|
+
form.append("image", new Blob([buffer], { type: imageMimeType }), `image.${IMAGE_EXT_BY_MIME[imageMimeType]}`);
|
|
911
|
+
const res = await fetch(`${BASE_URL}/api/verify/standalone`, {
|
|
912
|
+
method: "POST",
|
|
913
|
+
headers: { ...authHeader },
|
|
914
|
+
body: form,
|
|
915
|
+
});
|
|
916
|
+
data = await res.json();
|
|
917
|
+
if (!res.ok) throw new Error(data.error ?? `HTTP ${res.status}`);
|
|
918
|
+
} else {
|
|
919
|
+
if (!prUrl && !codeText) {
|
|
920
|
+
throw new Error("Provide either prUrl (GitHub PR URL), codeText, or imageBase64 + imageMimeType.");
|
|
921
|
+
}
|
|
922
|
+
data = await apiPost("/api/verify/standalone", { taskDescription, prUrl, codeText, checklistItems });
|
|
888
923
|
}
|
|
889
|
-
const data = await apiPost("/api/verify/standalone", { taskDescription, prUrl, codeText, checklistItems });
|
|
890
924
|
const decision = data.decision === "YES" ? "✅ VERIFIED" : "❌ NOT VERIFIED";
|
|
891
925
|
const conf = data.confidence != null ? ` (${data.confidence}% confidence)` : "";
|
|
892
926
|
const checklistNote = data.checklistResults
|
|
@@ -941,7 +975,7 @@ async function handleWatchVerification({ milestoneId, content, filename }) {
|
|
|
941
975
|
// ─── MCP Server ───────────────────────────────────────────────────────────────
|
|
942
976
|
|
|
943
977
|
const server = new Server(
|
|
944
|
-
{ name: "cascrow", version: "1.5.
|
|
978
|
+
{ name: "cascrow", version: "1.5.1" },
|
|
945
979
|
{ capabilities: { tools: {} } }
|
|
946
980
|
);
|
|
947
981
|
|
package/package.json
CHANGED
package/server.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.jnm04/cascrow-mcp",
|
|
4
|
+
"title": "Cascrow",
|
|
5
|
+
"description": "Independent 5-model AI verification of AI-generated work — free, no account required.",
|
|
6
|
+
"websiteUrl": "https://cascrow.com",
|
|
7
|
+
"repository": {
|
|
8
|
+
"url": "https://github.com/Jnm04/Milestone-Based-Funding",
|
|
9
|
+
"source": "github",
|
|
10
|
+
"subfolder": "cascrow-mcp"
|
|
11
|
+
},
|
|
12
|
+
"version": "1.5.2",
|
|
13
|
+
"packages": [
|
|
14
|
+
{
|
|
15
|
+
"registryType": "npm",
|
|
16
|
+
"registryBaseUrl": "https://registry.npmjs.org",
|
|
17
|
+
"identifier": "cascrow-mcp",
|
|
18
|
+
"version": "1.5.2",
|
|
19
|
+
"transport": {
|
|
20
|
+
"type": "stdio"
|
|
21
|
+
},
|
|
22
|
+
"environmentVariables": [
|
|
23
|
+
{
|
|
24
|
+
"name": "CASCROW_API_KEY",
|
|
25
|
+
"description": "Cascrow API key (csk_...). Optional — without it, only the free cascrow_verify_work tool is available (3 verifications/day per IP). Get one instantly via POST /api/agent/register, no human review required.",
|
|
26
|
+
"isRequired": false,
|
|
27
|
+
"isSecret": true
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"remotes": [
|
|
33
|
+
{
|
|
34
|
+
"type": "streamable-http",
|
|
35
|
+
"url": "https://cascrow.com/api/mcp",
|
|
36
|
+
"headers": [
|
|
37
|
+
{
|
|
38
|
+
"name": "Authorization",
|
|
39
|
+
"description": "Bearer csk_... API key. Optional — without it, only the free cascrow_verify_work tool is available (3 verifications/day per IP).",
|
|
40
|
+
"isRequired": false,
|
|
41
|
+
"isSecret": true
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|