An MCP server for Tines Cases, and what happened when I pointed it at my backlog

Tines ships an MCP server at https://<tenant>.tines.com/mcp, and it’s good at what it’s built for: authoring stories. That’s where the product’s center of gravity is.

The part I spend my day in is the case queue. Cases have a full v2 API behind them, but no MCP tools sat in front of it, so the queue was the one part of Tines I couldn’t reach from an MCP client. I built a small server to close that gap.

What makes it useful is what sits next to it

I run MCP servers for other tools in my stack alongside this one. That means a case can be worked without leaving the session: pull the case, check the endpoint’s detection history, check the data-loss side, decide, write the outcome back to the case. No tab-switching, no copying case IDs between consoles. The cross-referencing is the whole point, and the Tines half was the missing piece.

The first week

I had a backlog of over 100 open cases. I cleared all of them in a few hours.

Most were false positives, which I expected. Some needed enrichment, some needed real work. What I didn’t expect were the two things the backlog had been hiding:

  • A SIEM parser that needed modifying. I’d have found that eventually, one confusing case at a time.
  • A missed attack on an endpoint belonging to a SaaS tool that had been locking accounts out at random. It had been going on long enough that people had stopped asking why.

Neither of those is visible when you work a queue one case at a time over weeks. They show up when you go through a hundred in one sitting with every tool in reach. The time saved was the reason I built it. The better understanding of my own alerting was the part I didn’t see coming.

What it does

Read and write tools over Cases v2: get, list and search, comments, assignees, metadata, and linked cases on the read side; create, update, close, append to description, comment, link/unlink, and delete on the write side.

It runs in a container, and it’s read-only until you explicitly turn writes on. That default is deliberate: the server hands case content that often originated from an external alert to a model, and a fresh install shouldn’t also be able to modify production cases.

Repo, MIT licensed: GitHub - nwhistler/tines-cases-mcp: Custom MCP For Tines Cases · GitHub The README covers setup, configuration, and the safety model.

Three things about the Cases API that cost me time

These are in the README, but they’re worth surfacing here for anyone else building against v2:

  • filters on list_cases goes in the body of the GET. Passed as a query param it gets silently ignored, so every “filtered” query quietly returns unfiltered results. Easy to ship, hard to notice.
  • Case links are bidirectional. There’s no parent/child direction in the data, so a “master ticket” is a convention about which case you triage.
  • A list response embeds each case’s entire activity log. At per_page=25 that measured roughly 84k tokens on my tenant, which will swamp a model’s context in a single call. My server projects list rows down to the fields you need to triage, which measured about an 11x reduction.

Happy to answer questions. I’m also curious whether others here are wiring Tines cases into MCP clients, or solving this a different way.

5 Likes

Great writeup, and I love that you open-sourced it. Appreciate the feedback on the Cases API.

2 Likes

Great work! Was actually going to build an MCP in Tines for working with cases, but this may do the trick!

2 Likes

Love the build and write-up! Great to see another success story out of MCP.

We shipped a cases MCP template within the product a while back to help people do similar. This means that users didn’t need to worry about setting up or running their own server locally.

Do you think customers are still preferring to set up their own servers like you’ve done here? Would love to know how analysts are approaching tools like these to help their work.

Oh this is very interesting. I didn’t know that was possible so I will have to look into this as I’d much prefer not to run my own server.

Ah ok, right off the bat I could see one reason why I wouldn’t use it and that is because it takes up a workflow license. We aren’t necessarily licensed constraint in Tines, but I am very license conscious and always looking to optimize.

However, I see one GIANT benefit to what you’ve built. And that’s Crowdstrike. Crowdstrike has a MCP GitHub - CrowdStrike/falcon-mcp: Connect AI agents to CrowdStrike Falcon for automated security analysis and threat hunting · GitHub, but you have to selfhost it. At least for now. They don’t provide a public endpoint like many others do.

(Jake Dalton, this above is what I was looking for during our Tines build sessions.)

And self hosting isn’t bad, but it’s also not convienent if you are going to use Claude or build a “hermes” style system in Kubernetes with Claude Code like our software engineering team has done.

I am looking at the tool differences between Crowdstrike and what Tines has but this could solve an issue I was having.

That being said, I can’t build a MEGA MCP server with Tines as Claude and some of the others struggle with massive tool counts.

Client-Specific Limits

  • Cursor: Imposes a strict hard limit or warning threshold around 40 to 80 tools total from active MCP servers before it truncates or stops recognizing additional tools.
  • GitHub Copilot: Enforces a hard limit of 128 MCP tools enabled simultaneously per chat request.
  • Claude Desktop / Standard Clients: No rigid programmatic ceiling, but constrained entirely by context window consumption.

Plus now you run the risk of making too powerful of an MCP. And I don’t know if you could share an MCP in an RBAC situation where one user gets the tools privileges that their Crowdstrike key or any other tool allows.

I suppose you might be able to edit the Tines MCP and pull the API token and require the user to pass their Crowdstrike or any other tool token so the permissions are scoped to them.

Do you know if you can add guardrails to your MCP configuration like the security gates I put in my own Tines Cases MCP?

But this is really interesting as you could create MCP servers for services that don’t already have MCP’s or even combine them. Lot’s of possibilties.

If you can’t already tell, my creative wheels are spinning :wink:

1 Like

Delighted to hear you’re more inspired to continue building!

The CrowdStrike one is another great suite of tools to work with. You can actually take any supported Tines template, group action or Send-to-Story and add them as tools directly to the MCP server! So it’s easier than ever to make your own custom MCP server depending on your needs.

The guardrails piece is also a great call-out, especially for larger teams who want to want to gate access in some ways.

The docs explain it a bit more, but there’s a few ways you can tighten things up:

  • have the MCP server require a team-level API key or require OAuth
  • have the user on connecting actually select their own credentials (OAuth passthrough)!
  • hard code certain parameters in the attached tools. E.g for any tools that require a team parameter, you hard code the parameter in the Tines storyboard, which fixes it to that value when called via an MCP client.

Happy building!

1 Like