Docs/Gage the AI Harness/Atlas MCP Server
AtlasHow-to

Atlas MCP Server

How an outside AI tool connects to Atlas over MCP: read tools with a component token, the write and compile tools when an administrator signs in, and how an Atlas agent calls other MCP servers.

Updated 29 Oct 2026Timebase Docs

Overview#

Atlas can connect to outside AI tools in two directions, and this article covers both.

Inbound. Atlas publishes a Model Context Protocol (MCP) server. MCP is an open standard that lets an AI assistant call tools in another product. When you point an MCP-capable tool such as an AI coding assistant at Atlas, that tool can read your ontology, list your instance maps, inspect your libraries, and run Cypher queries against a compiled domain, all from its own chat window. When an administrator signs in through that tool, it can also build the model: create domains and libraries, define entity types, properties and relationships, edit instance maps, and compile.

Outbound. An Atlas agent can also act as an MCP client and call tools published by another product, such as the Timebase Historian. You would do this when you want an Atlas agent to reach data that does not live in Atlas. That direction is covered in Let an Atlas agent call another MCP server near the end of this article.

Two facts decide what inbound MCP gives you, so read them before you start:

  • You must send a token. The /mcp endpoint requires a Pulse-issued bearer token on a default installation. A plain URL with no credentials is rejected.
  • What you can do depends on whose token it is. A component token, the kind a service obtains with a client id and secret, gets the 37 read tools. A person who signs in through the AI tool with a Pulse account that holds the Administrator role gets 92 tools: the same reads plus every write, lifecycle and compile tool. The write tools are not hidden behind a setting; they appear or disappear per caller. See Sign in as a user for the write tools below.

The MCP endpoint#

Atlas publishes MCP on the same listener as the rest of Atlas. There is no extra service, no extra container, and no extra port.

Protocol Address
HTTP http://<your-atlas-server>:4551/mcp
HTTPS https://<your-atlas-server>:4552/mcp

Prefer the HTTPS address. Once you are sending a bearer token you should not send it over an unencrypted connection, and Atlas redirects plain HTTP traffic on 4551 to 4552 anyway. Note that the platform Compose file publishes only 4551, so if you are running the shipped compose file unchanged you need to publish 4552 yourself or terminate TLS in front of Atlas.

Transports#

Atlas uses the Streamable HTTP transport, which is what current MCP clients speak. Choose that option in your client and give it the /mcp address above.

For older clients that only speak the earlier HTTP-with-SSE transport, the MCP library Atlas uses also publishes two legacy paths automatically:

Path Purpose
/mcp Streamable HTTP. Use this unless your client cannot.
/mcp/sse Legacy server-sent-events channel, for older clients only.
/mcp/message The matching legacy message-posting path.

Do not point a Streamable HTTP client at /mcp/sse. It will fail to negotiate.

Note

these paths come from the MCP library Atlas is built on (ModelContextProtocol.AspNetCore version 0.4.0-preview.3), which maps the legacy sse and message endpoints underneath whatever path you give it.

Before you begin: choose a credential#

Atlas ships with authentication switched on (Pulse:Auth:Enabled is true in settings.config). The /mcp endpoint is protected by the same rule as the rest of the Atlas API, so an anonymous connection is refused with 401 Unauthorized before your client can list a single tool. There are two ways to satisfy it.

Credential How your AI tool gets it What Atlas publishes to it
A component token Your tool, or you, call Pulse's /auth/token with a client id and secret (client_credentials) and paste the result into the tool as a static Authorization header The 37 read tools
Your own sign-in Your tool runs an OAuth sign-in in the browser against a client you registered in Pulse. Pulse issues a token in your name and the tool refreshes it silently 92 tools when your Pulse account holds the Administrator role; the 37 read tools when it does not

Whichever you choose, two things must be true:

  1. The token's audience must include Atlas. The audience (the aud value inside the token) says which product the token may be used against. It must contain the value of Atlas's Pulse:Auth:ClientId, which is Atlas by default. Pulse builds the audience from the client registration, so Atlas has to be in that client's audience list. A missing audience is the most common cause of a 401 from a token that looks valid.
  2. The token travels over HTTPS as Authorization: Bearer <token>.
Important

setting Pulse:Auth:Enabled to false does not just relax the API. It maps /mcp completely open, and because the write gate is only attached when authentication is on, every caller then gets all 92 tools: anyone who can reach the port can read, rewrite, compile or delete your entire model. There is no separate setting that turns the MCP server off or leaves it on while the rest of Atlas is open. Only ever disable authentication on a development machine that nothing else can reach.

Connect with a component token (read tools)#

The steps are the same for every MCP client. Only the wording of the settings screen changes.

  1. Obtain a Pulse bearer token with Atlas in its audience. Registering Timebase apps as OAuth clients in Pulse shows how to register a client and request a token.
  2. Open your AI tool's MCP server settings.
  3. Add a new server.
  4. Set the transport to Streamable HTTP (some clients call this "HTTP" or "remote server").
  5. Set the URL to https://<your-atlas-server>:4552/mcp.
  6. Add a request header named Authorization with the value Bearer <YourPulseTokenHere>.
  7. Save and reconnect. Your client should now list 37 Atlas tools.

Many clients store this as a small configuration file. The shape below is the common convention:

{
  "mcpServers": {
    "atlas": {
      "type": "http",
      "url": "https://<your-atlas-server>:4552/mcp",
      "headers": {
        "Authorization": "Bearer <YourPulseTokenHere>"
      }
    }
  }
}

A component token expires after an hour by default and the header does not renew itself, so this path suits scripts and short sessions. For day-to-day work, and for any write access, sign in instead.

Sign in as a user for the write tools#

Every write, lifecycle and compile tool on /mcp is gated by a policy that requires a token carrying the pulse:administrator role. Pulse puts that role on a token only when a person who holds it signs in; it never puts a role on a component token, however the client is configured. The gate is evaluated per request, so a caller without the role does not see the write tools in the tool list at all, and a call by name is refused.

To get the role to Atlas, your AI tool has to run the OAuth sign-in itself. Pulse does not support dynamic client registration, so the tool must let you supply a client id and secret you registered in advance, and it must use a fixed local callback port. Claude Code does both and is used as the example below; the Pulse side is the same for any client.

1. Register a client in Pulse#

In the Pulse web interface open Clients and create one client per person, for example claude-code-<name>, so a secret can be revoked without affecting anyone else. Fill in the Grant configuration section as follows.

Field Value Why
Grant Types authorization_code, refresh_token The browser sign-in, plus silent renewal. Leave client_credentials off: it would let the secret alone obtain a token
Scopes openid, profile, offline_access Pulse issues a refresh token only when the client has offline_access. Without it the session ends after one hour
Redirect URIs http://localhost:8765/callback Pulse matches this string exactly. Use localhost, not 127.0.0.1, and the same port you give the AI tool. Pick a port nothing else on your machine listens on
Audiences Atlas Pulse builds the token audience from the client, and Atlas rejects a token without its own id. Add Historian or Pulse as well if you want the same sign-in to reach their MCP servers
Token Expiry, Refresh Token Expiry leave the defaults One hour, renewed silently for seven days of use

Save, and copy the generated secret. Pulse shows it once; if you lose it, rotate it.

Nothing changes on your user account. The Administrator role you already hold is what the token carries.

2. Configure the AI tool#

With Claude Code, add the server from a terminal. The --client-secret flag takes no value; it reads the MCP_CLIENT_SECRET environment variable or prompts for the secret, and stores it in the tool's credential store rather than in a config file.

MCP_CLIENT_SECRET="<secret from Pulse>" claude mcp add -s user --transport http \
  --client-id "<client id>" --client-secret --callback-port 8765 \
  atlas https://<your-atlas-server>:4552/mcp

The -s user option is Claude Code's configuration scope, not an OAuth scope. The OAuth scopes go in the configuration file, ~/.claude.json, where the finished entry looks like this:

"atlas": {
  "type": "http",
  "url": "https://<your-atlas-server>:4552/mcp",
  "oauth": {
    "clientId": "<client id>",
    "callbackPort": 8765,
    "scopes": "openid profile offline_access"
  }
}

Do not also set an Authorization header on this entry. A static header switches the OAuth flow off.

For another MCP client, supply the same four values wherever its settings put them: client id, client secret, callback port and scopes. The client discovers Pulse on its own: an unauthenticated call to /mcp answers 401 with a WWW-Authenticate header that points at https://<your-atlas-server>:4552/.well-known/oauth-protected-resource, and that document names Pulse as the authorization server.

3. Sign in and check#

  1. Start a new session of the AI tool so it reads the changed configuration.
  2. Open its MCP server list, select the Atlas entry and choose Authenticate. A browser opens on the Pulse sign-in page.
  3. Sign in with your own Pulse account. Pulse sends the browser back to localhost:<port>/callback and the tool completes the exchange.
  4. Reconnect. The tool list should now hold 92 tools, including CreateDomain, DefineOntologyNodes, UpdateLibraryProperties, CompileDomain and DeleteDomain.

Everything the tool does from here is done in your name. Atlas resolves the signed-in principal on every call, so a change made this way is attributed to you in the domain's Git history exactly as if you had made it in the built-in assistant. The access token lasts one hour and renews silently from the refresh token while you keep using it. After seven days idle you sign in again.

What the tools can do#

Atlas publishes 37 tools to every authenticated caller and a further 55 to an administrator who signed in. The names still say "Nodes" where the Atlas API and web interface now say "entity types"; they mean the same thing.

Tools every caller gets#

Domains and queries

Tool What it does
ListDomains Lists every domain, whether it has an ontology, and its description
ExecuteCypherQuery Runs a Cypher query against a compiled domain and returns the results as a table. Accepts a domain name, the query text, and an optional set of named values to bind into the query

Ontology in a domain

Tool What it does
ListOntologyNodes Lists the node types in a domain, with label, parent type, and property count
GetOntologyNode Full detail for one node type, including all its properties. A property that is still open (a Defer property) shows how this type resolves it: (pins: Value=boolean, on Pump), (pins: Value=double, inherited from Equipment) or unresolved on this type (Value is one of double, string, boolean)
ListOntologyProperties Lists the properties defined in a domain
GetOntologyProperty Full detail for one property
ListOntologyRelationships Lists the relationships defined in a domain
GetOntologyRelationship Full detail for one relationship, including the pins it has on its edge properties
ListOntologyDataTypes Lists the data types (compound value shapes such as TVQ) in a domain, with their fields
GetOntologyDataType Full detail for one data type, including its ordered field list
ListOntologyEnumTypes Lists the enumeration types in a domain
GetOntologyEnumType Full detail for one enumeration type, including its members
ListOntologyFunctions Lists the calculation functions in a domain, with output type and parameter count
GetOntologyFunction Full detail for one function: every parameter, the output, and the implementation body

Instance maps

Tool What it does
ListInstanceMapFiles Lists the instance map files in a domain
ListInstanceMapDefinitions Lists the definitions inside one instance map file
GetInstanceMapDefinition Full detail for one definition, addressed by its definition ID: map entries, properties, bindings, and relationships

Libraries

Tool What it does
ListLibraries Lists every library with its description
ListLibraryNodes Lists the node types in a library
GetLibraryNode Full detail for one library node type
ListLibraryProperties Lists the properties in a library
GetLibraryProperty Full detail for one library property
ListLibraryRelationships Lists the relationships in a library
GetLibraryRelationship Full detail for one library relationship
ListLibraryDataTypes Lists the data types in a library, with their fields
GetLibraryDataType Full detail for one library data type
ListLibraryEnumTypes Lists the enumeration types in a library
GetLibraryEnumType Full detail for one library enumeration type
ListLibraryFunctions Lists the functions in a library
GetLibraryFunction Full detail for one library function
GetLibraryExportJson Exports a whole library as a single structured JSON document

Skills, agents and diagnostics

Tool What it does
ListSkills Lists the skills available on this Atlas installation, optionally filtered by keyword
GetSkill Returns the full written instructions for one named skill
ListAgents Lists the agent definitions on this Atlas installation
GetAgent Returns one agent definition
ListToolProviders Lists the tool providers the Atlas agent runtime has loaded
GetLogs Returns recent Atlas log lines for a time window. It is listed for every caller but answers only a caller with the Administrator role; anyone else gets Error: GetLogs requires the pulse:administrator role

An external tool can read every skill and agent definition on your Atlas host. It cannot run one: skills are instructions the AI tool follows with whatever tools it holds, so with a component token they are documentation, and with an administrator sign-in they can drive the write tools below.

Tools an administrator gets in addition#

These appear in the tool list only for a signed-in administrator. Each one takes the same arguments as the matching action in the Atlas web interface and returns a readable confirmation or a readable failure.

Domain lifecycle

Tool What it does
CreateDomain, UpdateDomain, DeleteDomain Create a domain, change its description or settings, delete it
CompileDomain Compile a domain so it can be queried and deployed
UnloadDomain Unload a compiled domain from memory
AddDomainImport, RemoveDomainImport, GetDomainImports Manage the libraries a domain imports, and list them
GetWorldStatus Reports which domains are compiled and loaded

Ontology in a domain

Tool What it does
DefineOntologyNodes, UpdateOntologyNodes, RemoveOntologyNodes Add, change or remove entity types
DefineOntologyProperties, UpdateOntologyProperties, RemoveOntologyProperties Add, change or remove properties
DefineOntologyRelationships, UpdateOntologyRelationships, RemoveOntologyRelationships Add, change or remove relationships
DefineOntologyDataTypes, UpdateOntologyDataTypes, RemoveOntologyDataTypes Add, change or remove compound data types
DefineOntologyEnumTypes, UpdateOntologyEnumTypes, RemoveOntologyEnumTypes Add, change or remove enumeration types
DefineOntologyFunctions, UpdateOntologyFunctions, RemoveOntologyFunctions Add, change or remove calculation functions

Each Define, Update and Remove tool takes a list, so one call can add several entity types at once.

Instance maps

Tool What it does
CreateInstanceMapFiles Create one or more instance map files in a domain
AddInstanceMapDefinitions, UpdateInstanceMapDefinitions, RemoveInstanceMapDefinitions Add, change or remove definitions inside a file

Libraries

Tool What it does
CreateLibrary, UpdateLibrary, DeleteLibrary Create a library, change its description, delete it. The seeded atlas-core library is system-owned and refuses changes
AddLibraryImport, RemoveLibraryImport, GetLibraryImports Manage the libraries a library imports, and list them
DefineLibraryNodes, UpdateLibraryNodes, RemoveLibraryNodes Add, change or remove entity types in a library
DefineLibraryProperties, UpdateLibraryProperties, RemoveLibraryProperties Add, change or remove library properties
DefineLibraryRelationships, UpdateLibraryRelationships, RemoveLibraryRelationships Add, change or remove library relationships
DefineLibraryDataTypes, UpdateLibraryDataTypes, RemoveLibraryDataTypes Add, change or remove library data types
DefineLibraryEnumTypes, UpdateLibraryEnumTypes, RemoveLibraryEnumTypes Add, change or remove library enumeration types
DefineLibraryFunctions, UpdateLibraryFunctions, RemoveLibraryFunctions Add, change or remove library functions

Things to ask for#

Once connected, ask in plain language. Your AI tool picks the tool for you.

"List all the domains in Atlas and tell me how many node types each one has."

"Run a Cypher query against the packaging-line domain to count all instances."

"List every node type in the cooling-system domain and show me which ones extend Equipment."

"Show me all the node types in the isa95-equipment library."

And, signed in as an administrator:

"Add a Compressor entity type to the utilities domain that extends Equipment, with a DischargePressure property of type TVQ, then compile the domain."

"Create a library called site-standards that imports isa95-equipment."

Which branch a call acts on#

Every tool, read or write, accepts an optional branch argument. Leave it out and the call acts on the branch the Atlas repository currently has checked out, which is what the web interface shows. Supply an existing branch name to target another branch; an unknown name is refused rather than defaulted. Atlas logs the resolved branch and where it came from on every call, so a change can always be traced to a branch.

Writes land on that branch as ordinary Atlas commits, attributed to the signed-in person. Use the web interface or the Atlas API to merge.

What MCP does not do#

It reaches no files and runs no commands. The built-in Atlas assistant has Bash, FileSystem and Script tools. None of them is exposed over MCP, by construction: /mcp serves a client with no session, so the per-session workspace confinement those tools rely on cannot apply.

It cannot give a component write access. There is no client setting, scope or audience that puts the Administrator role on a client_credentials token. If an automated process needs to change a model, it has to do so through the Atlas API with its own controls, or a person signs in.

A non-administrator sign-in gets the read tools only. The role comes from the user who signed in, not from the client registration. Granting someone the write tools means making them a Pulse administrator, which also grants the rest of what that role carries.

Important

every caller with a valid Atlas-audience token can read the whole model. Treat "can reach /mcp with a valid token" as "can read everything", and control it through which Pulse clients carry the Atlas audience, authentication staying on, and network access: firewall rules, a VPN, or Docker network isolation.

Let an Atlas agent call another MCP server#

The outbound direction works the other way round: an Atlas agent connects to somebody else's MCP server as a client and gains that server's tools. This is how you give an Atlas agent access to, for example, Timebase Historian data.

You configure it in the agent definition file. Agent definitions are .md files with a settings block at the top. Atlas ships some, and you can add your own to the Agent/agents/ folder inside the Atlas data directory. New files are picked up the next time Atlas restarts.

Note

agents live in {Config}/agents and skills in {Config}/skills, where Config is the Atlas store path. In Docker the platform Compose file sets Config=/atlas/config. A relative Config value is anchored to the install directory rather than the working directory.

Declare a server#

Add an mcpServers list to the settings block, then reference it in the agent's tools list:

mcpServers:
  - name: timebase-historian
    transport: http
    endpoint: http://historian:4511/mcp
tools:
  - mcp:timebase-historian
  - LibraryToolProvider
  • mcp:timebase-historian gives the agent every tool that server publishes.
  • mcp:timebase-historian:SomeToolName gives it just one named tool.

Settings you can use#

Setting What it does
name The label you use in the tools list
transport http for a server reachable over the network, or stdio for one Atlas launches as a local program
endpoint The server's MCP address. Required when transport is http
command, args, env The program to launch, its arguments, and its environment values. Used instead of endpoint when transport is stdio
toolTimeoutSeconds How long one tool call may run before Atlas cancels it. Overrides the global default of 60 seconds. Set it to 0 to remove the limit for that server

A stdio server looks like this:

mcpServers:
  - name: everything
    transport: stdio
    command: npx
    args:
      - "-y"
      - "@modelcontextprotocol/server-everything"
    env:
      DEBUG: "1"

The global timeout default lives in the Pulse:Gage:Resilience:ToolCallTimeoutSeconds setting. A call that times out or fails never crashes the agent run: it comes back to the agent as readable text so the agent can try something else.

Use the Docker service name, never an IP address#

When the target MCP server runs in another container on the same Docker network, endpoint must use that container's Docker service name, for example http://historian:4511/mcp. Do not use a bridge IP address such as http://172.22.0.2:4511/mcp. Docker hands out those addresses dynamically, so they differ on every machine and change every time the network is recreated. A manifest with a hardcoded IP works once and then breaks silently.

Use localhost only when an agent is connecting back to Atlas's own /mcp endpoint on its own container's real port.

In the platform Compose file the Historian, Atlas, Connect and Bridge share one project and one network, so containers on it find each other by service name.

Troubleshooting#

Symptom Cause What to do
Your AI tool connects but lists no tools, or reports 401 The request carried no bearer token, or the token was rejected Check that your client sends Authorization: Bearer <YourPulseTokenHere>, or that it has completed the sign-in. Then check that the token has not expired and that its audience includes Atlas. A missing audience is the most common cause, and it applies to a signed-in user's token too: the Atlas audience has to be on the client you registered for the AI tool
The sign-in fails before a browser opens, with a JSON parsing error mentioning an unexpected < The AI tool asked Pulse for its OAuth discovery document at a standard /.well-known address and received Pulse's web page instead. Pulse builds up to 2.0 answer unknown paths under the root with the interface page rather than a 404 Point the tool straight at Pulse's discovery document, which is at https://<your-pulse-server>:4542/auth/.well-known/openid-configuration. In Claude Code add "authServerMetadataUrl": "<that address>" inside the entry's oauth object. If the error persists after the edit, the tool is still running with the old configuration: start a new session
The sign-in fails with a message that the callback port is already in use Another program on your machine listens on the port you chose Find it with netstat -ano on Windows or lsof -i :<port> elsewhere, looking for the port. Either stop it or choose another port, in the Pulse client's Redirect URI and the AI tool's configuration both
Pulse shows an invalid redirect URI error in the browser The registered Redirect URI differs from what the AI tool sent Pulse compares the whole string. Register http://localhost:<port>/callback exactly: localhost not 127.0.0.1, the same port, no trailing slash
You signed in, but the tool list still holds 37 tools and no write tools The account you signed in with does not hold the Administrator role in Pulse The role comes from the user, not the client. Sign in with an administrator account, or ask your Pulse administrator for the role
The connection works for about an hour, then every call fails until you sign in again The Pulse client lacks the offline_access scope, so Pulse issued no refresh token Add offline_access to the client's Scopes in Pulse and sign in again
Your AI tool reports a parsing failure, or complains that the response was not valid MCP The URL is slightly wrong. Atlas answers any unrecognised address with its web page as 200 text/html rather than a 404, so your client receives a web page where it expected a protocol response Check the address character by character. It must end in /mcp, with no trailing slash and no extra path
Your AI tool cannot negotiate a connection at all The client is using the older SSE transport against the Streamable HTTP path, or the reverse Set the transport to Streamable HTTP and use /mcp. Only if your client cannot do that, point it at /mcp/sse instead
Your AI tool says there is no tool for the job when you ask it to create, edit, or compile something The tool is connected with a component token, or with a sign-in that does not carry the Administrator role, so the write tools are not in its list Sign in as an administrator as described in Sign in as a user for the write tools. A component token cannot be given the role
The data you get back is out of date, or a type you just added is missing The call ran against the repository's checked-out branch, and your change is on another branch Pass the branch argument naming the branch you are working on, or check that branch out in Atlas. See Which branch a call acts on
A tool returns a message beginning [tool '...' failed] The tool ran but the underlying request failed, for example a domain name that does not exist or a domain that has never been compiled. Atlas returns failures as readable text so your AI tool can correct itself, rather than as a hard error Read the rest of the message. Check the domain or library name with ListDomains or ListLibraries. If it mentions the domain is not compiled, compile it first, then retry the query
ExecuteCypherQuery reports that the domain is not compiled Queries only run against a compiled domain Compile it: a signed-in administrator session can run CompileDomain, or compile in the Atlas web interface, then ask again
Nothing can reach the endpoint at all Port 4551 or 4552 is blocked, or not published from the container Confirm the port is reachable from the machine running your AI tool. If Atlas runs in Docker, check the port is mapped in docker-compose.yml. The shipped file publishes 4551 only, so publish 4552 as well if you are using HTTPS
An Atlas agent cannot reach an MCP server in another container The endpoint uses a Docker bridge IP address, which changes whenever the network is recreated Change endpoint to use the container's Docker service name, for example http://historian:4511/mcp, and confirm both containers are on the same Docker network
An Atlas agent hangs or gives up on an outbound tool call The remote MCP server is slow or unresponsive, and the call hit the 60-second default timeout Confirm the remote server is running. If the work legitimately takes longer, raise toolTimeoutSeconds on that server entry in the agent definition

Atlas writes a startup line reading MCP endpoint mapped at /mcp. If that line is missing from the Atlas logs, Atlas did not finish starting, and the problem is not MCP.

esc
↑↓ navigate · ↵ open · ⌘K anywhere