{
  "id": 1423789,
  "title": "\"I built a lying MCP server on purpose — here's how you catch it\"",
  "url": "https://urgent.news/2026/08/17/i-built-a-lying-mcp-server-on-purpose-heres-how-you-catch-it",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-17T05:06:18.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/wolfejam/i-built-a-lying-mcp-server-on-purpose-heres-how-you-catch-it-102g"
  },
  "original_language": "en",
  "account": "The author created a malicious version of a system called MCP server, named mcp-worse. This server intentionally violates the protocol's claims of having a cache-stamped, ordered list of tools and matching cache-scope. The purpose was to test a tool called contrast-smoke, which compares the behavior of legitimate and malicious MCP servers by running both as separate processes and examining their wire traffic. mcp-worse serves as a \"liar\" that reliably violates the contract, allowing contrast-smoke to prove whether it can detect such violations. The test confirms that the contract exists, even if it's not being followed, and that the checker can identify when a server is lying. This method doesn't provide security scanning or fuzzing capabilities, but rather focuses on a specific, well-defined claim in the protocol.",
  "summary": "TL;DR — A server's README can say anything. Its tools/list response either backs that up or it doesn't. I built mcp-worse — a second binary, sharing two of mcp-better 's tool names, that deliberately omits the list-cache stamps and serves tools in the wrong order — so a test could prove the difference. That test is contrast-smoke : one command, real MCP clients, real wire traffic. Exit code 0…",
  "key_points": [
    "Author created malicious MCP server named mcp-worse",
    "Server intentionally violates protocol's claims",
    "mcp-worse used to test contrast-smoke tool"
  ],
  "editors_take": "Creating a deliberately malicious server to test a detection tool reveals that the protocol's contract can be verified even when not followed, and that the checker can identify violations reliably.",
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}