From outsystems
OutSystems over MCP. Edit apps, publish, deploy, search tenant elements, manage external libraries. Use for ANY OutSystems task.
How this skill is triggered — by the user, by Claude, or both
Slash command
/outsystems:outsystemsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are connected to OutSystems over the MCP HTTP transport. OutSystems is a cloud-native low-code platform where apps are built from OML (OutSystems Model Language), a binary format describing entities, screens, actions, and logic. Every tool call carries the harness's validated OAuth bearer; tenant + user identity are derived from the JWT, not from arguments.
You are connected to OutSystems over the MCP HTTP transport. OutSystems is a cloud-native low-code platform where apps are built from OML (OutSystems Model Language), a binary format describing entities, screens, actions, and logic. Every tool call carries the harness's validated OAuth bearer; tenant + user identity are derived from the JWT, not from arguments.
Once authenticated and the server's tools are visible, read the live tools/list before your first non-auth OutSystems operation. This skill names domains, not tools — names, parameters, and defaults can change server-side, and the server is the source of truth. (Authenticating is the one exception: drive the auth flow first, as described below.)
If the outsystems MCP tools aren't visible in your toolset, or a call returns tenant not configured / connection errors, the MCP server hasn't been registered against the user's tenant. Do this once per machine:
<tenant>.outsystems.dev (e.g. mycompany.outsystems.dev, mytenant.outsystems.dev). The tenant slug is whatever the user chose; do not assume a fixed <short>-<region>-<index> pattern. Prompt verbatim:
"Which OutSystems tenant should I connect to? It's the host portion of your OutSystems URL, typically something like
mycompany.outsystems.dev."
https://, http://), any leading www., trailing slash, and any path or query — keep only the host. The result must match ^[A-Za-z0-9]([A-Za-z0-9.-]*[A-Za-z0-9])?$. Only ask again if the normalized value is still implausible (empty, contains whitespace, or clearly isn't a hostname).https://<TENANT>/mcp.claude mcp add -s user --transport http --client-id service_studio --callback-port 7890 outsystems <URL>
/mcp.If the user already has an outsystems MCP server registered but pointing at the wrong tenant, follow the same flow. The patches are idempotent for the same tenant and update the URL for a new one.
OAuth-protected. The harness exposes two deferred tools; the agent drives the flow — the user does NOT run /mcp -> outsystems -> Authenticate manually.
mcp__outsystems__authenticate: starts the OAuth flow; returns an authorization URL.mcp__outsystems__complete_authentication { callback_url }: finalizes auth for remote sessions.Lazy. Before the first OutSystems tool call in a session, call mcp__outsystems__authenticate and share the returned URL with the user. Then:
http://localhost:<port>/callback): the server's real tools appear automatically — wait for the user's confirmation, then proceed.http://localhost:<port>/callback?code=...&state=...) and call mcp__outsystems__complete_authentication { callback_url: "<that URL>" }.Reactive. On data.category: "AuthError" mid-session (token expired, refresh denied, etc.): call mcp__outsystems__authenticate again, then retry the original call ONCE.
Don't fall back to the /mcp -> outsystems -> Authenticate menu — the deferred tool pair is always available; the menu is the host's emergency fallback.
If authenticate itself errors (server unreachable, DCR fails): surface the message verbatim and file against OutSystems/outsystems-mcp. Don't speculate about server internals.
Discover the live catalog from the MCP server's tools/list; treat each tool's description + inputSchema as the source of truth. Don't rely on a hardcoded list — the set can change server-side. The tools group into these domains:
Cross-tool behaviors not expressible in a single per-tool description:
build_key nor a revision pinned (and the operation isn't an undeploy), pass from_env; the target env_key is not used as the source on HTTP.app_key from the mentor_session_token claims; it needs mentor_session_id, mentor_session_token, and env_key. An explicit app_key is ignored.zip_b64) and per-replica concurrency gating. Pre-flight rejects oversize payloads; concurrent uploads queue per replica rather than reject.owned_only to true when app is set, false tenant-wide. Pass owned_only: false with app to keep rows inherited from referenced libraries (OutSystemsUI, Charts, etc.).tools/list before your first non-auth call. This skill names domains; the server names tools. (Auth comes first; see Authenticating.)destructiveHint prompt is a backstop, not a substitute: this rule applies on every host regardless of whether the host gates on the hint.env_key, app_key, an asset key, or a mentor_session_* token is missing and you can't resolve it, ask the user.env_key per call; the transport is stateless by design. When a user asks for a session-persistent env select style toggle, say so explicitly rather than refusing silently, and reframe the request so they pass env_key per call.data.category, not message text, for error retry decisions. Categories: AuthError, ValidationError, UpstreamError, InternalError; upstream errors also carry data.upstream_status.runId), and you poll the matching status surface until it's terminal (a mentor run can also be cancelled). Per-tool polling shape is in each tool's live description.sleep N is blocked by many harnesses as a context-burning idle wait. Use your harness's background-task / background-sleep mechanism, then end your turn; the harness re-invokes you on completion. Calling the next tool right after a background sleep returns synchronously = no pacing. See "Pacing polls" under Mentor for cadence and the cursor pattern.name is the display form (may contain spaces, e.g. "AI Agent Feedback Portal"); assetName is the internal identifier (e.g. "AIAgentFeedbackPortal"). The app: parameter on the context lookups and app search accepts either — case-insensitive substring match against both the display name and its space-stripped variant.When you report on a tenant object that you looked up in this conversation — an application, environment, external library, deployment operation, the tenant binding itself — surface the canonical identifier alongside the human-readable name: asset key (UUID) for apps and external libraries, env_key for environments, operation key for deployments, tenant hostname for the tenant. The identifier is the stable reference the user needs to act on the result; names are ambiguous when two objects share one. This extends ## Names (stable-key preference across calls) to the user-facing answer.
The rule fires when the agent did the lookup itself in this conversation or a follow-up action is plausible. Pure confirmation answers ("logged in", "yes that ran") can omit the identifier, and so can hand-back of an ID the user already typed.
Mentor is a multi-turn conversation backed by a server-side session that holds the loaded OML. Driven via an async surface — start a run, poll its progress, cancel it if needed. Per-call args, response shape, polling cadence, cursor semantics, and error codes are in each tool's live description + inputSchema.
mentor_session_token when you start the run. The token is HMAC-signed and binds (tenant, user, session id, app, agent_resume_id); echo it back verbatim on resume.mentor_session_token only appears in the terminal run result (alongside mentor_session_id, summary, and events). Use the newest token on the next start.mentor_session_id and conversation continue.mentor_session_id + mentor_session_token from the most recent terminal-success run result.Pacing polls:
status isn't terminal. ~30s is a reference for mentor, not a target — without one, agents tend to drift to 60–180s. Publish, deployment, and external-library status polls finish faster; 5–15s is fine for those.When to use the mentor flow vs the context lookups:
mentor_session_*) when: (a) mentor hallucinates entities/actions that don't exist; (b) you switch to an unrelated task on the same app; or (c) prior turns left the OML in a bad state.IsMandatory=True on the input widget and leave the label text bare — the platform paints a single red * after the label automatically. Don't ask mentor to put a literal * in Label.Text; it renders black, theme-blind, and stacks with the platform asterisk.owned_only)The context lookups index by visibility, not ownership: app-scoped queries return owned rows plus rows inherited from referenced libraries (OutSystemsUI, Charts, etc.). Each row carries isReferenced and producerAssetKey/producerAssetName. owned_only defaults to true when app is set, false tenant-wide; pass owned_only: false with app to keep inherited rows.
Describe an existing app (no OML needed):
app on the context lookups and let it resolve.Edit an existing app and ship it:
app_key and your prompt (e.g. "Add a due date field to Task"). It returns a runId; poll the run with its cursor until terminal, then pull mentor_session_id + mentor_session_token out of the result.mentor_session_id + mentor_session_token and your next prompt, and poll the same way. Each terminal result returns a fresh token; use the newest one next.mentor_session_id + mentor_session_token + env_key; it returns a publication id.Promote a build across environments:
env_key, and from_env for the source (or pin with build_key + revision); it returns an operation key.Publish a new external library:
[OSInterface(Name = "<UniqueName>")] (reusing a name produces a new revision, not a fresh asset). dotnet publish -c Release, zip the .dll + .deps.json at the zip root (no nested folder). Base64-encode the zip.zip_b64 and auto_publish: true; it returns an operation key.Published. On validation failure, pull the operation logs.Reference an external library from an app:
app_key and a prompt like "Use the action from in .", then poll the run as usual.Run a deployment-impact analysis:
env_key; it returns an analysis id.kind: "deployment". Use kind: "deletion" instead when you started the analysis with delete: true.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub outsystems/outsystems-mcp --plugin outsystems