About uipath-mcp-servers
A skill for managing MCP servers and their tools through UiPath Orchestrator's Agent Gateway and the `uip agenthub` CLI. It covers server lifecycle operations, tool configuration, connection checks, and retrieving the URL clients use.
Key features
- 01Create and manage MCP servers
- 02Refresh server tools
- 03Check connections and tools
- 04Bind UiPath items as tools
- 05Configure platform server tools
- 06Retrieve client connection URLs
Use cases
- 01Set up an Agent Gateway MCP server
- 02Expose a process or agent as a tool
- 03Check a server's connection and tools
- 04Find tools offered by platform services
MCP support
Guides the use of `uip agenthub mcp` and `mcp-tools` to manage MCP servers and their tools, including obtaining the MCP URL that clients connect to.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ uipath/ skills --skill uipath-mcp-serversAfter installing, type/uipath-mcp-serversin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/tools-guide.mdtroubleshooting-guide.mdupdating-servers-guide.mdDetails
From the project READMEUiPath Agent Gateway MCP Servers
Agent Gateway is Orchestrator's hub for MCP servers and A2A agents: about, MCP server types. This skill covers its MCP servers. The CLI group is named agenthub: uip agenthub mcp manages servers, uip agenthub mcp-tools manages their tools.
When to Use This Skill
Servers — uip agenthub mcp, plus uip agenthub platform-services / platform-tools to look up platform names:
- Create, update, delete, list or get an MCP server of any type (Server Types says when to use each), and refresh its tools.
- Check whether a server works: its Integration Service connection and its tools (Checking a Server).
- Get the
McpUrlan MCP client connects to. - Find the UiPath services and tool names a
platformserver can expose.
Tools — uip agenthub mcp-tools:
- Bind Orchestrator processes, agents, agentic processes or API workflows as tools on a
uipathserver; edit or remove those tools. - Add or remove tools on a
platformserver. - List or get the tools of any server.
Not this skill: an agent that calls MCP tools → uipath-agents; running the uip CLI itself as an MCP server (uip mcp serve) → uipath-platform; A2A agents (uip agenthub remote-a2a-agent --help; no skill covers them). No skill covers writing the MCP server itself (uipath-mcp Python SDK, FastMCP, self-hosted runtime): see the uipath-mcp quick start.
Critical Rules
These are the things the CLI does not advertise in --help.
-
Pass slugs exactly as
mcp listprints them. On create the CLI does not validate the slug: without--slugit sends--namelowercased with other characters turned into-, which can still be under 3 or over 50 characters. The service requires^[a-z0-9-]+$, 3-50 characters (display name 3-100), so always pass--slug. The service reads a server by display name before slug, somcp get,mcp update,refresh-toolsand everymcp-tools ... --mcprefuse an argument that reads back another slug ('<INPUT>' resolves to the MCP server '<SLUG>' …). Never pass a display name or a GUID:mcp deletereturns 404 for anything but the slug. -
Give every server command its folder. Pass
--folder-key <FOLDER_KEY>(a GUID) or--folder-path <FOLDER_PATH>(a name orParent/Child), never both, as Folder Context lists per command. A 404 on a slug usually means the wrong folder: find the server withmcp list --all-foldersand pass itsFolderKey. -
Payloads are camelCase; everything else the CLI prints is PascalCase.
--file/--bodykeys must be the API's camelCase names (name,slug,uri,headers,processKey,targetIdentifier, …).mcp create,mcp updateand themcp-toolscreate / update verbs refuse a key that names a field in another case, also with--dry-run(Payload keys differ from their fields only in case: `Name` should be `name`, …): rename each key as listed. A key that names no field is dropped without an error.mcp templateandmcp-tools templateprint a camelCase payload: edit it and send it as it is.--print-schemadescribes the payload in camelCase; it is not one.mcp get,mcp list, every create / update result,mcp-tools listand the--dry-runplan print PascalCase: put a copied value under the camelCase name--print-schemagives.mcp getalso shows a remote server's URI asArgumentsand remote / swagger headers asEnvironmentVariables. -
Set headers and environment variables with the flags. Use
--header <NAME>=<VALUE>onremote/swaggerand--env <KEY>=<VALUE>oncommand, once per entry, oncreateandupdate. The CLI sends the newline-separatedName:Value/KEY=VALUElines the service stores and refuses a repeated name or a value with a line break. A header value of exactly%ASSETS/<ASSET_NAME>%is replaced at call time by that Orchestrator asset's value, read from the server's folder. The asset must hold the whole value (e.g.Bearer <TOKEN>):Bearer %ASSETS/<ASSET_NAME>%is sent literally. Do NOT invent another syntax. Orchestrator gives the asset's value to Agent Gateway in the portal and to jobs, but not for a CLI login:refresh-toolsfrom the CLI on such a server fails with 403 (troubleshooting). Onmcp update,--header/--envreplace every stored entry; keep a secret by passing"<NAME>=****"with the name spelled exactly asmcp getshows it with a****value. -
Confirm each mutation from its result.
mcp create/mcp updatereturn the stored server,mcp-tools create-resource/create-raw/updatethe stored tool, anddeletereportsDeleted: trueonly after every delete succeeded.mcp-tools enable/disablereturn the server without its selection: confirm withuip agenthub mcp-tools list --mcp <SLUG> --folder-path <FOLDER_PATH> --limit 1000 --output-filter "{Names: Items[].Name, Total: Total, Count: Count}" --output json(unfiltered rows carry each tool's schemas).mcp getshows secrets as****either way, so it cannot prove a masked value was kept.refresh-toolsis confirmed by itsData.Status(Rule 7), not by re-listing tools. -
Scalar flags keep; a payload replaces. With scalar flags,
mcp updatereads the server and sends back every stored field you do not change. A--file/--bodypayload is sent as it is: each field it leaves out is kept or cleared as the payload table says. An omitteddescriptionis always cleared, and aplatformpayload withoutselectedToolNames/useAllToolsclears the selection and turns All tools off;--print-schemadoes not say this for every field. On auipathserver, an update withouttoolskeeps every tool; a payload withtoolsreplaces them all. Read Updating Servers before anymcp update. -
refresh-toolsdepends on the server type. A newcoded,commandorremoteserver has no tools until it runs: run it aftermcp create, and after aremote--urichange (the stored tools still come from the old URI). It needs the folder, also with--dry-run.coded/command:Data: {RuntimeId, Status: "Started"}. Agent Gateway started the server as an Orchestrator job (uip or jobs get <RUNTIME_ID> --output json); the tool list changes only when that job registers its tools. Report theRuntimeId; never claim the tools are refreshed.remote/swagger:Data: {Status: "Refreshed"}, and the tools are already stored: remote tools are fetched from its URI; swagger tools are regenerated from itsswaggerUrl, downloaded again with the stored headers (or from the stored spec when it has no URL).platform:Data: {Status: "Refreshed"}. The service drops its cached service definition; the selection is kept.uipath/selfhosted: refused.uipathtools come frommcp-tools create-resource;selfhostedtools from the runtime that serves it.
-
Deletes take a slug, the folder and
--yes.mcp deleteandmcp-tools deleterefuse to run without--yes, also with--dry-run, and never prompt: confirm with the user before passing it. List what you will delete first (mcp list --limit 1000,Totalequal toCount; a prefix is--output-filter "Items[?starts_with(Slug, '<PREFIX>')].Slug"), show each slug with itsName, and delete only the servers the user confirmed from that list.mcp deletetakes one slug per call: run it for each, then list again.mcp delete --dry-rundoes not check that the server exists.mcp-tools delete --name <SUBSTR>matches by case-insensitive substring; when several tools match, the one named exactly that wins, and--allow-multipledeletes every match: prefer tool ids frommcp-tools list. -
List platform names; never guess them. Take
--servicefromplatform-services listand--toolfromplatform-tools list, exactly as cased, one name per--toolflag (theplatformsteps). Services differ per environment: never assumeorchestrator. Pass--toolor--use-all-tools, not both; with neither, the server has no tools. -
Never route stored credentials around a refusal.
mcp updaterefuses to move aremoteserver to another origin (scheme, host or port), or aswaggerserver to another spec, while that would send its stored connection token or secret headers there. Follow the refusal'sInstructions(moving a server); do not delete headers or connections to get past it without the user's consent.
Folder Context
| Command | Folder input |
|---|---|
mcp list | one of --folder-key, --folder-path, --all-folders, required |
mcp get, mcp create <TYPE>, mcp update (incl. --print-schema, --dry-run), mcp delete, mcp refresh-tools | --folder-key or --folder-path, required |
every mcp-tools verb that takes --mcp | the server's folder, required; create-resource, create-raw and update also take --target-folder-key / --target-folder-path for a target in another folder |
mcp-tools candidates | optional: tenant-wide without one |
mcp create <TYPE> --print-schema | none (folder flags are ignored) |
mcp template, mcp-tools template, platform-services list, platform-tools list | none: a folder flag fails as unknown option |
- Find folders with
uip or folders list --output json: pass a row'sKeyas--folder-keyor itsPathas--folder-path. - Personal workspace folders (
<USER_EMAIL>'s workspace) do NOT resolve by name: use--folder-key. - A name shared by nested folders resolves to the folder whose full path matches exactly; otherwise the CLI lists the candidates: re-run with
Parent/Childor--folder-key. mcp list --all-folderslists the servers in every folder you can read, each row with itsFolderKey(mcp-toolshas no--all-folders). Folders it cannot read are reported only on stderr.- A scalar
create codedfills the payload'sfolderKeyfrom either folder flag; a coded--file/--bodymust carryfolderKeyitself.
Trust the CLI
uip agenthub mcp create <TYPE> --print-schema --output json— create payload fields per type. No login, no folder.uip agenthub mcp template <TYPE> --output json— create--fileskeleton: edit the values, send it as it is.uip agenthub mcp update <SLUG> --folder-path <FOLDER_PATH> --print-schema --output json— update fields for that server's type. It reads the server, so it needs a login, the folder and the exact slug. Only some fields say what leaving them out does: the payload table covers every one.platformnames come fromuip agenthub platform-services listanduip agenthub platform-tools list: run them as theplatformsteps give them.uip agenthub mcp-tools candidates --category <CATEGORY> --output json— Orchestrator resources that can become tools on auipathserver.<CATEGORY>∈automation | agent | agentic-process | api-workflow;--categoryexists only foruipathserver tools (candidates,create-resource,create-raw).uip agenthub mcp get <SLUG> --folder-path <FOLDER_PATH> --output json—McpUrlis the endpoint an MCP client connects to. To show a server the user names, find itsSlugbyNameinmcp list, thenmcp getit and list its tools (Rule 5).mcp get/mcp listprintTypeas a number: 0uipath, 1command, 2coded, 3selfhosted, 4remote, 6platform, 7swagger.Status1 is connected, 0 disconnected. A tool'sTypeis a different number. Null fields are left out: noConnectionIdmeans no Integration Service connection. On aswaggerservermcp getalso prints the spec URL (SwaggerUrl, left out for an inline spec); when it cannot read it, it warns on stderr ([WARN] Could not read the spec URL …) and shows the server without it.--output-filter <JMESPATH>works on every command, over the keys it prints: PascalCase (Items[].Slug), camelCase onmcp templateand--print-schema(uri). The result is cased the same way, so a filter cannot turn output into payload keys.mcp listandmcp-tools listfilter only the current page (default--limit 50): pass--limit 1000and check thatTotalequalsCount.platform-services list/platform-tools listrefuse a filter without--limit.--dry-runruns the CLI's checks and prints the plan (Code: DryRun) without the mutation.mcp update,refresh-toolsandmcp-toolsmutations still read the server (login, exact slug, folder), and everymcp updaterefusal fires in a dry run too. The service's validation never runs, so a clean dry run does not guarantee the real call succeeds.- A failure prints
ErrorCode,Retry,Message,Instructions, and when they applyNextCommand(values shell-quoted),Errors(fields a 400 rejected) andContext.HttpStatus. Act onErrorCode,RetryandInstructions, not on the exit code.NextCommandusually repeats your folder flag, but some name only the verb (mcp-tools enable --mcp <SLUG>on aplatformserver,mcp-tools create-resource --mcp <SLUG> --folder-key <GUID>on auipathone): add the folder and the required flags before running it. - Most
--helpexamples omit the folder flag (mcp delete --dry-runalso omits--yes, themcp-tools updateexamples omit--mcp), and their output keys are cased differently from the real output: take casing from Rule 3, not from the examples.
Server Types
uip agenthub mcp create <TYPE> shares --name, --slug, --description, --version, --file / --body / --print-schema, --dry-run, --folder-path / --folder-key, --login-validity. Use exactly one of scalar flags, --file or --body. The CLI checks no required field (--print-schema lists them); the service answers 400 with Errors, except a swagger create with neither --spec-url nor swaggerContent, which fails with HTTP 409 Either SwaggerUrl or SwaggerContent must be provided.
| Type | Type-specific flags | When to use | Tools from | More in |
|---|---|---|---|---|
uipath | (none) | A server you fill with tools that run Orchestrator processes, agents, agentic processes or API workflows. | mcp-tools create-resource | Tools, binding, uipath updates |
coded | --process-key <PROCESS_KEY> | A published coded MCP server package (uipath-mcp Python SDK; process type MCPServer), started as a job in the server's folder. Not a coded agent. | refresh-tools (async) | payload, refresh errors |
command | --command <CMD>, --arg <ARG> (repeatable, at least one), --env <KEY>=<VALUE> (repeatable) | A stdio MCP server Agent Gateway starts as a command (npx / uvx + package) in a serverless job. | refresh-tools (async) | masked values, refresh errors |
remote | --uri <URL>, --header <NAME>=<VALUE> (repeatable), --connection-id <CONNECTION_ID>, --use-relay | An HTTP MCP server hosted elsewhere: a vendor's, or one inside the company network through Relay. | refresh-tools (sync) | masked values, moving a server, network errors |
swagger | --spec-url <URL>, --header <NAME>=<VALUE> (repeatable), --use-relay | A REST API with an OpenAPI document: one tool per operation. | the spec, on create and refresh-tools (sync) | payload, moving a server, network errors |
platform | --service <SERVICE_NAME>, then --tool <TOOL_NAME> (repeatable) or --use-all-tools | A first-party UiPath service (e.g. Test Manager): a chosen tool set, or every tool including ones added later. | the selection, or All tools | platform selection, platform errors |
-
coded:--process-keyis the process (release)KeyGUID fromuip or processes list --folder-key <FOLDER_KEY> --process-type MCPServer --output json, not itsProcessKeyfield (the package name). The process must be in the server's folder, and the service does not check it on create: a wrong key surfaces only when the server runs.mcp template codedhas placeholderprocessKey/folderKey: replace both with GUIDs. -
command: the service splitsargumentson spaces, so one--argvalue cannot contain a space. -
remote/swagger: without--use-relaythe service blocks private hosts (URL blocked for security reasons: …); with it, any absolutehttp(s)URL is reached through Relay (swagger: the spec download and the API calls). Onmcp update,--use-relay/--no-use-relayswitch Relay; without either the setting is kept.--connection-id(remote) is the GUID of an Integration Service connection whose token authenticates the calls: an OAuth connection of connectoruipath-uipath-mcp, fromuip is connections list <CONNECTOR_KEY> --all-folders --output jsonwith that connector key. -
swagger: needs the tenant's Swagger MCP feature (otherwise HTTP 404).--headervalues go with the spec download and every API call. An inline spec (swaggerContent) goes only in--file/--body.--filteris accepted but not sent. The create result includes the whole spec: filter it (--output-filter "{Slug: Slug, McpUrl: McpUrl}"). -
platform:uip agenthub platform-services list --output json— match the user's wording toDisplayName; pass itsServiceName. Several names can share the words (Test Manager,Test Manager External,Test Manager Performance Testing): take the exact match, otherwise ask.uip agenthub platform-tools list --service <SERVICE_NAME> --limit 1000 --output-filter "{Names: Items[].Name, Total: Total}" --output json— the tool names. Unfiltered rows carry JSON Schemas and run to hundreds of KB;--name <SUBSTR>searches and returns full rows withDescription. Read theDescriptionof each candidate before picking tools for a request ("list test cases":Get_test_cases, notGet_Automated_Test_Cases_For_Folder), and tell the user the exact names you picked.uip agenthub mcp create platform --name <NAME> --slug <SLUG> --service <SERVICE_NAME> --tool <TOOL_NAME> --tool <TOOL_NAME> --folder-path <FOLDER_PATH> --output json, or--use-all-toolsinstead of--tool.uip agenthub mcp-tools list --mcp <SLUG> --folder-path <FOLDER_PATH> --limit 1000 --output-filter "{Names: Items[].Name, Total: Total, Count: Count}" --output json— the tools it exposes (on an All tools server, every tool of the service).
mcp getshows the service asArgumentsand the mode asUseAllTools. Without Platform MCP on the tenant the two lists fail withPlatform MCP is not enabled on this tenant., whilecreate platformand a platformmcp updatereturn a bare HTTP 404. -
selfhosted/process-assistant:mcp templateaccepts both, butmcp createhas no such type. A self-hosted server registers itself when theuipath-mcpPython runtime starts; the CLI canlist/get/deleteit and refusesmcp updateandrefresh-toolson it.process-assistantis a legacy value.
Updating Servers
mcp update <SLUG> reads the server, then sends that type's full update body. Scalar flags change only what they name and cannot be combined with --file / --body; a payload keeps or clears what it leaves out as the payload table says, in camelCase, without type. Every type takes --name, --description and --version. A flag the type does not take is refused (<FLAGS> apply only to <TYPES> servers; '<SLUG>' is a <TYPE> server., applies after a single flag), and so is --service.
| Type | Change it with |
|---|---|
uipath | No other flag; the tools are kept. Change tools with mcp-tools: a payload tools list replaces them all (guide). |
coded | --process-key; folderKey stays the server's own folder. |
command | --command, --arg (replaces all arguments), --env (replaces all variables; Rule 4). |
remote | --uri, --header (replaces all; Rule 4), --use-relay / --no-use-relay, --connection-id <CONNECTION_ID> or --clear-connection (with neither, the connection is kept). |
swagger | --spec-url (downloads the spec again, regenerates the tools), --header (replaces all), --use-relay / --no-use-relay. |
platform | --tool (replaces the whole selection), --use-all-tools / --no-use-all-tools; without them the selection and mode are kept. On an All tools server, --tool needs --no-use-all-tools. |
selfhosted, process-assistant | Refused. |
Payload fields per type, the uipath tools list, masked values and moving a server to another host: references/updating-servers-guide.md.
Checking a Server
Agent Gateway's Check connection tests a server's Integration Service connection; Refresh tools tests the server itself.
- The connection:
uip is connections ping <CONNECTION_ID> --force-refresh --output json, with theConnectionIdfrommcp get(noConnectionIdmeans the server has no connection to check).Data.Status: "Enabled"means it is active. Any other status fails withConnection '<CONNECTION_ID>' is not enabled (status: <STATUS>).; anExpiredconnection needs its owner to sign in again (uip is connections edit <CONNECTION_ID>, or Integration Service in the portal). Tell the user; do not create, swap or clear a connection to get past it. - The server:
refresh-tools(Rule 7). Onremoteandswagger,Refreshedmeans Agent Gateway reached the server (or the spec) with its credentials and stored the tools it listed; confirm withmcp-tools list(Rule 5). A failure names the cause (troubleshooting). Oncoded/commandit only starts the job. It authenticates with the caller's own per-user connection on the server when there is one, otherwise with the server'sConnectionId; the CLI cannot list per-user connections. refresh-toolsis a write: onremoteandswagger, a tool list that differs from the stored one in any field recreates every tool with a new id and deletes the tools' guardrails. When the user only asked to check the server, say so before running it.
Tools (uip agenthub mcp-tools)
| Verb | Works on |
|---|---|
create-resource, create-raw, update, delete | uipath servers only |
enable, disable | platform servers only |
list, get --name <NAME> | every type |
get <TOOL_ID> | every type except platform (404: its tools are not stored) |
template, candidates | no server needed |
- Bind a resource: pick a row from
mcp-tools candidates --category <CATEGORY> --name <SUBSTR> --output json(one page, default 50: narrow with--name; show the row'sFolder.Namenext to itsName), thenuip agenthub mcp-tools create-resource --mcp <SLUG> --name <NAME> --description "<DESCRIPTION>" --category <CATEGORY> --target-identifier <RESOURCE_ID> --target-folder-key <RESOURCE_FOLDER_KEY> --folder-path <FOLDER_PATH> --output json, with the row'sIdandFolder.Key. Always pass--description(the service requires one; when the row has none, write one from the request) and--category.candidates --namematches substrings (EchoAgentalso findsCoded copy of EchoAgent): take the row whoseNamematches exactly, and when none or several do, show eachNamewith itsFolder.Nameand ask. A wrong row still creates a working tool, so check that the result'sTargetIdentifieris the row'sId. - Platform selection:
uip agenthub mcp-tools enable/disable --mcp <SLUG> --name <TOOL_NAME> --folder-path <FOLDER_PATH> --output json(repeat--name) add or remove those tools and keep the rest. On an All tools serverenablechanges nothing anddisableis refused: runuip agenthub mcp update <SLUG> --no-use-all-tools --folder-path <FOLDER_PATH> --output jsonfirst, which keeps every tool selected.disablerefuses a name the service does not define (Tools not found in the <SERVICE_NAME> service: …), but one the service defines and the server does not select succeeds and changes nothing: list the tools first, and when the name is not among them, tell the user instead of running it. - Edit a tool: a tool's own fields change with
mcp-tools update <TOOL_ID>;mcp updatechanges the server's. Take the id frommcp-tools list:--namematches substrings, and when several match, the tool named exactly that (case-sensitive) wins. Onlyuipathtools can be edited: the tools of every other type come from their source (URI, spec, command, package, service), andrefresh-toolsrebuilds them from it. mcp-tools templateprints a camelCase payload (Rule 3);create-rawignores its scalar flags, so use it only with--file/--body.mcp-tools update --renamechangesName, notMcpName, the name MCP clients see.
Flags, defaults, target folders, update, delete, get and paging: references/tools-guide.md. Most of it is for uipath and platform servers; for the other types only its listing section applies.
Troubleshooting
Payload keys differ from their fields only in case: …— rename each key as listed (Rule 3); keys copied frommcp getormcp-tools listare PascalCase. HTTP 400 oncreate-resourcewithout--description— pass--description.AgentHub requires a folder context. …— add a folder flag (Folder Context).No folder named '<NAME>' was found.— a typo, or a personal workspace: pass itsKeyas--folder-key.'<INPUT>' resolves to the MCP server '<SLUG>', …— pass the stored<SLUG>(Rule 1); if<INPUT>is another server's slug, rename<SLUG>first. HTTP 404 on a slug — wrong folder, or not the slug (Rules 1, 2).--uri moves '<SLUG>' to another origin, …/--spec-url gives '<SLUG>' a new spec, …(orThe payload's …for a--file/--body) — Rule 10.This command requires a <EXPECTED_TYPE> MCP server; <SLUG> is <TYPE>.— themcp-toolsverb does not apply to that type. Oncoded/command/remote/swagger, run theNextCommand(refresh-tools). Onplatform, itsNextCommandnamesmcp-tools enablewithout--nameor the folder: add both.Platform MCP is not enabled on this tenant., or HTTP 404 oncreate platform— the feature is off on this tenant: use another tenant or server type.
Reference Navigation
- references/updating-servers-guide.md — payload fields per type,
uipathserver updates, masked values, moving a server to another host. - references/tools-guide.md —
mcp-toolsonuipathservers (bind, update, delete, target folders) andplatformservers (selection); listing and reading tools on any type. - references/troubleshooting-guide.md — every other
uip agenthubmessage, with its fix.
What NOT to Do
- Do NOT guess a platform service or tool name, or assume
orchestrator(Rule 9). - Do NOT paste PascalCase CLI output into a payload as it is (Rule 3).
- Do NOT pass a display name or a GUID where a slug goes (Rule 1).
- Do NOT pass
--yesbefore the user confirms the delete (Rule 8). - Do NOT report a
coded/commandrefresh as done when it returnedStatus: "Started"(Rule 7). - Do NOT copy a
--helpexample without adding the folder flag it omits.