cd /news/ai-agents/your-mcp-server-will-drift-from-your… · home topics ai-agents article
[ARTICLE · art-25706] src=dev.to ↗ pub= topic=ai-agents verified=true sentiment=↑ positive

Your MCP server will drift from your app. Here's a build gate that stops it.

A developer building RyTask, an open-source project tracker, created a CI gate that ensures every UI feature has a corresponding MCP tool, preventing drift between the application and its agent interface. The gate checks that each capability declared in a module's test plan has a matching MCP tool and vice versa, failing the build if parity is broken. The approach treats AI agents as first-class clients, maintaining full parity between human and agent access.

read2 min publishedJun 12, 2026

When I added an MCP server to RyTask (an open-source project tracker), I made one promise:

anything a person can do in the UI, an AI agent can do over MCP.No read-only second-class agent access. Full parity.The problem with promises like that is they rot. You ship a new feature, wire it into the UI and the REST API, and forget the MCP tool. Three sprints later your "100% parity" is 86% parity and you don't know it. So I made parity a thing CI can

prove, and fail the build over.## The shape of the system

Every business module in RyTask declares the capabilities it owns and the MCP tools that expose them, in one file:

// work-items/module.testplan.ts
export const workItemsTestPlan = {
  capabilities: ['create', 'update', 'assign', 'comment', 'logTime', ...],
  mcpTools:     ['create_work_item', 'update_work_item', 'assign_work_item', ...],
}

A registry aggregates every module's tools. The MCP server is built from that same registry — there's no separate hand-maintained list to drift.

The gate #

check:mcp-parity

walks every capability and asserts a matching tool exists, and every tool maps back to a real capability. One missing pair fails CI:

const missingTool = capabilities.filter(c => !toolFor(c))
const orphanTool  = tools.filter(t => !capabilityFor(t))
if (missingTool.length || orphanTool.length) {
  console.error('MCP parity broken:', { missingTool, orphanTool })
  process.exit(1)
}

It currently reports

49/49. The day I add a "duplicate project" feature and forget the tool, the build goes red and tells me exactly which tool is missing. Parity stopped being a docs claim and became an invariant.## Why this matters beyond my project

AI agents are becoming real users of software. If your agent surface is a hand-curated subset of your product, it will always lag the UI, and your users' agents will hit walls the humans don't. Treating the agent as a first-class client — held to the same coverage by the same CI that guards everything else — is, I think, where a lot of tools are going to end up.

RyTask does the same trick for a few other invariants: module boundaries (you can't import another module's internals), multi-tenancy (every tenant-scoped query is auto-constrained to the caller's org at the repository layer, and tests assert cross-tenant isolation against a real Postgres), and a "closed testing" gate that fails the build if a

declared-requiredtest file is merely missing.It's all open source (AGPL-3.0), built solo. If you want to see the gates in action, the repo's here:

github.com/ali-maher-m/RyTask. I'd love feedback on the approach — especially from anyone else building MCP servers for real products.

── more in #ai-agents 4 stories · sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/your-mcp-server-will…] indexed:0 read:2min 2026-06-12 ·