Skip to main content
Glama

Invite a tailnet member

invite_user

Send a Tailscale invitation to an email address, adding the recipient to your tailnet. Use print_link to return an invite URL instead of emailing; elevated roles require owner opt-in.

Instructions

Sends a real Tailscale invitation to a real email address, so confirm the address and role with the user before calling this. The invitation joins the recipient to the user's tailnet. Set print_link true to receive a bearer invite URL instead of having Tailscale send the email. A role other than member is refused with mcp_elevated_invite_refused unless the owner set mcp.allow_elevated_invites in config.json; the user can always run tslink invite user themselves.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
roleNoRole assigned on acceptance. Defaults to member. Any other role needs the owner's opt-in (mcp.allow_elevated_invites in config.json).
emailYesRecipient email address.
print_linkNoDo not send email; return the API-provided invite URL for the user to deliver. Anyone holding that URL can accept.

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

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

Annotations only cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description goes well beyond that: it warns the invitation is real, discloses the auth/elevation gate and its specific error code (mcp_elevated_invite_refused), names the config key (mcp.allow_elevated_invites), and flags that a print_link URL is a bearer credential anyone can accept.

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?

The most consequential fact (a real invite goes to a real address) is front-loaded as a warning, followed by effect, mode selection, and the elevation gate in a tight sequence. Every sentence carries distinct information with 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?

For a non-idempotent, open-world mutation tool with an output schema, the description covers side effects, the authorization gate, the error signal, and an alternative path, so returns need not be explained. The remaining gap is non-idempotency behavior: it does not say what happens when the address already has an invitation, which is relevant given the invite_resend sibling.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying the role parameter to a concrete refusal path and error code and by explaining the consequence of print_link as a transferable credential. It does not add format or syntax detail beyond what the schema already provides.

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?

The description opens with a specific verb and resource: 'Sends a real Tailscale invitation to a real email address,' and clarifies the effect ('joins the recipient to the user's tailnet'). It is easily distinguishable from siblings like invite_device, invite_list, invite_resend, and invite_revoke without opening any schema.

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 guidance ('confirm the address and role with the user before calling this') and a mode-selection rule for print_link, plus a fallback ('the user can always run tslink invite user themselves'). It stops short of naming sibling tool alternatives for re-inviting or revoking, but the usage context is otherwise clear.

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