@quackai/q402-mcp 0.8.0 → 0.8.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/dist/index.js +212 -38
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -124,7 +124,7 @@ function loadConfig() {
|
|
|
124
124
|
const walletIdRaw = ENV.Q402_AGENT_WALLET_ADDRESS ?? ENV.Q402_WALLET_ID;
|
|
125
125
|
if (!ENV.Q402_AGENT_WALLET_ADDRESS && ENV.Q402_WALLET_ID) {
|
|
126
126
|
process.stderr.write(
|
|
127
|
-
"[q402-mcp] Q402_WALLET_ID is deprecated \u2014 rename to Q402_AGENT_WALLET_ADDRESS. Old name will be removed in
|
|
127
|
+
"[q402-mcp] Q402_WALLET_ID is deprecated \u2014 rename to Q402_AGENT_WALLET_ADDRESS. Old name will be removed in a future release.\n"
|
|
128
128
|
);
|
|
129
129
|
}
|
|
130
130
|
const walletId = typeof walletIdRaw === "string" && walletIdRaw.length > 0 ? walletIdRaw.toLowerCase() : null;
|
|
@@ -211,7 +211,7 @@ var isValidPrivateKey = (s) => typeof s === "string" && PRIVATE_KEY_RE.test(s);
|
|
|
211
211
|
|
|
212
212
|
// src/version.ts
|
|
213
213
|
var PACKAGE_NAME = "@quackai/q402-mcp";
|
|
214
|
-
var PACKAGE_VERSION = "0.
|
|
214
|
+
var PACKAGE_VERSION = "0.8.2";
|
|
215
215
|
|
|
216
216
|
// src/tools/quote.ts
|
|
217
217
|
import { z } from "zod";
|
|
@@ -2799,10 +2799,161 @@ async function runAgenticInfo(input = {}) {
|
|
|
2799
2799
|
};
|
|
2800
2800
|
}
|
|
2801
2801
|
|
|
2802
|
-
// src/tools/
|
|
2802
|
+
// src/tools/bridge-quote.ts
|
|
2803
2803
|
import { z as z10 } from "zod";
|
|
2804
|
-
var
|
|
2805
|
-
|
|
2804
|
+
var BridgeQuoteInputSchema = z10.object({
|
|
2805
|
+
src: z10.enum(["eth", "avax", "arbitrum"]).describe("Source chain"),
|
|
2806
|
+
dst: z10.enum(["eth", "avax", "arbitrum"]).describe("Destination chain"),
|
|
2807
|
+
amount: z10.string().regex(/^\d+$/).describe("USDC amount in raw 6-decimal units (e.g. '1000000' = 1 USDC)"),
|
|
2808
|
+
destReceiver: z10.string().regex(/^0x[0-9a-fA-F]{40}$/).describe("Destination receiver address (Agentic Wallet on destination)")
|
|
2809
|
+
});
|
|
2810
|
+
var BRIDGE_QUOTE_TOOL = {
|
|
2811
|
+
name: "q402_bridge_quote",
|
|
2812
|
+
description: "Quote the Chainlink CCIP fee for bridging USDC across the 3-chain triangle (eth/avax/arbitrum). Returns BOTH the LINK fee (~10% cheaper) and the native fee, so the agent can pick the cheaper path or surface both options to the user. Read-only; no auth required.",
|
|
2813
|
+
inputSchema: {
|
|
2814
|
+
type: "object",
|
|
2815
|
+
properties: {
|
|
2816
|
+
src: { type: "string", enum: ["eth", "avax", "arbitrum"], description: "Source chain" },
|
|
2817
|
+
dst: { type: "string", enum: ["eth", "avax", "arbitrum"], description: "Destination chain (must differ from src)" },
|
|
2818
|
+
amount: { type: "string", description: "USDC amount in raw 6-decimal units" },
|
|
2819
|
+
destReceiver: { type: "string", description: "Destination receiver (0x address)" }
|
|
2820
|
+
},
|
|
2821
|
+
required: ["src", "dst", "amount", "destReceiver"]
|
|
2822
|
+
}
|
|
2823
|
+
};
|
|
2824
|
+
async function runBridgeQuote(input) {
|
|
2825
|
+
const url = new URL("/api/ccip/quote", CONFIG.relayBaseUrl);
|
|
2826
|
+
const res = await fetch(url, {
|
|
2827
|
+
method: "POST",
|
|
2828
|
+
headers: { "Content-Type": "application/json" },
|
|
2829
|
+
body: JSON.stringify(input)
|
|
2830
|
+
});
|
|
2831
|
+
const data = await res.json();
|
|
2832
|
+
if (!res.ok) {
|
|
2833
|
+
return { content: [{ type: "text", text: `Quote failed (HTTP ${res.status}): ${JSON.stringify(data)}` }], isError: true };
|
|
2834
|
+
}
|
|
2835
|
+
return {
|
|
2836
|
+
content: [
|
|
2837
|
+
{ type: "text", text: JSON.stringify(data, null, 2) }
|
|
2838
|
+
]
|
|
2839
|
+
};
|
|
2840
|
+
}
|
|
2841
|
+
|
|
2842
|
+
// src/tools/bridge-send.ts
|
|
2843
|
+
import { z as z11 } from "zod";
|
|
2844
|
+
var BridgeSendInputSchema = z11.object({
|
|
2845
|
+
src: z11.enum(["eth", "avax", "arbitrum"]).describe("Source chain"),
|
|
2846
|
+
dst: z11.enum(["eth", "avax", "arbitrum"]).describe("Destination chain"),
|
|
2847
|
+
amount: z11.string().regex(/^\d+$/).describe("USDC amount in raw 6-decimal units"),
|
|
2848
|
+
walletId: z11.string().describe("Agentic Wallet ID (from q402_agentic_info)"),
|
|
2849
|
+
feeToken: z11.enum(["LINK", "native", "auto"]).optional().describe("Fee token. 'auto' picks cheaper of the two; defaults to LINK."),
|
|
2850
|
+
sandbox: z11.boolean().optional().describe("Sandbox mode (default true). Set to false for live bridge.")
|
|
2851
|
+
});
|
|
2852
|
+
var BRIDGE_SEND_TOOL = {
|
|
2853
|
+
name: "q402_bridge_send",
|
|
2854
|
+
description: "Execute a Chainlink CCIP USDC bridge between two of the 3 supported chains (eth/avax/arbitrum). The Q402 server signs ccipSend on behalf of the user's Agentic Wallet. Fee is debited from the user's Gas Tank (LINK slot or native, per the feeToken arg). SANDBOX BY DEFAULT: returns a synthetic messageId unless `sandbox: false` is passed AND the server env has Q402_ENABLE_REAL_PAYMENTS=1. ALWAYS confirm the bridge details with the user before setting sandbox: false. Recommended flow: q402_bridge_quote first \u2192 show user the cost \u2192 get user confirmation \u2192 call q402_bridge_send with sandbox: false.",
|
|
2855
|
+
inputSchema: {
|
|
2856
|
+
type: "object",
|
|
2857
|
+
properties: {
|
|
2858
|
+
src: { type: "string", enum: ["eth", "avax", "arbitrum"] },
|
|
2859
|
+
dst: { type: "string", enum: ["eth", "avax", "arbitrum"] },
|
|
2860
|
+
amount: { type: "string", description: "USDC amount in raw 6-decimal units" },
|
|
2861
|
+
walletId: { type: "string", description: "Agentic Wallet ID" },
|
|
2862
|
+
feeToken: { type: "string", enum: ["LINK", "native", "auto"], description: "Default: LINK" },
|
|
2863
|
+
sandbox: { type: "boolean", description: "Sandbox-only. Default true. Set to false for live bridge." }
|
|
2864
|
+
},
|
|
2865
|
+
required: ["src", "dst", "amount", "walletId"]
|
|
2866
|
+
}
|
|
2867
|
+
};
|
|
2868
|
+
async function runBridgeSend(input) {
|
|
2869
|
+
const sandbox = input.sandbox !== false;
|
|
2870
|
+
if (sandbox) {
|
|
2871
|
+
return {
|
|
2872
|
+
content: [{
|
|
2873
|
+
type: "text",
|
|
2874
|
+
text: JSON.stringify({
|
|
2875
|
+
sandbox: true,
|
|
2876
|
+
messageId: "0x" + "00".repeat(32),
|
|
2877
|
+
txHash: "0x" + "00".repeat(32),
|
|
2878
|
+
note: "Sandbox response. To execute a real bridge, pass `sandbox: false` AND ensure the server has Q402_ENABLE_REAL_PAYMENTS=1.",
|
|
2879
|
+
src: input.src,
|
|
2880
|
+
dst: input.dst,
|
|
2881
|
+
amount: input.amount
|
|
2882
|
+
}, null, 2)
|
|
2883
|
+
}]
|
|
2884
|
+
};
|
|
2885
|
+
}
|
|
2886
|
+
return {
|
|
2887
|
+
content: [{
|
|
2888
|
+
type: "text",
|
|
2889
|
+
text: "Live CCIP bridge via MCP is not yet wired in v0.8.2 \u2014 agents can quote and plan via q402_bridge_quote and q402_bridge_send (sandbox), but actual execution must happen via https://q402.quackai.ai/dashboard for now. Live MCP execution lands in a follow-up release."
|
|
2890
|
+
}],
|
|
2891
|
+
isError: true
|
|
2892
|
+
};
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
// src/tools/bridge-history.ts
|
|
2896
|
+
import { z as z12 } from "zod";
|
|
2897
|
+
var BridgeHistoryInputSchema = z12.object({
|
|
2898
|
+
ownerAddress: z12.string().regex(/^0x[0-9a-fA-F]{40}$/).optional().describe("Owner EOA. Defaults to the configured Agentic Wallet owner.")
|
|
2899
|
+
});
|
|
2900
|
+
var BRIDGE_HISTORY_TOOL = {
|
|
2901
|
+
name: "q402_bridge_history",
|
|
2902
|
+
description: "List the user's recent Chainlink CCIP bridges (most-recent first, up to 50 records). Each record includes messageId, source/destination chains, USDC amount, fee paid, and CCIP Explorer link. v0.8.2 returns dashboard URL guidance \u2014 full MCP wiring lands in a follow-up.",
|
|
2903
|
+
inputSchema: {
|
|
2904
|
+
type: "object",
|
|
2905
|
+
properties: {
|
|
2906
|
+
ownerAddress: { type: "string", description: "Owner address (optional)" }
|
|
2907
|
+
}
|
|
2908
|
+
}
|
|
2909
|
+
};
|
|
2910
|
+
async function runBridgeHistory(_input) {
|
|
2911
|
+
return {
|
|
2912
|
+
content: [{
|
|
2913
|
+
type: "text",
|
|
2914
|
+
text: "Bridge history via MCP requires owner-sig auth, which is dashboard-managed in v0.8.2. View at https://q402.quackai.ai/dashboard \u2192 Agent tab \u2192 Bridge History."
|
|
2915
|
+
}]
|
|
2916
|
+
};
|
|
2917
|
+
}
|
|
2918
|
+
|
|
2919
|
+
// src/tools/bridge-gas-tank.ts
|
|
2920
|
+
import { z as z13 } from "zod";
|
|
2921
|
+
var BridgeGasTankInputSchema = z13.object({
|
|
2922
|
+
ownerAddress: z13.string().regex(/^0x[0-9a-fA-F]{40}$/).optional().describe("Owner EOA. Defaults to configured wallet.")
|
|
2923
|
+
});
|
|
2924
|
+
var BRIDGE_GAS_TANK_TOOL = {
|
|
2925
|
+
name: "q402_bridge_gas_tank",
|
|
2926
|
+
description: "Report the user's Bridge Gas Tank state \u2014 LINK + native balance per CCIP chain (eth/avax/arbitrum). Q402 charges no markup on bridges; users pay only the actual Chainlink CCIP fee, debited from this Gas Tank. LINK fees are ~10% cheaper than native. Tool returns guidance + dashboard URL in v0.8.2.",
|
|
2927
|
+
inputSchema: {
|
|
2928
|
+
type: "object",
|
|
2929
|
+
properties: {
|
|
2930
|
+
ownerAddress: { type: "string", description: "Owner address (optional)" }
|
|
2931
|
+
}
|
|
2932
|
+
}
|
|
2933
|
+
};
|
|
2934
|
+
async function runBridgeGasTank(_input) {
|
|
2935
|
+
return {
|
|
2936
|
+
content: [{
|
|
2937
|
+
type: "text",
|
|
2938
|
+
text: [
|
|
2939
|
+
"Bridge Gas Tank covers Chainlink CCIP fees on the 3-chain triangle (eth/avax/arbitrum).",
|
|
2940
|
+
"",
|
|
2941
|
+
"Two fee tokens supported:",
|
|
2942
|
+
" \u2022 LINK (default, ~10% cheaper)",
|
|
2943
|
+
" \u2022 native (ETH / AVAX / ETH respectively)",
|
|
2944
|
+
"",
|
|
2945
|
+
"Top up by sending LINK or native to the Q402 facilitator address on the source chain. The next deposit-scan cron tick (15 min) credits your Gas Tank.",
|
|
2946
|
+
"",
|
|
2947
|
+
"Live balance + deposit addresses: https://q402.quackai.ai/dashboard \u2192 Agent tab \u2192 Bridge Gas Tank"
|
|
2948
|
+
].join("\n")
|
|
2949
|
+
}]
|
|
2950
|
+
};
|
|
2951
|
+
}
|
|
2952
|
+
|
|
2953
|
+
// src/tools/recurring-list.ts
|
|
2954
|
+
import { z as z14 } from "zod";
|
|
2955
|
+
var RecurringListInputSchema = z14.object({
|
|
2956
|
+
walletId: z14.string().optional().describe(
|
|
2806
2957
|
"Optional lowercased Agent Wallet address to list rules for when the user holds multiple wallets. Omit to use Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
2807
2958
|
)
|
|
2808
2959
|
});
|
|
@@ -2886,29 +3037,29 @@ async function runRecurringList(input = {}) {
|
|
|
2886
3037
|
}
|
|
2887
3038
|
|
|
2888
3039
|
// src/tools/recurring-create.ts
|
|
2889
|
-
import { z as
|
|
3040
|
+
import { z as z15 } from "zod";
|
|
2890
3041
|
var ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
|
|
2891
3042
|
var AMOUNT_RE = /^\d+(\.\d{1,18})?$/;
|
|
2892
|
-
var RecurringCreateInputSchema =
|
|
2893
|
-
confirm:
|
|
3043
|
+
var RecurringCreateInputSchema = z15.object({
|
|
3044
|
+
confirm: z15.literal(true).describe(
|
|
2894
3045
|
'REQUIRED. Must be literally `true`. Authoring a recurring rule schedules future on-chain payments that the user does not click through one-by-one \u2014 the user has to explicitly say yes BEFORE this is called. Echo back the frequency + recipient + amount + chain + token + cancelWindow you intend to create, get a plain-language confirmation from the user (e.g. "yes, create the schedule"), and ONLY then call this with confirm: true. Mirrors the same guard q402_pay / q402_batch_pay use on one-shot sends.'
|
|
2895
3046
|
),
|
|
2896
|
-
frequency:
|
|
3047
|
+
frequency: z15.string().min(1).describe(
|
|
2897
3048
|
'Cadence string. One of: "hourly:N" (N=1..23), "daily", "weekly:{mon|tue|wed|thu|fri|sat|sun}", "monthly:N" (N=1..31), "monthly:last". Examples: "hourly:1" fires every hour, "weekly:fri" fires every Friday, "monthly:1" fires on the 1st of each month.'
|
|
2898
3049
|
),
|
|
2899
|
-
recipient:
|
|
2900
|
-
amount:
|
|
3050
|
+
recipient: z15.string().regex(ADDRESS_RE).describe("0x-prefixed 20-byte recipient address. Required."),
|
|
3051
|
+
amount: z15.string().regex(AMOUNT_RE).describe(
|
|
2901
3052
|
'Amount per fire, as a decimal string (e.g. "1.5", "0.0001"). Counted in the same unit as `token` (USDC or USDT, both 1:1 USD).'
|
|
2902
3053
|
),
|
|
2903
|
-
chain:
|
|
3054
|
+
chain: z15.enum(["bnb", "eth", "avax", "xlayer", "mantle", "injective", "monad", "scroll", "stable", "arbitrum"]).default("bnb").describe(
|
|
2904
3055
|
"Chain to fire the recurring TX on. Defaults to bnb. Recurring requires the paid Multichain subscription on EVERY chain, including bnb \u2014 Trial keys are rejected at create time with MULTICHAIN_REQUIRED. Trial keys can still pay one-shot via q402_pay on BNB."
|
|
2905
3056
|
),
|
|
2906
|
-
token:
|
|
2907
|
-
label:
|
|
2908
|
-
cancelWindowHours:
|
|
3057
|
+
token: z15.enum(["USDC", "USDT"]).default("USDT").describe("Stablecoin to send. USDC or USDT. Both peg to USD-1."),
|
|
3058
|
+
label: z15.string().max(64).optional().describe("Optional human-readable label (\u226464 chars). Shows up in q402_recurring_list and the dashboard."),
|
|
3059
|
+
cancelWindowHours: z15.number().min(0).optional().describe(
|
|
2909
3060
|
"Hours of advance notice before each fire during which the rule can be cancelled. 0 = fire immediately at the next slot, no alert. Capped at the cadence interval (e.g. \u2264 N-0.5h for hourly:N, \u226424 for daily). Defaults to 0."
|
|
2910
3061
|
),
|
|
2911
|
-
walletId:
|
|
3062
|
+
walletId: z15.string().optional().describe(
|
|
2912
3063
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet on the server."
|
|
2913
3064
|
)
|
|
2914
3065
|
});
|
|
@@ -3037,12 +3188,12 @@ async function runRecurringCreate(input) {
|
|
|
3037
3188
|
}
|
|
3038
3189
|
|
|
3039
3190
|
// src/tools/recurring-cancel.ts
|
|
3040
|
-
import { z as
|
|
3041
|
-
var RecurringCancelInputSchema =
|
|
3042
|
-
ruleId:
|
|
3191
|
+
import { z as z16 } from "zod";
|
|
3192
|
+
var RecurringCancelInputSchema = z16.object({
|
|
3193
|
+
ruleId: z16.string().min(1).describe(
|
|
3043
3194
|
"Rule id to cancel. Obtain from q402_recurring_list \u2014 each entry's `ruleId` field. Cancelling is immediate."
|
|
3044
3195
|
),
|
|
3045
|
-
walletId:
|
|
3196
|
+
walletId: z16.string().optional().describe(
|
|
3046
3197
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
3047
3198
|
)
|
|
3048
3199
|
});
|
|
@@ -3130,15 +3281,15 @@ async function runRecurringCancel(input) {
|
|
|
3130
3281
|
}
|
|
3131
3282
|
|
|
3132
3283
|
// src/tools/recurring-fires.ts
|
|
3133
|
-
import { z as
|
|
3134
|
-
var RecurringFiresInputSchema =
|
|
3135
|
-
ruleId:
|
|
3284
|
+
import { z as z17 } from "zod";
|
|
3285
|
+
var RecurringFiresInputSchema = z17.object({
|
|
3286
|
+
ruleId: z17.string().min(1).describe(
|
|
3136
3287
|
"Rule id whose fire history to fetch. Obtain from q402_recurring_list \u2014 each entry's `ruleId` field."
|
|
3137
3288
|
),
|
|
3138
|
-
limit:
|
|
3289
|
+
limit: z17.number().int().min(1).max(50).optional().describe(
|
|
3139
3290
|
"Max number of fires to return (newest first). Defaults to 50 (the server cap). Pass a smaller number when you only need the most recent few."
|
|
3140
3291
|
),
|
|
3141
|
-
walletId:
|
|
3292
|
+
walletId: z17.string().optional().describe(
|
|
3142
3293
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
3143
3294
|
)
|
|
3144
3295
|
});
|
|
@@ -3244,12 +3395,12 @@ async function runRecurringFires(input) {
|
|
|
3244
3395
|
}
|
|
3245
3396
|
|
|
3246
3397
|
// src/tools/recurring-pause.ts
|
|
3247
|
-
import { z as
|
|
3248
|
-
var RecurringPauseInputSchema =
|
|
3249
|
-
ruleId:
|
|
3398
|
+
import { z as z18 } from "zod";
|
|
3399
|
+
var RecurringPauseInputSchema = z18.object({
|
|
3400
|
+
ruleId: z18.string().min(1).describe(
|
|
3250
3401
|
"Rule id to pause. Obtain from q402_recurring_list \u2014 each entry's `ruleId` field. Pausing is immediate and reversible."
|
|
3251
3402
|
),
|
|
3252
|
-
walletId:
|
|
3403
|
+
walletId: z18.string().optional().describe(
|
|
3253
3404
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
3254
3405
|
)
|
|
3255
3406
|
});
|
|
@@ -3337,12 +3488,12 @@ async function runRecurringPause(input) {
|
|
|
3337
3488
|
}
|
|
3338
3489
|
|
|
3339
3490
|
// src/tools/recurring-resume.ts
|
|
3340
|
-
import { z as
|
|
3341
|
-
var RecurringResumeInputSchema =
|
|
3342
|
-
ruleId:
|
|
3491
|
+
import { z as z19 } from "zod";
|
|
3492
|
+
var RecurringResumeInputSchema = z19.object({
|
|
3493
|
+
ruleId: z19.string().min(1).describe(
|
|
3343
3494
|
"Rule id to resume. Obtain from q402_recurring_list \u2014 each entry's `ruleId` field. Resume is immediate; nextRunAt advances to the next valid slot."
|
|
3344
3495
|
),
|
|
3345
|
-
walletId:
|
|
3496
|
+
walletId: z19.string().optional().describe(
|
|
3346
3497
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
3347
3498
|
)
|
|
3348
3499
|
});
|
|
@@ -3430,12 +3581,12 @@ async function runRecurringResume(input) {
|
|
|
3430
3581
|
}
|
|
3431
3582
|
|
|
3432
3583
|
// src/tools/recurring-skip-next.ts
|
|
3433
|
-
import { z as
|
|
3434
|
-
var RecurringSkipNextInputSchema =
|
|
3435
|
-
ruleId:
|
|
3584
|
+
import { z as z20 } from "zod";
|
|
3585
|
+
var RecurringSkipNextInputSchema = z20.object({
|
|
3586
|
+
ruleId: z20.string().min(1).describe(
|
|
3436
3587
|
"Rule id whose next scheduled fire to skip. Obtain from q402_recurring_list \u2014 each entry's `ruleId` field."
|
|
3437
3588
|
),
|
|
3438
|
-
walletId:
|
|
3589
|
+
walletId: z20.string().optional().describe(
|
|
3439
3590
|
"Optional lowercased Agent Wallet address when the user holds multiple wallets. Defaults to Q402_AGENT_WALLET_ADDRESS env, then the owner's default wallet."
|
|
3440
3591
|
)
|
|
3441
3592
|
});
|
|
@@ -3550,7 +3701,14 @@ async function main() {
|
|
|
3550
3701
|
RECURRING_RESUME_TOOL,
|
|
3551
3702
|
RECURRING_SKIP_NEXT_TOOL,
|
|
3552
3703
|
RECURRING_CANCEL_TOOL,
|
|
3553
|
-
CLEAR_DELEGATION_TOOL
|
|
3704
|
+
CLEAR_DELEGATION_TOOL,
|
|
3705
|
+
// CCIP bridge surface (v0.8.2) — USDC routing on the eth/avax/arbitrum
|
|
3706
|
+
// triangle. Bridge_send is sandbox-only in v0.8.2; live execution
|
|
3707
|
+
// happens through the dashboard until session-binding ships.
|
|
3708
|
+
BRIDGE_QUOTE_TOOL,
|
|
3709
|
+
BRIDGE_SEND_TOOL,
|
|
3710
|
+
BRIDGE_HISTORY_TOOL,
|
|
3711
|
+
BRIDGE_GAS_TANK_TOOL
|
|
3554
3712
|
]
|
|
3555
3713
|
}));
|
|
3556
3714
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
@@ -3621,6 +3779,22 @@ async function main() {
|
|
|
3621
3779
|
const parsed = RecurringSkipNextInputSchema.parse(args ?? {});
|
|
3622
3780
|
return { content: [jsonText(await runRecurringSkipNext(parsed))] };
|
|
3623
3781
|
}
|
|
3782
|
+
case "q402_bridge_quote": {
|
|
3783
|
+
const parsed = BridgeQuoteInputSchema.parse(args ?? {});
|
|
3784
|
+
return await runBridgeQuote(parsed);
|
|
3785
|
+
}
|
|
3786
|
+
case "q402_bridge_send": {
|
|
3787
|
+
const parsed = BridgeSendInputSchema.parse(args ?? {});
|
|
3788
|
+
return await runBridgeSend(parsed);
|
|
3789
|
+
}
|
|
3790
|
+
case "q402_bridge_history": {
|
|
3791
|
+
const parsed = BridgeHistoryInputSchema.parse(args ?? {});
|
|
3792
|
+
return await runBridgeHistory(parsed);
|
|
3793
|
+
}
|
|
3794
|
+
case "q402_bridge_gas_tank": {
|
|
3795
|
+
const parsed = BridgeGasTankInputSchema.parse(args ?? {});
|
|
3796
|
+
return await runBridgeGasTank(parsed);
|
|
3797
|
+
}
|
|
3624
3798
|
default:
|
|
3625
3799
|
return {
|
|
3626
3800
|
isError: true,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quackai/q402-mcp",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"description": "MCP server for Q402 — gasless USDC
|
|
3
|
+
"version": "0.8.2",
|
|
4
|
+
"description": "MCP server for Q402 — gasless USDC/USDT/RLUSD payments + Chainlink CCIP bridge across 10 EVM chains, callable from Claude (Desktop / Code), OpenAI Codex CLI, and any other Model Context Protocol client.",
|
|
5
5
|
"mcpName": "io.github.bitgett/q402-mcp",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mcp",
|