// Minimal paid Skavio MCP example (official MCP TypeScript SDK). // // npm install @modelcontextprotocol/sdk // SKAVIO_MCP_CREDENTIAL=... SKAVIO_MCP_INPUT=/path/file.pdf node quickstart.mjs // // Tenant, role and company come only from the credential. import { readFile } from "node:fs/promises"; import { basename, resolve } from "node:path"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const ENDPOINT = "https://www.skavio.eu/processing/mcp"; function asJson(result) { const text = result.content?.find((part) => part.type === "text")?.text ?? "{}"; return JSON.parse(text); } async function main() { const credential = process.env.SKAVIO_MCP_CREDENTIAL; const input = resolve(process.env.SKAVIO_MCP_INPUT); if (!credential) throw new Error("set SKAVIO_MCP_CREDENTIAL"); const transport = new StreamableHTTPClientTransport(new URL(ENDPOINT), { requestInit: { headers: { Authorization: `Bearer ${credential}` } }, }); const client = new Client({ name: "skavio-example", version: "1.0.0" }); await client.connect(transport); console.log( "tools", (await client.listTools()).tools.map((tool) => tool.name).join(", "), ); const catalog = asJson( await client.callTool({ name: "skavio_paid_catalog", arguments: {} }), ); console.log("pricing", catalog.pricing_version, "margin", catalog.margin_band); const bytes = await readFile(input); const upload = asJson( await client.callTool({ name: "skavio_upload_bytes", arguments: { filename: basename(input), data_base64: bytes.toString("base64"), idempotency_key: `upload-${basename(input)}`, }, }), ); const uploadId = upload.uploads[0].id; console.log("uploaded", uploadId); const spec = { operation: "pdf_to_text", upload_ids: [uploadId] }; const quote = asJson( await client.callTool({ name: "skavio_estimate", arguments: { spec } }), ); spec.max_credits = quote.estimated_credits; let job = asJson( await client.callTool({ name: "skavio_submit_job", arguments: { spec, idempotency_key: `example-${basename(input)}` }, }), ); console.log("job", job.id, job.status); for (let i = 0; i < 60 && !["completed", "failed"].includes(job.status); i++) { await new Promise((r) => setTimeout(r, 5000)); job = asJson( await client.callTool({ name: "skavio_get_job", arguments: { job_id: job.id } }), ); } console.log("final", job.status, "charged", job.charged_credits); console.log( "accounting", asJson(await client.callTool({ name: "skavio_adapter_usage", arguments: {} })), ); await client.close(); } main().catch((err) => { console.error(err); process.exit(1); });