unique-sdk 2026.44.0.dev1__tar.gz → 2026.44.0.dev2__tar.gz

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.
Files changed (91) hide show
  1. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/PKG-INFO +1 -1
  2. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/pyproject.toml +1 -1
  3. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_mcp.py +77 -0
  4. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_space.py +89 -1
  5. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/README.md +0 -0
  6. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/__init__.py +0 -0
  7. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_api_requestor.py +0 -0
  8. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_api_resource.py +0 -0
  9. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_api_version.py +0 -0
  10. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_error.py +0 -0
  11. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_http_client.py +0 -0
  12. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_list_object.py +0 -0
  13. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_object_classes.py +0 -0
  14. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_request_options.py +0 -0
  15. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_unique_object.py +0 -0
  16. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_unique_ql.py +0 -0
  17. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_unique_response.py +0 -0
  18. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_util.py +0 -0
  19. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_version.py +0 -0
  20. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/_webhook.py +0 -0
  21. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/__init__.py +0 -0
  22. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_acronyms.py +0 -0
  23. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_agentic_table.py +0 -0
  24. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_analytics_order.py +0 -0
  25. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_benchmarking.py +0 -0
  26. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_briefing.py +0 -0
  27. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_chat_completion.py +0 -0
  28. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_content.py +0 -0
  29. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_context_memory.py +0 -0
  30. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_elicitation.py +0 -0
  31. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_embedding.py +0 -0
  32. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_event.py +0 -0
  33. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_folder.py +0 -0
  34. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_group.py +0 -0
  35. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_integrated.py +0 -0
  36. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_llm_models.py +0 -0
  37. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_message.py +0 -0
  38. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_message_assessment.py +0 -0
  39. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_message_execution.py +0 -0
  40. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_message_log.py +0 -0
  41. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_message_tool.py +0 -0
  42. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_module.py +0 -0
  43. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  44. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_search.py +0 -0
  45. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_search_string.py +0 -0
  46. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  47. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_user.py +0 -0
  48. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/api_resources/_web_search.py +0 -0
  49. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/__init__.py +0 -0
  50. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/__main__.py +0 -0
  51. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/cli.py +0 -0
  52. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/__init__.py +0 -0
  53. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  54. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/agentic_table.py +0 -0
  55. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/agentic_table_write.py +0 -0
  56. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/browser.py +0 -0
  57. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/elicitation.py +0 -0
  59. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/files.py +0 -0
  60. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/folders.py +0 -0
  61. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/mcp.py +0 -0
  62. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/navigation.py +0 -0
  63. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/read.py +0 -0
  64. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  65. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/search.py +0 -0
  66. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/subagent.py +0 -0
  67. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/web_search.py +0 -0
  68. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/commands/web_search_config.py +0 -0
  69. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/config.py +0 -0
  70. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/formatting.py +0 -0
  71. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/identity.py +0 -0
  72. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/metadata_filter.py +0 -0
  73. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/shell.py +0 -0
  74. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-agentic-table/SKILL.md +0 -0
  75. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  76. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  77. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  78. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  79. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  80. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  81. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-uploaded-search/SKILL.md +0 -0
  82. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  83. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/state.py +0 -0
  84. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/cli/workspace.py +0 -0
  85. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/analytics_order_run.py +0 -0
  86. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/benchmarking_run.py +0 -0
  87. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/chat_history.py +0 -0
  88. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/chat_in_space.py +0 -0
  89. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/file_io.py +0 -0
  90. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/sources.py +0 -0
  91. {unique_sdk-2026.44.0.dev1 → unique_sdk-2026.44.0.dev2}/unique_sdk/utils/token.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-sdk
3
- Version: 2026.44.0.dev1
3
+ Version: 2026.44.0.dev2
4
4
  Summary:
5
5
  Author: Martin Fadler, Konstantin Krauss, Andreas Hauri
6
6
  Author-email: Martin Fadler <martin.fadler@unique.ch>, Konstantin Krauss <konstantin@unique.ch>, Andreas Hauri <andreas@unique.ch>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_sdk"
3
- version = "2026.44.0.dev1"
3
+ version = "2026.44.0.dev2"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -46,6 +46,29 @@ class CallToolContentDto(TypedDict):
46
46
  ] # For type: "resource"
47
47
 
48
48
 
49
+ class McpServerToolDto(TypedDict):
50
+ """A tool of an MCP server that the company has enabled."""
51
+
52
+ name: str
53
+ description: str | None
54
+
55
+
56
+ class McpServerDto(TypedDict):
57
+ """An MCP server (connector) of the company that can be attached to a space."""
58
+
59
+ id: str
60
+ name: str
61
+ description: str | None
62
+ requiresOAuth: bool
63
+ isSpaceRestricted: bool
64
+ allowedSpaceIds: list[str]
65
+ tools: list[McpServerToolDto]
66
+
67
+
68
+ class McpServersResponse(TypedDict):
69
+ mcpServers: list[McpServerDto]
70
+
71
+
49
72
  class MCP(APIResource["MCP"]):
50
73
  @classproperty
51
74
  def OBJECT_NAME(cls) -> Literal["mcp.call_tool"]:
@@ -128,3 +151,57 @@ class MCP(APIResource["MCP"]):
128
151
  params=params,
129
152
  ),
130
153
  )
154
+
155
+ @classmethod
156
+ def list_servers(
157
+ cls,
158
+ user_id: str,
159
+ company_id: str,
160
+ ) -> McpServersResponse:
161
+ """
162
+ List the company's MCP servers that can be attached to a space, with their
163
+ tools. Never returns server URLs or credentials.
164
+
165
+ Args:
166
+ user_id: The ID of the user making the request
167
+ company_id: The ID of the company
168
+
169
+ Returns:
170
+ McpServersResponse: The servers, sorted by name
171
+ """
172
+ return cast(
173
+ McpServersResponse,
174
+ cls._static_request(
175
+ "get",
176
+ "/mcp/servers",
177
+ user_id,
178
+ company_id,
179
+ ),
180
+ )
181
+
182
+ @classmethod
183
+ async def list_servers_async(
184
+ cls,
185
+ user_id: str,
186
+ company_id: str,
187
+ ) -> McpServersResponse:
188
+ """
189
+ Asynchronously list the company's MCP servers that can be attached to a space,
190
+ with their tools. Never returns server URLs or credentials.
191
+
192
+ Args:
193
+ user_id: The ID of the user making the request
194
+ company_id: The ID of the company
195
+
196
+ Returns:
197
+ McpServersResponse: The servers, sorted by name
198
+ """
199
+ return cast(
200
+ McpServersResponse,
201
+ await cls._static_request_async(
202
+ "get",
203
+ "/mcp/servers",
204
+ user_id,
205
+ company_id,
206
+ ),
207
+ )
@@ -19,7 +19,11 @@ class Space(APIResource["Space"]):
19
19
  return "space"
20
20
 
21
21
  UiType: TypeAlias = Literal[
22
- "MAGIC_TABLE", "UNIQUE_CUSTOM", "TRANSLATION", "UNIQUE_AI"
22
+ "MAGIC_TABLE",
23
+ "UNIQUE_CUSTOM",
24
+ "TRANSLATION",
25
+ "UNIQUE_AI",
26
+ "SWAPPABLE_INTELLIGENCE",
23
27
  ]
24
28
 
25
29
  class ModuleParams(TypedDict):
@@ -57,6 +61,24 @@ class Space(APIResource["Space"]):
57
61
  isExclusive: bool
58
62
  configuration: dict[str, Any]
59
63
 
64
+ class McpServerToolParams(TypedDict):
65
+ name: str
66
+ isEnabled: bool
67
+
68
+ class McpServerParams(TypedDict):
69
+ """
70
+ An MCP server (connector) to attach to a space.
71
+
72
+ Only listed servers change. ``tools`` is the complete selection for the server:
73
+ listed tools take ``isEnabled``, unlisted tools are disabled, and an empty list
74
+ disables the server for the space. Omit ``tools`` to enable every callable tool.
75
+ Applied after MCP tool entries in module configurations, so it wins for a server
76
+ that appears in both. Use ``MCP.list_servers`` for the ids and tool names.
77
+ """
78
+
79
+ mcpServerId: str
80
+ tools: NotRequired[list["Space.McpServerToolParams"] | None]
81
+
60
82
  class CreateSpaceParams(RequestOptions):
61
83
  name: str
62
84
  fallbackModule: str
@@ -77,6 +99,7 @@ class Space(APIResource["Space"]):
77
99
  isSubAgent: NotRequired[bool | None]
78
100
  subAgentSettings: NotRequired["Space.SubAgentSettings | None"]
79
101
  subAgentIds: NotRequired[list[str] | None]
102
+ mcpServers: NotRequired[list["Space.McpServerParams"] | None]
80
103
 
81
104
  class UpdateParams(RequestOptions):
82
105
  name: NotRequired[str | None]
@@ -98,6 +121,7 @@ class Space(APIResource["Space"]):
98
121
  isSubAgent: NotRequired[bool | None]
99
122
  subAgentSettings: NotRequired["Space.SubAgentSettings | None"]
100
123
  subAgentIds: NotRequired[list[str] | None]
124
+ mcpServers: NotRequired[list["Space.McpServerParams"] | None]
101
125
 
102
126
  class AccessEntry(TypedDict):
103
127
  entityId: str
@@ -261,6 +285,10 @@ class Space(APIResource["Space"]):
261
285
  messages: list["Space.Message"]
262
286
  totalCount: int
263
287
 
288
+ class McpServerTool(TypedDict):
289
+ name: str
290
+ isEnabled: bool
291
+
264
292
  class McpServer(TypedDict):
265
293
  """
266
294
  Represents an MCP server associated with a space.
@@ -271,9 +299,27 @@ class Space(APIResource["Space"]):
271
299
  assistantId: str
272
300
  mcpServerId: str
273
301
  isEnabled: bool
302
+ tools: NotRequired[list["Space.McpServerTool"]]
274
303
  createdAt: str
275
304
  updatedAt: str
276
305
 
306
+ class McpServerStatus(TypedDict):
307
+ """
308
+ The calling user's own state for an MCP server enabled on a space.
309
+ """
310
+
311
+ mcpServerId: str
312
+ name: str
313
+ isEnabled: bool
314
+ requiresOAuth: bool
315
+ isOAuth2Connected: bool
316
+ oauth2Url: str | None
317
+ enabledToolNames: list[str]
318
+
319
+ class McpServerStatusResponse(TypedDict):
320
+ spaceId: str
321
+ mcpServers: list["Space.McpServerStatus"]
322
+
277
323
  class Module(TypedDict):
278
324
  """
279
325
  Represents a module configured for a space.
@@ -911,3 +957,45 @@ class Space(APIResource["Space"]):
911
957
  params=params,
912
958
  ),
913
959
  )
960
+
961
+ @classmethod
962
+ def get_mcp_server_status(
963
+ cls,
964
+ user_id: str,
965
+ company_id: str,
966
+ space_id: str,
967
+ ) -> "Space.McpServerStatusResponse":
968
+ """
969
+ Get the MCP servers enabled on a space with the calling user's own OAuth
970
+ connection state (``isOAuth2Connected``, ``oauth2Url``).
971
+ """
972
+ return cast(
973
+ "Space.McpServerStatusResponse",
974
+ cls._static_request(
975
+ "get",
976
+ f"/space/{space_id}/mcp-servers/status",
977
+ user_id,
978
+ company_id,
979
+ ),
980
+ )
981
+
982
+ @classmethod
983
+ async def get_mcp_server_status_async(
984
+ cls,
985
+ user_id: str,
986
+ company_id: str,
987
+ space_id: str,
988
+ ) -> "Space.McpServerStatusResponse":
989
+ """
990
+ Async get the MCP servers enabled on a space with the calling user's own OAuth
991
+ connection state (``isOAuth2Connected``, ``oauth2Url``).
992
+ """
993
+ return cast(
994
+ "Space.McpServerStatusResponse",
995
+ await cls._static_request_async(
996
+ "get",
997
+ f"/space/{space_id}/mcp-servers/status",
998
+ user_id,
999
+ company_id,
1000
+ ),
1001
+ )