Skip to main content
Glama

thingworx-mcp

MCP server for PTC ThingWorx, the IIoT platform. 8 tools for AI agents to read live state and trigger actions across the industrial asset graph.

What it wraps

The ThingWorx REST API surface that matters to an agent: Things, Properties, Services, ThingTemplates, and the model search index. ThingWorx is the IIoT platform used to wire SCADA, PLCs, MES, and plant equipment into a unified model. This MCP gives an agent the read path for live equipment state and the write path for setpoints and named operations, both env-gated independently because both can affect real industrial equipment.

Related MCP server: production-grade-mcp-agentic-system

Tools (8)

Tool

Purpose

Env gate

list_things

Inventory all Things in the model

none

get_thing

Read a Thing's full metadata + surface area

none

read_property

Read live value of a Property

none

write_property

Update a Property value

THINGWORX_ALLOW_WRITE=true

invoke_service

Execute a named Service on a Thing

THINGWORX_ALLOW_INVOKE=true

list_thing_templates

Inventory available ThingTemplates

none

get_thing_template

Read a ThingTemplate's definition

none

search_things

Free-text search the model

none

The two gates are independent. An operator can enable property writes (setpoints) without enabling service invocations (which can include emergency stops, PLC commands, downstream workflow triggers), and vice versa.

Install

pip install thingworx-mcp

Configuration

ThingWorx is self-hosted. Set:

export THINGWORX_BASE_URL="https://thingworx.your-company.com"
export THINGWORX_APP_KEY="your-application-key"

# Optional, default false. Enables write_property tool.
export THINGWORX_ALLOW_WRITE="true"

# Optional, default false. Enables invoke_service tool.
export THINGWORX_ALLOW_INVOKE="true"

# Optional, default true. Set to "false" for self-signed dev instances.
export THINGWORX_VERIFY_SSL="false"

Generate the appKey in ThingWorx Composer under Security > Application Keys. The MCP uses the appKey header convention (not Bearer).

Use with Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "thingworx": {
      "command": "thingworx-mcp",
      "env": {
        "THINGWORX_BASE_URL": "https://thingworx.your-company.com",
        "THINGWORX_APP_KEY": "your-application-key"
      }
    }
  }
}

Use with Hermes

mcp:
  thingworx:
    command: thingworx-mcp
    env:
      THINGWORX_BASE_URL: https://thingworx.your-company.com
      THINGWORX_APP_KEY: ${THINGWORX_APP_KEY}
      THINGWORX_ALLOW_WRITE: "true"

Safety model

ThingWorx is wired to real PLCs and real equipment. The MCP defaults to read-only. Property writes and service invocations both require an explicit env opt-in, and the gates are independent so an operator who wants telemetry write capability does not have to also grant service invocation rights.

Failures from the upstream ThingWorx instance are surfaced as structured errors. Network and timeout errors are surfaced with status codes.

Development

git clone https://github.com/NoBanks/thingworx-mcp
cd thingworx-mcp
pip install -e ".[dev]"
pytest

Tests use respx for HTTP mocking, no live ThingWorx instance required.

License

MIT. See LICENSE.

About

Part of a 26 plus MCP server cohort at github.com/NoBanks, shipped by @livingagentic. Other industrial MCPs in the same cohort: workday-mcp, veeva-mcp, plaid-mcp, lambda-cloud-mcp. Built using the same factory pattern: env-gated for destructive actions, MIT licensed, install-ready, smoke-tested.

Available Tools

8 tools
get_thingA

Get metadata for a specific Thing by name. Returns the Thing's properties, services, events, and implemented ThingShapes. Used to discover the surface area of a Thing before reading or writing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe Thing name

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

In the absence of annotations, the description details what the tool returns (properties, services, events, ThingShapes), which is sufficient for a read-only metadata retrieval operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with no unnecessary words. The first sentence states the core function, and the second provides usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description is complete: it explains what it does, what it returns, and when to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with clear description. The tool description adds no additional meaning beyond the schema's 'The Thing name' and the phrase 'by name'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get metadata for a specific Thing by name.' It lists the returned data (properties, services, events, ThingShapes) and distinguishes from siblings like get_thing_template, list_things, and read_property.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use: 'Used to discover the surface area of a Thing before reading or writing it.' This provides context, though it does not explicitly mention when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_thing_templateA

Get the full definition of a ThingTemplate by name, including property + service + event signatures, parent template, and implemented ThingShapes.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe ThingTemplate name

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully convey behavioral aspects. It describes what is returned but does not disclose side effects, error behavior (e.g., if name not found), permissions required, or idempotency. A read operation should clarify these aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that efficiently communicates the tool's purpose and scope. No superfluous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description lacks details on return format structure and error handling. For a get tool, it should clarify if an error occurs when the template is not found or if it returns null. The description covers the essentials but is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage; the 'name' parameter is already described in the schema. The description adds no additional meaning beyond associating the parameter with the resource. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' with a well-defined resource 'ThingTemplate', and explicitly lists what is included in the definition (property, service, event signatures, parent template, implemented ThingShapes). It clearly distinguishes from sibling 'list_thing_templates' which lists all templates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you need a full definition of a specific ThingTemplate by name. However, it does not explicitly state when not to use this tool or provide direct comparisons with alternatives like 'list_thing_templates'. The context is clear but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

invoke_serviceA

Invoke a named Service on a Thing. Gated by THINGWORX_ALLOW_INVOKE=true (separate from write) because services execute named actions that can include PLC commands, scripted workflows, and downstream system calls. The MCP refuses to invoke unless the operator has explicitly authorized it.

ParametersJSON Schema
NameRequiredDescriptionDefault
parametersNoOptional parameters passed to the service
thing_nameYesThe Thing on which to invoke the service
service_nameYesThe Service name to invoke

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description discloses critical behavioral traits: the need for explicit authorization (THINGWORX_ALLOW_INVOKE=true) and that services can execute potentially destructive actions (PLC commands, scripted workflows, downstream calls). It does not cover all aspects like return format or error handling, but adds significant value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main action, and every word contributes essential information. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (invocation of arbitrary services with potential side effects) and lack of output schema, the description covers safety and authorization but omits details on return value, error states, or typical success/failure behavior. It is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no extra meaning beyond what the schema already states for each parameter (thing_name, service_name, parameters). It merely restates that parameters are optional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (invoke) and resource (a named Service on a Thing), distinguishing it from sibling tools like read_property or write_property, which handle data access rather than action execution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the tool is gated by an environment variable and is separate from write operations, implying it should be used when authorized for executing actions. However, it does not explicitly contrast with sibling tools or specify when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_thingsA

List all Things registered in the ThingWorx model. Returns Thing names, descriptions, and parent ThingTemplate. The standard read path for an agent that needs to discover the industrial asset inventory.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the basic behavior (lists all Things) and output fields, but with no annotations, the full burden is on the description. It omits potential side effects (e.g., performance for large inventories), authentication needs, or rate limits. Adequate but could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences that are direct and informative. Every word adds value, and key information is front-loaded. No unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameters, the description provides enough context for a simple listing tool. It specifies the return fields and use case. Could mention potential pagination or size limits, but overall satisfactory.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so schema_description_coverage is 100%. The description correctly implies no parameters are needed but does not add extra semantics. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List all Things'), the resource ('registered in the ThingWorx model'), and the exact fields returned ('Thing names, descriptions, and parent ThingTemplate'). It also distinguishes from siblings like 'search_things' and 'list_thing_templates' by calling it the 'standard read path' for discovering the inventory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool ('to discover the industrial asset inventory') and implies it is the primary listing tool. It does not explicitly state when to avoid it or mention alternatives, but the sibling names suggest other tools for specific tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_thing_templatesA

List all ThingTemplates available in the ThingWorx model. ThingTemplates are the type definitions Things instantiate from. Used by agents to understand the schema available before creating or inspecting Things.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description implies a read-only list operation, but does not disclose potential side effects, pagination, or access requirements. Adequate for a simple list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action, no wasted words. Every sentence adds value: purpose and usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description fully covers the tool's purpose and usage context. No gaps for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in schema; baseline is 4. Description does not need to add param info as there are none. It correctly implies no filtering options.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all ThingTemplates' and explains what ThingTemplates are. It distinguishes from sibling tools like list_things (things vs templates) and get_thing_template (list vs single) through context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'before creating or inspecting Things'. Lacks explicit when-not-to-use or alternatives, but context sufficiently guides usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_propertyA

Read the current value of a single Property on a Thing. Returns the property value plus its data type. The standard read path for an agent that needs the live state of an industrial asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
thing_nameYesThe Thing whose property to read
property_nameYesThe Property name

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must cover behavioral aspects. It states it is a read operation returning value and type, which implies safety, but does not disclose potential errors, permissions, or whether data is cached. Adequate but could be more transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that are front-loaded with the action and resource. No unnecessary words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with two parameters and no output schema, the description is fairly complete. It explains what is returned and the typical use case. Missing error handling details but sufficient for an agent to understand basic behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter descriptions. The tool description adds context about the return value (data type), which is not in the schema, thus providing additional value beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a single property on a thing and returns its value and data type. It distinguishes from siblings like get_thing (reads whole thing) and write_property (writes) by specifying exactly what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use this tool ('standard read path for live state of industrial asset'), but does not explicitly exclude alternatives or mention when not to use it compared to siblings like get_thing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_thingsA

Search the ThingWorx model by free-text expression matched against Thing names + descriptions. Returns up to max_items results. Used when the agent does not know the exact Thing name (e.g. 'find all conveyor things in Line 4').

ParametersJSON Schema
NameRequiredDescriptionDefault
max_itemsNoMax results (default 50)
search_expressionYesFree-text search expression

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It mentions results are limited by max_items, suggesting it returns a subset. However, it does not explicitly state it is a read-only operation or describe any side effects. This is adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core action and scope. The example is concise and helpful. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers what the tool does, what it returns (up to max_items results), and when to use it. It lacks details on the return format, but that is acceptable for a simple search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage, so the description adds value by explaining the search is against 'Thing names + descriptions', which is not in the schema. It also reinforces that max_items caps results. This provides useful context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches by free-text expression against Thing names and descriptions. It distinguishes from siblings like get_thing (exact name) and list_things (exhaustive), providing a specific verb and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use: when the agent does not know the exact Thing name. Includes an example ('find all conveyor things in Line 4') that clarifies the context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_propertyA

Write a new value to a Property on a Thing. Gated by THINGWORX_ALLOW_WRITE=true because property writes can change the state of real industrial equipment (setpoints, modes, configuration). The MCP refuses to write unless the operator has explicitly authorized it.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesThe new property value. Type must match the property definition.
thing_nameYesThe Thing whose property to write
property_nameYesThe Property name

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that writes can change real equipment state, requires the THINGWORX_ALLOW_WRITE environment variable, and refuses without authorization. This adds important behavioral context beyond a simple write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each contributing essential information: action, gating reason, and authorization requirement. It is front-loaded with the primary purpose and efficiently conveys key details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and 3 parameters, the description covers the main purpose and behavioral constraints (gating, safety). It lacks details on return values or error handling, but the safety context is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all 3 parameters have descriptions in the schema). The description adds no additional parameter-level information, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Write a new value to a Property on a Thing.' It uses specific verbs and resources, and distinguishes from sibling tools like 'read_property' by being a write operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for changing property values on industrial equipment, but does not explicitly state when to use vs. alternatives or when not to use. It mentions the gating requirement but lacks explicit exclusions or comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 8 tool updatesv0.1.0
    • First observedget_thing
    • First observedget_thing_template
    • First observedinvoke_service
    • First observedlist_thing_templates
    • First observedlist_things
    • First observedread_property
    • First observedsearch_things
    • First observedwrite_property

TDQS

A4.1/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: property, service, thing, template, search. No overlap between read_property/write_property, list_things/search_things, or get_thing/get_thing_template.

Naming Consistency5/5

All tools follow a clear verb_noun pattern in snake_case (e.g., list_things, read_property, invoke_service). No mixed conventions or vague verbs.

Tool Count5/5

8 tools is well-scoped for an industrial MCP server covering asset discovery, state reading, property writing, and service invocation. Each tool has clear purpose.

Completeness3/5

Core read/write and discovery are covered, but missing create/delete for Things and ThingTemplates. Invoke/service is present but limited. Gaps in lifecycle management.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NoBanks/thingworx-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server