Mathter MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Mathter MCP Servermake a grade 4 times-tables worksheet pack with answer keys"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mathter-mcp
Ask your AI assistant for a math worksheet pack. Get a printable PDF on your computer.
"Make me a grade 4 times-tables pack for Friday."
→
mathter-grade-4-multiplication-2026-10-04-1532.pdfin your Downloads folder, answer keys included. (Cover and lesson pages come with the Standard plan and up.)
This is a small Model Context Protocol server that connects Mathter to Claude Desktop, Claude Code, Cursor, or any other MCP client. It does one thing: it turns a plain-English request into a real worksheet pack from your own Mathter account, saved as a file you can open and print.
You need a Mathter account and an API key. Both are free to start: the free plan makes packs of up to 2 worksheets with answer keys, and paid plans raise the size and add cover and lesson pages.
Setup (about two minutes)
1. Get your key
Sign in at mathter.ca/account, find API access, and create a
key. It looks like mk_live_… and is shown once — copy it before you close the page. If you
lose it, revoke it and make another; that is normal and costs nothing.
2. Tell your assistant about it
Claude Desktop — open Settings → Developer → Edit Config, and add the
mathter entry to the mcpServers section (or merge this block into your config file). If the
file already holds other settings such as preferences, mcpServers goes next to them at the top
level, not inside them — inside preferences it is silently ignored:
{
"mcpServers": {
"mathter": {
"command": "npx",
"args": ["-y", "github:gahrons/mathter-mcp"],
"env": { "MATHTER_API_KEY": "mk_live_YOUR_KEY" }
}
}
}Then fully quit Claude Desktop (right-click its icon in the system tray and choose Quit — closing
the window leaves it running) and open it again. (The config file lives at
~/Library/Application Support/Claude/claude_desktop_config.json on macOS and
%APPDATA%\Claude\claude_desktop_config.json on Windows, if you would rather edit it directly.)
Claude Code — one command:
claude mcp add mathter --env MATHTER_API_KEY=mk_live_YOUR_KEY -- npx -y github:gahrons/mathter-mcpCursor, Windsurf and friends — same JSON block as Claude Desktop, in whatever file that
app uses for MCP servers. Some editors (Zed, for instance) wrap the entry differently — check their
MCP docs for the exact shape; the command, arguments and MATHTER_API_KEY are the same everywhere.
The server speaks stdio; there is nothing to host and no port to open.
You do not need to install anything first. npx -y github:gahrons/mathter-mcp fetches and builds it
on demand, so the first start takes a little longer than later ones. You need Node 18 or newer and Git.
3. Ask for worksheets
"What math skills can Mathter do for grade 3?" "Make a 5-page grade 3 subtraction pack called Warm-Ups, easy difficulty." "A blank multiplication chart for grade 4." "Ten worksheets of grade 6 fractions, hard, with worked solutions."
The assistant replies with the path to the PDF. Open it and print.
Related MCP server: TemplateFox MCP Server
What the assistant can do
list_skills
Asks mathter.ca which skills exist right now and which grades each one covers. Your assistant should call this before generating, so it picks a real skill rather than guessing. No key is sent — that list is public.
generate_worksheet_pack
Makes the pack. Only skill and grade are required; everything else has a sensible default.
Option | What it does | Notes |
| Required. Which skill to drill, e.g. | Must be one |
| Required. 0 (kindergarten) to 12 | — |
| One of ten colour palettes | Defaults to |
|
| Plan-gated: free has |
|
| Default |
| Printed on the pack | Default "Math Lesson", trimmed at 80 characters |
| How many sheets | Capped by plan: free 2, Standard 10, Premium 25. Left out, you get 10 or your cap, whichever is smaller |
| Questions per page | Default 12, capped by what fits the page |
| Answer keys | On by default |
| Cover page, "how to" page | On by default, Standard and up |
| Step-by-step solutions in the key | Where the skill has steps authored |
| Single-number drill, e.g. the 7 times table | Addition, subtraction, multiplication, division only |
|
| Multiplication only |
| Mad-minute drill | The four fact skills only |
| Geometry figures, blank grids (default; | Only where the skill uses them |
| Branding name on the pack | Premium only; otherwise quietly replaced |
| Reproduce an identical pack | Default random |
Your logo comes from your Mathter account, not from here — upload it once at mathter.ca and every pack carries it, however the pack was made.
Configuration
Variable | Required | Default |
| yes | — (the server refuses to start without it) |
| no |
|
| no | your Downloads folder, or the system temp folder if there isn't one |
Set MATHTER_OUT_DIR if you would rather packs landed in, say, a shared school folder:
"env": {
"MATHTER_API_KEY": "mk_live_YOUR_KEY",
"MATHTER_OUT_DIR": "/Users/you/Documents/Worksheets"
}The folder is created if it does not exist. Names never collide: a second pack of the same kind
in the same minute becomes …-2.pdf.
Billing, in one paragraph
Packs made here are billed to your Mathter account exactly as if you had made them on the website: same plan, same monthly allowance, same caps on pack size and styles. There is no per-call charge and no separate API plan. Run out of credits and the assistant will tell you so in those words. Plans are at mathter.ca/pricing.
Your key
Your key stays on your machine. This server sends it to one place — the Authorization header of
POST https://mathter.ca/api/generate — and nowhere else. It is never sent to the public skills
endpoint, never written to a file, and never included in anything the server prints or hands back
to the assistant: all output is filtered for key-shaped text first, including error messages that
came from the server. That matters because chat transcripts get pasted into emails and bug
reports.
If a key is ever exposed anyway, revoke it at mathter.ca/account; revocation takes effect immediately. A key can spend your account's allowance; it cannot change your branding, your password, or your billing, and it cannot create other keys.
When something goes wrong
The server answers in sentences, not status codes. The ones you may meet:
What you see | What to do |
"MATHTER_API_KEY is not set" | The key never reached the server — check the |
"Mathter did not accept the API key" | Wrong, mistyped, or revoked. Make a new one at mathter.ca/account |
"Out of worksheet credits for the month" | The allowance resets next billing period, or upgrade |
"That style is not available on this account's plan" | Drop the style, or upgrade |
"This account is not allowed to generate packs" | An admin/support account, or a school licence that no longer covers you |
"Mathter is rate-limiting this API key" | One pack at a time; wait the time it names. Your key is fine, nothing needs revoking |
"Mathter is rate-limiting the public skill list" | Per-computer limit on the skill list, which never sends your key. Wait a minute |
"The renderer is busy" | Backpressure, not breakage. Retry in half a minute; nothing was charged |
"Mathter rejected that configuration" | Usually a skill that isn't taught at that grade — ask for the skill list again |
Still stuck? mathter.ca/contact.
For developers
A thin HTTP client over two endpoints, stdio transport. One direct runtime dependency —
@modelcontextprotocol/sdk — which
brings its own tree, so a real install is around 90 packages, the SDK's HTTP-transport
dependencies among them. No telemetry, no analytics, no network calls other than the two documented
above. MATHTER_BASE_URL points it at a dev instance.
npm ci # a lockfile is committed; plain `npm install` may need --legacy-peer-deps
npm test # vitest, against a local stub HTTP server — never the real API
npm run typecheck
npm run build # tsc -> dist/The published tarball is dist/, this README and the licence; sources and tests stay in the
repository.
MIT licensed. Mathter is at mathter.ca; the API itself is documented at mathter.ca/api.
Available Tools
2 toolsgenerate_worksheet_packGenerate a Mathter worksheet packA
Generate a printable math worksheet pack as a PDF and save it to this computer, then return the file path. The pack is billed to the Mathter account that owns MATHTER_API_KEY, under that account's normal monthly allowance — the same as making it on mathter.ca. Call list_skills first to choose a valid skill for the grade. Logo and branding come from the account itself and cannot be set here.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Fixes the random number generator, so the same seed reproduces the same pack. Default random. | |
| chart | No | Multiplication only: print a times-table chart instead of worksheets. "filled" is a reference chart, "blank" is one to fill in. | |
| focus | No | Single-number drill, e.g. 7 for the seven times table. Only applies to the four fact skills: addition, subtraction, multiplication, division. | |
| grade | Yes | Grade level, 0 (kindergarten) to 12. Must be a grade the chosen skill teaches — list_skills returns the grades for each skill. | |
| skill | Yes | Which math skill the pack drills, e.g. "multiplication". Call list_skills first and use one of the keys it returns: the set changes, and the skill must be one the chosen grade is taught. An unknown or out-of-grade skill is rejected with 400. | |
| style | No | Typography/layout preset, default "modern". Plan-gated and rejected outright if the account cannot use it: free accounts have "modern" only, Standard adds "classic" and "notebook", Premium has all six. Omit it unless the person asked for a look. | |
| theme | No | Colour palette for the pack. Available on every plan. Defaults to teal. | teal |
| timed | No | Mad-minute timed drill. Only applies to addition, subtraction, multiplication and division. | |
| title | No | Title printed on the pack, default "Math Lesson". Truncated at 80 characters. | |
| diagrams | No | Geometry skills only: labelled figures instead of text prompts. Ignored for other skills. | |
| shopName | No | Branding name printed on the pack. Premium only — on any other account it is silently replaced with "Mathter.ca" and the pack still generates. Members of a school organisation always get the organisation's own branding instead. | |
| difficulty | No | Difficulty band, default "medium". | |
| focusOrder | No | Order of a focus drill, default sequential. Only applies when focus is set. | |
| graphBlank | No | Coordinate grids are blank (unlabelled) by default so students set their own scale. Pass false for a labelled ±10 grid. Only meaningful where the skill prints a graph. | |
| unitSystem | No | Units for measurement questions, default metric. Mainly affects unit-conversion skills. | |
| includeCover | No | Print a cover page. Default true, but silently off for free accounts (Standard and up). | |
| includeLesson | No | Print the "how to" lesson page. Default true, silently off for free accounts (Standard and up). | |
| worksheetCount | No | How many worksheets in the pack. Clamped to the account's plan — free 2, Standard 10, Premium 25 — so asking for more is harmless but gets fewer. Omitted, it is 10 or the plan's cap, whichever is smaller: a free account's default pack is 2 sheets. | |
| problemsPerPage | No | Questions per page, default 12. Clamped down to whatever actually fits one page for this skill, grade and layout, so a large number simply gives the densest legal page. | |
| workedSolutions | No | Step-by-step worked solutions in the answer key. Only has an effect for skills that have steps authored; silently ignored elsewhere. | |
| includeAnswerKeys | No | Print answer keys. Default true on every plan; send false to omit them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true. The description adds billing behavior (charged to the account's monthly allowance), the physical side effect (saving a PDF to the computer), and a branding limitation. It does not mention error responses for invalid skills, but the schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences front-load the purpose, then cover billing, prerequisite, and branding. Each sentence earns its place, though the branding constraint partially duplicates the schema; the description remains compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 21-parameter tool with no output schema, the description covers purpose, billing, a required prerequisite, and a key limitation. Remaining details—plan gates, defaults, error behavior—are thoroughly documented in the schema, so the description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 21 parameters at 100% schema description coverage, the schema already documents every field thoroughly. The description adds no parameter-level detail beyond repeating the list_skills prerequisite and the branding constraint, both of which are already in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Generate') and resource ('printable math worksheet pack as a PDF'), states the side effect (save to this computer) and the return value (file path). It also names the sibling tool list_skills as the required first step, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite: 'Call list_skills first to choose a valid skill for the grade.' It also states a hard constraint (branding cannot be set here), but does not describe when to choose this tool over a hypothetical alternative, since none exists; the guidance is context-setting rather than routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_skillsList Mathter skillsARead-only
List every math skill Mathter can generate right now and the grades each one covers. The live list, straight from mathter.ca — use it to pick the skill and grade for generate_worksheet_pack rather than guessing a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and remote-source aspects. The description adds meaningful context beyond that: it is a 'live list, straight from mathter.ca,' implying results may change and reflect current server state rather than a static catalog. It stops short of describing pagination or return format, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste. The core purpose is front-loaded and the actionable routing advice follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by stating what the list contains (every skill plus the grades each covers), which is exactly the return shape an agent needs. Combined with the no-parameter schema and clear annotations, nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the schema carries no semantics to compensate for. Baseline 4 applies; the description's mention of `skill` and `grade` refers to input fields of the sibling tool and to returned values, not to this tool's own parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (math skills Mathter can generate) plus the scope of what each entry includes (grades it covers). This is clearly distinct from the sibling generate_worksheet_pack, which produces worksheets rather than listing available skills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it — to pick the `skill` and `grade` values needed by generate_worksheet_pack — and cautions against guessing a key. The alternative (guessing) and the sibling are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
generate_worksheet_pack - First observed
list_skills
TDQS
Scored across 2 tools
The two tools have entirely distinct purposes: list_skills is a read-only discovery call, generate_worksheet_pack is a PDF-producing action. There is no overlap, and the description even instructs calling one before the other, so misselection is essentially impossible.
Both names follow the same snake_case verb_noun convention (list_skills, generate_worksheet_pack). The pattern is predictable and readable despite the second name being longer.
Two tools is thin for a server, but the domain is deliberately narrow: discover valid skills, then generate a worksheet. It borders on under-scoped, though the pairing does cover the stated purpose.
The core loop (list_skills -> generate_worksheet_pack) is covered, but there is no way to preview a worksheet, inspect the account's remaining monthly allowance, or manage branding, all of which the descriptions reference. These are notable gaps an agent cannot work around.
Maintenance
Related MCP Connectors
Generate and read PDFs for AI agents: a generate_pdf and a read_pdf tool, priced per document.
Generate PDFs from templates via AI chat. Works with Claude, ChatGPT, Cursor, and any MCP client.
Create real Word .docx files from your AI chat: proposals, quotes, contracts, statements of work.
Create real Word .docx files from your AI chat: proposals, quotes, contracts, statements of work.
Related MCP Servers
AlicenseAqualityAmaintenanceEnables AI assistants to generate PDFs, manage documents, and handle e-signatures via the PDFGate API.24181 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to generate PDFs from templates using dynamic data, manage async PDF jobs, list templates, and check account credits and transaction history through natural language.38 npmMIT
- FlicenseAqualityBmaintenanceEnables AI assistants to create and edit Office documents, presentations, and spreadsheets, as well as generate diagrams, charts, citations, and research project structures.14-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to browse, run, and chain SnapOtter's 243 file-processing tools across image, video, audio, PDF, and general files, including pipeline execution, batch processing, and library management.MIT