APITemplate.io MCP by usefulapi
Generate PDFs and images with APITemplate.io from templates, HTML, Markdown or a URL.
Should I use this
Quality & Safety
Findings (8)
- HIGH
- MEDIUMin apitemplate_create_pdf_from_html
- MEDIUMin apitemplate_create_pdf_from_markdown
- LOWin apitemplate_create_pdf_from_html
- LOWin apitemplate_create_pdf_from_markdown
- LOWin apitemplate_create_pdf_from_url
- INFOin apitemplate_create_pdf_from_html
- INFOin apitemplate_create_pdf_from_markdown
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"apitemplate": {
"url": "https://apitemplate.usefulapi.io/mcp"
}
}
}Remote endpoints
https://apitemplate.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (10)
🟢apitemplate_get_account
The APITemplate.io account behind this key: plan, subscription status and period, and the quota: api_quota, api_used, api_remaining (generations), plus the template quota and count. Check api_remaining before generating. GET /v2/account-information.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢apitemplate_list_templates(limit, offset, format, group_name, template_id)
List the templates of the account (PDF and image): template_id, name, format (PDF or JPEG), status, group and dates. Use the template_id with the create tools. Read-only; templates are never changed. GET /v2/list-templates.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Number of records, 1-500 (default 50).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"offset": {
"description": "Records to skip (default 0). Next page: offset + limit.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"format": {
"description": "Only PDF or only image (JPEG) templates.",
"type": "string",
"enum": [
"PDF",
"JPEG"
]
},
"group_name": {
"description": "Only templates of this group.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"template_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{4,64}$",
"description": "The template id (apitemplate_list_templates, or the web console, Manage Templates)."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢apitemplate_get_template(template_id)
One PDF template's HTML body, CSS and print settings (the vendor marks this endpoint experimental, so it can answer with an error for some accounts or image templates). Read-only. GET /v2/get-template.
Input Schema
{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{4,64}$",
"description": "The template id (apitemplate_list_templates, or the web console, Manage Templates)."
}
},
"required": [
"template_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢apitemplate_list_objects(limit, offset, template_id, transaction_type)
List the PDFs and images generated so far, newest first: transaction_ref, template_id, type (PDF, JPEG or MERGE), your meta reference, the hosted file URLs (primary_url, secondary_url for the PNG) and dates. Files already deleted or expired have deletion_status set. Read-only. GET /v2/list-objects.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Number of records, 1-500 (default 50).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"offset": {
"description": "Records to skip (default 0). Next page: offset + limit.",
"type": "integer",
"minimum": 0,
"maximum": 1000000
},
"template_id": {
"description": "Only files generated from this template.",
"type": "string",
"pattern": "^[A-Za-z0-9_-]{4,64}$"
},
"transaction_type": {
"description": "Only this kind of file.",
"type": "string",
"enum": [
"PDF",
"JPEG",
"MERGE"
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_create_pdf(template_id, data, filename, expiration, meta, ...)
WRITE: renders one PDF from a saved PDF template and your JSON data (the keys the template uses, e.g. invoice_number, items), and returns the hosted download_url (never the file bytes). Synchronous. COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/create-pdf (export_type=json).
Input Schema
{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{4,64}$",
"description": "The template id (apitemplate_list_templates, or the web console, Manage Templates)."
},
"data": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "JSON data merged into the template, e.g. {\"invoice_number\":\"INV-1\",\"total\":42}. Keys depend on the template."
},
"filename": {
"description": "Custom file name ending in .pdf (default: a random UUID).",
"type": "string",
"minLength": 1,
"maxLength": 150,
"pattern": "^[\\w .()-]+\\.pdf$"
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-10080.",
"type": "integer",
"minimum": 0,
"maximum": 10080
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"output_html": {
"description": "Also return html_url, the rendered HTML.",
"type": "boolean"
},
"generation_delay": {
"description": "Milliseconds to wait before rendering (0-30000), for pages that load content late.",
"type": "integer",
"minimum": 0,
"maximum": 30000
}
},
"required": [
"template_id",
"data"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_create_image(template_id, overrides, output_image_type, expiration, meta, ...)
WRITE: renders one image (JPEG and PNG) from a saved image template, changing the named layers with overrides (e.g. [{"name":"text_1","text":"Hello"},{"name":"image_1","src":"https://..."}]), and returns the hosted download URLs (never the file bytes). COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/create-image.
Input Schema
{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{4,64}$",
"description": "The template id (apitemplate_list_templates, or the web console, Manage Templates)."
},
"overrides": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Layer name in the template, e.g. text_1."
}
},
"required": [
"name"
],
"additionalProperties": {}
},
"description": "Layer changes: each item has the layer 'name' and the properties to set (text, src, color, textBackgroundColor ...)."
},
"output_image_type": {
"description": "Which formats to render (default all).",
"type": "string",
"enum": [
"all",
"jpegOnly",
"pngOnly"
]
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-10080.",
"type": "integer",
"minimum": 0,
"maximum": 10080
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"generation_delay": {
"description": "Milliseconds to wait before rendering (0-30000), for pages that load content late.",
"type": "integer",
"minimum": 0,
"maximum": 30000
}
},
"required": [
"template_id",
"overrides"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_create_pdf_from_html(body, css, data, settings, filename, ...)
WRITE: renders one PDF from HTML (Jinja2 placeholders like {{name}} are filled from data), without a saved template, and returns the hosted download_url (never the file bytes). COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/create-pdf-from-html (export_type=json).
Input Schema
{
"type": "object",
"properties": {
"body": {
"type": "string",
"minLength": 1,
"maxLength": 1000000,
"description": "HTML body; may use Jinja2 syntax such as {{name}}."
},
"css": {
"description": "CSS including the <style> tag.",
"type": "string",
"maxLength": 200000
},
"data": {
"description": "Values for the placeholders in body, e.g. {\"name\":\"Jo\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"settings": {
"description": "PDF print settings.",
"type": "object",
"properties": {
"paper_size": {
"description": "Paper size; 'custom' needs custom_width and custom_height.",
"type": "string",
"enum": [
"Letter",
"Legal",
"Tabloid",
"Ledger",
"A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"custom"
]
},
"custom_width": {
"description": "Width for paper_size custom, with a unit (mm, px or cm), e.g. 210mm.",
"type": "string",
"maxLength": 20
},
"custom_height": {
"description": "Height for paper_size custom, with a unit (mm, px or cm), e.g. 297mm.",
"type": "string",
"maxLength": 20
},
"orientation": {
"description": "1 = portrait, 2 = landscape.",
"type": "string",
"enum": [
"1",
"2"
]
},
"margin_top": {
"description": "Top margin, e.g. '40' (the vendor reference says mm).",
"type": "string",
"maxLength": 10
},
"margin_right": {
"description": "Right margin.",
"type": "string",
"maxLength": 10
},
"margin_bottom": {
"description": "Bottom margin.",
"type": "string",
"maxLength": 10
},
"margin_left": {
"description": "Left margin.",
"type": "string",
"maxLength": 10
},
"print_background": {
"description": "1 = print background colors and images.",
"type": "string",
"enum": [
"0",
"1"
]
},
"displayHeaderFooter": {
"description": "Show the header and footer.",
"type": "boolean"
},
"custom_header": {
"description": "Header HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"custom_footer": {
"description": "Footer HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"header_font_size": {
"description": "Header font size, e.g. '9px'.",
"type": "string",
"maxLength": 10
},
"rendering_engine_version": {
"description": "Rendering engine: 153 (default) or 97 (legacy).",
"type": "string",
"enum": [
"97",
"153"
]
},
"preferCSSPageSize": {
"description": "Let the CSS @page rule set page size and orientation (engine 153 only).",
"type": "boolean"
}
}
},
"filename": {
"description": "Custom file name ending in .pdf (default: a random UUID).",
"type": "string",
"minLength": 1,
"maxLength": 150,
"pattern": "^[\\w .()-]+\\.pdf$"
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-10080.",
"type": "integer",
"minimum": 0,
"maximum": 10080
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"generation_delay": {
"description": "Milliseconds to wait before rendering (0-30000), for pages that load content late.",
"type": "integer",
"minimum": 0,
"maximum": 30000
}
},
"required": [
"body"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_create_pdf_from_markdown(body, css, data, settings, filename, ...)
WRITE: renders one PDF from Markdown (Jinja2 placeholders like {{lang}} are filled from data) and returns the hosted download_url (never the file bytes). COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/create-pdf-from-markdown (export_type=json).
Input Schema
{
"type": "object",
"properties": {
"body": {
"type": "string",
"minLength": 1,
"maxLength": 1000000,
"description": "Markdown text; may use Jinja2 syntax such as {{lang}}."
},
"css": {
"description": "CSS including the <style> tag.",
"type": "string",
"maxLength": 200000
},
"data": {
"description": "Values for the placeholders in body.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"settings": {
"description": "PDF print settings.",
"type": "object",
"properties": {
"paper_size": {
"description": "Paper size; 'custom' needs custom_width and custom_height.",
"type": "string",
"enum": [
"Letter",
"Legal",
"Tabloid",
"Ledger",
"A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"custom"
]
},
"custom_width": {
"description": "Width for paper_size custom, with a unit (mm, px or cm), e.g. 210mm.",
"type": "string",
"maxLength": 20
},
"custom_height": {
"description": "Height for paper_size custom, with a unit (mm, px or cm), e.g. 297mm.",
"type": "string",
"maxLength": 20
},
"orientation": {
"description": "1 = portrait, 2 = landscape.",
"type": "string",
"enum": [
"1",
"2"
]
},
"margin_top": {
"description": "Top margin, e.g. '40' (the vendor reference says mm).",
"type": "string",
"maxLength": 10
},
"margin_right": {
"description": "Right margin.",
"type": "string",
"maxLength": 10
},
"margin_bottom": {
"description": "Bottom margin.",
"type": "string",
"maxLength": 10
},
"margin_left": {
"description": "Left margin.",
"type": "string",
"maxLength": 10
},
"print_background": {
"description": "1 = print background colors and images.",
"type": "string",
"enum": [
"0",
"1"
]
},
"displayHeaderFooter": {
"description": "Show the header and footer.",
"type": "boolean"
},
"custom_header": {
"description": "Header HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"custom_footer": {
"description": "Footer HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"header_font_size": {
"description": "Header font size, e.g. '9px'.",
"type": "string",
"maxLength": 10
},
"rendering_engine_version": {
"description": "Rendering engine: 153 (default) or 97 (legacy).",
"type": "string",
"enum": [
"97",
"153"
]
},
"preferCSSPageSize": {
"description": "Let the CSS @page rule set page size and orientation (engine 153 only).",
"type": "boolean"
}
}
},
"filename": {
"description": "Custom file name ending in .pdf (default: a random UUID).",
"type": "string",
"minLength": 1,
"maxLength": 150,
"pattern": "^[\\w .()-]+\\.pdf$"
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-10080.",
"type": "integer",
"minimum": 0,
"maximum": 10080
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"generation_delay": {
"description": "Milliseconds to wait before rendering (0-30000), for pages that load content late.",
"type": "integer",
"minimum": 0,
"maximum": 30000
}
},
"required": [
"body"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_create_pdf_from_url(url, settings, filename, expiration, meta, ...)
WRITE: APITemplate.io opens one public web page URL and prints it to a PDF, and returns the hosted download_url (never the file bytes). The page is fetched by APITemplate.io, not by this server; pages that need a login cannot be printed. COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/create-pdf-from-url (export_type=json).
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The public http(s) URL of the page to print."
},
"settings": {
"description": "PDF print settings.",
"type": "object",
"properties": {
"paper_size": {
"description": "Paper size; 'custom' needs custom_width and custom_height.",
"type": "string",
"enum": [
"Letter",
"Legal",
"Tabloid",
"Ledger",
"A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"custom"
]
},
"custom_width": {
"description": "Width for paper_size custom, with a unit (mm, px or cm), e.g. 210mm.",
"type": "string",
"maxLength": 20
},
"custom_height": {
"description": "Height for paper_size custom, with a unit (mm, px or cm), e.g. 297mm.",
"type": "string",
"maxLength": 20
},
"orientation": {
"description": "1 = portrait, 2 = landscape.",
"type": "string",
"enum": [
"1",
"2"
]
},
"margin_top": {
"description": "Top margin, e.g. '40' (the vendor reference says mm).",
"type": "string",
"maxLength": 10
},
"margin_right": {
"description": "Right margin.",
"type": "string",
"maxLength": 10
},
"margin_bottom": {
"description": "Bottom margin.",
"type": "string",
"maxLength": 10
},
"margin_left": {
"description": "Left margin.",
"type": "string",
"maxLength": 10
},
"print_background": {
"description": "1 = print background colors and images.",
"type": "string",
"enum": [
"0",
"1"
]
},
"displayHeaderFooter": {
"description": "Show the header and footer.",
"type": "boolean"
},
"custom_header": {
"description": "Header HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"custom_footer": {
"description": "Footer HTML (with its CSS).",
"type": "string",
"maxLength": 20000
},
"header_font_size": {
"description": "Header font size, e.g. '9px'.",
"type": "string",
"maxLength": 10
},
"rendering_engine_version": {
"description": "Rendering engine: 153 (default) or 97 (legacy).",
"type": "string",
"enum": [
"97",
"153"
]
},
"preferCSSPageSize": {
"description": "Let the CSS @page rule set page size and orientation (engine 153 only).",
"type": "boolean"
}
}
},
"filename": {
"description": "Custom file name ending in .pdf (default: a random UUID).",
"type": "string",
"minLength": 1,
"maxLength": 150,
"pattern": "^[\\w .()-]+\\.pdf$"
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-10080.",
"type": "integer",
"minimum": 0,
"maximum": 10080
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"generation_delay": {
"description": "Milliseconds to wait before rendering (0-30000), for pages that load content late.",
"type": "integer",
"minimum": 0,
"maximum": 30000
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡apitemplate_merge_pdfs(urls, expiration, meta)
WRITE: joins 2-20 PDFs (public http(s) URLs, in the given order, e.g. earlier download_url values) into one PDF and returns the hosted primary_url (never the file bytes). The source files are not changed or deleted. COST: uses 1 generation of your APITemplate.io plan quota per call (see apitemplate_get_account). Do not retry or repeat it unless needed; every call is counted. POST /v2/merge-pdfs (export_type=json).
Input Schema
{
"type": "object",
"properties": {
"urls": {
"minItems": 2,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"description": "The PDF URLs to join, in order."
},
"expiration": {
"description": "Minutes until the hosted file expires: 0 = keep permanently (default), or 1-43200.",
"type": "integer",
"minimum": 0,
"maximum": 43200
},
"meta": {
"description": "Your own reference id for this file; it shows up in apitemplate_list_objects.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"urls"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence