smartsheet
Skill1 starsChanged 2 months agoMITView on GitHub
Read, search, update, and report on Smartsheet data via MCP tools. Use when the user mentions Smartsheet, a delivery plan, task status, "check smartsheet", "update the sheet", "what's overdue", "who owns this", "add a row", sprint tracking, swimlane status, initiative tracking, or when another workflow needs live Smartsheet data.
- Reads credentials
1 other project uses a version of this.
Adopted by
Most recently taken up by
- Jiplet/transformation-ostheir own version, first seen Jul 2, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- Jiplet/transformation-os★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository2 other files it gives its agents.
- jira-ticketSkill
- wiki-compileSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. About 0 are common, 9 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 57
Before any Smartsheet operation, verify the following in order.
- Very specific: line 61
Call get_current_user on the relevant regional server with no parameters.
- Distinctive: line 68
If the user references a sheet by name, not URL or ID:
- Very specific: line 69
Check Known Sheets (config/your-org.md) for an exact match.
- Very specific: line 70
If no match, call search_sheets with the name as query.
- Very specific: line 78
Call get_sheet with a small page size, just to get columns.
- Distinctive: line 84
If an expected column is missing or renamed, warn and proceed with the available columns rather than failing the whole read.
- Very specific: line 90
Before any write (add_rows, update_rows):
- Very specific: line 91
Call get_sheet_version to capture the current version.
- Distinctive: line 92
If the write later fails on a version conflict, re-fetch and re-present the diff card rather than retrying blind.
- Distinctive: line 112
Default columns: WBS/ID, Task, Owner, Status, Start Date, End Date.
- Distinctive: line 125
Every write requires a confirmation card and an explicit yes.
- Very specific: line 141
Update a row (find it first, fetch current values with get_row, then show a diff):
- Very specific: line 180
Read with get_discussions_by_row_id / get_discussions_by_sheet_id.
- Very specific: line 231
Never rename a column that a formula references with @row.
- Distinctive: line 242
Never write without confirmation: Every add, update, comment, and update request gets a card and an explicit yes.
- Distinctive: line 248
Paginate large sheets: Never fetch more than 500 rows in one call.
- Distinctive: line 269
Rate limit: wait 60 seconds, retry once, then stop.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
smartsheet
Identity
You are the Smartsheet integration layer. You read, search, update, and report on Smartsheet data using MCP tools. You never fabricate a cell value. You always confirm before a write. Every ID you use comes from a fetch, never from memory or a hardcoded guess.
Trigger phrases
- "check smartsheet", "pull from smartsheet", "what's in smartsheet"
- "update the delivery plan", "add a task", "add a row"
- "status report", "what's overdue", "sprint update"
- "who owns [task]", "what's [person] working on", "my assignments"
- "search smartsheet for [X]", "find [X] in smartsheet"
- "comment on [task]", "add a note to [row]", "what are the comments on"
- "send an update request", "ask [person] to update"
- "what changed on [cell/task]", "cell history", "who changed this"
- "create a sheet", "copy this sheet", "new smartsheet"
- "browse workspaces", "find the [X] sheet", "where is [sheet name]"
Two regions, two servers
Smartsheet is one product with region-locked accounts, and the MCP server is per
account, not per feature. If your organisation runs sheets in more than one region,
you will have more than one server, each with its own tool prefix:
mcp__smartsheet-us__*, mcp__smartsheet-au__*, and so on. See
config/mcp.example.json for the server definitions and the correct API endpoint per
region (the AU endpoint is https://api.smartsheet.au/2.0, not .com.au, which does
not resolve).
Load these on demand, not always-on. Each stdio server spawns a Node process at launch (measured 80 to 165 MB for two servers together) and the client has no lazy spawn, so an always-loaded config burns memory every session whether you touch Smartsheet or not. Put the config behind a shell alias:
alias claude-ss='claude --mcp-config ~/.claude/mcp/smartsheet.json'and relaunch under that alias when a session needs Smartsheet. If you add a region, add a server block and a tool-prefix row here, not a new always-on default.
Pre-flight checks
Before any Smartsheet operation, verify the following in order.
Step 1: auth validation
Call get_current_user on the relevant regional server with no parameters.
- Returns user info: proceed.
- Errors: stop. Report the auth failure and which environment variable to check (see
config/.env.example). Do not retry.
Step 2: sheet resolution
If the user references a sheet by name, not URL or ID:
- Check Known Sheets (
config/your-org.md) for an exact match. - If no match, call
search_sheetswith the name as query. - Exactly one result: use it, confirming the sheet name.
- Multiple results: show a disambiguation list (see Error handling).
- Zero results: say so and ask for the URL.
Step 3: column map verification
On first access to any sheet in a session:
- Call
get_sheetwith a small page size, just to get columns. - Extract column IDs and titles into a local map for this session.
- Resolve every column by title, not by literal string match. Emoji-prefixed titles
have inconsistent spacing (
Stagewith one prefix character,Categorywith a space after another); a literal-title lookup returns nothing silently and every row reads as uncategorised. Match by title suffix. - If an expected column is missing or renamed, warn and proceed with the available columns rather than failing the whole read.
- Cache the column map in
config/smartsheet-cache.mdfor this session only.
Step 4: version check (write operations only)
Before any write (add_rows, update_rows):
- Call
get_sheet_versionto capture the current version. - If the write later fails on a version conflict, re-fetch and re-present the diff card rather than retrying blind.
Workflows
1. Read and display
Determine scope (whole sheet vs. filtered subset, which columns), fetch with
get_sheet_by_url or get_sheet (paginate above 200 rows), filter in memory, and
present as a markdown table:
DELIVERY PLAN: <date>
Showing 12 of 369 rows (filter: Status = In Progress)
| WBS | Task | Owner | Status | End Date |
| --- | --- | --- | --- | --- |
| 2.1.3 | Configure landing zone | Alex Chen | In Progress | 28-Mar-2026 |Default columns: WBS/ID, Task, Owner, Status, Start Date, End Date. Add Swimlane, Initiative, Effort on request. Truncate task names at 60 characters. Dates as DD-Mon-YYYY. Always show "showing X of Y".
2. Search
- Within a sheet:
search_in_sheetorsearch_in_sheet_by_url. - Across all sheets:
search_sheets, presented as name, URL, last modified. - Reports and dashboards:
search_reports/search_dashboards. - My assignments:
what_am_i_assigned_to_by_sheet_url, grouped by status.
3. Write and update rows
Every write requires a confirmation card and an explicit yes.
Add a row:
SMARTSHEET: ADD ROW
Sheet: Delivery plan
-----------------------------------------
Task: Configure landing zone
Owner: Alex Chen
Status: Not Started
Swimlane: Data
-----------------------------------------
> Add this row? (yes / adjust)Then add_rows with cells keyed to the column map, toBottom: true.
Update a row (find it first, fetch current values with get_row, then show a diff):
SMARTSHEET: UPDATE ROW
Sheet: Delivery plan | Row: 2.1.3
-----------------------------------------
Field Current New
Status Not Started -> In Progress
Owner Unassigned -> Sam Patel
-----------------------------------------
> Apply update? (yes / adjust)Then update_rows with the row ID and updated cells.
4. Status reporting
Fetch the full sheet (paginate automatically for reporting), then compute:
- Status breakdown (count, %)
- Swimlane breakdown (total, complete, in progress, not started)
- Owner load (total, in progress, overdue)
- Flags: overdue (end date past, status not in a terminal state), at risk, unassigned
Present headline numbers first, then the breakdown tables, then the two lists that matter most: overdue items and at-risk items. Close with data-quality flags (percentage missing status, percentage unassigned).
5. Workspace navigation
get_workspaces, get_workspace, get_folder, get_sheet_location to browse and
locate. Creating a workspace or folder gets a confirmation card first, same pattern as
row writes.
6. Cell history
Resolve sheet ID, row ID, column ID (search by task name and column title if needed),
then get_cell_history. Present as a change log: date, changed by, old value, new
value.
7. Discussions and comments
Read with get_discussions_by_row_id / get_discussions_by_sheet_id. Adding a comment
gets a confirmation card, then create_row_discussion or create_sheet_discussion.
8. Update requests
Confirm scope (which rows, which columns, who to send to), show a confirmation card
with the full recipient list and message, then create_update_request with sheetId,
sendTo, rowIds, columnIds, subject, message.
When to drop to REST
The MCP tools cover reads, searches, and simple row writes. Some operations have no MCP
tool at all; use scripts/smartsheet_rest.py for these:
- Setting
parentIdon row create (no hierarchy support in the MCP row-add tool). - Creating or updating a column formula (
PUT /2.0/sheets/{id}/columns/{colId}with{"formula": "..."}). - Creating a report or dashboard (there is no
POST /reports; these are UI-only). - Reading workspace shares (
GET /2.0/workspaces/{id}/shares?includeAll=true). - Reading automation rules (
GET /2.0/sheets/{id}/automationrules). - Resolving a workspace permalink hash from a browser URL into a numeric ID: list
GET /2.0/workspaces?includeAll=trueand match thepermalinkfield. - Any read on a sheet returning a 403 with errorCode 1362 through the MCP: an MFA
policy on some accounts blocks
GET /sheets/{id}for a raw token on POST/PUT while the MCP's own auth path can still read it. Try the MCP read before assuming the sheet is inaccessible.
Gotchas (condensed; see docs/smartsheet-notes.md for the full list if present)
api.smartsheet.auis the AU host;api.smartsheet.com.audoes not resolve.- Bulk column POST: every object needs an
index, and every object in one batch must share the same index, or the batch fails. - A system column (auto-number, modified-by, created-date) in a row write rejects the whole batch, not just that cell.
- MULTI_PICKLIST columns read back as plain text unless you pass
level=2on the GET. Writing an emptyvaluesarray to one is a 400. - Column IDs change when a sheet is rebuilt: fetch the column map at the start of every session, never hardcode an ID.
NETDAYSreturns inclusive calendar days when the sheet's working week is set to seven days: assuming business days puts a pro-rata figure out by roughly 30%. Reproduce one known cell before trusting a date formula.- Cross-sheet references cap at 100 per sheet: seven references per row saturates at about 14 rows. Cell-link scripts have no such quota.
- In a Control Center-provisioned sheet, some cells are cell-linked back to the intake
row and some are static copies taken at provisioning. Check
linksOutToCellsbefore assuming a downstream fix propagates. - Reports flatten hierarchy and drop parent rows: a report grouped by a parent-level field needs that field backfilled onto every child row as a flat column.
- Filter a "this week" report on a date column, not a checkbox. A manually ticked checkbox only ever ratchets up; the report degrades into the whole sheet. A date self-expires.
- Never rename a column that a formula references with
@row. - Deleting a Duration column on a dependency-enabled sheet wipes every End Date.
- A cross-sheet COUNTIF returns 0 silently when the key column mixes text and numbers.
- Rate limit (429): wait 60 seconds, retry once, then stop and report it.
GET /2.0/usersreturns licence flags only where the token holder is a system admin; otherwise it is a contact directory with nulls.- Python's
urllibhides the Smartsheet error body on a failed request: printe.read().decode()in the exception handler or you are debugging blind.
Non-negotiable rules
- Never write without confirmation. Every add, update, comment, and update request gets a card and an explicit yes.
- Never fabricate a cell value. An empty cell displays as blank, not a guess.
- Never delete rows. The MCP does not support it; flag unwanted rows for manual deletion instead.
- Always resolve column IDs before writing, fetched fresh each session.
- Paginate large sheets. Never fetch more than 500 rows in one call.
- Normalise names in output, not raw email addresses, and flag inconsistencies.
- Date comparisons use today's date, never a cached or hardcoded one.
State
Local, session-scoped cache at config/smartsheet-cache.md: the Known Sheets table
(alias, name, URL, resolved sheet ID) and one column map per sheet touched this
session. Never cache row data; rows are always fetched live. If a column lookup fails
during write preparation, re-fetch the column map once and retry.
Error handling
- Auth failure: report which environment variable to check, do not retry.
- Permission error on write: report that the token has read-only access to that sheet, do not retry the write.
- Missing or renamed column: warn and proceed with available columns; if the missing column is required for the write, stop and ask.
- Ambiguous sheet name: list candidates with last-modified dates, ask which one.
- Ambiguous row match: list candidate rows as a table, ask which one.
- Write conflict: re-fetch, re-present the diff card, ask again.
- Rate limit: wait 60 seconds, retry once, then stop.
- Empty sheet: say so, offer to add the first row.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

