@receiz/mcp-server
Version:
MCP server for agents building and verifying Receiz proof-native applications through the canonical Receiz SDK rails.
270 lines • 31.6 kB
JavaScript
import { createHash, randomUUID } from "node:crypto";
import { RECEIZ_HTTP_OPERATION_SUPPORT } from "@receiz/sdk";
import { assertReceizMarketplaceToolCall, wrapReceizMarketplaceClient } from "./marketplaceExecutionPolicy.js";
import { assertReceizMarketplaceNonfinancialTool } from "./marketplaceNonfinancialPolicy.js";
const authority = "MCP is not authority. MCP transport and confirmation are not proof authority. Existing SDK admission, delegated permissions, sealed artifacts, and verified appends govern the result.";
// Closed dispatch: no caller-selected property traversal, method, URL, or arbitrary invoke.
const definitions = [
{ name: "receiz_twin_market_mandate", sdkMethod: "twin.marketMandate", arguments: [], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, _args) => client.twin.marketMandate() },
{ name: "receiz_twin_market_intents", sdkMethod: "twin.marketIntents", arguments: [], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, _args) => client.twin.marketIntents() },
{ name: "receiz_twin_import_mind_summary", sdkMethod: "twin.importMindSummary", arguments: [], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, _args) => client.twin.importMindSummary() },
{ name: "receiz_twin_approval", sdkMethod: "twin.approval", arguments: [], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, _args) => client.twin.approval() },
{ name: "receiz_twin_save_market_mandate", sdkMethod: "twin.saveMarketMandate", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.twin.saveMarketMandate(args.body) },
{ name: "receiz_twin_create_market_intent", sdkMethod: "twin.createMarketIntent", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: ["marketItemId", "side"], invoke: (client, args) => client.twin.createMarketIntent(args.body) },
{ name: "receiz_twin_approve_market_intent", sdkMethod: "twin.approveMarketIntent", arguments: ["intentId"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.twin.approveMarketIntent(args.intentId) },
{ name: "receiz_twin_approve_promotion", sdkMethod: "twin.approvePromotion", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: ["performance"], invoke: (client, args) => client.twin.approvePromotion(args.body) },
{ name: "receiz_customers_bootstrap_session", sdkMethod: "customers.bootstrapSession", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.customers.bootstrapSession(args.body, (args.options ?? {})) },
{ name: "receiz_customers_bootstrap", sdkMethod: "customers.bootstrap", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.customers.bootstrap(args.body, (args.options ?? {})) },
{ name: "receiz_customers_session", sdkMethod: "customers.session", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.customers.session(args.body, (args.options ?? {})) },
{ name: "receiz_customers_portal", sdkMethod: "customers.portal", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.customers.portal(args.body) },
{ name: "receiz_customers_orders", sdkMethod: "customers.orders", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.customers.orders((args.query ?? {})) },
{ name: "receiz_customers_rewards", sdkMethod: "customers.rewards", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.customers.rewards((args.query ?? {})) },
{ name: "receiz_customers_assets", sdkMethod: "customers.assets", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.customers.assets((args.query ?? {})) },
{ name: "receiz_merchants_onboard", sdkMethod: "merchants.onboard", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.merchants.onboard(args.body, (args.options ?? {})) },
{ name: "receiz_merchants_profile", sdkMethod: "merchants.profile", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.merchants.profile((args.query ?? {})) },
{ name: "receiz_merchants_capabilities", sdkMethod: "merchants.capabilities", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.merchants.capabilities((args.query ?? {})) },
{ name: "receiz_commerce_one_click_checkout", sdkMethod: "commerce.oneClickCheckout", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost", "amountUsd"], invoke: (client, args) => client.commerce.oneClickCheckout(args.body) },
{ name: "receiz_commerce_refunds_create", sdkMethod: "commerce.refunds.create", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.refunds.create(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_subscriptions_create", sdkMethod: "commerce.subscriptions.create", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.subscriptions.create(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_shipping_update", sdkMethod: "commerce.shipping.update", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.shipping.update(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_discounts_create", sdkMethod: "commerce.discounts.create", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.discounts.create(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_discounts_redeem", sdkMethod: "commerce.discounts.redeem", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.discounts.redeem(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_gift_cards_issue", sdkMethod: "commerce.giftCards.issue", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.giftCards.issue(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_gift_cards_redeem", sdkMethod: "commerce.giftCards.redeem", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.giftCards.redeem(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_access_passes_issue", sdkMethod: "commerce.accessPasses.issue", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.accessPasses.issue(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_inventory_reserve", sdkMethod: "commerce.inventory.reserve", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.inventory.reserve(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_inventory_adjust", sdkMethod: "commerce.inventory.adjust", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.inventory.adjust(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_fulfillment_update", sdkMethod: "commerce.fulfillment.update", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.fulfillment.update(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_payouts_create", sdkMethod: "commerce.payouts.create", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.payouts.create(args.body, (args.options ?? {})) },
{ name: "receiz_commerce_subscriptions_cancel", sdkMethod: "commerce.subscriptions.cancel", arguments: ["subscriptionId", "body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.subscriptions.cancel(args.subscriptionId, args.body, (args.options ?? {})) },
{ name: "receiz_commerce_shipping_quote", sdkMethod: "commerce.shipping.quote", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.shipping.quote(args.body) },
{ name: "receiz_commerce_tax_quote", sdkMethod: "commerce.tax.quote", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.tax.quote(args.body) },
{ name: "receiz_commerce_access_passes_verify", sdkMethod: "commerce.accessPasses.verify", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.commerce.accessPasses.verify(args.body) },
{ name: "receiz_commerce_payouts_status", sdkMethod: "commerce.payouts.status", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.commerce.payouts.status((args.query ?? {})) },
{ name: "receiz_domains_reserve_subdomain", sdkMethod: "domains.reserveSubdomain", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.domains.reserveSubdomain(args.body, (args.options ?? {})) },
{ name: "receiz_domains_verify_custom_domain", sdkMethod: "domains.verifyCustomDomain", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.domains.verifyCustomDomain(args.body, (args.options ?? {})) },
{ name: "receiz_domains_status", sdkMethod: "domains.status", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.domains.status((args.query ?? {})) },
{ name: "receiz_events_subscribe", sdkMethod: "events.subscribe", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: ["types"], invoke: (client, args) => client.events.subscribe(args.body) },
{ name: "receiz_events_replay", sdkMethod: "events.replay", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.events.replay(args.body) },
{ name: "receiz_events_list", sdkMethod: "events.list", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.events.list((args.query ?? {})) },
{ name: "receiz_events_ack", sdkMethod: "events.ack", arguments: ["eventId", "body?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.events.ack(args.eventId, (args.body ?? {})) },
{ name: "receiz_jobs_enqueue", sdkMethod: "jobs.enqueue", arguments: ["body"], mutation: true, requiresDelegated: true, requiredPayload: ["kind", "payload"], invoke: (client, args) => client.jobs.enqueue(args.body) },
{ name: "receiz_jobs_status", sdkMethod: "jobs.status", arguments: ["jobId"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.jobs.status(args.jobId) },
{ name: "receiz_jobs_cancel", sdkMethod: "jobs.cancel", arguments: ["jobId", "body?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.jobs.cancel(args.jobId, (args.body ?? {})) },
{ name: "receiz_jobs_list", sdkMethod: "jobs.list", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.jobs.list((args.query ?? {})) },
{ name: "receiz_permissions_grant", sdkMethod: "permissions.grant", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost", "actorReceizId", "role"], invoke: (client, args) => client.permissions.grant(args.body, (args.options ?? {})) },
{ name: "receiz_permissions_revoke", sdkMethod: "permissions.revoke", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost", "actorReceizId", "role"], invoke: (client, args) => client.permissions.revoke(args.body, (args.options ?? {})) },
{ name: "receiz_permissions_check", sdkMethod: "permissions.check", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost", "actorReceizId", "permission"], invoke: (client, args) => client.permissions.check(args.body) },
{ name: "receiz_permissions_roles", sdkMethod: "permissions.roles", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.permissions.roles((args.query ?? {})) },
{ name: "receiz_audit_append", sdkMethod: "audit.append", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost", "action"], invoke: (client, args) => client.audit.append(args.body, (args.options ?? {})) },
{ name: "receiz_audit_query", sdkMethod: "audit.query", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.audit.query((args.query ?? {})) },
{ name: "receiz_audit_export", sdkMethod: "audit.export", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.audit.export((args.query ?? {})) },
{ name: "receiz_risk_score_payment", sdkMethod: "risk.scorePayment", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.risk.scorePayment(args.body) },
{ name: "receiz_risk_score_account_recovery", sdkMethod: "risk.scoreAccountRecovery", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.risk.scoreAccountRecovery(args.body) },
{ name: "receiz_risk_velocity", sdkMethod: "risk.velocity", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.risk.velocity(args.body) },
{ name: "receiz_risk_proof_activity", sdkMethod: "risk.proofActivity", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.risk.proofActivity(args.body) },
{ name: "receiz_compliance_export_orders", sdkMethod: "compliance.exportOrders", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.compliance.exportOrders(args.query) },
{ name: "receiz_compliance_export_taxes", sdkMethod: "compliance.exportTaxes", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.compliance.exportTaxes(args.query) },
{ name: "receiz_compliance_export_payouts", sdkMethod: "compliance.exportPayouts", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.compliance.exportPayouts(args.query) },
{ name: "receiz_compliance_export_customers", sdkMethod: "compliance.exportCustomers", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.compliance.exportCustomers(args.query) },
{ name: "receiz_compliance_export_audit", sdkMethod: "compliance.exportAudit", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.compliance.exportAudit(args.query) },
{ name: "receiz_portability_export_store", sdkMethod: "portability.exportStore", arguments: ["query"], mutation: false, requiresDelegated: true, requiredPayload: ["tenantHost"], invoke: (client, args) => client.portability.exportStore(args.query) },
{ name: "receiz_portability_import_store", sdkMethod: "portability.importStore", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.portability.importStore(args.body, (args.options ?? {})) },
{ name: "receiz_search_query", sdkMethod: "search.query", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.query(args.body) },
{ name: "receiz_search_products", sdkMethod: "search.products", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.products(args.body) },
{ name: "receiz_search_pages", sdkMethod: "search.pages", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.pages(args.body) },
{ name: "receiz_search_blog", sdkMethod: "search.blog", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.blog(args.body) },
{ name: "receiz_search_orders", sdkMethod: "search.orders", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.orders(args.body) },
{ name: "receiz_search_customers", sdkMethod: "search.customers", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.customers(args.body) },
{ name: "receiz_search_proof_objects", sdkMethod: "search.proofObjects", arguments: ["body"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.search.proofObjects(args.body) },
{ name: "receiz_notifications_send", sdkMethod: "notifications.send", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.notifications.send(args.body, (args.options ?? {})) },
{ name: "receiz_notifications_subscribe", sdkMethod: "notifications.subscribe", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.notifications.subscribe(args.body, (args.options ?? {})) },
{ name: "receiz_notifications_templates", sdkMethod: "notifications.templates", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.notifications.templates((args.query ?? {})) },
{ name: "receiz_releases_pin", sdkMethod: "releases.pin", arguments: ["body", "options?"], mutation: true, requiresDelegated: true, requiredPayload: ["tenantHost", "rails"], invoke: (client, args) => client.releases.pin(args.body, (args.options ?? {})) },
{ name: "receiz_releases_check", sdkMethod: "releases.check", arguments: ["query?"], mutation: false, requiresDelegated: true, requiredPayload: [], invoke: (client, args) => client.releases.check((args.query ?? {})) },
{ name: "receiz_releases_supported", sdkMethod: "releases.supported", arguments: [], mutation: false, requiresDelegated: false, requiredPayload: [], invoke: (client, _args) => client.releases.supported() },
{ name: "receiz_webhook_endpoints_list", sdkMethod: "webhookEndpoints.list", arguments: [], mutation: false, requiresDelegated: false, requiredPayload: [], invoke: (client, _args) => client.webhookEndpoints.list() },
{ name: "receiz_webhook_endpoints_update", sdkMethod: "webhookEndpoints.update", arguments: ["endpointId", "body"], mutation: true, requiresDelegated: false, requiredPayload: [], invoke: (client, args) => client.webhookEndpoints.update(args.endpointId, args.body) },
{ name: "receiz_webhook_endpoints_delete", sdkMethod: "webhookEndpoints.delete", arguments: ["endpointId"], mutation: true, requiresDelegated: false, requiredPayload: [], invoke: (client, args) => client.webhookEndpoints.delete(args.endpointId) },
];
export const RECEIZ_V127_SDK_OPERATION_MAP = Object.freeze(Object.fromEntries(definitions.map((definition) => {
const support = RECEIZ_HTTP_OPERATION_SUPPORT[definition.sdkMethod];
if (!support)
throw new Error(`receiz_v127_sdk_http_classification_required:${definition.sdkMethod}`);
return [definition.name, Object.freeze({ ...definition, ...support, arguments: Object.freeze([...definition.arguments]), requiredPayload: Object.freeze([...definition.requiredPayload]) })];
})));
const closedQueries = Object.freeze({
"merchants.profile": ["tenantHost"], "merchants.capabilities": ["tenantHost"],
"commerce.payouts.status": ["tenantHost", "payoutId"], "domains.status": ["host", "domain"],
"permissions.roles": ["tenantHost"], "portability.exportStore": ["tenantHost"],
"notifications.templates": ["tenantHost"], "releases.check": ["tenantHost"],
});
function payloadSchema(definition, key) {
const closedKeys = key === "query" ? closedQueries[definition.sdkMethod] : undefined;
const fields = closedKeys ?? definition.requiredPayload;
return {
type: "object", additionalProperties: !closedKeys,
properties: Object.fromEntries(fields.map((field) => [field,
["rails", "payload", "performance"].includes(field) ? { type: "object", additionalProperties: true }
: field === "types" ? { type: "array", items: { type: "string", minLength: 1 } }
: { type: "string", minLength: 1 },
])),
...(definition.requiredPayload.length ? { required: definition.requiredPayload } : {}),
};
}
function schema(definition) {
const properties = {};
const required = [];
for (const argument of definition.arguments) {
const key = argument.replace(/\?$/, "");
properties[key] = key.endsWith("Id") ? { type: "string", minLength: 1 }
: key === "options" ? { type: "object", additionalProperties: false, properties: { idempotencyKey: { type: "string", minLength: 1 } } }
: payloadSchema(definition, key);
if (!argument.endsWith("?"))
required.push(key);
}
if (definition.mutation)
properties.confirmation = { type: "string", minLength: 1, description: "Exact single-use confirmationDigest from this tool's preview with identical arguments." };
return { type: "object", additionalProperties: false, properties, required };
}
function deepFreeze(value) {
if (value && typeof value === "object") {
for (const child of Object.values(value))
deepFreeze(child);
Object.freeze(value);
}
return value;
}
export const RECEIZ_V127_SDK_TOOLS = deepFreeze(definitions.map((definition) => ({
name: definition.name,
description: `Compose Receiz SDK ${definition.sdkMethod}. ${RECEIZ_HTTP_OPERATION_SUPPORT[definition.sdkMethod]?.executionMode === "historical-http" ? "Historical v106 compatibility HTTP: these routes are absent from the current Receiz server. Requires explicit legacyConnectTransport http and a separately configured compatibility host; credentials alone do not enable execution. " : "Current HTTP route implementation is present; authentication and operation admission still apply. "}${definition.sdkMethod === "commerce.oneClickCheckout" ? "Creates a card checkout session, not completed payment. Positive proposed wallet funding fails with wallet_settlement_execution_required before any card charge; wallet funds are never reported applied without settlement. " : ""}${definition.mutation ? "Returns a mutation preview; execute only after explicit user confirmation of its exact digest. " : ""}${authority}`,
inputSchema: schema(definition),
annotations: { readOnlyHint: !definition.mutation, destructiveHint: definition.mutation, openWorldHint: true },
})));
function assertJson(value, seen = new Set()) {
if (value === null || typeof value === "string" || typeof value === "boolean" || (typeof value === "number" && Number.isFinite(value)))
return;
if (!value || typeof value !== "object" || seen.has(value))
throw new Error("receiz_v127_sdk_json_required");
if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
throw new Error("receiz_v127_sdk_json_required");
seen.add(value);
for (const [key, child] of Object.entries(value)) {
if (["__proto__", "prototype", "constructor"].includes(key))
throw new Error("receiz_v127_sdk_argument_forbidden");
assertJson(child, seen);
}
seen.delete(value);
}
function object(value) {
if (!value || typeof value !== "object" || Array.isArray(value))
throw new Error("receiz_v127_sdk_object_required");
}
function validate(definition, raw) {
assertJson(raw);
object(raw);
const allowed = new Set(definition.arguments.map((argument) => argument.replace(/\?$/, "")));
if (definition.mutation)
allowed.add("confirmation");
for (const key of Object.keys(raw))
if (!allowed.has(key))
throw new Error(`receiz_v127_sdk_unknown_argument:${key}`);
for (const argument of definition.arguments) {
const key = argument.replace(/\?$/, "");
const value = raw[key];
if (value === undefined && argument.endsWith("?"))
continue;
if (key.endsWith("Id")) {
if (typeof value !== "string" || !value.trim())
throw new Error(`receiz_v127_sdk_required:${key}`);
}
else {
object(value);
if (key === "options") {
for (const option of Object.keys(value))
if (option !== "idempotencyKey")
throw new Error(`receiz_v127_sdk_unknown_option:${option}`);
if (value.idempotencyKey !== undefined && (typeof value.idempotencyKey !== "string" || !value.idempotencyKey.trim()))
throw new Error("receiz_v127_sdk_idempotency_key_invalid");
}
else {
const closedKeys = key === "query" ? closedQueries[definition.sdkMethod] : undefined;
if (closedKeys)
for (const [field, entry] of Object.entries(value)) {
if (!closedKeys.includes(field))
throw new Error(`receiz_v127_sdk_unknown_query:${field}`);
if (typeof entry !== "string" || !entry.trim())
throw new Error(`receiz_v127_sdk_query_invalid:${field}`);
}
for (const field of definition.requiredPayload) {
if (field === "rails" || field === "payload" || field === "performance") {
object(value[field]);
continue;
}
if (field === "types") {
if (!Array.isArray(value[field]) || !value[field].every((entry) => typeof entry === "string" && entry.trim()))
throw new Error("receiz_v127_sdk_event_types_invalid");
continue;
}
if (typeof value[field] !== "string" || !value[field].trim())
throw new Error(`receiz_v127_sdk_required:${field}`);
}
}
}
}
if (raw.confirmation !== undefined && (typeof raw.confirmation !== "string" || !raw.confirmation.trim()))
throw new Error("receiz_v127_sdk_confirmation_invalid");
return structuredClone(raw);
}
function canonical(value) {
if (Array.isArray(value))
return `[${value.map(canonical).join(",")}]`;
if (value && typeof value === "object")
return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, child]) => `${JSON.stringify(key)}:${canonical(child)}`).join(",")}}`;
return JSON.stringify(value);
}
/** Confirmation is local consent custody, never admission or proof authority. */
export function createReceizV127SdkOperations(input) {
if (input.executionProfile !== undefined && input.executionProfile !== "marketplace-phi" && input.executionProfile !== "marketplace-nonfinancial")
throw new TypeError("RECEIZ_MCP_EXECUTION_PROFILE_INVALID");
const marketplacePhi = input.executionProfile === "marketplace-phi";
const marketplaceNonfinancial = input.executionProfile === "marketplace-nonfinancial";
const client = marketplacePhi ? wrapReceizMarketplaceClient(input.client) : input.client;
const plans = new Map();
return {
handles(name) { return Object.hasOwn(RECEIZ_V127_SDK_OPERATION_MAP, name); },
requiresDelegated(name) { return Object.hasOwn(RECEIZ_V127_SDK_OPERATION_MAP, name) && RECEIZ_V127_SDK_OPERATION_MAP[name].requiresDelegated; },
async call(name, raw = {}) {
if (marketplaceNonfinancial)
assertReceizMarketplaceNonfinancialTool(name);
if (!Object.hasOwn(RECEIZ_V127_SDK_OPERATION_MAP, name))
throw new Error("receiz_v127_sdk_unknown_operation");
if (marketplacePhi)
assertReceizMarketplaceToolCall(name, raw);
const definition = RECEIZ_V127_SDK_OPERATION_MAP[name];
const args = validate(definition, raw);
if (definition.executionMode === "historical-http" && !client.httpTransport?.legacyConnectHttp) {
throw new Error(`RECEIZ_HISTORICAL_CONNECT_HOST_REQUIRED:${definition.sdkMethod}`);
}
if (definition.requiresDelegated)
input.ensureDelegated();
const confirmation = args.confirmation;
delete args.confirmation;
if (!definition.mutation)
return definition.invoke(client, args);
const identity = canonical({ operation: definition.sdkMethod, args });
if (confirmation === undefined) {
const confirmationDigest = createHash("sha256").update("receiz.mcp.sdk-consent.v127:" + randomUUID() + identity).digest("hex");
plans.set(confirmationDigest, identity);
return { schema: "receiz.mcp.sdk-preview.v127", status: "planned", operation: definition.sdkMethod, arguments: args, confirmationDigest, confirmationRequired: true, writesPerformed: 0, authority };
}
if (plans.get(confirmation) !== identity)
throw new Error("receiz_v127_sdk_confirmation_invalid");
// Consume before calling the SDK, including failed/unknown outcomes.
plans.delete(confirmation);
const result = await definition.invoke(client, args);
return { schema: "receiz.mcp.sdk-result.v127", operation: definition.sdkMethod, result, authority };
},
};
}
//# sourceMappingURL=v127SdkOperations.js.map