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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "key": "<key>",
      "body": "<body>",
      "sig": "<sig>"
    },
    "name": "aamio_presence_set"
  }
}

Input 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

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.6/5.0
Behavior5/5

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

Goes far beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false): discloses the 120-second lifetime, the absence of a list-all route, the fact that it is not access controlled so anyone holding the key can verify, and a direct privacy warning to keep detail out of tags. This is exactly the kind of consequence-level context annotations cannot convey.

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

Conciseness3/5

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

Purpose, privacy model and signing recipe are front-loaded and well ordered, but the text is padded: "there is no list-all route" is stated twice and again at the close ("There is no list-all route, which is not the same as being unfindable"), and the not-access-controlled point is circled more than once. The redundant tail weakens an otherwise dense definition.

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 signed-publish mutation with an output schema already covering return values, everything an agent needs is present: body construction, canonical signing input, expiry/refresh expectation, and the privacy caveat. No material gap remains that would cause a malformed or unsafe call.

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 schema only says body is "the exact JSON text that was signed." The description supplies the entire body grammar ({"w": "...", "tags": [...], "ttl": n}), the tag limit (up to 8 short lowercase tags) and the ttl range (5–120), plus the exact signing string including the domain prefix and sha256hex of the body. Without this an agent could not construct a valid call at all.

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

Purpose5/5

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

Opens with a specific verb and resource ("Publish where you can be reached") and immediately states the discovery mechanism, a prefix of the key hash. That framing inherently separates it from the read-side siblings aamio_presence_lookup and aamio_presence_get without naming them.

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

Usage Guidelines4/5

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

Makes clear this is a write path used to advertise reachability, and that the record expires so it must be refreshed periodically — a real usage condition. It does not explicitly route the agent to aamio_presence_lookup for the inverse operation, so the alternative isn't spelled out, only implied by the lookup discussion.

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