A Model Context Protocol (MCP) server for interacting with the Smartsheet API. This server provides tools for searching, retrieving, and updating Smartsheet sheets through the MCP protocol.
The Smartsheet MCP server has 30 tools with generally consistent schema quality and descriptions. Schemas are well-formed using Zod validators with type constraints (e.g., regex validation for numeric IDs in discussion tools). However, several critical issues limit the score: (1) tool names lack action-oriented verbs for search/discovery tools (e.g., 'search_sheets', 'search_folders' use the same naming pattern, creating ambiguity for LLMs); (2) many descriptions are generic and lack context about when to use each tool versus similar ones; (3) output schemas are not documented in the tool definitions, only tool names and input schemas are visible in code; (4) pagination support exists but is inconsistently described across tools; (5) error handling returns raw error messages without actionable recovery guidance. Strengths include consistent parameter naming, input validation via Zod (numeric ID regex patterns, boolean flags clearly defined), and 100% of tools having descriptions and input schemas. The median tool description length is ~60-80 characters, which is appropriate. Overall, this is a competent implementation that handles the Smartsheet API surface well but lacks the documentation depth and error guidance expected of production-grade agent tools.
Adds new rows to a sheet
Creates a new folder in a folder
Creates a new discussion on a row
Creates a new discussion on a sheet
Creates an update request for a sheet
Creates a new workspace
Creates a new folder in a workspace
Ambiguous naming for discovery tools: 'search_sheets', 'search_in_sheet', 'search_in_sheet_by_url' are similar and could be confused by LLMs. Lack clear distinctions between global search and sheet-scoped search. Naming does not follow verb_noun pattern consistently.
Tool 'what_am_i_assigned_to_by_sheet_id' uses non-idiomatic naming (natural language question form) instead of verb_noun pattern. This violates standard naming conventions and obscures intent for LLM tool selection. Should be renamed to 'get_assigned_tasks_by_sheet_id' or 'list_my_assignments'.
Output schemas are not documented in tool definitions. Tool implementations return 'content' array with text field, but return type structure is not declared in schema. LLMs cannot plan downstream operations without knowing what fields are available in responses. This violates the documented schema requirement.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 63 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 31 | - | v1 |
Retrieves the history of changes for a specific cell
Gets the current user's information
Gets discussions by row ID
Gets discussions by sheet ID
Retrieves the current state of a folder, including its contents which can be sheets, reports, or other folders
Retrieves a specific row from a sheet
Retrieves the current state of a sheet, including rows, columns, and cells
Retrieves the current state of a sheet, including rows, columns, and cells
Gets the current version number of a sheet
Gets a user's information by ID
Retrieves the current state of a Workspace, including its contents which can be sheets, reports, or other folders
Retrieves my Workspaces
Lists all users
Search for dashboards by name
Search for folders by name
Search cell data and summary fields for a specific sheet
Search cell data and summary fields for a specific sheet by URL
Search for reports by name
Search for sheets by name, cell data, or summary fields
Search for workspaces by name
Updates rows in a sheet, including cell values, formatting, and formulae
Search a sheet by ID to find assigned tasks
Search a sheet by URL to find assigned tasks
Error handling returns generic error messages without actionable recovery guidance. E.g., 'Failed to get discussions: <error.message>' does not tell the LLM whether to retry, try a different approach, or ask the user. Should include recovery hints like 'Invalid sheet ID. Call search_sheets() to find valid sheet IDs.'
Pagination parameters (pageSize, page, includeAll) are inconsistently described. Some tools describe 'pageSize' as 'Number of discussions to return per page' but do not specify range constraints (e.g., 1-100). LLMs may pass unbounded values causing API failures.
Search tool descriptions lack context about when to use each variant. E.g., 'search_sheets', 'search_in_sheet', and 'search_in_sheet_by_url' should clarify: search_sheets searches across all sheets; search_in_sheet narrows to one sheet by ID; search_in_sheet_by_url is for when you have a URL instead of ID. Descriptions are currently identical.
Multiple tools that accept both 'by ID' and 'by URL' variants (e.g., get_sheet vs get_sheet_by_url, what_am_i_assigned_to_by_sheet_id vs what_am_i_assigned_to_by_sheet_url) create LLM confusion about which to call. Best practice: single tool accepting either ID or URL parameter, or clear documentation of when each variant is preferred.
Parameter 'include' is described generically as 'Optional parameter to include additional information (e.g., 'attachments')' but does not enumerate all valid values. LLMs cannot determine what options are available without calling the tool. Should document as enum or explicit list: 'Valid values: attachments, comments, versions'.