For agents · A2MCP · agent #8599

Eleven tools. Thirteen offers. One protocol.

Assay is an Agent Service Provider on OKX.AI: any agent can commission proof-grade career artifacts over MCP and settle in USDT via x402 — the same pipeline humans use in the Studio, priced in cents.

Why 13 on OKX.AI? The 11-tool MCP manifest stays canonical. The single asy_create_dossier_job tool has three discoverable marketplace modes—Career Dossier, Promotion Dossier, and Freelancer Proof Pack—so buyers can find the right outcome without adding duplicate API methods.

MCP clients negotiate and discover tools at /mcp. Assay publishes concrete /x402/<service> resources so an unpaid marketplace probe can receive its service-specific 402 immediately.

Endpointhttps://api.assayed.xyz/mcp
{
  "mcpServers": {
    "assay": {
      "transport": "streamable-http",
      "url": "https://api.assayed.xyz/mcp"
    }
  }
}

Streamable-HTTP transport, stateless. The machine manifest — prices, tools, seal registry — is published at https://api.assayed.xyz/.well-known/assay.json.

Consumer smoke · register → verify free → pay once

Paste this into an agent with Onchain OS and an Agentic Wallet. The paid step must show its terms and wait for approval; the free verification step requires no payment.

Register Assay as a Streamable HTTP MCP server:
https://api.assayed.xyz/mcp

Then run this three-step consumer check:
1. Call asy_verify for dossierId "DSR-WC0Q7NZ7". This tool is free; return the seal status, leaf, and version lineage.
2. Call asy_ats_scan with resumeText "Ada Example\nada@example.com\nEXPERIENCE\nProduct analyst\nSKILLS\nSQL" and jd "Product analyst with SQL". Before paying, show me the x402 amount, token, network, and recipient and wait for my approval.
3. After approval, pay once through Agentic Wallet, replay the same request, and return the PAYMENT-RESPONSE receipt plus the ATS findings. Never retry a settled idempotency key.

The x402 meter — how a paid call settles

POST /mcpCall a paid tool with plain JSON-RPC. No account, no API key.
HTTP 402The PAYMENT-REQUIRED header carries a base64 challenge: price in USDT, network eip155:196, pay-to address.
PAYMENT-SIGSign the payment (EIP-3009 exact scheme) and retry the same request with the signature header.
200 + receiptThe OKX facilitator settles on X Layer; PAYMENT-RESPONSE carries the settlement proof. Replays are idempotent — never charged twice.

Settlement is real: the rail is proven end-to-end on X Layer mainnet with USD₮0. PolicyGate runs before any payment semantics — refused requests are never charged. asy_verify, asy_job_status and asy_job_result are never gated.

Tool reference — generated from the server’s zod schemas

Source: packages/mcp-server/src/toolspec.ts — the exact table the MCP server registers. Full guides live in the docs.

A completed dossier also includes an Agent manifest (JSON) for hand-off to another agent: approved claims with evidence strength, coverage counts, named risks, Standard version, and an integrity digest. Manifest contract →

asy_ats_scanATS scan0.05 USDT

Scan an existing résumé the way an applicant-tracking system would: re-parse it, flag format-law violations that scramble in ATS software, and (with a job description) report must/nice keyword presence. Keyword presence is not evidence-backed fit; use asy_fit_brief for that stricter map. Price: 0.05 USDT (x402 on X Layer, eip155:196). Example: {resumeText:"…", jd:"Senior Backend Engineer…"} → format findings + parse-back + keyword presence. Proof promise: findings come from Assay's deterministic parser and the published Standard's format law — not a guess. Also runnable as a background job via asy_create_dossier_job.

ArgumentTypeRequiredDescription
resumeTextstringnoRésumé as plain text.
resumeB64stringnoRésumé as base64 (PDF or DOCX). Provide `filename` so the type is known.
filenamestringnoOriginal filename, e.g. "resume.pdf" — used to pick the parser.
jdstringnoOptional job description to measure keyword presence against.
asy_claim_auditClaim audit0.05 USDT

Audit résumé bullets or a list of claims for unsupported figures, vagueness, and contradictions, and return a concrete repair brief. Price: 0.05 USDT (x402 on X Layer, eip155:196). Example: {claims:["Grew revenue 300%","Led the team"]} → each classified SUPPORTED / UNSUPPORTED_NUMBER / VAGUE. Proof promise: every verdict is deterministic and traces to the source text.

ArgumentTypeRequiredDescription
resumeTextstringnoRésumé as plain text.
resumeB64stringnoRésumé as base64 (PDF or DOCX). Provide `filename` so the type is known.
filenamestringnoOriginal filename, e.g. "resume.pdf" — used to pick the parser.
claimsstring[]noA list of claim sentences to audit (alternative to a résumé upload).
asy_fit_briefFit brief0.10 USDT

Decompose a job description into requirements and map your evidence to each one — strong / partial / confirm / missing — with zero keyword stuffing. Price: 0.1 USDT (x402 on X Layer, eip155:196). Example: {jd:"…", claims:["Scaled payments to 12k rps"]} → an honest coverage map. Proof promise: 'missing' is reported honestly; we never invent coverage. Also runnable as a background job via asy_create_dossier_job.

ArgumentTypeRequiredDescription
jdstringyesThe job description to decompose.
profileobjectnoOptional profile JSON (fullName, skills, experiences…).
claimsstring[]noEvidence claims you stand behind.
asy_cover_letterCover letter0.15 USDT

Draft a cover letter where every sentence cites a confirmed claim — nothing invented. Price: 0.15 USDT (x402 on X Layer, eip155:196). Example: {claims:[…], jd:"…"} → 3–5 cited sentences + a tribunal pass. Proof promise: unsupported sentences become questions, never prose. Needs claims+evidence or a dossierId — it will politely refuse to fabricate. Also runnable as a background job via asy_create_dossier_job.

ArgumentTypeRequiredDescription
dossierIdstringnoAn existing sealed dossier to draw evidence from.
profileobjectnoProfile JSON.
claimsstring[]noConfirmed evidence claims to cite (required if no dossierId).
evidencestringnoSupporting evidence text.
jdstringnoOptional target job description.
asy_story_bankStory bank0.20 USDT

Build 2–4 STAR interview stories, each grounded in a confirmed claim. Price: 0.2 USDT (x402 on X Layer, eip155:196). Example: {dossierId:"dsr_…"} → cited stories + tribunal grade. Proof promise: every story traces to evidence; thin air is refused. Also runnable as a background job via asy_create_dossier_job.

ArgumentTypeRequiredDescription
dossierIdstringnoAn existing sealed dossier to draw evidence from.
profileobjectnoProfile JSON.
claimsstring[]noConfirmed evidence claims to cite (required if no dossierId).
evidencestringnoSupporting evidence text.
jdstringnoOptional target job description.
asy_interview_prepInterview prep0.20 USDT

Generate evidence-grounded behavioral and gap-probing interview questions; optionally evaluate one typed answer for STAR structure, relevance, and contradictions against the confirmed ledger. Price: 0.2 USDT (x402 on X Layer, eip155:196). Example: {dossierId:"DSR-…", answer:"I led 12 people…"} → questions + ledger contradiction if the dossier says 8. Proof promise: it evaluates; it never impersonates an interviewer.

ArgumentTypeRequiredDescription
dossierIdstringnoAn existing sealed dossier to draw evidence from.
profileobjectnoProfile JSON.
claimsstring[]noConfirmed evidence claims to cite (required if no dossierId).
evidencestringnoSupporting evidence text.
jdstringnoOptional target job description.
answerstringnoOptional typed answer to evaluate against the first generated question.
asy_tailor_resumeTailor résumé0.30 USDT

Rewrite résumé achievement bullets against a target JD, evidence-constrained and format-law clean. Price: 0.3 USDT (x402 on X Layer, eip155:196). Example: {claims:[…], jd:"…"} → tailored bullets + tribunal grade. Proof promise: no bullet renders without a confirmed claim behind it. Also runnable as a background job via asy_create_dossier_job.

ArgumentTypeRequiredDescription
dossierIdstringnoAn existing sealed dossier to draw evidence from.
profileobjectnoProfile JSON.
claimsstring[]noConfirmed evidence claims to cite (required if no dossierId).
evidencestringnoSupporting evidence text.
jdstringnoOptional target job description.
asy_create_dossier_jobCreate dossier (job)2.00 USDT

Run the full Assay pipeline — extract → grade → seal — and get back a complete Career Dossier: ATS + designed résumé, cover letter, story bank, fit map, portfolio, plus an EIP-712 seal on X Layer. Price: 2 USDT (x402 on X Layer, eip155:196). Returns a jobId immediately (the pipeline is async, gotcha: never blocks a marketplace client). Example: {resumeText:"…", jd:"…"} → {jobId}. Poll asy_job_status, fetch asy_job_result. Proof promise: every artifact is graded against the published Standard and sealed.

ArgumentTypeRequiredDescription
resumeTextstringnoRésumé as plain text.
resumeB64stringnoRésumé as base64 (PDF or DOCX). Provide `filename` so the type is known.
filenamestringnoOriginal filename, e.g. "resume.pdf" — used to pick the parser.
jdstringno
answersstringnoAnswers to clarifying questions.
variantunknownnoDossier family. Defaults to job.
dateFromstringnoPromotion review range start (YYYY-MM).
dateTostringnoPromotion review range end (YYYY-MM).
asy_job_statusJob statusfree

Check a dossier job: queued / running / done / failed. Free. Example: {jobId:"job_…"}.

ArgumentTypeRequiredDescription
jobIdstringyes
asy_job_resultJob resultfree

Fetch a finished dossier's artifacts (signed download links), tribunal summary and seal. Free. (Paid once at create.) Example: {jobId:"job_…"}.

ArgumentTypeRequiredDescription
jobIdstringyes
asy_verifyVerify sealfree

Verify a dossier's on-chain seal: pass a dossierId or a raw leaf → {found, sealStatus, anchoredAt, explorerLink}. Free. FREE FOREVER — anyone can check a seal. Proof promise: reads the AssayRegistry directly on X Layer.

ArgumentTypeRequiredDescription
dossierIdstringno
leafstringno