memos/server/router/mcp/evals/memos_eval.xml
boojack 047175dbed chore(mcp): improve tool discoverability, add orientation tools and evals
Make the OpenAPI-driven MCP surface more usable by agents, following the
mcp-builder guidance.

- Enrich proto descriptions (single source of truth, flows to OpenAPI + MCP
  tool descriptions): document the memo `filter` CEL grammar with fields and
  examples (replacing the dangling "Refer to Shortcut.filter"), clarify the
  created_ts/updated_ts vs create_time/update_time naming, the visibility
  enum, the declarative replace semantics of Set* ops, and steer tag filters
  to `"x" in tags` (not the unsupported `tag == "x"`).
- Mark SetMemoAttachments / SetMemoRelations idempotent via a per-operation
  override the HTTP-method heuristic can't express.
- Curate two read-only orientation tools: shortcut_list_shortcuts (surfaces
  reusable CEL filters) and auth_get_current_user (the single allowed
  auth/identity op, for resolving the current user); guard test updated to
  keep the rest of the auth/user surface excluded.
- Add a task-level evaluation suite (server/router/mcp/evals) with 10
  verified questions, pinned to the deterministic demo seed.
2026-06-27 10:32:42 +08:00

62 lines
2.7 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
Task-level evaluation for the memos MCP server.
These questions test whether an LLM can accomplish realistic tasks by
composing the curated MCP tools (memo_list_memos with CEL filters,
memo_list_memo_comments, memo_list_memo_reactions, shortcut_list_shortcuts,
auth_get_current_user, ...). They are NOT unit tests of the server plumbing —
see *_test.go for that.
Answers are pinned to the deterministic seed in
store/seed/sqlite/01__dump.sql and were verified by querying a fresh
demo-mode instance. Run against a freshly seeded instance ONLY (the public
demo at demo.usememos.com is a shared, mutable account and will not match).
See README.md in this directory for how to launch one.
Questions deliberately avoid absolute dates: the seed uses relative
timestamps (strftime('now','-N days')), so only relative ordering, counts,
and content are stable.
-->
<evaluation>
<qa_pair>
<question>Look at every memo in the instance and add up all the emoji reactions across them. What is the total number of reactions?</question>
<answer>12</answer>
</qa_pair>
<qa_pair>
<question>How many memos are pinned?</question>
<answer>2</answer>
</qa_pair>
<qa_pair>
<question>Considering only the memos that are NOT pinned, one of them has more reactions than any other. That memo is about a book the author started reading. What is the title of that book?</question>
<answer>Deep Work</answer>
</qa_pair>
<qa_pair>
<question>Two memos are pinned. One contains external hyperlinks and the other does not. Give the single tag of the pinned memo that contains hyperlinks.</question>
<answer>sponsors</answer>
</qa_pair>
<qa_pair>
<question>How many memos contain at least one fenced code block?</question>
<answer>2</answer>
</qa_pair>
<qa_pair>
<question>How many distinct users have authored the memos in this instance?</question>
<answer>2</answer>
</qa_pair>
<qa_pair>
<question>Find the memo that is a cheat sheet of git commands. How many comments does it have?</question>
<answer>2</answer>
</qa_pair>
<qa_pair>
<question>Find the memo containing a movie watchlist. What is the username of the user who created it?</question>
<answer>alice</answer>
</qa_pair>
<qa_pair>
<question>Exactly one memo is a travel bucket list. It names a Nordic country the author plans to visit in winter to see the Northern Lights. Which country?</question>
<answer>Iceland</answer>
</qa_pair>
<qa_pair>
<question>Using the authenticated session, what is the username (login name) of the account these memos belong to?</question>
<answer>demo</answer>
</qa_pair>
</evaluation>