mcp-server-smartsheet-rm

io.github.christianclaudioPublished by GitHub account christianclaudiov2.2.0Updated Oct 30, 2026

MCP server for Smartsheet Resource Management (10,000ft API) time tracking and scheduling.

Overview

AI-generated overview

MCP server for Smartsheet Resource Management (10,000ft API) that lets an assistant read and change timesheets, projects, assignments and admin data.

What you can do
  • Log, update, delete, lock and approve time entries, fill weekly timesheets and reconcile hours against a target
  • List, create, update, delete and clone projects, phases and resource assignments, including placeholders and subtasks
  • Read capacity and staffing data such as availability, utilization, bill rates, status options and report rows and totals
  • Manage admin records: users, roles, disciplines, clients and contacts, leave types, holidays, expenses, tags, custom fields and webhooks
  • Switch profiles (full, time, projects, admin, readonly, or job profiles like timesheets and staffing) to limit which tools are exposed
When to use it
Useful when an assistant should work with a Smartsheet Resource Management account: logging or correcting time, checking utilization and availability, adjusting assignments, or maintaining project and org reference data. Read-only mode suits inspection-only setups.
Requirements
Runs locally as a Python package via uvx or pip, so Python and uv are needed. Requires a Smartsheet RM (10,000ft) API token in SMARTSHEET_RM_API_TOKEN; Smartsheet Gov additionally needs SMARTSHEET_RM_GOV_SMARTSHEET_API_TOKEN and a base URL and allowlist override. Network access to the Smartsheet RM API is required.
Before you install
The token grants access to real timesheet, project and org data, and many tools write, approve, lock or delete records; deletions need confirm=True and bulk deletes also need SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1. Many tools call undocumented routes that Smartsheet may change or remove without notice. If served over HTTP, set SMARTSHEET_RM_MCP_AUTH_TOKEN and avoid unauthenticated public binds.

Installation

In SourceWeft

  1. Open mcp-server-smartsheet-rm in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

📋 mcp-server-smartsheet-rm

[CI] [PyPI] [Python] [License: Apache-2.0] [Coverage] [CodeRabbit Reviews]

Enterprise Model Context Protocol (MCP) server for Resource Management by Smartsheet (10,000ft API).

Enables AI coding agents, planners, and assistants (Claude, Cortex, Antigravity, VS Code) to work with the Smartsheet RM public REST API: time tracking & timesheet reconciliation, resource scheduling & allocations, capacity planning, project & phase management, leaves/holidays, expense tracking, and custom fields.


🏗️ System Architecture

mermaid
graph TD    Client["AI Agent (Claude / Cortex / Antigravity / Cursor)"] -->|"MCP Stdio / Streamable HTTP /mcp"| Server["Root Gateway create_server()"]    Server --> Middle["Parent Middleware (ParentAudit / ReadOnly Gate)"]    Middle --> SubTime["time namespace (time_* — 19 tools, incl. 1 bulk-gated)"]    Middle --> SubProj["projects namespace (projects_* — 36 tools, incl. 1 bulk-gated)"]    Middle --> SubAdmin["admin namespace (admin_* — 60 tools)"]    SubTime --> Guards["Domain Guards"]    SubProj --> Guards    SubAdmin --> Guards    Guards --> ClientPool["SmartsheetRMClient (httpx.AsyncClient Pool)"]    ClientPool -->|"auth header + 429 Jitter Retry"| API["Smartsheet RM (10,000ft API)"]

create_server mounts the time, projects, and admin sub-servers with FastMCP 4 namespace=, so tools/list names are time_*, projects_*, and admin_*. Legacy rm_* names are not registered on the gateway.


🚀 FastMCP 4 Server Composition

  • Domain mounts (root.mount(..., namespace=...)):
    • namespace="time" → time_* (19 tools, including the bulk-gated time_bulk_delete_time_entries).
    • namespace="projects" → projects_* (36 tools, including the bulk-gated projects_bulk_delete_assignments).
    • namespace="admin" → admin_* (60 tools).
  • Hierarchical middleware:
    • Parent: ParentAuditMiddleware (timing, lifecycle logs, secret redaction) and ReadOnlyGateMiddleware (annotation-driven read-only gate, see below).
    • Child: TimeDomainGuardMiddleware (logged hours must be 0–24; bulk gate), ProjectsDomainGuardMiddleware (project names must be non-empty; bulk gate), AdminDomainGuardMiddleware (per_page must be ≤ 1000).

Profiles

Pick a profile with --profile or SMARTSHEET_RM_PROFILE (default full). An unknown profile name fails at startup with ValueError. There are two kinds:

  • Domain-mount profiles mount whole domains: full, time, projects, admin, and readonly.
  • Job profiles mount every domain, then expose only an explicit list of tool names for one job. Prompts and resources stay available on every job profile and on readonly; the domain-mount profiles time, projects and admin carry only their own domain's prompts and resources. Each listed name is checked against the full catalog when the server builds, so a typo fails at startup.
ProfileJob it servesToolsWith SMARTSHEET_RM_READONLY=1
fullComplete catalog, nothing omitted. Bulk tools are listed and refused at call time unless SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1. Tool Search and Code Mode attach only here.11550
timeTime tracking, approvals and timesheet recipes (time domain).196
projectsProjects, phases, assignments, placeholders and subtasks (projects domain).3619
adminUsers, org reference data, clients, expenses, fields, reports and webhooks (admin domain).6025
readonlyInspect without side effects: every tool annotated readOnlyHint=True.5050
timesheetsTeam member or manager logs, corrects, submits, locks and approves weekly time against their assignments.2614
staffingResource manager checks availability and utilization and creates or adjusts assignments, placeholders and subtasks.3324
org_setupResource-management admin onboards people and maintains org reference data, custom-field definitions, user statuses and webhooks.3513
portfolioPMO sets up and maintains projects, phases, clients, expenses and project metadata, and reads budget and report totals.3621

Seven tools are in no job profile and are reachable only in full (or their domain-mount profile): time_bulk_delete_time_entries, projects_bulk_delete_assignments, admin_delete_client, admin_delete_client_contact, admin_create_expense_category, admin_delete_expense_category, and admin_delete_tag.

Read-only behavior

  • The MCP readOnlyHint annotation is the only thing that decides whether a tool is read-only. Every tool declares it explicitly: true on the 50 reads and false on the 65 writes. A tool with no annotation or no readOnlyHint counts as a write.
  • --profile readonly or SMARTSHEET_RM_READONLY=1 (on any profile) lists only the read-only tools, and ReadOnlyGateMiddleware refuses any call to a real tool that is not read-only, including a write the filter hid. A refusal comes back as a tool result with isError: true.
  • A name that is not a tool on the server gets FastMCP's normal Unknown tool error, directly or through call_tool, so a typo is never reported as a blocked tool.
  • With Tool Search on, the gate checks the tool that call_tool wraps. Reads through call_tool work and writes are refused. Without Tool Search, call_tool is not a tool on the server, so a call to it gets Unknown tool: 'call_tool'.
  • If the gate cannot see the serving server, it refuses the call.

Bulk gate

time_bulk_delete_time_entries and projects_bulk_delete_assignments are listed in full, time and projects. The domain guards refuse them at call time (isError: true) unless SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1, and the handlers still require confirm=True. Read-only mode hides and refuses them.

Tool Search and Code Mode

tools/list is flat by default. Discovery is opt-in and attaches only on full:

  • --enable-tool-search / SMARTSHEET_RM_ENABLE_TOOL_SEARCH=1 replaces tools/list with search_tools and call_tool. The backend is regex (default) or bm25 (--tool-search-backend / SMARTSHEET_RM_TOOL_SEARCH_BACKEND).
  • --enable-code-mode / SMARTSHEET_RM_ENABLE_CODE_MODE=1 attaches FastMCP's experimental Code Mode (search, get_schema, execute). Code Mode needs the sandbox from the package's code-mode extra (fastmcp[code-mode], which ships pydantic-monty): pip install "mcp-server-smartsheet-rm[code-mode]" or uvx --from "mcp-server-smartsheet-rm[code-mode]" smartsheet-rm-mcp --enable-code-mode. Without it, Code Mode is skipped with a warning and the flat catalog is served.
  • Turning on both raises ValueError. Asking for either on another profile logs a warning and keeps the flat list.
  • search_tools, search and get_schema only read the catalog and are annotated readOnlyHint=True. Under read-only, Code Mode execute is refused.

⚡ Tool Surface Overview

The server exposes tools covering projects, resources, timesheets, and capacity. Call the namespaced names below:

  • Default Registration: 115 tools on full (the 2 bulk-destructive tools are listed and refused at call time unless SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1).
  • Read-Only Mode: 50 tools (readOnlyHint=true).
  • Destructive Gates: 21 tools requiring explicit confirm=True (19 standard + 2 bulk).
  • Idempotent Operations: 54 tools with idempotentHint=true (the 50 read-only tools, plus time_update_time_approval_status, time_lock_timesheet, admin_set_custom_field_values, and admin_set_user_status).

Domain Overview

Agents call these tools/list names. Counts for time and projects include the bulk-gated tool.

  1. Time (time_*, 19 tools): time_list_time_entries, time_get_time_entry, time_create_time_entry, time_create_user_time_entry, time_create_project_time_entry, time_update_time_entry, time_delete_time_entry, time_list_user_suggestions, time_update_time_approval_status, time_lock_timesheet, time_fill_weekly_timesheet, time_confirm_suggested_hours, time_reconcile_and_submit_week, time_list_approvals, time_create_approval, time_delete_approval, time_list_time_entry_categories, time_list_project_time_entry_categories. Bulk-gated: time_bulk_delete_time_entries.
  2. Projects (projects_*, 36 tools): projects_list_projects, projects_get_project, projects_create_project, projects_update_project, projects_delete_project, projects_list_project_users, projects_list_project_phases, projects_get_project_phase, projects_create_project_phase, projects_update_project_phase, projects_delete_project_phase, projects_list_assignments, projects_get_assignment, projects_create_assignment, projects_create_project_assignment, projects_create_user_assignment, projects_update_assignment, projects_delete_assignment, projects_clone_project_schedule, projects_list_status_options, projects_list_placeholder_resources, projects_create_placeholder_resource, projects_delete_placeholder_resource, projects_list_assignment_subtasks, projects_create_assignment_subtask, projects_delete_assignment_subtask, projects_list_assignables, projects_get_assignable, projects_list_project_budget_items, projects_get_budget_item, projects_get_project_budget_item, projects_list_project_members, projects_list_relationships_project_members, projects_list_relationships_project_memberships, projects_list_user_project_memberships. Bulk-gated: projects_bulk_delete_assignments.
  3. Admin (admin_*, 60 tools):
    • Users, roles, disciplines, and capacity: admin_list_users, admin_get_user, admin_create_user, admin_update_user, admin_delete_user, admin_list_user_bill_rates, admin_create_user_bill_rate, admin_get_user_availability, admin_get_user_utilization, admin_list_roles, admin_create_role, admin_update_role, admin_delete_role, admin_list_disciplines, admin_create_discipline, admin_update_discipline, admin_delete_discipline.
    • Clients and contacts: admin_list_clients, admin_get_client, admin_create_client, admin_update_client, admin_delete_client, admin_list_client_contacts, admin_create_client_contact, admin_delete_client_contact.
    • Leaves and holidays: admin_list_leave_types, admin_get_leave_type, admin_create_leave_type, admin_update_leave_type, admin_delete_leave_type, admin_list_holidays, admin_get_holiday, admin_create_holiday, admin_update_holiday, admin_delete_holiday.
    • Expenses: admin_list_expenses, admin_get_expense, admin_create_expense, admin_update_expense, admin_delete_expense, admin_list_expense_categories, admin_create_expense_category, admin_delete_expense_category.
    • Tags and custom fields: admin_list_tags, admin_create_tag, admin_delete_tag, admin_list_custom_fields, admin_get_custom_field, admin_create_custom_field, admin_update_custom_field, admin_delete_custom_field, admin_list_custom_field_values, admin_set_custom_field_values.
    • Status, reports, and webhooks: admin_get_user_statuses, admin_set_user_status, admin_get_report_rows, admin_get_report_totals, admin_list_webhooks, admin_create_webhook, admin_delete_webhook.

Undocumented routes

The tools below call routes that are in neither Smartsheet's Resource Management API reference (OpenAPI JSON) nor the archived 10,000ft API docs. There are 46 such method and path pairs. They are kept, and not re-pointed, because some documented equivalents take different request shapes, so moving a tool would change what it sends. Smartsheet may change or remove an undocumented route without notice, and each of these tools says so in its description. Prefer a tool on a documented route when one fits: for example, time_create_user_time_entry or time_create_project_time_entry instead of time_create_time_entry. Each of these client calls carries # drift-ignore: undocumented route, and scripts/check_openapi_drift.py fails on any other call that is not in the published spec.

ToolUndocumented routeDocumented equivalent
time_create_time_entryPOST /time_entriesPOST /users/{user_id}/time_entries (time_create_user_time_entry) and POST /projects/{project_id}/time_entries (time_create_project_time_entry).
time_update_time_entryPUT /time_entries/{id}PUT /users/{user_id}/time_entries/{id}.
time_delete_time_entryDELETE /time_entries/{id}DELETE /users/{user_id}/time_entries/{id}.
time_update_time_approval_statusPUT /users/{user_id}/time_entries/approval_statusNone found.
time_lock_timesheetPOST /users/{user_id}/time_entries/lockNone found.
time_fill_weekly_timesheetPOST /time_entriesPOST /users/{user_id}/time_entries.
time_confirm_suggested_hoursPUT /time_entries/{id}PUT /users/{user_id}/time_entries/{id}.
time_reconcile_and_submit_weekPUT /users/{user_id}/time_entries/approval_statusNone found (called only with auto_submit=True).
time_bulk_delete_time_entriesDELETE /time_entries/{id}DELETE /users/{user_id}/time_entries/{id}.
projects_get_project_phaseGET /projects/{project_id}/phases/{phase_id}The reference documents only PUT and DELETE on that path; GET /projects/{project_id}/phases lists phases.
admin_list_user_bill_ratesGET /users/{user_id}/bill_ratesGET /bill_rates and GET /projects/{project_id}/bill_rates.
admin_create_user_bill_ratePOST /users/{user_id}/bill_ratesThe reference documents bill rates only under /bill_rates and /projects/{project_id}/bill_rates, with no create.
admin_get_user_availabilityGET /users/{user_id}/availabilityGET /users/{user_id}/availabilities.
admin_get_user_utilizationGET /users/{user_id}/utilizationNone found.
admin_create_rolePOST /rolesThe reference documents only GET for roles.
admin_update_rolePUT /roles/{id}The reference documents only GET for roles.
admin_delete_roleDELETE /roles/{id}The reference documents only GET for roles.
admin_create_disciplinePOST /disciplinesThe reference documents only GET for disciplines.
admin_update_disciplinePUT /disciplines/{id}The reference documents only GET for disciplines.
admin_delete_disciplineDELETE /disciplines/{id}The reference documents only GET for disciplines.
admin_list_clientsGET /clientsNone found.
admin_get_clientGET /clients/{id}None found.
admin_create_clientPOST /clientsNone found.
admin_update_clientPUT /clients/{id}None found.
admin_delete_clientDELETE /clients/{id}None found.
admin_list_client_contactsGET /clients/{id}/contactsNone found.
admin_create_client_contactPOST /clients/{id}/contactsNone found.
admin_delete_client_contactDELETE /clients/{id}/contacts/{contact_id}None found.
admin_create_leave_typePOST /leave_typesThe reference documents only GET for leave types.
admin_update_leave_typePUT /leave_types/{id}The reference documents only GET for leave types.
admin_delete_leave_typeDELETE /leave_types/{id}The reference documents only GET for leave types.
admin_get_holidayGET /holidays/{id}The reference documents only GET /holidays.
admin_create_holidayPOST /holidaysThe reference documents only GET /holidays.
admin_update_holidayPUT /holidays/{id}The reference documents only GET /holidays.
admin_delete_holidayDELETE /holidays/{id}The reference documents only GET /holidays.
admin_list_expensesGET /expenses, GET /projects/{project_id}/expenses, GET /users/{user_id}/expensesGET /users/{user_id}/expense_items and GET /projects/{project_id}/expense_items.
admin_get_expenseGET /expenses/{id}GET /users/{user_id}/expense_items/{expense_item_id} and GET /projects/{project_id}/expense_items/{expense_item_id}.
admin_create_expensePOST /expensesPOST /users/{user_id}/expense_items.
admin_update_expensePUT /expenses/{id}PUT /users/{user_id}/expense_items/{expense_item_id}.
admin_delete_expenseDELETE /expenses/{id}DELETE /users/{user_id}/expense_items/{expense_item_id}.
admin_list_expense_categoriesGET /expense_categoriesGET /expense_item_categories.
admin_create_expense_categoryPOST /expense_categoriesThe reference documents only GET /expense_item_categories.
admin_delete_expense_categoryDELETE /expense_categories/{id}The reference documents only GET /expense_item_categories.
admin_list_tagsGET /tagsGET /projects/{project_id}/tags and GET /users/{user_id}/tags.
admin_create_tagPOST /tagsPOST /projects/{project_id}/tags and POST /users/{user_id}/tags.
admin_delete_tagDELETE /tags/{id}DELETE /projects/{project_id}/tags/{tag_id} and DELETE /users/{user_id}/tags/{tag_id}.
admin_list_custom_field_valuesGET /custom_field_valuesGET /projects/{project_id}/custom_field_values and GET /users/{user_id}/custom_field_values.
admin_set_custom_field_valuesPUT /custom_field_valuesPUT /projects/{project_id}/custom_field_values/{custom_field_value_id} and PUT /users/{user_id}/custom_field_values/{custom_field_value_id}.

🚀 Quickstart & Installation

1. Run via uvx

Console scripts in [project.scripts] both call smartsheet_rm_mcp.server:main: smartsheet-rm-mcp (used below) and mcp-server-smartsheet-rm. Install examples stay unpinned. To freeze a release, pin the version from Releases.

bash
uvx --from mcp-server-smartsheet-rm smartsheet-rm-mcp

After an upgrade, reload the MCP host so the live process start time is after the new binary mtime (stale process ≠ new package).

2. Installation

bash
# Using uv (recommended)uv pip install mcp-server-smartsheet-rm
# Or standard pippip install mcp-server-smartsheet-rm

3. Environment Variables

VariableDescriptionDefault
SMARTSHEET_RM_API_TOKENSmartsheet RM (10,000ft) API Token (Required)-
SMARTSHEET_RM_BASE_URLBase API URLhttps://api.rm.smartsheet.com/api/v1
SMARTSHEET_RM_PROFILEProfile: full, time, projects, admin, readonly, timesheets, staffing, org_setup, portfolio (see Profiles)full
SMARTSHEET_RM_READONLYSet to 1 to list only readOnlyHint=true tools and refuse every other call0
SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVESet to 1 to let the two listed bulk delete tools execute0
SMARTSHEET_RM_ENABLE_TOOL_SEARCHSet to 1 (or --enable-tool-search) for Tool Search on full0
SMARTSHEET_RM_TOOL_SEARCH_BACKENDTool Search backend: regex or bm25 (or --tool-search-backend)regex
SMARTSHEET_RM_ENABLE_CODE_MODESet to 1 (or --enable-code-mode) for experimental Code Mode on full; not with Tool Search0
SMARTSHEET_RM_MCP_AUTH_TOKENShared bearer token required on HTTP transports (stdio ignores it)unset
SMARTSHEET_RM_MCP_ALLOW_UNAUTHENTICATED_BINDSet to 1 to accept a tokenless HTTP bind to a non-localhost hostunset
SMARTSHEET_RM_LOG_FORMATSet to json for Datadog/CloudWatch structured logstext
SMARTSHEET_RM_ALLOWED_HOSTSComma-separated hostnames allowed for base URL overrides. A non-blank value replaces the default. Loopback and private targets stay blocked.api.rm.smartsheet.com
SMARTSHEET_RM_GOV_SMARTSHEET_API_TOKENSmartsheet API token for Smartsheet Gov only; sent as Authorization: Bearer and only to app.smartsheetgov.com (see Smartsheet Gov)unset
Smartsheet Gov

Smartsheet Gov is opt-in; the default base URL and allowlist do not change. Per Smartsheet's RM API Introduction and Authentication pages, the Gov base URL is https://app.smartsheetgov.com/2.0/rm/api/v1 and every request needs both the RM token in auth and a Smartsheet API token as Authorization: Bearer. To use it:

bash
export SMARTSHEET_RM_BASE_URL='https://app.smartsheetgov.com/2.0/rm/api/v1'export SMARTSHEET_RM_ALLOWED_HOSTS='app.smartsheetgov.com'export SMARTSHEET_RM_API_TOKEN='your_rm_api_token'export SMARTSHEET_RM_GOV_SMARTSHEET_API_TOKEN='your_smartsheet_api_token'

The Gov host goes through the same HTTPS, SSRF, allowlist and DNS-pinning checks as any other base URL. The client refuses to start against the Gov host without the Smartsheet token, and sends that token to no other host. On HTTP transports, a caller that sends its own auth or x-smartsheet-rm-token header must also send its own x-smartsheet-gov-api-token header; the environment Gov token is never paired with a caller's RM token.


💻 Client Configurations

Google Antigravity (~/.gemini/antigravity-cli/mcp_config.json)

json
{  "mcpServers": {    "smartsheet-rm": {      "command": "uvx",      "args": ["--from", "mcp-server-smartsheet-rm", "smartsheet-rm-mcp"],      "env": {        "SMARTSHEET_RM_API_TOKEN": "your-api-token"      },      "lazy": true    }  }}

Snowflake Cortex (~/.snowflake/cortex/mcp.json)

json
{  "servers": {    "smartsheet-rm": {      "command": "uvx",      "args": ["--from", "mcp-server-smartsheet-rm", "smartsheet-rm-mcp"],      "env": {        "SMARTSHEET_RM_API_TOKEN": "your-api-token"      }    }  }}

Claude Desktop (claude_desktop_config.json)

json
{  "mcpServers": {    "smartsheet-rm": {      "command": "uvx",      "args": ["--from", "mcp-server-smartsheet-rm", "smartsheet-rm-mcp"],      "env": {        "SMARTSHEET_RM_API_TOKEN": "your-api-token"      }    }  }}

Streamable HTTP

Prefer Streamable HTTP. --transport sse is deprecated (MCP spec SEP-2577); main() logs a migration warning and does not advertise /sse as the client path.

bash
uvx --from mcp-server-smartsheet-rm smartsheet-rm-mcp --transport streamable-http --host 127.0.0.1 --port 8000

Connect clients to http://127.0.0.1:8000/mcp (FastMCP's default Streamable HTTP path). run(transport="streamable-http") does not set a custom path. Binding to 0.0.0.0 or :: requires an explicit --allowed-host (a wildcard * is rejected).

In the default (stateful) HTTP mode, a session idle for 30 minutes expires: its next request gets HTTP 404 and the client must start a new session. Change this with FastMCP's session_idle_timeout (on http_app()) or FASTMCP_HTTP_SESSION_IDLE_TIMEOUT (seconds, or none to never expire); see the FastMCP 4.1.0 release and #5229.

HTTP authentication. Set SMARTSHEET_RM_MCP_AUTH_TOKEN to require Authorization: Bearer <token> on every HTTP request; a missing or wrong token gets 401. The token is stripped, and a blank value counts as unset. It is attached when the server is built, so smartsheet-rm-mcp, fastmcp run and an ASGI host mounting mcp.http_app() all enforce it. stdio never uses it.

With no token, an HTTP bind to 127.0.0.1, ::1 or localhost still starts, unauthenticated, and logs a warning. A tokenless bind to any other host exits with code 2. Set the token, bind to localhost, or set SMARTSHEET_RM_MCP_ALLOW_UNAUTHENTICATED_BIND to 1, true, yes or on to accept an unauthenticated public bind (any other value refuses). To serve the image over HTTP, pass the tokens from your environment or an env file, not on the command line:

bash
# export SMARTSHEET_RM_API_TOKEN and SMARTSHEET_RM_MCP_AUTH_TOKEN first, or use --env-file .envdocker run --rm -p 8000:8000 -e SMARTSHEET_RM_API_TOKEN -e SMARTSHEET_RM_MCP_AUTH_TOKEN \  ghcr.io/christianclaudio/mcp-server-smartsheet-rm:latest \  --transport streamable-http --host 0.0.0.0 --allowed-host localhost:8000

🛡️ Safety & Reliability

  • Secret Redaction: API tokens, bearer headers, and sensitive keys are automatically scrubbed from errors and logs.
  • Destructive Gates: Every deletion tool declares confirm: bool = False and makes no change unless the caller explicitly passes confirm=True. Without it the tool returns a normal result (isError: false) with "status": "confirmation_required" and a message to re-call with confirm=true; that is the designed two-step, not an error.
  • Input Validation: Missing or invalid arguments (for example an update with no fields, or a malformed date) return a tool error (isError: true, "type": "invalid_request") the model can correct, as the MCP spec describes for input validation errors.
  • Batch Results: time_fill_weekly_timesheet, time_confirm_suggested_hours, time_bulk_delete_time_entries and projects_bulk_delete_assignments share one shape: "status": "success" or "partial_success", a success count (filled_count / confirmed_count / deleted_count), failed_count, results and errors. Each success is {id|date, status, result}; each failure is {id|date, status: "failed", error} where error always has a message (API errors via to_dict(); other exceptions as "type": "internal" with a redacted message). The field names from earlier releases stay alongside: time_fill_weekly_timesheet also returns days_filled, created_count and entries (the created entries), and time_confirm_suggested_hours returns confirmed_entries. When every item fails, the call is a tool error (isError: true, "type": "batch_failed").
  • Profiles: Minimize token footprint by loading only the tools one job needs (timesheets, staffing, org_setup, portfolio) or one domain (time, projects, admin).
  • Read-Only Gate: readOnlyHint decides; anything else is refused with isError: true.
  • Resilience: Exponential backoff with randomized jitter on HTTP 429 rate limits.

🧪 Testing & Validation

bash
# Run tests with 100% coverage requirementpytest --cov=src/smartsheet_rm_mcp --cov-fail-under=100 -v
# Run Tool Contract verificationpython scripts/check_tool_contract.py
# Run OpenAPI Drift check against Smartsheet's published spec (or --spec-file for a local copy)python scripts/check_openapi_drift.py --spec-url https://developers.smartsheet.com/_spec/api/resource_management/openapi.json

Source: README.md at commit 7fb1f31

Tools

104

time_list_time_entries

Time List Time Entries

List time entries across organization or filtered by project, user, or date range (YYYY-MM-DD).

Parameterspageto_dateuser_idper_pagefrom_dateproject_idwith_suggestions

time_get_time_entry

Time Get Time Entry

Get details for a specific time entry by its ID.

Parametersentry_idrequired

time_create_time_entry

Time Create Time Entry

Create a new time entry for a user on a project (date format: YYYY-MM-DD). Undocumented route: `POST /time_entries` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `POST /users/{user_id}/time_entries` (time_create_user_time_entry) and `POST /projects/{project_id}/time_entries` (time_create_project_time_entry).

Parametersdaterequiredhoursrequirednotesuser_idrequiredphase_idproject_idrequiredis_billablecustom_field_values

time_create_user_time_entry

Time Create User Time Entry

Create a time entry for a user on the documented route `POST /users/{user_id}/time_entries`. assignable_id is the project, phase or leave type ID; date is YYYY-MM-DD. task, notes and bill_rate_id are optional; the reference limits task and notes to 256 characters. The body repeats user_id, which the reference says must match the URL.

Parametersdaterequiredtaskhoursrequirednotesuser_idrequiredbill_rate_idassignable_idrequired

time_create_project_time_entry

Time Create Project Time Entry

Create a time entry on a project on the documented route `POST /projects/{project_id}/time_entries`. date is YYYY-MM-DD. The body's assignable_id is project_id, which the reference says must match the URL; to log time to a phase or leave type, use time_create_user_time_entry. task, notes and bill_rate_id are optional; the reference limits task and notes to 256 characters.

Parametersdaterequiredtaskhoursrequirednotesuser_idrequiredproject_idrequiredbill_rate_id

time_update_time_entry

Time Update Time Entry

Update an existing time entry. Undocumented route: `PUT /time_entries/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `PUT /users/{user_id}/time_entries/{id}`.

Parametersdatehoursnotesentry_idrequiredis_billable

time_delete_time_entry

Time Delete Time Entry

Delete a time entry (Destructive: requires confirm=True). Undocumented route: `DELETE /time_entries/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `DELETE /users/{user_id}/time_entries/{id}`.

Parametersconfirmentry_idrequired

time_list_user_suggestions

Time List User Suggestions

Read unconfirmed scheduled time suggestions for a user.

Parametersto_dateuser_idrequiredfrom_date

time_update_time_approval_status

Time Update Time Approval Status

Approve or reject time entries for a user (status: 'approved', 'rejected', 'pending'). Undocumented route: `PUT /users/{user_id}/time_entries/approval_status` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersstatusrequireduser_idrequiredentry_idsrequiredapprover_notes

time_lock_timesheet

Time Lock Timesheet

Lock or unlock timesheet records for a user up to a specified lock date (YYYY-MM-DD). Undocumented route: `POST /users/{user_id}/time_entries/lock` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersunlockuser_idrequiredlock_daterequired

time_fill_weekly_timesheet

Time Fill Weekly Timesheet

Batch-fill weekly timesheet entries (Mon-Fri 8h default, or 7-day with include_weekends=True) for a user. start_date: Monday date of the week in YYYY-MM-DD. include_weekends: When True, logs Saturday and Sunday entries as well. weekend_hours: Specific hours for Saturday/Sunday (defaults to daily_hours if omitted). Undocumented route: `POST /time_entries` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Each entry is created there. Documented route: `POST /users/{user_id}/time_entries`.

Parametersnotesuser_idrequiredproject_idstart_daterequireddaily_hoursweekend_hoursinclude_weekends

time_confirm_suggested_hours

Time Confirm Suggested Hours

Auto-confirm all unconfirmed scheduled suggestions for a user within a date range. Undocumented route: `PUT /time_entries/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Each suggestion is confirmed there. Documented route: `PUT /users/{user_id}/time_entries/{id}`.

Parametersto_daterequireduser_idrequiredfrom_daterequired

time_reconcile_and_submit_week

Time Reconcile And Submit Week

Audit weekly logged hours against a target (40h) and optionally submit/approve timesheet. Undocumented route: `PUT /users/{user_id}/time_entries/approval_status` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Only auto_submit=True calls it. No documented equivalent was found.

Parametersuser_idrequiredstart_daterequiredauto_submittarget_hours

time_bulk_delete_time_entries

Time Bulk Delete Time Entries

Bulk delete multiple time entries (Destructive: gated by SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1 and confirm=True). Undocumented route: `DELETE /time_entries/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `DELETE /users/{user_id}/time_entries/{id}`.

Parametersconfirmentry_idsrequired

time_list_approvals

Time List Approvals

List submitted time entry and expense approvals across the organization.

Parameterspageper_page

time_create_approval

Time Create Approval

Submit or approve approvable records (approvable_type: 'time_entries' or 'expense_items').

Parametersnotesstatusapprovable_idsrequiredapprovable_typerequired

time_delete_approval

Time Delete Approval

Delete a pending approval record (Destructive: requires confirm=True).

Parametersconfirmapproval_idrequired

projects_list_projects

Projects List Projects

List projects in Smartsheet RM with filtering, phase inclusion, and pagination.

Parameterspagearchivedper_pagesort_fieldsort_orderwith_phasesfilter_fieldfilter_value

projects_get_project

Projects Get Project

Get project details including budget, phases, client, and dates.

Parametersproject_idrequiredwith_phases

projects_create_project

Projects Create Project

Create a new project in Smartsheet RM.

Parametersnamerequiredbudgetsecureend_dateclient_idstart_datebudget_typedescriptionproject_typeproject_state

projects_update_project

Projects Update Project

Update project metadata, state, dates, budget or archive status.

Parametersnamebudgetarchivedend_dateproject_idrequiredstart_datebudget_typedescriptionproject_state

projects_delete_project

Projects Delete Project

Delete a project (Destructive: requires confirm=True).

Parametersconfirmproject_idrequired

projects_list_project_users

Projects List Project Users

List users associated with or assigned to a specific project.

Parameterspageper_pageproject_idrequired

projects_list_project_phases

Projects List Project Phases

List phases belonging to a project.

Parametersproject_idrequired

projects_get_project_phase

Projects Get Project Phase

Get details for a specific project phase. Undocumented route: `GET /projects/{project_id}/phases/{phase_id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only PUT and DELETE on that path; `GET /projects/{project_id}/phases` lists phases.

Parametersphase_idrequiredproject_idrequired

projects_create_project_phase

Projects Create Project Phase

Create a new phase under a project.

Parametersnamerequiredbudgetend_daterequiredproject_idrequiredstart_daterequireddescription

projects_update_project_phase

Projects Update Project Phase

Update an existing project phase.

Parametersnamebudgetend_datephase_idrequiredproject_idrequiredstart_datedescription

projects_delete_project_phase

Projects Delete Project Phase

Delete a project phase (Destructive: requires confirm=True).

Parametersconfirmphase_idrequiredproject_idrequired

projects_list_assignments

Projects List Assignments

List resource scheduling assignments across projects or filtered by user/project.

Parameterspageto_dateuser_idper_pagefrom_dateproject_id

projects_get_assignment

Projects Get Assignment

Get details for a specific assignment.

Parametersassignment_idrequired

projects_create_assignment

Projects Create Assignment

Create a resource assignment on a project or phase (dates: YYYY-MM-DD).

Parametersnotepercentuser_idrequiredend_daterequiredphase_idproject_idrequiredstart_daterequiredfixed_hourshours_per_dayallocation_mode

projects_create_project_assignment

Projects Create Project Assignment

Assign a user to a project on the documented route `POST /projects/{project_id}/assignments` (dates: YYYY-MM-DD). Set allocation_mode and the matching value: percent (the reference documents it as a fraction from 0 to 1), hours_per_day, or fixed_hours for the fixed mode. allocation_mode is sent as given, because the reference names the fixed mode `fixed` in its description and `fixed_hours` in its schema. Percent mode is the default and requires percent; hours_per_day and the fixed mode require hours_per_day and fixed_hours. Without the matching value the call is refused before any request.

Parameterspercentuser_idrequiredend_daterequiredproject_idrequiredstart_daterequireddescriptionfixed_hoursbill_rate_idhours_per_dayallocation_modestatus_option_id

projects_create_user_assignment

Projects Create User Assignment

Assign a user to a project, phase or leave type on the documented route `POST /users/{user_id}/assignments` (dates: YYYY-MM-DD). assignable_id is the project, phase or leave type ID. Set allocation_mode and the matching value: percent (the reference documents it as a fraction from 0 to 1), hours_per_day, or fixed_hours for the fixed mode. allocation_mode is sent as given, because the reference names the fixed mode `fixed` in its description and `fixed_hours` in its schema. Percent mode is the default and requires percent; hours_per_day and the fixed mode require hours_per_day and fixed_hours. Without the matching value the call is refused before any request.

Parameterspercentuser_idrequiredend_daterequiredstart_daterequireddescriptionfixed_hoursbill_rate_idassignable_idrequiredhours_per_dayallocation_modestatus_option_id

projects_update_assignment

Projects Update Assignment

Update dates, allocation percentage, or hours on an existing assignment.

Parametersnotepercentend_datestart_datefixed_hoursassignment_idrequiredhours_per_day

projects_delete_assignment

Projects Delete Assignment

Delete a resource assignment (Destructive: requires confirm=True).

Parametersconfirmassignment_idrequired

projects_clone_project_schedule

Projects Clone Project Schedule

Duplicate project budget settings, timeline, and phase milestone structure to a new project.

Parametersclient_idnew_start_datesource_project_idrequiredtarget_project_namerequired

projects_bulk_delete_assignments

Projects Bulk Delete Assignments

Bulk delete multiple resource assignments (Destructive: gated by SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1 and confirm=True).

Parametersconfirmassignment_idsrequired

projects_list_status_options

Projects List Status Options

List account-level assignment work status options.

Takes no parameters.

projects_list_placeholder_resources

Projects List Placeholder Resources

List placeholder resources used for forecasting and capacity modeling.

Parameterspageper_page

projects_create_placeholder_resource

Projects Create Placeholder Resource

Create a placeholder resource.

Parametersroletitlerequiredlocationdiscipline

projects_delete_placeholder_resource

Projects Delete Placeholder Resource

Delete a placeholder resource (Destructive: requires confirm=True).

Parametersconfirmplaceholder_idrequired

projects_list_assignment_subtasks

Projects List Assignment Subtasks

List subtasks (checklist tasks) for a project assignment.

Parametersproject_idrequiredassignment_idrequired

projects_create_assignment_subtask

Projects Create Assignment Subtask

Create a subtask under a project assignment.

Parameterscompletedproject_idrequireddescriptionrequiredassignment_idrequired

projects_delete_assignment_subtask

Projects Delete Assignment Subtask

Delete an assignment subtask (Destructive: requires confirm=True).

Parametersconfirmproject_idrequiredsubtask_idrequiredassignment_idrequired

admin_list_users

Admin List Users

List users in the organization with role/discipline filtering.

Parameterspagerolearchivedper_pagedisciplineinclude_billability

admin_get_user

Admin Get User

Get details for a specific user.

Parametersuser_idrequired

admin_create_user

Admin Create User

Create a new user profile in Smartsheet RM.

Parametersroleemailrequiredlocationbill_ratecost_ratelast_namerequireddisciplinefirst_namerequireduser_type_idbillability_target

admin_update_user

Admin Update User

Update a user's profile, role, discipline, bill rate, or archive state.

Parametersroleemailuser_idrequiredarchivedbill_ratecost_ratelast_namedisciplinefirst_namebillability_target

admin_delete_user

Admin Delete User

Delete or archive a user (Destructive: requires confirm=True).

Parametersconfirmuser_idrequired

admin_list_user_bill_rates

Admin List User Bill Rates

List bill rate tiers for a user. Undocumented route: `GET /users/{user_id}/bill_rates` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `GET /bill_rates` and `GET /projects/{project_id}/bill_rates`.

Parametersuser_idrequired

admin_create_user_bill_rate

Admin Create User Bill Rate

Add a bill rate tier with an effective date range for a user. Undocumented route: `POST /users/{user_id}/bill_rates` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents bill rates only under `/bill_rates` and `/projects/{project_id}/bill_rates`, with no create.

Parametersraterequireduser_idrequiredend_datestart_daterequired

admin_get_user_availability

Admin Get User Availability

Query scheduled hours vs available capacity for a user. Undocumented route: `GET /users/{user_id}/availability` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `GET /users/{user_id}/availabilities`.

Parametersto_dateuser_idrequiredfrom_date

admin_get_user_utilization

Admin Get User Utilization

Get billable utilization metrics for a user. Undocumented route: `GET /users/{user_id}/utilization` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersto_dateuser_idrequiredfrom_date

admin_list_roles

Admin List Roles

List all configured user roles.

Takes no parameters.

admin_create_role

Admin Create Role

Create a new role. Undocumented route: `POST /roles` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for roles.

Parametersnamerequired

admin_update_role

Admin Update Role

Update an existing role. Undocumented route: `PUT /roles/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for roles.

Parametersnamerequiredrole_idrequired

admin_delete_role

Admin Delete Role

Delete a role (Destructive: requires confirm=True). Undocumented route: `DELETE /roles/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for roles.

Parametersconfirmrole_idrequired

admin_list_disciplines

Admin List Disciplines

List all configured disciplines.

Takes no parameters.

admin_create_discipline

Admin Create Discipline

Create a new discipline. Undocumented route: `POST /disciplines` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for disciplines.

Parametersnamerequired

admin_update_discipline

Admin Update Discipline

Update an existing discipline. Undocumented route: `PUT /disciplines/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for disciplines.

Parametersnamerequireddiscipline_idrequired

admin_delete_discipline

Admin Delete Discipline

Delete a discipline (Destructive: requires confirm=True). Undocumented route: `DELETE /disciplines/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for disciplines.

Parametersconfirmdiscipline_idrequired

admin_list_clients

Admin List Clients

List clients. Undocumented route: `GET /clients` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parameterspagearchivedper_page

admin_get_client

Admin Get Client

Get details for a specific client. Undocumented route: `GET /clients/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersclient_idrequired

admin_create_client

Admin Create Client

Create a new client record. Undocumented route: `POST /clients` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parameterscitynamerequiredstateaddresscountryzipcode

admin_update_client

Admin Update Client

Update a client record. Undocumented route: `PUT /clients/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parameterscitynamestateaddresscountryzipcodearchivedclient_idrequired

admin_delete_client

Admin Delete Client

Delete a client record (Destructive: requires confirm=True). Undocumented route: `DELETE /clients/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersconfirmclient_idrequired

admin_list_client_contacts

Admin List Client Contacts

List contacts associated with a client. Undocumented route: `GET /clients/{id}/contacts` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersclient_idrequired

admin_create_client_contact

Admin Create Client Contact

Add a contact for a client. Undocumented route: `POST /clients/{id}/contacts` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersemailphonetitleclient_idrequiredlast_namerequiredfirst_namerequired

admin_delete_client_contact

Admin Delete Client Contact

Delete a client contact (Destructive: requires confirm=True). Undocumented route: `DELETE /clients/{id}/contacts/{contact_id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. No documented equivalent was found.

Parametersconfirmclient_idrequiredcontact_idrequired

admin_list_leave_types

Admin List Leave Types

List leave types (e.g. Vacation, Sick, Parental, PTO).

Takes no parameters.

admin_get_leave_type

Admin Get Leave Type

Get details for a specific leave type.

Parametersleave_type_idrequired

admin_create_leave_type

Admin Create Leave Type

Create a new leave type. Undocumented route: `POST /leave_types` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for leave types.

Parametersnamerequired

admin_update_leave_type

Admin Update Leave Type

Update a leave type name. Undocumented route: `PUT /leave_types/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for leave types.

Parametersnamerequiredleave_type_idrequired

admin_delete_leave_type

Admin Delete Leave Type

Delete a leave type (Destructive: requires confirm=True). Undocumented route: `DELETE /leave_types/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only GET for leave types.

Parametersconfirmleave_type_idrequired

admin_list_holidays

Admin List Holidays

List company and regional holidays.

Parametersto_datefrom_date

admin_get_holiday

Admin Get Holiday

Get details for a specific holiday. Undocumented route: `GET /holidays/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /holidays`.

Parametersholiday_idrequired

admin_create_holiday

Admin Create Holiday

Create a new company holiday or non-working day. Undocumented route: `POST /holidays` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /holidays`.

Parametersdaterequirednamerequiredend_date

admin_update_holiday

Admin Update Holiday

Update a holiday. Undocumented route: `PUT /holidays/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /holidays`.

Parametersdatenameend_dateholiday_idrequired

admin_delete_holiday

Admin Delete Holiday

Delete a holiday (Destructive: requires confirm=True). Undocumented route: `DELETE /holidays/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /holidays`.

Parametersconfirmholiday_idrequired

admin_list_expenses

Admin List Expenses

List logged expenses across projects or filtered by project/user. Undocumented route: `GET /expenses`, `GET /projects/{project_id}/expenses`, `GET /users/{user_id}/expenses` are not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove them without notice. Documented routes: `GET /users/{user_id}/expense_items` and `GET /projects/{project_id}/expense_items`.

Parameterspageto_dateuser_idper_pagefrom_dateproject_id

admin_get_expense

Admin Get Expense

Get details for a specific logged expense. Undocumented route: `GET /expenses/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `GET /users/{user_id}/expense_items/{expense_item_id}` and `GET /projects/{project_id}/expense_items/{expense_item_id}`.

Parametersexpense_idrequired

admin_create_expense

Admin Create Expense

Log a project expense item. Undocumented route: `POST /expenses` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `POST /users/{user_id}/expense_items`.

Parametersdaterequirednotesamountrequireduser_idrequiredproject_idrequiredis_billableexpense_category_idrequired

admin_update_expense

Admin Update Expense

Update a logged expense item. Undocumented route: `PUT /expenses/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `PUT /users/{user_id}/expense_items/{expense_item_id}`.

Parametersdatenotesamountexpense_idrequiredis_billable

admin_delete_expense

Admin Delete Expense

Delete an expense item (Destructive: requires confirm=True). Undocumented route: `DELETE /expenses/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `DELETE /users/{user_id}/expense_items/{expense_item_id}`.

Parametersconfirmexpense_idrequired

admin_list_expense_categories

Admin List Expense Categories

List configured expense categories. Undocumented route: `GET /expense_categories` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented route: `GET /expense_item_categories`.

Takes no parameters.

admin_create_expense_category

Admin Create Expense Category

Create an expense category. Undocumented route: `POST /expense_categories` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /expense_item_categories`.

Parametersnamerequired

admin_delete_expense_category

Admin Delete Expense Category

Delete an expense category (Destructive: requires confirm=True). Undocumented route: `DELETE /expense_categories/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. The reference documents only `GET /expense_item_categories`.

Parametersconfirmcategory_idrequired

admin_list_tags

Admin List Tags

List tags. Undocumented route: `GET /tags` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `GET /projects/{project_id}/tags` and `GET /users/{user_id}/tags`.

Parameterspageper_page

admin_create_tag

Admin Create Tag

Create a tag. Undocumented route: `POST /tags` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `POST /projects/{project_id}/tags` and `POST /users/{user_id}/tags`.

Parametersnamerequired

admin_delete_tag

Admin Delete Tag

Delete a tag (Destructive: requires confirm=True). Undocumented route: `DELETE /tags/{id}` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `DELETE /projects/{project_id}/tags/{tag_id}` and `DELETE /users/{user_id}/tags/{tag_id}`.

Parameterstag_idrequiredconfirm

admin_list_custom_fields

Admin List Custom Fields

List custom field definitions.

Takes no parameters.

admin_get_custom_field

Admin Get Custom Field

Get details of a custom field definition.

Parameterscustom_field_idrequired

admin_create_custom_field

Admin Create Custom Field

Create a custom field definition (field_type: text, number, select, date; target_type: Project, User, Phase).

Parametersnamerequiredoptionsfield_typerequiredtarget_typerequired

admin_update_custom_field

Admin Update Custom Field

Update a custom field definition.

Parametersnameoptionscustom_field_idrequired

admin_delete_custom_field

Admin Delete Custom Field

Delete a custom field definition (Destructive: requires confirm=True).

Parametersconfirmcustom_field_idrequired

admin_list_custom_field_values

Admin List Custom Field Values

List custom field values, optionally filtered to one entity by target_id and target_type. Undocumented route: `GET /custom_field_values` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `GET /projects/{project_id}/custom_field_values` and `GET /users/{user_id}/custom_field_values`.

Parameterstarget_idtarget_type

admin_set_custom_field_values

Admin Set Custom Field Values

Set custom field values for an entity. Undocumented route: `PUT /custom_field_values` is not in Smartsheet's Resource Management API reference or the archived 10,000ft API docs, so Smartsheet may change or remove it without notice. Documented routes: `PUT /projects/{project_id}/custom_field_values/{custom_field_value_id}` and `PUT /users/{user_id}/custom_field_values/{custom_field_value_id}`.

Parametersvaluesrequiredtarget_idrequiredtarget_typerequired

admin_get_user_statuses

Admin Get User Statuses

Retrieve work status history for a specific user (ITO, WFH, SIC, OOO, VAC, OOF).

Parametersuser_idrequired

admin_set_user_status

Admin Set User Status

Set current working status for a user (status: 'ITO', 'WFH', 'SIC', 'OOO', 'VAC', 'OOF').

Parametersnotesstatusrequireduser_idrequired

admin_get_report_rows

Admin Get Report Rows

Generate detailed custom report rows.

Parametersreport_parametersrequired

admin_get_report_totals

Admin Get Report Totals

Generate aggregated custom report totals.

Parametersreport_parametersrequired

admin_list_webhooks

Admin List Webhooks

List configured organization webhooks.

Takes no parameters.

admin_create_webhook

Admin Create Webhook

Register a webhook subscription (e.g. 'time.entry.created', 'project.updated', 'assignment.created').

Parametersevent_typerequiredcallback_urlrequired

admin_delete_webhook

Admin Delete Webhook

Delete a webhook subscription (Destructive: requires confirm=True).

Parametersconfirmwebhook_idrequired

Version history

11
  1. v2.2.0LatestOct 30, 2026
  2. v2.1.1Oct 23, 2026
  3. v2.1.0Oct 21, 2026
  4. v2.0.4Oct 18, 2026
  5. v2.0.3Oct 16, 2026
  6. v2.0.2Oct 10, 2026
  7. v2.0.1Oct 9, 2026
  8. v2.0.0Oct 9, 2026
  9. v1.2.2Oct 2, 2026
  10. v1.2.1Sep 27, 2026
  11. v1.1.5Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts