Skip to main content
Glama

create_embedded_invite_from_template

Generate a document from a template and create an embedded signing invite for recipients to view, sign, or approve the document.

Instructions

Create document/group from template and create embedded invite immediately. This tool is ONLY for templates and template groups. If you have document or document_group, use the alternative tool: create_embedded_invite

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
entity_idYesID of the template or template group
ordersNoList of orders with recipients for the embedded invite (can be a list or JSON string)
entity_typeNoType of entity: 'template' or 'template_group' (optional). If you're passing it, make sure you know what type you have. If it's not found, try using a different type.
nameNoOptional name for the new document or document group

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
invite_idYesID of the created embedded invite
invite_entityYesType of invite entity: 'document' or 'document_group'
recipient_linksYesArray of objects with role and link for recipients with delivery_type='link'
created_entity_idYesID of the created document or document group
created_entity_nameYesName of the created entity
created_entity_typeYesType of created entity: 'document' or 'document_group'

Implementation Reference

  • MCP tool handler and registration for 'create_embedded_invite_from_template'. Normalizes input orders supporting list or JSON string, gets token/client, and delegates to core helper function.
    @mcp.tool(
        name="create_embedded_invite_from_template",
        description=(
            "Create document/group from template and create embedded invite immediately. "
            "This tool is ONLY for templates and template groups. "
            "If you have document or document_group, use the alternative tool: create_embedded_invite"
        ),
        tags=["template", "template_group", "document", "document_group", "send_invite", "embedded", "workflow"],
    )
    async def create_embedded_invite_from_template(
        ctx: Context,
        entity_id: Annotated[str, Field(description="ID of the template or template group")],
        orders: Annotated[
            list[EmbeddedInviteOrder] | str | None,
            Field(
                description="List of orders with recipients for the embedded invite (can be a list or JSON string)",
                examples=[
                    [{"order": 1, "recipients": [{"email": "user@example.com", "role": "Signer 1", "action": "sign", "auth_method": "none"}]}],
                    '[{"order": 1, "recipients": [{"email": "user@example.com", "role": "Signer 1", "action": "sign", "auth_method": "none"}]}]',
                ],
            ),
        ] = None,
        entity_type: Annotated[
            Literal["template", "template_group"] | None,
            Field(description="Type of entity: 'template' or 'template_group' (optional). If you're passing it, make sure you know what type you have. If it's not found, try using a different type."),
        ] = None,
        name: Annotated[str | None, Field(description="Optional name for the new document or document group")] = None,
    ) -> CreateEmbeddedInviteFromTemplateResponse:
        """Create document or document group from template and create embedded invite immediately.
    
        This tool is ONLY for templates and template groups.
        If you have document or document_group, use the alternative tool: create_embedded_invite
    
        This tool combines two operations:
        1. Creates a document/group from template using create_from_template
        2. Creates an embedded invite for the created entity using create_embedded_invite
    
        Args:
            entity_id: ID of the template or template group
            orders: List of orders with recipients for the embedded invite (can be a list or JSON string)
            entity_type: Type of entity: 'template' or 'template_group' (optional). If you're passing it, make sure you know what type you have. If it's not found, try using a different type.
            name: Optional name for the new document or document group
    
        Returns:
            CreateEmbeddedInviteFromTemplateResponse with created entity info and embedded invite details
        """
        token, client = _get_token_and_client(token_provider)
    
        # Normalize orders parameter (handle JSON string input)
        normalized_orders = _normalize_orders(orders, EmbeddedInviteOrder)
    
        # Initialize client and use the imported function from embedded_invite module
        return await _create_embedded_invite_from_template(entity_id, entity_type, name, normalized_orders, token, client, ctx)
  • Core helper implementing the tool logic: creates document/group from template using _create_from_template, then creates embedded invite based on entity type (document or document_group), generates recipient links if needed, and reports progress via MCP context.
    async def _create_embedded_invite_from_template(
        entity_id: str,
        entity_type: Literal["template", "template_group"] | None,
        name: str | None,
        orders: list[EmbeddedInviteOrder],
        token: str,
        client: SignNowAPIClient,
        ctx: Context,
    ) -> CreateEmbeddedInviteFromTemplateResponse:
        """Private function to create document/group from template and create embedded invite immediately.
    
        Args:
            entity_id: ID of the template or template group
            entity_type: Type of entity: 'template' or 'template_group' (optional). If you're passing it, make sure you know what type you have. If it's not found, try using a different type.
            name: Optional name for the new document or document group
            orders: List of orders with recipients for the embedded invite
            token: Access token for SignNow API
            client: SignNow API client instance
            ctx: FastMCP context for progress reporting
    
        Returns:
            CreateEmbeddedInviteFromTemplateResponse with created entity info and embedded invite details
        """
        # Report initial progress
        await ctx.report_progress(progress=1, total=3)
    
        # Import and use the create from template function directly
        from .create_from_template import _create_from_template
    
        # Use the imported function to create from template
        created_entity = _create_from_template(entity_id, entity_type, name, token, client)
    
        # Report progress after template creation
        await ctx.report_progress(progress=2, total=3)
    
        if created_entity.entity_type == "document_group":
            # Create document group embedded invite
            document_group = client.get_document_group(token, created_entity.entity_id)
            invite_response = _create_document_group_embedded_invite(client, token, created_entity.entity_id, orders, document_group)
            # Report final progress after embedded invite creation
            await ctx.report_progress(progress=3, total=3)
            return CreateEmbeddedInviteFromTemplateResponse(
                created_entity_id=created_entity.entity_id,
                created_entity_type=created_entity.entity_type,
                created_entity_name=created_entity.name,
                invite_id=invite_response.invite_id,
                invite_entity=invite_response.invite_entity,
                recipient_links=invite_response.recipient_links,
            )
        else:
            # Create document embedded invite
            invite_response = _create_document_embedded_invite(client, token, created_entity.entity_id, orders)
            # Report final progress after embedded invite creation
            await ctx.report_progress(progress=3, total=3)
            return CreateEmbeddedInviteFromTemplateResponse(
                created_entity_id=created_entity.entity_id,
                created_entity_type=created_entity.entity_type,
                created_entity_name=created_entity.name,
                invite_id=invite_response.invite_id,
                invite_entity=invite_response.invite_entity,
                recipient_links=invite_response.recipient_links,
            )
  • Pydantic schema definitions for the tool's request and response models: CreateEmbeddedInviteFromTemplateRequest and CreateEmbeddedInviteFromTemplateResponse.
    class CreateEmbeddedInviteFromTemplateRequest(BaseModel):
        """Request model for creating document/group from template and creating embedded invite immediately."""
    
        entity_id: str = Field(..., description="ID of the template or template group")
        entity_type: str | None = Field(None, description="Type of entity: 'template' or 'template_group' (optional)")
        name: str | None = Field(None, description="Optional name for the new document or document group")
        orders: list[EmbeddedInviteOrder] = Field(default=[], description="List of orders with recipients for the embedded invite")
        redirect_uri: str | None = Field(None, description="Optional redirect URI after completion")
        redirect_target: str | None = Field(None, description="Optional redirect target: 'self', 'blank', or 'self' (default)")
        link_expiration: int | None = Field(None, ge=15, le=43200, description="Optional link expiration in minutes (15-43200)")
    
        def model_dump(self, **kwargs: Any) -> dict[str, Any]:
            """Override model_dump to exclude redirect_target if redirect_uri is not provided."""
            data = super().model_dump(**kwargs)
            if (not self.redirect_uri or not self.redirect_uri.strip()) and "redirect_target" in data:
                del data["redirect_target"]
            return data
    
    
    class CreateEmbeddedInviteFromTemplateResponse(BaseModel):
        """Response model for creating document/group from template and creating embedded invite immediately."""
    
        created_entity_id: str = Field(..., description="ID of the created document or document group")
        created_entity_type: str = Field(..., description="Type of created entity: 'document' or 'document_group'")
        created_entity_name: str = Field(..., description="Name of the created entity")
        invite_id: str = Field(..., description="ID of the created embedded invite")
        invite_entity: str = Field(..., description="Type of invite entity: 'document' or 'document_group'")
        recipient_links: list[dict[str, str]] = Field(..., description="Array of objects with role and link for recipients with delivery_type='link'")
Behavior2/5

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

No annotations are provided, so the description carries full burden. While it mentions the dual action (create from template + create invite), it doesn't disclose critical behavioral traits like whether this is a write operation, what permissions are required, whether it's idempotent, what happens on failure, or what the output contains. For a complex creation tool with no annotation coverage, this is a significant gap.

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 description is extremely concise (two sentences) and front-loaded with the core purpose. Every sentence earns its place: the first states what the tool does, the second provides critical usage guidance. Zero waste or redundancy.

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

Completeness3/5

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

Given the tool's complexity (creates documents/groups AND invites), no annotations, but with 100% schema coverage and an output schema (implied by 'Has output schema: true'), the description is minimally adequate. It covers purpose and usage well but lacks behavioral context that would be important for a creation tool. The output schema reduces the need to explain return values.

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 the schema already documents all 4 parameters thoroughly. The description adds no parameter-specific information beyond what's in the schema. According to guidelines, when schema coverage is high (>80%), the baseline is 3 even with no param info in description.

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 clearly states the specific action ('create document/group from template and create embedded invite immediately') and explicitly distinguishes it from its sibling 'create_embedded_invite' by specifying it's ONLY for templates/template groups. This provides precise verb+resource+scope differentiation.

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?

The description provides explicit usage guidance: 'This tool is ONLY for templates and template groups' and names the alternative tool ('create_embedded_invite') for documents/document groups. This gives clear when-to-use and when-not-to-use instructions with named alternatives.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/signnow/sn-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server