Skip to main content
Glama

Invite someone to a device

invite_device

Shares a TSLink service device with a recipient outside the tailnet via email, or returns a bearer invite URL instead when print_link is true.

Instructions

Sends a real device-sharing invitation to a real email address outside the tailnet, so confirm the service and address with the user before calling this. It shares one TSLink-owned service device with that person. Set print_link true to receive a bearer invite URL instead of having Tailscale send the email.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
emailYesRecipient email address.
serviceYesExact registered service name whose device is shared.
multi_useNoAllow the invitation to be accepted more than once.
print_linkNoDo not send email; return the API-provided invite URL for the user to deliver. Anyone holding that URL can accept.
allow_exit_nodeNoAllow the recipient to route traffic through the shared device as an exit node. Needs the owner's opt-in (mcp.allow_elevated_invites in config.json); otherwise refused with mcp_elevated_invite_refused.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYes
kindYes
roleNo
emailNo
createdNo
emailedYes
serviceNo
acceptedNo
device_idNo
multi_useNo
recipientNo
invite_urlNoBearer invitation URL. Present only when the invite was created with print_link true or when invite_list was called with show_urls true; anyone holding it can accept the invitation.
target_kindNo
allow_exit_nodeNo
last_email_sent_atNo
remote_side_effect_planYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true, but the description adds genuinely useful behavior: this sends a real email to a real address outside the tailnet, it is therefore externally visible and irreversible-ish, and the print_link flag swaps the delivery channel to a bearer URL that anyone holding it can redeem. It does not, however, address the non-idempotent hint (what a repeat call does — duplicate invite, resend, or error).

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

Conciseness5/5

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

Three sentences, each earning its place: the action and its external side effect first, the confirmation precondition second, the print_link alternative third. The most consequential fact (a real email leaves the tailnet) is front-loaded, and there is no filler.

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?

With an output schema present, the description need not explain return values, and it covers the essentials an agent needs for a non-idempotent, open-world mutation: what is shared, what happens externally, and the safety precondition. Minor gaps remain around repeat invocation behavior and whether the invitation can be amended after sending.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters including multi_use, print_link, and allow_exit_node are already documented in the schema. The description restates print_link's behavior (bearer invite URL) but adds no syntax, defaults, or constraints beyond what the schema already carries. Baseline 3 is correct when the schema does the heavy lifting.

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 gives a specific verb and resource — it sends a real device-sharing invitation that shares one TSLink-owned service device with an external email address. That is far more precise than the title alone and separates it from generic sharing tools (share/unshare). It stops short of naming the closest sibling, invite_user, so the agent must still infer the boundary between device-level and user-level invites.

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?

"confirm the service and address with the user before calling this" is an explicit pre-call precondition, and "Set print_link true to receive a bearer invite URL instead of having Tailscale send the email" tells the agent when to choose the link variant over the email variant. No alternative tool is named, so the routing guidance is contextual rather than exhaustive.

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