Piazza MCP demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured schemas. All 7 tools have input schemas with typed parameters and descriptions. Error handling is present (ToolError exceptions, validation). However, output schemas are not formally documented, responses are free-form strings rather than structured objects. Parameter descriptions could be more prescriptive about constraints (e.g., 'limit capped at 50' is stated but not enforced in schema). No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Missing pagination metadata (total count, has_more flag) in some responses.
Cross-class activity review: everything new on Piazza recently. Checks every enrolled class for posts created or updated within the last `hours` hours and returns one digest grouped by class, flagging unanswered questions. Each item shows its post number so get_post can fetch the full thread. Designed to be called by a daily scheduled task.
Browse recent posts in one class, newest first. Returns compact summaries (post number, type, subject, answer status, snippet). Use get_post with a post number for the full thread. folder filters to one folder (see get_folders); it takes precedence over unread_only. limit is capped at 50; page with offset.
List the folder names of one class, for filtering get_feed by folder. network_id comes from list_classes.
Read one full post thread by its post number (the @123 number). Returns the question, instructor and student answers with endorsement counts, and all followup discussions, rendered as markdown. Attachment links in the content can be read with read_attachment.
List the Piazza classes you are enrolled in. Returns one line per class with its name, term, and network_id. Every other piazza tool takes one of these network_id values. Call this first if you do not know the network_id.
Output schemas not documented. All tools return free-form strings (e.g., 'List the folder names of one class') rather than structured JSON objects. LLMs cannot reliably parse unstructured text or chain results to downstream tools.
No tool annotations. All 7 tools are read-only but lack readOnlyHint in schema. This prevents clients from optimizing caching, retry logic, or UI presentation for safe operations.
Pagination metadata incomplete. get_feed and search_posts return 'has_more' in formatted output but not in structured response. No total count or next_cursor. Large result sets risk context window exhaustion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Download a file linked in a Piazza post and extract its text. Use the link URLs that appear in get_post output. Relative URLs (starting with /) are resolved against piazza.com. Only Piazza-hosted files are fetched. Supports PDF and plain-text files only.
Search posts in one class by keyword. Piazza search is AND-only keyword matching with no ranking, so prefer short queries of 1-2 words ("midterm", "hw3 grading"). Returns the same compact summaries as get_feed; use get_post for full threads.
Parameter constraints stated in descriptions but not enforced in schema. 'limit capped at 50' is documented but JSON Schema lacks maxItems/maximum. LLMs may pass invalid values; validation happens at runtime.
Error messages lack recovery guidance. ToolError exceptions (e.g., 'Refusing to download from...', 'Attachment exceeds size limit') tell the user what failed but not what to do next. No actionable next steps for LLM.