AI Agents
Connect an AI agent to Typograph so it can find templates, generate press-ready PDFs and images, convert files, and manage projects and teams. It works for one signed-in user, with that user's rights: it can do what the user can do, and no more.
The Typograph MCP Server implements the Model Context Protocol — the open standard adopted by Anthropic, OpenAI, and Google for connecting AI to external tools and data.
Production URL: https://mcp.typograph.nl
What AI Agents Can Do
With more than 60 tools available, your AI agents can:
- Manage content - Create and organize teams, projects, and templates, or start a template from the gallery
- Generate documents - Create PDFs and images from templates
- Convert files - Transform between file formats
- Collaborate - Share resources, manage permissions, invite users, ask for access and answer requests for it
- Run the organization - List organizations and their members, change an organization's settings, invite people in, change a member's role or remove a member, and hand an organization to another member
- Search - Find projects, templates, and resources
- Manage webhooks - Set up, change and check the webhook subscriptions of your organization
- Look after apps - Read an organization's apps and their scopes, and give an app its consent-screen logo
- Look up the documentation - Search and read these docs, so an agent finds how Typograph works instead of guessing
Documentation for agents
An agent can read this documentation in a form made for it, with or without a connection:
/llms.txtlists every page with its one-line summary (llms.txt)./llms-full.txtholds the full text of every page./docs-index.jsonholds the same text cut into one entry per section:{revision, generated_at, site_url, sections: [{title, url, section, audience, headings, text, agent_tools}]}.- Through the MCP server,
docs_searchanddocs_getsearch and read the same sections (see Documentation below).
All three files are made from the pages when the site is built, so they never differ from what you read here, and they hold only these public pages. A page names the tools that do what it explains, as agent_tools: the Invites page, for example, names organization_invitation_create and invitation_create.
What an agent cannot do yet
- Edit a template's content. No tool changes the elements of a template yet;
template_updaterenames it. An agent generates output from a template as the designer saved it, or in batches from CSV data through the Publisher. - Create or change an app, or see its secret. Creating an app, changing its name, scopes or redirect URIs, deleting it and regenerating its secret stay in the portal: a new app would get your plan's scopes rather than the agent's, and a secret shown to an agent ends up with its model provider.
- Be held to a template's roles on the server. The template's roles and limits are applied by the Viewer in the browser. Enforcing them on every API and MCP call is planned. Until then, connect agents with only the access they need.
Quick Start
Typograph runs the MCP server as a hosted HTTP service at https://mcp.typograph.nl — there is nothing to install locally.
Let your agent set itself up
Paste this into Claude, ChatGPT, Cursor or any other agent:
Fetch and follow the instructions at https://docs.typograph.nl/agent-setup/prompt.md to connect me to Typograph.
The agent reads the setup instructions, adds the connection for its own app (or walks you through the clicks when it cannot), and checks that the sign-in worked. The portal dashboard offers the same prompt under Connect your AI assistant.
Claude Desktop (and other MCP clients)
Point your MCP client's mcpServers config at the hosted URL:
{
"mcpServers": {
"typograph": {
"url": "https://mcp.typograph.nl/mcp"
}
}
}
Your client signs you in on the first tool call: the server answers 401 Unauthorized and points the client to the Typograph sign-in (see Authentication). The client keeps the token and sends it with every request.
Direct HTTP (JSON-RPC)
POST https://mcp.typograph.nl/mcp
Content-Type: application/json
Authorization: Bearer <access token>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "team_list",
"arguments": {}
}
}
Authentication
The MCP server holds no credentials and keeps no sessions. Your MCP client signs in at the Typograph API with OAuth 2.0 (authorization code with PKCE) and sends the access token as Authorization: Bearer <token> on every request. The API checks the token on every tool call.
How Authentication Works
- Discovery -
initializeandtools/listwork without a token, so the client can see what the server offers. - First tool call - Without a token, the server answers
401 Unauthorizedwith aWWW-Authenticateheader that names the protected resource metadata. The client reads it, finds the Typograph authorization server and opens the sign-in in a browser. - Every call after - The client sends the access token, and refreshes it with the refresh token (
offline_access) when it expires. - A refused token - When the token is invalid, expired or revoked, the server answers
401again, witherror="invalid_token", so the client signs in again.
Signing out
Sign out in your MCP client: disconnect or remove Typograph there. There is no tool for it. Revoking a token is the act of the client it was issued to (RFC 7009), and the MCP server is not that client: it only passes your token on. An agent also cannot sign you out by accident, or because a document told it to.
The 401 response
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token", resource_metadata="https://mcp.typograph.nl/.well-known/oauth-protected-resource"
Content-Type: application/json
{
"jsonrpc": "2.0",
"error": {
"code": -32001,
"message": "The access token was refused. Sign in again.",
"data": {
"type": "auth_required",
"resource_metadata": "https://mcp.typograph.nl/.well-known/oauth-protected-resource"
}
},
"id": null
}
Without a token, the header is Bearer resource_metadata="..." and the message is Authentication required.
Required Scopes
| Scope | Description |
|---|---|
identity:read | User profile access, and listing organizations and their members |
identity:delete | Delete the user's own account, or an organization the user owns, with the code the user receives by email |
file | Team, project, and template management |
document | Document validation |
publisher | PDF and image generation |
converter | File format conversion |
webhook | Your organization's webhook subscriptions and their deliveries |
subscription:read | Subscription and usage info |
offline_access | Refresh token support |
An MCP client gets these scopes at most, also when it asks for more in the metadata document it
identifies itself with (the JSON document at its client_id URL, which clients such as Claude
Desktop publish), and your organization's plan can narrow them further. identity:write is not among them: it also
changes member roles and ownership. Tools that need it, such as setting an app's logo, work only
with an access token of your own app that holds identity:write.
Available Tools
Account Management
| Tool | Description |
|---|---|
identity_whoami | Get current user profile (ID, email, role, scopes) |
identity_profile_update | Change the user's own first and last name, phone number and settings (notification emails, the theme: light, dark or system, language) |
identity_account_deletion_code | Step 1 of deleting the user's own account: email the user a 6-digit code |
identity_account_delete | Step 2: delete the account with the code the user read from that email, and the optional reason the user gave for leaving; answers deletion_scheduled_at |
Changing the profile works like the profile page in the portal. The agent passes only what to change, and the rest keeps its value; an empty phone number clears it, but the first and last name cannot be cleared. The phone number is in international format, starting with + and the country code, such as +31 20 123 4567, and the language is en or nl. The name others see follows the first and last name, as in the portal, and the email address does not change here. The tool's description asks the agent to confirm the changes with you first. It needs the identity or identity:write scope, so a client that signs in on its own is refused and the agent sends you to the portal; an agent connected through an app of your organization with that scope can change the profile. See Update current user for the endpoint.
Deleting an account always needs the user. The code goes only to the user's mailbox, so the agent asks the user for it and never guesses one. Without it, nothing is deleted. The optional reason is one of no_longer_needed, missing_features, too_expensive, too_difficult, switching_tool or other, passed only when the user said why they are leaving, never guessed. The account stops working at once, and the user can keep it by signing in within 30 days. If the user owns an organization that has other members, both tools answer with what the user has to do first. The endpoints behind them are in the Identity Service reference.
Organizations
| Tool | Description |
|---|---|
organization_list | List the organizations you belong to, with your role in each |
organization_create | Create another organization; you become its owner, on the free plan |
organization_update | Change an organization's name, slug, description, website_url, contact email and billing details |
organization_assistant_get | Read what the assistant in the Typograph portal may do in the organization (ai_access: read_write, read_only or off) and whether guests may use its AI credits (guests_use_credits) |
organization_assistant_update | Set ai_access, guests_use_credits or both (off is part of Enterprise); asks for confirmation and needs identity:write |
organization_guest_apps_get | Read whether the apps of guests may read the organization's teams, and which apps were let read |
organization_guest_apps_update | Let the apps of guests read the organization's teams, or stop them; asks for confirmation and needs identity:write |
organization_member_list | List an organization's members, with the member_id and user_id of each |
organization_member_update_role | Make a member an admin, or an admin a member |
organization_member_remove | Remove a member from an organization, or leave it yourself |
organization_transfer_ownership | Make another member the owner; you become an admin |
organization_deletion_code | Step 1 of deleting an organization you own: email you a 6-digit code |
organization_delete | Step 2: delete the organization with the code you read from that email |
organization_invitation_create | Invite an email address into an organization, as a member or an admin; refused with member_limit_reached when members and open invitations are at the plan's limit, which subscription_usage_get tells beforehand |
organization_invitation_list | List an organization's invitations that nobody answered yet |
organization_invitation_resend | Mail an invitation again, with a new link for another 7 days |
organization_invitation_revoke | Withdraw an invitation; its link stops working |
organization_invitation_list_mine | List the invitations into organizations sent to your own address |
organization_invitation_accept | Accept one of your invitations and join the organization |
organization_invitation_decline | Decline one of your invitations |
An agent works in the organization you picked when you connected it. organization_list shows all your organizations, but the other tools reach only that one: for another organization they answer organization_not_bound, and the agent tells you to connect again and pick the other organization. Your own invitations (organization_invitation_list_mine, accept and decline) are yours, not an organization's, so they work from any connection. See Which organization a token reaches.
Only the owner can transfer an organization, whoever calls the tool, and the owner cannot take it back afterwards: only the new owner can transfer it again. The tool asks for confirmation before it acts. The transfer needs the identity or identity:write scope, which is not among the scopes above that the MCP server's sign-in asks for. So a client that signs in on its own, such as Claude Desktop, can list organizations and members but not transfer one. An agent that connects through an app of your organization with one of those scopes can. See Transferring Ownership for the same flow in the portal.
Changing a member's role and removing a member follow the same role rules as in the portal: only an owner or admin changes or removes someone else, and an admin never touches the owner. As over the API, any member can also leave by removing their own membership. Nobody is made owner with organization_member_update_role, and the owner is never demoted or removed: the owner transfers ownership first. Both tools take the member's member_id from organization_member_list, not the user_id, and both ask for confirmation before they act. They need the identity or identity:write scope as well, so a client that signs in on its own can list the members, but you change and remove them in the portal; an agent connected through an app of your organization with that scope can do it. See Managing Members for the portal, and Organization members for the endpoints.
Creating an organization needs the same identity or identity:write scope, so organization_create works only for an agent that connects through such an app. A client that signs in on its own is refused, and the tool's description tells the agent to send you to the portal instead: see Creating an Organization.
Changing an organization's settings follows the portal's rules: only an owner or admin changes them, whoever calls the tool. The agent passes only the settings to change, and the rest keep their values; an empty value clears a setting such as the website_url or a billing detail, but never the name, the slug or the contact email, which the portal requires too. The billing country is its two-letter code, such as NL. A slug another organization already uses is refused, and the agent asks you for another. The tool's description asks the agent to confirm the changes with you first. It needs the identity or identity:write scope as well, so a client that signs in on its own is refused and the agent sends you to the organization's Settings in the portal; an agent connected through an app of your organization with that scope can change them. See Update an organization for the endpoint.
Only an owner or admin invites, lists, sends again and revokes invitations. Inviting, sending again and revoking ask for confirmation first, so you see the address before a mail goes out. Everything but the two lists needs the identity or identity:write scope, so a client that signs in on its own can list invitations, but you invite, accept and decline in the portal; an agent connected through an app of your organization with that scope can do all of it. Inviting, sending again and revoking also work with the narrower identity:invitations, which reaches no other route; the assistant in the portal invites with it. See Invites for the portal, and Organization invitations for the endpoints.
Deleting an organization works like deleting the account: the code goes only to the owner's mailbox, so the agent asks you for it, and without it nothing is deleted. Both tools need identity:delete, which the MCP server's sign-in asks for. Only the owner can delete an organization, and never their only one: then the tools answer that you need to create or join another organization first. Neither you nor the agent can undo it (support can restore it within 30 days, see Deleting an Organization), and the tool asks for confirmation before it acts. See Deleting an Organization for the same flow in the portal, and the Identity Service for the endpoints.
Apps
| Tool | Description |
|---|---|
app_list | List the apps (OAuth clients) of an organization you are a member of |
app_get | Get one app by its client ID; never its secret |
app_logo_upload | Upload or replace an app's consent-screen logo: the image as base64 with its MIME type, a square PNG, JPEG or WebP of 128 to 1024 pixels, at most 512 KB. Takes the owner or admin role and identity:write |
app_logo_delete | Remove an app's logo. Takes the owner or admin role and identity:write |
scope_list | List every scope with what it allows: what an app's scopes mean |
Teams
| Tool | Description |
|---|---|
team_list | List teams with pagination |
team_get | Get team details by ID |
team_create | Create a new team; organization_id names the organization it is created in, and is left out for a connection that reaches one organization. Refused with team_limit_reached beyond the plan's teams (Free allows one), which subscription_usage_get tells beforehand |
team_update | Update team name |
team_delete | Soft delete a team |
team_restore | Restore a deleted team; it counts against the plan's teams again |
Projects
| Tool | Description |
|---|---|
project_list | List projects in a team |
project_list_shared | List projects shared with you |
project_get | Get project details |
project_create | Create a new project |
project_update | Update project name |
project_delete | Soft delete a project |
project_restore | Restore a deleted project |
Templates
| Tool | Description |
|---|---|
template_list | List templates in a project |
template_list_shared | List templates shared with you |
template_get | Get template details |
template_fields | What a row of data can fill in a template: its merge fields and the JSON Schema of a row (Merge fields) |
template_create | Create a new template |
template_update | Update template name |
template_touch | Update modification timestamp |
template_delete | Soft delete a template |
template_restore | Restore a deleted template |
template_publish | Make a PDF or image of a stored template, billed to the organization that owns it (Publishing a stored template); asks for confirmation |
template_job_get | Read the status and the download links of a job template_publish started |
Pre-made Templates
The portal shows a gallery of ready-made designs under a project's New template and on Recents. An agent can browse it and start from one, as you do in Starting From the Gallery.
| Tool | Description |
|---|---|
premade_template_list | List the gallery, featured templates first. Filter with category (a category's code) and is_featured. Each template says whether it is usable, in is_usable |
premade_template_list_categories | List the gallery's categories, with the code to filter on; has_templates leaves out the empty ones |
premade_template_get | Get one pre-made template by its code |
premade_template_use | Copy a pre-made template into a project (project_id, code). Answers the new template, which is the project's own from then on |
premade_template_use needs edit rights on the project and the file or file:write scope; browsing needs file or file:read. A template whose is_usable is false cannot be used yet, and the tool says why. The endpoints behind these tools are in the File Service reference.
Media, Fonts & Clips
| Tool | Description |
|---|---|
media_list | List media assets in a project, with their tags and, for an image, its width and height in pixels; tag_ids with tag_match (all or any), untagged, search and sort narrow and order it |
media_tag | Add tags to media and remove them, by name, on up to 100 media at once; a new name makes the tag |
tag_list | List the tags of a project's media, each with media_count |
tag_rename | Rename a tag; a name another tag of the project has merges the two |
tag_delete | Delete a tag from every media file that has it |
media_get_urls | Get presigned download URLs for media; include_original adds the file as uploaded, include_download a link that saves it under the media's name |
media_delete | Move a media file to the trash |
media_restore | Restore a media file from the trash |
font_list | List fonts in a project |
font_update | Change a font's display name, its label |
font_get_urls | Get presigned download URLs for fonts |
font_delete | Move a font to the trash |
font_restore | Restore a font from the trash |
clip_list | List the clips in a project; search matches the name. What is in the trash: trash_list |
clip_delete | Move a clip to the trash |
clip_restore | Restore a clip from the trash |
Each takes the project_id and the item's ID (media_id, font_id or clip_id; the tag tools a tag_id, media_tag its media_ids). Tagging, renaming and deleting a tag need edit rights on the project, as in the portal. Moving a file or clip to the trash needs edit rights on its project, as in the portal; it stays restorable for 30 days, then it is deleted for good. See Trash for what restoring brings back.
File Uploads
| Tool | Description |
|---|---|
upload_list | List upload jobs |
upload_create | Create upload job and get presigned URL |
upload_process | Start processing an uploaded file |
upload_get | Get one upload, to follow it until its status is success or failed |