Skip to main content
Glama

Add a person and app access

people_add
Destructive

Grant a person time-limited access to selected private HTTP and file apps on your Tailscale network, with optional invites and QR links.

Instructions

Changes local access to private HTTP and file apps for a person, so confirm the person, apps and expiry with the user before calling. This makes newly scoped apps deny callers without a grant or an explicit legacy allow rule. TCP cannot enforce people; public Funnel is refused. Optional invite creates one gateway device invitation for routed apps and per-app invitations for non-routed apps, bundled in one guide, so confirm before creating them. Requires a user-owned API token only for invite; OAuth cannot create device invites. print_links explicitly reveals bearer links. No elevated exit-node, multi-use or tailnet-role permissions are offered; use the existing invite tools and their owner-configured elevated permission guard for those. An incomplete invitation result retains local grants and reports durable state/errors. Update with invite alone resumes unfinished work; unknown POSTs require explicit owner-verified reconcile_invites after remote listing. Completed operations are reused. There is no exactly-once guarantee. Logins accept all nonempty valid UTF-8 strings without controls or internal whitespace; invalid UTF-8 is a usage_error. Trim outer ASCII whitespace and lowercase ASCII A-Z only; compare exact bytes without Unicode folding or normalization. replace_invites explicitly confirms replacement of a disappeared completed ID or a stale gateway NodeID, retires its attempt, and preserves all grants/deadlines; requires update with invite and no apps/for changes.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qrNoReturn QR payload text only; never image bytes.
forNoRelative lifetime (descending unique units w,d,h,m,s,ms,us,ns) or until <RFC3339|YYYY-MM-DD|YYYY-MM-DDTHH:MM>. Local unless offset given; DST gaps/folds require an offset. Minimum 1h. Presets: 1h, 8h, 24h, 3d, 7d. New grants default to 24h; update omission preserves deadlines. Never requires ack_never and a tailnet-member login; device-invited guests have the configured public maximum.
whoYes
appsYesApp names, or [all] for all current private HTTP/file apps. Required on add; omission on update keeps the app set.
untilNoAbsolute deadline (RFC3339, YYYY-MM-DD, YYYY-MM-DDTHH:MM); conflicts with for.
inviteNo
ack_neverNo
qr_inviteNoApp invitation QR or @gateway; requires qr and print_links. Treat as a credential.
print_linksNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
guideNo
personYes
portalNoIndependent home portal configuration and exact runtime address when available.
invitesYes
messageYes
completeYes
guide_zhNo
warningsNo
qr_payloadNo
qr_warningNo
invite_requirementYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructive=true, idempotent=false, openWorld=true, so the bar is lower, yet the description adds real depth: newly scoped apps deny callers without a grant, TCP cannot be enforced, public Funnel is refused, invite needs a user-owned API token (OAuth cannot create device invites), print_links exposes bearer links, and there is no exactly-once guarantee. It loses a point for referencing behaviors like reconcile_invites and replace_invites without grounding them and for burying these facts in one undifferentiated block.

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

Conciseness2/5

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

After a reasonable first sentence, the remainder is a single dense run-on mixing access enforcement, invite mechanics, token auth, link exposure, resume semantics, login normalization, and replace_invites preconditions. It is front-loaded but not structured; an agent must parse a wall of text to extract the operational rules, and several clauses (reconcile_invites, 'retires its attempt') add noise for this tool.

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

Completeness4/5

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

For a 9-parameter, destructive, non-idempotent tool with annotations and an output schema present, the description covers the important extras: confirmation requirement, auth constraints, enforcement limits (TCP, public Funnel), credential exposure, and partial-failure behavior. Return values are rightly left to the output schema. It is nearly complete, only weakened by the jumbled organization and ungrounded tool references.

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

Parameters4/5

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

With 56% schema coverage across 9 params, the description meaningfully compensates: it explains invite (one gateway device invitation for routed apps, per-app invitations otherwise), print_links (reveals bearer links), and login normalization rules for who (trim outer ASCII whitespace, lowercase A-Z, exact-byte compare, invalid UTF-8 is a usage_error). The for/until/replace semantics are largely left to the schema, so it is not a full 5.

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 opening sentence gives a specific verb+resource: 'Changes local access to private HTTP and file apps for a person.' That is clear enough to act on, but the name/title say 'add' while the body also describes update/resume behavior, and no distinction is drawn against close siblings like people_grant, people_update, or people_remove. A competent agent can tell what it does, but not cleanly why it over the neighbors.

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?

It gives explicit pre-call directives ('confirm the person, apps and expiry with the user before calling', 'confirm before creating them') and routes one case elsewhere ('use the existing invite tools and their owner-configured elevated permission guard for those'). It also states the replace_invites precondition ('requires update with invite and no apps/for changes'). There is no explicit when-not-to-use versus people_grant/people_update, so it stops short of 5.

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