edstem-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@edstem-mcpfind all unanswered questions about the midterm in course 1234"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
edstem-mcp
MCP server for Ed Discussion — expose Ed's full API to Claude and other MCP clients.
Setup
npm install
npm run buildSet your API token (get one at https://edstem.org/us/settings/api-tokens):
export ED_API_TOKEN=your_token
export ED_REGION=us # optional: us (default), au, etc.Related MCP server: Ed Discussions MCP Server
Claude Code
Add to ~/.claude.json:
{
"mcpServers": {
"edstem": {
"command": "node",
"args": ["/path/to/edstem-mcp/dist/index.js"],
"env": {
"ED_API_TOKEN": "your_token"
}
}
}
}Tools (22)
Tool | Description |
| Get authenticated user info and enrolled courses |
| List threads in a course (sortable, paginated) |
| Get thread by global ID with comments |
| Get thread by course-local number (the # in the UI) |
| Search threads by title, content, or category |
| Create a new thread (supports markdown input) |
| Edit an existing thread |
| Lock a thread |
| Unlock a thread |
| Pin a thread |
| Unpin a thread |
| Endorse a thread |
| Remove thread endorsement |
| Star/bookmark a thread |
| Remove star |
| Post a comment or answer on a thread |
| Reply to an existing comment |
| Endorse a comment |
| Remove comment endorsement |
| Accept a comment as the answer |
| List course roster (staff/admin) |
| List a user's threads and comments |
| Upload a file to Ed from a URL |
| Preview markdown to Ed XML conversion |
Resources (2)
Resource | URI | Description |
User Info |
| Authenticated user details |
Courses |
| Enrolled courses list |
Prompts (3)
Prompt | Description |
| Look up assignment details, requirements, and staff clarifications |
| List unresolved questions in a course |
| Show your recent posts and comments in a course |
Content Format
Thread and comment content uses Ed's XML document format. This server auto-converts markdown to Ed XML, so you can write content naturally:
# Heading
**Bold** and *italic* text with `inline code`
- Bullet list
- Items
1. Numbered
2. List
> [!info] This becomes an Ed calloutPass raw Ed XML (starting with <document) to bypass conversion.
Testing
npm testUses Node's built-in test runner (node:test). Tests cover the markdown-to-XML content converter and API client (URL construction, headers, error handling).
Available Tools
24 toolsaccept_answerA
Accept a comment as the answer to a question thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID | |
| comment_id | Yes | Comment ID to accept |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fails to disclose mutation side effects: it does not state whether acceptance is reversible, if it notifies the comment author, locks the thread, or replaces any previously accepted answer. Critical behavioral context for a state-changing operation is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence of nine words with zero redundancy. Information is front-loaded and every word earns its place regarding the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool without annotations or output schema, the description meets minimum viability but leaves significant gaps regarding authorization scope, permanence of the action, and side effects that would help an agent invoke this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both thread_id and comment_id are documented), so the baseline is adequate. The description does not add syntax details, validation rules, or semantic relationships between parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Accept') with clear resources ('comment' as 'answer' to 'question thread'), and distinguishes the Q&A workflow from sibling endorsement tools by specifying this marks the resolution to a question.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies use when marking a solution, it lacks explicit guidance on prerequisites (e.g., thread ownership requirements), when to prefer this over endorse_comment, or whether this action is reversible (no unaccept_answer sibling exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_threadC
Edit an existing thread. Only provided fields are updated.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID | |
| title | No | New title | |
| content | No | New body (markdown or Ed XML) | |
| type | No | ||
| category | No | ||
| subcategory | No | ||
| is_private | No | ||
| is_anonymous | No | ||
| is_pinned | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It discloses partial-update behavior but fails to mention mutation safety, authorization requirements, what happens if thread_id is invalid, or return value structure for this 9-parameter operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste—every word earns its place. Front-loaded with the action. However, given the low schema coverage, extreme brevity becomes a liability rather than a virtue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Inadequate for a complex mutation tool with 9 parameters and no output schema. Missing auth context, error conditions, and parameter relationships. The partial update note is insufficient compensation for the schema coverage gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (3 of 9 params documented). The description adds no compensatory information for the 6 undocumented parameters (category, subcategory, is_private, is_anonymous, is_pinned, type), leaving critical semantics like 'type' enum usage unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb ('Edit') and resource ('thread') clearly. The phrase 'existing thread' implicitly distinguishes from sibling tool 'post_thread' (creation), though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Only provided fields are updated' provides important guidance about partial update behavior (PATCH semantics), indicating optional parameters. However, it lacks explicit 'when to use vs. when to use post_thread' guidance or prerequisites like thread existence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endorse_commentC
Endorse a comment (staff)
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes | Comment ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure but fails to explain what endorsement actually does (visibility changes, official marking, etc.), whether it is reversible (despite unendorse_comment existing), or specific authorization requirements beyond the cryptic '(staff)' label.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the four-word description is not verbose, it is arguably underspecified rather than optimally concise. The parenthetical '(staff)' appears without context, suggesting the description sacrifices necessary clarity for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations or output schema, the description is insufficient. It fails to explain the endorsement mechanism, the scope of staff privileges required, side effects, or the relationship to the unendorse operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single comment_id parameter. The description adds no additional semantic context, but with complete schema coverage, it meets the baseline expectation without needing compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb ('Endorse') and resource ('comment'), distinguishing it from sibling tools like endorse_thread and unendorse_comment. However, the parenthetical '(staff)' is ambiguous—it could indicate required permissions or a specific endorsement type—preventing a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like endorse_thread, or when to use unendorse_comment instead. It does not clarify prerequisites implied by '(staff)' or explain endorsement workflows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endorse_threadC
Endorse a thread (staff)
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not explain what endorsement entails (e.g., visibility changes, notifications generated, idempotency), nor does it mention that the action is reversible via 'unendorse_thread' despite this being critical context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (three words) and front-loaded with the verb. While it avoids verbosity, it is underweight for the tool's complexity—omitting behavioral and contextual details that are necessary for safe invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a staff-privileged mutation tool with no output schema and no annotations, the description lacks necessary context about side effects, reversibility, and the relationship to sibling endorsement tools. It meets the bare minimum identification but leaves significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema fully documents the 'thread_id' parameter as 'Global thread ID'. The description adds no additional parameter semantics, but the baseline score of 3 applies per the rubric for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb (Endorse) and resource (thread), and the parenthetical '(staff)' hints at privilege requirements. However, it fails to differentiate from siblings like 'endorse_comment', 'star_thread', or 'accept_answer', leaving ambiguity about what specific 'endorsement' means in this context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like 'unendorse_thread' or 'star_thread'. The '(staff)' notation implies restricted access but does not clarify prerequisites, authorization requirements, or workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
format_contentA
Convert markdown text to Ed Discussion XML format (preview, no API call)
| Name | Required | Description | Default |
|---|---|---|---|
| markdown | Yes | Markdown text to convert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It successfully discloses key traits: 'no API call' indicates local processing, and 'preview' clarifies the non-destructive nature. Lacks details on output format, size limits, or specific markdown syntax supported, but covers the essential safety/scope profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with zero waste. Front-loaded verb ('Convert') followed by critical distinguishing parenthetical. Every word—including 'preview' and 'no API call'—earns its place by aiding tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a single-parameter utility with full schema coverage. The description explains the transformation and side-effect profile sufficiently. Minor gap: does not specify return value type (XML string?), though this is partially mitigated by the explicit format naming.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage ('Markdown text to convert'), so the description appropriately relies on the schema rather than repeating parameter details. Baseline 3 is correct when structured documentation is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific action (Convert), source format (markdown text), and target format (Ed Discussion XML). The parenthetical '(preview, no API call)' effectively distinguishes this utility from sibling posting tools like post_thread and post_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear behavioral context through 'preview' and 'no API call', implicitly signaling this is for local formatting verification rather than persistence. However, it does not explicitly name alternatives (e.g., 'use post_thread to actually publish') or state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_course_threadA
Get a thread by its course-local number (the # shown in the Ed UI)
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Course ID | |
| thread_number | Yes | Thread number within the course |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the addressing behavior (course-local vs. global IDs) which is crucial, but lacks information on error handling (what if thread_number doesn't exist?), return format, or rate limiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with zero waste. The information is front-loaded with the action verb, and the parenthetical efficiently adds UI context without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, 100% schema coverage) and the presence of a similar sibling tool, the description adequately covers the selection-critical distinction (course-local numbering). Minor gap: no mention of return structure or 404 behavior, though this is somewhat mitigated by the straightforward 'Get' operation type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema has 100% description coverage (baseline 3), the description adds valuable semantic context that 'thread_number' corresponds to 'the # shown in the Ed UI'—providing UI mapping context not present in the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') + resource ('thread') and clearly distinguishes this tool from sibling 'get_thread' by specifying the unique addressing scheme ('course-local number'). This specificity prevents selection errors between the two retrieval options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(the # shown in the Ed UI)' provides clear contextual guidance on when to use this tool (when referencing UI-visible numbers). However, it could explicitly contrast with 'get_thread' to clarify when to use each retrieval method.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadA
Get a thread by global ID, including all comments and answers
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully discloses the scope of returned data ('including all comments and answers'), which compensates partially for the missing output schema, though it omits explicit read-only status or error behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero redundancy. Every clause serves a distinct purpose: the action ('Get'), the identification method ('by global ID'), and the return payload scope ('including all comments and answers').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter retrieval tool, the description is appropriately complete. It compensates for the lack of output schema by describing the returned content structure (comments and answers), though it could be improved by noting the singular vs. plural return nature or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing a baseline of 3. The description reinforces the parameter semantics by referencing 'global ID' in the narrative, but does not add syntax details, example values, or constraints beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('thread'), and explicitly scopes the operation with 'by global ID'—effectively distinguishing it from sibling tools like get_course_thread (course-scoped) and list_threads (plural listing).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by global ID' provides implicit guidance on when to use this tool (when possessing a global identifier), but lacks explicit contrast with alternatives like get_course_thread or search_threads, and does not state prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userB
Get authenticated user info and enrolled courses
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It implies reliance on authentication context (no user ID parameter needed), but lacks disclosure of read-only nature, error cases (e.g., unauthenticated requests), rate limits, or exact return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single efficient sentence with zero waste. Information is front-loaded and appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool without output schema or annotations, the description minimally suffices by indicating what data is returned (user info plus courses). However, gaps remain regarding return structure, error handling, and behavioral side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters. According to scoring rules, 0 params establishes a baseline of 4. The description implies no arguments are needed, which aligns with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Get') and resources ('authenticated user info and enrolled courses'). The term 'authenticated' effectively distinguishes this from sibling 'list_users' by implying the current user context, though it doesn't explicitly contrast with alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this versus 'list_users' or other user-related tools. Does not mention prerequisites (e.g., requires active session) or explicit use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsC
List discussion threads in a course
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Course ID | |
| limit | No | Max threads to return (1-100) | |
| offset | No | Pagination offset | |
| sort | No | Sort order | new |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It fails to indicate that this is a read-only operation, does not explain pagination semantics despite the presence of limit/offset parameters, and omits what the tool returns or how it handles invalid course IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at five words, front-loaded with the action verb, and contains no redundant or wasted language. However, given the lack of annotations and output schema, it may be inappropriately terse rather than appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having complete schema documentation for inputs, the description is insufficient for a tool with no annotations and no output schema. It lacks critical context about return format, pagination behavior, and differentiation from sibling search/retrieval tools necessary for correct agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema adequately documents all four parameters (course_id, limit, offset, sort) including constraints and defaults. The description adds no additional semantic context beyond the schema, which aligns with the baseline score for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (List), resource (discussion threads), and scope (in a course). However, it fails to distinguish from sibling tools like 'search_threads' or 'get_course_thread', leaving ambiguity about which listing/retrieval tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'search_threads' (which likely supports filtering) or 'get_thread' (which retrieves a specific thread). There are no explicit prerequisites, exclusions, or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_activityB
List a user's recent threads and comments in a course
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | User ID | |
| course_id | Yes | Course ID | |
| limit | No | Max items | |
| offset | No | Pagination offset | |
| filter | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds the behavioral qualifier 'recent' implying temporal filtering, but fails to disclose ordering (chronological?), read-only safety, pagination limits, or what constitutes the 'recent' window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single-sentence description is appropriately front-loaded with the verb 'List' and contains no wasted words. However, given the tool's complexity (5 parameters including pagination and filtering), it borders on under-specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 80% schema coverage and absence of annotations/output schema, the description meets minimum viability but leaves gaps. It doesn't explain the relationship between filter types ('answer' vs 'comment'), return format, or how pagination behaves with 'recent' items.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, establishing a baseline of 3. The description adds semantic context mapping 'user' to user_id and 'in a course' to course_id, and hints at filter values ('threads and comments' aligns with the enum). However, it doesn't explain pagination strategy or limit constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists a user's threads and comments within a course scope, distinguishing it from sibling tools like list_threads (general listing) and get_user (profile data). It uses specific verbs ('List') and resources ('threads and comments'), though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like get_thread (for specific thread details) or list_threads (for course-wide activity). It lacks prerequisites or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersA
List all users enrolled in a course (requires staff/admin)
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Course ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Adds critical auth requirement ('requires staff/admin') but omits whether operation is read-only, pagination behavior, or what user data is returned since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single efficient sentence with zero waste. Parenthetical permission constraint is essential context. Front-loaded with action and resource; no filler words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a single-parameter list tool, but lacks details on return format, pagination, or whether 'users' includes students, staff, or both given no output schema or annotations to reference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage ('Course ID'), so baseline 3 applies. Description does not mention 'course_id' parameter, but schema adequately documents it without needing redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'List' with clear resource 'users enrolled in a course' and scope. Distinguishes from sibling 'get_user' (singular) and 'list_user_activity' (different resource) by specifying course enrollment context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides permission requirement '(requires staff/admin)' which constrains when to use it, but lacks explicit comparison to siblings like 'get_user' or guidance on when to prefer this over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lock_threadB
Lock a thread (prevent new replies)
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully explains the primary effect (preventing new replies) but omits important mutation context such as reversibility, whether existing replies remain visible, or required authorization levels.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise at six words. Every element earns its place: the action ('Lock'), the target ('a thread'), and the behavioral clarification ('prevent new replies') are all front-loaded with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter state-changing operation without output schema, the description is minimally adequate. However, given the tool mutates thread state and has a clear inverse (unlock_thread), the absence of any mention of reversibility or side effects leaves a noticeable gap in contextual completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for its single parameter ('Global thread ID'). The description adds no additional parameter context, meeting the baseline expectation for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lock'), resource ('thread'), and specific behavioral scope ('prevent new replies'). The parenthetical clarification effectively distinguishes this from sibling operations like pin_thread or star_thread, though it doesn't explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., when to lock vs. pin), nor does it mention prerequisites like moderation permissions or the existence of unlock_thread as the inverse operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_threadC
Pin a thread to the top
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure but fails to address critical behavioral traits: whether multiple threads can be simultaneously pinned, what happens to previously pinned threads, if the operation is idempotent, or what authorization is required. 'Pin' implies a mutation but specifics are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief (4 words) and efficiently structured, but given the lack of annotations and output schema, it is underspecified rather than appropriately concise. It fails to provide the necessary behavioral context that would justify its brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, the description is incomplete. It omits: the scope of 'top' (forum, category, global), return value information, error conditions (e.g., thread not found), and side effects on other threads' pinned status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage ('Global thread ID'), establishing a baseline of 3. The description itself adds no parameter-specific context (e.g., where to find this ID, format requirements), but the schema is sufficiently self-documenting for this single-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description provides a clear verb ('Pin') and resource ('thread'), and the phrase 'to the top' distinguishes it from sibling tools like star_thread (marking as favorite) and lock_thread (restricting access). However, it lacks domain context (e.g., 'top of the forum/feed') that would make it a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this tool versus alternatives like star_thread, or prerequisites such as required permissions. The existence of unpin_thread as a sibling suggests a reversible state, but the description doesn't clarify the relationship or when to prefer pinning over other actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_commentB
Post a comment or answer on a thread. Content can be markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID | |
| content | Yes | Comment body (markdown or Ed XML) | |
| type | No | Comment or answer | comment |
| is_private | No | ||
| is_anonymous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses markdown support ('Content can be markdown') but fails to mention side effects, permission requirements, whether posting triggers notifications, or what determines success/failure. Adequate but minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise at two sentences. First sentence establishes purpose; second adds format context. No filler words or redundant information. Efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter write operation with no output schema, the description covers the basics but leaves significant gaps. The privacy and anonymity parameters are unexplained, and there's no indication of return values or error conditions. Minimum viable coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% (is_private and is_anonymous lack descriptions). The description mentions markdown (aligning with content) and comment/answer distinction (aligning with type) but does not compensate for the undocumented boolean flags. No syntax guidance or examples provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core action ('Post a comment or answer') and target resource ('on a thread'). It distinguishes from post_thread (creating threads) by specifying commenting on existing threads, though it could better differentiate from reply_to_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings like reply_to_comment. No explanation of when to choose 'answer' versus 'comment' type, or when to use the privacy/anonymity flags. Completely absent decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_threadB
Create a new discussion thread. Content can be markdown (auto-converted to Ed XML).
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Course ID | |
| title | Yes | Thread title | |
| type | No | Thread type | post |
| category | Yes | Category name | |
| subcategory | No | Subcategory name | |
| content | Yes | Thread body (markdown or Ed XML) | |
| is_private | No | Private thread | |
| is_anonymous | No | Post anonymously | |
| is_pinned | No | Pin the thread |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, description carries full burden. Adds valuable behavioral detail that markdown is 'auto-converted to Ed XML,' but fails to disclose mutation nature (persistence, visibility implications) or error conditions beyond what the schema boolean flags imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely efficient at two sentences. Front-loaded with primary action, second sentence provides essential format-specific implementation detail. No redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for basic invocation with complete schema coverage, but gaps remain for a creation tool: no description of return values (thread ID? object?), success/failure indicators, or side effects like notifications triggered. Missing output schema increases burden on description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, establishing baseline 3. Description adds meaningful context that content is auto-converted from markdown to Ed XML, helping agents understand the content parameter's processing behavior beyond the schema's plain description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Create a new discussion thread' with clear verb and resource. Distinguishes reasonably from siblings like post_comment and edit_thread through the term 'thread,' though could explicitly contrast with edit_thread or reply operations for maximum clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this versus post_comment (replies), edit_thread, or when anonymous/private posting is appropriate. No prerequisites mentioned (e.g., requiring valid course_id or category existence).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_commentC
Reply to an existing comment
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes | Comment ID to reply to | |
| content | Yes | Reply body (markdown or Ed XML) | |
| is_private | No | ||
| is_anonymous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but offers none. It fails to explain side effects (notifications sent to original commenter), visibility rules (public vs private replies), or the implications of anonymous posting despite these being configurable via parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief (four words), which prevents verbosity, but this conciseness comes at the cost of usefulness. The single sentence fails to earn its place by adding value beyond the tool name itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters (2 undocumented), no output schema, and no annotations, the description is inadequate. It omits crucial context about privacy controls, reply threading behavior, and return values that an agent would need to use this tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (comment_id and content described; is_private and is_anonymous undocumented). The description adds no parameter context to compensate—critical gaps remain around what 'is_private' and 'is_anonymous' actually control, and no mention of the 'Ed XML' format referenced in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Reply to an existing comment' largely restates the tool name (tautology). While it confirms the basic action, it fails to distinguish this tool from the sibling 'post_comment', leaving ambiguity about when to create a new comment versus replying to an existing one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'post_comment', 'edit_thread', or other interaction tools. There are no prerequisites mentioned (e.g., needing the comment_id from a previous call) or warnings about usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_threadsB
Search threads in a course by title, content, or category
| Name | Required | Description | Default |
|---|---|---|---|
| course_id | Yes | Course ID | |
| query | Yes | Search query (matches title, content, and category) | |
| category | No | Filter by category name (exact match) | |
| limit | No | Max threads to fetch before filtering |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but discloses minimal behavioral details. It doesn't specify if the search is case-sensitive, fuzzy vs exact matching (beyond the category parameter schema), result ordering, or what the return payload contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, efficient sentence of nine words. Information is front-loaded and immediately actionable with no redundancy or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the comprehensive input schema (100% coverage) and absence of an output schema, the description provides the minimum viable context for a search operation. However, it omits expected details about result structure or pagination behavior that would be necessary given the 'limit' parameter implies result set management.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, establishing a baseline of 3. The description aggregates the parameter purposes ('by title, content, or category') but adds no additional semantic context such as query syntax, wildcard support, or examples that the schema doesn't already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action (Search), resource (threads), and scope (in a course). Mentions searchable fields (title, content, category) which distinguishes it from generic retrieval tools like get_thread or list_threads, though it doesn't explicitly clarify when to choose this over list_threads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives like list_threads or get_course_thread. Does not mention prerequisites (e.g., user permissions) or when search is preferable to direct retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
star_threadC
Star/bookmark a thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full disclosure burden. While 'star/bookmark' implies a state mutation, the description lacks critical safety context: reversibility (via unstar_thread), idempotency, permission requirements, or failure modes. For a write operation with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely efficient at three words with zero redundancy. However, given the absence of annotations and behavioral details, the description is arguably too terse rather than appropriately sized. The structure itself is sound with the action front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Inadequate for a state-mutating tool with no output schema and no annotations. The description omits the existence of the direct inverse operation (unstar_thread), does not clarify the persistence of the bookmark, and lacks error context. A minimal viable description for this mutation should mention reversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Global thread ID'), so the schema fully documents the parameter. The description adds no supplemental context about the ID format, where to obtain it, or examples, but baseline 3 is appropriate when the schema is self-sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses specific verbs ('Star/bookmark') and identifies the resource ('thread'), making the core action clear. However, it fails to differentiate from sibling tool 'pin_thread' (which typically makes content prominent for all users vs. personal bookmarking) or indicate this is the inverse of 'unstar_thread'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives like 'pin_thread' for prominent display. Does not mention that 'unstar_thread' reverses this action or whether starring is idempotent. No prerequisites or conditions are specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unendorse_commentC
Remove endorsement from a comment
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes | Comment ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but fails to specify idempotency (what happens if the comment is already unendorsed?), authorization requirements, or side effects. It only states the action without explaining operational constraints or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single four-word sentence that is front-loaded and efficient. While it avoids verbosity, its extreme brevity contributes to under-specification; it earns its place but could accommodate one additional sentence of behavioral context without sacrificing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation operation with no annotations and no output schema, the description is insufficient. It lacks critical context such as success/failure conditions, whether the operation is idempotent, and what state changes occur on the comment, which are necessary for an agent to invoke the tool safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage (comment_id is documented as 'Comment ID'), establishing a baseline score. The description implies the comment_id parameter by mentioning 'a comment' but adds no semantic detail about the parameter's format, constraints, or relationship to the operation beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Remove) and target (endorsement from a comment), distinguishing it from sibling tools like unendorse_thread. However, it essentially restates the tool name with minor expansion ('unendorse' → 'Remove endorsement'), lacking domain-specific elaboration on what endorsement means in this context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus its sibling endorse_comment (the inverse operation), nor does it mention prerequisites such as whether the user must have previously endorsed the comment or have specific permissions to remove the endorsement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unendorse_threadC
Remove endorsement from a thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. While 'Remove' implies a mutative operation, the description fails to disclose error conditions (e.g., thread not found), idempotency, authorization requirements, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely brief at only four words. While efficient and without redundancy, it borders on under-specification for a mutative operation; a single additional sentence explaining behavior or prerequisites would improve utility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single ID parameter, no output schema), the description is minimally viable but leaves gaps. Without annotations to indicate safety or destructiveness, the description should have elaborated on behavioral outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage ('Global thread ID'), so the baseline is 3. The description adds no additional parameter semantics, but none are needed given the complete schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Remove') and resource ('endorsement from a thread'), accurately describing the operation. However, it does not explicitly differentiate from siblings like 'unendorse_comment' or explain the relationship to 'endorse_thread' within the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives (e.g., 'endorse_thread'), nor does it mention prerequisites such as whether the thread must currently be endorsed or what happens if called repeatedly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlock_threadC
Unlock a thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but fails to explain what unlocking accomplishes (e.g., allowing new comments), whether the operation is idempotent, or what authorization is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at three words with no redundancy. However, this brevity contributes to under-specification rather than efficient communication of essential details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, output schema, and the presence of inverse sibling operations, the description is incomplete. It fails to explain the business logic of unlocking or its relationship to the lock_thread tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for the thread_id parameter ('Global thread ID'). The description adds no additional semantic context about the parameter, but the baseline score of 3 is appropriate given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Unlock a thread' is a tautology that restates the tool name (unlock_thread) with minimal modification. While it identifies the verb and resource, it fails to distinguish from the sibling tool lock_thread or clarify the scope of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus lock_thread, nor are prerequisites stated (e.g., that the thread must be locked first). The description offers no 'when-to-use' or 'when-not-to-use' context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpin_threadC
Unpin a thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It fails to mention whether the operation is reversible, what happens if the thread is already unpinned, or any side effects on thread ordering/visibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the three-word description is not verbose, it suffers from under-specification rather than genuine conciseness. Every sentence should earn its place, but this provides minimal value beyond the tool name itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is inadequate. It omits behavioral scope, error conditions, and relationship to the pinning system that would help an agent invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage (thread_id is documented as 'Global thread ID'), the baseline is 3. The description adds no additional parameter context (e.g., where to find this ID, format constraints), so it meets but does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Unpin a thread' is tautological—it simply restates the tool name with spaces instead of underscores. It fails to specify what 'unpinning' means functionally (e.g., removing from top of list) and does not distinguish from the sibling 'pin_thread' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance provided on when to use this tool versus 'pin_thread' or other sibling tools. No mention of prerequisites (e.g., thread must be pinned first) or expected outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unstar_threadC
Remove star from a thread
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Global thread ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action but omits critical operational details such as idempotency (whether calling it on an unstarred thread errors or succeeds silently), authentication requirements, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief (5 words) with no redundant or wasted language. However, the brevity leaves significant informational gaps that should have been included given the lack of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no output schema and no annotations, the description is insufficient. It lacks behavioral constraints, error conditions, or domain context necessary for reliable agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 'Global thread ID' documented. The description adds no parameter-specific context, but this meets the baseline expectation when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description expands 'unstar' to 'Remove star from a thread', providing a clear verb and resource. However, it does not explain what 'starring' represents in this domain (e.g., bookmarking vs. liking) or distinguish this tool from its inverse sibling 'star_thread'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It fails to mention prerequisites (e.g., whether the thread must currently be starred) or the relationship to 'star_thread'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_file_from_urlA
Upload a file to Ed from a URL, returns the static file link
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL of the file to upload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full disclosure burden. While it mentions the return value ('static file link'), it omits critical behavioral details: supported file types, size limits, URL accessibility requirements, timeout behavior, or error handling for invalid URLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single 11-word sentence with zero waste. Front-loaded with action ('Upload a file'), followed by source ('from a URL'), and return value. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a single-parameter tool without output schema—description compensates by stating the return type. However, given this is a file upload operation, it should mention supported formats or that the URL must be publicly reachable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage for the single 'url' parameter. Description adds no additional parameter semantics (e.g., format details, examples), but baseline 3 is appropriate given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description provides specific verb ('Upload'), clear resource ('file'), and target system ('Ed'). Distinct from sibling tools which exclusively handle threads, comments, and users—this is the only file operation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Lacks explicit 'when to use' guidance or prerequisites (e.g., URL must be publicly accessible). However, as the sole file-handling tool among thread/comment siblings, its purpose is implicitly clear. No alternatives or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes targeting specific resources and actions (e.g., get_thread vs. list_threads, post_thread vs. edit_thread). However, some overlap exists between post_comment and reply_to_comment, as both involve adding comments, though the latter specifies replying to an existing comment. Tools like star_thread and unstar_thread are clearly paired opposites, reducing ambiguity.
Tool names follow a highly consistent verb_noun pattern throughout, using snake_case uniformly. Actions are clear (e.g., get, list, post, edit, lock, unlock) and paired opposites are consistently prefixed (e.g., endorse/unendorse, pin/unpin). This predictability makes it easy for an agent to understand and select tools.
With 24 tools, the count is borderline high for a discussion forum server, potentially feeling heavy. While the tools cover many operations, some might be niche (e.g., format_content, upload_file_from_url) or staff-only (e.g., endorse_comment), which could be consolidated or omitted without losing core functionality. A more streamlined set of 15-20 tools might be more appropriate.
The tool surface provides comprehensive coverage for a discussion forum domain, including full CRUD/lifecycle operations for threads and comments (create, read, update, delete via editing/removing actions), moderation features (lock, pin, endorse), search, user management, and file uploads. There are no obvious gaps, and agents can handle typical workflows without dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Official Microsoft MCP Server to query Microsoft Entra data using natural language
MCP-native collaborative markdown editor with real-time AI document editing
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceMCP server for Ed Discussion that enables viewing profile, courses, lessons, threads, and submitting slide answers via natural language.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Ed Discussions (EdStem) course discussions, manage threads, comments, and facilitate Q&A, with tools for analytics and read status control.MIT
- AlicenseNot gradedqualityCmaintenanceEnables managing Canvas LMS courses, assignments, grades, modules, and more from MCP-compatible clients like Claude Desktop, Kiro, or Amazon Q Developer.MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that allows AI assistants to access EdStem course discussion boards, including listing courses, fetching posts, searching, and retrieving thread details, with automated SSO login support for Georgia Tech.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rob-9/edstem-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server