Skip to main content

📋 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 orchestrate the complete Smartsheet RM REST API surface: time tracking & timesheet reconciliation, resource scheduling & allocations, capacity planning, project & phase management, leaves/holidays, expense tracking, and custom fields.


🏗️ System Architecture

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_* — 14 tools, 15 with bulk)"]
    Middle --> SubProj["projects namespace (projects_* — 24 tools, 25 with bulk)"]
    Middle --> SubAdmin["admin namespace (admin_* — 60 tools)"]
    SubTime --> Guards["Domain Guards"]
    SubProj --> Guards
    SubAdmin --> Guards
    Guards --> ClientPool["SmartsheetRMClient (httpx.AsyncClient Pool)"]
    ClientPool -->|"Bearer Auth + 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_* (14 tools; 15 when bulk is enabled).
    • namespace="projects" → projects_* (24 tools; 25 when bulk is enabled).
    • namespace="admin" → admin_* (60 tools).
  • Hierarchical middleware:
    • Parent: ParentAuditMiddleware (timing, lifecycle logs, secret redaction) and ReadOnlyGateMiddleware (fail-closed mutation block when SMARTSHEET_RM_READONLY=1).
    • Child: TimeDomainGuardMiddleware (logged hours must be 0–24), ProjectsDomainGuardMiddleware (project names must be non-empty), AdminDomainGuardMiddleware (per_page must be ≤ 1000).
  • Profiles via --profile / SMARTSHEET_RM_PROFILE (full, time, projects, admin, readonly). Mounts are selective; read-only filtering and bulk gating run after mount:
    • full (default): time + projects + admin — 98 tools (100 with bulk).
    • time: time sub-server only — 14 tools (15 with bulk).
    • projects: projects sub-server only — 24 tools (25 with bulk).
    • admin: admin sub-server only — 60 tools.
    • readonly: mounts all three domains, then drops every tool without readOnlyHint — 39 tools. SMARTSHEET_RM_READONLY=1 applies that same filter on top of any profile.
  • Bulk gate: time_bulk_delete_time_entries and projects_bulk_delete_assignments are registered only when SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1. They stay absent in read-only mode.
  • Tool search: flat tools/list by default. --enable-tool-search or SMARTSHEET_RM_ENABLE_TOOL_SEARCH=1 adds RegexSearchTransform.

⚡ Tool Surface Overview

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

  • Default Registration: 98 tools (with bulk-destructive operations gated by default).
  • With Bulk Operations: 100 total tools when SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE=1.
  • Read-Only Mode: 39 tools (readOnlyHint=true).
  • Destructive Gates: 21 tools requiring explicit confirm=True (19 standard + 2 bulk).
  • Idempotent Operations: 43 tools with idempotentHint=true (the 39 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_*, 15 tools): time_list_time_entries, time_get_time_entry, time_create_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. Bulk-gated: time_bulk_delete_time_entries.
  2. Projects (projects_*, 25 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_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. 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.

🚀 Quickstart & Installation

1. Run via uvx (pinned)

Console scripts in [project.scripts] both call smartsheet_rm_mcp.server:main: smartsheet-rm-mcp (used below) and mcp-server-smartsheet-rm. Pin the package and pass the script:

uvx --from mcp-server-smartsheet-rm==1.2.0 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

# Using uv (recommended)
uv pip install mcp-server-smartsheet-rm

# Or standard pip
pip install mcp-server-smartsheet-rm

3. Environment Variables

Variable Description Default
SMARTSHEET_RM_API_TOKEN Smartsheet RM (10,000ft) API Token (Required) -
SMARTSHEET_RM_BASE_URL Base API URL https://api.rm.smartsheet.com/api/v1
SMARTSHEET_RM_PROFILE Tool profile subset: time, projects, admin, full, readonly full
SMARTSHEET_RM_READONLY Set to 1 to restrict server to read-only tools 0
SMARTSHEET_RM_ALLOW_BULK_DESTRUCTIVE Set to 1 to unlock bulk delete operations 0
SMARTSHEET_RM_ENABLE_TOOL_SEARCH Set to 1 (or --enable-tool-search) for dynamic regex search 0
SMARTSHEET_RM_LOG_FORMAT Set to json for Datadog/CloudWatch structured logs text
SMARTSHEET_RM_ALLOWED_HOSTS Comma-separated allowlist of hostnames for base URL overrides (mitigates SSRF/DNS-rebinding) unset (allows valid HTTPS domains)

💻 Client Configurations

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

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

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

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

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "smartsheet-rm": {
      "command": "uvx",
      "args": ["--from", "mcp-server-smartsheet-rm==1.2.0", "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.

uvx --from mcp-server-smartsheet-rm==1.2.0 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).


🛡️ 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 rejects execution unless the caller explicitly passes confirm=True.
  • Profile Filtering: Minimize token footprint by loading only relevant tool sets (time, projects, admin).
  • Resilience: Exponential backoff with randomized jitter on HTTP 429 rate limits.

🧪 Testing & Validation

# Run tests with 100% coverage requirement
pytest --cov=src/smartsheet_rm_mcp --cov-fail-under=100 -v

# Run Tool Contract verification
python scripts/check_tool_contract.py

# Run OpenAPI Drift check
python scripts/check_openapi_drift.py

Release files for mcp-server-smartsheet-rm 1.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mcp-server-smartsheet-rm 1.2.1
File Size Uploaded
mcp_server_smartsheet_rm-1.2.1.tar.gz 270.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mcp-server-smartsheet-rm 1.2.1
File Interpreter ABI Platform
mcp_server_smartsheet_rm-1.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 314.7 kB

Release files / mcp_server_smartsheet_rm-1.2.1.tar.gz

Download URL mcp_server_smartsheet_rm-1.2.1.tar.gz
Size 270.9 kB
Tags Source
SHA-256 checksum
How to use checksums
381021b18c8c0b3ae2085b7ff0994387221f032aa9523d30810dad68edac22e1
BLAKE2b-256 checksum
How to use checksums
f912e051ce8f09ea0b9b9def6c37ca027ea89efec74b55370caa8a152b9c3e2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / mcp_server_smartsheet_rm-1.2.1-py3-none-any.whl

Download URL mcp_server_smartsheet_rm-1.2.1-py3-none-any.whl
Size 43.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bb2fad07f8a670bd322128c5ec0ee5618da0bcf666b2187f692b3f333a40bf2f
BLAKE2b-256 checksum
How to use checksums
02a42c5641bfbd5edfc3dc31f64864e89f56205775ba39188c8b981494e0595b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page