OutSystems 11 MCP

Local MCP endpoint inside OutSystems Service Studio for reading and changing O11 modules

Official · OutSystems C# Local · Streamable HTTP Developer tools

32 popularity score ★ 30

Connect your client

Local (once it is running)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add --transport http outsystems-11 http://127.0.0.1:41820/mcp
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "outsystems-11": {
      "url": "http://127.0.0.1:41820/mcp"
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "outsystems-11": {
      "type": "http",
      "url": "http://127.0.0.1:41820/mcp"
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.outsystems-11]
url = "http://127.0.0.1:41820/mcp"
Gemini CLITerminal
gemini mcp add --scope user --transport http outsystems-11 http://127.0.0.1:41820/mcp

What it does

OutSystems builds this MCP server into Service Studio, the desktop IDE for OutSystems 11 applications. You start it from the IDE for each session. It then listens on http://127.0.0.1:41820/mcp unless you pick another port in the start dialog, and a coding agent connected to it can inspect the open module: data model, actions, screens, web blocks, roles, themes, settings and validation messages. For anything those reads miss there is a free-form ModelQL query tool. Reading is Generally Available.

Writing is a Beta Feature. The agent sends C# lambdas written against the OutSystems Model API through applyModelApiCode, and they run on a copy of the module. Nothing reaches the real module until omlMerge, which by default opens Service Studio's Compare-and-Merge window so you can review the change (a Service Studio setting can make it merge with no dialog). Separate tools refresh references and run 1-Click Publish.

The GitHub repository holds no server code. What you get there is an agent skill (SKILL.md plus reference files), AGENTS.md, and MCP client configs for Claude Code, Copilot CLI and VS Code, Cursor, Kiro, Antigravity and Codex CLI. Its tool reference lists 57 tools, far more than the README names, and says an older searchModel tool was removed and the old oml_-prefixed names are gone (servicestudio-mcp-oml/reference/verb-reference.md). If port 41820 is busy, the server moves to the next port, trying up to 20 times (MCP-DESIGN-CHOICES.md), so check the URL the dialog shows.

What it needs

Runs onmacOS, Windows, Linux
OutSystems 11Service Studio 11.55.91 or later with an O11 module open
Also
  • Service Studio running with its MCP server started from Edit > MCP Server
  • An MCP client that speaks streamable HTTP

Install or update Service Studio to 11.55.91 or later and open the module to work on. Start the server each session from Edit > MCP Server: confirm the port (41820 by default), click Start MCP Server, and copy the URL the dialog shows. Register that URL in your client. The first call from each agent connection shows an approval prompt in Service Studio. The bundled skill installer scripts need git and bash or PowerShell, and install for Claude Code only.

Limits

  • Early release Writes (applyModelApiCode, omlMerge, omlReset, omlRefreshReferences, omlPublish) are Beta and may change or be withdrawn between Service Studio releases
  • Not covered Works only on modules open in Service Studio. OutSystems 11 only, not ODC apps
  • Limit Does not start on its own. Clients get ConnectionRefused until it is started from Edit > MCP Server
  • Limit Port 41820 by default. If busy it moves up, trying up to 20 times, so the URL can differ
  • Limit Writes time out after 300 s and reads after 120 s
  • Limit Edits made in the IDE during an unmerged chain are not seen by the agent
  • Limit Starting Service Studio wipes %TEMP%\ServiceStudio.MCPServer, where staged module files live
  • Limit omlPublish returns blocked until the user allows automatic merge and publish in the MCP Server dialog
  • Not covered The Reactive and Mobile UI reads return nothing on Traditional Web modules, which have their own Traditional tools

Writes (applyModelApiCode, omlMerge, omlReset, omlRefreshReferences, omlPublish) are Beta and may change or be withdrawn between Service Studio releases under the OutSystems Beta Features Agreement. It works only on the module open in Service Studio; it does not start automatically, and clients get ConnectionRefused until it is started. Edits made in the IDE during an unmerged chain are invisible to the agent. Writes time out after 300 s and reads after 120 s. Starting Service Studio wipes %TEMP%\ServiceStudio.MCPServer, where staged module files live. omlPublish returns blocked until the user grants publish permission in the MCP dialog. It covers OutSystems 11 only, not ODC.

Who it suits

It suits OutSystems 11 teams who want a coding agent to explain, document or audit existing modules, and, accepting Beta status, to draft entities, screens and actions that they then review in Compare-and-Merge. Because it runs inside Service Studio on the developer's machine, it fits on-premises and air-gapped estates. It is no use without a Service Studio licence and an O11 module, cannot run headless or in CI, and does not reach OutSystems Developer Cloud (ODC) apps.

Tools 57

52 only read, 5 change things. A ? marks an optional parameter.

applyModelApiCode changes
Compiles and runs a C# Model API lambda against a copy of the open module to change it (Beta)eSpaceName: stringcode: stringimports: array
createSessionToken
Requests the session token that later calls carry and shows the approval promptclientName?: string
listApps
Lists the open module and its loaded references with their module type
omlMerge changes
Merges a changed module file into the live module in Service Studio (Beta)eSpaceName: stringmutatedOmlPath: string
omlReset changes
Discards a module's unmerged chain of staged edits; the staged file stays on disk (Beta)eSpaceName: string
omlRefreshReferences changes
Refreshes every reference of the live module to its latest version (Beta)eSpaceName: string
omlPublish changes
Runs 1-Click Publish on the live module and waits for the result (Beta)eSpaceName: string
getDataModel
Returns entities, attributes and foreign keys as Model API codeeSpaceName: stringincludeJson: enum
getStructures
Returns all structures and their attributeseSpaceName: stringincludeJson: enum
getActionNames
Lists server, client or service action nameseSpaceName: stringobjectType: enum
getServerAction
Returns one server action with its floweSpaceName: stringobjectName: stringincludeJson: enum
getClientAction
Returns one client action by nameeSpaceName: stringobjectName: stringincludeJson: enum
getServiceAction
Returns one service action by nameeSpaceName: stringobjectName: stringincludeJson: enum
getEvents
Returns the module's global eventseSpaceName: stringincludeJson: enum
getEventHandlers
Returns the module's global event handlerseSpaceName: stringincludeJson: enum
getTimers
Returns the module's timerseSpaceName: stringincludeJson: enum
getIntegrations
Returns exposed and consumed REST, SOAP and SAP integrations as codeeSpaceName: stringincludeJson: enum
getScreenNames
Lists Reactive or Mobile screen nameseSpaceName: string
getScreen
Returns one screen's layout, widgets and actionseSpaceName: stringobjectName: stringincludeJson: enum
getWebBlockNames
Lists web block nameseSpaceName: string
getWebBlock
Returns one web block by nameeSpaceName: stringobjectName: stringincludeJson: enum
getThemeNames
Lists theme nameseSpaceName: string
getTheme
Returns one theme by nameeSpaceName: stringobjectName: stringincludeJson: enum
getEmailTemplateNames
Lists email template nameseSpaceName: string
getEmailTemplate
Returns one email template by nameeSpaceName: stringobjectName: stringincludeJson: enum
getExternalSiteNames
Lists external site nameseSpaceName: string
getExternalSite
Returns one external site by nameeSpaceName: stringobjectName: stringincludeJson: enum
getScreenNamesTraditional
Lists screen names in a Traditional Web moduleeSpaceName: string
getScreenTraditional
Returns one Traditional Web screen as codeeSpaceName: stringobjectName: stringincludeJson: enum
getWebBlockNamesTraditional
Lists web block names in a Traditional Web moduleeSpaceName: string
getWebBlockTraditional
Returns one Traditional Web block as codeeSpaceName: stringobjectName: stringincludeJson: enum
getThemeNamesTraditional
Lists theme names in a Traditional Web moduleeSpaceName: string
getThemeTraditional
Returns one Traditional Web theme as codeeSpaceName: stringobjectName: stringincludeJson: enum
getEmailTemplateNamesTraditional
Lists email template names in a Traditional Web moduleeSpaceName: string
getEmailTemplateTraditional
Returns one Traditional Web email template as codeeSpaceName: stringobjectName: stringincludeJson: enum
getExternalSiteNamesTraditional
Lists external site names in a Traditional Web moduleeSpaceName: string
getExternalSiteTraditional
Returns one Traditional Web external site as codeeSpaceName: stringobjectName: stringincludeJson: enum
getSettings
Returns the module's site properties and settingseSpaceName: stringincludeJson: enum
getRoleNames
Lists role nameseSpaceName: string
getRole
Returns one role by nameeSpaceName: stringobjectName: stringincludeJson: enum
getRoleExceptions
Returns the module's role exceptionseSpaceName: stringincludeJson: enum
getUserExceptions
Returns the module's user exceptionseSpaceName: stringincludeJson: enum
getException
Returns one exception by nameeSpaceName: stringobjectName: stringincludeJson: enum
getResourceNames
Lists resource nameseSpaceName: string
getResource
Returns one resource by nameeSpaceName: stringobjectName: stringincludeJson: enum
getImageNames
Lists image nameseSpaceName: string
getImage
Returns one image by nameeSpaceName: stringobjectName: stringincludeJson: enum
getScriptNames
Lists script nameseSpaceName: string
getScript
Returns one script by nameeSpaceName: stringobjectName: stringincludeJson: enum
getLocales
Returns the module's localeseSpaceName: stringincludeJson: enum
getClientVariables
Returns the module's client variableseSpaceName: stringincludeJson: enum
getSessionVariables
Returns the module's session variableseSpaceName: stringincludeJson: enum
runQuery
Runs a ModelQL query against the module for anything the other reads misseSpaceName: stringquery: stringexecutionOptions?: object
getValidationMessages
Returns TrueChange validation messages, optionally filtered by leveleSpaceName: stringfilter?: array
getSerializedObject
Returns the raw JSON serialization of the current objecteSpaceName: string
getSerializedObjectByKey
Returns the raw JSON of an object found by its keyeSpaceName: stringobjectKey: string
getSerializedObjectByNameAndType
Returns the raw JSON of an object found by name and typeeSpaceName: stringobjectName: stringobjectType: string

Similar servers