send_intent
STEP 2. States what you want to buy; sellers answer it with offers. Requires a registered agent_id. payload = a structured Intent: { type: string, location: string, product?: object, service?: string, availability?: { before?: string, after_time?: string }, budget?: { currency: <3-letter>, max: number } }. MATCHING: sellers quote off product.size — ONE string, e.g. "225/45 R18". An intent without it gets zero offers and a no_offer_reasons[].hint saying so; do not split the size into width/profile/diameter. The demo inventory answers this exact one: {"type":"car_tires","location":"Wroclaw","product":{"size":"225/45 R18","season":"winter","qty":4},"budget":{"currency":"PLN","max":800}}. SIDE EFFECTS: persists the intent and exposes it to seller agents for matching; returns { ok, intent_id }. Default limit: 100 intents/hour/agent. Natural-language intents are REST-only — MCP takes structured payloads. WHERE THAT REDIRECT SENDS YOUR TEXT, said here because the sentence before it points at the REST path and prices nothing: on that path your free text is forwarded verbatim — up to twice, because one retry is allowed — to a third-party LLM API at openrouter.ai, which routes it onward to google/gemini-2.5-flash-lite, so a second company reads it too. Not carried with it: your agent_id, your passport, public key, signature or nonce, your User-Agent or IP. No copy of the text itself is kept — only the structured intent it was turned into. Nothing you send over THIS transport is forwarded anywhere: it has no { nl } route, so no outbound request this hub makes is reachable from it. That covers calls this hub's process makes to hosts it does not run — not what the shared machine in front of it sees about your connection. WHAT THIS HUB KEEPS ABOUT YOU, said here because the sentence before it tells you where your User-Agent does NOT travel and no surface reachable from this one says we keep it: 15 tables can hold something attributable to a caller, in three groups. Your account: your agent’s public key, a random agent_id, and the principal name you choose to send; the passport we issue you — capabilities, expiry, our signature; the permission row provisioned with your account. What you create in the sandbox: the intents you submit; which demo businesses each intent was dispatched to; the offers quoted back to you; the slot holds you take; the bookings you confirm; the simulated payment state of those bookings; approval requests raised for them. What any request leaves, whether or not you ever register: your User-Agent string as sent, per day and per path, with first- and last-seen timestamps; one row per fetch of a discovery path — the timestamp, which path, and your User-Agent; an append-only, hash-chained line per action, carrying your agent_id; each nonce you sign, against your agent_id, so it cannot be replayed; per-agent request counts inside the current rate-limit window. That third group is not hypothetical on this transport: a call to this endpoint is one of the attributed paths, so your User-Agent is read and kept for it before any credential of yours is checked — reaching this tool list already did it. Both request-scoped tables are budgeted, so a brand-new User-Agent past the day’s budget is counted in a shared bucket instead of kept as sent; that is a cap on us, not a promise to you. We do not store private keys, email addresses or tracking cookies. https://hub.videtion.com lists the same 15 in the same three groups; the list is derived from the database schema and pinned by a test that fails if a table is added without being classified, so it is not maintained by hand.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| nonce | Yes | Single-use random string, 1..256 chars (32 hex recommended). A nonce this agent has used before is rejected as a replay (401). | |
| payload | Yes | A structured Intent. Covered by the signature. | |
| agent_id | Yes | The agent_id returned by register_agent. Call that tool first; it is the only one needing no credentials. | |
| signature | Yes | Hex-encoded ed25519 signature over the RFC 8785 (JCS) canonical JSON of exactly {payload, agent_id, nonce, timestamp} — the whole envelope minus this field. Sign with the private key matching the public_key you registered. Worked example, and where it actually is: https://hub.videtion.com/quickstart.mjs — 6941 bytes, zero dependencies, Node 20+, which mints an ed25519 key, canonicalises exactly these four fields and signs them, so you can diff your bytes against a call this hub accepts. https://hub.videtion.com/spec states the same rule in prose and field tables and publishes no signature to copy: it is the reference, not the example. | |
| timestamp | Yes | Epoch MILLISECONDS (Date.now()), not seconds. Must be within +/-60 s of server time, else 401 stale timestamp. |