Skip to main content
Glama

Mencoro

Invite a member

invite_member

Invite someone to the organization by email with a role (owner, manager or viewer) and, optionally, the projects they will reach (projectAccess); they get an email to accept. Inviting an address that already belongs to a member creates nothing and says so. Requires a confirmationToken: call preview_operation with tool "invite_member" and these arguments first, show the returned plan to the user, and call this tool only after the user explicitly agrees. Needs the organization:manage permission and the owner role.

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": {
      "organizationId": "<organizationId>",
      "email": "<email>",
      "role": "<role>",
      "confirmationToken": "<confirmationToken>"
    },
    "name": "invite_member"
  }
}

Input Schema

NameRequiredDescriptionDefault
roleYes
emailYes
requestIdNoOptional idempotency key, 8-255 printable characters. Reuse it only to retry this same call.
projectAccessNoOptional. The projects the invitee will reach once they accept: {"mode": "all"}, the default, or {"mode": "selected", "projectIds": [...]} with 1 to 500 distinct project ids of this organization from list_projects; a repeated id counts once. An owner always reaches every project, so an owner invitation cannot carry a selection.
organizationIdYes
confirmationTokenYes

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "allOf": [
      -      {
      -        "properties": {
      -          "created": {
      -            "enum": [
      -              true
      -            ],
      -            "type": "boolean"
      -          }
      -        },
      -        "required": [
      -          "created"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "description": "An invitation to join an organization",
      -        "properties": {
      -          "acceptedAt": {
      -            "format": "date-time",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "createdAt": {
      -            "format": "date-time",
      -            "type": "string"
      -          },
      -          "email": {
      -            "format": "email",
      -            "type": "string"
      -          },
      -          "expiresAt": {
      -            "format": "date-time",
      -            "type": "string"
      -          },
      -          "id": {
      -            "format": "uuid",
      -            "type": "string"
      -          },
      -          "role": {
      -            "enum": [
      -              "owner",
      -              "manager",
      -              "viewer"
      -            ],
      -            "type": "string"
      -          },
      -          "state": {
      -            "enum": [
      -              "pending",
      -              "accepted",
      -              "rejected",
      -              "expired",
      -              "cancelled"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "email",
      -          "role",
      -          "state",
      -          "createdAt",
      -          "expiresAt"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "properties": {
      -      "created": {
      -        "enum": [
      -          false
      -        ],
      -        "type": "boolean"
      -      },
      -      "email": {
      -        "description": "The address as it was normalised.",
      -        "format": "email",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why nothing was created.",
      -        "enum": [
      -          "address_is_already_a_member"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "created",
      -      "reason",
      -      "email"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "allOf": [
      +      {
      +        "properties": {
      +          "created": {
      +            "enum": [
      +              true
      +            ],
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "created"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "description": "An invitation to join an organization",
      +        "properties": {
      +          "acceptedAt": {
      +            "format": "date-time",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "createdAt": {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "email": {
      +            "format": "email",
      +            "type": "string"
      +          },
      +          "expiresAt": {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "id": {
      +            "format": "uuid",
      +            "type": "string"
      +          },
      +          "projectAccessMode": {
      +            "description": "Which projects of the organization the invitee reaches on accepting: every project, or only projectIds",
      +            "enum": [
      +              "all",
      +              "selected"
      +            ],
      +            "type": "string"
      +          },
      +          "projectIds": {
      +            "description": "The projects a selected access reaches, limited to those still in the organization; empty when the mode is all. It may be empty on selected once its projects left the organization, which grants nothing",
      +            "items": {
      +              "format": "uuid",
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "role": {
      +            "enum": [
      +              "owner",
      +              "manager",
      +              "viewer"
      +            ],
      +            "type": "string"
      +          },
      +          "state": {
      +            "enum": [
      +              "pending",
      +              "accepted",
      +              "rejected",
      +              "expired",
      +              "cancelled"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "email",
      +          "role",
      +          "state",
      +          "createdAt",
      +          "expiresAt",
      +          "projectAccessMode",
      +          "projectIds"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "properties": {
      +      "created": {
      +        "enum": [
      +          false
      +        ],
      +        "type": "boolean"
      +      },
      +      "email": {
      +        "description": "The address as it was normalised.",
      +        "format": "email",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why nothing was created.",
      +        "enum": [
      +          "address_is_already_a_member"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "created",
      +      "reason",
      +      "email"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / projectAccess
      Added value: +{
      +  "default": null,
      +  "description": "Optional. The projects the invitee will reach once they accept: {\"mode\": \"all\"}, the default, or {\"mode\": \"selected\", \"projectIds\": [...]} with 1 to 500 distinct project ids of this organization from list_projects; a repeated id counts once. An owner always reaches every project, so an owner invitation cannot carry a selection.",
      +  "properties": {
      +    "mode": {
      +      "enum": [
      +        "all",
      +        "selected"
      +      ],
      +      "type": "string"
      +    },
      +    "projectIds": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "mode"
      +  ],
      +  "type": "object"
      +}
  3. Added

TDQS

A4.6/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: an email is sent to the invitee, an existing address produces a no-op with an explanation, and the confirmation-token gate makes this a two-step operation with an explicit human approval requirement. One minor tension exists with idempotentHint=false, since the description describes the duplicate case as safe and non-mutating; clarified framing would remove the ambiguity.

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?

Three dense sentences that front-load purpose, then the duplicate-invitation edge case, then the confirmation and permission requirements. Nothing is wasted, but the middle and final sentences pack multiple constraints apiece and could be split for easier scanning.

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?

Covers everything needed to invoke correctly: the confirmation-token workflow, permission and role prerequisites, the duplicate case, and the interaction between owner role and projectAccess. Since an output schema exists, the description is not obligated to explain return values, and nothing essential is missing.

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 only 33% schema coverage, the description carries useful weight by enumerating the role values (owner, manager, viewer), explaining the purpose of projectAccess, and noting that an owner invitation cannot carry a project selection. It leaves organizationId, email format, and the requestId idempotency key to the schema, where requestId is already documented.

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?

States a specific verb and resource ("invite someone to the organization by email with a role") and immediately scopes it with the fields involved (role, projectAccess). It is clearly distinguishable from siblings like change_member_role, set_member_project_access, and cancel_invitation because it describes creating a new invitation rather than modifying an existing member.

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

Usage Guidelines5/5

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

Gives the exact pre-call procedure — call preview_operation with tool "invite_member", show the plan, and only call after explicit user agreement — plus the permission (organization:manage) and role (owner) prerequisites. It also tells the agent what happens in the duplicate-invitation case, removing any guesswork about re-inviting an existing member.

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.