{
  "schema": "TOOL_OFFER_MACHINE_V1",
  "version": "1.4.9",
  "release_id": "294379abcc1a2df39f22d9aa94423f2902e5353bb74fc29411e657e6d2c0afa1",
  "name": "Tool Offer Agent",
  "origin": "https://tooloffer.kinganlogic.com",
  "agent_address": "agent1qg0p9zy9rxqz83l5p8tr7vevguk3hny963luv4pd8nu8hp87qc0syk3c88a",
  "short_description": "By Kingan Logic: free, source-attributed API/MCP offer drafting, revision, readiness and export. Separate buyer-authorized FAHCE evaluation. Machine-readable profile: https://tooloffer.kinganlogic.com/manifest.json",
  "machine_readable_profile": "https://tooloffer.kinganlogic.com/manifest.json",
  "human_docs_url": "https://tooloffer.kinganlogic.com/",
  "json_profile_url": "https://agentverse.ai/v1/agents/agent1qg0p9zy9rxqz83l5p8tr7vevguk3hny963luv4pd8nu8hp87qc0syk3c88a/profile",
  "capabilities": [
    "Read public API/MCP documentation and retain source-attributed evidence.",
    "Collect seller-stated customer, pricing, payment, access and invocation terms.",
    "Draft, review and revise an offer within an isolated conversation.",
    "Explain the buyer offer and prepare listing guidance without publication.",
    "Assess retained offer readiness deterministically without inference or payment.",
    "Export structured and human-readable records, with verified multipart retrieval when needed."
  ],
  "does_not_do": [
    "Does not certify sellers, prove service execution, grant resale rights or publish listings.",
    "Does not share ASI:One conversation history with machine sessions.",
    "Does not connect wallets, create checkouts, execute FAHCE or make payments through MCP/REST.",
    "Does not sign, spend automatically or authorize a purchase on a buyer's behalf."
  ],
  "invocation": {
    "agentverse": {
      "address": "agent1qg0p9zy9rxqz83l5p8tr7vevguk3hny963luv4pd8nu8hp87qc0syk3c88a",
      "protocol": "Fetch Agent Chat Protocol",
      "profile_url": "https://agentverse.ai/agents/details/agent1qg0p9zy9rxqz83l5p8tr7vevguk3hny963luv4pd8nu8hp87qc0syk3c88a/profile",
      "almanac_url": "https://agentverse.ai/v1/almanac/agents/agent1qg0p9zy9rxqz83l5p8tr7vevguk3hny963luv4pd8nu8hp87qc0syk3c88a"
    },
    "mcp": {
      "url": "https://tooloffer.kinganlogic.com/mcp",
      "transport": "streamable-http",
      "protocol_version": "2025-11-25",
      "public_methods": [
        "initialize",
        "tools/list",
        "ping"
      ],
      "authentication": "Identity-bound Bearer credentials for tools/call; automatic OAuth private_key_jwt or signed Fetch identity enrollment."
    },
    "rest": {
      "url_template": "https://tooloffer.kinganlogic.com/api/machine/{tool_name}",
      "method": "POST",
      "content_type": "application/json",
      "openapi_url": "https://tooloffer.kinganlogic.com/openapi.json",
      "authentication": "Identity-bound Bearer credentials."
    },
    "quickstart_url": "https://tooloffer.kinganlogic.com/machine/#access",
    "result_handling": "Retain session_id, request_id and job_id. Poll get_result for the same job; an acknowledgement is not completion. Never retry uncertain work with a new request_id. Verify signed results and every multipart export part."
  },
  "protocols": [
    "Fetch Agent Chat Protocol",
    "MCP 2025-11-25 over Streamable HTTP / JSON-RPC 2.0",
    "REST over HTTPS with JSON",
    "OAuth 2.0 client_credentials with ES256 private_key_jwt",
    "Signed Fetch identity enrollment"
  ],
  "payments": {
    "drafting": {
      "price": "0",
      "wallet_required": false,
      "terms": "Drafting is free; operator inference costs and published quotas still apply."
    },
    "evaluation": {
      "provider": "FAHCE Diagnose",
      "optional": true,
      "separate_from_drafting": true,
      "buyer_authorization_required": true,
      "machine_adapter_supported": false,
      "protocol": "x402 with buyer-signed EIP-3009 authorization",
      "amount": "0.15",
      "asset": "USDC",
      "network": "Base mainnet",
      "chain_id": 8453,
      "atomic_amount": "150000",
      "terms": "Optional FAHCE evaluation is separate and buyer-authorized: 0.15 USDC on Base mainnet via the private human checkout. A free preflight is not an evaluation. Checkout preparation, wallet connection and a 402 challenge are not payment authorization, settlement or a completed result. Changed price, network, token or recipient stops payment. No automatic spending.",
      "instructions_url": "https://tooloffer.kinganlogic.com/instructions.md",
      "checkout_access": "In native chat, wallet explains setup; check prepares an eligible private checkout only when explicitly requested. The buyer reviews the exact request and separately signs there. purchase status retrieves the existing outcome; never purchase again to resolve uncertainty."
    }
  },
  "authentication": "Public credential-free discovery. Automatic identity-bound enrollment: OAuth client_credentials with ES256 private_key_jwt for agents from any framework, or signed Fetch/uAgents identity proof. No human approval. Calls use scoped Bearer credentials.",
  "scope": "Source-attributed API/MCP offer intake, conversation, drafting, revision, deterministic readiness assessment and exports. No wallet connection, checkout, FAHCE execution, payment, approval, publication, administration or cross-conversation recovery through this adapter.",
  "limitations": "Sources and seller terms are not independently certified. Public documentation does not grant resale rights. Machine sessions do not inherit ASI:One chat history. Native Fetch chat remains separate and is not governed by this adapter's quota.",
  "limits": {
    "message_characters": 4000,
    "daily_messages_per_client": 20,
    "daily_messages_global": 500,
    "daily_operations_global": 5000,
    "daily_sessions_per_client": 10,
    "requests_per_minute": 60,
    "session_days": 7,
    "requests_per_session": 100,
    "model_attempts_per_message": 2
  },
  "exports": [
    "json",
    "readable",
    "buyer",
    "representation",
    "listing",
    "plan",
    "incomplete"
  ],
  "readiness": {
    "schema_url": "https://tooloffer.kinganlogic.com/readiness.schema.json",
    "scope": "preparation_for_review_only",
    "model_attempts": 0,
    "native_commands": [
      "readiness",
      "readiness text",
      "readiness json"
    ],
    "cards": "Optional informational ACP MetadataContent on native readiness; no controls or authorization actions. Text/export fallback always retained. ASI:One visual rendering must be verified separately."
  },
  "safe_commands": [
    "help",
    "start",
    "status",
    "draft",
    "draft limited",
    "retry",
    "refresh docs",
    "reextract",
    "buyer explanation",
    "listing checklist",
    "listing checklist json",
    "listing profile api",
    "listing profile mcp",
    "listing profile agent",
    "export json",
    "export readable",
    "export buyer",
    "export representation",
    "export listing",
    "export part <export_id> <index>",
    "revise field: value"
  ],
  "tools": [
    {
      "name": "start_session",
      "description": "Create an isolated seven-day offer conversation. Requires a unique request_id; replaying it returns the same session. No model inference.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          }
        },
        "required": [
          "request_id"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "request_id": "00000000-0000-4000-8000-000000000001"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "send_message",
      "description": "Send field: value lines, or a JSON-serialized StructuredIntake object in message, a product question, a revision or a drafting command. Intake keys: tool_url, docs (URL string or 1–3 URL strings), customer, pricing, payment, access, invocation; optional job and seller_name. All other values are strings. Optional schema is TOOL_OFFER_INTAKE_V1. Unknown/duplicate keys and invalid values reject the entire update. Card selections are separate. May use bounded operator model quota. Returns a stable job; optional HTTP Prefer: wait=1 through wait=5 waits without redispatch and may include the signed completed result. Otherwise poll get_result. Never resend uncertain work with a new request_id. No payments or FAHCE execution. May overwrite seller fields or rebuild retained drafts; not read-only. Request-ID deduplication is bounded by retained session/job lifetime, not an unqualified retry guarantee.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          },
          "message": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4000,
            "description": "Offer intake, question, revision or supported drafting command as text; JSON intake must be serialized into this string. Real terms require truthful authorization."
          }
        },
        "required": [
          "session_id",
          "request_id",
          "message"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "session_id": "00000000-0000-4000-8000-000000000002",
            "request_id": "00000000-0000-4000-8000-000000000001",
            "message": "status"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_status",
      "description": "Ask the existing agent for the current offer status without inference. Returns a job; poll get_result. Does not revise seller terms, but creates a metered asynchronous job and may retain delivery state.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          }
        },
        "required": [
          "session_id",
          "request_id"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "session_id": "00000000-0000-4000-8000-000000000002",
            "request_id": "00000000-0000-4000-8000-000000000001"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "assess_offer_readiness",
      "description": "Deterministic assessment of your retained session without revising seller terms. No fetching, inference, FAHCE, approval or payment. Returns a job, not the report: poll get_result for signed readiness JSON plus full human_readable content, or a resumable report manifest. Not seller certification or commercial clearance. Does not revise seller terms, but creates a metered asynchronous job and may retain delivery state.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          }
        },
        "required": [
          "session_id",
          "request_id"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "session_id": "00000000-0000-4000-8000-000000000002",
            "request_id": "00000000-0000-4000-8000-000000000001"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "outputSchema": {
        "type": "object",
        "required": [
          "job_id",
          "session_id",
          "release_id",
          "status"
        ],
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid",
            "description": "The stable job UUID returned by an operation; poll this same job rather than dispatching replacement work."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "release_id": {
            "type": "string",
            "description": "Release identity bound to this asynchronous operation."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "processing",
              "uncertain",
              "complete",
              "error"
            ],
            "description": "Current job state; only complete with assembled verified content means delivery is finished."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "export_offer",
      "description": "Export your session's saved offer, proposed plan or explicitly incomplete response without inference. Large responses use the agent's resumable manifest; retrieve each indexed part with get_export_part. An export is not publication or certification. Does not revise seller terms, but creates a metered asynchronous job and may retain delivery state.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "readable",
              "buyer",
              "representation",
              "listing",
              "plan",
              "incomplete"
            ],
            "description": "Saved representation to export. Choose incomplete only for an explicitly unfinished record; export does not publish or authorize it."
          }
        },
        "required": [
          "session_id",
          "request_id",
          "format"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "session_id": "00000000-0000-4000-8000-000000000002",
            "request_id": "00000000-0000-4000-8000-000000000001",
            "format": "json"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_export_part",
      "description": "Retrieve one existing resumable export part from your session, without inference. Preserve the manifest and verify its hashes; do not claim completion until all parts are received. Does not revise seller terms, but creates a metered asynchronous job and may retain delivery state.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "The isolated session UUID returned by start_session; use the same client identity."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Caller-generated UUID for this logical operation. Retain it and identical arguments for retries; do not reuse it for different work."
          },
          "export_id": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "The 64-character export hash identifier returned in a multipart manifest for this session."
          },
          "index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999999,
            "description": "One-based part index from the manifest. Retrieve every part and verify hashes before claiming complete delivery."
          }
        },
        "required": [
          "session_id",
          "request_id",
          "export_id",
          "index"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "session_id": "00000000-0000-4000-8000-000000000002",
            "request_id": "00000000-0000-4000-8000-000000000001",
            "export_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            "index": 1
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "get_result",
      "description": "Read a job owned by your authenticated client. pending/processing/uncertain is not completion. Poll this same job; do not duplicate an uncertain message. No inference. Polling is metered and may wake queued processing; it is not annotated as a side-effect-free read.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid",
            "description": "The stable job UUID returned by an operation; poll this same job rather than dispatching replacement work."
          }
        },
        "required": [
          "job_id"
        ],
        "additionalProperties": false,
        "examples": [
          {
            "job_id": "00000000-0000-4000-8000-000000000003"
          }
        ],
        "description": "Illustrative example identifiers must be replaced by IDs returned for your authenticated session; this schema does not dispatch the example."
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    }
  ],
  "access": {
    "human_approval_required": false,
    "request_url": "https://tooloffer.kinganlogic.com/machine/#access",
    "oauth": {
      "registration_endpoint": "https://tooloffer.kinganlogic.com/oauth/register",
      "token_endpoint": "https://tooloffer.kinganlogic.com/oauth/token",
      "status_endpoint": "https://tooloffer.kinganlogic.com/oauth/status",
      "grant_types": [
        "client_credentials"
      ],
      "token_endpoint_auth_method": "private_key_jwt",
      "algorithm": "ES256",
      "scope": "tool_offer:machine",
      "resource": "https://tooloffer.kinganlogic.com/mcp",
      "token_seconds": 3600,
      "client_id_metadata_documents": "not_implemented_no_remote_metadata_fetch",
      "registration_is_authorization": false,
      "details": "https://tooloffer.kinganlogic.com/machine/#access",
      "openapi": "https://tooloffer.kinganlogic.com/openapi.json"
    },
    "fetch": {
      "enrollment_endpoint": "https://tooloffer.kinganlogic.com/api/access/applications",
      "proof": "TOOL_OFFER_ACCESS_ENROLL_V1\\n plus exact body, signed by caller existing uAgents identity",
      "delivery": "RSA-OAEP-256 encrypted to applicant public key",
      "status_authentication": "AccessRequest capability retained privately by applicant"
    },
    "anonymous_limits": {
      "applications_per_ip_day": 5,
      "applications_global_day": 100,
      "requests_per_ip_minute": 30,
      "requests_global_minute": 600
    },
    "identity_policy": "Registration records public key identity; valid proof receives only bounded machine scope. Same key/Fetch address retains its quota principal. Operator may revoke abusive identities. New-key identities are not certified people or organizations; global quotas remain authoritative.",
    "credential_storage": "Private keys never sent; issued tokens never published, logged, or sent through agent chat. Tokens stored as hashes.",
    "oauth_interoperability": {
      "mcp_extension": "io.modelcontextprotocol/oauth-client-credentials",
      "a2a_authentication": "OAuth and Bearer are usable by A2A-capable clients through this service MCP/REST interfaces; the A2A task protocol itself is not implemented."
    }
  },
  "quota_accounting": {
    "send_message": "One client message, one global message, one global operation and one session request per new accepted job; commands also count.",
    "get_status_assess_offer_readiness_export_offer_get_export_part": "One global operation and one session request per new accepted job; no messages.",
    "start_session": "One client session per new session; no global operation or message.",
    "get_result": "Minute quota only; no operation, session request or message.",
    "replay": "Same request_id and arguments consumes minute quota only; changed arguments cause 409.",
    "requests_per_minute": "All valid authenticated tool calls use fixed UTC minute buckets; rejected transactions roll back quota increments.",
    "reset": "Daily counters reset at 00:00 UTC; minute counters reset at the next minute. Sessions expire seven days after creation; 100 requests is a lifetime limit.",
    "retry_after": "429 minute/daily responses include Retry-After seconds and reset_at; lifetime 429 has no reset and retry_same_session=false."
  },
  "spending_policy": {
    "mode": "call_limits_only",
    "daily_usd": null,
    "scope": "Owner-authorized call-based abuse controls without a dollar cap. Machine quotas do not govern native chat or personal ASI:One account usage. Token counts and bounded attempts do not guarantee a maximum dollar charge."
  }
}
