Koskamo

Penline Handwriting Sheets MCP

Generates custom tracing worksheets and blank practice paper as vector PDFs for letters, words, sentences, and names. Supports solid top/baseline guides, optional dashed midlines, and various paper sizes like Letter and A4 in portrait or landscape orientations.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Penline Handwriting Sheets MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://handwriting-sheets.zovo.one/mcp
Vendor documentation

What you can do with it

  • Create name tracing worksheets with alternating trace and blank rows
  • Generate word tracing with automatic repetitions to fill rows
  • Produce blank lined practice paper with specific body height and midline options

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
handwriting-sheets 1.0.0
MCP protocol
2025-06-18
Tools
3 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Generate printable handwriting PDFs and share the PDF link. Print (manuscript) letters only; no cursive. Supported Latin, Greek and Cyrillic text, with word wrapping. Omitted repetitions fill each tracing row with a body-height gap; explicit repetitions 1 to 4 are respected. Each tracing row is followed by a blank copy row. Name sheets alternate trace and blank rows; lines means total writing rows. Never substitute unsupported characters silently.

Tools

3 advertised

generate_handwriting_sheet — Generate handwriting sheet
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants handwriting worksheets, tracing worksheets, letter tracing or handwriting practice sheets as a printable vector PDF. Supports up to 600 characters and word wrapping. Repeats text to fill each tracing row when repetitions are omitted, or uses an explicit one to four copies, followed by a blank copy row. Does not support cursive. Print letters only. Latin, Greek and Cyrillic supported. Oversized words produce a clear error.

generate_handwriting_sheet input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "text"
  ],
  "properties": {
    "text": {
      "type": "string",
      "description": "Letters, words or sentences to trace, up to 600 characters. Example: The cat sat."
    },
    "paper": {
      "type": "string",
      "description": "Paper: Letter or A4. Example: Letter. Default Letter."
    },
    "title": {
      "type": "string",
      "description": "Optional page title, up to 80 supported characters. Example: Letter practice."
    },
    "line_size": {
      "type": "number",
      "description": "Capital-to-baseline body height in inches: 0.5, 0.625, 0.75 or 1.0. Example: 0.5. Default 0.5."
    },
    "name_date": {
      "type": "boolean",
      "description": "Print a blank name and date line. Example: true. Default false."
    },
    "orientation": {
      "type": "string",
      "description": "Page direction: portrait or landscape. Example: portrait. Default portrait."
    },
    "repetitions": {
      "type": "number",
      "description": "Whole-number repetitions per tracing row, 1 to 4; each row is followed by a blank copy row. Example: 2. Omit to repeat as many copies as fit, with one body-height gap."
    },
    "trace_style": {
      "type": "string",
      "description": "Tracing style: dotted, light_grey or outline. Example: dotted. Default dotted."
    }
  }
}
generate_handwriting_sheet output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "page_count",
    "paper",
    "orientation",
    "line_size",
    "body_height_pt",
    "margin_pt",
    "total_rows",
    "trace_rows",
    "copy_rows",
    "repetitions",
    "repetition_counts",
    "rows_per_page",
    "page_size_pt",
    "guide_positions_pt",
    "trace_style",
    "midline",
    "downloads"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "paper": {
      "type": "string"
    },
    "midline": {
      "type": "boolean"
    },
    "copy_rows": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "pdf"
      ],
      "properties": {
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "line_size": {
      "type": "number"
    },
    "margin_pt": {
      "type": "number"
    },
    "page_count": {
      "type": "number"
    },
    "total_rows": {
      "type": "number"
    },
    "trace_rows": {
      "type": "number"
    },
    "orientation": {
      "type": "string"
    },
    "repetitions": {
      "type": "number"
    },
    "trace_style": {
      "type": "string"
    },
    "page_size_pt": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "rows_per_page": {
      "type": "number"
    },
    "body_height_pt": {
      "type": "number"
    },
    "repetition_counts": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "guide_positions_pt": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "top",
          "midline",
          "baseline",
          "descender_bottom"
        ],
        "properties": {
          "top": {
            "type": "number"
          },
          "midline": {
            "type": [
              "number",
              "null"
            ]
          },
          "baseline": {
            "type": "number"
          },
          "descender_bottom": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
generate_handwriting_sheet annotations
{
  "title": "Generate handwriting sheet",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_name_tracing_sheet — Generate name tracing sheet
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants name tracing worksheets or a custom tracing worksheet as a printable PDF. Supports a name up to 40 characters and 1 to 30 total writing rows, alternating trace and blank rows starting with trace. Does not support cursive. Print letters only. Latin, Greek and Cyrillic supported. A name must fit one row at the chosen size.

generate_name_tracing_sheet input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Name to trace, up to 40 characters. Example: Emma."
    },
    "lines": {
      "type": "number",
      "description": "Total writing rows, alternating trace and blank; 1 to 30. Example: 6. Default 6."
    },
    "paper": {
      "type": "string",
      "description": "Paper: Letter or A4. Example: Letter. Default Letter."
    },
    "title": {
      "type": "string",
      "description": "Optional page title, up to 80 supported characters. Example: Letter practice."
    },
    "line_size": {
      "type": "number",
      "description": "Capital-to-baseline body height in inches: 0.5, 0.625, 0.75 or 1.0. Example: 0.5. Default 0.5."
    },
    "name_date": {
      "type": "boolean",
      "description": "Print a blank name and date line. Example: true. Default false."
    },
    "orientation": {
      "type": "string",
      "description": "Page direction: portrait or landscape. Example: portrait. Default portrait."
    },
    "repetitions": {
      "type": "number",
      "description": "Optional whole-number copies per tracing row, 1 to 4. Example: 2. Omit to fill the row with a body-height gap between copies."
    },
    "trace_style": {
      "type": "string",
      "description": "Tracing style: dotted, light_grey or outline. Example: dotted. Default dotted."
    }
  }
}
generate_name_tracing_sheet output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "page_count",
    "paper",
    "orientation",
    "line_size",
    "body_height_pt",
    "margin_pt",
    "total_rows",
    "trace_rows",
    "copy_rows",
    "repetitions",
    "repetition_counts",
    "rows_per_page",
    "page_size_pt",
    "guide_positions_pt",
    "trace_style",
    "midline",
    "downloads"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "paper": {
      "type": "string"
    },
    "midline": {
      "type": "boolean"
    },
    "copy_rows": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "pdf"
      ],
      "properties": {
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "line_size": {
      "type": "number"
    },
    "margin_pt": {
      "type": "number"
    },
    "page_count": {
      "type": "number"
    },
    "total_rows": {
      "type": "number"
    },
    "trace_rows": {
      "type": "number"
    },
    "orientation": {
      "type": "string"
    },
    "repetitions": {
      "type": "number"
    },
    "trace_style": {
      "type": "string"
    },
    "page_size_pt": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "rows_per_page": {
      "type": "number"
    },
    "body_height_pt": {
      "type": "number"
    },
    "repetition_counts": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "guide_positions_pt": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "top",
          "midline",
          "baseline",
          "descender_bottom"
        ],
        "properties": {
          "top": {
            "type": "number"
          },
          "midline": {
            "type": [
              "number",
              "null"
            ]
          },
          "baseline": {
            "type": "number"
          },
          "descender_bottom": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
generate_name_tracing_sheet annotations
{
  "title": "Generate name tracing sheet",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_lined_paper — Generate lined paper
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants printable lined paper or kindergarten writing paper as a vector PDF. Produces 1 to 20 pages with solid top and baseline guides, descender space and an optional dashed midline. Four body heights, Letter or A4, portrait or landscape. Does not produce cursive examples.

generate_lined_paper input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "pages": {
      "type": "number",
      "description": "Number of blank practice pages, whole number 1 to 20. Example: 2. Default 1."
    },
    "paper": {
      "type": "string",
      "description": "Paper: Letter or A4. Example: Letter. Default Letter."
    },
    "title": {
      "type": "string",
      "description": "Optional page title, up to 80 supported characters. Example: Letter practice."
    },
    "midline": {
      "type": "boolean",
      "description": "Include the dashed guide halfway between top and baseline. Example: true. Default true."
    },
    "line_size": {
      "type": "number",
      "description": "Capital-to-baseline body height in inches: 0.5, 0.625, 0.75 or 1.0. Example: 0.5. Default 0.5."
    },
    "orientation": {
      "type": "string",
      "description": "Page direction: portrait or landscape. Example: portrait. Default portrait."
    }
  }
}
generate_lined_paper output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "page_count",
    "paper",
    "orientation",
    "line_size",
    "body_height_pt",
    "margin_pt",
    "total_rows",
    "trace_rows",
    "copy_rows",
    "repetitions",
    "repetition_counts",
    "rows_per_page",
    "page_size_pt",
    "guide_positions_pt",
    "trace_style",
    "midline",
    "downloads"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "paper": {
      "type": "string"
    },
    "midline": {
      "type": "boolean"
    },
    "copy_rows": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "pdf"
      ],
      "properties": {
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "line_size": {
      "type": "number"
    },
    "margin_pt": {
      "type": "number"
    },
    "page_count": {
      "type": "number"
    },
    "total_rows": {
      "type": "number"
    },
    "trace_rows": {
      "type": "number"
    },
    "orientation": {
      "type": "string"
    },
    "repetitions": {
      "type": "number"
    },
    "trace_style": {
      "type": "string"
    },
    "page_size_pt": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "rows_per_page": {
      "type": "number"
    },
    "body_height_pt": {
      "type": "number"
    },
    "repetition_counts": {
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "guide_positions_pt": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "top",
          "midline",
          "baseline",
          "descender_bottom"
        ],
        "properties": {
          "top": {
            "type": "number"
          },
          "midline": {
            "type": [
              "number",
              "null"
            ]
          },
          "baseline": {
            "type": "number"
          },
          "descender_bottom": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
generate_lined_paper annotations
{
  "title": "Generate lined paper",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

handwriting-sheets-widget — Penline Handwriting Sheets view

Advertised by the server during the last successful anonymous check.

Interactive view for Penline Handwriting Sheets.

handwriting-sheets-widget URI
ui://widget/handwriting-sheets-v5-1.0.0-bafffdd965153b78d295d84220d8d763885a2a23ec08410d1ace0abce8e174e9.html

MIME type: text/html;profile=mcp-app

handwriting-sheets-widget-legacy — Penline Handwriting Sheets view (previous versions)

Advertised by the server during the last successful anonymous check.

handwriting-sheets-widget-legacy URI template
ui://widget/handwriting-sheets-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
856 ms
95th percentile latency
856 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 856 ms · metadata changed · 3 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http penline-handwriting-sheets-mcp https://handwriting-sheets.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add penline-handwriting-sheets-mcp --url https://handwriting-sheets.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable penline-handwriting-sheets-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "penline-handwriting-sheets-mcp": {
      "url": "https://handwriting-sheets.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "penline-handwriting-sheets-mcp": {
      "type": "streamableHttp",
      "url": "https://handwriting-sheets.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start penline-handwriting-sheets-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "penline-handwriting-sheets-mcp": {
      "type": "http",
      "url": "https://handwriting-sheets.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http penline-handwriting-sheets-mcp https://handwriting-sheets.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "penline-handwriting-sheets-mcp": {
      "url": "https://handwriting-sheets.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "penline-handwriting-sheets-mcp": {
      "serverUrl": "https://handwriting-sheets.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Penline Handwriting Sheets MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.