docva-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., "@docva-mcp Generate a teacher ID card for a teacher in the UK."
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.
Docva — 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: office-worker-mcp
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/docva_doc_generator-0.1.0-py3-none-any.whlFrom source (editable)
pip install -e .Via uv
uvx --from . docva-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/docva_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:
docva-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 docva-mcp command:
{
"mcpServers": {
"docva": {
"command": "docva-mcp",
"args": []
}
}
}If docva-mcp isn't on your PATH, use the absolute path to your interpreter and module instead:
{
"mcpServers": {
"docva": {
"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="docva-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
docva/
├── 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.
License
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 serves a clearly distinct purpose: listing countries, listing schools, and generating documents. There is no overlap or ambiguity between the three tools.
Two tools follow a list_ prefix pattern and generate_documents uses verb_noun style, which is mostly consistent. The '_tool' suffix on list_countries_tool is a minor deviation but does not cause confusion.
Three tools is a well-scoped set for the server's purpose: discovery (countries/schools) and document generation. Each tool earns its place with no unnecessary bloat.
The tool surface covers the full workflow: listing supported countries and document types, retrieving schools for a country, and generating the requested teacher documents. There are no obvious dead ends or missing operations.
Maintenance
Related MCP Connectors
Create documents and reusable templates, request signatures, and track approvals — for AI agents.
Convert, create and edit Word, PowerPoint, Excel and PDF documents from any AI agent.
PDF, image, video, OCR, screenshot, SQL, QR and text tools for agents. No API key, no signup.
Deterministic Mexican/LatAm verification + sanctions & PEP screening for AI agents. Pay via x402.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI agents to generate branded talent documents such as assessment reports, executive profiles, shortlists, and client deliverables in DOCX, PPTX, PDF, or Excel formats from source text or LinkedIn profiles.560 npmMIT- AlicenseNot gradedqualityAmaintenanceEnables AI agents to create and process office documents locally, including generating branded PDF, Word, Excel, and editable PowerPoint files from templates and themes, plus reading, OCR, form-filling, manipulation, and conversion of PDFs.1MIT
- AlicenseAqualityNot gradedmaintenanceEnables generating realistic teacher verification documents such as employment letters, teacher ID cards, teaching licenses, and payslips across 13 countries via MCP.163225MIT
- AlicenseAqualityBmaintenanceReads passports, ID cards and driver's licences from a photo or scan and returns the printed fields and MRZ as structured JSON. One credit ($0.01) per recognised document; nothing is charged when no document is found.6222 npmMIT



