yowes-mcp
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., "@yowes-mcp Generate a teacher ID for a US teacher"
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.
Yowes — Canva Education Document Generator
Headless MCP server that generates teacher verification documents — employment letters, teacher ID cards, teaching licenses, payslips, and more — across 13 countries.
Portable, self-contained, and installable anywhere.
Table of Contents
Related MCP server: DocumentMCP Server
Sample outputs
Documents are rendered as high-resolution PNGs. Examples generated by this tool:
Teacher ID (US) | Employment letter (US) |
|
|
Teacher ID (UK) | Employment letter (UK) |
|
|
Features
Headless MCP server — document generation exposed as agent-callable tools over stdio.
13 countries, each with its own document types and local conventions.
Real school databases with street addresses, districts, and contact info.
Consistent profile photos per person — hash-based selection from a bundled, gender-aware photo pool.
Cross-platform fonts — DejaVu Sans bundled; no system-font dependency.
Packaged & portable — ships as a self-contained wheel (code + photos + fonts) installable with one command.
Supported countries
Code | Country | Document types |
| United Kingdom | employment_letter, teacher_id, teaching_license |
| United States | employment_letter, teacher_id, teaching_license |
| France | installation_statement, iprof_screenshot, bylaws_extract, teaching_certificate |
| Netherlands | employment_contract, teacher_registration, duo_declaration, school_id |
| Indonesia | payslip, teaching_experience_letter, nuptk_card, appointment_letter |
| Australia | signed_school_letter, school_id, teaching_license |
| Canada | oct_card, teaching_license, signed_school_letter |
| Spain | teaching_id, signed_school_letter, employment_contract |
| Argentina | payslip, employment_certificate, signed_school_letter |
| Slovakia | payslip, employment_letter, signed_school_letter |
| Mexico | teaching_id, signed_school_letter, employment_certificate |
| Philippines | teaching_id, employment_certificate, teaching_license |
| Thailand | payslip, letter_of_employment |
Requirements
Python 3.10+
Dependencies (installed automatically):
Pillow,mcp
Installation
From the built wheel
pip install dist/yowes_doc_generator-0.1.0-py3-none-any.whlFrom source (editable)
pip install -e .Via uv
uvx --from . yowes-mcpUsage — MCP server
The server speaks MCP over stdio — the transport used by most agent runtimes (Hermes, Claude Desktop, and any MCP client). Connect it, discover the tools, then call them.
Step 1 — Install & verify
# from the built wheel
pip install dist/yowes_doc_generator-0.1.0-py3-none-any.whl
# or editable from source
pip install -e .Verify the install and that bundled assets resolve:
python -c "from countries.utils import load_font, get_profile_photo; \
print(load_font(30).getname()); print(get_profile_photo((280,340), person_id='x', gender='Male') is not None)"
# ('DejaVu Sans', 'Book') <-- bundled font, not system
# True <-- bundled photo foundStep 2 — Run the server
# After install:
yowes-mcp
# Or from source:
python mcp_server.pyIt blocks and waits for MCP requests over stdin/stdout — don't run it as a foreground terminal app expecting prompts.
Step 3 — Register in your agent runtime
Point your MCP client at the yowes-mcp command:
{
"mcpServers": {
"yowes": {
"command": "yowes-mcp",
"args": []
}
}
}If yowes-mcp isn't on your PATH, use the absolute path to your interpreter and module instead:
{
"mcpServers": {
"yowes": {
"command": "/path/to/python",
"args": ["-m", "mcp_server"]
}
}
}Tools
Tool | Description |
| List available countries, display names, and their document types. |
| List all schools for a country code. |
| Render one or more documents to PNG and return their paths. |
list_countries_tool()
No arguments. Returns one result item per country — { code, name, document_types }. (Because a list return is split into one MCP content item per entry, iterate content to see them all.)
list_schools(country: str)
country(required) — country code fromlist_countries_tool(e.g."us").Returns one result item per school —
{ name, address, town, postcode, state, phone, lea }. Iteratecontentto see them all.
generate_documents(...)
Parameter | Type | Required | Default | Description |
| string | ✅ | — | Country code (e.g. |
| string | ✅ | — | Teacher's first name. |
| string | ✅ | — | Teacher's last name. |
| string | ✅ | — | Exact or partial school name (matched against that country's school list). |
| string | ✅ | — | Teaching position/title. |
| string | ✅ | — | DOB string, printed on the teacher ID (e.g. |
| string | — |
|
|
| string[] | — | all types | Which documents to render, e.g. |
| string | — |
| Where to save PNGs (relative to the server's working dir). |
Returns { country, school, document_types, files, count, output_dir } — files are absolute PNG paths.
Connect from a Python client
Minimal working client (requires pip install mcp):
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
params = StdioServerParameters(command="yowes-mcp", args=[])
async with stdio_client(params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
countries = await session.call_tool("list_countries_tool", {})
# A list return is split into one content item per entry:
for item in countries.content:
print(item.text)
res = await session.call_tool("generate_documents", {
"country": "us",
"first_name": "John",
"last_name": "Smith",
"school_name": "Valley High",
"position": "Head of Science Department",
"date_of_birth": "12/05/1988",
"gender": "Male",
})
print(res.content[0].text)
asyncio.run(main())Typical agent workflow
Call
list_countries_toolto see what's available.Call
list_schools("us")to pick a real school.Call
generate_documents(...)with the chosen country, school, and person details.Read the returned PNG paths and use the files.
Generated PNGs are written to output/ (or the output_dir you pass).
Legacy GUI
A tkinter (CustomTkinter) GUI is still available for manual use. The core generation logic is shared.
python main_gui.py # on Windows, use run.bat (sets TCL_LIBRARY)The MCP server is the primary, headless interface. The GUI is optional and not required for the skill.
Project structure
yowes/
├── countries/ # Document generation core (package)
│ ├── base.py # CountryGenerator ABC (contract)
│ ├── utils.py # Fonts, profile photos, shared helpers
│ ├── foto/ # Bundled profile photos (package data)
│ ├── fonts/ # Bundled DejaVu fonts (package data)
│ └── <country>/ # One package per country
├── mcp_server.py # MCP server exposing tools
├── main_gui.py # Legacy tkinter GUI
├── docs/examples/ # Sample rendered documents
├── pyproject.toml # Packaging, deps, entry point
├── output/ # Generated documents (git-ignored)
└── run.bat # Windows GUI launcherAdding a new country
Create
countries/<code>/__init__.pywith a class inheritingcountries.base.CountryGenerator.Implement the abstract methods:
get_country_name,get_country_code,get_schools_data,get_first_names,get_last_names,get_positions,get_document_types,generate_document.Register it in
countries/__init__.pyviaregister_country("<code>", <Name>Generator).Optionally add a display label in
main_gui.py(get_country_list/on_country_change).
The new country is automatically picked up by the MCP list_countries_tool and list_schools.
Contributors
Masanto — author & maintainer
License
MIT © 2026 hirotomasato
Available Tools
3 toolsgenerate_documentsA
Generate teacher verification documents (employment letter, teacher ID, teaching license).
Args: country: Country code from list_countries (e.g. 'us', 'uk'). first_name / last_name: The teacher's name. school_name: Exact or partial school name (matched against that country's school list). position: Teaching position/title. date_of_birth: Display date of birth string (shown on the teacher ID). gender: 'Random', 'Male', or 'Female' — selects which photo pool is used. document_types: Which documents to render. Omit for all. e.g. ['employment_letter', 'teacher_id']. output_dir: Where to save PNGs (relative to project root). Defaults to 'output'.
Returns: Dict with 'files' (absolute paths), 'count', and 'output_dir'.
Inputs: country (required), position (required), last_name (required), first_name (required), +5 more.
list_countries_toolA
List all available countries, their display names, and the document types each can generate.
Inputs: no named parameters. Returns: result
list_schoolsA
List all schools for a given country code (e.g. 'us', 'uk'). Each entry has name/address/town/postcode/state/phone/lea.
Inputs: country (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: listing countries, listing schools for a country, and generating documents. There is no overlap or ambiguity between them.
Two tools follow a clean verb_noun pattern (list_schools, generate_documents), but list_countries_tool has an inconsistent '_tool' suffix. Minor deviation from an otherwise consistent naming style.
Three tools is well-scoped for the server's purpose: discovery of countries, discovery of schools, and document generation. Each tool is necessary and none feel redundant or excessive.
The tool surface covers the full workflow: list available countries/document types, list schools for a country, then generate teacher verification documents. There are no obvious missing operations for this focused domain.
Related MCP Connectors
KYB for AI agents: verify business registrations from MCP clients.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Generate professional receipt PDFs and structured receipt data with AI-ready MCP tools.
Create documents and reusable templates, request signatures, and track approvals — for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to generate teaching materials such as PPTs, handouts, lecture scripts, mind maps, teaching video storyboards, and Manim math animations, plus run quality checks and language normalization through 15 MCP tools.MIT
- FlicenseNot gradedqualityBmaintenanceEnables LLMs to read and edit mock documents through custom MCP tools, resources, and prompts, allowing natural-language queries and modifications to document contents.-
- AlicenseAqualityCmaintenanceEnables AI agents to generate teacher verification documents such as employment letters, teacher ID cards, teaching licenses, and payslips across 13 countries, outputting high-resolution PNGs via stdio.3MIT
- AlicenseAqualityCmaintenanceEnables AI agents to generate teacher verification documents such as employment letters, teacher IDs, teaching licenses, and payslips for 13 countries through MCP tools. It supports listing countries and schools, then producing one or more documents as PNG files.3MIT



