MCP Server for Autodesk ShotGrid REST API
LocalAbout MCP Server for Autodesk ShotGrid REST API
MCP Server for Autodesk ShotGrid REST API uses FastMCP to expose ShotGrid operations to LLM agents. It authenticates with OAuth2 and supports querying and managing projects, assets, tasks, notes, bookings, and other entities.
Key features
- 01Connect to ShotGrid with OAuth2
- 02Query projects, users, and assets
- 03Filter tasks, shots, versions, and notes
- 04Create, update, and delete notes and replies
- 05Manage bookings
- 06Filter by date and paginate results
Use cases
- 01Retrieve ShotGrid project data in LLM workflows
- 02Filter tasks and versions by project or date
- 03Create or maintain ShotGrid notes and replies
- 04Review and adjust user bookings
MCP support
The MCP server exposes ShotGrid REST API tools to clients over stdio, enabling LLM agents to query and manage entities. It is implemented with FastMCP and connects to ShotGrid using OAuth2.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEMCP Server for Autodesk ShotGrid REST API
This project provides an MCP (Model Context Protocol) server, implemented using FastMCP, that enables Large Language Model (LLM) agents to interact programmatically with Autodesk ShotGrid via its REST API. It exposes a set of tools for querying and managing ShotGrid entities such as projects, assets, tasks, users, notes, and more. The server supports transport="stdio" mode for integration with LLM-based workflows.
Features
- Connects to Autodesk ShotGrid using OAuth2 authentication.
- Exposes ShotGrid REST API operations as MCP tools using FastMCP.
- Query projects, users, assets, tasks, notes, versions, bookings, and more.
- Retrieve detailed information about entities.
- Designed for integration with LLM-based workflows.
- Modular codebase:
main.pyprovides the MCP server and core tool definitions;booking_tools.pyhandles all Booking CRUD operations;note_tools.pyhandles Note / Reply CRUD plus attachment reads;shotgrid_rest.pyimplements the ShotGrid API wrapper.
Requirements
- Python 3.11
- httpx
- httpx-auth
- mcp.server.fastmcp
Installation
-
Clone the repository:
git clone https://github.com/chordee/mcp-server-shotgrid.git -
Install uv if you don't have it.
uvmanages Python 3.11 and the dependencies declared inpyproject.tomlautomatically; no manualvenvstep is needed. -
Configure credentials. Use environment variables (recommended) or CLI arguments. See Usage.
-
Register the server with your MCP client. Example for Claude Code (
~/.claude.jsonor a project-local.mcp.json):{ "mcpServers": { "shotgrid": { "command": "uv", "args": ["run", "--directory", "D:\\path\\to\\mcp-server-shotgrid", "main.py"], "env": { "SHOTGRID_HOST": "https://your-shotgrid-url", "SHOTGRID_CLIENT_ID": "your_client_id", "SHOTGRID_CLIENT_SECRET": "your_client_secret" } } } }
Usage
Credentials can come from either environment variables (recommended) or CLI arguments. Environment variables take precedence; if both are missing for any of the three values, the server exits with an error.
Option A — Environment variables (recommended)
| Variable | Description |
|---|---|
SHOTGRID_HOST | ShotGrid host URL, e.g. https://your-shotgrid-url |
SHOTGRID_CLIENT_ID | OAuth2 client ID |
SHOTGRID_CLIENT_SECRET | OAuth2 client secret |
Windows (PowerShell):
$env:SHOTGRID_HOST = "https://your-shotgrid-url"
$env:SHOTGRID_CLIENT_ID = "your_client_id"
$env:SHOTGRID_CLIENT_SECRET = "your_client_secret"
uv run --directory C:\path\to\mcp-server-shotgrid main.py
macOS / Linux (bash / zsh):
export SHOTGRID_HOST="https://your-shotgrid-url"
export SHOTGRID_CLIENT_ID="your_client_id"
export SHOTGRID_CLIENT_SECRET="your_client_secret"
uv run --directory /path/to/mcp-server-shotgrid main.py
Option B — CLI arguments
uv run --directory {REPO_DIR} main.py --host https://your-shotgrid-url --client-id your_client_id --client-secret your_client_secret
Both short (-host, -ci, -cs) and long (--host, --client-id, --client-secret) forms are supported.
Security note
Prefer environment variables over CLI arguments. Arguments passed on the command line are visible in process listings (ps, Task Manager), shell history, and many supervisor/IDE configuration files. Environment variables can reduce accidental exposure, but they are still secrets — store them in protected config files (for example, .mcp.json / ~/.claude.json), use strict file permissions, and never commit secrets to version control.
The server uses FastMCP and communicates via transport="stdio" only. Tools exposed by MCP are available for LLM agents to call.
Available Tools
All tools are asynchronous and exposed via FastMCP. They return structured Python objects (List or Dict) which are automatically serialized by the MCP framework. Arguments in parentheses are required unless marked optional.
get_all_projects(): List all projects.get_all_users(): List all users.get_all_projects_field_contains(value: str, field: str = "name"): List projects where a field contains a value.get_sequences(project_id: int (optional), project_name: str (optional), code: str (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional)): List sequences, optionally filtered by project, code, or date.get_shots(project_id: int (optional), project_name: str (optional), sequence_id: int (optional), sequence_code: str (optional), shot_code: str (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional)): List shots, with extensive filters.get_assets(project_id: int (optional), project_name: str (optional), code: str (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional)): List assets, with optional filters.get_tasks(entity_type: str (optional), entity_id: int (optional), project_id: int (optional), project_name: str (optional), user_id: int (optional), task_name: str (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional)): List tasks, with optional filters.get_users_name_or_login_contains(name: str (optional), login: str (optional)): List users whose name or login contains a substring.get_notes(shot_id: int (optional), asset_id: int (optional), user_id: int (optional), task_id: int (optional), version_id: int (optional), project_id: int (optional), project_name: str (optional), task_name: str (optional), asset_code: str (optional), version_name: str (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional), limit: int (optional), page: int (optional)): List notes with comprehensive filtering options. Supports pagination vialimit/pageso large projects aren't silently truncated to ShotGrid's default page.create_note(content: str, project_id: int, subject: str (optional), link_shot_ids: [int] (optional), link_asset_ids: [int] (optional), link_task_ids: [int] (optional), link_version_ids: [int] (optional), task_ids: [int] (optional), addressing_to_user_ids: [int] (optional), addressing_cc_user_ids: [int] (optional), user_id: int (optional), sg_status_list: str (optional)): Create a new Note.note_linksis built from the fourlink_*lists.user_iddefaults to the API user when omitted.update_note(note_id: int, content: str (optional), subject: str (optional), sg_status_list: str (optional), link_shot_ids: [int] (optional), link_asset_ids: [int] (optional), link_task_ids: [int] (optional), link_version_ids: [int] (optional), task_ids: [int] (optional), addressing_to_user_ids: [int] (optional), addressing_cc_user_ids: [int] (optional)): Update an existing Note. Multi-entity list parameters REPLACE existing values when supplied (pass[]to clear).projectandusercannot be changed via update.delete_note(note_id: int): Delete a Note by ID.get_replies(note_id: int, limit: int (optional), page: int (optional)): List replies under a Note, returning full reply fields (content,user,entity, timestamps,attachments). Supports pagination vialimit/page. Replaces the previousget_all_replies_with_note_id, which only returned ids.create_reply(content: str, note_id: int, user_id: int (optional)): Post a Reply under a Note.user_iddefaults to the API user.update_reply(reply_id: int, content: str): Update a Reply's content.delete_reply(reply_id: int): Delete a Reply by ID.get_note_attachments(note_id: int): List attachment references on a Note (lightweight[{id, type, name}]).get_attachment_info(attachment_id: int): Fetch full Attachment metadata (this_fileURL,imagethumbnail, display name, content type, size).get_versions(project_id: int (optional), project_name: str (optional), task_id: int (optional), task_name: str (optional), user_id: int (optional), updated_in_last_n_days: int (optional), updated_date_from: [YYYY,MM,DD] (optional), updated_date_to: [YYYY,MM,DD] (optional)): List versions with optional filters.get_bookings(user_ids: [int] (optional), project_ids: [int] (optional), range_from: [YYYY,MM,DD] (optional), range_to: [YYYY,MM,DD] (optional), vacation: bool (optional), exclude_vacation: bool (optional), sg_status_list: "cfrm"|"pndng" (optional), sort_field: "start_date"|"end_date"|"updated_at" (default "start_date"), sort_order: "asc"|"desc" (default "asc"), limit: int (optional), page: int (optional)): List bookings whose date interval overlaps[range_from, range_to]. Supports multi-user and multi-project queries via theinrelation. Breaking change in v0.2.0:user_id/project_idreplaced by list-valueduser_ids/project_ids; the fourstart_date_from/to/end_date_from/toparameters were replaced byrange_from/range_towith inclusive overlap semantics.create_booking(user_id: int, project_id: int, start_date: [YYYY,MM,DD], end_date: [YYYY,MM,DD], vacation: bool (optional), note: str (optional), percent_allocation: float (optional), sg_status_list: "cfrm"|"pndng" (optional)): Create a new booking.update_booking(booking_id: int, start_date: [YYYY,MM,DD] (optional), end_date: [YYYY,MM,DD] (optional), vacation: bool (optional), note: str (optional), percent_allocation: float (optional), sg_status_list: "cfrm"|"pndng" (optional)): Update an existing booking. Note:userandprojectcannot be changed via update — delete and recreate the booking if these need to change.delete_booking(booking_id: int): Delete a booking by ID.get_entities_updated_in_last_n_days(entity_type: str, n: int, project_id: int (optional)): List entities of a type updated in the last n days.get_entity_by_id(entity_type: str, entity_id: int): Get details for an entity by type and ID.
Error Handling
The server includes a robust error handling wrapper that captures ShotGrid API errors and internal exceptions, returning them as structured JSON objects with error and message fields.
Notes
- Ensure your ShotGrid account has API access enabled.
- The server uses OAuth2 for authentication.
- The server is implemented using FastMCP and runs with
transport="stdio"only. - Credentials can be provided via environment variables (
SHOTGRID_HOST,SHOTGRID_CLIENT_ID,SHOTGRID_CLIENT_SECRET) or CLI arguments (-host/--host,-ci/--client-id,-cs/--client-secret). Env vars take precedence. - Some tools use dynamic field fetching and exclude certain keys (see
remove_exclude_fieldsinmain.py). - Extend or customize the tools in
main.pyas needed for your workflow. - The ShotGrid REST API logic is implemented in
shotgrid_rest.py.
License
MIT License
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.