Skip to main content
Glama

Siemens Docs MCP

An MCP server that lets an AI assistant search and read Siemens documentation live — any publication on docs.tia.siemens.cloud (TIA Portal, STEP 7, WinCC Unified, Openness, …) and docs.industrial-operations-x.siemens.cloud (Industrial Operations X) — plus a CLI that exports a whole publication to a tree of Markdown files.

Built to solve the problem of documentation portals that only offer low-quality PDF exports or JavaScript-rendered web views, making the content difficult to search, reference, or feed to AI tools.


Installation

PyPI

pip install siemens-docs-mcp

This installs two commands: siemens-docs-mcp (the MCP server) and siemens-docs-export (the Markdown exporter). Requires Python 3.11+.

From source

git clone https://github.com/Czarnak/siemens-docs-mcp
cd siemens-docs-mcp
python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -e .
# development (pytest, ruff, pip-audit; needs pip >= 25.1):
pip install -e . --group dev

Related MCP server: Jamf Docs MCP Server

MCP server

The server speaks MCP over stdio. Register it with Claude Code:

# from PyPI, no manual install (needs uv)
claude mcp add siemens-docs -- uvx siemens-docs-mcp

# or an installed copy
claude mcp add siemens-docs -- siemens-docs-mcp
# from a source checkout: <repo>/.venv/Scripts/siemens-docs-mcp  (Linux/macOS: <repo>/.venv/bin/siemens-docs-mcp)

Pass settings with -e, e.g. claude mcp add siemens-docs -e SIEMENS_DOCS_LOCALE=de-DE -- uvx siemens-docs-mcp.

Tools:

Tool

Purpose

search_docs

Full-text search (filter by product, version, locale, host, or limit to one publication or topic subtree with scope).

read_page

Read one page as Markdown: outline, sections by heading or number, code only; page through with offset.

get_toc

Table of contents of a publication or of the subtree under a topic reference.

list_publications

List publications; discover valid product / version values.

All four tools emit compact references by default. Publication references use <prefix>:<mapId>; topic references use <prefix>:<mapId>/<contentId>, for example tia:MyPublication/MyTopic. Stable prefixes tia and iox identify docs.tia.siemens.cloud and docs.industrial-operations-x.siemens.cloud. Additional allowed hosts use their full hostname as the prefix; full hostnames also work for the built-in hosts. Prefixes are case-insensitive; IDs retain case.

Pass a compact reference or any reader URL returned by a tool (or copied from the browser) in the unchanged url argument: read_page(url="tia:MyPublication/MyTopic") or get_toc(url="tia:MyPublication"). Set reference_format="url" on any tool to emit full reader URLs. In read_page bodies, links to other topics on the same host (https://<host>/r/<mapId>/<contentId>) become compact references too (or stay full URLs with reference_format="url"); other links are unchanged, and images keep only their alt text. Exported Markdown is not affected. The CLI continues to use reader URLs in its configuration; compact references are an MCP tool interface.

To search inside a publication or chapter you already found, pass its reference as scope: search_docs(query="GetAttribute", scope="tia:MyPublication") or scope="tia:MyPublication/MyChapter". Host and locale then come from the scope, and product/version must be omitted. Publication scope is filtered by the server, so its count is exact. Topic scope keeps only hits inside the topic's subtree; it reads at most 300 publication results, and says so when its count may be incomplete.

To read only part of a long page, ask for its outline first: read_page(url="tia:MyPublication/MyTopic", mode="outline") lists numbered headings with their sizes. Then pass a number or heading text as section: section="Program code" returns every "Program code" and "Program code: …" section. mode="code" returns only the code blocks, each under its heading, and combines with section. Long results are cut between blocks; a code block or table too large for one part is split at a line, with its fence or header repeated. Each part ends with the exact arguments for the next one.

Environment variables:

Variable

Default

Meaning

SIEMENS_DOCS_HOSTS

(none)

Comma-separated extra hosts, appended to the built-in two (docs.tia.siemens.cloud, docs.industrial-operations-x.siemens.cloud).

SIEMENS_DOCS_LOCALE

en-US

Default locale for search and listings.

SIEMENS_DOCS_MIN_INTERVAL

0.3

Minimum seconds between requests to a host.

The publication catalog and TOCs are cached in memory (not on disk), so the first call per host takes a few seconds.


Markdown export (CLI)

Export a whole publication to Markdown — one file per page, folders mirroring the navigation hierarchy. Create a config with any reader URL of the publication (a topic URL exports the whole publication):

# my_docs.yaml
name: tia_openness_v21
url: "https://docs.tia.siemens.cloud/r/en-us/v21/tia-portal-openness-api-for-automation-of-engineering-workflows"
output_dir: "output/tia_openness_v21"
# Preview pages without writing files
siemens-docs-export my_docs.yaml --dry-run

# Export everything
siemens-docs-export my_docs.yaml

# Export a single page (for testing output quality)
siemens-docs-export my_docs.yaml --page cybersecurity-information

# Override the output directory / verbose logging
siemens-docs-export my_docs.yaml --output /tmp/docs --verbose

A ready-made config lives in configs/ in the repository.

Output structure

output/tia_openness_v21/
├── index.md                          ← root page
├── cybersecurity-information.md
├── what-s-new-in-tia-portal-openness.md
├── basics/
│   ├── basics.md
│   └── ...
├── tia-portal-openness-api/
│   ├── tia-portal-openness-object/
│   │   └── ...
│   └── ...
└── ...

Configuration reference

Key

Required

Description

name

No

Human-readable label shown in log output.

url

Yes*

Any reader URL of the publication (resolved to its map automatically).

api_base

Yes*

Legacy: root URL of the Fluidtopics instance (use with map_id).

map_id

Yes*

Legacy: Fluidtopics map identifier (use with api_base).

output_dir

Yes

Directory where Markdown files will be written.

* Either url, or api_base + map_id. If both are present, url wins.


How it works

Fluidtopics (the platform behind both portals) exposes a REST API that the browser SPA uses internally. This package calls that API directly — no browser automation:

  1. Catalog — GET /api/khub/maps lists every publication; reader URLs are resolved against it.

  2. Search — POST /api/khub/clustered-search with product/version/locale filters.

  3. TOC — GET /api/khub/maps/{mapId}/pages returns the navigation tree.

  4. Content — GET /api/khub/maps/{mapId}/topics/{contentId}/content returns raw HTML, converted to Markdown with markdownify.

Requests are throttled per host and retried once on 401/403/429/5xx.

Note: Only Fluidtopics-based portals are supported. Other platforms (MadCap Flare, Paligo, etc.) would need a different adapter.


Development

python -m pytest -q          # offline tests
python -m pytest -m live -q  # live smoke tests against the real hosts
ruff check .

Created with Claude AI

Available Tools

4 tools
get_tocA

Show the table of contents (1-6 levels via depth) of the publication, or of the subtree under the topic, in url: an indented outline, one line per node with title and reference. Pass reader URLs or compact references in the unchanged url parameter. Compact forms: : or :/; stable prefixes tia=docs.tia.siemens.cloud and iox=docs.industrial-operations-x.siemens.cloud. Any allowed host may also use its full hostname as prefix. Tool-generated addresses default to compact references; set reference_format='url' for reader URLs. Allowed hosts: docs.tia.siemens.cloud, docs.industrial-operations-x.siemens.cloud (default: docs.tia.siemens.cloud).

Inputs: url (required), depth, reference_format. Returns: result

list_publicationsA

List documentation publications (up to 50 rows): title, product, version, locale and reference. Use it to discover valid product and version values; references are valid input to read_page and get_toc. Tool-generated addresses default to compact references; set reference_format='url' for reader URLs. Pass reader URLs or compact references in the unchanged url parameter. Compact forms: : or :/; stable prefixes tia=docs.tia.siemens.cloud and iox=docs.industrial-operations-x.siemens.cloud. Any allowed host may also use its full hostname as prefix. product (e.g. 'STEP 7', 'WinCC Unified', 'SIMATIC AX') and version (e.g. 'V21', '6.1') are matched against the catalog; call list_publications to see valid values. Allowed hosts: docs.tia.siemens.cloud, docs.industrial-operations-x.siemens.cloud (default: docs.tia.siemens.cloud).

Inputs: host, locale, product, version, +2 more. Returns: result

read_pageA

Read one documentation page as Markdown with a header (publication, version, breadcrumb, source reference). mode='outline' lists numbered headings with sizes. section takes an outline number or heading text (e.g. 'Program code', which also matches 'Program code: …') and returns only matching sections. mode='code' returns only code blocks under their headings and combines with section. Long results end with the exact arguments to continue (offset, plus section/mode/reference_format when set). Links to other topics on the same host in a page body follow reference_format; images keep only their alt text. Pass reader URLs or compact references in the unchanged url parameter. Compact forms: : or :/; stable prefixes tia=docs.tia.siemens.cloud and iox=docs.industrial-operations-x.siemens.cloud. Any allowed host may also use its full hostname as prefix. Tool-generated addresses default to compact references; set reference_format='url' for reader URLs. Allowed hosts: docs.tia.siemens.cloud, docs.industrial-operations-x.siemens.cloud (default: docs.tia.siemens.cloud).

Inputs: url (required), mode, offset, section, +2 more. Returns: result

search_docsA

Full-text search of Siemens documentation. Returns a numbered Markdown list (1-50 hits via limit): title, publication + version, breadcrumb, excerpt and reference, with the total hit count. Pass a result's reference to read_page or get_toc. Set scope to a publication or topic reference (same forms as url) to search only that publication or topic subtree; host and locale then come from the scope and product/version must be omitted; the header names the scope once and says when a subtree count is partial. Tool-generated addresses default to compact references; set reference_format='url' for reader URLs. Pass reader URLs or compact references in the unchanged url parameter. Compact forms: : or :/; stable prefixes tia=docs.tia.siemens.cloud and iox=docs.industrial-operations-x.siemens.cloud. Any allowed host may also use its full hostname as prefix. product (e.g. 'STEP 7', 'WinCC Unified', 'SIMATIC AX') and version (e.g. 'V21', '6.1') are matched against the catalog; call list_publications to see valid values. Allowed hosts: docs.tia.siemens.cloud, docs.industrial-operations-x.siemens.cloud (default: docs.tia.siemens.cloud).

Inputs: query (required), host, limit, scope, +4 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 4 tools

    Disambiguation5/5

    Each tool occupies a distinct layer of the documentation workflow: catalog discovery (list_publications), full-text search (search_docs), structural navigation (get_toc), and content retrieval (read_page). There is no overlap in purpose, and the descriptions explicitly state how outputs chain together (references from search feed read_page/get_toc).

    Naming Consistency5/5

    All names follow a strict verb_noun snake_case pattern: search_docs, read_page, get_toc, list_publications. The verb choices (search/read/get/list) accurately signal the operation type, and there are no stylistic deviations.

    Tool Count5/5

    Four tools is a tight, well-scoped surface for a read-only documentation server — one tool per stage of the discover-search-navigate-read pipeline, with nothing redundant. No CRUD bloat or lifecycle tools that would not apply to a read-only corpus.

    Completeness4/5

    The core loop of finding publications, searching within scopes, inspecting TOC structure, and reading/sectioning pages is fully covered. Minor gaps remain, such as no bulk export, no batch fetch of multiple references, and no dedicated way to enumerate products/versions except indirectly through list_publications output.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to interact with SIEMENS PLC S7-1500/1200 controllers through their JSON-RPC API, supporting authentication, tag browsing, variable read/write operations, alarm management, and diagnostic buffer access.
      13
      ISC
    • A
      license
      A
      quality
      B
      maintenance
      Provides AI assistants with direct access to Jamf official documentation, enabling them to answer Jamf-related questions by searching, retrieving articles, and browsing product documentation.
      6
      361 npm
      5
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to search, read, and traverse documentation bundles in Open Knowledge Format via MCP tools.
      931 npm
      74
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI clients to inspect and modify Siemens PLC projects through the Openness API: browsing block trees, reading and generating ladder logic, creating data blocks and SCL source, importing/exporting, compiling, editing tag tables, and launching, opening, saving, or archiving projects. Changes stay in memory until an explicit save, and write tools refuse to overwrite existing blocks unless told to.
      MIT