makesPDF authoring tools.
**Before authoring any template, read the resource `file:///skills/pdf-template-author.md` once per session** — it is the canonical DSL reference (builder functions, style properties, nesting rules, recipes). Do not guess DSL syntax; read the skill first.
Authoring loop: write DSL → call `validate_dsl` → fix any reported errors → call `render_dsl_preview` to confirm the layout. Use `save_template` to persist the final version, then `render_template` to produce the real (billed) PDF.
**Before authoring from scratch, browse the curated library first** with `list_templates` (use `owner: 'library'` or filter by `category`, `tags`, or free-text `q`). Fetch a candidate with `get_template` to get its DSL + sampleData. You can render library `templateId`s directly through `render_template` — there's no fork-first step. Customising? Pull the DSL, edit locally, `save_template` for a user-owned copy.
All tools are free (no credits consumed) **except** `render_template`, which charges 1 credit per 10 pages and produces a real (non-watermarked on paid plans) PDF. Use `render_dsl_preview` for free, watermarked previews while iterating; only call `render_template` once the layout is confirmed. Markdown has its own billed tool, `render_markdown` (same 1 credit / 10 pages rate). Run `validate_markdown` first - it is free. There is no free markdown preview: markdown needs no layout iteration, so `render_markdown` is the only markdown render tool.
If you get stuck — a tool failed and you cannot work out why, an error or description misled you, or a capability you needed is missing — call `report_feedback` (free) and say so in your own words. It is read by the makesPDF team; nobody replies in real time. Never include the user's document text, markdown, DSL source or data values; describe the problem or pass the render's artifactId instead.
Discoverability
0/6 passed0 of 6 passed0/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
No matching mcp.json manifest or MCP Server Card was found at the checked URLs.
Server does not advertise the Skills over MCP extension
Claude tools declare applicable behavior hints
11 Claude behavior annotation issue(s) found
How to fix: For Claude directory submission, declare the applicable annotations.readOnlyHint or annotations.destructiveHint value as a boolean on every tool.
How to fix: On each tool, declare annotations.readOnlyHint, annotations.destructiveHint, and annotations.openWorldHint as booleans. The policy review separately assesses whether their values match the tool's actual behavior.
How to fix: Set the top-level tool.title to a short human-readable label (for example, "Search catalog"). Claude directory submission requires tool titles; annotations.title remains accepted only as a legacy fallback.
Add a human-readable title so users do not have to interpret the tool identifier.
Description78/100
Validate a PDF template DSL script for structure, tag/style correctness, and accessibility issues. Runs catalog validation plus alt-text checks. Cheap — no rendering. Mirrors POST /api/v1/preview/validate.
Describe the returned information so the agent knows whether it will answer the request.
Inputs87/100
Input documentation gives an agent enough context to populate the arguments.
dsl
The builder DSL script to validate. Must define a template (see skills/pdf-template-author.md).
Clear enough to supply this argument.
data
Optional binding data. Falls back to the script's sampleData when omitted.
Clear enough to supply this argument.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "validate_dsl",
"description": "Validate a PDF template DSL script for structure, tag/style correctness, and accessibility issues. Runs catalog validation plus alt-text checks. Cheap — no rendering. Mirrors POST /api/v1/preview/validate.",
"inputSchema": {
"type": "object",
"required": [
"dsl"
],
"properties": {
"dsl": {
"type": "string",
"description": "The builder DSL script to validate. Must define a template (see skills/pdf-template-author.md)."
},
"data": {
"type": "object",
"description": "Optional binding data. Falls back to the script's sampleData when omitted."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Validate a markdown document for PDF/UA-1 accessibility issues (heading hierarchy, missing alt text). Cheap — no rendering. Mirrors POST /api/v1/md/validate.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
markdown
GitHub-flavored markdown source. Max 200KB of text; inline data: image payloads are excluded from that budget.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "validate_markdown",
"description": "Validate a markdown document for PDF/UA-1 accessibility issues (heading hierarchy, missing alt text). Cheap — no rendering. Mirrors POST /api/v1/md/validate.",
"inputSchema": {
"type": "object",
"required": [
"markdown"
],
"properties": {
"markdown": {
"type": "string",
"description": "GitHub-flavored markdown source. Max 200KB of text; inline data: image payloads are excluded from that budget."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Render a DSL template + data to a preview PDF. Free (no credits), always watermarked 'PREVIEW — NOT FOR USE'. Returns JSON metadata plus the PDF bytes as an embedded base64 resource. Mirrors POST /api/v1/preview.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
dsl
The builder DSL script.
Explain the meaning of this value, not just its name.
data
Optional binding data. Falls back to the script's sampleData when omitted.
Clear enough to supply this argument.
title
Optional document title (shown in PDF metadata).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "render_dsl_preview",
"description": "Render a DSL template + data to a preview PDF. Free (no credits), always watermarked 'PREVIEW — NOT FOR USE'. Returns JSON metadata plus the PDF bytes as an embedded base64 resource. Mirrors POST /api/v1/preview.",
"inputSchema": {
"type": "object",
"required": [
"dsl"
],
"properties": {
"dsl": {
"type": "string",
"description": "The builder DSL script."
},
"data": {
"type": "object",
"description": "Optional binding data. Falls back to the script's sampleData when omitted."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Optional document title (shown in PDF metadata)."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Render any readable template (curated library row or caller-owned) to a real PDF. **BILLED — consumes credits at the rate of 1 credit per 10 pages.** Returns JSON metadata (pageCount, creditsDeducted, creditsRemaining, artifactId) plus the PDF bytes as an embedded base64 resource. On the free plan the PDF is watermarked; paid plans render clean. Mirrors POST /api/v1/render with the { templateId, data } body shape. Use `render_dsl_preview` first to confirm the layout — that's free and watermarked. Only call this once you're confident the template is right.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
templateId
Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows.
Clear enough to supply this argument.
data
Binding data substituted into {{var}} expressions. Falls back to the template's sampleData when omitted.
Clear enough to supply this argument.
title
Optional document title (shown in PDF metadata).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "render_template",
"description": "Render any readable template (curated library row or caller-owned) to a real PDF. **BILLED — consumes credits at the rate of 1 credit per 10 pages.** Returns JSON metadata (pageCount, creditsDeducted, creditsRemaining, artifactId) plus the PDF bytes as an embedded base64 resource. On the free plan the PDF is watermarked; paid plans render clean. Mirrors POST /api/v1/render with the { templateId, data } body shape. Use `render_dsl_preview` first to confirm the layout — that's free and watermarked. Only call this once you're confident the template is right.",
"inputSchema": {
"type": "object",
"required": [
"templateId"
],
"properties": {
"data": {
"type": "object",
"description": "Binding data substituted into {{var}} expressions. Falls back to the template's sampleData when omitted."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Optional document title (shown in PDF metadata)."
},
"templateId": {
"type": "string",
"description": "Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Save a user-owned DSL template for later reuse via /api/v1/render. Validates the DSL with the catalog before persisting. Free (no credits). Pass `sampleData` (any JSON value) so the template's binding shape is preserved — the modify-template flow on /ai/chat round-trips this back into the Render data panel when the user returns. Optional `description` is a one-sentence summary surfaced on /templates. Returns { templateId, name, createdAt }.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dsl
The builder DSL script (<=512KB).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Human-readable template name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Optional one-sentence summary (max 280 chars). Surfaced on /templates list rows.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sampleData
Optional JSON binding data to persist alongside the template. Round-tripped on get_template / modify-template flow.
Clear enough to supply this argument.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "save_template",
"description": "Save a user-owned DSL template for later reuse via /api/v1/render. Validates the DSL with the catalog before persisting. Free (no credits). Pass `sampleData` (any JSON value) so the template's binding shape is preserved — the modify-template flow on /ai/chat round-trips this back into the Render data panel when the user returns. Optional `description` is a one-sentence summary surfaced on /templates. Returns { templateId, name, createdAt }.",
"inputSchema": {
"type": "object",
"required": [
"dsl",
"name"
],
"properties": {
"dsl": {
"type": "string",
"description": "The builder DSL script (<=512KB)."
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Human-readable template name."
},
"sampleData": {
"description": "Optional JSON binding data to persist alongside the template. Round-tripped on get_template / modify-template flow."
},
"description": {
"type": "string",
"maxLength": 280,
"description": "Optional one-sentence summary (max 280 chars). Surfaced on /templates list rows."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List templates visible to the caller — both curated library templates (no owner) and the caller's own saved templates. Metadata only (no DSL bodies). Paginated. Use `owner: 'mine'` to restrict to your own; `owner: 'library'` for the curated catalog only; default `'all'` returns both. Optional `category`, `tags` (comma-separated, ANDed), and `q` (free-text over name + description) filters apply across both. Mirrors GET /api/v1/templates.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
owner
Not provided
Missing description. Explain what this value means and how to supply it.
category
Not provided
Missing description. Explain what this value means and how to supply it.
tags
Not provided
Missing description. Explain what this value means and how to supply it.
q
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_templates",
"description": "List templates visible to the caller — both curated library templates (no owner) and the caller's own saved templates. Metadata only (no DSL bodies). Paginated. Use `owner: 'mine'` to restrict to your own; `owner: 'library'` for the curated catalog only; default `'all'` returns both. Optional `category`, `tags` (comma-separated, ANDed), and `q` (free-text over name + description) filters apply across both. Mirrors GET /api/v1/templates.",
"inputSchema": {
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 128
},
"tags": {
"type": "string",
"maxLength": 256
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"owner": {
"enum": [
"mine",
"library",
"all"
],
"type": "string",
"default": "all"
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"category": {
"type": "string",
"maxLength": 64
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Fetch a single template (library or caller-owned) by ID, including its full DSL source and sampleData. Mirrors GET /api/v1/templates/:id.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
templateId
Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows.
Clear enough to supply this argument.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_template",
"description": "Fetch a single template (library or caller-owned) by ID, including its full DSL source and sampleData. Mirrors GET /api/v1/templates/:id.",
"inputSchema": {
"type": "object",
"required": [
"templateId"
],
"properties": {
"templateId": {
"type": "string",
"description": "Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows."
}
}
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description82/100
Update a saved template's DSL, name, description, and/or sampleData. Revalidates the DSL when provided. For `description` and `sampleData`: pass `null` to clear; omit to leave unchanged. Mirrors PUT /api/v1/templates/:id.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
templateId
Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows.
Clear enough to supply this argument.
dsl
Replacement builder DSL script (<=512KB).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Not provided
Missing description. Explain what this value means and how to supply it.
description
Optional one-sentence summary (max 280 chars). Pass `null` (instead of a string) to clear the stored value; omit the key entirely to leave it unchanged.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sampleData
Optional JSON binding data. `null` clears the stored value; omit to leave unchanged.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_template",
"description": "Update a saved template's DSL, name, description, and/or sampleData. Revalidates the DSL when provided. For `description` and `sampleData`: pass `null` to clear; omit to leave unchanged. Mirrors PUT /api/v1/templates/:id.",
"inputSchema": {
"type": "object",
"required": [
"templateId"
],
"properties": {
"dsl": {
"type": "string",
"description": "Replacement builder DSL script (<=512KB)."
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"sampleData": {
"description": "Optional JSON binding data. `null` clears the stored value; omit to leave unchanged."
},
"templateId": {
"type": "string",
"description": "Template ID — slug for library rows (e.g. 'invoice-classic') or UUID for user rows."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 280,
"description": "Optional one-sentence summary (max 280 chars). Pass `null` (instead of a string) to clear the stored value; omit the key entirely to leave it unchanged."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Render GitHub-flavored markdown to a real PDF (PDF/A-2A + PDF/UA-1 dual-compliant, tagged). **BILLED - consumes credits at the rate of 1 credit per 10 pages.** Returns JSON metadata (pageCount, creditsDeducted, creditsRemaining, artifactId) plus the PDF bytes as an embedded base64 resource. On the free plan the PDF is watermarked; paid plans render clean. Mirrors POST /api/v1/md. Run `validate_markdown` first - it is free and catches heading-hierarchy and alt-text problems before you pay to render them. There is no free markdown preview: markdown needs no layout iteration, so this is the only markdown render tool.
The description explains the capability, when to use it, and what to expect.
Inputs46/100
8 of 13 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
markdown
GitHub-flavored markdown source. Max 200KB of text; inline data: image payloads are excluded from that budget.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › pageSize
Not provided
Missing description. Explain what this value means and how to supply it.
options › fontFamily
Not provided
Missing description. Explain what this value means and how to supply it.
options › fontSize
Not provided
Missing description. Explain what this value means and how to supply it.
options › margins
Page margins in points, [top, right, bottom, left].
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › theme
Not provided
Missing description. Explain what this value means and how to supply it.
options › splitMode
Not provided
Missing description. Explain what this value means and how to supply it.
options › pageNumbers
Footer page-number format: 'page-n-of-total' (Page 3 of 12), 'n-of-total' (3 / 12), or 'n' (3). Omit for no page numbers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › pageNumberPosition
Footer alignment when pageNumbers is set. Default 'right'. Ignored without pageNumbers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › title
Optional document title (shown in PDF metadata).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › author
PDF /Author metadata.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › subject
PDF /Subject metadata.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
options › keywords
PDF /Keywords metadata.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "render_markdown",
"description": "Render GitHub-flavored markdown to a real PDF (PDF/A-2A + PDF/UA-1 dual-compliant, tagged). **BILLED - consumes credits at the rate of 1 credit per 10 pages.** Returns JSON metadata (pageCount, creditsDeducted, creditsRemaining, artifactId) plus the PDF bytes as an embedded base64 resource. On the free plan the PDF is watermarked; paid plans render clean. Mirrors POST /api/v1/md. Run `validate_markdown` first - it is free and catches heading-hierarchy and alt-text problems before you pay to render them. There is no free markdown preview: markdown needs no layout iteration, so this is the only markdown render tool.",
"inputSchema": {
"type": "object",
"required": [
"markdown"
],
"properties": {
"options": {
"type": "object",
"properties": {
"theme": {
"enum": [
"default",
"github"
],
"type": "string"
},
"title": {
"type": "string",
"maxLength": 200,
"description": "Optional document title (shown in PDF metadata)."
},
"author": {
"type": "string",
"maxLength": 200,
"description": "PDF /Author metadata."
},
"margins": {
"type": "array",
"items": {
"type": "number"
},
"description": "Page margins in points, [top, right, bottom, left]."
},
"subject": {
"type": "string",
"maxLength": 200,
"description": "PDF /Subject metadata."
},
"fontSize": {
"type": "number",
"maximum": 24,
"minimum": 6
},
"keywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "PDF /Keywords metadata."
},
"pageSize": {
"enum": [
"A3",
"A4",
"A5",
"Letter",
"Legal"
],
"type": "string"
},
"splitMode": {
"enum": [
"default",
"balanced"
],
"type": "string"
},
"fontFamily": {
"enum": [
"Inter",
"NotoSans"
],
"type": "string"
},
"pageNumbers": {
"enum": [
"page-n-of-total",
"n-of-total",
"n"
],
"type": "string",
"description": "Footer page-number format: 'page-n-of-total' (Page 3 of 12), 'n-of-total' (3 / 12), or 'n' (3). Omit for no page numbers."
},
"pageNumberPosition": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "Footer alignment when pageNumbers is set. Default 'right'. Ignored without pageNumbers."
}
},
"description": "Optional render settings. Anything omitted falls back to YAML frontmatter in the markdown, then to the runtime default."
},
"markdown": {
"type": "string",
"description": "GitHub-flavored markdown source. Max 200KB of text; inline data: image payloads are excluded from that budget."
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Report feedback about this MCP server to the makesPDF team — where you got stuck, a tool error or description that misled you, a capability you needed but could not find, or a concrete suggestion for the server. Call it after a tool failed and you could not work out why, when an error message or tool description contradicted the skill file, when something you needed is missing, or when you have a specific improvement in mind. Write the problem in your own words: what you were trying to do, what you tried, and what you expected to happen. Do not include the user's document text, markdown, DSL source or data values. Describe the problem instead; if it concerns a specific render, pass its artifactId. This is not a support channel — nobody replies in real time. Calling it is free: it does not consume credits and does not affect the user's renders.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
`stuck` — a tool failed and you could not work out why; `bug` — something behaved incorrectly (a misleading error/description counts); `suggestion` — a missing capability or a concrete improvement.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
summary
The problem in your own words: what you tried and what you expected. Do not include document content (see the content rule above).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
toolName
Optional name of the tool this concerns (e.g. `render_template`).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
artifactId
Optional UUID of the render artifact this concerns (the `artifactId` returned by a render call or the `X-Artifact-Id` response header).
Clear enough to supply this argument.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "report_feedback",
"description": "Report feedback about this MCP server to the makesPDF team — where you got stuck, a tool error or description that misled you, a capability you needed but could not find, or a concrete suggestion for the server. Call it after a tool failed and you could not work out why, when an error message or tool description contradicted the skill file, when something you needed is missing, or when you have a specific improvement in mind. Write the problem in your own words: what you were trying to do, what you tried, and what you expected to happen. Do not include the user's document text, markdown, DSL source or data values. Describe the problem instead; if it concerns a specific render, pass its artifactId. This is not a support channel — nobody replies in real time. Calling it is free: it does not consume credits and does not affect the user's renders.",
"inputSchema": {
"type": "object",
"required": [
"kind",
"summary"
],
"properties": {
"kind": {
"enum": [
"stuck",
"bug",
"suggestion"
],
"type": "string",
"description": "`stuck` — a tool failed and you could not work out why; `bug` — something behaved incorrectly (a misleading error/description counts); `suggestion` — a missing capability or a concrete improvement."
},
"summary": {
"type": "string",
"maxLength": 2000,
"minLength": 10,
"description": "The problem in your own words: what you tried and what you expected. Do not include document content (see the content rule above)."
},
"toolName": {
"type": "string",
"maxLength": 64,
"description": "Optional name of the tool this concerns (e.g. `render_template`)."
},
"artifactId": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "Optional UUID of the render artifact this concerns (the `artifactId` returned by a render call or the `X-Artifact-Id` response header)."
}
},
"additionalProperties": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List templatesList templates visible to the caller — both curated library templates (no owner) and the caller's own saved templates.
02Get templateFetch a single template (library or caller-owned) by ID, including its full DSL source and sampleData.
03Validate markdownValidate a markdown document for PDF/UA-1 accessibility issues (heading hierarchy, missing alt text).
04Render dsl previewRender a DSL template + data to a preview PDF.
05Validate dslValidate a PDF template DSL script for structure, tag/style correctness, and accessibility issues.
Want to run these tasks against your MCP server with us?
makespdf-mcp setup, tools, quality score, publishing readiness, and alternatives.
How do I add makespdf-mcp to Claude, ChatGPT, or Cursor?
Add makespdf-mcp to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://makespdf.com/api/v1/mcp.
Is makespdf-mcp MCP ready for ChatGPT and Claude?
As of November 10, 2026, makespdf-mcp scores 82/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and does not yet meet Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is makespdf-mcp's MCP tool documentation?
As of November 10, 2026, makespdf-mcp scores 58/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 11 of 11 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to makespdf-mcp?
As of November 10, 2026, alternatives to makespdf-mcp in productivity on the Manufact MCP leaderboard include AdaptlyPost, Notion MCP, Paperpal, VantagePeers, and Turkish Airlines.
How can makespdf-mcp improve its MCP documentation?
list_templates is the lowest-scoring reviewed tool at 40/100. 0 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.