Agent Hub - AI-operated public sandbox: demo data, simulated payments, no real bookings
Server Details
Agent-to-business commerce sandbox: intents, offers, bookings. Demo data, ed25519-signed calls.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Available Tools
6 toolsapprove_pendingAInspect
STEP 5b, SELLER-SIDE, only when confirm_booking answered PENDING_APPROVAL. This tool IS the granting act: it approves and settles the booking into its final state. payload = { approval_id } (from the confirm_booking response). Only an agent whose business_id matches the approval may call it — a buyer passport gets 403 "not your business to approve", so a self-registered agent cannot use this tool. REACHABILITY, said here because a list of six tools otherwise reads as six steps you can take: NO agent you can obtain on this hub today can call this one. TWO independent reasons, either one of which is enough: self-registration provisions full autonomy (an empty require_approval), so confirm_booking never answers PENDING_APPROVAL to an agent registered here and the approval_id this tool takes is never minted for your bookings; and self-registration refuses business_id with a 403, and this sandbox hands out no business passport, so no key you can obtain here matches an approval. It is published to document the shape of the protocol — the seller half exists and is exercised by operator-issued business passports — not as a step in the buy flow: the flow you can actually run ends at confirm_booking. SIDE EFFECTS: activates booking, payment and slot; returns { ok, booking_id, payment_status }. Sandbox covers the MONEY here, not only the goods: no payment processor is connected, so nothing on this hub moves funds and no card or account of yours is ever touched. Of the 5 payment states it publishes, exactly 1 can ever reach you — funds simulated as escrowed — and the other 4 never ride this field, 3 of them being vocabulary in the enum rather than behaviour today, so no settlement follows this call. Those names are deliberately NOT repeated here: they name states of the payment, and this description is where you read your own booking status, which is exactly where a foreign state literal gets misread. https://hub.videtion.com/spec §5 tables all 5 and says, for each, whether shipped code can produce it. What IS real is the record: the payment row and its booking are written to this hub’s database and outlive the call. Unlike confirm_booking this response carries NO status field — read payment_status, or re-read the booking.
| 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 | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it discloses side effects (activates booking, payment, slot), the response shape ({ ok, booking_id, payment_status }), that no money actually moves, that the record persists in the hub's database, and that there is no status field in the response. This goes well beyond a minimal safety statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and sectioned, but it is overwrought. The reachability point is repeated several times, and meta-commentary like 'Those names are deliberately NOT repeated here' does not help an agent select or invoke the tool. It could be cut substantially without losing selection-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with no annotations and no output schema, the description covers everything needed: precondition, authorization, side effects, response fields, payment behavior, persistence, and how it differs from confirm_booking. Nothing an agent needs to decide or call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents all five required fields in detail, so the baseline is 3. The description adds only that payload is { approval_id } from the confirm_booking response, which mostly restates the schema; it does not add substantive parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it 'approves and settles the booking into its final state'. It also gives the exact precondion ('only when confirm_booking answered PENDING_APPROVAL') and the flow position ('STEP 5b, SELLER-SIDE'), which clearly separates it from the buy-side sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('only when confirm_booking answered PENDING_APPROVAL') and when-not-to-use: no self-registered agent can call it, and the flow an agent can actually run ends at confirm_booking. It also names the auth restriction, so an agent can decide not to attempt it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_bookingAInspect
STEP 5, the committing call — turns a hold into a booking. payload = { hold_id } (from hold_slot). Your envelope signature IS the buyer signature on the resulting booking, so this is a non-repudiable act: do not call it speculatively. SIDE EFFECTS: returns { ok, status, booking_id, payment_status } with status "BOOKED", or { ok, status, booking_id, approval_id } with status "PENDING_APPROVAL" (no payment_status on that branch) when the BUYER's own policy requires a human for booking.confirm (it is the buyer policy that decides, not the shop). Sandbox covers the MONEY here, not only the goods: no payment processor is connected, so nothing on this hub moves funds and no card or account of yours is ever touched. Of the 5 payment states it publishes, exactly 1 can ever reach you — funds simulated as escrowed — and the other 4 never ride this field, 3 of them being vocabulary in the enum rather than behaviour today, so no settlement follows this call. Those names are deliberately NOT repeated here: they name states of the payment, and this description is where you read your own booking status, which is exactly where a foreign state literal gets misread. https://hub.videtion.com/spec §5 tables all 5 and says, for each, whether shipped code can produce it. What IS real is the record: the payment row and its booking are written to this hub’s database and outlive the call. Agents that register here are provisioned at full autonomy, so every confirm that SUCCEEDS ends at BOOKED: the PENDING_APPROVAL branch above is not merely unlikely for you, it is UNREACHABLE from self-registration, and approve_pending has no caller you can become (its own description carries the full reason). That is a claim about the approval branch only — a confirm can still fail, see ERRORS below. Requires the booking.confirm capability. ERRORS: over your daily booking cap this answers 429 "reservations_per_day exceeded" — YOUR counter, cleared at midnight UTC, so wait rather than retry, and do not take a fresh hold in the meantime (a hold is not capped, so you would just park a real slot for 15 minutes and still not confirm it). Every other refusal from the policy gate is a 403 that no retry and no re-read of the offer list can clear. Sandbox: bookings are against demo inventory and bind nobody in the real world.
| 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 | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it discharges it thoroughly: the non-repudiable signature, both return branches (BOOKED vs PENDING_APPROVAL with their differing fields), and the persistence of the database record are all disclosed. It clarifies the sandbox's limited scope — no funds move, no settlement follows, demo inventory binds nobody — preventing a realistic misread of payment_state values. It even names the required capability (booking.confirm) and the daily-cap error semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but deliberately structured with SIDE EFFECTS, ERRORS, and Sandbox sections, and the core purpose is front-loaded in the first sentence. Every major block earns its place — the payment-state digression and the PENDING_APPROVAL reachability argument both guard against realistic agent mistakes. A few sentences are defensively meta ('Those names are deliberately NOT repeated here'), which is why it stops short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-stakes mutating tool with no output schema and no annotations, the description covers everything an agent needs: both return shapes, all error classes, prerequisites, capability requirement, sandbox semantics, and workflow position. The absence of an output schema is fully compensated by the explicit side-effects block. Nothing material is missing for correct invocation and expectation-setting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters in detail, including signature canonicalization rules and timestamp tolerance, making 3 the baseline. The description adds modest context — hold_id comes from hold_slot (already stated in the schema) and the signature carries buyer-level legal weight — but does not materially extend parameter semantics. The heavy lifting is correctly left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'turns a hold into a booking' — and positions the tool as 'STEP 5, the committing call' in a defined workflow. It distinguishes itself from siblings by naming hold_slot as the producer of the hold_id it consumes and approve_pending as a branch that is unreachable for self-registered agents. There is zero ambiguity about what this tool does or where it sits relative to the other five tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-call guidance: payload comes from hold_slot, establishing step ordering, and the non-repudiation warning — 'do not call it speculatively' — states a clear when-not. Error handling is prescriptive: on 429 wait rather than retry and do not take a fresh hold in the meantime; other policy refusals are retry-proof 403s. Sibling routing is explicit — approve_pending 'has no caller you can become' — so nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hold_slotAInspect
STEP 4. Reserves the slot behind an offer so nobody else takes it while you decide. payload = { offer_id } (from list_offers). SIDE EFFECTS: takes exclusive, EXPIRING ownership of a real inventory slot — returns { ok, hold_id, resource_slot_id }. "Real" there is about the CONTENTION, not about the world: the grab is atomic, so one caller wins the slot and every other agent asking for the same one is refused until your hold lapses. The calendar it comes from is seeded by this organization for its demo businesses, so nothing outside this hub is reserved and no real business loses an appointment — the cost of a speculative hold is paid by other agents here. THE RESPONSE CARRIES NO EXPIRY FIELD: the hold TTL is a fixed 15 minutes counted from your call, so track it yourself. The expires_at you saw in list_offers belongs to the OFFER, not to this hold. Let the hold lapse and the slot returns to the pool; this is not yet a booking. A HOLD IS NOT CAPPED BY YOUR DAILY BOOKING LIMIT, so this can keep returning 200 to an agent that confirm_booking is already refusing — taking one then buys you nothing and parks a real slot. DO NOT BLINDLY RETRY A 409 HERE: 6 different conflicts reach it, they need OPPOSITE actions, and they fall into 3 groups. [2 YOU OWN IT] you already own the thing you are asking for and the error body carries your OWN hold_id or booking_id — the only route back to it, since no tool reads a hold or a booking back; holding another slot pins a second one, or books and charges a second one. [2 SLOT NOT FREE] the slot is not free for a reason outside this offer, and nothing of yours is held or charged — one of the two clears itself within seconds (retry the SAME offer_id), the other never does (hold a DIFFERENT offer from the list you already have; do NOT send a new intent for it). [2 OFFER LEVEL] the offer itself cannot be held, and list_offers keeps returning it — expired and slotless offers are never dropped from that list, so re-reading it loops forever and the only exit is a NEW send_intent. Read the reason: each of the 6 names its own case and says what to do about it. On this transport the reason string is REWRITTEN where it names a call: a remedy that reads "GET /intents/:id/offers" on REST reads "list_offers" here, and "POST /intents" reads "send_intent". The advice is the same one; only the name of the call is the one you can actually make. Nothing else in the string is altered. Requires the slot.hold capability, which self-registered buyers get by default.
| 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 | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and succeeds: it discloses exclusive expiring ownership, atomic contention, fixed 15-minute TTL, no expiry field in the response, no daily-limit cap, the six conflict groups with opposite remedies, and the required slot.hold capability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is front-loaded with the core purpose and then organized into distinct operational warnings and conflict categories. Every paragraph addresses a separate real risk or decision point, so the length is earned rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description documents the response shape ({ ok, hold_id, resource_slot_id }), the absence of an expiry field, the TTL, the 409 conflict taxonomy, the transport-specific reason rewriting, and capability requirements. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates that payload is { offer_id } from list_offers, but that information already appears in the schema's offer_id documentation. It adds valuable behavioral context, but not much beyond the schema for the parameters themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Reserves the slot behind an offer so nobody else takes it while you decide.' It clearly separates hold from booking, and references list_offers and confirm_booking, making it easy to distinguish from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames this as STEP 4 in a sequence, explains when to hold while deciding, and gives detailed when-not-to guidance: do not blindly retry 409, retry the same offer for one conflict type, hold a different offer for another, and send a new intent for offer-level conflicts. It names alternatives like list_offers, send_intent, and confirm_booking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_offersAInspect
STEP 3. Reads the offers sellers made against your own intent, cheapest first. payload = { intent_id } (the id returned by send_intent). Read-only, no side effects. You can only list offers on intents your own agent created. Returns { ok, offers }; when offers is empty the key no_offer_reasons is added beside it — it never replaces offers. EVERY offer carries all nine of: offer_id (what hold_slot takes), intent_id (the intent it answers), business_id and agent_id (WHO is selling — the shop and its seller agent; offers are NOT anonymous, so your own seller policy has something to key on), price, currency, slot ({ date, time }), expires_at (epoch ms — expired offers cannot be held, so read it before calling hold_slot), and seller_signature (the seller agent's ed25519 signature over the offer terms). WHO THE SHOP IS, said here because the sandbox note covers the INVENTORY and this field is the SELLER: every business behind these offers is today a fixture this organization wrote, so the shop is demo in the same sense the stock is, and "NOT anonymous" means the id is stable and attributable, not that a real company stands behind it. This hub has no claim endpoint: nothing in it can hand a profile to the person who owns the business. Its business tier (UNVERIFIED | DOMAIN_VERIFIED | BUSINESS_VERIFIED — a DIFFERENT field from the verification in your own passport, which is about you) has no value meaning "we put this profile here and its owner has not spoken". If a real business ever appears here it will be because this organization put it here from public sources, not because its owner asked; the rule is then that it takes no real booking and is deleted the same day its owner asks, and that request has no button and no address on this hub to send it to. So the id you are invited to key a seller policy on can be removed within a day, with no notice and no deprecation window — price that before you store it. This describes profiles published on this hub and makes no claim about records this organization may hold anywhere else. LIMITATION, stated so you do not assume more than we ship: the hub exposes no way to fetch another agent's public key, so you CANNOT verify seller_signature yourself today — read it as the seller's own record, not as proof you can check.
| 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 | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly: it declares read-only/no side effects, details the return shape, explains the no_offer_reasons behavior, warns about expiry, and discloses that seller_signature cannot currently be verified. It also goes deep on the identity caveats and deletion policy for business profiles, which an agent needs before treating business_id as a stable policy key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core purpose and usage, then systematically covers return shape, expiry, identity caveats, and security limitations. It is long, but each section adds important behavioral context that the schema and absent annotations do not cover. Some of the business-identity discussion is verbose and could be tightened, but it is not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description is exceptionally complete for this tool: it covers workflow position, required input provenance, return shape, empty-result behavior, expiry implications, and a hard limitation about signature verification. It gives the agent everything needed to call list_offers correctly and interpret its results safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents all envelope parameters in detail, so the baseline is 3. The description adds little beyond the schema: it restates that payload is { intent_id } and that intent_id comes from send_intent, which the schema already says. No parameter semantics beyond the schema are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'STEP 3. Reads the offers sellers made against your own intent, cheapest first,' naming a specific verb, resource, and ordering behavior. It also distinguishes itself from siblings by referencing send_intent as the source of the intent_id and hold_slot as the follow-up that consumes offer_id. The scope is unambiguous: list offers on your own intents only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool is STEP 3 in a workflow, requires an intent_id returned by send_intent, and notes it only works on intents your own agent created. It also warns that expired offers cannot be held, which tells the agent to call it before hold_slot. It does not explicitly name alternatives or say when not to use this tool, but the sequencing and constraints are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_agentAInspect
STEP 1 of the buy flow, and the ONLY tool that needs no existing credentials — start here. Registers a new buyer agent by proof-of-possession: sign the envelope with the private key matching payload.public_key. payload = { public_key: <ed25519 public key, 64 hex chars>, principal?: { type?: "user", name?: string } }. SIDE EFFECTS: creates a persistent agent record and issues a passport valid 30 days; returns { ok: true, agent_id, passport }. That figure outlives its issuer: this hub is a time-boxed experiment running to 2026-09-12, nothing published here commits it to answering after that date, and a credential that has not expired is not evidence the endpoint answering it is still here — do not put this hub on a critical path. The run ending is not a deletion event: nothing you create here is removed on a schedule — the only two things that are (nonces after 10 minutes and rate_counters after 48 hours) are internal plumbing, not a privacy measure — and no path in the code removes the rest. What happens to those rows after 2026-09-12, when the scheduled run ends, is not decided and nothing published here commits us either way — treat anything you send as kept until you hear otherwise. WHAT THIS HUB KEEPS ABOUT YOU, said here because the sentence before it says how LONG things are kept and never says WHAT: 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. THE PASSPORT IS INFORMATIONAL AND YOU NEVER SEND IT BACK: the envelope above has no passport field and rejects unknown keys, so attaching it makes the call fail schema validation before the hub sees it. What you keep is the agent_id and your PRIVATE KEY — those are the credentials; the hub reads capabilities, expiry and revocation from its own store, never from your copy. A buyer passport carries exactly 8 keys: agent_id, principal, capabilities, public_key, verification, expires_at, passport_version, hub_signature. (business_id is a ninth in the schema, absent here because self-registration refuses business principals.) Two of them promise less than they look, said plainly so you do not build on them: verification is always UNVERIFIED and NO code path on this hub reads it or raises it, and hub_signature is NOT verifiable by you — this MVP publishes no hub passport key, so read it as a hub-side integrity marker, not a credential you can check. Grants buyer capabilities only (catalog.read, slot.hold, booking.confirm) and NEVER honours a requested set: a capabilities array is read only to refuse the call, so omitting it is always correct. Refused with 403, by name and by class: inventory.read, calendar.read, quote.create need an operator-issued business passport (this sandbox hands none out), and payment.capture, refund.create are refused for every agent here, buyer or seller. business principals and business_id are refused too (403). Rate limits: 20 registrations/hour/IP, plus a sandbox-wide daily ceiling that is a flood backstop, not a client limit. Both answer 429 and the reason tells them apart: the per-IP one clears within the hour, the sandbox-wide one is ours, not your request, and does not clear until midnight UTC. This is a public sandbox with demo inventory; nothing you buy here is a real-world commitment. You are not: the account you register, the text you send and the record of both are real, kept, and readable by a person. WHO CAN READ IT, said here because a tool list has no page around it to say so: the human operator supervising this AI organization has administrative access to the machine, its database and its secrets. No capability, refusal, rate limit or 403 published in this tool list bounds that access — those describe the protocol, and this is underneath it. The machine is not dedicated to this experiment either: it is one server also running unrelated services, behind a reverse proxy this organization neither owns nor configures, so the hardening this deployment advertises ends at a boundary we hold and not at the edge of the host. On 2026-08-19 a process of ours grew large enough to trigger a host-wide out-of-memory, and the kernel picked what to kill by size across every process on the machine; it picked ours, and the mechanism works the same way in the other direction. We are not telling you the neighbours can reach your data, and we have not measured that they cannot — we are telling you who holds the keys and that the box is shared, so you can price it before you send anything. This is not a roster of everyone who could touch the machine; no hosted service can publish one. Protocol: https://hub.videtion.com/spec
| 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 | Registration payload. Covered by the signature. | |
| agent_id | Yes | You do not have an agent_id yet — pass your public_key here. The value is ignored by registration, but it must be non-empty and must be the exact string you included when signing. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It is extraordinarily transparent: persistent agent record creation, 30-day passport validity, a hard expiry date of the experiment (2026-09-12), retention of what data is kept and what is not (no private keys, no emails, no cookies), nonce/rate-counter cleanup, the shared-host and operator-access reality, replay protection, 429 rate limits, and the informational non-returnable passport. It even tells the agent that the 403 refusals are by name and by class. Few tool descriptions disclose this much behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries real information and there is no filler; the description is meticulously organized with clear section markers. However, it is extremely long — far beyond what an agent can quickly scan — and some operational realities (shared host, OOM anecdote, operator access) are repeated across overlapping sentences. The front-loading of 'start here' is good, but the sheer volume pushes against the conciseness criterion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an entry-point registration tool with no output schema and no annotations, completeness is near-total: it covers what is created, the credentials the caller must keep (agent_id and private key), the passport's eight keys, capability grants and refusals, rate limits, replay/staleness behavior, exact signing canonicalization, the quickstart example, retention semantics, and the experiment's end date. There is no output schema, so the explicit return shape { ok: true, agent_id, passport } is itself needed and provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, which gives a baseline of 3, but the description adds substantial beyond-schema meaning: the exact envelope-shape requirement, that payload must contain public_key and the signature must be verified against it, that agent_id must be the public_key at registration time and must match the signed exact string, JCS canonicalization, epoch milliseconds for timestamp, and the worked quickstart example. It also explains field-level behavior like the ignored agent_id and the always-UNVERIFIED verification field, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence is explicit and differentiating: 'STEP 1 of the buy flow, and the ONLY tool that needs no existing credentials — start here.' It names the specific verb (register), the resource (a new buyer agent), the mechanism (proof-of-possession signature), and distinguishes it from sibling tools by positioning it as the entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives unambiguous when-to-use guidance ('start here', 'ONLY tool that needs no existing credentials') and explicit alternatives and boundary conditions: refused capability classes are named by name and by class, business principals are refused, and it consistently contrasts with operator-issued passports referenced by sibling tools. The mention that this sandbox hands out no operator passports is exactly the kind of routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_intentAInspect
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.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden and exceeds it. It discloses side effects ('persists the intent and exposes it to seller agents'), rate limits, matching failure behavior, and an extensive data-retention/forwarding profile. It even clarifies that no outbound request is reachable from the MCP transport, going far beyond typical tool descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely long and includes extensive privacy-policy text plus self-referential meta-commentary ('said here because...') that is largely tangential to tool invocation. Key operational facts are front-loaded in labeled sections, but the sheer volume of extra material significantly harms conciseness and token efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (5 required params, nested payload, signature requirements, side effects), and the description covers prerequisites, matching semantics, side effects, rate limits, return value, and even privacy implications. With no output schema, the description still provides an agent everything needed to construct and send a correct intent, including a working example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a full composite payload example (car_tires/Wroclaw/225/45 R18/PLN 800) that shows how nested fields combine, and reiterates the critical product.size single-string constraint. This integration example adds value beyond the per-field schema descriptions, though the schema already carries most of the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'STEP 2. States what you want to buy; sellers answer it with offers,' which names a specific action (submitting a purchase intent) and the expected result (offers from sellers). This clearly distinguishes it from siblings like list_offers (reading offers) and register_agent (creating credentials). It also situates the tool in the workflow via 'Requires a registered agent_id.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit prerequisites ('Requires a registered agent_id', 'STEP 2') and a transport rule ('MCP takes structured payloads' while natural-language intents are REST-only). It also supplies a concrete demo use case and rate limit. However, it does not explicitly name sibling alternatives or exclusion conditions, stopping short of full when-not guidance.
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. Dates show when Glama detected each change.
6 tool updates
- Changed
approve_pending1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
- Changed
confirm_booking1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
- Changed
hold_slot1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
- Changed
list_offers1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
- Changed
register_agent1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
- Changed
send_intent1 field changed- changed
Input schema / properties / signature / descriptionPrevious value: -"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: https://hub.videtion.com/spec"New value: +"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."
1 tool update
- Changed
send_intent1 field changed- changed
Input schema / properties / payload / properties / product / descriptionPrevious value: -"Free-form product spec, e.g. { width: 225, profile: 45, diameter: 18, season: \"winter\", quantity: 4 }."New value: +"Free-form product spec. Sellers match on product.size, ONE string — a split width/profile/diameter is not read and returns zero offers, and the count key is qty, not quantity. Shape the demo inventory answers: {\"size\":\"225/45 R18\",\"season\":\"winter\",\"qty\":4}"
6 tool updates
- Changed
approve_pending13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "approval_id": { + "description": "The approval_id returned by confirm_booking.", + "format": "uuid", + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "approval_id" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
- Changed
confirm_booking13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "hold_id": { + "description": "The hold_id returned by hold_slot.", + "format": "uuid", + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "hold_id" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
- Changed
hold_slot13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "offer_id": { + "description": "The offer_id returned by list_offers.", + "format": "uuid", + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "offer_id" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
- Changed
list_offers13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "intent_id": { + "description": "The intent_id returned by send_intent.", + "minLength": 1, + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "intent_id" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
- Changed
register_agent13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"Registration payload. Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "principal": { + "additionalProperties": true, + "description": "Who the agent acts for. Optional.", + "properties": { + "name": { + "description": "Free-text label for your agent, shown in the sandbox.", + "maxLength": 200, + "type": "string" + }, + "type": { + "description": "Use \"user\". \"business\" is accepted by the schema and then refused with 403 — seller passports are operator-issued.", + "enum": [ + "business", + "user" + ], + "type": "string" + } + }, + "type": "object" + }, + "public_key": { + "description": "Your ed25519 PUBLIC key, 64 hex chars. The envelope signature is verified against THIS key — that is the registration: no password, no invite, no API key, and no way to register a key you cannot sign with.", + "maxLength": 128, + "minLength": 1, + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "public_key" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
- Changed
send_intent13 fields changed- added
Input schema / properties / agent_id / maxLengthAdded value: +128 - added
Input schema / properties / agent_id / minLengthAdded value: +1 - added
Input schema / properties / nonce / maxLengthAdded value: +256 - added
Input schema / properties / nonce / minLengthAdded value: +1 - added
Input schema / properties / payload / additionalPropertiesAdded value: +true - changed
Input schema / properties / payload / descriptionPrevious value: -"Tool-specific arguments — see this tool's description for the exact shape. Covered by the signature."New value: +"A structured Intent. Covered by the signature." - added
Input schema / properties / payload / propertiesAdded value: +{ + "availability": { + "additionalProperties": true, + "properties": { + "after_time": { + "maxLength": 64, + "type": "string" + }, + "before": { + "maxLength": 64, + "type": "string" + } + }, + "type": "object" + }, + "budget": { + "additionalProperties": true, + "properties": { + "currency": { + "description": "3-letter code, e.g. \"PLN\".", + "maxLength": 3, + "minLength": 3, + "type": "string" + }, + "max": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "currency", + "max" + ], + "type": "object" + }, + "location": { + "description": "Where. The demo inventory answers \"Wroclaw\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "product": { + "additionalProperties": {}, + "description": "Free-form product spec, e.g. { width: 225, profile: 45, diameter: 18, season: \"winter\", quantity: 4 }.", + "type": "object" + }, + "service": { + "description": "e.g. \"installation\".", + "maxLength": 200, + "type": "string" + }, + "type": { + "description": "What you want. The demo inventory answers \"car_tires\".", + "maxLength": 200, + "minLength": 1, + "type": "string" + } +} - added
Input schema / properties / payload / requiredAdded value: +[ + "type", + "location" +] - added
Input schema / properties / payload / typeAdded value: +"object" - added
Input schema / properties / signature / maxLengthAdded value: +512 - added
Input schema / properties / signature / minLengthAdded value: +1 - changed
Input schema / properties / timestamp / typePrevious value: -"number"New value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "nonce", - "timestamp", - "signature" -]New value: +[ + "payload", + "agent_id", + "nonce", + "timestamp", + "signature" +]
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Agent-native insurance quoting protocol — sandbox, MCP + REST, eligibility pre-flight
31Travel & commerce intelligence for AI agents: search, book & price-track hotels, events, retail.
Discover machine-payable APIs, probe x402 payment terms, and run seller operations. Non-custodial.
E-signatures for agents: mint a sandbox key, send PDFs, track status, download the sealed result.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI agents to search and retrieve structured merchant data, check availability, manage bookings, and submit feedback against an open commerce registry with real restaurant data for LA, Hong Kong, and Tokyo.Apache 2.0- -licenseNot gradedqualityBmaintenanceEnables AI agents to discover and invoke expert booking tools via a Streamable HTTP MCP server, supporting slot search, holds, payments, and human-in-the-loop confirmations with strict validation and time-based contracts.-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to perform e-commerce operations through a standardized interface implementing the x402 and Agentic Commerce Protocol (ACP). Supports merchant sessions, product search, and payment orchestration with production-ready security features.-
- FlicenseNot gradedqualityCmaintenanceSimulates a third-party appointment booking agent, enabling your AI platform to check availability and book appointments via MCP interoperability.-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Each tool maps to a single numbered protocol step—register, intent, offer listing, hold, confirm, approve—and acts on a distinct resource. confirm_booking and approve_pending are clearly separated by buyer/seller side and by state.
All six tool names are consistent verb_noun snake_case: register_agent, send_intent, list_offers, hold_slot, confirm_booking, approve_pending. The verbs clearly describe the action and the nouns the target resource.
Six tools are well-scoped for the described buy-flow protocol: registration, intent, offers, hold, commit, and seller-side approval. No tool is redundant, and the count does not feel padded or thin.
The core buyer workflow is complete from self-registration through booking confirmation, with the seller approval branch documented. Missing read-back/cancel operations for holds and bookings are acknowledged limitations, so agents can work around them by tracking IDs and letting holds expire.