trimble-connect-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TC_APP_NAME | No | Used in the OAuth scope (openid <app name>). Default: Trimble_Connect_MCP. | Trimble_Connect_MCP |
| TC_CLIENT_ID | Yes | Required. The Trimble application Client ID. | |
| TC_TOKEN_DIR | No | Where tokens and the region cache are stored. Default: ~/.trimble_connect_mcp. | ~/.trimble_connect_mcp |
| TC_DOWNLOAD_DIR | No | Where downloaded files are saved. Default: ~/Downloads/TrimbleConnect. | ~/Downloads/TrimbleConnect |
| TC_ENABLE_WRITE | No | Set to '1' to enable the write / delete / permission tools. Default: off (0). | 0 |
| TC_REDIRECT_URI | No | Must match the URL registered in the Developer Console. Default: http://localhost:8385/callback. | http://localhost:8385/callback |
| TC_CLIENT_SECRET | Yes | Required. The Trimble application Client Secret. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| tc_loginA | Sign in to Trimble Connect via the browser (OAuth2 + PKCE). Opens the user's default browser at the Trimble Identity login page and listens on the registered localhost callback (TC_REDIRECT_URI, default http://localhost:8385/callback). Tokens are cached locally and refreshed automatically, so this is only needed the first time or after the session fully expires. The call does NOT block indefinitely: if the sign-in is not finished within wait_seconds it returns {"pending": true, "auth_url": ...} while the callback listener keeps waiting in the background (up to 10 minutes total). In that case tell the user to finish signing in — opening auth_url manually if no browser appeared — and then call tc_auth_status to confirm. Do NOT immediately call tc_login again; a second call simply waits on the same pending login. Args: wait_seconds: How long to wait before returning a pending result (default 90). Use a small value to return quickly. open_browser: Set false to only return auth_url without launching a browser (useful when the browser cannot be opened automatically). Returns: {"logged_in": true, "user": {...}} on success, {"logged_in": false, "pending": true, "auth_url": ...} if the user has not finished yet, or {"error": ...}. |
| tc_login_cancelA | Abort a browser sign-in that is still waiting and free the callback port. Use when a tc_login attempt was abandoned (wrong account, browser closed) and the local callback listener should stop before starting a new login. Returns: {"cancelled": true|false} |
| tc_auth_statusA | Check whether the user is signed in to Trimble Connect. Returns login state, token expiry, and the signed-in user's name/email (from the cached ID token). Call this first if any other tool returns an authentication error, and after a tc_login call that came back with "pending": true (login_in_progress marks a browser sign-in still waiting). |
| tc_write_statusA | Check whether this server may modify data in Trimble Connect. Write tools (create/rename/move/copy/upload/delete, permissions, members, groups) only work when the environment variable TC_ENABLE_WRITE=1 is set for this MCP server in Claude Desktop. Destructive tools additionally require confirm=true on the call. Returns: {"write_enabled": bool, "env_var": str, "how_to_enable": str, "destructive_tools_need": "confirm=true"} |
| tc_list_regionsA | List Trimble Connect regional servers (North America, Europe, Asia...). Returns: {"count": int, "regions": [{"location": str, "origin": str}]} — 'origin' is the regional API base URL. Projects live in exactly one region; other tools resolve the region automatically from project_id. |
| tc_list_projectsA | List all Trimble Connect projects the signed-in user can access. Queries every region and merges the results. Use this to find a project's ID before calling folder/file tools. Args: name_filter: Optional case-insensitive substring to filter by name. refresh: Re-discover regions before listing (default False). Returns: {"count": int, "projects": [{"id","name","rootId","region", "access","createdOn","modifiedOn",...}]} |
| tc_get_projectA | Get full details of one project (raw API object). Args: project_id: Project ID from tc_list_projects. Returns the complete project JSON including rootId (root folder), license info, counts and settings. |
| tc_list_project_membersA | List members (users) of a project with their role and status. Args: project_id: Project ID from tc_list_projects. include_removed: Also list users with status REMOVED (default False). group_id: Optional — only members of this group (see tc_list_groups). Returns: {"count": int, "members": [{"id","email","name","role" ("ADMIN"|"USER"),"status" ("ACTIVE"|"PENDING"|"REMOVED")}]}. Member ids are what folder-permission tools expect as subject ids. |
| tc_list_folderA | List the contents (subfolders and files) of one folder. Args: project_id: Project ID (used to resolve the correct region). folder_id: Folder ID to list. Omit to list the project's ROOT folder. Returns: {"folder_id": str, "count": int, "items": [{"id","name", "type" ("FOLDER"|"FILE"),"size","revision","versionId","modifiedOn", "modifiedBy",...}]}. Use item ids to descend into subfolders or fetch file details. |
| tc_folder_treeA | Render a compact text tree of the project's folder structure. Recursively walks folders breadth-limited by max_depth and max_entries — ideal for a quick overview of a CDE structure before drilling in. Args: project_id: Project ID. folder_id: Start folder (default: project root). max_depth: Levels to descend, 1-6 (default 3). max_entries: Hard cap on total lines to keep output small (default 400). Returns: Markdown-ish text tree. Folders show their ID so you can call tc_list_folder / tc_folder_tree on a subtree; files show size and last modified date. A trailing note reports truncation, if any. |
| tc_get_fileA | Get metadata of a file (latest version): name, size, revision, dates. Args: project_id: Project the file belongs to (resolves the region). file_id: File ID (from tc_list_folder). Returns the raw file JSON from the API. |
| tc_list_file_versionsA | List the version history of a file. Args: project_id: Project the file belongs to. file_id: File ID. Returns: {"count": int, "versions": [...]} with versionId, revision, size, createdOn/modifiedOn and author per version (fields as provided by the API). |
| tc_download_fileA | Download a file from Trimble Connect to the local disk. Read-only on the Trimble side; writes only to the local download folder. Args: project_id: Project the file belongs to. file_id: File ID (from tc_list_folder). version_id: Optional specific version (from tc_list_file_versions); default latest. file_name: Optional name for the saved file; defaults to the file's name from metadata. save_dir: Optional target directory; default TC_DOWNLOAD_DIR (~/Downloads/TrimbleConnect). Returns: {"saved_to": str, "size_bytes": int} |
| tc_searchA | Search Trimble Connect for files, folders, todos etc. by text. Args: query: Search text (e.g. a file name or keyword). project_id: Optional — limit the search to one project (faster, searches only that project's region). Omit to search all regions. Returns: {"count": int, "results": [...]} (raw search results from the API, per region). |
| tc_api_getA | Advanced escape hatch: perform a raw GET on the Trimble Connect Core API (v2) and return the raw JSON. Use when no dedicated tool covers an endpoint (e.g. 'todos?projectId=X', 'views', 'releases', 'projects/{id}/activities'). Read-only — for writes use the dedicated tools, or tc_api_write. Args: path: Path relative to the API base, e.g. 'projects/{id}/activities' or 'todos'. Must not include a scheme/host. project_id: Optional — route the call to this project's region. Omit to call the master (North America) server. params: Optional query parameters as a flat string dict. Returns raw JSON (paginated list endpoints are fetched fully up to a safety cap). |
| tc_create_folderA | Create ONE new folder inside a parent folder. Requires TC_ENABLE_WRITE=1 (see tc_write_status). Args: project_id: Project ID (resolves the region). name: New folder name (max 255 chars, must be unique in the parent). parent_folder_id: Parent folder; omit to create under the project ROOT folder. Returns: {"created": true, "id", "name", "parentId", "path"}. For a whole CDE tree use tc_create_folder_structure instead. |
| tc_create_folder_structureA | Create a whole folder tree in one call (e.g. an ISO 19650 CDE). Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. paths: Folder paths relative to the start folder, '/' separated, e.g. ["01-WIP/01-ARC", "01-WIP/02-STR", "02-SHARED", "03-PUBLISHED"]. Intermediate levels are created automatically, so listing only the leaves is enough. parent_folder_id: Start folder; omit for the project ROOT. skip_existing: Reuse a folder that already exists instead of failing (default True) — makes the call safe to re-run. Returns: {"created": [{"path","id"}], "existing": [{"path","id"}], "errors": [{"path","error"}], "root_folder_id": str} |
| tc_rename_itemA | Rename a folder or a file. Requires TC_ENABLE_WRITE=1. Renaming and moving must be separate calls — the API ignores the new name if a new parent is sent at the same time. Args: project_id: Project ID. item_id: Folder or file ID. new_name: New name. item_type: "FOLDER" (default) or "FILE". Returns: {"renamed": true, "id", "name", ...} |
| tc_move_itemA | Move a folder or file into another folder. Requires TC_ENABLE_WRITE=1. Moving a folder moves its whole subtree, and permissions may change through inheritance in the new location. Args: project_id: Project ID. item_id: Folder or file ID to move. new_parent_folder_id: Destination folder ID. item_type: "FOLDER" (default) or "FILE". Returns: {"moved": true, "id", "name", "parentId", ...} |
| tc_copy_fileA | Copy one file into another folder (server-side copy). Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID (source and target must be the same project). file_id: Source file ID. target_folder_id: Destination folder ID. version_id: Optional specific version to copy; default = latest. copy_metadata: Also copy the file's metadata/attributes. merge_existing: If a file with the same name exists in the target, add the copy as a NEW REVISION of it instead of failing. Cannot be combined with copy_metadata. Returns the new file object with {"copied": true}. |
| tc_copy_folderA | Copy a folder and everything inside it to another location. Trimble Connect has no server-side folder-copy endpoint, so this walks the tree and recreates folders + copies files one by one. Slow for large trees — max_items caps the work. Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. folder_id: Folder to copy. target_parent_folder_id: Folder that will contain the copy. new_name: Name for the copy (default: same name as the source). max_items: Safety cap on folders+files processed (default 300). Returns: {"copied": true, "new_folder_id", "folders_created", "files_copied", "errors": [...], "truncated": bool} |
| tc_delete_itemA | Delete a folder or a file. DESTRUCTIVE — there is no undo via the API. Trimble Connect deletes are soft (an admin can restore from the web UI), but this API offers NO restore endpoint. Requires TC_ENABLE_WRITE=1 AND confirm=true. Always show the user what will be deleted first. Args: project_id: Project ID. item_id: Folder or file ID. confirm: Must be true — safety gate. item_type: "FOLDER" (default) or "FILE". force: Required to delete a folder that is NOT empty (deletes the whole subtree, runs as a background job). Returns: {"deleted": true, ...} or an error explaining what is missing. |
| tc_upload_fileA | Upload a NEW file from the local disk into a Trimble Connect folder. Fails if a file with the same name already exists in that folder — use tc_upload_new_version to add a revision instead. Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. folder_id: Destination folder ID (tc_list_folder / tc_folder_tree). local_path: Full path of the file on this computer. name: Optional name to use in Trimble Connect (default: file name). Returns: {"uploaded": true, "file_id", "version_id", "revision", "name", "size_bytes"} |
| tc_upload_new_versionA | Upload a file as a NEW VERSION of an existing file in that folder. The existing file keeps its history; the uploaded content becomes the latest revision that everyone will see. Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: project_id: Project ID. folder_id: Folder that already contains the file. local_path: Full path of the new content on this computer. name: Name of the existing file in Trimble Connect (default: the local file name) — it must match exactly, otherwise a new file is created instead. confirm: Must be true — safety gate. Returns: {"uploaded": true, "file_id", "version_id", "revision", ...} |
| tc_get_permissionsA | Read the access control list (ACL) of a folder or file. Args: project_id: Project ID. item_id: Folder or file ID. item_type: "FOLDER" (default) or "FILE". Returns: {"acl": {"READ": [ids], "FULL_ACCESS": [ids], "NO_ACCESS": [ids]}, "inheritance": bool, ...}. Ids are project user ids (tc_list_project_members) or group ids (tc_list_groups); the special id "tc-groups:*" means all project members. Files support only READ and FULL_ACCESS. |
| tc_grant_permissionsA | Give users/groups a permission level on a folder or file (safe merge). Reads the current ACL, moves the given subjects to the requested level, and writes the whole ACL back — everyone else keeps what they had. Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. item_id: Folder or file ID. subject_ids: User ids (tc_list_project_members) and/or group ids (tc_list_groups). Use "tc-groups:*" for all project members. level: "READ", "FULL_ACCESS", or "NO_ACCESS" (folders only). item_type: "FOLDER" (default) or "FILE". inheritance: Optional — set True/False to also change whether the folder inherits permissions from its parent. Returns: {"updated": true, "acl": {...}, "inheritance": bool} |
| tc_remove_permissionsA | Remove users/groups from a folder's or file's ACL entirely. They fall back to whatever the parent folder / project grants them. To actively BLOCK someone instead, use tc_grant_permissions with level="NO_ACCESS". Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: project_id: Project ID. item_id: Folder or file ID. subject_ids: User/group ids to drop from the ACL. confirm: Must be true — safety gate. item_type: "FOLDER" (default) or "FILE". Returns: {"updated": true, "acl": {...}, "removed": [ids]} |
| tc_set_permissionsA | REPLACE the whole ACL of a folder or file (advanced). Everything not listed in Args: project_id: Project ID. item_id: Folder or file ID. acl: {"READ": [ids], "FULL_ACCESS": [ids], "NO_ACCESS": [ids]} — levels may be omitted. "tc-groups:*" = all project members. confirm: Must be true — safety gate. item_type: "FOLDER" (default) or "FILE". inheritance: Optional — whether the folder inherits from its parent. Returns: {"updated": true, "acl": {...}, "previous_acl": {...}} |
| tc_list_project_rolesA | List the roles available in a project (typically ADMIN and USER). Args: project_id: Project ID. Returns: {"roles": [str]} |
| tc_add_project_userA | Invite a user to a project by email. Requires TC_ENABLE_WRITE=1. The invitee gets status PENDING until they open the project. Args: project_id: Project ID. email: Email address to invite. role: "USER" (default) or "ADMIN" — check tc_list_project_roles. notify: Send the invitation email (default True). Returns the created member object with {"invited": true}. |
| tc_update_project_userA | Change a project member's role (e.g. USER → ADMIN). Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. user_id: Member id from tc_list_project_members (not the email). role: "ADMIN" or "USER". Returns the updated member object with {"updated": true}. |
| tc_remove_project_userA | Remove a member from a project. DESTRUCTIVE — they lose all access. Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: project_id: Project ID. user_id: Member id from tc_list_project_members. confirm: Must be true — safety gate. Returns: {"removed": true, "user_id": str} |
| tc_list_groupsA | List the user groups of a project. Groups are the practical way to grant folder permissions to a whole discipline or company at once. Args: project_id: Project ID. Returns: {"count": int, "groups": [{"id","name","usersCount",...}]} |
| tc_list_group_usersA | List the members of a project group. Args: project_id: Project ID (resolves the region). group_id: Group ID from tc_list_groups. Returns: {"count": int, "users": [{"id","email","name","status"}]} |
| tc_create_groupA | Create a user group in a project. Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. name: Group name (e.g. "Architects", "Contractor - Site"). Returns the created group with {"created": true}. |
| tc_rename_groupA | Rename a project group. Requires TC_ENABLE_WRITE=1. Args: project_id: Project ID. group_id: Group ID. new_name: New group name. Returns the updated group with {"renamed": true}. |
| tc_delete_groupA | Delete a project group. DESTRUCTIVE — any folder permission granted to this group disappears with it. Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: project_id: Project ID. group_id: Group ID. confirm: Must be true — safety gate. Returns: {"deleted": true, "group_id": str} |
| tc_add_group_usersA | Add project members to a group. Requires TC_ENABLE_WRITE=1. Users must already be project members (invite them first with tc_add_project_user). Args: project_id: Project ID. group_id: Group ID. user_ids: Member ids from tc_list_project_members. Returns: {"added": [ids], "count": int} |
| tc_remove_group_usersA | Remove members from a group (they stay in the project). Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: project_id: Project ID. group_id: Group ID. user_ids: Member ids to remove. confirm: Must be true — safety gate. Returns: {"removed": [ids], "count": int} |
| tc_api_writeA | Advanced escape hatch: raw POST/PATCH/PUT/DELETE on the Core API (v2). Only for endpoints with no dedicated tool (todos, views, releases, attributes...). Requires TC_ENABLE_WRITE=1 AND confirm=true. Args: method: "POST", "PATCH", "PUT" or "DELETE". path: Path relative to the API base, e.g. 'todos'. No scheme/host. confirm: Must be true — safety gate. project_id: Optional — route to this project's region (recommended; otherwise the master/North America server is used). params: Optional query parameters. body: Optional JSON body. Returns the raw JSON response (or {"status": 204} for empty responses). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nhantruong96/trimble-connect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server