Skills
Cameo Connector Config
Skill
cameo-connector-config. Configure and switch the HCL Cameo Connector for Teamcenter between environments and releases. Covers the fact that an "environment" is 14 (file, key) writes over 11 key names across TWO files that nothing keeps in step (a half-switch logs in fine and sends files to the wrong tier), the Java .properties escaping bug that presents as a missing folder, replace-never-overlay when swapping connector releases, the Cameo profile that must move with it, and the catalogue of errors on this stack that name the wrong cause. Use for any Cameo/Teamcenter connector setup, environment switch, release upgrade, or "it logged in but something is wrong" investigation.
Verified live on Cameo 2024x Refresh3 with connector releases 2506 and 2606,
against Teamcenter 2506 (cloud, 25060.0004.0000.2025100200) and Teamcenter
2606 (local VM, 26060.0000.0000.2026052800). Vendor source: the HCLTech
Cameo Connector for Teamcenter Installation Guide shipped inside each kit.
The tooling built from this knowledge is CameoTcConfig; its BUILDING.md
covers how to rebuild that. This skill is the domain knowledge underneath.
The one thing to know
An environment is not a setting. It is 14 (file, key) writes over 11 key
names spread over two files that no installer keeps in step: the authority
is Environment.plan() in CameoTcConfig/cameocfg/model.py, which enumerates
every write explicitly rather than leaving them implicit.
<cameo>\plugins\CameoTCIntPlugin\conf\cameotcIntegration.properties
%ProgramData%\Siemens\MBSE\bhm\CommonClient.properties
| Key | File | What it decides |
|---|---|---|
TC_SERVER_URL |
connector | where Cameo signs in |
AWC_WEBLOGIC_HOST_URL |
connector | the embedded Active Workspace panel |
URL |
client | the client library's own copy of the sign-in address |
AWC_WEBLOGIC_HOST_**URI** |
client | URI, not URL. Easy to get wrong |
BOOTSTRAP_URLS |
client | where model FILES actually go |
Transport / TRANSPORT / IS_TCCS |
both | must agree across the two |
★★★ The failure this causes does not announce itself. With TC_SERVER_URL
pointed at one tier and BOOTSTRAP_URLS at another, login succeeds and file
transfer goes somewhere else. Observed live: TC_SERVER_URL on a demo VM while
BOOTSTRAP_URLS still read http://saber2:4544, and saber2 was a hosts-file
alias for the cloud tier.
CommonClient.properties is the file nobody edits: it is rewritten by the
connector at launch, lives outside the Cameo installation, and holds the one
setting that decides where files land. Always resolve BOOTSTRAP_URLS to an
address and compare it against the sign-in host. An alias reads like a name, and
names look interchangeable.
The /tc rule, proven not assumed
TC_SERVER_URL must be the web-tier context root ending at /tc, nothing
further. Captured by pointing it at a local listener: the connector sends
exactly one request, no prior handshake.
POST /tc/RestServices/Core-2008-06-Session/login Content-Type: application/xml
<LoginInput group="" locale="en" password="..." role=""
sessionDiscriminator="TCMEClient" username="..."
xmlns="http://teamcenter.com/Schemas/Core/2008-06/Session"/>
It appends RestServices/<Service>/<operation> itself, and uses RestServices
(XML), not JsonRestServices. A path-less URL makes
com.teamcenter.soa.client.Connection return null on every operation. A doubled
/tc/tc fails with a message about the server.
★ The guide's examples use port 7001. That is HCL's own example, not a default. Get the port from the tier you are actually pointed at.
Java .properties traps
The connector file is a Java properties file. Three things follow, all seen live.
★★ Directory values MUST be double-backslashed. D:\CameoStagingTemp is
read as D:CameoStagingTemp, a drive-relative path that resolves under Cameo's
own folder, and export then fails with "system cannot find the path" naming a
folder nobody configured.
Detect it by encode(decode(raw)) != raw. Do not look for a backslash in the
decoded value: in the broken case the backslash is exactly what went missing,
so that check passes on the file it exists to reject.
★ logger.properties is the exception and uses forward slashes.
★ Neither file has a BOM. Writing one makes the first key unreadable, and
the connector reports that as a missing setting rather than a broken file. Use
[IO.File]::WriteAllText($p,$t,(New-Object System.Text.UTF8Encoding($false))).
★ CREATE_VALUE_PROPERTY_CONFIG is one value spanning ~54 physical lines joined
by trailing backslashes. A line-at-a-time editor corrupts it.
★ The shipped key SteretypeNameTrucationLimit is misspelled twice. Correct the
spelling and the connector stops reading it.
Swapping a connector release
There is no installer. Per Installation Guide 4.2, installing is a folder copy:
drop CameoTCIntPlugin into <cameo>\plugins, then copy
lib\Teamcenter_Profile.mdzip to <cameo>\profiles and C:\Users\Public
(that path, not Public\Documents).
★★ Replace, never overlay. plugin.xml declares ownClassloader="true" with
class-lookup="LocalFirst", so the plugin's own jars win over Cameo's. A jar
left behind by an overlay copy is preferred, giving a mixed build that reports
the new version number.
★★★ A kit's conf is HCL's own working file, not neutral defaults. The 2606
kit arrived with:
TC_SERVER_URL https://10.118.58.91:7001/tc (an HCL address)
LicenseDir 27057@10.118.58.116 (an HCL server)
STAGING_DIR C:\apps\bhm\staging (does not exist)
CameoTCIntImportWorkingDir (blank)
USE_JCEF_BROWSER true
Launching Cameo on that gives an unreachable licence server, no working
directory, and a blank Active Workspace panel. And the licence symptom sends
people to the WinNAT fix, which would be the wrong one. Carry every key present
in both the old and new conf across; keys only in the new one keep the kit
default, which is how a release's genuinely new settings arrive.
★ The Cameo profile must move too, and the releases ship different ones
(168,719 bytes for 2506 against 160,328 for 2606). A stale profile shows up as
red borders around synced elements, which reads as a problem with the model.
Watch for extra copies: one machine had a third, loose in <cameo>\plugins,
stale by a whole release.
★ Cameo must be closed. The plugin jars are locked by the running JVM
(verified by handle probe). conf\*.properties is NOT locked, which is why an
environment switch works with Cameo open and still needs a restart to take
effect.
★ Cameo's window belongs to <cameo>\jre\bin\javaw.exe, not cameoea.exe.
Detect it by install directory, not process name.
Version compatibility
Two axes, both must hold:
Cameo release x connector release -> A / P / X from the matrix
connector release x Teamcenter release -> the connector's certified range
★★ A Cameo family's base row and refresh row carry DIFFERENT support. Cameo
2024x base is certified against connector 2406; the 2024x refreshes are not.
Matching on the family alone flips the answer.
★★ The compatibility matrix is the authority; a kit's Installation Guide is not. The 2606 kit's guide claims Teamcenter 2606 / 2512.2604 / 2506.004 / 2412 and Cameo 2024x Golden through Refresh3, all wider than the matrix. Connector 2606 did log in cleanly against Teamcenter 2506 and read that site's customized mapping without complaint, and a full check-out/check-in on Teamcenter 2606 succeeded. None of that makes any of it certified. Record a kit's claim, display it, never let it upgrade a verdict: "certified" is what buys Siemens support when something stops working.
★ Teamcenter's release cannot be read without authenticating. /,
/version.json, /tc/version, /manifest.json and the Active Workspace paths
all return 404, 403, or a page with no version in it. With a sign-in, the version
is in the login response at serverInfo.Version / DisplayVersion; no second
call is needed.
★ A version mismatch does not announce itself as a version error. Connector
2506 against a 2606 tier failed with HTTP 405 and a marshalling error, which
reads as a wrong address.
The mapping file: not the client's business
A kit ships MAGICDRAW_BHMIntegrationDefinition.xml and the guide (section 7)
describes importing it server-side. Do not reason about it from a client, and
do not run that import blind.
Measured on one machine: the cloud tier's mapping was site-customized, 1,475,150
bytes with 1,157 references to custom XVE5* types across 57 element mappings
and 28 object mappings (a whole L0/L1/L2/L3 Requirement + Paragraph + ReqSpec
hierarchy). The kit's file maps those same names to the stock Requirement type.
import_file replaces the dataset wholesale, so the documented import would have
destroyed the customization and broken requirements integration for everyone on
that tier.
Meanwhile the demo VM ran the stock mapping, and Teamcenter 2606 ships its own
copy at tc_root\install\mdw0magicdraw\ that is structurally identical to the
kit's. Both machines were correct for their site. Whether a given mapping is
right cannot be predicted from a client, so a client-side tool should say
nothing about it.
Errors that name the wrong cause
On this stack, an error that names its own cause is a hypothesis, not a finding.
| Message | Actually |
|---|---|
HTTP 405, Content is not allowed in prolog |
connector/Teamcenter release mismatch, or a page where data was expected |
| "licence problem" at login | WinNAT reserving the licence port. net stop winnat && net start winnat as admin. Check netsh int ipv4 show excludedportrange protocol=tcp |
| "system cannot find the path" at export | a single backslash in the properties file |
| red borders around synced elements | a stale Teamcenter_Profile.mdzip |
| blank Active Workspace panel | USE_JCEF_BROWSER=true where the bundled Chromium cannot load (UnsatisfiedLinkError: no chrome_elf). Set it false for WebView2 |
| "Cameo will not license on relaunch" | the three ordinary startup modals (License Server localhost:1101, Select Edition, Merge Plugin missing). Not a licence fault |
| "Communication with Teamcenter server was lost while an operation was in progress. The server has probably terminated abnormally." | Teamcenter's OWN fault body, not a broken socket. See below |
★★★ That last one is the sharpest example on this stack, and it was settled by capture rather than by reasoning. EXERCISED 2026-08-11, connector 2606 against Teamcenter 2606, every byte relayed and recorded:
POST /tc/RestServices/Core-2008-06-Session/login -> 200, 1474 ms
<ns1:LoginResponse> real user, real GroupMember, real UserSession
POST /tc/RestServices/Core-2011-06-Session/getTypeDescriptions -> 500, 347 ms
<InternalServerException> code 1003
"Communication with Teamcenter server was lost while an operation was
in progress. The server has probably terminated abnormally."
The sign-in SUCCEEDED. The dialog comes from the call after it, and the text
is Teamcenter's own message, serialized as well-formed XML and delivered over a
perfectly healthy HTTP conversation in 347 ms. Both exchanges recorded
complete: nothing reset, nothing truncated, nothing timed out between Cameo and
the web tier. The "communication" that was lost is the web tier's connection to
its backend tcserver, which is not the connection the client owns.
⇒ Read it as a server-side fault relayed verbatim, and go to the tier's own logs. Do NOT go looking at the network, the address, the transport or the connector configuration, all of which this message invites. The root cause on the run above was a null pointer in an attribute setting deployed by a custom BMIDE template. Nothing client-side could have found that, and every client-side hypothesis it suggested was wrong.
★★ Note the shape, because it generalises: an HTTP 500 carrying a fault body is
a successful conversation. A client that renders the fault's message as its
own error tells you what the server said, never where it happened.
Capturing the conversation
When the connector's story and the tier's story disagree, stop reasoning and put
something on the wire. CameoTcConfig ships this: cameocfg/sniffer.py is a
byte-faithful recording relay, driven by five MCP tools (cameo_record_start,
cameo_record_status, cameo_record_stop, cameo_captures,
cameo_capture_read) or by sniff.py from a terminal.
cameo_record_start "Demo VM" derives + saves a "(recording)" profile, starts relays
cameo_switch to that profile <- both files, all fourteen keys
start Cameo, reproduce the failure <- settings are read at STARTUP only
cameo_record_stop then switch back
★ Why not the connector's own payload dump. CT_REQ_RESP_JSON_DIR and
isPayloadRequired record what the connector believed it exchanged, after its
own parsing. They cannot separate "the request never left" from "the server
reset" from "the server answered HTML", and all three produce the same dialog.
★★ Both addresses must move. A recording profile that relays sign-in while file transfer still goes straight to the tier is the half-switch in another costume, and it also makes the capture silently partial.
★★ An empty capture is not evidence of anything. It means Cameo was not
switched, or was not restarted. broken: 0 is equally true of a clean session and
of a session that never happened, so read exchanges alongside it.
★ Filter the noise by User-Agent. The Switcher's own health checks poll the
same addresses (Python-urllib/…, Core-2011-06-Session/login in JSON). The
connector is Apache-HttpClient/4.5.13 (Java/17.x) calling
Core-2008-06-Session/login in XML. In one 77-exchange capture, exactly two
exchanges were Cameo. Close the Switcher during a capture.
★ Responses are gzipped. Decompress before reading a body, or the XML looks like binary and the first character reads as a decode error.
★ The capture folder holds the sign-in password in clear, because replay needs the exact bytes. It is a credential. Redaction applies to every display path, but never to what is on disk.
★★ Is user logged in: true appears after FAILED and cancelled logins. Never
read it as a health signal. The real markers are Login Successfull (sic, two
Ls) with a clean loginToTeamcenter(): Finished, versus Login Unsuccessfull.
★★ In C:\Temp\CameoTCIntLogs.log the useful message is on the line AFTER the
one tagged ERROR. Content is not allowed in prolog carries no ERROR tag, so
matching only error-tagged lines drops it and every diagnosis collapses to a
generic failure.
★ Six NullPointerException stack traces appear in a successful checkout.
The connector dumps each request/response to the folder named by
CT_REQ_RESP_JSON_DIR; unset, it builds a FileOutputStream(null), throws, logs
and carries on. Setting that variable is a genuinely useful payload capture,
independent of isPayloadRequired/jsonPayloaddir in logger.properties, and
only the latter is documented.
Logging: nothing tidies itself
| Rotation | Deletion | |
|---|---|---|
connector logger.properties |
none at all | never |
client log4j2.xml |
by time and size | no delete policy |
Measured: a 38 MB connector log, and 58 client files totalling 362 MB of which
264 MB came from one logger, com.teamcenter.soa.client.Connection, left at
DEBUG. Adding a log4j DefaultRolloverStrategy does not fix accumulation:
with a time-based filePattern its maximum applies per rollover period. Sweep by
age from outside.
★ Edit log4j2.xml as scoped text, never through an XML parser: a parser
round trip reformats the document and drops the Siemens header and the comment
block documenting the level names. Scope the SizeBasedTriggeringPolicy
substitution to its enclosing <RollingFile>, or you also shrink the traffic
appender's deliberately larger limit.
Environment variables (Installation Guide 4.1)
MAGICDRAW_HOME and JRE_HOME are required; three PATH entries are asked for
(%JRE_HOME%, ...\CameoTCIntPlugin\lib for FlexLM, ...\sdk\org.jcef\libs for
the embedded panel). JAVA_HOME is not in the guide.
★ On a working machine all three PATH entries were absent and the connector ran fine. Treat them as advisory. On a managed corporate machine these are IT's to set, so report and suggest; do not write them.
★ Cameo always runs its own bundled JRE whatever JRE_HOME says. A machine
with JRE_HOME on Java 21 while Cameo runs 17 is not broken, but note that the
matrix puts connector 2606 on Java 21 while Cameo 2024x ships 17: that is
precisely why the matrix marks the pairing Planned.
Order of operations
- Configuration changes need a full Cameo restart. The connector reads them at startup only, so a change made while Cameo is open shows in the file and not in the product.
- Put Model greys out after the first push. Synchronize is a PULL that discards local edits. The real push path is Check-Out, edit, Check-In.
- Without the Merge Plugin loaded, Check-Out offers only "Replace the Project
with the Server Version and discard all Local modification". Back up the local
.mdzipfirst; the dialog does not warn in terms anyone recognises as destructive. %TEMP%\MAGICDRAW_BHMIntegrationDefinition.xmlis re-read on each Put Model, so a mapping change does not need a re-login even though a properties change needs a restart.
Browsing Teamcenter WITHOUT leaving Cameo - the "parameter palette"
EXERCISED 2026-08-14, Cameo 2024x + connector against vm2606, screenshots taken.
Toolbar button Open Active Workspace in Hosted Window. It docks the real
Active Workspace UI as a panel inside the Cameo window - search, Tasks, Recent,
the lot. This is the answer to "the parameters live in Teamcenter but I want to
see them without leaving Cameo": TC stays the source of truth, AW is embedded.
The button sits just right of the Teamcenter toolbar group; hover it and the
STATUS BAR shows the tooltip (the tooltip itself does not survive a screenshot).
Verified: searching Set Mass returned 985 results, top hit Set Mass Revision: A, a parameter definition authored over SOA minutes earlier.
⚠ Where it is NOT. Four wrong places, all checked:
- the
Teamcentermenu carries onlyUser Profile+Revision Rule, logged in or not. Nothing browsable. - the
Windowmenu lists no Teamcenter panel at all. - the diagram palette (Selection/Tools/Common -> Package, Block, ...) is SysML element types. Unrelated, and the obvious thing to mistake it for.
- it is inert until a project is open AND you are logged in to TC. With no project open, the login action is not even offered.
Two traps that make Cameo look broken while you do this
⚠⚠ A queued modal Merge Plugin warning BLOCKS THE EVENT THREAD. The
connector raises "the Project Merge plugin is not available or loaded"
(disabling Compare with -> PLM Revision, and compare/merge during Check Out and
Update). It can sit queued and invisible behind other windows. While it is up,
Cameo answers nothing: the Open API bridge times out (measured: a 180 s timeout
on the EDT), and any script dispatched meanwhile runs NESTED INSIDE the dialog's
event pump. A stack trace showing your script under
com.hcl.cameotc.integration.ui2.ImportDialog.onOkClick is that. ⇒ Before
concluding the bridge is broken, look for a modal dialog. Dismiss, then retry.
⚠ frame.setAlwaysOnTop(True) suppresses Cameo's own menus. Raising the
window that way to screenshot it means the menu bar highlights but no dropdown
ever renders, which reads exactly like the click missing. Raise with
setExtendedState(MAXIMIZED_BOTH) + toFront() and leave alwaysOnTop FALSE.
⚠ open_application launches a SECOND Cameo rather than activating the
running one, and the second instance stops on the FlexNet licence dialog. Raise
the existing window through the bridge instead.
Credentials
Automation against Teamcenter authenticates from the DPAPI credential store,
never from a pasted secret: a tc-mcp profile names a credFile, and
mcp_server._resolve_credentials(pcfg, '', '') hands the value straight to
tc_client.connect. The 1,615-definition bulk authoring run on 2026-08-14 ran
this way and reported credentialSource: credFile. Verify by EFFECT (the login
succeeded) and never print or inspect the resolved value - see
[[never-view-decrypted-credentials]].
⚠ That covers the API path only. Cameo's own Welcome to Teamcenter GUI
login (User ID / Password / Group / Role / URL) is a human step: it is a
password field, and typing into one is out of scope for an agent here. Log in
by hand, then drive the hosted AW panel. UNVERIFIED: whether the connector
can be configured to take stored credentials and skip that dialog - nobody has
tested it, so do not record it as possible or impossible.
Single sign-on: the URL picks the strategy, and one strategy is not installed
Run status: EXERCISED 2026-08-20, Cameo 2024x + connector 2606, tier vm2606
(siemensdc). Read out of the shipped jars with javap, and confirmed against a
working-then-broken-then-working login.
Filling in TC_SSO_LOGIN_URL can turn a working sign-in into
Error in TcSS. Session Agent could not be started. It did exactly that here,
on a tier whose Security Services are genuinely deployed and whose login service
genuinely answers. Both facts are true and neither makes SSO usable from Cameo.
SSOClient.getConfiguredSessionInitializer(loginUrl) chooses by the shape of the
login URL:
| Condition | Initializer |
|---|---|
config property com.teamcenter.ss.client.SSOSessionInitializer set |
that class |
URL ends /tccs or /tccs/ |
TccsSessionInitializer |
| anything else | SessionAgentSessionInitializer |
Row three shells out to SessionAgentStart.bat, from a directory
OsUtil.getSessionAgentPath() reads out of the environment variable
TCSSO_SESSION_AGENT_PATH. Unset, or the path missing, and it throws
FileNotFoundException("Teamcenter Security Service Session Agent is not installed"), which the connector reports as the dialog above. Neither the
variable nor the .bat existed anywhere on the test machine, so this failed every
time, deterministically.
Two traps in that one class.
DEFAULT_SESSION_INITIALIZERis declared asSimpleSesInitializerand reads like a safe fallback. The selection method never uses it, and that class is not in the jar, so setting the property to it fails with a configuration error rather than helping.TC_SSO_SESSION_FLAGlooks like the switch that governs all of this. It is not. The URL alone decides which initializer loads, so clearing the flag while leaving the URL set changes nothing.
Before configuring SSO here, check the two things that decide whether it can work at all, and say which you checked:
[Environment]::GetEnvironmentVariable("TCSSO_SESSION_AGENT_PATH","Machine")
Get-ChildItem "<cameo-root>" -Recurse -Filter "SessionAgentStart*"
Both empty means the only routes are TCCS (TRANSPORT=tccs, IS_TCCS=true, login
URL ending /tccs) or installing the Session Agent from a Teamcenter client kit.
Neither has been exercised. Until one is, leave TC_SSO_LOGIN_URL,
TC_SSO_APP_ID and TC_SSO_SESSION_FLAG empty and sign in with a user name
and password.
The diagnostic lesson, which cost more than the fix. The failure was investigated forwards, from the error message down into the bytecode, and that investigation was correct and useless: it explained the mechanism of a fault that should never have been introduced. The question that solved it was "what changed since it worked", answered in one call by comparing the connector properties file timestamp (13:46:10, the moment of the switch) against the first failure (13:47:57) and the last success (11:46:52). When something that worked stops working, read the timestamps before reading the stack.
The value that broke it was recorded as DERIVED, not exercised in two places and
applied to live files anyway. Marking provenance is worthless if the marked value
still ships: an unexercised value must not be written over a configuration that
already works.
Related skills
tc-soa-session, tc-vm-operations, tc-verify-and-cleanup,
tc-parameters-units, tc-sso-keycloak.
Generated from skills/cameo-connector-config/SKILL.md in the tc-automation-skills library, which is the canonical copy and also serves as the agent skill set for Teamcenter work.