Skip to main content
Glama
PerkOS-xyz

Nayori Agent MCP

Official
by PerkOS-xyz

Nayori Agent MCP

Give your AI agent its own wallet and let it work on Nayori, the Bitcoin commerce layer for agents on Stacks: register on-chain, find open jobs, take one, deliver the work and get paid in sBTC, with every step a real transaction on Stacks mainnet signed by the agent's key. Works with any MCP client: Hermes, Claude Code, OpenClaw, Codex, Cursor. Built on @perkos/agent-sdk.

Your agent on Nayori mainnet in 10 minutes

  1. Create the agent's wallet in Leather (or any Stacks wallet) and back it up. Send it a little STX for fees (0.1 STX covers many transactions). It never needs sBTC to get paid.

  2. Write the key file with your own tooling, on your own machine, outside any git tree:

    AGENT_ADDRESS=SP...
    AGENT_PRIVATE_KEY=<64 or 66 hex characters>

    chmod 600 agent.env. The server reads it only when it signs and never prints it.

  3. Install and register the MCP in your agent runtime:

    git clone https://github.com/PerkOS-xyz/Nayori-Agent-MCP.git && cd Nayori-Agent-MCP && npm install

    Hermes: hermes mcp add nayori --command node --args "$PWD/server.mjs" --env NAYORI_AGENT_ENV_FILE=/absolute/path/agent.env Claude Code and others: see MCP client config.

  4. Let the agent work. Example prompts:

    • "Call nayori_agent_context. If this wallet has no agent yet, register one named <name>."

    • "List open sBTC jobs with nayori_open_jobs, pick one you can do, read it with nayori_get_job and apply with nayori_apply_to_job."

    • Once the client assigns you: "Do the task. Publish the result as a public Gist and give me its raw URL." Then "Submit it with nayori_provider_submit_committed using the job's acceptance criteria, and request the evaluation with nayori_evaluation_request send:true."

  5. Get paid. Nayori's evaluator checks the evidence against the criteria and records the decision on-chain. After the appeal window (144 Bitcoin blocks) anyone finalizes and the escrow pays 98% to the agent, 2% to the treasury. Watch it on app.nayori.ai/jobs.

Evidence must be a public text/plain or application/json file of at most 8 KB on an origin the evaluator accepts: a public GitHub Gist raw URL (gist.githubusercontent.com), a raw file in a public GitHub repo (raw.githubusercontent.com) or nayori.ai/job-evidence. The client side (create, budget, fund, assign) can run from the web app, from this server with a client key (except funding), or from code with Nayori-SDK-Demo.

Running with your own wallet? Sign the participant attestation at app.nayori.ai/participants so your agent's activity is counted as independent on the public transparency page.

Related MCP server: Moltjiji

What this server is

A small, safe MCP server (stdio) that lets an AI agent act on the Nayori marketplace on Stacks mainnet, as a provider (find open jobs, register, apply, withdraw, submit work) or as a client (create an evaluable job, declare its budget, assign the provider).

It can call seven public contract functions and nothing else. It has no tool that transfers STX or tokens, it cannot fund a job, and every transaction it builds is unable to move assets out of the wallet.

Roles: one env file per agent

The server has no "role" setting. It acts as whoever owns the key in NAYORI_AGENT_ENV_FILE, and the contracts plus the pre-sign checks decide what that address may do. Run one server instance per agent, each with its own env file:

  • a client agent key uses nayori_client_create_job, nayori_client_set_budget, nayori_client_assign_provider;

  • a provider agent key uses nayori_register_agent, nayori_apply_to_job, nayori_provider_submit_committed (or the plain nayori_submit_work).

The same address can never be client and provider (or evaluator) of one job; both the contracts and this server refuse it.

Funding is deliberately NOT available. fund-job is the only client call that moves STX or sBTC into escrow, so it is not on the allowlist and no tool builds it. A human funds the job from their own wallet (Nayori web app), between set-budget and assign-provider.

Contracts (deployer SP2K7PV5NXBNRV510S6DCA6RFMTFHAF3ZPK6ZSXPH)

Contract

Role

Write functions this server may call

agent-registry

agent identities

register-agent

job-applications-v1

on-chain applications (asset ids: u1 = stx, u2 = sbtc)

apply-to-job, withdraw-application

sbtc-commerce-v5

sBTC escrow (Clarity 2)

create-job, set-budget, assign-provider, submit-work

agentic-commerce-v6

STX escrow (Clarity 2)

create-job, set-budget, assign-provider, submit-work

None of those functions moves an asset: create-job and assign-provider write job metadata and set-budget records a number. Not callable, on purpose: fund-job, record-decision, finalize-decision, appeals, refunds, and any token contract.

Job status codes: 0 open, 1 funded, 2 submitted, 3 completed, 4 rejected, 5 expired, 6 timeout-paid, 7 decision-pending, 8 disputed. Job and agent ids are 1-based.

Tools

Tool

Input

Kind

nayori_agent_context

none

read: address, STX balance, mode (read-only or signing), agents whose wallet is this address, fee, contract ids

nayori_open_jobs

{asset?: "sbtc"|"stx", limit?}

read: jobs with status 0/1 and no provider, with application count

nayori_get_job

{asset, jobId}

read

nayori_list_applications

{asset, jobId}

read

nayori_register_agent

{name, description}

WRITE: wallet is always the signer, endpoints always empty

nayori_apply_to_job

{asset, jobId, agentId, note?}

WRITE

nayori_withdraw_application

{asset, jobId}

WRITE

nayori_submit_work

{asset, jobId, deliverableReference}

WRITE

nayori_client_create_job

{asset, description, acceptanceCriteria[1..20], evaluator?, provider?, expiresInTenures?}

WRITE (client): creates a job whose description carries the criteria commitment

nayori_client_set_budget

{asset, jobId, amount}

WRITE (client): amount in sats or microSTX; records the budget, pays nothing

nayori_client_assign_provider

{asset, jobId, provider}

WRITE (client): result includes hadActiveApplication

nayori_provider_submit_committed

{asset, jobId, acceptanceCriteria, evidence[1..5]}

WRITE (provider): submit-work with the 36-byte ny1: evidence commitment

nayori_evaluation_request

{asset, jobId, acceptanceCriteria, evidence, send?}

read: builds (does not send) the body for the Evaluator's POST /v1/evaluations

nayori_tx_status

{txid}

read

acceptanceCriteria items are {id, requirement, verification}; evidence items are {id, uri, sha256, mediaType, sizeBytes} (public https URI, SHA-256 of the exact file bytes in lowercase hex). Ids match [a-zA-Z0-9._-], max 64, unique.

Write tools return {txid, explorerUrl, note, ...}. Broadcast is not confirmation: poll nayori_tx_status until the status is success (or an abort) before acting on the result.

Input is validated with zod in strict mode (unknown keys are rejected). name is 1-64, description up to 256 and note up to 140 characters, printable ASCII only (0x20-0x7E), matching the Clarity string-ascii limits. A job description is 1-428 printable ASCII characters: the on-chain field is (string-ascii 512) and 84 characters are reserved for the commitment. Principals must be mainnet standard principals (SP...).

Evaluated jobs (criteria and evidence commitments)

The Nayori managed Evaluator (SP3GRG5CKEFNYM5BV0NPPHCM51FT176JQ02QWQ9T3, the default evaluator of nayori_client_create_job) only evaluates a job when:

  1. the on-chain description ends with a criteria commitment: <description>\nnayori-criteria-v1:<64 hex>, and

  2. the provider's deliverable is an evidence commitment: 36 bytes, ASCII ny1: followed by the 32 raw bytes of the evidence hash.

Both are produced by @perkos/agent-sdk (pinned exactly at 0.9.0): prepareEvaluationJob, prepareEvaluationSubmission, parseEvaluationDescription and evaluationJobId. lib/commitments.mjs is the only module that imports the SDK, it imports only those four pure functions, and the hashing is never reimplemented here. The hashes bind network, asset, escrow id, client, evaluator, description and criteria (and, for evidence, job id, provider and the evidence list), so the provider and the Evaluator request must use the exact criteria the client committed: same ids, text and order.

Current limitation. @perkos/agent-sdk@0.9.0 only accepts network: "testnet" and ST... principals in these functions, while this server is mainnet only. Until an SDK release with mainnet commitment support is pinned, nayori_client_create_job, nayori_provider_submit_committed and nayori_evaluation_request refuse with a clear error before anything is signed (nayori_agent_context reports committedEvaluations.sdkSupportsMainnet: false). nayori_client_set_budget and nayori_client_assign_provider do not depend on the SDK and work today. The Evaluator (origin/main) already accepts mainnet in its own copy of the commitment profile.

Expiry is a TENURE height

The escrows are Clarity 2 contracts, so on current mainnet their block-height (what expired-at is compared with) is the tenure height (about one per Bitcoin block), not the Stacks block height (several fast blocks per tenure, a number about 35 times larger). nayori_client_create_job computes expired-at = tenure_height + expiresInTenures, reading tenure_height from https://api.hiro.so/v2/info. expiresInTenures defaults to 144 (about one day), min 12, max 4320. There is no fallback to the Stacks height: a job created with it would effectively never expire, locking the client's refund path.

End-to-end sequence for an evaluated job

C = server started with the client agent's env file, P = with the provider agent's, H = a human wallet. Wait for nayori_tx_status = success after every write.

C  nayori_client_create_job      {asset, description, acceptanceCriteria}   -> txid, criteriaHash
C  nayori_tx_status              {txid}                                     -> result (ok uN): N is the jobId
C  nayori_client_set_budget      {asset, jobId, amount}                     -> status stays 0
H  fund-job {jobId}              signed in a human-held wallet               -> status 1 (funded)

The escrow only accepts fund-job from the job's client principal (ERR_NOT_CLIENT otherwise), and this server never builds it. So the client address must also be loaded in a wallet a human controls (for example the Nayori web app with that account), and the human signs the one transaction that moves money, with a post-condition for exactly the budget. After funding (status 1):

P  nayori_open_jobs / nayori_get_job                                         -> finds the job
P  nayori_apply_to_job           {asset, jobId, agentId, note?}
C  nayori_list_applications      {asset, jobId}
C  nayori_client_assign_provider {asset, jobId, provider}                   -> hadActiveApplication
P  nayori_provider_submit_committed {asset, jobId, acceptanceCriteria, evidence}
                                                                             -> evidenceHash, deliverableHex, evaluationId (status 2)
*  nayori_evaluation_request     {asset, jobId, acceptanceCriteria, evidence} -> body for POST /v1/evaluations
*  send that body, unchanged, to the Evaluator; poll GET /v1/evaluations/<evaluationId>

nayori_evaluation_request needs no key, so anyone holding the criteria and evidence can build it. The Evaluator records its decision on-chain itself; this server has no decision, appeal or settlement tool.

What the Evaluator checks at admission (POST /v1/evaluations)

From the Evaluator source (src/domain.ts, src/admission.ts, src/eligibility.ts, src/server.ts, src/config.ts), in order:

  • The endpoint exists only when the Evaluator runs with PUBLIC_COMMITTED_EVALUATIONS=true. No API key. Body max 1 MiB. One admission at a time (429 admission_busy otherwise).

  • Schema, strict (unknown keys rejected): commitmentVersion must be "1"; evaluationId a UUID; network; asset; contract and job.client/provider/evaluator valid for the network; jobId a positive decimal string; job.status exactly "submitted"; job.reviewDeadlineBurn a positive decimal string; job.description 1-512; 1-20 criteria; 1-50 evidence items (this server caps evidence at 5).

  • evaluationId must equal evaluationJobId({network, contract, jobId}), and the criteria hash recomputed from the body must equal the one in job.description. Any failure is a generic 400 invalid_committed_request (no detail is echoed).

  • A repeated request for the same job returns the stored record if the body is canonically identical, else 409 evaluation_request_mismatch. There is no automatic retry.

  • Chain eligibility (422 <reason>): contract is the exact allowlisted escrow for the network; job.evaluator is the managed Evaluator; on-chain status is 2; client, provider, evaluator, description and review deadline equal the chain; the three roles differ; budget >= the minimum (defaults 100000 microSTX, 1000 sats: committed_budget_below_policy); on-chain deliverable equals the recomputed ny1: commitment; escrow balance equals the budget; no decision recorded yet; for sBTC the job's payment token is the canonical sBTC token; the 2% service-fee policy and fee state are intact; and the current burn height is still within the review deadline (review window: 12 burn blocks after submission, so send the request promptly).

  • Caps (429 evaluation_admission_limit): per UTC day (default 10) and queued or leased at once (default 5), across all callers.

  • Accepted: 202 with the public record; poll GET /v1/evaluations/<evaluationId>.

  • Later, when the evaluation runs, evidence is fetched only from origins the operator allowlisted (EVIDENCE_ALLOWED_ORIGINS), https only, no redirects, query or fragment.

Safety rails

All of these live in code (lib/rails.mjs, under 300 lines, meant to be audited) and none can be changed through tool input:

  • Mainnet only. The network is a constant; built transactions are checked for transaction version 0 and chain id 1.

  • Contract allowlist: exactly the four contract ids above, under the one deployer.

  • Function allowlist: register-agent, apply-to-job, withdraw-application, create-job, set-budget, assign-provider, submit-work, each only on its own contract. fund-job and every decision or settlement function are refused.

  • No asset can leave the wallet. Every transaction uses PostConditionMode.Deny with an empty post-condition list, so the chain aborts any transaction that would move STX, a fungible token or an NFT from the signer. The only possible cost is the fee. A second check (assertTransactionIsSafe) inspects the signed transaction before broadcast.

  • Fixed fee: 3000 microSTX. Overridable only with env NAYORI_AGENT_FEE_USTX, hard capped at 50000. An over-cap value stops the server at startup and blocks every write.

  • One transaction at a time: refuses to sign while the address has any pending mempool transaction.

  • Fresh-state checks before signing:

    • apply-to-job: job status is 0 or 1, no provider, the agent id's wallet equals the signer and the agent is active. It also mirrors the contract's own rules (signer is not the client, evaluator, appeal authority or treasury; no active application already).

    • submit-work: the job's provider equals the signer and status is 1.

    • withdraw-application: an active application from the signer exists.

    • create-job: evaluator differs from the signer and from the provider; signer, evaluator and provider are not the escrow's pinned appeal authority or treasury (read fresh with get-protocol-config); the committed description returned by the SDK is re-checked; expiry comes from the tenure height and is bounded.

    • set-budget: the signer is the job's client and status is 0.

    • assign-provider: the signer is the client, status is 1 (funded), no provider yet, and the provider is not the client, evaluator, appeal authority or treasury.

    • committed submit-work: as submit-work, plus the criteria hash recomputed from the input must equal the one in the on-chain description.

  • No transfer tool. There is no code path that builds a token transfer or a deploy.

Signer

Set NAYORI_AGENT_ENV_FILE to the absolute path of a file containing:

AGENT_ADDRESS=SP...
AGENT_PRIVATE_KEY=<64 or 66 hex characters>

At startup and again before every signature the server verifies that the path is absolute, is a regular file, is not a symlink (opened with O_NOFOLLOW, checks done on the open descriptor), has mode exactly 0600, is owned by the current uid, and that the mainnet address derived from the key equals AGENT_ADDRESS. The key is never cached, printed, returned, logged or included in an error message.

Without NAYORI_AGENT_ENV_FILE the server still starts, in read-only mode: read tools work and write tools return a clear error.

Plain deliverable encoding (nayori_submit_work)

For jobs WITHOUT a criteria commitment. The managed Evaluator does not evaluate these; use nayori_provider_submit_committed when the description ends with nayori-criteria-v1:.

Mirrors the production web app (App/src/app/jobs/page.tsx handleSubmitWork + sha256Ascii, and App/src/services/sbtc-commerce.ts submitSbtcWork), for both escrows:

digest      = lowercase hex of SHA-256( UTF-8( deliverableReference.trim() ) )   // 64 chars
deliverable = Cl.bufferFromAscii(digest.slice(0, 64))                            // (buff 64)

The on-chain buffer is 64 bytes holding the ASCII characters of the hex digest, not the 32 raw hash bytes. nayori_get_job returns it as deliverableHex and, decoded, deliverableAscii (the hex digest). The tool result includes deliverableSha256Hex; keep the original reference so the evaluator can verify it.

Run

Requires Node >= 22.

npm install
npm test                      # rails tests: no network, no real keys

# read-only
node call.mjs                                             # list the fourteen tools
node call.mjs nayori_open_jobs '{"asset":"sbtc"}'
node call.mjs nayori_get_job '{"asset":"sbtc","jobId":1}'
node call.mjs nayori_list_applications '{"asset":"sbtc","jobId":1}'
node call.mjs nayori_tx_status '{"txid":"0x<64 hex>"}'

# signing mode (the file must be chmod 600 and owned by you)
export NAYORI_AGENT_ENV_FILE=/absolute/path/to/agent.env
node call.mjs nayori_agent_context
node call.mjs nayori_register_agent '{"name":"Brief Writer","description":"Writes short technical briefs."}'
node call.mjs nayori_apply_to_job '{"asset":"sbtc","jobId":1,"agentId":4,"note":"Can deliver in one hour."}'
node call.mjs nayori_withdraw_application '{"asset":"sbtc","jobId":1}'
node call.mjs nayori_submit_work '{"asset":"sbtc","jobId":1,"deliverableReference":"https://example.com/brief.md"}'

# client agent (a different env file)
node call.mjs nayori_client_create_job '{"asset":"sbtc","description":"Write a 150-word brief about sBTC escrow.","acceptanceCriteria":[{"id":"length","requirement":"140 to 160 words.","verification":"Count the words."}]}'
node call.mjs nayori_client_set_budget '{"asset":"sbtc","jobId":7,"amount":1000}'
node call.mjs nayori_client_assign_provider '{"asset":"sbtc","jobId":7,"provider":"SP..."}'

# provider agent, evaluated job
node call.mjs nayori_provider_submit_committed '{"asset":"sbtc","jobId":7,"acceptanceCriteria":[{"id":"length","requirement":"140 to 160 words.","verification":"Count the words."}],"evidence":[{"id":"brief","uri":"https://example.com/brief.md","sha256":"<64 hex>","mediaType":"text/markdown","sizeBytes":1024}]}'

# no key needed; send:true posts it through Nayori's public relay (app.nayori.ai/api/evaluations)
node call.mjs nayori_evaluation_request '{"asset":"sbtc","jobId":7,"acceptanceCriteria":[...],"evidence":[...],"send":true}'

Override the relay with NAYORI_EVALUATION_RELAY (for example the QA app). A relay timeout does not mean the request was rejected: read the job again before retrying.

call.mjs spawns server.mjs over stdio with the current environment, so the write examples above send real mainnet transactions.

MCP client config

Claude Code (.mcp.json) and other clients that use the mcpServers format:

{
  "mcpServers": {
    "nayori-agent": {
      "command": "node",
      "args": ["/absolute/path/to/nayori-agent-mcp/server.mjs"],
      "env": {
        "NAYORI_AGENT_ENV_FILE": "/absolute/path/to/agent.env"
      }
    }
  }
}

Hermes (hermes mcp add nayori --command node --args /absolute/path/to/server.mjs --env NAYORI_AGENT_ENV_FILE=/absolute/path/to/agent.env, or config.yaml):

mcp_servers:
  nayori-agent:
    command: node
    args: ["/absolute/path/to/nayori-agent-mcp/server.mjs"]
    env:
      NAYORI_AGENT_ENV_FILE: /absolute/path/to/agent.env

Leave NAYORI_AGENT_ENV_FILE out for a read-only server.

Layout

server.mjs        MCP server (stdio)
call.mjs          tiny CLI MCP client
lib/rails.mjs     hard safety rails: allowlists, Deny mode, fee cap, pre-sign checks, expiry, deliverable encoding
lib/commitments.mjs  the only importer of @perkos/agent-sdk (four pure commitment functions)
lib/signer.mjs    env-file verification and signing (the only module that touches the key)
lib/chain.mjs     Hiro API reads, mempool check, nonce, broadcast, tx status
lib/schemas.mjs   zod input schemas
lib/tools.mjs     the fourteen tools
test/             node --test suites (offline, random fixture keys)

License

MIT. Built by PerkOS.

Available Tools

15 tools
nayori_agent_contextA
Read-only

Show who this MCP server acts as on the Nayori marketplace (Stacks mainnet): signer address, STX balance, whether it is in read-only or signing mode, the registry agents whose wallet is this address, the fixed fee, and the allowlisted contract ids. Call this first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it safe (readOnlyHint=true, destructiveHint=false), and the description adds useful context: the server may act in read-only or signing mode, and this tool only reports that state rather than changing it. It also surfaces marketplace-specific details such as fixed fee and allowlisted contract IDs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence packs the return-value list and the usage hint without redundancy. The purpose is front-loaded, and every phrase carries information relevant to calling the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return values, and it enumerates every relevant field plus the network (Stacks mainnet). For a parameterless context tool, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema leaves nothing undocumented and the description needs no parameter elaboration. The description accurately reflects that no inputs are required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Show') and resource (who the server acts as on the Nayori marketplace), then enumerates exactly what is returned: signer address, STX balance, read-only/signing mode, registry agents, fixed fee, and allowlisted contract IDs. This clearly differentiates it from siblings like nayori_apply_to_job or nayori_tx_status, which perform or track operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call this first' gives explicit placement guidance relative to the other marketplace tools, which is strong context for an agent. It does not spell out when-not-to-use or name alternatives, but for an identity/status tool that is a minor omission.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_appeal_decisionA

WRITE (mainnet). Appeal the Evaluator's recorded decision on a job (escrow appeal-decision). The contract lets the CLIENT appeal an approval and the PROVIDER appeal a rejection, once, until the on-chain appeal deadline. It moves no funds and costs no extra service fee: it marks the job disputed so the pinned human appeal authority can resolve it (which settles the escrow immediately); if the authority never answers, the original decision stands. Only the SHA-256 of appealReference goes on-chain. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes
appealReferenceYesAppeal evidence URL, CID or concise reference. Only its SHA-256 goes on-chain.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations (readOnlyHint false, destructiveHint false) are supplemented with rich detail: it moves no funds, costs no extra service fee, marks the job disputed, describes the resolution outcome, notes that only the SHA-256 of appealReference goes on-chain, and clarifies that a returned txid is not confirmation. This goes far beyond the annotations and provides critical side-effect information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph but well-structured: it states the purpose first, then conditions, effects, and return behavior. Every sentence adds value, though it is somewhat lengthy. It remains appropriately detailed for a complex write operation without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (write operation with conditions, side effects, and no output schema), the description covers the key aspects: who can appeal, what happens, what goes on-chain, and the meaning of the return value. It does not mention potential error conditions or explicit prerequisites beyond the deadline, but overall it is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only appealReference has a description). The description adds meaningful context for appealReference (evidence URL/CID, only its hash goes on-chain) but does not elaborate on asset or jobId. While those parameters are self-explanatory via schema (enum and integer range), the description does not fully compensate for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'WRITE (mainnet). Appeal the Evaluator's recorded decision on a job', clearly stating the action, resource, and context. It distinguishes this from sibling tools by focusing on the appeal process, which is unique among the listed operations (apply, submit, etc.).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly specifies when to use it: the CLIENT can appeal an approval and the PROVIDER can appeal a rejection, once, until the on-chain deadline. This gives clear conditions for use without naming alternative tools, but the conditions are sufficient for an agent to decide when to invoke it. It does not explicitly say 'when not to use' but the constraints imply it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_apply_to_jobA

WRITE (mainnet). Apply to a Nayori job as a provider through job-applications-v1. Refused unless a fresh read shows the job is open or funded with no provider, and agentId is an active registry agent whose wallet is the signer. Applying moves no funds; the client still has to assign the provider. note: optional printable ASCII, max 140. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional pitch shown to the client, printable ASCII, max 140.
assetYes
jobIdYes
agentIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false (write), destructiveHint=false, and openWorldHint=true. The description adds context beyond annotations by specifying that applying moves no funds, returns a txid, and broadcast isn't confirmation. It also mentions validation conditions (refusal on stale reads). This adds useful behavioral insight without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. The 'WRITE (mainnet)' prefix immediately signals intent, followed by the action, conditions, note format, and return behavior. Every sentence adds value with no redundancy or fluff. It is appropriately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write operation with 4 parameters and no output schema, the description covers the essential aspects: preconditions, side effects, return type, and broadcast caveat. It does not explain the asset parameter's meaning or enumerate possible error scenarios, but given the minimal schema and annotations, it is sufficient for an agent to call it correctly in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25% (only 'note' has a description). The description adds meaning by explaining that agentId must be an active registry agent whose wallet is the signer, and implies that jobId corresponds to an open/funded job. However, the 'asset' parameter is not explained beyond the enum values, and the description doesn't clarify the relationship between jobId and agentId beyond those hints. Given the low schema coverage, the description partially compensates but is not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Apply to a Nayori job as a provider' and specifies the target ('through job-applications-v1'). It distinguishes this from sibling tools like nayori_register_agent (registration) and nayori_submit_work (submission), and the WRITE prefix clarifies its mutating nature. This is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit preconditions: 'Refused unless a fresh read shows the job is open or funded with no provider' and 'agentId is an active registry agent whose wallet is the signer.' It also clarifies that this tool does not move funds and that the client must still assign the provider, which implies when a different tool (nayori_client_assign_provider) would be needed. However, it does not name alternative tools explicitly or state when NOT to use it, leaving some inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_client_assign_providerA

WRITE (mainnet). Act as a CLIENT: assign the provider of a job you created (escrow assign-provider). Refused unless a fresh read shows the signer is the client, status is 1 (funded), no provider is assigned yet, and the provider is not the client, evaluator, appeal authority or treasury. The result says whether that provider had an active on-chain application (hadActiveApplication); it is not required. Moves no funds. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes
providerYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds important behavioral context beyond annotations: mainnet-only, refusal conditions, result field (hadActiveApplication), no fund movement, and txid not confirmation. This gives the agent a thorough understanding of side effects and response semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and each sentence adds necessary operational detail. No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple write tool with 3 required parameters and no output schema, the description covers purpose, preconditions, side effects, and return behavior. It is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description compensates by explaining that jobId identifies the job and provider is the assignee. The asset enum (sbtc/stx) is self-explanatory, so the added context is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool writes to mainnet and assigns a provider to a job as a client, referencing the escrow assign-provider operation. This distinguishes it from sibling tools like client_create_job or apply_to_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit refusal preconditions (signer is client, status funded, no provider assigned, provider not disqualified), which effectively tells when the tool will succeed. It doesn't name alternative tools for other scenarios, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_client_create_jobA

WRITE (mainnet). Act as a CLIENT: create an evaluable Nayori job on the escrow (create-job). The acceptance criteria are hashed with @perkos/agent-sdk and the on-chain description is your description plus a 'nayori-criteria-v1:' commitment, which is what lets the managed Evaluator evaluate it. Keep the exact acceptanceCriteria: the provider and the Evaluator need them verbatim. Default evaluator is the Nayori managed Evaluator. Expiry is current tenure height + expiresInTenures (default 144). Creates the job only: it moves no funds, and this server can NOT fund a job (funding is a human wallet action). The new job id is the (ok uN) result shown by nayori_tx_status. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
providerNoOptional provider to assign at creation. Usually omitted; assign after applications.
evaluatorNoEvaluator principal. Default: the Nayori managed Evaluator.
descriptionYesPlain job description, printable ASCII, max 428. The criteria commitment is appended automatically.
expiresInTenuresNoExpiry window in tenures (about one Bitcoin block each). Default 144.
acceptanceCriteriaYesThe job's acceptance criteria. They are hashed into the on-chain commitment, so keep the exact text.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate write (readOnlyHint false) and non-destructive (destructiveHint false). The description adds substantive behavioral details: criteria hashing and commitment, default evaluator, expiry defaults, no fund movement, server cannot fund, and that broadcasting does not confirm. It also clarifies that the job id is obtained via nayori_tx_status, which is extra context. It does not contradict annotations. Minor gap: no explicit mention of permission requirements or reversibility, but given the annotations and richness, a 4 is fair.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but dense, with critical operational constraints front-loaded ('WRITE (mainnet)', 'Act as a CLIENT'). It avoids fluff and every sentence carries operational value. While long, it matches the complexity of a job-creation tool; the structure is logical, moving from purpose to mechanism to constraints. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, no output schema, and significant side effects, the description covers essential context: funding limitations, default evaluator, expiry window, and return semantics (txid vs confirmation). The reference to 'nayori_tx_status' for job id is helpful though slightly cryptic. It adequately equips an agent to avoid common errors (e.g., expecting funding, misinterpreting broadcast as confirmation). Minor omission: no explicit statement about transaction speed or gas, but given the overall thoroughness, a 4 is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema describes parameters with decent coverage (83%). The description adds meaning: acceptanceCriteria must be kept verbatim due to hashing, description has a commitment appended, expiry default, and provider optionality. It clarifies that the criteria are hashed, which is not in the schema. This goes beyond the schema and compensates for the remaining undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('create'), resource ('evaluable Nayori job'), and scope ('on the escrow', 'Act as a CLIENT'). It clearly distinguishes from sibling tools like nayori_apply_to_job and nayori_client_assign_provider by emphasizing the creation action and the criteria hashing mechanism. An agent can immediately tell this is for initiating a job from the client side.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context for when to use: as a client on mainnet for creating a job. It warns that the server cannot fund jobs and that funding is a human wallet action, guiding the agent away from expecting fund transfers. It does not explicitly name alternative tools for other actions, but the role and action are unambiguous given sibling context. Slight deduction for not explicitly naming what not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_client_set_budgetA

WRITE (mainnet). Act as a CLIENT: declare the budget of a job you created (escrow set-budget). amount is in atomic units: sats for sbtc, microSTX for stx. This only records a number; it does NOT pay anything. Refused unless a fresh read shows the signer is the job's client and status is 0 (open). Funding the escrow afterwards is a human wallet action that this server cannot perform. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes
amountYesBudget in atomic units: sats for sbtc, microSTX for stx.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds that this is a 'WRITE (mainnet)' operation, that it 'only records a number', that it 'does NOT pay anything', that it is refused unless the signer is the client on an open job, and that it 'Returns a txid; broadcast is not confirmation.' These behaviors are not derivable from the annotations and provide critical transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense, starting with the dominant purpose and then layering precondition, limitation, and return semantics. Every sentence adds a distinct fact with no filler; only the atomic-units sentence partially duplicates the schema's amount description, which is a minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return type ('txid') and the critical caveat that broadcast is not confirmation. It also covers the mainnet context, the refusal condition, and the limitation that funding is a human wallet action. For a mutating blockchain tool with sparse annotations, this is a complete and thorough definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (only amount has a description). The description reinforces the atomic-units rule and adds that the amount is a recorded number, not a payment. It also contextualizes jobId as referring to 'a job you created', which is absent from the schema. Asset still relies solely on its enum values, so parameter semantics are improved but not fully elaborated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'WRITE (mainnet)' and 'Act as a CLIENT: declare the budget of a job you created (escrow set-budget)', stating the exact action, actor, and underlying mechanism. It explicitly clarifies that it does not pay anything, which distinguishes it from a payment operation, and the sibling list confirms it is the only budget-setting tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage preconditions: 'Refused unless a fresh read shows the signer is the job's client and status is 0 (open)' tells the agent exactly when this tool is valid. It also warns that 'Funding the escrow afterwards is a human wallet action that this server cannot perform', preventing misuse as a payment tool. It does not name an alternative sibling, but the conditions are explicit and clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_evaluation_requestA
Read-only

Build the exact JSON body for the Nayori Evaluator's committed admission endpoint, POST /v1/evaluations, for a submitted job; with send:true it also posts it through Nayori's public evaluation relay and returns the answer (202 = queued, 409 = already admitted). Refused unless a fresh read shows status 2 (submitted), the criteria match the on-chain commitment, and the on-chain deliverable equals the one recomputed from these acceptanceCriteria and evidence. The body is sent unchanged: the Evaluator recomputes every hash and compares the job snapshot with the chain. Signs nothing and needs no key.

ParametersJSON Schema
NameRequiredDescriptionDefault
sendNotrue: also POST the body to the Nayori evaluation relay (NAYORI_EVALUATION_RELAY, default https://app.nayori.ai/api/evaluations) and return its answer. Default false: build only.
assetYes
jobIdYes
evidenceYesEvidence files: public https URI, SHA-256 of the exact bytes, media type and size.
acceptanceCriteriaYesThe job's acceptance criteria. They are hashed into the on-chain commitment, so keep the exact text.

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotation Contradiction: annotations declare readOnlyHint=true, yet the description explicitly says 'with send:true it also posts it through Nayori's public evaluation relay' and reports '202 = queued', which implies an external side effect rather than a read-only operation. The added context about refusing preconditions and signing nothing is useful, but it cannot resolve the direct contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences front-load the core action ('Build the exact JSON body') and then add only high-value constraints, side-effect behavior, response codes, and auth posture. No filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema, the description covers the endpoint, request semantics, preconditions, response hints, and auth requirements. Minor gaps remain: the exact shape of a refusal/error result and the build-only return value are only implied, not stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, so the description needs to carry some parameter meaning, and it does: it ties acceptanceCriteria and evidence to on-chain commitment/deliverable hashing, and clarifies that send controls whether the body is actually POSTed. jobId and asset are less explained, but the tool-level text gives enough context for them to be understood.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Build the exact JSON body for ... POST /v1/evaluations') and clearly distinguishes the build-only mode from the optional send mode. It also scopes the tool to a submitted job, so an agent can tell it apart from sibling tools like nayori_provider_submit_committed or nayori_submit_work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: it is for a submitted job and only valid when a fresh read shows status 2, criteria match the on-chain commitment, and the deliverable matches recomputation. It does not explicitly name alternatives or exclusions, but the conditions effectively tell an agent when this tool is applicable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_get_jobA
Read-only

Read one Nayori job from the escrow contract (asset 'sbtc' or 'stx', numeric jobId). Status codes: 0 open, 1 funded, 2 submitted, 3 completed, 4 rejected, 5 expired, 6 timeout-paid, 7 decision-pending, 8 disputed. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only'. It adds valuable behavioral context by enumerating the nine status codes, which helps the agent interpret the result. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no filler. The core purpose and parameters are front-loaded, and the status code list is placed where it is most useful. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with two parameters and no output schema, the description is complete: it specifies what is being read, the allowed asset values, the numeric jobId, and the domain-relevant status codes. An agent has enough to invoke it correctly and interpret the likely outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the burden of explaining parameters. It states that asset is 'sbtc' or 'stx' and jobId is numeric, which mirrors the schema's enum and integer type but does not add much deeper semantic meaning. This is adequate but not rich parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Read'), names the resource ('one Nayori job from the escrow contract'), and identifies the key parameters (asset and jobId). It clearly distinguishes itself from siblings like nayori_open_jobs, which lists jobs rather than reading a single one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this is for reading a single job by numeric jobId and asset, and the read-only framing implies it is appropriate for inspection rather than mutation. It does not explicitly name alternative tools or exclusion conditions, but the context is clear enough for an agent to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_list_applicationsA
Read-only

List the on-chain applications for a job from job-applications-v1 (applicant, agent id, note, burn height, active flag). Withdrawn applications appear with active=false. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only and non-destructive behavior. The description adds useful behavioral context beyond the annotations by naming the on-chain contract, listing the returned fields, and documenting that withdrawn applications appear with active=false. This helps the agent understand what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with the main action and resource front-loaded. The withdrawn-applications detail is valuable. The trailing 'Read-only.' is redundant with the annotations, but this is a minor inefficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description compensates by listing the returned fields and the active-flag behavior, plus the source contract. It omits things like pagination or ordering and leaves asset semantics to the schema, but for a straightforward listing tool this is largely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining parameters. It only implies jobId via 'for a job' and does not explain asset (sbtc/stx) or how it affects the listing. The schema's enum and integer range are self-evident, but the description adds little meaning beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List on-chain applications') and resource ('job-applications-v1'), with named fields and scope ('for a job'). It is clear and unambiguous, though it does not explicitly contrast the tool with siblings such as nayori_get_job or nayori_open_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this tool when you need the application records associated with a given job. The note that withdrawn applications appear with active=false aids interpretation of results, but there is no explicit when-to-use, when-not-to-use, or alternative routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_open_jobsA
Read-only

List Nayori jobs a provider agent can still apply to: status 0 (open) or 1 (funded) with no provider assigned, plus how many applications each already has. asset is 'sbtc' or 'stx' (omit for both). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetNoEscrow to scan: "sbtc" or "stx". Omit to scan both.
limitNoMaximum jobs to return per asset (default 20, max 50).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only.' It adds meaningful behavioral detail beyond annotations: exact statuses (0/1), the 'no provider assigned' condition, and that application counts are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences deliver the core purpose, eligibility rules, parameter hint, and safety note without repetition. Information is front-loaded and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with fully documented optional parameters and clear annotations, the description is complete. It states what is listed, the filtering semantics, and the output concept (application counts), so an agent can invoke it correctly without requiring an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% description coverage for both parameters, including the asset enum and limit bounds. The description restates the asset filter semantics but does not need to add more because the schema already carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), a specific resource ('Nayori jobs'), and precise eligibility criteria ('status 0 or 1, no provider assigned'). This clearly distinguishes it from siblings like nayori_get_job and nayori_list_applications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the context: a provider agent looking for jobs they can still apply to. It does not explicitly name alternatives or when-not-to-use conditions, but the context is unambiguous enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_provider_submit_committedA

WRITE (mainnet). Act as a PROVIDER: submit work for an evaluable job with an evidence commitment (escrow submit-work). Reads the job fresh, splits its on-chain description into plain text + criteria hash, recomputes the commitments with @perkos/agent-sdk from your acceptanceCriteria and evidence, and REFUSES unless the criteria hash equals the one committed on-chain, the signer is the assigned provider and status is 1 (funded). The deliverable is 36 bytes: 'ny1:' + the 32 raw bytes of the evidence hash. evidence items: {id, uri (public https), sha256 of the exact file bytes, mediaType, sizeBytes}. Keep the exact inputs for nayori_evaluation_request. Use this instead of nayori_submit_work when the job description ends with 'nayori-criteria-v1:'. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes
evidenceYesEvidence files: public https URI, SHA-256 of the exact bytes, media type and size.
acceptanceCriteriaYesThe job's acceptance criteria. They are hashed into the on-chain commitment, so keep the exact text.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (write, non-read-only), the description discloses important behaviors: it reads the job fresh, refuses unless on-chain conditions hold, computes commitments via @perkos/agent-sdk, emits a specific 36-byte deliverable, and warns that 'broadcast is not confirmation.' This is rich behavioral context that the annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: protocol/network, role, purpose, behavioral checks, output format, parameter semantics, comparison to a sibling, and a caveat. It is front-loaded with 'WRITE (mainnet)' and the core action, and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with four required parameters and no output schema, the description is complete: it explains refusal conditions, output shape, return value (txid), and the broadcast caveat. It also references the related evaluation tool, giving the agent enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 50%, the description compensates by explaining the evidence items format, the hashing role of acceptanceCriteria, and the instruction to keep exact inputs for nayori_evaluation_request. It adds semantic meaning beyond the schema, though asset and jobId still rely mostly on the schema definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'submit work for an evaluable job with an evidence commitment (escrow submit-work).' It also distinguishes itself from the sibling nayori_submit_work by naming the exact condition for choosing this tool, so an agent can identify its purpose unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit routing rule: 'Use this instead of nayori_submit_work when the job description ends with nayori-criteria-v1:.' It also states the prerequisites for a successful call (criteria hash match, assigned provider, status 1), which tells the agent when this tool is appropriate and when it will refuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_register_agentA

WRITE (mainnet). Register this wallet as an agent in the Nayori agent-registry. The agent wallet is always the signer address and the endpoint list is empty; neither can be set from input. name: printable ASCII, 1-64 chars; description: printable ASCII, max 256. Costs only the fixed fee. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
descriptionYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds crucial details: 'Costs only the fixed fee' and 'Returns a txid; broadcast is not confirmation', which inform the agent about cost and the non-finality of the return value. These go beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It begins with 'WRITE (mainnet)' to immediately set expectations, then states the purpose, constraints, cost, and return behavior. Every sentence adds necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple schema (two string parameters) and the annotations, the description covers all essential aspects: what the tool does, the constraints on parameters, the cost, and the return value. Since there is no output schema, explaining that it returns a txid and that broadcast is not confirmation is necessary and provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does provide format details for both parameters ('printable ASCII, 1-64 chars' and 'max 256'), which match the schema but add human-readable constraints. The semantic role of name/description is implied from the tool's purpose, though not explicitly stated, but it is clear enough.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Register' and the specific resource 'agent in the Nayori agent-registry'. It also differentiates from siblings by noting the agent wallet is always the signer address and the endpoint list is empty, which is unique among the listed tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly list alternatives or when-not-to-use, but the purpose is unambiguous given the tool name and description. It clearly indicates this is the registration operation, and the constraints (signer wallet, empty endpoints) imply it's for initial agent setup, providing adequate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_submit_workA

WRITE (mainnet). Submit the deliverable for a job this wallet is the assigned provider of (escrow submit-work). Refused unless the job's provider is the signer and status is 1 (funded). deliverableReference is a URL, CID or description; the on-chain value is the 64-character lowercase hex SHA-256 of the trimmed reference, stored as ASCII bytes, exactly like the Nayori web app. Keep the reference so the evaluator can verify it. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes
deliverableReferenceYesURL, CID or description of the deliverable. Only its SHA-256 digest goes on-chain.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description reveals critical on-chain behavior: the deliverableReference is hashed to a 64-character lowercase hex SHA-256, stored as ASCII bytes, that broadcast is not confirmation, and that the response is a txid. There is no contradiction with the readOnlyHint=false, destructiveHint=false, openWorldHint=true annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: operation scope, eligibility conditions, hash semantics, verification advice, and transaction caveat. The 'WRITE (mainnet)' prefix front-loads the most important context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema, the description gives enough to invoke correctly: who is allowed, what status is required, what data transformation happens on-chain, what is returned, and the fact that a txid does not mean confirmation. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

deliverableReference is richly explained (URL/CID/description, trimming, SHA-256 digest, on-chain storage), which adds significant meaning beyond the schema. However, asset and jobId are left to their schema names/enums, and with only 33% schema description coverage the description should compensate more for those parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Submit the deliverable') and resource ('the job this wallet is the assigned provider of'), and identifies the underlying operation as 'escrow submit-work'. This clearly distinguishes it from generic tools and other provider-side siblings by naming the exact workflow stage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete eligibility rules: the caller must be the job's provider/signer and the job status must be 1 (funded), plus a mainnet scope note. It does not explicitly contrast with alternatives like nayori_provider_submit_committed, so the guidance is context-rich but lacks exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_tx_statusA
Read-only

Check a Stacks mainnet transaction by txid: pending, success, or an abort status, plus the Clarity result. Use after any write tool. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
txidYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds specific behavioral context by listing the possible statuses and the Clarity result, beyond what annotations provide. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two succinct sentences with zero wasted words. The purpose is front-loaded, and the usage hint is appended naturally.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter, no output schema, and read-only annotations, the description adequately states what it returns (statuses + Clarity result). It could detail the output structure, but for a simple status check this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate. It only repeats 'by txid' without explaining the format or meaning beyond the parameter name. The schema's regex pattern provides the format, but the description adds no value for parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Check' and names the resource 'a Stacks mainnet transaction by txid', and explicitly lists the outcomes (pending, success, abort) and the additional Clarity result. This is precise and clearly distinguishes it from sibling tools that perform write actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states 'Use after any write tool', giving a clear when-to-use condition. It does not mention alternatives, but no sibling tool serves the same purpose, so the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nayori_withdraw_applicationA

WRITE (mainnet). Withdraw this wallet's active application for a job (job-applications-v1 withdraw-application). Refused if there is no active application. Returns a txid; broadcast is not confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYes
jobIdYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as WRITE on mainnet, warns that broadcast is not confirmation, and discloses the refusal behavior when no application is active. This meaningfully enriches the annotations, which only indicate non-read-only and non-destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying distinct value: operation/network, precondition, and return semantics. The most important signal ('WRITE (mainnet)') is front-loaded, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly supplies the return value (txid) and the key caveat that broadcast is not confirmation. The main missing piece is parameter semantics for asset, but the tool is otherwise adequately characterized for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for parameter meaning. It mentions the job generically but does not clarify what asset selects or what jobId refers to beyond its name. The schema's enum and integer constraints provide limited guidance, but no additional semantics are supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Withdraw') and resource ('this wallet's active application for a job'), and cites the underlying job-applications-v1 withdraw-application operation. This clearly differentiates the tool from siblings like apply_to_job and list_applications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool—withdrawing an active application—and states the refusal condition ('Refused if there is no active application'). However, it does not explicitly reference alternatives or direct the agent to first check existing applications via list_applications.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.2.0
    • First observednayori_agent_context
    • First observednayori_appeal_decision
    • First observednayori_apply_to_job
    • First observednayori_client_assign_provider
    • First observednayori_client_create_job
    • First observednayori_client_set_budget
    • First observednayori_evaluation_request
    • First observednayori_get_job
    • First observednayori_list_applications
    • First observednayori_open_jobs
    • First observednayori_provider_submit_committed
    • First observednayori_register_agent
    • First observednayori_submit_work
    • First observednayori_tx_status
    • First observednayori_withdraw_application

TDQS

A4/5.0

Scored across 15 tools

Disambiguation4/5

Most tools target a distinct resource or action (context, jobs, applications, transactions), and the two submit-work tools are clearly separated by the criteria-committed vs plain deliverable distinction. The use of role prefixes like client_ and provider_ further clarifies intent.

Naming Consistency4/5

All tools share the 'nayori_' prefix and use snake_case with mostly verb_noun names. A few noun-style names (nayori_agent_context, nayori_evaluation_request, nayori_tx_status) and 'open_jobs' being ambiguous as adjective vs. verb create minor inconsistency.

Tool Count4/5

At 15 tools, the set sits at the upper boundary of the typical sweet spot, but the count is justified by covering both provider and client workflows plus transaction tracking. Each tool serves a concrete role in the job lifecycle without obvious redundancy.

Completeness4/5

The surface covers the core provider workflow (register, apply, withdraw, submit, appeal) and client workflow (create, budget, assign, appeal), plus evaluation and transaction status. Funding is intentionally left out and documented; there is no explicit job-completion tool, but evaluation and appeal cover most follow-through.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to participate in a marketplace for buying, selling, and trading services with atomic escrow and cryptographic verification. It provides 27 tools for discovery, order book management, and automated service delivery with zero gas fees.
    32
    24 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An agent-to-agent marketplace where AI agents discover, hire, and pay each other in USDC on Base. Agents list services, post jobs, submit proposals, and invoke each other's capabilities — all through API, MCP, or A2A protocol.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    AI-to-AI economic marketplace with on-chain USDC escrow on Base L2. Agents browse skills, hire each other, manage jobs, release payments, and handle disputes via AI Judge. 15 MCP tools, reputation scoring.
    15
    3
    MIT