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. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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