entryscape 1.3.0__tar.gz → 1.3.1__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 (135) hide show
  1. {entryscape-1.3.0 → entryscape-1.3.1}/PKG-INFO +5 -236
  2. {entryscape-1.3.0 → entryscape-1.3.1}/README.md +3 -234
  3. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/__init__.py +3 -3
  4. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/app_token_api.py +2 -2
  5. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/auth_api.py +2 -2
  6. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/catalog_api.py +2 -2
  7. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/contact_api.py +2 -2
  8. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/dataservice_api.py +2 -2
  9. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/dataset_api.py +2 -2
  10. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/distribution_api.py +2 -2
  11. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/document_api.py +2 -2
  12. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/idea_api.py +2 -2
  13. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/job_api.py +2 -2
  14. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_api.py +2 -2
  15. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_class_api.py +2 -2
  16. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_diagram_api.py +2 -2
  17. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_field_api.py +2 -2
  18. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_form_api.py +2 -2
  19. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_namespace_api.py +2 -2
  20. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/model_property_api.py +2 -2
  21. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/organization_api.py +2 -2
  22. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/search_api.py +2 -2
  23. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/showcase_api.py +2 -2
  24. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/suggestion_api.py +2 -2
  25. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/terminology_api.py +2 -2
  26. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/upload_api.py +2 -2
  27. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api_client.py +3 -3
  28. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/configuration.py +4 -4
  29. entryscape-1.3.1/entryscape/exceptions.py +222 -0
  30. entryscape-1.3.1/entryscape/models/__init__.py +71 -0
  31. entryscape-1.3.1/entryscape/models/app_token.py +156 -0
  32. entryscape-1.3.1/entryscape/models/app_token_create_request.py +98 -0
  33. entryscape-1.3.1/entryscape/models/app_token_create_response.py +169 -0
  34. entryscape-1.3.1/entryscape/models/app_token_status.py +35 -0
  35. entryscape-1.3.1/entryscape/models/app_token_verify_request.py +109 -0
  36. entryscape-1.3.1/entryscape/models/entity_list_item.py +175 -0
  37. entryscape-1.3.1/entryscape/models/entity_list_response.py +139 -0
  38. entryscape-1.3.1/entryscape/models/entity_reference.py +189 -0
  39. entryscape-1.3.1/entryscape/models/entity_type.py +57 -0
  40. entryscape-1.3.1/entryscape/models/error.py +135 -0
  41. entryscape-1.3.1/entryscape/models/facet_field.py +115 -0
  42. entryscape-1.3.1/entryscape/models/facet_field_values_inner.py +100 -0
  43. entryscape-1.3.1/entryscape/models/facet_list.py +113 -0
  44. entryscape-1.3.1/entryscape/models/facet_list_available_inner.py +107 -0
  45. entryscape-1.3.1/entryscape/models/job_response.py +112 -0
  46. entryscape-1.3.1/entryscape/models/job_status.py +189 -0
  47. entryscape-1.3.1/entryscape/models/job_status_progress.py +100 -0
  48. entryscape-1.3.1/entryscape/models/job_status_value.py +37 -0
  49. entryscape-1.3.1/entryscape/models/job_type.py +37 -0
  50. entryscape-1.3.1/entryscape/models/list_catalogs_entry_type_parameter.py +37 -0
  51. entryscape-1.3.1/entryscape/models/list_catalogs_graph_type_parameter.py +44 -0
  52. entryscape-1.3.1/entryscape/models/list_catalogs_resource_type_parameter.py +37 -0
  53. entryscape-1.3.1/entryscape/models/login_request.py +108 -0
  54. entryscape-1.3.1/entryscape/models/login_response.py +115 -0
  55. entryscape-1.3.1/entryscape/models/metadata_format.py +38 -0
  56. entryscape-1.3.1/entryscape/models/metadata_request.py +99 -0
  57. entryscape-1.3.1/entryscape/models/parent_reference.py +130 -0
  58. entryscape-1.3.1/entryscape/models/search_request.py +158 -0
  59. entryscape-1.3.1/entryscape/models/search_request_filters.py +144 -0
  60. entryscape-1.3.1/entryscape/models/search_request_filters_graph_type.py +44 -0
  61. entryscape-1.3.1/entryscape/models/search_request_filters_resource_type.py +37 -0
  62. entryscape-1.3.1/entryscape/models/search_request_sort.py +38 -0
  63. entryscape-1.3.1/entryscape/models/search_request_sort_order.py +35 -0
  64. entryscape-1.3.1/entryscape/models/search_response.py +175 -0
  65. entryscape-1.3.1/entryscape/models/search_result.py +175 -0
  66. entryscape-1.3.1/entryscape/models/search_result_graph_type.py +44 -0
  67. entryscape-1.3.1/entryscape/models/search_result_resource_type.py +37 -0
  68. entryscape-1.3.1/entryscape/models/search_sort_order_parameter.py +35 -0
  69. entryscape-1.3.1/entryscape/models/terminology_import_mode.py +35 -0
  70. entryscape-1.3.1/entryscape/models/validation_profile.py +36 -0
  71. entryscape-1.3.1/entryscape/models/validation_response.py +149 -0
  72. entryscape-1.3.1/entryscape/models/validation_result.py +162 -0
  73. entryscape-1.3.1/entryscape/models/validation_severity.py +36 -0
  74. entryscape-1.3.1/entryscape/models/validation_summary.py +122 -0
  75. entryscape-1.3.1/entryscape/models/whoami_response.py +104 -0
  76. entryscape-1.3.1/entryscape/rest.py +210 -0
  77. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape.egg-info/PKG-INFO +5 -236
  78. {entryscape-1.3.0 → entryscape-1.3.1}/pyproject.toml +4 -2
  79. entryscape-1.3.0/entryscape/exceptions.py +0 -222
  80. entryscape-1.3.0/entryscape/models/__init__.py +0 -71
  81. entryscape-1.3.0/entryscape/models/app_token.py +0 -156
  82. entryscape-1.3.0/entryscape/models/app_token_create_request.py +0 -98
  83. entryscape-1.3.0/entryscape/models/app_token_create_response.py +0 -169
  84. entryscape-1.3.0/entryscape/models/app_token_status.py +0 -35
  85. entryscape-1.3.0/entryscape/models/app_token_verify_request.py +0 -109
  86. entryscape-1.3.0/entryscape/models/entity_list_item.py +0 -175
  87. entryscape-1.3.0/entryscape/models/entity_list_response.py +0 -139
  88. entryscape-1.3.0/entryscape/models/entity_reference.py +0 -189
  89. entryscape-1.3.0/entryscape/models/entity_type.py +0 -57
  90. entryscape-1.3.0/entryscape/models/error.py +0 -135
  91. entryscape-1.3.0/entryscape/models/facet_field.py +0 -115
  92. entryscape-1.3.0/entryscape/models/facet_field_values_inner.py +0 -100
  93. entryscape-1.3.0/entryscape/models/facet_list.py +0 -113
  94. entryscape-1.3.0/entryscape/models/facet_list_available_inner.py +0 -107
  95. entryscape-1.3.0/entryscape/models/job_response.py +0 -112
  96. entryscape-1.3.0/entryscape/models/job_status.py +0 -189
  97. entryscape-1.3.0/entryscape/models/job_status_progress.py +0 -100
  98. entryscape-1.3.0/entryscape/models/job_status_value.py +0 -37
  99. entryscape-1.3.0/entryscape/models/job_type.py +0 -37
  100. entryscape-1.3.0/entryscape/models/list_catalogs_entry_type_parameter.py +0 -37
  101. entryscape-1.3.0/entryscape/models/list_catalogs_graph_type_parameter.py +0 -44
  102. entryscape-1.3.0/entryscape/models/list_catalogs_resource_type_parameter.py +0 -37
  103. entryscape-1.3.0/entryscape/models/login_request.py +0 -108
  104. entryscape-1.3.0/entryscape/models/login_response.py +0 -115
  105. entryscape-1.3.0/entryscape/models/metadata_format.py +0 -38
  106. entryscape-1.3.0/entryscape/models/metadata_request.py +0 -99
  107. entryscape-1.3.0/entryscape/models/parent_reference.py +0 -130
  108. entryscape-1.3.0/entryscape/models/search_request.py +0 -158
  109. entryscape-1.3.0/entryscape/models/search_request_filters.py +0 -144
  110. entryscape-1.3.0/entryscape/models/search_request_filters_graph_type.py +0 -44
  111. entryscape-1.3.0/entryscape/models/search_request_filters_resource_type.py +0 -37
  112. entryscape-1.3.0/entryscape/models/search_request_sort.py +0 -38
  113. entryscape-1.3.0/entryscape/models/search_request_sort_order.py +0 -35
  114. entryscape-1.3.0/entryscape/models/search_response.py +0 -175
  115. entryscape-1.3.0/entryscape/models/search_result.py +0 -175
  116. entryscape-1.3.0/entryscape/models/search_result_graph_type.py +0 -44
  117. entryscape-1.3.0/entryscape/models/search_result_resource_type.py +0 -37
  118. entryscape-1.3.0/entryscape/models/search_sort_order_parameter.py +0 -35
  119. entryscape-1.3.0/entryscape/models/terminology_import_mode.py +0 -35
  120. entryscape-1.3.0/entryscape/models/validation_profile.py +0 -36
  121. entryscape-1.3.0/entryscape/models/validation_response.py +0 -149
  122. entryscape-1.3.0/entryscape/models/validation_result.py +0 -162
  123. entryscape-1.3.0/entryscape/models/validation_severity.py +0 -36
  124. entryscape-1.3.0/entryscape/models/validation_summary.py +0 -122
  125. entryscape-1.3.0/entryscape/models/whoami_response.py +0 -104
  126. entryscape-1.3.0/entryscape/rest.py +0 -210
  127. {entryscape-1.3.0 → entryscape-1.3.1}/LICENSE.txt +0 -0
  128. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api/__init__.py +0 -0
  129. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/api_response.py +0 -0
  130. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape/py.typed +0 -0
  131. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape.egg-info/SOURCES.txt +0 -0
  132. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape.egg-info/dependency_links.txt +0 -0
  133. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape.egg-info/requires.txt +0 -0
  134. {entryscape-1.3.0 → entryscape-1.3.1}/entryscape.egg-info/top_level.txt +0 -0
  135. {entryscape-1.3.0 → entryscape-1.3.1}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entryscape
3
- Version: 1.3.0
4
- Summary: EntryScape API - Python client for accessing EntryScape data following DCAT-AP standards
3
+ Version: 1.3.1
4
+ Summary: EntryScape API client for Python - provides access to EntryScape data following DCAT-AP standards
5
5
  Author-email: Metasolutions <contact@entryscape.com>
6
6
  License-Expression: LGPL-3.0-or-later
7
7
  Project-URL: Homepage, https://entryscape.com
@@ -45,246 +45,15 @@ Dynamic: license-file
45
45
 
46
46
  # entryscape
47
47
 
48
- This API provides structured access to EntryScape data following DCAT-AP standards.
49
- All entity endpoints follow a consistent pattern:
50
- - GET /{entity} - List all entities
51
- - POST /{entity} - Create a new entity (DCAT types only)
52
- - GET /{entity}/{context_id}/{entry_id} - Get entity reference info
53
- - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only)
54
- - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata
55
- - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough)
56
-
57
- ## Reading and consistency
58
-
59
- Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its
60
- `/metadata` — go straight to the store and always reflect the latest write.
61
-
62
- Lists and search do not. They are answered from a search index that is updated
63
- asynchronously, so for a short interval after a write:
64
-
65
- - an entry that was just created may be missing from the list it belongs to,
66
- while reading it by id already works;
67
- - an entry that was just deleted may still appear;
68
- - `results` counts what the index holds, not what the store holds.
69
-
70
- Write a client that tolerates this: after creating an entry, use the id the
71
- create returned rather than searching for what you just wrote. `results` is
72
- also an upper bound rather than an exact count when the caller cannot read
73
- every hit (see the field's own description).
74
-
75
- Separately, responses are cached for 15 minutes by default, which is a second
76
- and unrelated source of staleness. A write invalidates the cache entries it
77
- affects, but a read that lands in the indexing gap can cache a list that does
78
- not yet show it.
79
-
80
- ## Authentication
81
-
82
- Most endpoints require an authenticated session. Reading public data works
83
- without authentication, while creating, updating, and deleting entities
84
- requires a valid user session.
85
-
86
- 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and
87
- password. The response returns an `auth_token`.
88
- 2. **Send the token** on subsequent requests via the `X-Auth-Token` header.
89
- This is the recommended method for SDK and programmatic access. Browser
90
- clients can instead rely on the `auth_token` cookie, which the server sets
91
- automatically on login (`SameSite=Lax; Secure`).
92
- 3. **Inspect the session** with `GET /auth/whoami`, which returns the current
93
- user or an anonymous/guest identity when no valid token is supplied.
94
- 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the
95
- cookie.
96
-
97
- ### Writes and CSRF
98
-
99
- Send the token as the `X-Auth-Token` **header** and there is nothing else to
100
- do: creates, updates and deletes work as they are, which is how the SDKs and
101
- the MCP server are built.
102
-
103
- The `auth_token` cookie is different. A cookie is attached by the browser
104
- automatically, so a state-changing request authenticated by it alone is what
105
- cross-site request forgery abuses, and those requests additionally need a
106
- double-submit token: read the `XSRF-TOKEN` cookie the server sets on any
107
- response and send its value back as the `X-XSRF-TOKEN` header. Without it the
108
- request is rejected with `403` before it reaches the endpoint.
109
-
110
- A custom header cannot be forged this way — cross-origin JavaScript cannot set
111
- one without a CORS preflight, which this API grants only to configured
112
- origins — so the header is the recommended path for anything that is not a
113
- browser session.
114
-
115
- ### App Tokens
116
-
117
- An app token identifies an integration. Create one with `POST /app-token`
118
- (unauthenticated). Creation requires an email address: the token starts in the
119
- `pending` state and a 6-digit code is emailed to the owner. Confirm the code
120
- with `POST /app-token/verify` to activate the token and receive its value,
121
- which is shown only once — store it securely. `GET /app-token/{app_token_id}`
122
- then returns its details and quota usage, authenticated by the token itself via
123
- the `X-App-Token` header.
124
-
125
- **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.**
126
- No other operation reads it, and the read quota is recorded but not yet
127
- enforced: reading public data needs no token of any kind, and sending an app
128
- token with a read neither grants nor meters anything. Metered public read
129
- access is the intent of the two-token model, not a description of this release
130
- — see the `security` declared on each operation for what it actually accepts.
131
-
132
- ## SDKs
133
-
134
- Generated clients for Python, TypeScript, JavaScript and C# wrap every
135
- operation below, and each operation on this page shows the SDK call beside
136
- the `curl` command. Two of them install from a public registry:
137
-
138
- ```
139
- pip install entryscape # Python
140
- npm install @entryscape/api-client # TypeScript and JavaScript
141
- ```
142
-
143
- `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and
144
- `require()` both work and TypeScript is not required to use it — the name
145
- describes what it is written in, not what you have to write. There is a
146
- separate generated JavaScript SDK, and it is deliberately **not** on npm;
147
- this package is the npm client for both languages.
148
-
149
- Every SDK, including the C# and JavaScript ones, is also published as a
150
- tarball. The downloads are linked in the sidebar, they are the route to take
151
- when a registry is unreachable or a build has to vendor its dependencies, and
152
- each archive carries the SDK's own README:
153
-
154
- - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`.
155
- - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or
156
- `typescript-sdk.tar.gz`.
157
- - **JavaScript (the separate generated client)** — not published to a
158
- registry, by design; `javascript-sdk.tar.gz` only.
159
- - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only.
160
- - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`.
161
-
162
- ## MCP Server
163
-
164
- A Model Context Protocol (MCP) server is generated from this specification and
165
- published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as
166
- tools for AI assistants and agents. Each operation becomes one tool named after
167
- its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`.
168
- The `auth` operations are the exception: the server reads its token once at
169
- startup, so a `login` tool could install nothing and a `logout` tool would only
170
- invalidate the token the server was started with. On connect the server also
171
- hands the assistant a short set of rules that hold across every tool: a token is
172
- bound to one EntryStore instance, the search index lags a write, uploads finish
173
- as jobs.
174
-
175
- ### Install
176
-
177
- The server is on npm, and MCP servers are normally launched straight from
178
- there, so nothing has to be installed first:
179
-
180
- ```
181
- npx -y @entryscape/mcp-server
182
- ```
183
-
184
- `npm install -g @entryscape/mcp-server` works too and puts an
185
- `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as
186
- `com.entryscape/mcp-server`, which is where clients and marketplaces look it
187
- up.
188
-
189
- Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack
190
- it. The package ships prebuilt; install its runtime dependency once:
191
-
192
- ```
193
- mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp
194
- cd entryscape-mcp && npm install --omit=dev
195
- ```
196
-
197
- ### Configure
198
-
199
- The server is a stdio MCP server configured through environment variables,
200
- read once at startup:
201
-
202
- - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required:
203
- there is no default, and the server refuses to start without it.
204
- - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as
205
- the `X-Auth-Token` header. Optional: without it reads see public entries and
206
- every write is refused. A token is valid only for the EntryStore instance
207
- that issued it.
208
- - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should
209
- use, for example `dev.entryscape.com/store/`. Unset means the API server's
210
- own default.
211
- - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files
212
- from. **Unset means uploads are disabled**: `addFileToDistribution`,
213
- `replaceFileInDistribution` and `importTerminology` refuse and say so.
214
- - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example
215
- `catalog,dataset,distribution,search`. Unset serves every tool.
216
-
217
- The package's `README.md` lists the remaining variables (timeouts and size
218
- caps). Register the server with any MCP-capable client by adding it to the
219
- client's `mcpServers` configuration:
220
-
221
- ```json
222
- {
223
- \"mcpServers\": {
224
- \"entryscape\": {
225
- \"command\": \"npx\",
226
- \"args\": [\"-y\", \"@entryscape/mcp-server\"],
227
- \"env\": {
228
- \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\",
229
- \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\"
230
- }
231
- }
232
- }
233
- }
234
- ```
235
-
236
- From an unpacked download instead, the command is
237
- `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`.
238
-
239
- ### Claude Code
240
-
241
- The unpacked package is also a Claude Code plugin, so one install gives the
242
- server and the skills below together. Claude Code installs plugins from
243
- marketplaces, and the package carries a one-entry marketplace pointing at
244
- itself:
245
-
246
- ```
247
- claude plugin marketplace add /path/to/entryscape-mcp
248
- claude plugin install entryscape@entryscape --scope user
249
- ```
250
-
251
- The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`,
252
- `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and
253
- `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in,
254
- so set them there. To try the plugin for one session without installing it,
255
- start Claude Code with `--plugin-dir /path/to/entryscape-mcp`.
256
-
257
- ### Skills
258
-
259
- `skills/` in the package holds procedures that span several tools, in the
260
- Agent Skills format (a `SKILL.md` with `name` and `description`): which tools
261
- to call in which order, what to check between calls, and where to stop. Claude
262
- Code loads them from the plugin; other clients that read the format can be
263
- pointed at the directory. The `find` skill covers discovery, facets and
264
- selective metadata reads; `publish-dataset` takes a dataset from catalog to
265
- validated distribution with its file; `edit-metadata` changes an entry that
266
- already exists without dropping the rest of its graph, models included;
267
- `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner
268
- API. Every tool a skill names is checked against this specification when the
269
- package is built.
270
-
271
- ## Deprecation Policy
272
-
273
- When endpoints or features are deprecated:
274
- 1. The operation is marked with `deprecated: true` in this spec
275
- 2. The operation description documents the replacement endpoint and sunset date
276
- 3. Deprecated endpoints remain functional for at least 6 months after announcement
277
- 4. The server returns a `Sunset` header with the planned removal date
278
- 5. After the sunset date, the endpoint may be removed in a future release
279
-
48
+ EntryScape API client for Python - provides access to EntryScape data following DCAT-AP standards
280
49
 
281
50
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
282
51
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
283
52
 
284
53
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
285
54
 
286
- - API version: 1.3.0
287
- - Package version: 1.3.0
55
+ - API version: 1.3.1
56
+ - Package version: 1.3.1
288
57
  - Generator version: 7.22.0
289
58
 
290
59
  For more information, please visit [https://entryscape.com/en/contact-us/](https://entryscape.com/en/contact-us/)
@@ -1,245 +1,14 @@
1
1
  # entryscape
2
2
 
3
- This API provides structured access to EntryScape data following DCAT-AP standards.
4
- All entity endpoints follow a consistent pattern:
5
- - GET /{entity} - List all entities
6
- - POST /{entity} - Create a new entity (DCAT types only)
7
- - GET /{entity}/{context_id}/{entry_id} - Get entity reference info
8
- - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only)
9
- - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata
10
- - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough)
11
-
12
- ## Reading and consistency
13
-
14
- Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its
15
- `/metadata` — go straight to the store and always reflect the latest write.
16
-
17
- Lists and search do not. They are answered from a search index that is updated
18
- asynchronously, so for a short interval after a write:
19
-
20
- - an entry that was just created may be missing from the list it belongs to,
21
- while reading it by id already works;
22
- - an entry that was just deleted may still appear;
23
- - `results` counts what the index holds, not what the store holds.
24
-
25
- Write a client that tolerates this: after creating an entry, use the id the
26
- create returned rather than searching for what you just wrote. `results` is
27
- also an upper bound rather than an exact count when the caller cannot read
28
- every hit (see the field's own description).
29
-
30
- Separately, responses are cached for 15 minutes by default, which is a second
31
- and unrelated source of staleness. A write invalidates the cache entries it
32
- affects, but a read that lands in the indexing gap can cache a list that does
33
- not yet show it.
34
-
35
- ## Authentication
36
-
37
- Most endpoints require an authenticated session. Reading public data works
38
- without authentication, while creating, updating, and deleting entities
39
- requires a valid user session.
40
-
41
- 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and
42
- password. The response returns an `auth_token`.
43
- 2. **Send the token** on subsequent requests via the `X-Auth-Token` header.
44
- This is the recommended method for SDK and programmatic access. Browser
45
- clients can instead rely on the `auth_token` cookie, which the server sets
46
- automatically on login (`SameSite=Lax; Secure`).
47
- 3. **Inspect the session** with `GET /auth/whoami`, which returns the current
48
- user or an anonymous/guest identity when no valid token is supplied.
49
- 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the
50
- cookie.
51
-
52
- ### Writes and CSRF
53
-
54
- Send the token as the `X-Auth-Token` **header** and there is nothing else to
55
- do: creates, updates and deletes work as they are, which is how the SDKs and
56
- the MCP server are built.
57
-
58
- The `auth_token` cookie is different. A cookie is attached by the browser
59
- automatically, so a state-changing request authenticated by it alone is what
60
- cross-site request forgery abuses, and those requests additionally need a
61
- double-submit token: read the `XSRF-TOKEN` cookie the server sets on any
62
- response and send its value back as the `X-XSRF-TOKEN` header. Without it the
63
- request is rejected with `403` before it reaches the endpoint.
64
-
65
- A custom header cannot be forged this way — cross-origin JavaScript cannot set
66
- one without a CORS preflight, which this API grants only to configured
67
- origins — so the header is the recommended path for anything that is not a
68
- browser session.
69
-
70
- ### App Tokens
71
-
72
- An app token identifies an integration. Create one with `POST /app-token`
73
- (unauthenticated). Creation requires an email address: the token starts in the
74
- `pending` state and a 6-digit code is emailed to the owner. Confirm the code
75
- with `POST /app-token/verify` to activate the token and receive its value,
76
- which is shown only once — store it securely. `GET /app-token/{app_token_id}`
77
- then returns its details and quota usage, authenticated by the token itself via
78
- the `X-App-Token` header.
79
-
80
- **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.**
81
- No other operation reads it, and the read quota is recorded but not yet
82
- enforced: reading public data needs no token of any kind, and sending an app
83
- token with a read neither grants nor meters anything. Metered public read
84
- access is the intent of the two-token model, not a description of this release
85
- — see the `security` declared on each operation for what it actually accepts.
86
-
87
- ## SDKs
88
-
89
- Generated clients for Python, TypeScript, JavaScript and C# wrap every
90
- operation below, and each operation on this page shows the SDK call beside
91
- the `curl` command. Two of them install from a public registry:
92
-
93
- ```
94
- pip install entryscape # Python
95
- npm install @entryscape/api-client # TypeScript and JavaScript
96
- ```
97
-
98
- `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and
99
- `require()` both work and TypeScript is not required to use it — the name
100
- describes what it is written in, not what you have to write. There is a
101
- separate generated JavaScript SDK, and it is deliberately **not** on npm;
102
- this package is the npm client for both languages.
103
-
104
- Every SDK, including the C# and JavaScript ones, is also published as a
105
- tarball. The downloads are linked in the sidebar, they are the route to take
106
- when a registry is unreachable or a build has to vendor its dependencies, and
107
- each archive carries the SDK's own README:
108
-
109
- - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`.
110
- - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or
111
- `typescript-sdk.tar.gz`.
112
- - **JavaScript (the separate generated client)** — not published to a
113
- registry, by design; `javascript-sdk.tar.gz` only.
114
- - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only.
115
- - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`.
116
-
117
- ## MCP Server
118
-
119
- A Model Context Protocol (MCP) server is generated from this specification and
120
- published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as
121
- tools for AI assistants and agents. Each operation becomes one tool named after
122
- its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`.
123
- The `auth` operations are the exception: the server reads its token once at
124
- startup, so a `login` tool could install nothing and a `logout` tool would only
125
- invalidate the token the server was started with. On connect the server also
126
- hands the assistant a short set of rules that hold across every tool: a token is
127
- bound to one EntryStore instance, the search index lags a write, uploads finish
128
- as jobs.
129
-
130
- ### Install
131
-
132
- The server is on npm, and MCP servers are normally launched straight from
133
- there, so nothing has to be installed first:
134
-
135
- ```
136
- npx -y @entryscape/mcp-server
137
- ```
138
-
139
- `npm install -g @entryscape/mcp-server` works too and puts an
140
- `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as
141
- `com.entryscape/mcp-server`, which is where clients and marketplaces look it
142
- up.
143
-
144
- Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack
145
- it. The package ships prebuilt; install its runtime dependency once:
146
-
147
- ```
148
- mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp
149
- cd entryscape-mcp && npm install --omit=dev
150
- ```
151
-
152
- ### Configure
153
-
154
- The server is a stdio MCP server configured through environment variables,
155
- read once at startup:
156
-
157
- - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required:
158
- there is no default, and the server refuses to start without it.
159
- - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as
160
- the `X-Auth-Token` header. Optional: without it reads see public entries and
161
- every write is refused. A token is valid only for the EntryStore instance
162
- that issued it.
163
- - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should
164
- use, for example `dev.entryscape.com/store/`. Unset means the API server's
165
- own default.
166
- - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files
167
- from. **Unset means uploads are disabled**: `addFileToDistribution`,
168
- `replaceFileInDistribution` and `importTerminology` refuse and say so.
169
- - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example
170
- `catalog,dataset,distribution,search`. Unset serves every tool.
171
-
172
- The package's `README.md` lists the remaining variables (timeouts and size
173
- caps). Register the server with any MCP-capable client by adding it to the
174
- client's `mcpServers` configuration:
175
-
176
- ```json
177
- {
178
- \"mcpServers\": {
179
- \"entryscape\": {
180
- \"command\": \"npx\",
181
- \"args\": [\"-y\", \"@entryscape/mcp-server\"],
182
- \"env\": {
183
- \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\",
184
- \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\"
185
- }
186
- }
187
- }
188
- }
189
- ```
190
-
191
- From an unpacked download instead, the command is
192
- `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`.
193
-
194
- ### Claude Code
195
-
196
- The unpacked package is also a Claude Code plugin, so one install gives the
197
- server and the skills below together. Claude Code installs plugins from
198
- marketplaces, and the package carries a one-entry marketplace pointing at
199
- itself:
200
-
201
- ```
202
- claude plugin marketplace add /path/to/entryscape-mcp
203
- claude plugin install entryscape@entryscape --scope user
204
- ```
205
-
206
- The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`,
207
- `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and
208
- `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in,
209
- so set them there. To try the plugin for one session without installing it,
210
- start Claude Code with `--plugin-dir /path/to/entryscape-mcp`.
211
-
212
- ### Skills
213
-
214
- `skills/` in the package holds procedures that span several tools, in the
215
- Agent Skills format (a `SKILL.md` with `name` and `description`): which tools
216
- to call in which order, what to check between calls, and where to stop. Claude
217
- Code loads them from the plugin; other clients that read the format can be
218
- pointed at the directory. The `find` skill covers discovery, facets and
219
- selective metadata reads; `publish-dataset` takes a dataset from catalog to
220
- validated distribution with its file; `edit-metadata` changes an entry that
221
- already exists without dropping the rest of its graph, models included;
222
- `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner
223
- API. Every tool a skill names is checked against this specification when the
224
- package is built.
225
-
226
- ## Deprecation Policy
227
-
228
- When endpoints or features are deprecated:
229
- 1. The operation is marked with `deprecated: true` in this spec
230
- 2. The operation description documents the replacement endpoint and sunset date
231
- 3. Deprecated endpoints remain functional for at least 6 months after announcement
232
- 4. The server returns a `Sunset` header with the planned removal date
233
- 5. After the sunset date, the endpoint may be removed in a future release
234
-
3
+ EntryScape API client for Python - provides access to EntryScape data following DCAT-AP standards
235
4
 
236
5
  [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
237
6
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
238
7
 
239
8
  This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
240
9
 
241
- - API version: 1.3.0
242
- - Package version: 1.3.0
10
+ - API version: 1.3.1
11
+ - Package version: 1.3.1
243
12
  - Generator version: 7.22.0
244
13
 
245
14
  For more information, please visit [https://entryscape.com/en/contact-us/](https://entryscape.com/en/contact-us/)
@@ -5,16 +5,16 @@
5
5
  """
6
6
  EntryScape API
7
7
 
8
- This API provides structured access to EntryScape data following DCAT-AP standards. All entity endpoints follow a consistent pattern: - GET /{entity} - List all entities - POST /{entity} - Create a new entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id} - Get entity reference info - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough) ## Reading and consistency Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its `/metadata` — go straight to the store and always reflect the latest write. Lists and search do not. They are answered from a search index that is updated asynchronously, so for a short interval after a write: - an entry that was just created may be missing from the list it belongs to, while reading it by id already works; - an entry that was just deleted may still appear; - `results` counts what the index holds, not what the store holds. Write a client that tolerates this: after creating an entry, use the id the create returned rather than searching for what you just wrote. `results` is also an upper bound rather than an exact count when the caller cannot read every hit (see the field's own description). Separately, responses are cached for 15 minutes by default, which is a second and unrelated source of staleness. A write invalidates the cache entries it affects, but a read that lands in the indexing gap can cache a list that does not yet show it. ## Authentication Most endpoints require an authenticated session. Reading public data works without authentication, while creating, updating, and deleting entities requires a valid user session. 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and password. The response returns an `auth_token`. 2. **Send the token** on subsequent requests via the `X-Auth-Token` header. This is the recommended method for SDK and programmatic access. Browser clients can instead rely on the `auth_token` cookie, which the server sets automatically on login (`SameSite=Lax; Secure`). 3. **Inspect the session** with `GET /auth/whoami`, which returns the current user or an anonymous/guest identity when no valid token is supplied. 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the cookie. ### Writes and CSRF Send the token as the `X-Auth-Token` **header** and there is nothing else to do: creates, updates and deletes work as they are, which is how the SDKs and the MCP server are built. The `auth_token` cookie is different. A cookie is attached by the browser automatically, so a state-changing request authenticated by it alone is what cross-site request forgery abuses, and those requests additionally need a double-submit token: read the `XSRF-TOKEN` cookie the server sets on any response and send its value back as the `X-XSRF-TOKEN` header. Without it the request is rejected with `403` before it reaches the endpoint. A custom header cannot be forged this way — cross-origin JavaScript cannot set one without a CORS preflight, which this API grants only to configured origins — so the header is the recommended path for anything that is not a browser session. ### App Tokens An app token identifies an integration. Create one with `POST /app-token` (unauthenticated). Creation requires an email address: the token starts in the `pending` state and a 6-digit code is emailed to the owner. Confirm the code with `POST /app-token/verify` to activate the token and receive its value, which is shown only once — store it securely. `GET /app-token/{app_token_id}` then returns its details and quota usage, authenticated by the token itself via the `X-App-Token` header. **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.** No other operation reads it, and the read quota is recorded but not yet enforced: reading public data needs no token of any kind, and sending an app token with a read neither grants nor meters anything. Metered public read access is the intent of the two-token model, not a description of this release — see the `security` declared on each operation for what it actually accepts. ## SDKs Generated clients for Python, TypeScript, JavaScript and C# wrap every operation below, and each operation on this page shows the SDK call beside the `curl` command. Two of them install from a public registry: ``` pip install entryscape # Python npm install @entryscape/api-client # TypeScript and JavaScript ``` `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and `require()` both work and TypeScript is not required to use it — the name describes what it is written in, not what you have to write. There is a separate generated JavaScript SDK, and it is deliberately **not** on npm; this package is the npm client for both languages. Every SDK, including the C# and JavaScript ones, is also published as a tarball. The downloads are linked in the sidebar, they are the route to take when a registry is unreachable or a build has to vendor its dependencies, and each archive carries the SDK's own README: - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`. - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or `typescript-sdk.tar.gz`. - **JavaScript (the separate generated client)** — not published to a registry, by design; `javascript-sdk.tar.gz` only. - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only. - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`. ## MCP Server A Model Context Protocol (MCP) server is generated from this specification and published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as tools for AI assistants and agents. Each operation becomes one tool named after its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`. The `auth` operations are the exception: the server reads its token once at startup, so a `login` tool could install nothing and a `logout` tool would only invalidate the token the server was started with. On connect the server also hands the assistant a short set of rules that hold across every tool: a token is bound to one EntryStore instance, the search index lags a write, uploads finish as jobs. ### Install The server is on npm, and MCP servers are normally launched straight from there, so nothing has to be installed first: ``` npx -y @entryscape/mcp-server ``` `npm install -g @entryscape/mcp-server` works too and puts an `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as `com.entryscape/mcp-server`, which is where clients and marketplaces look it up. Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack it. The package ships prebuilt; install its runtime dependency once: ``` mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp cd entryscape-mcp && npm install --omit=dev ``` ### Configure The server is a stdio MCP server configured through environment variables, read once at startup: - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required: there is no default, and the server refuses to start without it. - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as the `X-Auth-Token` header. Optional: without it reads see public entries and every write is refused. A token is valid only for the EntryStore instance that issued it. - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should use, for example `dev.entryscape.com/store/`. Unset means the API server's own default. - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files from. **Unset means uploads are disabled**: `addFileToDistribution`, `replaceFileInDistribution` and `importTerminology` refuse and say so. - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example `catalog,dataset,distribution,search`. Unset serves every tool. The package's `README.md` lists the remaining variables (timeouts and size caps). Register the server with any MCP-capable client by adding it to the client's `mcpServers` configuration: ```json { \"mcpServers\": { \"entryscape\": { \"command\": \"npx\", \"args\": [\"-y\", \"@entryscape/mcp-server\"], \"env\": { \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\", \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\" } } } } ``` From an unpacked download instead, the command is `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`. ### Claude Code The unpacked package is also a Claude Code plugin, so one install gives the server and the skills below together. Claude Code installs plugins from marketplaces, and the package carries a one-entry marketplace pointing at itself: ``` claude plugin marketplace add /path/to/entryscape-mcp claude plugin install entryscape@entryscape --scope user ``` The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`, `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in, so set them there. To try the plugin for one session without installing it, start Claude Code with `--plugin-dir /path/to/entryscape-mcp`. ### Skills `skills/` in the package holds procedures that span several tools, in the Agent Skills format (a `SKILL.md` with `name` and `description`): which tools to call in which order, what to check between calls, and where to stop. Claude Code loads them from the plugin; other clients that read the format can be pointed at the directory. The `find` skill covers discovery, facets and selective metadata reads; `publish-dataset` takes a dataset from catalog to validated distribution with its file; `edit-metadata` changes an entry that already exists without dropping the rest of its graph, models included; `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner API. Every tool a skill names is checked against this specification when the package is built. ## Deprecation Policy When endpoints or features are deprecated: 1. The operation is marked with `deprecated: true` in this spec 2. The operation description documents the replacement endpoint and sunset date 3. Deprecated endpoints remain functional for at least 6 months after announcement 4. The server returns a `Sunset` header with the planned removal date 5. After the sunset date, the endpoint may be removed in a future release
8
+ This API provides structured access to EntryScape data following DCAT-AP standards. All entity endpoints follow a consistent pattern: - GET /{entity} - List all entities - POST /{entity} - Create a new entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id} - Get entity reference info - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough) ## Reading and consistency Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its `/metadata` — go straight to the store and always reflect the latest write. Lists and search do not. They are answered from a search index that is updated asynchronously, so for a short interval after a write: - an entry that was just created may be missing from the list it belongs to, while reading it by id already works; - an entry that was just deleted may still appear; - `results` counts what the index holds, not what the store holds. Write a client that tolerates this: after creating an entry, use the id the create returned rather than searching for what you just wrote. `results` is also an upper bound rather than an exact count when the caller cannot read every hit (see the field's own description). Separately, responses are cached for 15 minutes by default, which is a second and unrelated source of staleness. A write invalidates the cache entries it affects, but a read that lands in the indexing gap can cache a list that does not yet show it. ## Naming the EntryStore instance One API host can serve multiple EntryStore instances. By default, requests use the deployment's default instance. To target another configured instance, send its hostname (optionally with a port and base path) as either `entrystore_host` or `X-Entrystore-Host`; the query parameter wins if both are provided. A bare hostname means `/store/`, so `luzern.entryscape.net` and `luzern.entryscape.net/store/` identify the same target. The API deployment must allow the instance. Otherwise it returns `400`; ask the deployment operator to add it rather than trying another spelling. Do not include `https://`, credentials, a query string or a fragment. See [Naming the EntryStore instance](https://docs.entryscape.com/en/api/#naming-the-entrystore-instance) for examples and authentication considerations when switching instances. ## Authentication Most endpoints require an authenticated session. Reading public data works without authentication, while creating, updating, and deleting entities requires a valid user session. 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and password. The response returns an `auth_token`. 2. **Send the token** on subsequent requests via the `X-Auth-Token` header. This is the recommended method for SDK and programmatic access. Browser clients can instead rely on the `auth_token` cookie, which the server sets automatically on login (`SameSite=Lax; Secure`). 3. **Inspect the session** with `GET /auth/whoami`, which returns the current user or an anonymous/guest identity when no valid token is supplied. 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the cookie. ### Writes and CSRF Send the token as the `X-Auth-Token` **header** and there is nothing else to do: creates, updates and deletes work as they are, which is how the SDKs and the MCP server are built. The `auth_token` cookie is different. A cookie is attached by the browser automatically, so a state-changing request authenticated by it alone is what cross-site request forgery abuses, and those requests additionally need a double-submit token: read the `XSRF-TOKEN` cookie the server sets on any response and send its value back as the `X-XSRF-TOKEN` header. Without it the request is rejected with `403` before it reaches the endpoint. A custom header cannot be forged this way — cross-origin JavaScript cannot set one without a CORS preflight, which this API grants only to configured origins — so the header is the recommended path for anything that is not a browser session. ### App Tokens An app token identifies an integration. Create one with `POST /app-token` (unauthenticated). Creation requires an email address: the token starts in the `pending` state and a 6-digit code is emailed to the owner. Confirm the code with `POST /app-token/verify` to activate the token and receive its value, which is shown only once — store it securely. `GET /app-token/{app_token_id}` then returns its details and quota usage, authenticated by the token itself via the `X-App-Token` header. **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.** No other operation reads it, and the read quota is recorded but not yet enforced: reading public data needs no token of any kind, and sending an app token with a read neither grants nor meters anything. Metered public read access is the intent of the two-token model, not a description of this release — see the `security` declared on each operation for what it actually accepts. ## SDKs Generated clients for Python, TypeScript, JavaScript and C# wrap every operation below, and each operation on this page shows the SDK call beside the `curl` command. Two of them install from a public registry: ``` pip install entryscape # Python npm install @entryscape/api-client # TypeScript and JavaScript ``` `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and `require()` both work and TypeScript is not required to use it — the name describes what it is written in, not what you have to write. There is a separate generated JavaScript SDK, and it is deliberately **not** on npm; this package is the npm client for both languages. Every SDK, including the C# and JavaScript ones, is also published as a tarball. The downloads are linked in the sidebar, they are the route to take when a registry is unreachable or a build has to vendor its dependencies, and each archive carries the SDK's own README: - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`. - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or `typescript-sdk.tar.gz`. - **JavaScript (the separate generated client)** — not published to a registry, by design; `javascript-sdk.tar.gz` only. - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only. - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`. ## MCP Server A Model Context Protocol (MCP) server is generated from this specification and published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as tools for AI assistants and agents. Each operation becomes one tool named after its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`. The `auth` operations are the exception: the server reads its token once at startup, so a `login` tool could install nothing and a `logout` tool would only invalidate the token the server was started with. On connect the server also hands the assistant a short set of rules that hold across every tool: a token is bound to one EntryStore instance, the search index lags a write, uploads finish as jobs. ### Install The server is on npm, and MCP servers are normally launched straight from there, so nothing has to be installed first: ``` npx -y @entryscape/mcp-server ``` `npm install -g @entryscape/mcp-server` works too and puts an `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as `com.entryscape/mcp-server`, which is where clients and marketplaces look it up. Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack it. The package ships prebuilt; install its runtime dependency once: ``` mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp cd entryscape-mcp && npm install --omit=dev ``` ### Configure The server is a stdio MCP server configured through environment variables, read once at startup: - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required: there is no default, and the server refuses to start without it. - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as the `X-Auth-Token` header. Optional: without it reads see public entries and every write is refused. A token is valid only for the EntryStore instance that issued it. - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should use, for example `dev.entryscape.com/store/`. Unset means the API server's own default. - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files from. **Unset means uploads are disabled**: `addFileToDistribution`, `replaceFileInDistribution` and `importTerminology` refuse and say so. - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example `catalog,dataset,distribution,search`. Unset serves every tool. The package's `README.md` lists the remaining variables (timeouts and size caps). Register the server with any MCP-capable client by adding it to the client's `mcpServers` configuration: ```json { \"mcpServers\": { \"entryscape\": { \"command\": \"npx\", \"args\": [\"-y\", \"@entryscape/mcp-server\"], \"env\": { \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\", \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\" } } } } ``` From an unpacked download instead, the command is `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`. ### Claude Code The unpacked package is also a Claude Code plugin, so one install gives the server and the skills below together. Claude Code installs plugins from marketplaces, and the package carries a one-entry marketplace pointing at itself: ``` claude plugin marketplace add /path/to/entryscape-mcp claude plugin install entryscape@entryscape --scope user ``` The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`, `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in, so set them there. To try the plugin for one session without installing it, start Claude Code with `--plugin-dir /path/to/entryscape-mcp`. ### Skills `skills/` in the package holds procedures that span several tools, in the Agent Skills format (a `SKILL.md` with `name` and `description`): which tools to call in which order, what to check between calls, and where to stop. Claude Code loads them from the plugin; other clients that read the format can be pointed at the directory. The `find` skill covers discovery, facets and selective metadata reads; `publish-dataset` takes a dataset from catalog to validated distribution with its file; `edit-metadata` changes an entry that already exists without dropping the rest of its graph, models included; `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner API. Every tool a skill names is checked against this specification when the package is built. ## Deprecation Policy When endpoints or features are deprecated: 1. The operation is marked with `deprecated: true` in this spec 2. The operation description documents the replacement endpoint and sunset date 3. Deprecated endpoints remain functional for at least 6 months after announcement 4. The server returns a `Sunset` header with the planned removal date 5. After the sunset date, the endpoint may be removed in a future release
9
9
 
10
- The version of the OpenAPI document: 1.3.0
10
+ The version of the OpenAPI document: 1.3.1
11
11
  Contact: contact@entryscape.com
12
12
  Generated by OpenAPI Generator (https://openapi-generator.tech)
13
13
 
14
14
  Do not edit the class manually.
15
15
  """ # noqa: E501
16
16
 
17
- __version__ = "1.3.0"
17
+ __version__ = "1.3.1"
18
18
 
19
19
  # Define package exports
20
20
  __all__ = [
@@ -1,9 +1,9 @@
1
1
  """
2
2
  EntryScape API
3
3
 
4
- This API provides structured access to EntryScape data following DCAT-AP standards. All entity endpoints follow a consistent pattern: - GET /{entity} - List all entities - POST /{entity} - Create a new entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id} - Get entity reference info - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough) ## Reading and consistency Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its `/metadata` — go straight to the store and always reflect the latest write. Lists and search do not. They are answered from a search index that is updated asynchronously, so for a short interval after a write: - an entry that was just created may be missing from the list it belongs to, while reading it by id already works; - an entry that was just deleted may still appear; - `results` counts what the index holds, not what the store holds. Write a client that tolerates this: after creating an entry, use the id the create returned rather than searching for what you just wrote. `results` is also an upper bound rather than an exact count when the caller cannot read every hit (see the field's own description). Separately, responses are cached for 15 minutes by default, which is a second and unrelated source of staleness. A write invalidates the cache entries it affects, but a read that lands in the indexing gap can cache a list that does not yet show it. ## Authentication Most endpoints require an authenticated session. Reading public data works without authentication, while creating, updating, and deleting entities requires a valid user session. 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and password. The response returns an `auth_token`. 2. **Send the token** on subsequent requests via the `X-Auth-Token` header. This is the recommended method for SDK and programmatic access. Browser clients can instead rely on the `auth_token` cookie, which the server sets automatically on login (`SameSite=Lax; Secure`). 3. **Inspect the session** with `GET /auth/whoami`, which returns the current user or an anonymous/guest identity when no valid token is supplied. 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the cookie. ### Writes and CSRF Send the token as the `X-Auth-Token` **header** and there is nothing else to do: creates, updates and deletes work as they are, which is how the SDKs and the MCP server are built. The `auth_token` cookie is different. A cookie is attached by the browser automatically, so a state-changing request authenticated by it alone is what cross-site request forgery abuses, and those requests additionally need a double-submit token: read the `XSRF-TOKEN` cookie the server sets on any response and send its value back as the `X-XSRF-TOKEN` header. Without it the request is rejected with `403` before it reaches the endpoint. A custom header cannot be forged this way — cross-origin JavaScript cannot set one without a CORS preflight, which this API grants only to configured origins — so the header is the recommended path for anything that is not a browser session. ### App Tokens An app token identifies an integration. Create one with `POST /app-token` (unauthenticated). Creation requires an email address: the token starts in the `pending` state and a 6-digit code is emailed to the owner. Confirm the code with `POST /app-token/verify` to activate the token and receive its value, which is shown only once — store it securely. `GET /app-token/{app_token_id}` then returns its details and quota usage, authenticated by the token itself via the `X-App-Token` header. **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.** No other operation reads it, and the read quota is recorded but not yet enforced: reading public data needs no token of any kind, and sending an app token with a read neither grants nor meters anything. Metered public read access is the intent of the two-token model, not a description of this release — see the `security` declared on each operation for what it actually accepts. ## SDKs Generated clients for Python, TypeScript, JavaScript and C# wrap every operation below, and each operation on this page shows the SDK call beside the `curl` command. Two of them install from a public registry: ``` pip install entryscape # Python npm install @entryscape/api-client # TypeScript and JavaScript ``` `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and `require()` both work and TypeScript is not required to use it — the name describes what it is written in, not what you have to write. There is a separate generated JavaScript SDK, and it is deliberately **not** on npm; this package is the npm client for both languages. Every SDK, including the C# and JavaScript ones, is also published as a tarball. The downloads are linked in the sidebar, they are the route to take when a registry is unreachable or a build has to vendor its dependencies, and each archive carries the SDK's own README: - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`. - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or `typescript-sdk.tar.gz`. - **JavaScript (the separate generated client)** — not published to a registry, by design; `javascript-sdk.tar.gz` only. - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only. - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`. ## MCP Server A Model Context Protocol (MCP) server is generated from this specification and published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as tools for AI assistants and agents. Each operation becomes one tool named after its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`. The `auth` operations are the exception: the server reads its token once at startup, so a `login` tool could install nothing and a `logout` tool would only invalidate the token the server was started with. On connect the server also hands the assistant a short set of rules that hold across every tool: a token is bound to one EntryStore instance, the search index lags a write, uploads finish as jobs. ### Install The server is on npm, and MCP servers are normally launched straight from there, so nothing has to be installed first: ``` npx -y @entryscape/mcp-server ``` `npm install -g @entryscape/mcp-server` works too and puts an `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as `com.entryscape/mcp-server`, which is where clients and marketplaces look it up. Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack it. The package ships prebuilt; install its runtime dependency once: ``` mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp cd entryscape-mcp && npm install --omit=dev ``` ### Configure The server is a stdio MCP server configured through environment variables, read once at startup: - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required: there is no default, and the server refuses to start without it. - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as the `X-Auth-Token` header. Optional: without it reads see public entries and every write is refused. A token is valid only for the EntryStore instance that issued it. - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should use, for example `dev.entryscape.com/store/`. Unset means the API server's own default. - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files from. **Unset means uploads are disabled**: `addFileToDistribution`, `replaceFileInDistribution` and `importTerminology` refuse and say so. - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example `catalog,dataset,distribution,search`. Unset serves every tool. The package's `README.md` lists the remaining variables (timeouts and size caps). Register the server with any MCP-capable client by adding it to the client's `mcpServers` configuration: ```json { \"mcpServers\": { \"entryscape\": { \"command\": \"npx\", \"args\": [\"-y\", \"@entryscape/mcp-server\"], \"env\": { \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\", \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\" } } } } ``` From an unpacked download instead, the command is `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`. ### Claude Code The unpacked package is also a Claude Code plugin, so one install gives the server and the skills below together. Claude Code installs plugins from marketplaces, and the package carries a one-entry marketplace pointing at itself: ``` claude plugin marketplace add /path/to/entryscape-mcp claude plugin install entryscape@entryscape --scope user ``` The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`, `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in, so set them there. To try the plugin for one session without installing it, start Claude Code with `--plugin-dir /path/to/entryscape-mcp`. ### Skills `skills/` in the package holds procedures that span several tools, in the Agent Skills format (a `SKILL.md` with `name` and `description`): which tools to call in which order, what to check between calls, and where to stop. Claude Code loads them from the plugin; other clients that read the format can be pointed at the directory. The `find` skill covers discovery, facets and selective metadata reads; `publish-dataset` takes a dataset from catalog to validated distribution with its file; `edit-metadata` changes an entry that already exists without dropping the rest of its graph, models included; `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner API. Every tool a skill names is checked against this specification when the package is built. ## Deprecation Policy When endpoints or features are deprecated: 1. The operation is marked with `deprecated: true` in this spec 2. The operation description documents the replacement endpoint and sunset date 3. Deprecated endpoints remain functional for at least 6 months after announcement 4. The server returns a `Sunset` header with the planned removal date 5. After the sunset date, the endpoint may be removed in a future release
4
+ This API provides structured access to EntryScape data following DCAT-AP standards. All entity endpoints follow a consistent pattern: - GET /{entity} - List all entities - POST /{entity} - Create a new entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id} - Get entity reference info - DELETE /{entity}/{context_id}/{entry_id} - Delete an entity (DCAT types only) - GET /{entity}/{context_id}/{entry_id}/metadata - Get raw RDF metadata - PUT /{entity}/{context_id}/{entry_id}/metadata - Replace raw RDF metadata (JSON-LD, Turtle, RDF/XML, or N-Triples passthrough) ## Reading and consistency Reads of a single entity — `GET /{entity}/{context_id}/{entry_id}` and its `/metadata` — go straight to the store and always reflect the latest write. Lists and search do not. They are answered from a search index that is updated asynchronously, so for a short interval after a write: - an entry that was just created may be missing from the list it belongs to, while reading it by id already works; - an entry that was just deleted may still appear; - `results` counts what the index holds, not what the store holds. Write a client that tolerates this: after creating an entry, use the id the create returned rather than searching for what you just wrote. `results` is also an upper bound rather than an exact count when the caller cannot read every hit (see the field's own description). Separately, responses are cached for 15 minutes by default, which is a second and unrelated source of staleness. A write invalidates the cache entries it affects, but a read that lands in the indexing gap can cache a list that does not yet show it. ## Naming the EntryStore instance One API host can serve multiple EntryStore instances. By default, requests use the deployment's default instance. To target another configured instance, send its hostname (optionally with a port and base path) as either `entrystore_host` or `X-Entrystore-Host`; the query parameter wins if both are provided. A bare hostname means `/store/`, so `luzern.entryscape.net` and `luzern.entryscape.net/store/` identify the same target. The API deployment must allow the instance. Otherwise it returns `400`; ask the deployment operator to add it rather than trying another spelling. Do not include `https://`, credentials, a query string or a fragment. See [Naming the EntryStore instance](https://docs.entryscape.com/en/api/#naming-the-entrystore-instance) for examples and authentication considerations when switching instances. ## Authentication Most endpoints require an authenticated session. Reading public data works without authentication, while creating, updating, and deleting entities requires a valid user session. 1. **Log in** with `POST /auth/login`, supplying an EntryStore username and password. The response returns an `auth_token`. 2. **Send the token** on subsequent requests via the `X-Auth-Token` header. This is the recommended method for SDK and programmatic access. Browser clients can instead rely on the `auth_token` cookie, which the server sets automatically on login (`SameSite=Lax; Secure`). 3. **Inspect the session** with `GET /auth/whoami`, which returns the current user or an anonymous/guest identity when no valid token is supplied. 4. **Log out** with `POST /auth/logout` to invalidate the token and clear the cookie. ### Writes and CSRF Send the token as the `X-Auth-Token` **header** and there is nothing else to do: creates, updates and deletes work as they are, which is how the SDKs and the MCP server are built. The `auth_token` cookie is different. A cookie is attached by the browser automatically, so a state-changing request authenticated by it alone is what cross-site request forgery abuses, and those requests additionally need a double-submit token: read the `XSRF-TOKEN` cookie the server sets on any response and send its value back as the `X-XSRF-TOKEN` header. Without it the request is rejected with `403` before it reaches the endpoint. A custom header cannot be forged this way — cross-origin JavaScript cannot set one without a CORS preflight, which this API grants only to configured origins — so the header is the recommended path for anything that is not a browser session. ### App Tokens An app token identifies an integration. Create one with `POST /app-token` (unauthenticated). Creation requires an email address: the token starts in the `pending` state and a 6-digit code is emailed to the owner. Confirm the code with `POST /app-token/verify` to activate the token and receive its value, which is shown only once — store it securely. `GET /app-token/{app_token_id}` then returns its details and quota usage, authenticated by the token itself via the `X-App-Token` header. **The `X-App-Token` header is accepted only by `GET /app-token/{app_token_id}`.** No other operation reads it, and the read quota is recorded but not yet enforced: reading public data needs no token of any kind, and sending an app token with a read neither grants nor meters anything. Metered public read access is the intent of the two-token model, not a description of this release — see the `security` declared on each operation for what it actually accepts. ## SDKs Generated clients for Python, TypeScript, JavaScript and C# wrap every operation below, and each operation on this page shows the SDK call beside the `curl` command. Two of them install from a public registry: ``` pip install entryscape # Python npm install @entryscape/api-client # TypeScript and JavaScript ``` `@entryscape/api-client` ships an ESM and a CommonJS build, so `import` and `require()` both work and TypeScript is not required to use it — the name describes what it is written in, not what you have to write. There is a separate generated JavaScript SDK, and it is deliberately **not** on npm; this package is the npm client for both languages. Every SDK, including the C# and JavaScript ones, is also published as a tarball. The downloads are linked in the sidebar, they are the route to take when a registry is unreachable or a build has to vendor its dependencies, and each archive carries the SDK's own README: - **Python** — `pip install entryscape`, or `python-sdk.tar.gz`. - **TypeScript and JavaScript** — `npm install @entryscape/api-client`, or `typescript-sdk.tar.gz`. - **JavaScript (the separate generated client)** — not published to a registry, by design; `javascript-sdk.tar.gz` only. - **C#** — not published to NuGet yet; `csharp-sdk.tar.gz` only. - **MCP server** — `npx -y @entryscape/mcp-server`, or `mcp-server.tar.gz`. ## MCP Server A Model Context Protocol (MCP) server is generated from this specification and published alongside the SDKs (`@entryscape/mcp-server`), exposing the API as tools for AI assistants and agents. Each operation becomes one tool named after its `operationId` — `listDatasets`, `createCatalog`, `search`, `getJobStatus`. The `auth` operations are the exception: the server reads its token once at startup, so a `login` tool could install nothing and a `logout` tool would only invalidate the token the server was started with. On connect the server also hands the assistant a short set of rules that hold across every tool: a token is bound to one EntryStore instance, the search index lags a write, uploads finish as jobs. ### Install The server is on npm, and MCP servers are normally launched straight from there, so nothing has to be installed first: ``` npx -y @entryscape/mcp-server ``` `npm install -g @entryscape/mcp-server` works too and puts an `entryscape-mcp` binary on `PATH`. It is also listed in the MCP Registry as `com.entryscape/mcp-server`, which is where clients and marketplaces look it up. Without npm, download `mcp-server.tar.gz` from the SDK downloads and unpack it. The package ships prebuilt; install its runtime dependency once: ``` mkdir entryscape-mcp && tar -xzf mcp-server.tar.gz -C entryscape-mcp cd entryscape-mcp && npm install --omit=dev ``` ### Configure The server is a stdio MCP server configured through environment variables, read once at startup: - `ENTRYSCAPE_API_URL` — base URL of the API server, path included. Required: there is no default, and the server refuses to start without it. - `ENTRYSCAPE_AUTH_TOKEN` — a session token from `POST /auth/login`, sent as the `X-Auth-Token` header. Optional: without it reads see public entries and every write is refused. A token is valid only for the EntryStore instance that issued it. - `ENTRYSCAPE_ENTRYSTORE_HOST` — the EntryStore instance the API server should use, for example `dev.entryscape.com/store/`. Unset means the API server's own default. - `ENTRYSCAPE_MCP_UPLOAD_ROOT` — the directory the upload tools may read files from. **Unset means uploads are disabled**: `addFileToDistribution`, `replaceFileInDistribution` and `importTerminology` refuse and say so. - `ENTRYSCAPE_MCP_TAGS` — comma-separated tags to serve tools for, for example `catalog,dataset,distribution,search`. Unset serves every tool. The package's `README.md` lists the remaining variables (timeouts and size caps). Register the server with any MCP-capable client by adding it to the client's `mcpServers` configuration: ```json { \"mcpServers\": { \"entryscape\": { \"command\": \"npx\", \"args\": [\"-y\", \"@entryscape/mcp-server\"], \"env\": { \"ENTRYSCAPE_API_URL\": \"https://<your EntryScape API host>\", \"ENTRYSCAPE_AUTH_TOKEN\": \"your-session-token\" } } } } ``` From an unpacked download instead, the command is `\"command\": \"node\", \"args\": [\"/path/to/entryscape-mcp/dist/bin/entryscape-mcp.js\"]`. ### Claude Code The unpacked package is also a Claude Code plugin, so one install gives the server and the skills below together. Claude Code installs plugins from marketplaces, and the package carries a one-entry marketplace pointing at itself: ``` claude plugin marketplace add /path/to/entryscape-mcp claude plugin install entryscape@entryscape --scope user ``` The plugin passes `ENTRYSCAPE_API_URL`, `ENTRYSCAPE_AUTH_TOKEN`, `ENTRYSCAPE_ENTRYSTORE_HOST`, `ENTRYSCAPE_MCP_TAGS` and `ENTRYSCAPE_MCP_UPLOAD_ROOT` through from the shell Claude Code was started in, so set them there. To try the plugin for one session without installing it, start Claude Code with `--plugin-dir /path/to/entryscape-mcp`. ### Skills `skills/` in the package holds procedures that span several tools, in the Agent Skills format (a `SKILL.md` with `name` and `description`): which tools to call in which order, what to check between calls, and where to stop. Claude Code loads them from the plugin; other clients that read the format can be pointed at the directory. The `find` skill covers discovery, facets and selective metadata reads; `publish-dataset` takes a dataset from catalog to validated distribution with its file; `edit-metadata` changes an entry that already exists without dropping the rest of its graph, models included; `migrate-from-taskrunner` moves an integration off the deprecated Taskrunner API. Every tool a skill names is checked against this specification when the package is built. ## Deprecation Policy When endpoints or features are deprecated: 1. The operation is marked with `deprecated: true` in this spec 2. The operation description documents the replacement endpoint and sunset date 3. Deprecated endpoints remain functional for at least 6 months after announcement 4. The server returns a `Sunset` header with the planned removal date 5. After the sunset date, the endpoint may be removed in a future release
5
5
 
6
- The version of the OpenAPI document: 1.3.0
6
+ The version of the OpenAPI document: 1.3.1
7
7
  Contact: contact@entryscape.com
8
8
  Generated by OpenAPI Generator (https://openapi-generator.tech)
9
9