Skip to main content
Glama
mcp-cursor-demo-server

mcp-cursor-demo-server

mcp-cursor-demo-server

A runnable MCP server that demonstrates one specific bug: offset pagination silently returns the wrong page when an agent replays a cursor against different filters.

list_records(status="open", limit=5)   -> nextCursor: "..."
list_records(status="closed", cursor)  -> offset 5 of a different result set

Same response shape, different rows, no error. The model summarises it and the answer is wrong.

This server returns invalid_cursor instead.

Run

npx mcp-cursor-demo-server

No build step, no database, no API keys. 120 in-memory records.

Claude Desktop / Cursor / any MCP client

{
  "mcpServers": {
    "cursor-demo": {
      "command": "npx",
      "args": ["-y", "mcp-cursor-demo-server"],
      "env": { "CURSOR_SECRET": "pick-a-long-random-string" }
    }
  }
}

Related MCP server: redis-guard-mcp

Tools

Tool

What it does

list_records

One page of records filtered by status / owner. Returns matched, returned, complete, nextCursor.

dataset_summary

Total count plus counts by status and owner.

Try the bug

  1. list_records({ status: "open", limit: 5 }) → returns 5 rows and a nextCursor.

  2. list_records({ status: "closed", limit: 5, cursor: "<that cursor>" }) → invalid_cursor: "Cursor was issued for different filters. Start again from the first page."

With a plain offset cursor, step 2 would have returned rows 6–10 of the closed set as if they were a continuation. No error anywhere.

What the cursor carries

payload = { v: 1, f: filterFingerprint(filters), o: offset, exp: expiresAt }
cursor  = base64url(payload) + "." + hmacSha256(payload, secret)

filterFingerprint is order-insensitive, so {a:1,b:2} and {b:2,a:1} hash the same. Signature comparison uses timingSafeEqual. Expired cursors are rejected.

Scope

This is the demo: two tools, in-memory data, stdio only.

The production starter kit adds scoped bearer auth, per-token rate limiting, stdio and Streamable HTTP transport, a read-only tool guard, structured logs, and the full test suite: https://legaza.gumroad.com/l/mcp-kit (79 EUR, one payment).

If you only want the cursor logic, the standalone library is mcp-cursor-guard (MIT).

License

MIT

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Provides read-only SQL analytics on local CSV, Parquet, and JSON datasets using DuckDB, with pagination, security guardrails, and health monitoring.
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables safe, read-only interaction with Redis databases via cursor-based tools for retrieving keys, hashes, lists, sets, and sorted sets, backed by ACL DRYRUN-verified privilege checks.
      13
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables loading persona documents, searching summarized and original canon text with evidence verification, and paginated reading of full source files with per-file SHA-256 integrity checks. Provides user-authorized persistent memory that can be queried, saved, corrected, and deleted under per-user isolation and version checks, backed by D1 storage and R2 file retrieval on Cloudflare Workers.
      AGPL 3.0