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

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'")

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/mihasicehcek/sn-mcp-server'

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