@gwilll/vouch-mcp 0.1.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 +71 -0
- package/bin/vouch-mcp.js +6 -0
- package/dist/client.d.ts +95 -0
- package/dist/client.js +174 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +187 -0
- package/dist/server.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @gwilll/vouch-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for [Vouch](https://github.com/big14way/vouch) — pay on verified delivery. Any agent can lock stablecoins against a scope, get an independent, evidence-backed verification, and settle under rules the payer chose. Tempo (MPP) and Base (x402).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -g @gwilll/vouch-mcp # or run with npx @gwilll/vouch-mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Environment:
|
|
12
|
+
|
|
13
|
+
| Variable | Required | Meaning |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `VOUCH_API_URL` | yes | e.g. `https://vouch-rouge.vercel.app` (or `http://localhost:3000`) |
|
|
16
|
+
| `VOUCH_AGENT_PRIVATE_KEY` | for funding / delivering / approving | Wallet holding pathUSD (Tempo) or USDC (Base). Also used to sign Submit/Settle/Dispute. |
|
|
17
|
+
| `VOUCH_API_KEY` | no | Issued automatically from the wallet on first use if omitted |
|
|
18
|
+
| `VOUCH_DEFAULT_CHAIN` | no | `4217` Tempo (default), `42431` Tempo testnet, `8453` Base, `84532` Base Sepolia |
|
|
19
|
+
| `VOUCH_MAX_PAYMENT` | no | Max dollars per fund call the wallet may pay (default 100) |
|
|
20
|
+
| `VOUCH_HTTP_PORT` | no | Serve Streamable HTTP at `/mcp` instead of stdio |
|
|
21
|
+
|
|
22
|
+
## Claude Code (5-line config)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claude mcp add vouch -e VOUCH_API_URL=https://vouch-rouge.vercel.app -e VOUCH_AGENT_PRIVATE_KEY=0x… -- npx -y @gwilll/vouch-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Codex
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
codex mcp add vouch --env VOUCH_API_URL=https://vouch-rouge.vercel.app --env VOUCH_AGENT_PRIVATE_KEY=0x… -- npx -y @gwilll/vouch-mcp
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Cursor / manual (`mcp.json`)
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"vouch": {
|
|
40
|
+
"command": "npx",
|
|
41
|
+
"args": ["-y", "@gwilll/vouch-mcp"],
|
|
42
|
+
"env": { "VOUCH_API_URL": "https://vouch-rouge.vercel.app", "VOUCH_AGENT_PRIVATE_KEY": "0x…" }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Tools
|
|
49
|
+
|
|
50
|
+
| Tool | What it does |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `vouch_create_job` | Scope + amount + policy → jobId, pay link, fund routes |
|
|
53
|
+
| `vouch_fund_job` | Pays the 402 (MPP charge on Tempo with memo = jobId; x402/EIP-3009 on Base) → `Funded` + tx |
|
|
54
|
+
| `vouch_submit_delivery` | Pins files (sha256), links, note; signs Submit; queues the verifier |
|
|
55
|
+
| `vouch_get_verdict` | Waits for the verifier; returns verdict, confidence, checklist, evidence, attestation tx |
|
|
56
|
+
| `vouch_approve` | Payer releases payment (signed Settle, relayed) |
|
|
57
|
+
| `vouch_dispute` | Either party objects → arbiter |
|
|
58
|
+
| `vouch_get_job` | Status, policy, timestamps, txs, optional timeline |
|
|
59
|
+
| `vouch_list_jobs` | Jobs where the wallet is payer or worker |
|
|
60
|
+
|
|
61
|
+
Resources: `vouch://job/{id}`, `vouch://verdict/{id}`. Prompt: `hire_for_task`.
|
|
62
|
+
|
|
63
|
+
## One HTTP request instead
|
|
64
|
+
|
|
65
|
+
Agents that don't speak MCP can use MPP or x402 directly:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx mppx https://vouch-rouge.vercel.app/api/v1/jobs/<jobId>/fund -X POST # Tempo: pays the charge, returns { status: "Funded", tx }
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
See the [API reference](https://vouch-rouge.vercel.app/openapi.json).
|
package/bin/vouch-mcp.js
ADDED
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { type PrivateKeyAccount } from "viem/accounts";
|
|
2
|
+
import type { Address, Hex } from "viem";
|
|
3
|
+
import { type JobDto, type VerdictDto } from "@vouch/shared";
|
|
4
|
+
import type { Config } from "./config.js";
|
|
5
|
+
export declare class VouchError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly next?: string | undefined;
|
|
8
|
+
constructor(message: string, code: string, next?: string | undefined);
|
|
9
|
+
}
|
|
10
|
+
/** Thin REST client + payer wallet. Everything the MCP tools do goes through here. */
|
|
11
|
+
export declare class VouchClient {
|
|
12
|
+
readonly cfg: Config;
|
|
13
|
+
readonly account: PrivateKeyAccount | null;
|
|
14
|
+
private apiKey;
|
|
15
|
+
private payer;
|
|
16
|
+
constructor(cfg: Config);
|
|
17
|
+
get address(): Address | null;
|
|
18
|
+
private url;
|
|
19
|
+
/** Issue an API key bound to the agent wallet on first use (no login: the wallet is the identity). */
|
|
20
|
+
ensureApiKey(): Promise<string | undefined>;
|
|
21
|
+
request<T>(method: string, path: string, body?: unknown, extraHeaders?: Record<string, string>): Promise<T>;
|
|
22
|
+
createJob(input: Record<string, unknown>): Promise<{
|
|
23
|
+
jobId: Hex;
|
|
24
|
+
shortId: string;
|
|
25
|
+
payUrl: string;
|
|
26
|
+
mcpHint: string;
|
|
27
|
+
fundRoutes: unknown[];
|
|
28
|
+
job: JobDto;
|
|
29
|
+
}>;
|
|
30
|
+
getJob(id: string): Promise<{
|
|
31
|
+
job: JobDto;
|
|
32
|
+
}>;
|
|
33
|
+
listJobs(status?: string): Promise<{
|
|
34
|
+
jobs: JobDto[];
|
|
35
|
+
}>;
|
|
36
|
+
getVerdict(id: string): Promise<{
|
|
37
|
+
jobId: string;
|
|
38
|
+
verdict: "PASS" | "NEEDS_REVIEW" | "FAIL" | null;
|
|
39
|
+
confidence: number | null;
|
|
40
|
+
confidenceBps: number | null;
|
|
41
|
+
scope_items: {
|
|
42
|
+
item: string;
|
|
43
|
+
status: "met" | "partial" | "missing" | "unverifiable";
|
|
44
|
+
evidence: string;
|
|
45
|
+
}[] | null;
|
|
46
|
+
summary: string | null;
|
|
47
|
+
questions_for_worker: string[];
|
|
48
|
+
red_flags: string[];
|
|
49
|
+
attestationTx: string | null;
|
|
50
|
+
attestationHash: string | null;
|
|
51
|
+
reportUrl: string | null;
|
|
52
|
+
stage: "done" | "queued" | "reading_scope" | "checking_files" | "writing_report" | "attesting" | "failed" | null;
|
|
53
|
+
autoSettleAt: string | null;
|
|
54
|
+
}>;
|
|
55
|
+
getTimeline(id: string): Promise<{
|
|
56
|
+
events: unknown[];
|
|
57
|
+
}>;
|
|
58
|
+
private payerFetch;
|
|
59
|
+
/** POST /fund. A 402 is paid automatically by mppx (Tempo charge or EIP-3009), then the 200 comes back. */
|
|
60
|
+
fundJob(id: string): Promise<{
|
|
61
|
+
status: string;
|
|
62
|
+
route?: string;
|
|
63
|
+
tx?: string;
|
|
64
|
+
paymentTx?: string;
|
|
65
|
+
job: JobDto;
|
|
66
|
+
note?: string;
|
|
67
|
+
}>;
|
|
68
|
+
private signAction;
|
|
69
|
+
submitDelivery(id: string, input: {
|
|
70
|
+
files: string[];
|
|
71
|
+
links: string[];
|
|
72
|
+
note: string;
|
|
73
|
+
}, resubmit?: boolean): Promise<{
|
|
74
|
+
status: string;
|
|
75
|
+
tx: string;
|
|
76
|
+
deliverableHash: Hex;
|
|
77
|
+
verifier: {
|
|
78
|
+
id: string;
|
|
79
|
+
stage: string;
|
|
80
|
+
};
|
|
81
|
+
job: JobDto;
|
|
82
|
+
}>;
|
|
83
|
+
approve(id: string): Promise<{
|
|
84
|
+
status: string;
|
|
85
|
+
tx: string;
|
|
86
|
+
job: JobDto;
|
|
87
|
+
}>;
|
|
88
|
+
dispute(id: string, reason: string): Promise<{
|
|
89
|
+
status: string;
|
|
90
|
+
tx: string;
|
|
91
|
+
job: JobDto;
|
|
92
|
+
}>;
|
|
93
|
+
/** Poll until the verifier is done (or a timeout). */
|
|
94
|
+
waitForVerdict(id: string, timeoutMs?: number, intervalMs?: number): Promise<VerdictDto>;
|
|
95
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, extname } from "node:path";
|
|
4
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
5
|
+
import { Mppx, evm, tempo } from "mppx/client";
|
|
6
|
+
import { agentKeyChallenge, hashManifest } from "@vouch/shared";
|
|
7
|
+
export class VouchError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
next;
|
|
10
|
+
constructor(message, code, next) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.next = next;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const MIME = {
|
|
17
|
+
".md": "text/markdown", ".txt": "text/plain", ".json": "application/json", ".csv": "text/csv", ".html": "text/html",
|
|
18
|
+
".pdf": "application/pdf", ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".gif": "image/gif", ".webp": "image/webp",
|
|
19
|
+
".js": "text/javascript", ".ts": "text/typescript", ".py": "text/x-python", ".sol": "text/plain", ".zip": "application/zip",
|
|
20
|
+
};
|
|
21
|
+
/** Thin REST client + payer wallet. Everything the MCP tools do goes through here. */
|
|
22
|
+
export class VouchClient {
|
|
23
|
+
cfg;
|
|
24
|
+
account;
|
|
25
|
+
apiKey;
|
|
26
|
+
payer = null;
|
|
27
|
+
constructor(cfg) {
|
|
28
|
+
this.cfg = cfg;
|
|
29
|
+
this.account = cfg.VOUCH_AGENT_PRIVATE_KEY ? privateKeyToAccount(cfg.VOUCH_AGENT_PRIVATE_KEY) : null;
|
|
30
|
+
this.apiKey = cfg.VOUCH_API_KEY;
|
|
31
|
+
}
|
|
32
|
+
get address() {
|
|
33
|
+
return this.account?.address ?? null;
|
|
34
|
+
}
|
|
35
|
+
url(path) {
|
|
36
|
+
return `${this.cfg.VOUCH_API_URL.replace(/\/$/, "")}/api/v1${path}`;
|
|
37
|
+
}
|
|
38
|
+
/** Issue an API key bound to the agent wallet on first use (no login: the wallet is the identity). */
|
|
39
|
+
async ensureApiKey() {
|
|
40
|
+
if (this.apiKey)
|
|
41
|
+
return this.apiKey;
|
|
42
|
+
if (!this.account)
|
|
43
|
+
return undefined;
|
|
44
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
45
|
+
const signature = await this.account.signMessage({ message: agentKeyChallenge(this.account.address, timestamp) });
|
|
46
|
+
const res = await fetch(this.url("/agents/keys"), {
|
|
47
|
+
method: "POST", headers: { "content-type": "application/json" },
|
|
48
|
+
body: JSON.stringify({ label: `mcp ${new Date().toISOString().slice(0, 10)}`, address: this.account.address, timestamp, signature }),
|
|
49
|
+
});
|
|
50
|
+
const data = (await res.json());
|
|
51
|
+
if (!res.ok || !data.key)
|
|
52
|
+
throw new VouchError(data.error?.message ?? "could not create API key", "key_error");
|
|
53
|
+
this.apiKey = data.key;
|
|
54
|
+
return this.apiKey;
|
|
55
|
+
}
|
|
56
|
+
async request(method, path, body, extraHeaders = {}) {
|
|
57
|
+
const key = await this.ensureApiKey();
|
|
58
|
+
const res = await fetch(this.url(path), {
|
|
59
|
+
method,
|
|
60
|
+
// x-api-key (not Authorization) so the MPP `Authorization: Payment …` credential can coexist on /fund.
|
|
61
|
+
headers: { "content-type": "application/json", ...(key ? { "x-api-key": key } : {}), ...extraHeaders },
|
|
62
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
63
|
+
});
|
|
64
|
+
const text = await res.text();
|
|
65
|
+
let data = {};
|
|
66
|
+
try {
|
|
67
|
+
data = text ? JSON.parse(text) : {};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
data = { raw: text };
|
|
71
|
+
}
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
const err = data.error;
|
|
74
|
+
throw new VouchError(err?.message ?? `HTTP ${res.status}`, err?.code ?? `http_${res.status}`, err?.next);
|
|
75
|
+
}
|
|
76
|
+
return data;
|
|
77
|
+
}
|
|
78
|
+
// ---- jobs ----
|
|
79
|
+
createJob(input) {
|
|
80
|
+
return this.request("POST", "/jobs", input);
|
|
81
|
+
}
|
|
82
|
+
getJob(id) {
|
|
83
|
+
return this.request("GET", `/jobs/${id}`);
|
|
84
|
+
}
|
|
85
|
+
listJobs(status) {
|
|
86
|
+
return this.request("GET", `/jobs${status ? `?status=${encodeURIComponent(status)}` : ""}`);
|
|
87
|
+
}
|
|
88
|
+
getVerdict(id) {
|
|
89
|
+
return this.request("GET", `/jobs/${id}/verdict`);
|
|
90
|
+
}
|
|
91
|
+
getTimeline(id) {
|
|
92
|
+
return this.request("GET", `/jobs/${id}/timeline`);
|
|
93
|
+
}
|
|
94
|
+
// ---- payments (MPP on Tempo, x402-compatible evm/charge on Base) ----
|
|
95
|
+
payerFetch() {
|
|
96
|
+
if (!this.account)
|
|
97
|
+
throw new VouchError("VOUCH_AGENT_PRIVATE_KEY is not set.", "no_wallet", "Set VOUCH_AGENT_PRIVATE_KEY to a wallet holding pathUSD (Tempo) or USDC (Base).");
|
|
98
|
+
if (!this.payer) {
|
|
99
|
+
const max = this.cfg.VOUCH_MAX_PAYMENT;
|
|
100
|
+
const mppx = Mppx.create({
|
|
101
|
+
polyfill: false,
|
|
102
|
+
methods: [tempo({ account: this.account }), evm({ account: this.account, maxAmount: max })],
|
|
103
|
+
});
|
|
104
|
+
this.payer = { fetch: mppx.fetch };
|
|
105
|
+
}
|
|
106
|
+
return this.payer.fetch;
|
|
107
|
+
}
|
|
108
|
+
/** POST /fund. A 402 is paid automatically by mppx (Tempo charge or EIP-3009), then the 200 comes back. */
|
|
109
|
+
async fundJob(id) {
|
|
110
|
+
const key = await this.ensureApiKey();
|
|
111
|
+
const doFetch = this.payerFetch();
|
|
112
|
+
const res = await doFetch(this.url(`/jobs/${id}/fund`), {
|
|
113
|
+
method: "POST",
|
|
114
|
+
headers: { "content-type": "application/json", ...(key ? { "x-api-key": key } : {}) },
|
|
115
|
+
body: "{}",
|
|
116
|
+
});
|
|
117
|
+
const data = (await res.json().catch(() => ({})));
|
|
118
|
+
if (res.status === 402)
|
|
119
|
+
throw new VouchError("Payment required but the wallet could not pay.", "payment_failed", "Check the agent wallet holds enough pathUSD/USDC on the job's chain, or set VOUCH_MAX_PAYMENT higher.");
|
|
120
|
+
if (!res.ok || !data.job)
|
|
121
|
+
throw new VouchError(data.error?.message ?? `HTTP ${res.status}`, data.error?.code ?? "fund_failed", data.error?.next);
|
|
122
|
+
return { status: data.status ?? data.job.status, route: data.route, tx: data.tx, paymentTx: data.paymentTx, job: data.job, note: data.note };
|
|
123
|
+
}
|
|
124
|
+
// ---- signed actions ----
|
|
125
|
+
async signAction(id, action, params) {
|
|
126
|
+
if (!this.account)
|
|
127
|
+
throw new VouchError("VOUCH_AGENT_PRIVATE_KEY is not set.", "no_wallet");
|
|
128
|
+
const qs = new URLSearchParams({ action, signer: this.account.address, ...params }).toString();
|
|
129
|
+
const { typedData } = await this.request("GET", `/jobs/${id}/sign?${qs}`);
|
|
130
|
+
const message = Object.fromEntries(Object.entries(typedData.message).map(([k, v]) => [k, k === "nonce" || k === "deadline" ? BigInt(v) : v]));
|
|
131
|
+
const signature = await this.account.signTypedData({
|
|
132
|
+
domain: typedData.domain, types: typedData.types, primaryType: typedData.primaryType, message,
|
|
133
|
+
});
|
|
134
|
+
return { signer: this.account.address, deadline: typedData.message.deadline, signature };
|
|
135
|
+
}
|
|
136
|
+
async submitDelivery(id, input, resubmit = false) {
|
|
137
|
+
if (!this.account)
|
|
138
|
+
throw new VouchError("VOUCH_AGENT_PRIVATE_KEY is not set.", "no_wallet");
|
|
139
|
+
const files = [];
|
|
140
|
+
const payload = [];
|
|
141
|
+
for (const path of input.files) {
|
|
142
|
+
const bytes = await readFile(path);
|
|
143
|
+
const sha256 = `0x${createHash("sha256").update(bytes).digest("hex")}`;
|
|
144
|
+
const contentType = MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
|
|
145
|
+
files.push({ name: basename(path), sha256, size: bytes.length, contentType });
|
|
146
|
+
payload.push({ name: basename(path), contentType, base64: bytes.toString("base64") });
|
|
147
|
+
}
|
|
148
|
+
const core = { jobId: id, submittedBy: this.account.address, files, links: input.links, note: input.note };
|
|
149
|
+
const deliverableHash = hashManifest(core);
|
|
150
|
+
const signature = await this.signAction(id, resubmit ? "Resubmit" : "Submit", { deliverableHash });
|
|
151
|
+
return this.request("POST", `/jobs/${id}/${resubmit ? "resubmit" : "submit"}`, { files: payload, links: input.links, note: input.note, worker: this.account.address, signature });
|
|
152
|
+
}
|
|
153
|
+
async approve(id) {
|
|
154
|
+
const signature = await this.signAction(id, "Settle", {});
|
|
155
|
+
return this.request("POST", `/jobs/${id}/approve`, { signature });
|
|
156
|
+
}
|
|
157
|
+
async dispute(id, reason) {
|
|
158
|
+
const signature = await this.signAction(id, "Dispute", { reason });
|
|
159
|
+
return this.request("POST", `/jobs/${id}/dispute`, { reason, signature });
|
|
160
|
+
}
|
|
161
|
+
/** Poll until the verifier is done (or a timeout). */
|
|
162
|
+
async waitForVerdict(id, timeoutMs = 180_000, intervalMs = 5_000) {
|
|
163
|
+
const deadline = Date.now() + timeoutMs;
|
|
164
|
+
let last = null;
|
|
165
|
+
while (Date.now() < deadline) {
|
|
166
|
+
last = await this.getVerdict(id);
|
|
167
|
+
if (last.stage === "done" || last.stage === "failed")
|
|
168
|
+
return last;
|
|
169
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
170
|
+
}
|
|
171
|
+
return last ?? (await this.getVerdict(id));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const Schema: z.ZodObject<{
|
|
3
|
+
VOUCH_API_URL: z.ZodDefault<z.ZodString>;
|
|
4
|
+
VOUCH_API_KEY: z.ZodOptional<z.ZodString>;
|
|
5
|
+
VOUCH_AGENT_PRIVATE_KEY: z.ZodOptional<z.ZodString>;
|
|
6
|
+
VOUCH_DEFAULT_CHAIN: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
7
|
+
VOUCH_MAX_PAYMENT: z.ZodDefault<z.ZodString>;
|
|
8
|
+
VOUCH_HTTP_PORT: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type Config = z.infer<typeof Schema>;
|
|
11
|
+
export declare function loadConfig(env?: NodeJS.ProcessEnv): Config;
|
|
12
|
+
export {};
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const Schema = z.object({
|
|
3
|
+
VOUCH_API_URL: z.string().url().default("https://vouch.dev"),
|
|
4
|
+
VOUCH_API_KEY: z.string().optional(),
|
|
5
|
+
VOUCH_AGENT_PRIVATE_KEY: z.string().regex(/^0x[0-9a-fA-F]{64}$/).optional(),
|
|
6
|
+
VOUCH_DEFAULT_CHAIN: z.coerce.number().default(4217),
|
|
7
|
+
VOUCH_MAX_PAYMENT: z.string().default("100"), // display units; the payer's own cap per fund call
|
|
8
|
+
VOUCH_HTTP_PORT: z.coerce.number().optional(),
|
|
9
|
+
});
|
|
10
|
+
export function loadConfig(env = process.env) {
|
|
11
|
+
const r = Schema.safeParse(env);
|
|
12
|
+
if (!r.success) {
|
|
13
|
+
const issues = r.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
14
|
+
throw new Error(`Invalid Vouch MCP configuration: ${issues}`);
|
|
15
|
+
}
|
|
16
|
+
return r.data;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAC5D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;IAC3E,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,mDAAmD;IACjG,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createServer } from "./server.js";
|
|
2
|
+
export { VouchClient, VouchError } from "./client.js";
|
|
3
|
+
export { loadConfig, type Config } from "./config.js";
|
|
4
|
+
/** Entry point: stdio by default; `VOUCH_HTTP_PORT=…` serves Streamable HTTP at /mcp instead. */
|
|
5
|
+
export declare function main(): Promise<void>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { createServer as createHttpServer } from "node:http";
|
|
3
|
+
import { loadConfig } from "./config.js";
|
|
4
|
+
import { createServer } from "./server.js";
|
|
5
|
+
export { createServer } from "./server.js";
|
|
6
|
+
export { VouchClient, VouchError } from "./client.js";
|
|
7
|
+
export { loadConfig } from "./config.js";
|
|
8
|
+
/** Entry point: stdio by default; `VOUCH_HTTP_PORT=…` serves Streamable HTTP at /mcp instead. */
|
|
9
|
+
export async function main() {
|
|
10
|
+
const cfg = loadConfig();
|
|
11
|
+
if (cfg.VOUCH_HTTP_PORT) {
|
|
12
|
+
const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
13
|
+
const http = createHttpServer(async (req, res) => {
|
|
14
|
+
if (!req.url?.startsWith("/mcp")) {
|
|
15
|
+
res.writeHead(404).end();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Stateless: one server + transport per request.
|
|
19
|
+
const server = createServer(cfg);
|
|
20
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
21
|
+
res.on("close", () => { void transport.close(); void server.close(); });
|
|
22
|
+
await server.connect(transport);
|
|
23
|
+
await transport.handleRequest(req, res);
|
|
24
|
+
});
|
|
25
|
+
http.listen(cfg.VOUCH_HTTP_PORT, () => console.error(`vouch-mcp listening on http://localhost:${cfg.VOUCH_HTTP_PORT}/mcp`));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const server = createServer(cfg);
|
|
29
|
+
await server.connect(new StdioServerTransport());
|
|
30
|
+
console.error(`vouch-mcp ready (stdio) → ${cfg.VOUCH_API_URL}`);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAEtD,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,EAAE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CAAC,oDAAoD,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,iDAAiD;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;YACvF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,2CAA2C,GAAG,CAAC,eAAe,MAAM,CAAC,CAAC,CAAC;QAC5H,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { formatAmount, parseAmount, POLICY_PRESET_NAMES } from "@vouch/shared";
|
|
4
|
+
import { VouchClient, VouchError } from "./client.js";
|
|
5
|
+
const text = (v) => ({ content: [{ type: "text", text: typeof v === "string" ? v : JSON.stringify(v, null, 2) }] });
|
|
6
|
+
const fail = (e) => {
|
|
7
|
+
const err = e instanceof VouchError ? e : e instanceof Error ? new VouchError(e.message, "error") : new VouchError(String(e), "error");
|
|
8
|
+
return { isError: true, content: [{ type: "text", text: JSON.stringify({ error: err.code, message: err.message, next: err.next }, null, 2) }] };
|
|
9
|
+
};
|
|
10
|
+
function summarise(job) {
|
|
11
|
+
return {
|
|
12
|
+
jobId: job.id, shortId: job.shortId, title: job.title, status: job.status, pill: job.pill, chainId: job.chainId,
|
|
13
|
+
amount: job.amount ? formatAmount(job.amount, { symbol: job.tokenSymbol }) : null,
|
|
14
|
+
verdict: job.verdict, confidence: job.confidenceBps != null ? job.confidenceBps / 10_000 : null,
|
|
15
|
+
autoSettleAt: job.autoSettleAt, payUrl: job.payUrl, txs: job.txs, yourRole: job.role,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function createServer(cfg) {
|
|
19
|
+
const client = new VouchClient(cfg);
|
|
20
|
+
const server = new McpServer({ name: "vouch", version: "0.1.0" });
|
|
21
|
+
// ------------------------------------------------------------------ tools
|
|
22
|
+
server.registerTool("vouch_create_job", {
|
|
23
|
+
title: "Create a Vouch job",
|
|
24
|
+
description: "Lock stablecoins against a written scope. Returns a jobId to fund with vouch_fund_job, a pay link for humans, and the fund routes. Amount is in dollars (e.g. \"5\" or \"12.50\"). Policy presets: manual (you approve), trusted (auto-pay on PASS ≥85% after 3 days, ≤$200), autopilot (auto-pay on PASS ≥90% after 1 day, ≤$50).",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
title: z.string().min(3).max(120).describe("Short job title"),
|
|
27
|
+
scope: z.string().min(10).max(20_000).describe("The scope in markdown: deliverables, format, deadline, out of scope. This is the contract the verifier checks against."),
|
|
28
|
+
amount: z.string().describe("Amount in dollars, e.g. \"5\" or \"12.50\""),
|
|
29
|
+
chainId: z.number().int().optional().describe("4217 Tempo (default), 42431 Tempo testnet, 8453 Base, 84532 Base Sepolia"),
|
|
30
|
+
token: z.string().optional().describe("Token address; defaults to pathUSD on Tempo, USDC on Base"),
|
|
31
|
+
worker: z.string().optional().describe("Worker wallet address, email or agent URL. Leave empty to let the first submitter take the job."),
|
|
32
|
+
policyPreset: z.enum(POLICY_PRESET_NAMES).optional().describe("manual | trusted | autopilot | custom"),
|
|
33
|
+
policy: z.object({ autoRelease: z.number().int().min(0).max(2), minConfidenceBps: z.number().int().min(0).max(10000), maxAutoAmount: z.string(), reviewWindow: z.number().int(), submitDeadline: z.number().int() }).optional(),
|
|
34
|
+
earnVault: z.string().optional().describe("Tempo only: Earn vault address for 'Earn while locked' — the locked principal earns yield for the payer while the work happens. Use vouch_list_earn_vaults to pick one. Omit for off."),
|
|
35
|
+
},
|
|
36
|
+
}, async (args) => {
|
|
37
|
+
try {
|
|
38
|
+
const amount = parseAmount(args.amount).toString();
|
|
39
|
+
const r = await client.createJob({
|
|
40
|
+
title: args.title, scopeMd: args.scope, amount, chainId: args.chainId ?? cfg.VOUCH_DEFAULT_CHAIN, token: args.token, worker: args.worker,
|
|
41
|
+
policyPreset: args.policyPreset, policy: args.policy, earnVault: args.earnVault,
|
|
42
|
+
});
|
|
43
|
+
return text({ jobId: r.jobId, shortId: r.shortId, payUrl: r.payUrl, nextStep: `Call vouch_fund_job with jobId ${r.jobId} to lock the funds.`, fundRoutes: r.fundRoutes, job: summarise(r.job) });
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return fail(e);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
server.registerTool("vouch_fund_job", {
|
|
50
|
+
title: "Fund a Vouch job",
|
|
51
|
+
description: "Lock the job's amount in the vault from the agent wallet (VOUCH_AGENT_PRIVATE_KEY). On Tempo this pays an MPP charge (TIP-20 transfer with memo = jobId, fees sponsored); on Base an x402/EIP-3009 authorisation. If the wallet already has a Vouch balance, no payment is taken. Returns the funding transaction.",
|
|
52
|
+
inputSchema: { jobId: z.string().describe("The job id (0x… or short id)") },
|
|
53
|
+
}, async ({ jobId }) => {
|
|
54
|
+
try {
|
|
55
|
+
const r = await client.fundJob(jobId);
|
|
56
|
+
return text({ status: r.status, route: r.route, fundTx: r.tx, paymentTx: r.paymentTx, note: r.note, job: summarise(r.job) });
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return fail(e);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
server.registerTool("vouch_submit_delivery", {
|
|
63
|
+
title: "Submit a delivery",
|
|
64
|
+
description: "Deliver work for a funded job as the worker (agent wallet). Files are read from local paths, fingerprinted (sha256) and pinned before review; links and a note are included. Signs the on-chain Submit with the agent wallet. The verifier runs automatically afterwards — call vouch_get_verdict to read the result.",
|
|
65
|
+
inputSchema: {
|
|
66
|
+
jobId: z.string(),
|
|
67
|
+
files: z.array(z.string()).default([]).describe("Local file paths (≤ 2 MB each)"),
|
|
68
|
+
links: z.array(z.string().url()).default([]).describe("URLs: GitHub repos/PRs, Figma files, documents"),
|
|
69
|
+
note: z.string().default("").describe("Message to the payer / verifier"),
|
|
70
|
+
resubmit: z.boolean().default(false).describe("true when resubmitting after a FAIL verdict"),
|
|
71
|
+
},
|
|
72
|
+
}, async (args) => {
|
|
73
|
+
try {
|
|
74
|
+
const r = await client.submitDelivery(args.jobId, { files: args.files, links: args.links, note: args.note }, args.resubmit);
|
|
75
|
+
return text({ status: r.status, tx: r.tx, deliverableHash: r.deliverableHash, verifier: r.verifier, nextStep: "Call vouch_get_verdict (it polls until the verifier finishes).", job: summarise(r.job) });
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return fail(e);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
server.registerTool("vouch_get_verdict", {
|
|
82
|
+
title: "Get the verification verdict",
|
|
83
|
+
description: "Verdict (PASS | NEEDS_REVIEW | FAIL), confidence, per-scope-item checklist with evidence, questions for the worker, red flags, attestation tx and full report URL. Waits up to `waitSeconds` for the verifier to finish.",
|
|
84
|
+
inputSchema: { jobId: z.string(), waitSeconds: z.number().int().min(0).max(600).default(120) },
|
|
85
|
+
}, async ({ jobId, waitSeconds }) => {
|
|
86
|
+
try {
|
|
87
|
+
const v = waitSeconds > 0 ? await client.waitForVerdict(jobId, waitSeconds * 1000) : await client.getVerdict(jobId);
|
|
88
|
+
return text(v);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
return fail(e);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
server.registerTool("vouch_approve", {
|
|
95
|
+
title: "Approve and pay",
|
|
96
|
+
description: "As the payer, release payment to the worker now (signs a Settle authorisation with the agent wallet; Vouch relays it). Use after reading the verdict, or to pay early.",
|
|
97
|
+
inputSchema: { jobId: z.string() },
|
|
98
|
+
}, async ({ jobId }) => {
|
|
99
|
+
try {
|
|
100
|
+
const r = await client.approve(jobId);
|
|
101
|
+
return text({ status: r.status, tx: r.tx, job: summarise(r.job) });
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return fail(e);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
server.registerTool("vouch_dispute", {
|
|
108
|
+
title: "Open a dispute",
|
|
109
|
+
description: "Either party objects to the delivery or the verdict. An arbiter reviews the same pinned evidence and splits the locked amount. Give a concrete reason (≥ 10 characters).",
|
|
110
|
+
inputSchema: { jobId: z.string(), reason: z.string().min(10).max(5000) },
|
|
111
|
+
}, async ({ jobId, reason }) => {
|
|
112
|
+
try {
|
|
113
|
+
const r = await client.dispute(jobId, reason);
|
|
114
|
+
return text({ status: r.status, tx: r.tx, job: summarise(r.job) });
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
return fail(e);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
server.registerTool("vouch_get_job", { title: "Get a job", description: "Current status, pill, policy, timestamps, transactions and your role on the job.", inputSchema: { jobId: z.string(), includeTimeline: z.boolean().default(false) } }, async ({ jobId, includeTimeline }) => {
|
|
121
|
+
try {
|
|
122
|
+
const { job } = await client.getJob(jobId);
|
|
123
|
+
const timeline = includeTimeline ? (await client.getTimeline(jobId)).events : undefined;
|
|
124
|
+
return text({ ...summarise(job), scope: job.scopeMd, policy: job.policy, submitDeadlineAt: job.submitDeadlineAt, fundRoutes: job.fundRoutes, timeline });
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
return fail(e);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
server.registerTool("vouch_list_jobs", { title: "List my jobs", description: "Jobs where the agent wallet is payer or worker.", inputSchema: { status: z.string().optional().describe("Filter: Open | Funded | Submitted | Attested | Settled | Disputed | Resolved | Refunded") } }, async ({ status }) => {
|
|
131
|
+
try {
|
|
132
|
+
const { jobs } = await client.listJobs(status);
|
|
133
|
+
return text({ count: jobs.length, jobs: jobs.map(summarise) });
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
return fail(e);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
server.registerTool("vouch_list_earn_vaults", { title: "List Earn vaults", description: "Tempo Earn vaults a job may use for 'Earn while locked': label, venue, APY, and whether the Vouch vault allow-lists it on-chain.", inputSchema: { chainId: z.number().int().optional() } }, async ({ chainId }) => {
|
|
140
|
+
try {
|
|
141
|
+
const r = await client.request("GET", `/earn/vaults?chainId=${chainId ?? cfg.VOUCH_DEFAULT_CHAIN}`);
|
|
142
|
+
return text(r);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
return fail(e);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// -------------------------------------------------------------- resources
|
|
149
|
+
server.registerResource("job", new ResourceTemplate("vouch://job/{id}", { list: undefined }), { title: "Vouch job", description: "Job status, scope and policy as JSON", mimeType: "application/json" }, async (uri, { id }) => {
|
|
150
|
+
const { job } = await client.getJob(String(id));
|
|
151
|
+
return { contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(job, null, 2) }] };
|
|
152
|
+
});
|
|
153
|
+
server.registerResource("verdict", new ResourceTemplate("vouch://verdict/{id}", { list: undefined }), { title: "Vouch verdict", description: "Verifier report for a job as JSON", mimeType: "application/json" }, async (uri, { id }) => {
|
|
154
|
+
const v = await client.getVerdict(String(id));
|
|
155
|
+
return { contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(v, null, 2) }] };
|
|
156
|
+
});
|
|
157
|
+
// ---------------------------------------------------------------- prompts
|
|
158
|
+
server.registerPrompt("hire_for_task", {
|
|
159
|
+
title: "Hire for a task",
|
|
160
|
+
description: "Guides an agent through create → fund → wait → verdict → approve/dispute for a piece of work.",
|
|
161
|
+
argsSchema: { task: z.string().describe("What you need done"), budget: z.string().describe("Dollar budget, e.g. 5"), worker: z.string().optional().describe("Worker address/URL if known") },
|
|
162
|
+
}, ({ task, budget, worker }) => ({
|
|
163
|
+
messages: [
|
|
164
|
+
{
|
|
165
|
+
role: "user",
|
|
166
|
+
content: {
|
|
167
|
+
type: "text",
|
|
168
|
+
text: [
|
|
169
|
+
`You are hiring for: ${task}. Budget: $${budget}.${worker ? ` Worker: ${worker}.` : ""}`,
|
|
170
|
+
"",
|
|
171
|
+
"Follow these steps with the vouch_* tools:",
|
|
172
|
+
"1. Write a precise scope in markdown with sections: Deliverables, Format, Deadline, Out of scope. Be concrete: the verifier checks each line.",
|
|
173
|
+
"2. vouch_create_job with that scope, the budget, and policyPreset \"autopilot\" (or \"trusted\" if budget > $50). Share the payUrl if a human worker needs it.",
|
|
174
|
+
"3. vouch_fund_job to lock the money. Tell the worker the jobId.",
|
|
175
|
+
"4. When the worker delivers, vouch_get_verdict (it waits for the verifier).",
|
|
176
|
+
"5. If PASS and the policy auto-settles, do nothing — the vault pays after the review window. If you are satisfied earlier, vouch_approve.",
|
|
177
|
+
"6. If NEEDS_REVIEW, read the checklist and questions_for_worker; either vouch_approve, ask the worker to resubmit, or vouch_dispute with a specific reason.",
|
|
178
|
+
"7. If FAIL, wait for a resubmission (max 2) or let the delivery deadline refund you.",
|
|
179
|
+
"Report every jobId, verdict and transaction hash you receive.",
|
|
180
|
+
].join("\n"),
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
}));
|
|
185
|
+
return server;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gwilll/vouch-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Vouch — let any agent lock stablecoins against a scope, get an independent verification, and settle on Tempo or Base.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": { "vouch-mcp": "bin/vouch-mcp.js" },
|
|
10
|
+
"exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" } },
|
|
11
|
+
"files": ["dist", "bin", "README.md"],
|
|
12
|
+
"keywords": ["mcp", "tempo", "x402", "mpp", "agents", "payments", "escrow-free", "verification"],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.json",
|
|
15
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
16
|
+
"lint": "echo skip",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"start": "node bin/vouch-mcp.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
22
|
+
"@vouch/shared": "workspace:*",
|
|
23
|
+
"mppx": "^0.9.3",
|
|
24
|
+
"viem": "^2.56.5",
|
|
25
|
+
"zod": "^4.6.5"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^24.0.0",
|
|
29
|
+
"typescript": "^5.9.3",
|
|
30
|
+
"vitest": "^4.1.0"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": { "access": "public" },
|
|
33
|
+
"repository": { "type": "git", "url": "git+https://github.com/big14way/vouch.git", "directory": "packages/mcp" },
|
|
34
|
+
"homepage": "https://vouch-rouge.vercel.app",
|
|
35
|
+
"bugs": { "url": "https://github.com/big14way/vouch/issues" }
|
|
36
|
+
}
|