Eclipse Ditto

io.github.nagarjunr由 GitHub 账号 nagarjunr 发布v0.1.1更新于 Oct 24, 2026

MCP server for the Eclipse Ditto digital twin HTTP API (things, policies, connections, more).

发布方自己的服务:ditto.audio

概览

AI 生成的概览

让助手通过 Ditto HTTP API 管理 Eclipse Ditto 数字孪生:事物、属性、功能、策略、连接以及集群 DevOps 设置。

可以做什么
把 Eclipse Ditto 的 HTTP API 封装为 MCP 工具。事物工具可列出、计数、获取、创建、局部更新和删除事物,并管理其策略 ID 与定义。属性与功能工具可读写属性、功能、功能属性与期望属性。消息工具可发送实时消息并认领事物。策略工具可管理策略及其条目。连接与 DevOps 工具可列出、创建、更新、删除连接,查看连接状态、指标与日志,设置集群日志级别,读取运行时配置并发送 piggyback 管理命令。poll_thing_changes 工具通过短时 SSE 连接收集实时变更事件。
适用场景
当助手需要操作 Eclipse Ditto 部署或基于 Ditto 的物联网平台时适用:查看和更新设备孪生、调整策略,或运维连接与集群设置。适合自建 Ditto 实例以及基于 Ditto 开放协议的商业平台。它不面向通用网页或文件任务。
运行要求
以 stdio 方式在本地运行,从 PyPI 安装 eclipse-ditto-mcp-server 并用 uvx 启动,需要 Python/uv 运行环境。必须设置 DITTO_BASE_URL 指向 Ditto HTTP API。可选凭据:DITTO_USERNAME 与 DITTO_PASSWORD,或 DITTO_BEARER_TOKEN,用于 things/policies/messages/search API;DITTO_DEVOPS_USERNAME 与 DITTO_DEVOPS_PASSWORD 用于独立的 DevOps/Connections 域。需要能访问 Ditto 实例的网络。
安装前请注意
凭据通过环境变量传入:DITTO_BEARER_TOKEN、DITTO_PASSWORD、DITTO_DEVOPS_PASSWORD 以及对应的用户名;若都未设置,请求将以未认证方式发出。多个工具会写入或删除数据,例如 put_thing、patch_thing、set_thing_attributes、set_feature_properties、put_policy、set_policy_entry、create_connection、update_connection、set_logging_config 和 send_message。删除操作需 confirm=True 且不可恢复,也没有批量删除。send_devops_piggyback 被描述为最强大、防护最少的接口,需谨慎使用。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Eclipse Ditto,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Eclipse Ditto MCP Server

A Model Context Protocol (MCP) server for Eclipse Ditto — the open-source (EPL-2.0) digital twin framework. It exposes Ditto's HTTP API as MCP tools so an AI agent can manage devices ("things"), their attributes/features, policies, connections, and cluster admin — the full Ditto HTTP API surface.

Since Bosch IoT Things and other commercial IoT platforms are built on Ditto's open protocol, this server also works against those deployments — nothing in the code is vendor-specific.

Built with FastMCP.

Tools

Things

ToolDescription
list_things(namespaces, filter, fields, limit)Search/list things. filter is a Ditto RQL expression, e.g. eq(attributes/location,"lab-1").
count_things(namespaces, filter)Count things matching a filter without fetching them.
get_things(thing_ids, fields)Bulk-fetch multiple things by ID in one request.
get_thing(thing_id, fields)Fetch the full digital twin for one thing.
put_thing(thing_id, thing, overwrite=False)Create a thing, or replace one with overwrite=True.
patch_thing(thing_id, patch)Partially update a thing via RFC-7396 JSON Merge Patch.
delete_thing(thing_id, confirm=False)Delete a thing. Irreversible.
get_thing_policy_id / set_thing_policy_idRead/repoint the policy controlling a thing.
get_thing_definition / set_thing_definition / delete_thing_definitionManage a thing's WoT/model definition.
whoami()Return the identity Ditto authenticated this connector as — useful to sanity-check credentials.

Attributes & Features

ToolDescription
get_thing_attributes(thing_id, path=None)Get all attributes, or one by JSON pointer path.
set_thing_attributes(thing_id, value, path=None, overwrite=False)Set the whole attributes object, or one attribute.
delete_thing_attributes(thing_id, path=None, confirm=False)Delete attributes (whole object or one path).
get_thing_features(thing_id)Get all features (sensor/actuator state).
get_feature / put_feature / delete_featureRead/create-replace/delete one whole feature.
get_feature_properties / set_feature_properties / delete_feature_propertiesRead/write/delete feature properties or desiredProperties, whole or by path.
get_feature_definition / set_feature_definition / delete_feature_definitionManage a feature's definition.

Messages

ToolDescription
send_message(thing_id, subject, payload, feature_id=None, direction="inbox", timeout=10)Send a live message to/from a thing or feature (e.g. invoke a device operation).
claim_thing(thing_id, payload=None, timeout=10)Send a claim message to gain access to a thing.

Policies

ToolDescription
get_policy / put_policy / delete_policyRead/create-replace/delete a policy.
get_policy_entries(policy_id, label=None)Read all entries, or one by label.
set_policy_entry / delete_policy_entryCreate-replace/delete one policy entry.

Connectivity & DevOps (require DITTO_DEVOPS_USERNAME/DITTO_DEVOPS_PASSWORD)

Ditto's Connections API and DevOps API (log levels, cluster config, piggyback commands) sit behind a separate "devops" Basic-auth realm on the gateway, independent of the policy-based auth used for things/policies.

ToolDescription
list_connections / get_connectionList/fetch connection configs.
create_connection(connection, dry_run=False)Create a connection (ID generated by Ditto).
update_connection(connection_id, connection)Update an existing connection (404 if it doesn't exist).
delete_connection(connection_id, confirm=False)Delete a connection.
get_connection_status / get_connection_metrics / get_connection_logsInspect a connection's live state.
send_connection_command(connection_id, command)Open/close/reset-metrics/enable-logs/reset-logs.
get_logging_config / set_logging_configRead/set cluster log levels.
get_devops_config(path)Read cluster-wide runtime config.
send_devops_piggyback(command, service_name=None, instance_index=None)Low-level admin command — Ditto's most powerful, least-guarded API. Use with care.

Live events

ToolDescription
poll_thing_changes(thing_ids, namespaces, filter, fields, duration_seconds=10, max_events=50)Open a short-lived SSE connection and collect live thing-change events. A request/response approximation of Ditto's persistent change feed — see caveat below.

Safety conventions

  • Create vs. replace: every put_*/set_*/create_* tool defaults to overwrite=False, using Ditto's If-None-Match: * header so create-only is race-free (not a check-then-set). Pass overwrite=True to replace existing data.
  • Deletes are confirm-gated: every delete_* tool requires confirm=True. There is no bulk/cascading delete.
  • Not covered (deliberately): WoT Web-of-Things descriptor endpoints (/.well-known/wot, /devops/wot/*), and fine-grained policy sub-resources (subjects/{id}, resources/{path}, imports, token-integration actions) — whole-entry set_policy_entry/get_policy_entries covers the common case. Add these later if you need them.

Configuration

Env varRequiredDescription
DITTO_BASE_URLYesBase URL of the Ditto HTTP API, e.g. http://localhost:8080 or your gateway's public URL.
DITTO_USERNAME / DITTO_PASSWORDNoBasic auth for the Things/Policies/Messages/Search API. Typical for self-hosted Ditto (nginx demo setup uses ditto/ditto).
DITTO_BEARER_TOKENNoBearer token, used instead of Basic auth for the same API. Typical for OAuth2-fronted deployments (e.g. Bosch IoT Things).
DITTO_DEVOPS_USERNAME / DITTO_DEVOPS_PASSWORDNoBasic auth for the separate DevOps/Connections realm (self-hosted default: devops/foobar). Required only for the Connectivity and DevOps tools.

If both DITTO_BEARER_TOKEN and Basic auth credentials are set, the bearer token takes precedence. If neither is set, requests are sent unauthenticated (only works if your Ditto instance allows anonymous/pre-authenticated access).

Running locally

bash
uv syncexport DITTO_BASE_URL=http://localhost:8080export DITTO_USERNAME=dittoexport DITTO_PASSWORD=dittoexport DITTO_DEVOPS_USERNAME=devops    # only needed for connectivity/devops toolsexport DITTO_DEVOPS_PASSWORD=foobaruv run dittomcpserver.py

See mcp.json for ready-to-use client configs (stdio and Docker).

Testing against a real Ditto instance

This repo's design principles call for testing against a real instance rather than mocks. docker-compose.yml (adapted from Ditto's official example, trimmed to the services this connector needs) spins up a full local Ditto stack — MongoDB, the Ditto microservices, and an nginx front door with Basic auth.

bash
docker compose up -d       # start Ditto on http://localhost:8080 (user: ditto / pass: ditto; devops: devops / foobar)uv run pytest -v           # tests/conftest.py also starts/stops the stack automaticallydocker compose down        # stop it manually if you started it yourself

The 47 tests cover every tool group (things, attributes/features, messages, policies, connectivity, devops, live events) against this real stack, including delete/confirm gating and create/overwrite gating.

A note on the live-events approximation

poll_thing_changes opens Ditto's SSE change feed for a bounded window instead of holding a persistent subscription (which doesn't map cleanly onto a single MCP tool call). Ditto's SSE stream sends periodic empty data: keepalive lines even when nothing has changed — the tool checks its deadline on every line received, including keepalives, so it reliably returns within duration_seconds regardless of how chatty or quiet the stream is.

License notes

docker-compose.yml and the files under docker/ are adapted from the Eclipse Ditto project (EPL-2.0) and are used here only to spin up a local test instance — they are not part of the MCP server itself.

来源:eclipse-ditto/README.md,提交 5a985b6

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Ditto 集成