Skip to content

Automation · AI for CX

I built an MCP server for my Zendesk instance

Published9 min read

As of October 2026, Zendesk hasn’t released an official MCP yet, and that’s fine: you can build your own version or use mine as a starting point. In this article I explain what it does, how I built it and how to connect it to Claude in just a few minutes.

Technologies I used for this:

  • Zendesk
  • MCP
  • Python
  • Claude
  • GitHub

My server is public, free and ready to use: github.com/Grjhoan/Zendesk_MCP_Server. Installing and using it is one thing; giving everyone access to it is another. There are different access levels you can set up, you can restrict the MCP or add more functionality. If you have questions about that, write to me at jzabalacx@gmail.com or send me a DM on LinkedIn.

First, what an MCP is, without the jargon

MCP stands for Model Context Protocol. The idea is simple: it’s a bridge that lets an AI assistant talk to a tool you already use.

Without that bridge, Claude can explain how Zendesk works, but it can’t look at your account. With the bridge, you ask “how many urgent tickets are unassigned?” and it goes, checks, and answers with your real number.

It’s not magic and it’s not a model trained on your data. It’s a connection. Your information stays in Zendesk and the assistant only asks what you tell it to ask, with your same permissions. That’s all you need to understand to use it.

Conversation in Claude asking about the Zendesk backlog, with a table of tickets by status and priority
You ask in plain language and it answers with the numbers from your account. Here: 361 open tickets, 341 of them without an owner.

Then, the decision that mattered most: keeping it small

This is the part I want you to take away even if you never install anything. I was tempted to wrap the entire Zendesk API, but that’s hundreds of endpoints. I could have built a server with two hundred tools and bragged about something more complex, but what for? That wasn’t my goal. Can I do it? Yes, but that’s not what I was after here.

Besides, when an assistant has two hundred tools available, it chooses worse. It gets overwhelmed, hesitates, and ends up using the wrong one or asking you to clarify what you already told it. Fewer, well-thought-out options work better than many options.

So instead of asking “what can the API do?”, I asked “what eats my time on Mondays?”. Four areas came out of that, and thirteen tools came out of those four areas.

If you ever build something similar for another tool, start there: with your pain points, not with the documentation.

Next, research before writing a single line

The second thing I did was boring but decisive: read the Zendesk API documentation before coding, not during. And since I’ve been developing with Zendesk for years, it was easier because I already knew the API. Boring, yes, but not complicated.

I’m telling you this so you avoid mistakes like these:

  • Pagination. Zendesk has two ways to paginate results. The traditional one has a ceiling of ten thousand records. If your account has more tickets than that, the audit would have lied to you without warning.
  • Rate limits. Zendesk cuts you off when you ask for too much per minute and tells you how many seconds to wait. If you don’t respect that, the server falls over right when you’re using it the most.
  • API tokens are deprecated. Zendesk’s own documentation says an API token can impersonate any member of the account, administrators included, and recommends OAuth. For personal use the token works, but that warning changed how I designed the security.

In parallel, security: three layers and none of them optional

I didn’t leave this for the end, and I think it’s what separates a toy from something you dare to connect to your real account.

  • Your same permissions. The server can never do more than that user could already do by logging into the interface. If you want a read-only server, you give it the token of a user with read permissions and that’s it.
  • Almost everything is read-only. Of the thirteen tools, eleven only read. The two that change things (reassigning tickets, suspending a user or changing their role) fail with a clear message until you enable them on purpose.
  • A dry run first. Even once enabled, those two first tell you what they would change without touching anything. You have to ask again for it to actually run.

To me this is the most important decision in the project. An AI assistant with write permissions on your Zendesk and no brakes is a terrible idea, no matter how well it works ninety-nine percent of the time.

And before calling it good, testing it three ways

  • Offline tests. They run without credentials, simulating Zendesk’s responses. They check that authentication is built correctly, that pagination walks through every page, that after a rate-limit cutoff it waits as long as it should, and that the write lock works in both directions.
  • Real startup. A test that actually boots the server and confirms the thirteen tools register correctly.
  • A test against your Zendesk. A script that calls your real account and tells you, one by one, which endpoints respond with your token. It’s more useful than it sounds: it warns you up front if your plan doesn’t include something, instead of you finding out when a tool fails.

Now the cool part: what you can do with it

Thirteen tools, in five groups. In plain language:

Search tickets

  • By ticket number, by customer email, by subject, or by the contact’s phone number.
  • The last three can be combined: “tickets from ana@company.com about billing”.

Clean up your configuration

  • Which triggers and macros haven’t run in a month.
  • Which are switched on but do nothing.
  • Which are duplicated or haven’t been touched in months.
  • Which ticket fields nobody uses.

Know how operations are going

  • How many tickets are open, by status and by priority.
  • How many have no owner and which ones have been sitting idle too long.
  • Who on the team is carrying the most load.
  • Which SLA policies you have and with what targets.

Review security

  • Who has administrator permissions.
  • Which access tokens haven’t been used in months and which apps are installed.
  • What changed in the configuration last week and who changed it (Enterprise plan only).

When someone leaves the team

  • What was left pending in their queue, which groups they belong to and when they last signed in.
  • Move their tickets to someone else.
  • Suspend their access.

And something I didn’t expect to be so useful: all of the above is asked in plain language. There are no commands to memorize. You type “audit my triggers looking for dead rules” and that’s it.

When I ran it against my own account it found two active triggers that never fire. One had a typo in its name, was created three months earlier, with zero executions. That’s not a rule covering a rare case: it’s a broken rule nobody noticed. In the Zendesk interface I would have had to open every trigger one by one to find out.

How to install it

You need three things: your computer, Python 3.10 or higher, and administrator permissions in Zendesk.

1. Download the project

git clone https://github.com/Grjhoan/Zendesk_MCP_Server
cd Zendesk_MCP_Server
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

2. Create your token in Zendesk

In your account: Admin Center → Apps and integrations → APIs → Zendesk API → Settings. Enable Token access and create a new token. Copy it right then, because Zendesk won’t show it to you again.

Remember that this method is being phased out, so you should switch to OAuth. I used the token to test quickly, but it’s not the recommended way.

3. Configure it

cp .env.example .env

Open the .env file and fill in three fields: your subdomain, your email and the token.

Watch out for the subdomain: it’s only the name. If you sign in at https://mycompany.zendesk.com, the value is mycompany. Nothing else.

Don’t even think about uploading that file to GitHub or a public site. Keep it only on your machine and don’t expose it to anyone.

4. Check that it works before connecting anything

python check_connection.py

This tells you which account and role you’re connected with, and tests one by one the endpoints each tool uses. If something isn’t available on your plan, you find out here and not when it fails.

How to connect it to Claude

There are two paths. You can use both at the same time.

If you use Claude Code

One command and you’re done:

claude mcp add zendesk-admin \
  -- /absolute/path/.venv/bin/python /absolute/path/server.py

Use absolute paths, and restart Claude Code afterwards, because tools are registered at startup.

If you use the Claude app

Here it’s installed as an extension. First you package it:

./build_mcpb.sh

That leaves a dist/ folder ready. Then, in the app: Settings → Extensions → Advanced settings → Install unpacked extension, and select that dist/ folder.

Two warnings I learned the hard way:

  • Point to the dist/ folder, not the project folder. Only dist/ has what the app needs.
  • After installing, go to Settings → Connectors, open Zendesk Admin and fill in the subdomain, email and token there. Every time you reinstall the extension, that configuration is wiped and you have to enter it again.
Configuration screen of the Zendesk Admin connector, with the subdomain, email and API token fields
The configuration lives in Connectors. Three fields and you’re done. (In the version published on GitHub the labels appear in English; this screenshot is from my local install.)

Try it

Open a new conversation and type something like:

Which Zendesk account am I connected to?

If it answers with your account and your role, you’re set. One detail: don’t type tool names as if they were commands. Describe the task in plain words and the assistant picks the tool.

What it doesn’t do yet, and what you should know first

  • It runs on your computer, not in the cloud. That’s good for security: your token stays on your machine and nothing is exposed to the internet. But it means you can’t query it from your phone.
  • The audit log is Enterprise-only. The recent configuration changes tool will tell you clearly if your plan doesn’t include it.
  • The phone number belongs to the contact, not the ticket. If in your operation you store numbers in a custom ticket field instead of on the user profile, that search won’t find anything. Can it be done? Yes, but I didn’t include it in this version. Write to me if you’re interested in building more things like this.
  • API tokens are deprecated. They work, and for a personal tool they’re enough. But if this grows to several people, move to OAuth. The server already accepts both, and OAuth is the recommended option.

If you want to use it

The repository is here: github.com/Grjhoan/Zendesk_MCP_Server.

It’s free software under the MIT license. Use it, change it, take it as a base to build your own. If your stack isn’t Zendesk but Freshdesk, Intercom or something else, the method is the same: first identify what you want to solve, check their API documentation before writing anything, and put the safety brakes in from day one.

If you install it and something doesn’t work, write to me at jzabalacx@gmail.com or send me a DM on LinkedIn: linkedin.com/in/jhoanzabala. And if it does work, let me know too, haha, I’d like to know if it worked for anyone =) Thanks for reading. If you need help with Zendesk or you’re looking for someone for your CX team, let’s talk.

Jhoan Zabala

Project Manager / Product Owner / CX Consultant and Zendesk Admin.

Share on LinkedIn

Want something like this for your team?

The first meeting is on me, no charge. Tell me about your case and we’ll see what makes sense to automate.