nextcloud-agent 1.0.1__tar.gz → 2.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.
- {nextcloud_agent-1.0.1/nextcloud_agent.egg-info → nextcloud_agent-2.3.1}/PKG-INFO +135 -87
- nextcloud_agent-1.0.1/PKG-INFO → nextcloud_agent-2.3.1/README.md +121 -104
- nextcloud_agent-2.3.1/nextcloud_agent/__init__.py +1 -0
- nextcloud_agent-2.3.1/nextcloud_agent/__main__.py +4 -0
- nextcloud_agent-2.3.1/nextcloud_agent/api/api_client_base.py +330 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/api/api_client_calendar.py +14 -8
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/api/api_client_contacts.py +14 -7
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/api/api_client_files.py +13 -11
- nextcloud_agent-2.3.1/nextcloud_agent/api/xml_security.py +46 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/auth.py +10 -13
- nextcloud_agent-2.3.1/nextcloud_agent/connectors/mcp_source_presets.json +14 -0
- nextcloud_agent-2.3.1/nextcloud_agent/connectors/tool_schema_fingerprints.json +8 -0
- nextcloud_agent-2.3.1/nextcloud_agent/kg_ingest.py +221 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/mcp_server.py +21 -23
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/__init__.py +7 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/certification.json +36 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/fixtures/records.json +20 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/mappings/source.yaml +20 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/migrations/manifest.json +6 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/nextcloud.ttl +92 -0
- nextcloud_agent-2.3.1/nextcloud_agent/ontology/shapes/connector.shacl.ttl +84 -0
- nextcloud_agent-2.3.1/nextcloud_agent/prompts/file_steward.json +43 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-agent-operations/SKILL.md +33 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-agent-operations/agents/openai.yaml +4 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-agent-operations/references/catalog.md +7 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-files/SKILL.md +89 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-files/WORKFLOW.md +78 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-ingest/SKILL.md +82 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-ingest/WORKFLOW.md +70 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-shares/SKILL.md +81 -0
- nextcloud_agent-2.3.1/nextcloud_agent/skills/nextcloud-shares/WORKFLOW.md +70 -0
- nextcloud_agent-1.0.1/README.md → nextcloud_agent-2.3.1/nextcloud_agent.egg-info/PKG-INFO +152 -73
- nextcloud_agent-2.3.1/nextcloud_agent.egg-info/SOURCES.txt +56 -0
- nextcloud_agent-2.3.1/nextcloud_agent.egg-info/entry_points.txt +17 -0
- nextcloud_agent-2.3.1/nextcloud_agent.egg-info/requires.txt +18 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent.egg-info/top_level.txt +3 -0
- nextcloud_agent-2.3.1/pyproject.toml +84 -0
- nextcloud_agent-2.3.1/scripts/security_sanitizer.py +318 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/scripts/verify_api_integration.py +153 -112
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/tests/conftest.py +1 -0
- nextcloud_agent-2.3.1/tests/test_api_client.py +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/tests/test_auth.py +8 -6
- nextcloud_agent-2.3.1/tests/test_cli_server.py +18 -0
- nextcloud_agent-2.3.1/tests/test_fleet_name.py +53 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/tests/test_init_dynamics.py +1 -0
- nextcloud_agent-2.3.1/tests/test_kg_ingest.py +128 -0
- nextcloud_agent-2.3.1/tests/test_mcp_server.py +100 -0
- nextcloud_agent-2.3.1/tests/test_xml_security.py +68 -0
- nextcloud_agent-1.0.1/nextcloud_agent/__init__.py +0 -1
- nextcloud_agent-1.0.1/nextcloud_agent/__main__.py +0 -4
- nextcloud_agent-1.0.1/nextcloud_agent/agent_server.py +0 -85
- nextcloud_agent-1.0.1/nextcloud_agent/api/api_client_base.py +0 -129
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/__init__.py +0 -19
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/mcp_calendar.py +0 -56
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/mcp_contacts.py +0 -56
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/mcp_files.py +0 -66
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/mcp_sharing.py +0 -56
- nextcloud_agent-1.0.1/nextcloud_agent/mcp/mcp_user.py +0 -52
- nextcloud_agent-1.0.1/nextcloud_agent/prompts/main_agent.json +0 -20
- nextcloud_agent-1.0.1/nextcloud_agent/skills/nextcloud-starter/SKILL.md +0 -19
- nextcloud_agent-1.0.1/nextcloud_agent.egg-info/SOURCES.txt +0 -43
- nextcloud_agent-1.0.1/nextcloud_agent.egg-info/entry_points.txt +0 -9
- nextcloud_agent-1.0.1/nextcloud_agent.egg-info/requires.txt +0 -19
- nextcloud_agent-1.0.1/pyproject.toml +0 -65
- nextcloud_agent-1.0.1/scripts/security_sanitizer.py +0 -160
- nextcloud_agent-1.0.1/tests/test_action_discovery.py +0 -59
- nextcloud_agent-1.0.1/tests/test_cli_server.py +0 -61
- nextcloud_agent-1.0.1/tests/test_concept_parity.py +0 -89
- nextcloud_agent-1.0.1/tests/test_mcp_server.py +0 -175
- nextcloud_agent-1.0.1/tests/test_startup.py +0 -11
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/LICENSE +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/api/__init__.py +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/api_client.py +0 -0
- {nextcloud_agent-1.0.1/nextcloud_agent/prompts → nextcloud_agent-2.3.1/nextcloud_agent/connectors}/__init__.py +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent/mcp_config.json +0 -0
- {nextcloud_agent-1.0.1/nextcloud_agent/skills → nextcloud_agent-2.3.1/nextcloud_agent/prompts}/__init__.py +0 -0
- nextcloud_agent-1.0.1/tests/test_api_client.py → nextcloud_agent-2.3.1/nextcloud_agent/skills/__init__.py +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/nextcloud_agent.egg-info/dependency_links.txt +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/setup.cfg +0 -0
- {nextcloud_agent-1.0.1 → nextcloud_agent-2.3.1}/tests/test_init.py +1 -1
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nextcloud-agent
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.3.1
|
|
4
4
|
Summary: Nextcloud MCP Server for Agentic AI!
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 3 - Alpha
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
9
9
|
Classifier: Environment :: Console
|
|
10
10
|
Classifier: Operating System :: POSIX :: Linux
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Requires-Python:
|
|
12
|
+
Requires-Python: >=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-
|
|
16
|
-
Requires-Dist:
|
|
17
|
-
Requires-Dist:
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.14
|
|
16
|
+
Requires-Dist: requests>=2.34.2
|
|
17
|
+
Requires-Dist: defusedxml>=0.7.1
|
|
18
|
+
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
19
|
+
Requires-Dist: icalendar>=7.3.0
|
|
18
20
|
Requires-Dist: vobject>=0.9.9
|
|
19
21
|
Provides-Extra: mcp
|
|
20
|
-
Requires-Dist: agent-
|
|
21
|
-
Provides-Extra: agent
|
|
22
|
-
Requires-Dist: agent-utilities[agent,logfire]>=1.0.0; extra == "agent"
|
|
22
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.14; extra == "mcp"
|
|
23
23
|
Provides-Extra: all
|
|
24
|
-
Requires-Dist: agent-
|
|
24
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.14; extra == "all"
|
|
25
25
|
Provides-Extra: test
|
|
26
|
-
Requires-Dist: pytest-xdist>=3.
|
|
27
|
-
Requires-Dist: pytest; extra == "test"
|
|
28
|
-
Requires-Dist: pytest-asyncio; extra == "test"
|
|
29
|
-
Requires-Dist: pytest-cov; extra == "test"
|
|
26
|
+
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
27
|
+
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
28
|
+
Requires-Dist: pytest-asyncio>=1.4.0; extra == "test"
|
|
29
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == "test"
|
|
30
30
|
Dynamic: license-file
|
|
31
31
|
|
|
32
32
|
# Nextcloud Agent
|
|
@@ -51,7 +51,7 @@ Dynamic: license-file
|
|
|
51
51
|

|
|
52
52
|

|
|
53
53
|
|
|
54
|
-
*Version:
|
|
54
|
+
*Version: 2.3.1*
|
|
55
55
|
|
|
56
56
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
57
57
|
> interfaces, and guidance for provisioning the backing Nextcloud instance are
|
|
@@ -68,7 +68,7 @@ Dynamic: license-file
|
|
|
68
68
|
## Key Features
|
|
69
69
|
|
|
70
70
|
- **Consolidated Action-Routed MCP Tools:** Minimizes token overhead and eliminates tool bloat in LLM contexts by grouping methods into optimized, togglable tool modules.
|
|
71
|
-
- **Enterprise-Grade Security:**
|
|
71
|
+
- **Enterprise-Grade Security:** Complete support for Eunomia policies, OIDC token delegation, and granular execution context tracking.
|
|
72
72
|
- **Integrated Graph Agent:** Built-in Pydantic AI agent supporting the Agent Control Protocol (ACP) and standard Web interfaces (AG-UI).
|
|
73
73
|
- **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and native Langfuse tracing.
|
|
74
74
|
|
|
@@ -76,7 +76,7 @@ Dynamic: license-file
|
|
|
76
76
|
|
|
77
77
|
## CLI or API
|
|
78
78
|
|
|
79
|
-
This agent wraps the Nextcloud MCP Server for Agentic AI! API.
|
|
79
|
+
This agent wraps the Nextcloud MCP Server for Agentic AI! API. The operator can interact with it programmatically or via its integrated execution entrypoints.
|
|
80
80
|
|
|
81
81
|
Detailed instructions on how to use the underlying API wrappers, extended schema bindings, and developer SDK references are maintained in [docs/index.md](docs/index.md).
|
|
82
82
|
|
|
@@ -84,28 +84,29 @@ Detailed instructions on how to use the underlying API wrappers, extended schema
|
|
|
84
84
|
|
|
85
85
|
## MCP
|
|
86
86
|
|
|
87
|
-
This server
|
|
87
|
+
This server use dynamic Action-Routed tools to optimize token overhead and maximize IDE compatibility.
|
|
88
88
|
|
|
89
89
|
### Available MCP Tools
|
|
90
90
|
|
|
91
|
-
<!-- This table is auto-generated by `python -m
|
|
91
|
+
<!-- This table is auto-generated by `python -m agent_connector_sdk.mcp.readme_tools` — do not edit by hand. -->
|
|
92
92
|
|
|
93
93
|
<!-- MCP-TOOLS-TABLE:START -->
|
|
94
94
|
|
|
95
|
-
#### Condensed action-routed tools (
|
|
95
|
+
#### Condensed action-routed tools (`MCP_TOOL_MODE=condensed`)
|
|
96
96
|
|
|
97
97
|
| MCP Tool | Toggle Env Var | Description |
|
|
98
98
|
|----------|----------------|-------------|
|
|
99
99
|
| `nextcloud_calendar` | `CALENDARTOOL` | Manage nextcloud calendar operations. |
|
|
100
100
|
| `nextcloud_contacts` | `CONTACTSTOOL` | Manage nextcloud contacts operations. |
|
|
101
101
|
| `nextcloud_files` | `FILESTOOL` | Manage nextcloud files operations. |
|
|
102
|
+
| `nextcloud_ingest_file` | `INGESTTOOL` | Fetch a Nextcloud file over WebDAV and natively store it in the knowledge |
|
|
102
103
|
| `nextcloud_sharing` | `SHARINGTOOL` | Manage nextcloud sharing operations. |
|
|
103
104
|
| `nextcloud_user` | `USERTOOL` | Manage nextcloud user operations. |
|
|
104
105
|
|
|
105
106
|
#### Verbose 1:1 API-mapped tools (`MCP_TOOL_MODE=verbose` or `both`)
|
|
106
107
|
|
|
107
108
|
<details>
|
|
108
|
-
<summary>
|
|
109
|
+
<summary>26 per-operation tools — one per public API method (click to expand)</summary>
|
|
109
110
|
|
|
110
111
|
| MCP Tool | Toggle Env Var | Description |
|
|
111
112
|
|----------|----------------|-------------|
|
|
@@ -133,22 +134,21 @@ This server utilizes dynamic Action-Routed tools to optimize token overhead and
|
|
|
133
134
|
| `nextcloud_list_shares` | `APITOOL` | List all shares. |
|
|
134
135
|
| `nextcloud_move_item` | `APITOOL` | Alias for move_resource to support MCP server action. |
|
|
135
136
|
| `nextcloud_move_resource` | `APITOOL` | Move a file or directory. |
|
|
136
|
-
| `nextcloud_ocs_request` | `BASE_API_CLIENTTOOL` | Make a request to the OCS API. |
|
|
137
137
|
| `nextcloud_read_file` | `APITOOL` | Download a file. |
|
|
138
138
|
| `nextcloud_write_file` | `APITOOL` | Upload a file. |
|
|
139
139
|
|
|
140
140
|
</details>
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
_6 action-routed tool(s) · 26 verbose 1:1 tool(s). Each is enabled unless its `<DOMAIN>TOOL` toggle is set false; `MCP_TOOL_MODE` selects the surface (**`intent` default** — the six verb-tools, granular set loaded on demand · `condensed` action-routed · `verbose` 1:1 · `both`). Auto-generated — do not edit._
|
|
143
143
|
<!-- MCP-TOOLS-TABLE:END -->
|
|
144
144
|
|
|
145
|
-
Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/
|
|
145
|
+
Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/usage.md](docs/usage.md).
|
|
146
146
|
|
|
147
147
|
### Dynamic Tool Selection & Visibility
|
|
148
148
|
|
|
149
|
-
This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows
|
|
149
|
+
This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows the operator to restrict the set of exposed tools to prevent blowing up the LLM's context window.
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
The operator can configure tool filtering via multiple input channels:
|
|
152
152
|
|
|
153
153
|
- **CLI Arguments:** Pass `--tools` or `--toolsets` (or their disabled counterparts `--disabled-tools` and `--disabled-toolsets`) during startup.
|
|
154
154
|
- **Environment Variables:** Define standard environment variables:
|
|
@@ -157,7 +157,7 @@ You can configure tool filtering via multiple input channels:
|
|
|
157
157
|
- **HTTP SSE Request Headers:** Pass custom headers during transport initialization:
|
|
158
158
|
- `x-mcp-enabled-tools` / `x-mcp-disabled-tools`
|
|
159
159
|
- `x-mcp-enabled-tags` / `x-mcp-disabled-tags`
|
|
160
|
-
- **HTTP SSE Request Query Parameters:** Append query parameters directly to
|
|
160
|
+
- **HTTP SSE Request Query Parameters:** Append query parameters directly to the operator's transport connection URL:
|
|
161
161
|
- `?tools=tool1,tool2`
|
|
162
162
|
- `?tags=tag1`
|
|
163
163
|
|
|
@@ -169,11 +169,10 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
169
169
|
|
|
170
170
|
<!-- MCP-CONFIG-EXAMPLES:START -->
|
|
171
171
|
|
|
172
|
-
> **Install the
|
|
173
|
-
>
|
|
174
|
-
>
|
|
175
|
-
>
|
|
176
|
-
> full `[agent]` extra only when you need the integrated Pydantic AI agent.
|
|
172
|
+
> **Install the connector-focused `[mcp]` extra.** Examples use `nextcloud-agent[mcp]` to add
|
|
173
|
+
> FastMCP / FastAPI through `agent-connector-sdk[mcp]`; the required Agent Utilities core
|
|
174
|
+
> still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
|
|
175
|
+
> enables model orchestration.
|
|
177
176
|
|
|
178
177
|
#### stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
|
|
179
178
|
|
|
@@ -188,7 +187,6 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
188
187
|
"nextcloud-mcp"
|
|
189
188
|
],
|
|
190
189
|
"env": {
|
|
191
|
-
"MCP_TOOL_MODE": "condensed",
|
|
192
190
|
"CALENDARTOOL": "True",
|
|
193
191
|
"CONTACTSTOOL": "True",
|
|
194
192
|
"FILESTOOL": "True",
|
|
@@ -203,6 +201,10 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
203
201
|
}
|
|
204
202
|
```
|
|
205
203
|
|
|
204
|
+
Runtime references require an alias-aware launcher such as Arbora. Other
|
|
205
|
+
launchers must omit those entries and inject the resolved values through their
|
|
206
|
+
own runtime secret boundary.
|
|
207
|
+
|
|
206
208
|
#### Streamable-HTTP Transport (networked / production)
|
|
207
209
|
|
|
208
210
|
```json
|
|
@@ -221,9 +223,8 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
221
223
|
],
|
|
222
224
|
"env": {
|
|
223
225
|
"TRANSPORT": "streamable-http",
|
|
224
|
-
"HOST": "
|
|
226
|
+
"HOST": "127.0.0.1",
|
|
225
227
|
"PORT": "8000",
|
|
226
|
-
"MCP_TOOL_MODE": "condensed",
|
|
227
228
|
"CALENDARTOOL": "True",
|
|
228
229
|
"CONTACTSTOOL": "True",
|
|
229
230
|
"FILESTOOL": "True",
|
|
@@ -250,27 +251,35 @@ Alternatively, connect to a pre-deployed Streamable-HTTP instance by `url`:
|
|
|
250
251
|
}
|
|
251
252
|
```
|
|
252
253
|
|
|
253
|
-
|
|
254
|
+
Run a reviewed container image as a least-privilege stdio child (no
|
|
255
|
+
listener or published port):
|
|
254
256
|
|
|
255
257
|
```bash
|
|
256
|
-
docker run -
|
|
257
|
-
--
|
|
258
|
-
-
|
|
259
|
-
-
|
|
260
|
-
-
|
|
261
|
-
|
|
262
|
-
-e
|
|
258
|
+
docker run -i --rm \
|
|
259
|
+
--read-only \
|
|
260
|
+
--cap-drop=ALL \
|
|
261
|
+
--security-opt=no-new-privileges \
|
|
262
|
+
--pids-limit=256 \
|
|
263
|
+
--tmpfs /tmp:rw,noexec,nosuid,nodev,size=64m \
|
|
264
|
+
-e TRANSPORT=stdio \
|
|
265
|
+
-e MCP_TOOL_MODE=intent \
|
|
263
266
|
-e CALENDARTOOL=True \
|
|
264
267
|
-e CONTACTSTOOL=True \
|
|
265
268
|
-e FILESTOOL=True \
|
|
269
|
+
-e INGESTTOOL=True \
|
|
266
270
|
-e NEXTCLOUD_PASSWORD=your_password \
|
|
267
271
|
-e NEXTCLOUD_URL=https://nextcloud.example.com \
|
|
268
272
|
-e NEXTCLOUD_USERNAME=your_username \
|
|
269
273
|
-e SHARINGTOOL=True \
|
|
270
274
|
-e USERTOOL=True \
|
|
271
|
-
|
|
275
|
+
registry.example.invalid/nextcloud-agent@sha256:<digest> nextcloud-mcp
|
|
272
276
|
```
|
|
273
277
|
|
|
278
|
+
For containerized network HTTP, supply an authenticated TLS ingress (or
|
|
279
|
+
direct server TLS), exact `MCP_ALLOWED_HOSTS`, and an exact trusted-proxy
|
|
280
|
+
CIDR policy through the operator-owned deployment profile. The generator
|
|
281
|
+
does not emit an unauthenticated non-loopback listener.
|
|
282
|
+
|
|
274
283
|
_Auto-generated from the code-read env surface (`MCP_TOOL_MODE` + package vars) — do not edit._
|
|
275
284
|
<!-- MCP-CONFIG-EXAMPLES:END -->
|
|
276
285
|
|
|
@@ -285,13 +294,17 @@ consumed from a **remote deployment**. The
|
|
|
285
294
|
|
|
286
295
|
- **Local container / uv** — launch the server from `mcp_config.json` via `uvx`,
|
|
287
296
|
`docker run`, or `podman run`, or point at a local streamable-http container by `url`.
|
|
297
|
+
The published container runs as a reviewed, least-privilege stdio child with no
|
|
298
|
+
listener or published port by default (see the hardened `docker run` example above).
|
|
288
299
|
- **Remote URL** — connect to a server deployed behind Caddy at
|
|
289
|
-
`
|
|
300
|
+
`https://nextcloud-mcp.example.invalid/mcp` using the `"url"` key, or through any
|
|
301
|
+
operator-supplied authenticated HTTPS ingress. Keep its URL, outbound identity
|
|
302
|
+
references, trust profile, and exact `MCP_ALLOWED_HOSTS` in `AgentConfig`.
|
|
290
303
|
<!-- END GENERATED: additional-deployment-options -->
|
|
291
304
|
|
|
292
305
|
## Agent
|
|
293
306
|
|
|
294
|
-
This repository features a fully integrated Pydantic AI Graph Agent. It communicates over the **Agent Control Protocol (ACP)** and interacts
|
|
307
|
+
This repository features a fully integrated Pydantic AI Graph Agent. It communicates over the **Agent Control Protocol (ACP)** and interacts smoothly with the **Agent Web UI (AG-UI)** and Terminal interface.
|
|
295
308
|
|
|
296
309
|
### Running the Agent CLI
|
|
297
310
|
To start the interactive command-line agent:
|
|
@@ -340,7 +353,7 @@ services:
|
|
|
340
353
|
max-file: "3"
|
|
341
354
|
|
|
342
355
|
nextcloud-agent-agent:
|
|
343
|
-
image: knucklessg1/nextcloud-agent:
|
|
356
|
+
image: knucklessg1/nextcloud-agent:2.3.1
|
|
344
357
|
container_name: nextcloud-agent-agent
|
|
345
358
|
hostname: nextcloud-agent-agent
|
|
346
359
|
restart: always
|
|
@@ -354,9 +367,6 @@ services:
|
|
|
354
367
|
- HOST=0.0.0.0
|
|
355
368
|
- PORT=9016
|
|
356
369
|
- MCP_URL=http://nextcloud-agent-mcp:8000/mcp
|
|
357
|
-
- PROVIDER=${PROVIDER:-openai}
|
|
358
|
-
- MODEL_ID=${MODEL_ID:-gpt-4o}
|
|
359
|
-
- ENABLE_WEB_UI=True
|
|
360
370
|
- ENABLE_OTEL=True
|
|
361
371
|
ports:
|
|
362
372
|
- "9016:9016"
|
|
@@ -374,13 +384,13 @@ services:
|
|
|
374
384
|
|
|
375
385
|
```
|
|
376
386
|
|
|
377
|
-
Detailed graph node architecture explanations, custom skill configurations, and agentic trace guides are available in [docs/
|
|
387
|
+
Detailed graph node architecture explanations, custom skill configurations, and agentic trace guides are available in [docs/deployment.md](docs/deployment.md).
|
|
378
388
|
|
|
379
389
|
---
|
|
380
390
|
|
|
381
391
|
## Security & Governance
|
|
382
392
|
|
|
383
|
-
Built directly upon the enterprise-ready [`agent-
|
|
393
|
+
Built directly upon the enterprise-ready [`agent-connector-sdk`](https://github.com/Knuckles-Team/agent-connector-sdk) core, standard security parameters are fully supported:
|
|
384
394
|
|
|
385
395
|
### Access Control & Policy Enforcement
|
|
386
396
|
- **Eunomia Policies:** Fine-grained, policy-driven tool authorization. Supports `none`, local `embedded` (`mcp_policies.json`), or centralized `remote` modes.
|
|
@@ -388,7 +398,7 @@ Built directly upon the enterprise-ready [`agent-utilities`](https://github.com/
|
|
|
388
398
|
- **Scoped Credentials:** Execution context runs restricted to the specific caller identity.
|
|
389
399
|
|
|
390
400
|
### Runtime Security Grid
|
|
391
|
-
| Feature |
|
|
401
|
+
| Feature | Feature | Enablement |
|
|
392
402
|
|---------|---------------|------------|
|
|
393
403
|
| **Tool Guard** | Sensitivity inspection with human-in-the-loop validation | Enabled by default |
|
|
394
404
|
| **Prompt Injection Defense** | Input scanning, repetition monitoring, and recursive loop blocks | Enabled by default |
|
|
@@ -409,42 +419,42 @@ Built directly upon the enterprise-ready [`agent-utilities`](https://github.com/
|
|
|
409
419
|
| `TRANSPORT` | `stdio` | options: stdio, streamable-http, sse |
|
|
410
420
|
| `ENABLE_OTEL` | `True` | |
|
|
411
421
|
| `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:8080/api/public/otel` | |
|
|
412
|
-
| `
|
|
413
|
-
| `
|
|
422
|
+
| `OTEL_EXPORTER_OTLP_PUBLIC_KEY_REF` | `vault-ref-to-pk` | |
|
|
423
|
+
| `OTEL_EXPORTER_OTLP_SECRET_KEY_REF` | `vault-ref-to-sk` | |
|
|
414
424
|
| `OTEL_EXPORTER_OTLP_PROTOCOL` | `http/protobuf` | |
|
|
415
425
|
| `EUNOMIA_TYPE` | `none` | options: none, embedded, remote |
|
|
416
426
|
| `EUNOMIA_POLICY_FILE` | `mcp_policies.json` | |
|
|
417
427
|
| `EUNOMIA_REMOTE_URL` | `http://eunomia-server:8000` | |
|
|
418
428
|
| `NEXTCLOUD_URL` | `https://nextcloud.example.com` | |
|
|
419
429
|
| `NEXTCLOUD_USERNAME` | `your_username` | |
|
|
420
|
-
| `NEXTCLOUD_PASSWORD` |
|
|
421
|
-
| `
|
|
430
|
+
| `NEXTCLOUD_PASSWORD` | secret-injected | |
|
|
431
|
+
| `TLS_PROFILE` | `private-ca` | AgentConfig named transport profile |
|
|
432
|
+
| `TLS_PROFILE_REF` | `secret://transport/provider` | Direct runtime profile reference |
|
|
433
|
+
| `TLS_PROFILES_REF` | `secret://transport/catalog` | Named runtime profile catalog |
|
|
422
434
|
| `FILESTOOL` | `True` | |
|
|
423
435
|
| `USERTOOL` | `True` | |
|
|
424
436
|
| `SHARINGTOOL` | `True` | |
|
|
425
437
|
| `CALENDARTOOL` | `True` | |
|
|
426
438
|
| `CONTACTSTOOL` | `True` | |
|
|
427
439
|
|
|
428
|
-
#### Inherited agent-
|
|
440
|
+
#### Inherited agent-connector-sdk variables (apply to every connector)
|
|
429
441
|
|
|
430
442
|
| Variable | Example | Description |
|
|
431
443
|
|----------|---------|-------------|
|
|
432
|
-
| `MCP_TOOL_MODE` | `condensed` | Tool surface: `condensed` | `verbose` | `both` |
|
|
433
444
|
| `MCP_ENABLED_TOOLS` | — | Comma-separated tool allow-list |
|
|
434
445
|
| `MCP_DISABLED_TOOLS` | — | Comma-separated tool deny-list |
|
|
435
446
|
| `MCP_ENABLED_TAGS` | — | Comma-separated tag allow-list |
|
|
436
447
|
| `MCP_DISABLED_TAGS` | — | Comma-separated tag deny-list |
|
|
437
|
-
| `MCP_CLIENT_AUTH` | — | Outbound MCP auth
|
|
448
|
+
| `MCP_CLIENT_AUTH` | — | Outbound MCP child auth: `oidc-client-credentials` \| `basic` \| `none` |
|
|
438
449
|
| `OIDC_CLIENT_ID` | — | OIDC client id (service-account auth) |
|
|
439
|
-
| `
|
|
450
|
+
| `OIDC_CLIENT_SECRET_REF` | `secret://identity/oidc-client-secret` | Runtime secret reference for the OIDC service account |
|
|
451
|
+
| `MCP_BASIC_AUTH_USERNAME` | — | HTTP Basic username (`MCP_CLIENT_AUTH=basic`) |
|
|
452
|
+
| `MCP_BASIC_AUTH_PASSWORD_REF` | `secret://identity/mcp-basic-password` | Runtime secret reference for HTTP Basic auth (`MCP_CLIENT_AUTH=basic`) |
|
|
440
453
|
| `DEBUG` | `False` | Verbose logging |
|
|
441
454
|
| `PYTHONUNBUFFERED` | `1` | Unbuffered stdout (recommended in containers) |
|
|
442
455
|
| `MCP_URL` | `http://localhost:8000/mcp` | URL of the MCP server the agent connects to |
|
|
443
|
-
| `PROVIDER` | `openai` | LLM provider for the agent |
|
|
444
|
-
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
445
|
-
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
446
456
|
|
|
447
|
-
|
|
457
|
+
_23 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared agent-connector-sdk set — do not edit._
|
|
448
458
|
<!-- ENV-VARS-TABLE:END -->
|
|
449
459
|
|
|
450
460
|
|
|
@@ -457,7 +467,7 @@ for a copy-paste starting point.
|
|
|
457
467
|
| `NEXTCLOUD_URL` | Base URL of the Nextcloud instance | `https://nextcloud.example.com` |
|
|
458
468
|
| `NEXTCLOUD_USERNAME` | Username (basic auth) | — |
|
|
459
469
|
| `NEXTCLOUD_PASSWORD` | Password / app password (basic auth) | — |
|
|
460
|
-
| `
|
|
470
|
+
| `TLS_PROFILE` / `TLS_PROFILE_REF` | AgentConfig transport profile selector; peer verification is mandatory | — |
|
|
461
471
|
|
|
462
472
|
### MCP server / transport
|
|
463
473
|
| Variable | Description | Default |
|
|
@@ -465,7 +475,6 @@ for a copy-paste starting point.
|
|
|
465
475
|
| `TRANSPORT` | `stdio`, `streamable-http`, or `sse` | `stdio` |
|
|
466
476
|
| `HOST` | Bind host (HTTP transports) | `0.0.0.0` |
|
|
467
477
|
| `PORT` | Bind port (HTTP transports) | `8000` |
|
|
468
|
-
| `MCP_TOOL_MODE` | Tool surface: `condensed`, `verbose`, or `both` | `condensed` |
|
|
469
478
|
| `MCP_ENABLED_TOOLS` / `MCP_DISABLED_TOOLS` | Comma-separated tool allow/deny list | — |
|
|
470
479
|
| `MCP_ENABLED_TAGS` / `MCP_DISABLED_TAGS` | Comma-separated tag allow/deny list | — |
|
|
471
480
|
|
|
@@ -489,19 +498,19 @@ Each action-routed tool can be disabled individually via its toggle env var (set
|
|
|
489
498
|
|
|
490
499
|
## Installation
|
|
491
500
|
|
|
492
|
-
Pick the extra that matches what
|
|
501
|
+
Pick the extra that matches what the operator want to run:
|
|
493
502
|
|
|
494
503
|
| Extra | Installs | Use when |
|
|
495
504
|
|-------|----------|----------|
|
|
496
|
-
| `nextcloud-agent[mcp]` |
|
|
497
|
-
| `nextcloud-agent[agent]` |
|
|
505
|
+
| `nextcloud-agent[mcp]` | Connector-focused MCP server (`agent-connector-sdk[mcp]` — FastMCP/FastAPI + `epistemic-graph[full]`) | The operator only run the **MCP server** (smallest install / image) |
|
|
506
|
+
| `nextcloud-agent[agent]` | Agent runtime (`agent-connector-sdk[agent-runtime,logfire]` — model orchestration + `epistemic-graph[full]`) | The operator run the **integrated agent** |
|
|
498
507
|
| `nextcloud-agent[all]` | Everything (`mcp` + `agent` + `logfire`) | Development / both surfaces |
|
|
499
508
|
|
|
500
509
|
```bash
|
|
501
|
-
# MCP server
|
|
510
|
+
# Connector-focused MCP server (includes the shared graph engine)
|
|
502
511
|
uv pip install "nextcloud-agent[mcp]"
|
|
503
512
|
|
|
504
|
-
#
|
|
513
|
+
# Agent runtime (adds model orchestration to the shared graph engine)
|
|
505
514
|
uv pip install "nextcloud-agent[agent]"
|
|
506
515
|
|
|
507
516
|
# Everything (development)
|
|
@@ -514,26 +523,27 @@ One multi-stage `docker/Dockerfile` builds two right-sized images, selected by `
|
|
|
514
523
|
|
|
515
524
|
| Image tag | Build target | Contents | Entrypoint |
|
|
516
525
|
|-----------|--------------|----------|------------|
|
|
517
|
-
| `knucklessg1/nextcloud-agent:mcp` | `--target mcp` | `nextcloud-agent[mcp]` — **
|
|
518
|
-
| `knucklessg1/nextcloud-agent:
|
|
526
|
+
| `knucklessg1/nextcloud-agent:mcp` | `--target mcp` | `nextcloud-agent[mcp]` — **connector-focused**, includes `epistemic-graph[full]`; no model-orchestration stack | `nextcloud-mcp` |
|
|
527
|
+
| `knucklessg1/nextcloud-agent:2.3.1` | `--target agent` (default) | `nextcloud-agent[agent]` — **agent runtime**, model orchestration + `epistemic-graph[full]` | `nextcloud-agent` |
|
|
519
528
|
|
|
520
529
|
```bash
|
|
521
|
-
docker build --target mcp -t knucklessg1/nextcloud-agent:mcp docker/ #
|
|
522
|
-
docker build --target agent -t knucklessg1/nextcloud-agent:
|
|
530
|
+
docker build --target mcp -t knucklessg1/nextcloud-agent:mcp docker/ # connector-focused MCP server
|
|
531
|
+
docker build --target agent -t knucklessg1/nextcloud-agent:2.3.1 docker/ # agent runtime
|
|
523
532
|
```
|
|
524
533
|
|
|
525
|
-
`docker/mcp.compose.yml` runs the
|
|
526
|
-
agent (`:
|
|
534
|
+
`docker/mcp.compose.yml` runs the connector-focused `:mcp` server; `docker/agent.compose.yml` runs the
|
|
535
|
+
agent (`:2.3.1`) with a co-located `:mcp` sidecar.
|
|
527
536
|
|
|
528
537
|
### Knowledge-graph database (`epistemic-graph`)
|
|
529
538
|
|
|
530
|
-
|
|
531
|
-
|
|
539
|
+
Both `[mcp]` and `[agent]` carry the **epistemic-graph** engine through the required
|
|
540
|
+
Agent Utilities core dependency (`epistemic-graph[full]`). The `[mcp]` extra keeps
|
|
541
|
+
the server connector-focused; `[agent]` also enables model orchestration. Local
|
|
542
|
+
deployments can use the bundled engine. For production — or to share one knowledge graph
|
|
532
543
|
across multiple agents — run **epistemic-graph as its own database container** and point the
|
|
533
544
|
agent at it instead of embedding it. Deployment recipes (single-node + Raft HA), connection
|
|
534
545
|
config, and the full database architecture (with diagrams) are documented in the
|
|
535
546
|
[epistemic-graph deployment guide](https://knuckles-team.github.io/epistemic-graph/deployment/).
|
|
536
|
-
The slim `[mcp]` server does **not** require the database.
|
|
537
547
|
|
|
538
548
|
---
|
|
539
549
|
|
|
@@ -556,20 +566,20 @@ the recommended reference for installation, deployment, and day-to-day operation
|
|
|
556
566
|
|
|
557
567
|
## Repository Owners
|
|
558
568
|
|
|
559
|
-
<img width="100%" height="180em" src="https://github-readme-stats.vercel.app/api?username=
|
|
569
|
+
<img width="100%" height="180em" src="https://github-readme-stats.vercel.app/api?username=example&show_icons=true&hide_border=true&&count_private=true&include_all_commits=true" />
|
|
560
570
|
|
|
561
|
-

|
|
572
|
+

|
|
563
573
|
|
|
564
574
|
---
|
|
565
575
|
|
|
566
576
|
## Contribute
|
|
567
577
|
|
|
568
|
-
Contributions are welcome! Please ensure code quality by
|
|
578
|
+
Contributions are welcome! Please ensure code quality by running local checks before submitting pull requests:
|
|
569
579
|
- Format code using `ruff format .`
|
|
570
580
|
- Lint code using `ruff check .`
|
|
571
581
|
- Validate type-safety with `mypy .`
|
|
572
|
-
-
|
|
582
|
+
- Ran test suites using `pytest`
|
|
573
583
|
|
|
574
584
|
|
|
575
585
|
<!-- BEGIN agent-os-genesis-deploy (generated; do not edit between markers) -->
|
|
@@ -586,9 +596,47 @@ to just this package. Ask your agent to **"deploy `nextcloud-agent` with agent-o
|
|
|
586
596
|
|------|---------|
|
|
587
597
|
| Bare-metal, prod (PyPI) | `uvx nextcloud-mcp` · or `uv tool install nextcloud-agent` |
|
|
588
598
|
| Bare-metal, dev (editable) | `uv pip install -e ".[all]"` · or `pip install -e ".[all]"` |
|
|
589
|
-
| Container, prod | deploy `knucklessg1/nextcloud-agent:
|
|
599
|
+
| Container, prod | deploy `knucklessg1/nextcloud-agent:2.3.1` via docker-compose / swarm / podman / podman-compose / kubernetes |
|
|
590
600
|
| Container, dev (editable) | deploy `docker/compose.dev.yml` (source-mounted at `/src`; edits live on restart) |
|
|
591
601
|
|
|
592
602
|
Secrets are read-existing + seeded via `vault_sync` — you are only prompted for what's missing.
|
|
593
603
|
|
|
594
604
|
<!-- END agent-os-genesis-deploy -->
|
|
605
|
+
|
|
606
|
+
<!-- BEGIN agent-connector-sdk-deployment (generated; do not edit between markers) -->
|
|
607
|
+
|
|
608
|
+
## Deploy with `agent-connector-sdk-deployment`
|
|
609
|
+
|
|
610
|
+
Provision this package with the consolidated **`agent-connector-sdk-deployment`**
|
|
611
|
+
workflow. It selects an installed-package, editable-source, or immutable-container
|
|
612
|
+
path; records only runtime secret and TLS-profile references in `AgentConfig`; and
|
|
613
|
+
runs doctor, registration, policy, observability, and rollback gates. Ask your agent
|
|
614
|
+
to **"deploy `nextcloud-agent` with agent-connector-sdk-deployment"**.
|
|
615
|
+
|
|
616
|
+
| Install mode | Command |
|
|
617
|
+
|------|---------|
|
|
618
|
+
| Installed package | `uv tool install "nextcloud-agent[mcp]"`, then run `nextcloud-mcp` |
|
|
619
|
+
| Editable source | `uv pip install -e ".[agent]"`, then run `nextcloud-mcp` |
|
|
620
|
+
| Immutable container | deploy `knucklessg1/nextcloud-agent:2.3.1` (or a pinned `@sha256:<digest>`) through the operator-selected orchestrator |
|
|
621
|
+
|
|
622
|
+
The repository embeds no deployment profile, credential value, certificate path, or
|
|
623
|
+
environment-specific endpoint. Supply those at runtime through `AgentConfig` and the
|
|
624
|
+
configured secret provider.
|
|
625
|
+
|
|
626
|
+
<!-- END agent-connector-sdk-deployment -->
|
|
627
|
+
|
|
628
|
+
<!-- GOVERNED-CAPABILITY:START -->
|
|
629
|
+
## Governed capability contract
|
|
630
|
+
|
|
631
|
+
This package ships a compact canonical skill surface with specialist procedures
|
|
632
|
+
kept as referenced workflows. The current MCP tools, skill metadata,
|
|
633
|
+
`connector_manifest.yml`, ontology, mappings, shapes, fixtures, migrations,
|
|
634
|
+
tool-schema fingerprints, and certification metadata form one versioned
|
|
635
|
+
capability contract. Validate them together; do not rely on stale tool names or
|
|
636
|
+
historical per-task skill wrappers.
|
|
637
|
+
|
|
638
|
+
Runtime endpoints, credentials, certificate trust, tenant identity, retention,
|
|
639
|
+
and observability policy are deployment inputs and are never packaged values.
|
|
640
|
+
See [Configuration, trust, and privacy](docs/configuration.md) before enabling a
|
|
641
|
+
network transport, connector ingestion, Arbora delegation, or trace export.
|
|
642
|
+
<!-- GOVERNED-CAPABILITY:END -->
|