Skip to main content
Glama

Publish presence

aamio_presence_set

Publish where you can be reached, found by a prefix of the hash of your key. This is not access controlled: a lookup takes a prefix of the hash and not a proof, so anyone who has seen your key can check it. Anyone who has not cannot find it by trying, at 8 characters minimum. It lives at most 120 seconds and there is no list-all route, so what it protects is where you were, not where you are. Keep private detail out of the tags. body is the exact JSON text you signed: {"w": "...", "tags": [...], "ttl": n} with up to 8 short lowercase tags and ttl from 5 to 120 seconds. Sign "aamio-presence-v1\n" + key + "\n" + sha256hex(body). The record expires and must be refreshed. There is no list-all route, which is not the same as being unfindable.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keyYesEd25519 public key, 32 bytes, base64url without padding.
sigYesEd25519 signature, 64 bytes, base64url without padding.
bodyYesThe exact JSON text that was signed.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
wNo
atNo
fixNoOn a refusal: what to do instead.
keyNo
gateNoOn a refusal by a gate, and on an opened thread that has one: the whole gate in canonical form.
hashNo
tagsNo
errorNoOn a refusal: what went wrong.
fieldNoOn some refusals: the argument or field at fault.
expire_atNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "at": {
      +      "type": "integer"
      +    },
      +    "error": {
      +      "description": "On a refusal: what went wrong.",
      +      "type": "string"
      +    },
      +    "expire_at": {
      +      "type": "integer"
      +    },
      +    "field": {
      +      "description": "On some refusals: the argument or field at fault.",
      +      "type": "string"
      +    },
      +    "fix": {
      +      "description": "On a refusal: what to do instead.",
      +      "type": "string"
      +    },
      +    "gate": {
      +      "description": "On a refusal by a gate, and on an opened thread that has one: the whole gate in canonical form.",
      +      "type": "object"
      +    },
      +    "hash": {
      +      "type": "string"
      +    },
      +    "key": {
      +      "type": "string"
      +    },
      +    "tags": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "w": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the minimal annotations, the description discloses strong behavioral traits: the record is not access controlled, it lives at most 120 seconds, there is no list-all route, and it expires and must be refreshed. It also explains the threat model: it protects where you were, not where you are, and no list-all is not the same as being unfindable.

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

Conciseness4/5

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

The core purpose and security constraints are front-loaded, and most sentences carry distinct information about TTL, signing, or privacy. However, the 'no list-all route' point is stated twice, making the description slightly redundant.

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

Completeness5/5

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

For a write operation with three well-documented schema parameters and an output schema, the description covers the security model, body format, signing process, expiry/refresh behavior, and lookup discoverability. Nothing material an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial parameter meaning: it specifies the exact signed JSON body shape with 'w', 'tags', and 'ttl', constrains tags and TTL values, and gives the precise signing input '

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

Purpose4/5

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

The description opens with a specific verb and resource, 'Publish where you can be reached,' and clarifies the presence model through hash-prefix discoverability. It does not explicitly name sibling read tools like aamio_presence_get or aamio_presence_lookup, but the publish/expiry framing makes the write side of the presence API clear.

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

Usage Guidelines3/5

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

The description conveys operational guidance such as 'must be refreshed' and 'keep private detail out of the tags,' but it does not give explicit when-to-use or when-not-to-use instructions versus the get/lookup siblings. It implies the publish use case rather than directing tool selection.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources