agentleFS
JipletJiplet/wiki-to-ticket/skills/smartsheet/SKILL.md

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

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    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.

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
  1. Distinctive:

    Before any Smartsheet operation, verify the following in order.

    line 57
  2. Very specific:

    Call get_current_user on the relevant regional server with no parameters.

    line 61
  3. Distinctive:

    If the user references a sheet by name, not URL or ID:

    line 68
  4. Very specific:

    Check Known Sheets (config/your-org.md) for an exact match.

    line 69
  5. Very specific:

    If no match, call search_sheets with the name as query.

    line 70
  6. Very specific:

    Call get_sheet with a small page size, just to get columns.

    line 78
  7. Distinctive:

    If an expected column is missing or renamed, warn and proceed with the available columns rather than failing the whole read.

    line 84
  8. Very specific:

    Before any write (add_rows, update_rows):

    line 90
  9. Very specific:

    Call get_sheet_version to capture the current version.

    line 91
  10. Distinctive:

    If the write later fails on a version conflict, re-fetch and re-present the diff card rather than retrying blind.

    line 92
  11. Distinctive:

    Default columns: WBS/ID, Task, Owner, Status, Start Date, End Date.

    line 112
  12. Distinctive:

    Every write requires a confirmation card and an explicit yes.

    line 125
  13. Very specific:

    Update a row (find it first, fetch current values with get_row, then show a diff):

    line 141
  14. Very specific:

    Read with get_discussions_by_row_id / get_discussions_by_sheet_id.

    line 180
  15. Very specific:

    Never rename a column that a formula references with @row.

    line 231
  16. Distinctive:

    Never write without confirmation: Every add, update, comment, and update request gets a card and an explicit yes.

    line 242
  17. Distinctive:

    Paginate large sheets: Never fetch more than 500 rows in one call.

    line 248
  18. Distinctive:

    Rate limit: wait 60 seconds, retry once, then stop.

    line 269

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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:

  1. Check Known Sheets (config/your-org.md) for an exact match.
  2. If no match, call search_sheets with the name as query.
  3. Exactly one result: use it, confirming the sheet name.
  4. Multiple results: show a disambiguation list (see Error handling).
  5. Zero results: say so and ask for the URL.

Step 3: column map verification

On first access to any sheet in a session:

  1. Call get_sheet with a small page size, just to get columns.
  2. Extract column IDs and titles into a local map for this session.
  3. Resolve every column by title, not by literal string match. Emoji-prefixed titles have inconsistent spacing (Stage with one prefix character, Category with a space after another); a literal-title lookup returns nothing silently and every row reads as uncategorised. Match by title suffix.
  4. If an expected column is missing or renamed, warn and proceed with the available columns rather than failing the whole read.
  5. Cache the column map in config/smartsheet-cache.md for this session only.

Step 4: version check (write operations only)

Before any write (add_rows, update_rows):

  1. Call get_sheet_version to capture the current version.
  2. 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_sheet or search_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 parentId on 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=true and match the permalink field.
  • 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.au is the AU host; api.smartsheet.com.au does 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=2 on the GET. Writing an empty values array 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.
  • NETDAYS returns 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 linksOutToCells before 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/users returns licence flags only where the token holder is a system admin; otherwise it is a contact directory with nulls.
  • Python's urllib hides the Smartsheet error body on a failed request: print e.read().decode() in the exception handler or you are debugging blind.

Non-negotiable rules

  1. Never write without confirmation. Every add, update, comment, and update request gets a card and an explicit yes.
  2. Never fabricate a cell value. An empty cell displays as blank, not a guess.
  3. Never delete rows. The MCP does not support it; flag unwanted rows for manual deletion instead.
  4. Always resolve column IDs before writing, fetched fresh each session.
  5. Paginate large sheets. Never fetch more than 500 rows in one call.
  6. Normalise names in output, not raw email addresses, and flag inconsistencies.
  7. 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.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.