xovis-sdk 1.0.0-a13 → 1.0.0-a15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,13 +56,3 @@ jobs:
56
56
  # Node 24 & npm v11 automatically generate provenance and handle OIDC natively.
57
57
  # No tokens are needed! We must specify '--tag next' when publishing prereleases to the registry.
58
58
  run: npm publish --access public --tag next
59
-
60
- # ==========================================
61
- # 3. SMITHERY MCP REGISTRY PUBLISH
62
- # ==========================================
63
- - name: Publish to Smithery MCP Registry
64
- # Dispatches the unified compilation payload to the Smithery indexing plane.
65
- # This securely bridges our layer translations directly onto their consumer routing catalog.
66
- run: npm run smithery:publish
67
- env:
68
- SMITHERY_API_KEY: ${{ secrets.SMITHERY_API_KEY }}
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  | **Core SDK** | **Integrations** | **Agentic Layer** |
6
6
  |:---:|:---:|:---:|
7
- | [![PyPI version](https://badge.fury.io/py/xovis-sdk.svg)](https://pypi.org/project/xovis-sdk/1.0.0a13/) | [![Smithery: Verified](https://img.shields.io/badge/Smithery-Placeholder-orange)](https://smithery.ai/server/xovis-sdk) | [![MCP Ready](https://img.shields.io/badge/MCP-Ready-5B32A8.svg?logo=server&logoColor=white)](https://modelcontextprotocol.io/) |
7
+ | [![PyPI version](https://badge.fury.io/py/xovis-sdk.svg)](https://pypi.org/project/xovis-sdk/1.0.0a15/) | [![Smithery: Verified](https://img.shields.io/badge/Smithery-Placeholder-orange)](https://smithery.ai/server/xovis-sdk) | [![MCP Ready](https://img.shields.io/badge/MCP-Ready-5B32A8.svg?logo=server&logoColor=white)](https://modelcontextprotocol.io/) |
8
8
  | [![GitHub](https://img.shields.io/badge/GitHub-xovis--sdk-181717?logo=github)](https://github.com/xovis-open-sdk/xovis-sdk) | [![OpenAI Compatible](https://img.shields.io/badge/OpenAI-Compatible-412991.svg?logo=openai&logoColor=white)](https://openai.com/) | [![LangGraph Ready](https://img.shields.io/badge/LangGraph-Ready-1C3C3C.svg?logo=langchain&logoColor=white)](https://langchain.com/) |
9
9
  | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) | [![Anthropic Compatible](https://img.shields.io/badge/Anthropic-Compatible-D2B8A3.svg?logo=anthropic&logoColor=black)](https://www.anthropic.com/) | [![CrewAI Ready](https://img.shields.io/badge/CrewAI-Ready-FF4B4B.svg?logo=google-cloud&logoColor=white)](https://crewai.com/) |
10
10
  | [![npm version](https://badge.fury.io/js/xovis-sdk.svg)](https://badge.fury.io/js/xovis-sdk) | [![Smithery: Install](https://img.shields.io/badge/Smithery-Install--Pending-white)](https://smithery.ai/server/xovis-sdk) | [![Cursor Optimized](https://img.shields.io/badge/Cursor-Optimized-000000.svg?logo=python&logoColor=white)](https://cursor.sh/) |
package/docs/index.md CHANGED
@@ -5,7 +5,7 @@ Welcome to the **xovis-sdk** documentation. This is an enterprise-grade, high-pe
5
5
  Compliance Note: This project is an independent, open-source initiative. It is not officially affiliated with, maintained by, or endorsed by Xovis AG.
6
6
 
7
7
  [![GitHub](https://img.shields.io/badge/GitHub-xovis--sdk-181717?logo=github)](https://github.com/xovis-open-sdk/xovis-sdk)
8
- [![PyPI](https://img.shields.io/pypi/v/xovis-sdk?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/xovis-sdk/1.0.0a13/)
8
+ [![PyPI](https://img.shields.io/pypi/v/xovis-sdk?color=blue&logo=pypi&logoColor=white)](https://pypi.org/project/xovis-sdk/1.0.0a15/)
9
9
 
10
10
 
11
11
  [![MCP Ready](https://img.shields.io/badge/MCP-Ready-5B32A8.svg?logo=server&logoColor=white)](https://modelcontextprotocol.io/)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xovis-sdk",
3
- "version": "1.0.0a13",
3
+ "version": "1.0.0a15",
4
4
  "description": "Unofficial Xovis Hardware integration via MCP. Features zero-trust format-preserving pseudonymization (AIPrivacySession) and human-in-the-loop safety guardrails (XovisSafetyGuardrail) for critical operations.",
5
5
  "keywords": [
6
6
  "xovis",
@@ -25,8 +25,7 @@
25
25
  "scripts": {
26
26
  "test": "echo \"Error: no test specified\" && exit 1",
27
27
  "sync-docs": "python scripts/sync_project_structure.py",
28
- "smithery:login": "npx @smithery/cli@latest auth login",
29
- "smithery:publish": "npx @smithery/cli@latest mcp publish https://github.com/xovis-open-sdk/xovis-sdk -n @xovis-sdk/xovis-mcp"
28
+ "smithery:login": "npx @smithery/cli@latest auth login"
30
29
  }
31
30
  }
32
31
 
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "xovis-sdk"
7
- version = "1.0.0a13"
7
+ version = "1.0.0a15"
8
8
  description = "Enterprise-grade integration SDK for Xovis 3D Sensors, Spiders and HUB."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
package/smithery.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  name: xovis-mcp
2
2
  displayName: Xovis SDK MCP Server
3
3
  description: Unofficial Xovis Hardware integration via MCP. Features zero-trust format-preserving pseudonymization (AIPrivacySession) and human-in-the-loop safety guardrails (XovisSafetyGuardrail) for critical operations.
4
- version: 1.0.0a13
4
+ version: 1.0.0a15
5
5
  homepage: https://github.com/xovis-open-sdk/xovis-sdk
6
6
  category: Data
7
7
  categories:
@@ -48,7 +48,7 @@ startCommand:
48
48
  command: 'uvx',
49
49
  args: [
50
50
  '-q',
51
- '--from', 'xovis-sdk[mcp]==1.0.0a13',
51
+ '--from', 'xovis-sdk[mcp]==1.0.0a15',
52
52
  'xovis-mcp'
53
53
  ],
54
54
  env: {
@@ -49,6 +49,42 @@ def _get_active_client_context() -> Union[DeviceClient, HubClient]:
49
49
  )
50
50
 
51
51
 
52
+ def _normalize_schema(schema: Any) -> Any:
53
+ """
54
+ Recursively normalizes Pydantic JSON schemas to strict Draft 7 format required by Anthropic/Smithery.
55
+ Strips 'anyOf' and enforces strict 'type' parameters.
56
+ """
57
+ if isinstance(schema, dict):
58
+ if "anyOf" in schema:
59
+ types = []
60
+ for sub in schema.pop("anyOf"):
61
+ if isinstance(sub, dict) and "type" in sub:
62
+ if isinstance(sub["type"], list):
63
+ types.extend(sub["type"])
64
+ else:
65
+ types.append(sub["type"])
66
+ if types:
67
+ types = list(set(types))
68
+ schema["type"] = types[0] if len(types) == 1 else types
69
+
70
+ # Ensure all object properties have a type if they are properties
71
+ if "properties" in schema and isinstance(schema["properties"], dict):
72
+ for prop_name, prop_val in schema["properties"].items():
73
+ if isinstance(prop_val, dict):
74
+ if "type" not in prop_val and "anyOf" not in prop_val and "$ref" not in prop_val:
75
+ prop_val["type"] = "object"
76
+
77
+ # Recurse into all dictionary values
78
+ for key, value in schema.items():
79
+ schema[key] = _normalize_schema(value)
80
+
81
+ elif isinstance(schema, list):
82
+ for i, item in enumerate(schema):
83
+ schema[i] = _normalize_schema(item)
84
+
85
+ return schema
86
+
87
+
52
88
  @server.list_tools()
53
89
  async def handle_list_tools() -> list[Tool]:
54
90
  """
@@ -74,11 +110,14 @@ async def handle_list_tools() -> list[Tool]:
74
110
  if safety_level:
75
111
  description = f"[{safety_level.name}] {description}"
76
112
 
113
+ raw_schema = tool["args_model"].model_json_schema()
114
+ normalized_schema = _normalize_schema(raw_schema)
115
+
77
116
  mcp_tools.append(
78
117
  Tool(
79
118
  name=tool["name"],
80
119
  description=description,
81
- inputSchema=tool["args_model"].model_json_schema(),
120
+ inputSchema=normalized_schema,
82
121
  )
83
122
  )
84
123
  return mcp_tools
package/uv.lock CHANGED
@@ -4465,7 +4465,7 @@ wheels = [
4465
4465
 
4466
4466
  [[package]]
4467
4467
  name = "xovis-sdk"
4468
- version = "1.0.0a13"
4468
+ version = "1.0.0a15"
4469
4469
  source = { editable = "." }
4470
4470
  dependencies = [
4471
4471
  { name = "aiomqtt" },