Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 63c65f48bf |
@@ -1,9 +1,3 @@
|
|||||||
## v0.46.2 (2025-11-22)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- **smithery**: Enable JSON response format for scanner compatibility
|
|
||||||
|
|
||||||
## v0.46.1 (2025-11-22)
|
## v0.46.1 (2025-11-22)
|
||||||
|
|
||||||
### Perf
|
### Perf
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
|
```markdown
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="astrolabe.svg" alt="Nextcloud MCP Server" width="128" height="128">
|
<img src="astrolabe.svg" alt="Nextcloud MCP Server" width="128" height="128">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
# Nextcloud MCP Server
|
# Nextcloud MCP Server
|
||||||
|
|
||||||
[](https://github.com/cbcoutinho/nextcloud-mcp-server/pkgs/container/nextcloud-mcp-server)
|
|
||||||
[](https://smithery.ai/server/@cbcoutinho/nextcloud-mcp-server)
|
[](https://smithery.ai/server/@cbcoutinho/nextcloud-mcp-server)
|
||||||
|
[](https://github.com/cbcoutinho/nextcloud-mcp-server/pkgs/container/nextcloud-mcp-server)
|
||||||
|
|
||||||
**A production-ready MCP server that connects AI assistants to your Nextcloud instance.**
|
**A production-ready MCP server that connects AI assistants to your Nextcloud instance.**
|
||||||
|
|
||||||
@@ -223,3 +224,4 @@ This project is licensed under the AGPL-3.0 License. See [LICENSE](./LICENSE) fo
|
|||||||
- [Model Context Protocol](https://github.com/modelcontextprotocol)
|
- [Model Context Protocol](https://github.com/modelcontextprotocol)
|
||||||
- [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)
|
- [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)
|
||||||
- [Nextcloud](https://nextcloud.com/)
|
- [Nextcloud](https://nextcloud.com/)
|
||||||
|
```
|
||||||
@@ -2,8 +2,8 @@ apiVersion: v2
|
|||||||
name: nextcloud-mcp-server
|
name: nextcloud-mcp-server
|
||||||
description: A Helm chart for Nextcloud MCP Server - enables AI assistants to interact with Nextcloud
|
description: A Helm chart for Nextcloud MCP Server - enables AI assistants to interact with Nextcloud
|
||||||
type: application
|
type: application
|
||||||
version: 0.46.2
|
version: 0.46.1
|
||||||
appVersion: "0.46.2"
|
appVersion: "0.46.1"
|
||||||
keywords:
|
keywords:
|
||||||
- nextcloud
|
- nextcloud
|
||||||
- mcp
|
- mcp
|
||||||
|
|||||||
@@ -1072,11 +1072,7 @@ def get_app(transport: str = "sse", enabled_apps: list[str] | None = None):
|
|||||||
# ADR-016: Use Smithery lifespan for stateless mode, BasicAuth otherwise
|
# ADR-016: Use Smithery lifespan for stateless mode, BasicAuth otherwise
|
||||||
if deployment_mode == DeploymentMode.SMITHERY_STATELESS:
|
if deployment_mode == DeploymentMode.SMITHERY_STATELESS:
|
||||||
logger.info("Configuring MCP server for Smithery stateless mode")
|
logger.info("Configuring MCP server for Smithery stateless mode")
|
||||||
# json_response=True returns plain JSON-RPC instead of SSE format,
|
mcp = FastMCP("Nextcloud MCP", lifespan=app_lifespan_smithery)
|
||||||
# required for Smithery scanner compatibility
|
|
||||||
mcp = FastMCP(
|
|
||||||
"Nextcloud MCP", lifespan=app_lifespan_smithery, json_response=True
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
logger.info("Configuring MCP server for BasicAuth mode")
|
logger.info("Configuring MCP server for BasicAuth mode")
|
||||||
mcp = FastMCP("Nextcloud MCP", lifespan=app_lifespan_basic)
|
mcp = FastMCP("Nextcloud MCP", lifespan=app_lifespan_basic)
|
||||||
|
|||||||
@@ -335,6 +335,27 @@ def configure_semantic_tools(mcp: FastMCP):
|
|||||||
Note: Requires MCP client to support sampling. If sampling is unavailable,
|
Note: Requires MCP client to support sampling. If sampling is unavailable,
|
||||||
the tool gracefully degrades to returning documents with an explanation.
|
the tool gracefully degrades to returning documents with an explanation.
|
||||||
The client may prompt the user to approve the sampling request.
|
The client may prompt the user to approve the sampling request.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
>>> # Query about objectives across multiple apps
|
||||||
|
>>> result = await nc_semantic_search_answer(
|
||||||
|
... query="What are my Q1 2025 project goals?",
|
||||||
|
... ctx=ctx
|
||||||
|
... )
|
||||||
|
>>> print(result.generated_answer)
|
||||||
|
"Based on Document 1 (note: Project Kickoff), Document 2 (calendar event:
|
||||||
|
Q1 Planning Meeting), and Document 3 (deck card: Implement semantic search),
|
||||||
|
your main goals are: 1) Improve semantic search accuracy by 20%,
|
||||||
|
2) Deploy new embedding model, 3) Reduce indexing latency..."
|
||||||
|
|
||||||
|
>>> # Query about appointments
|
||||||
|
>>> result = await nc_semantic_search_answer(
|
||||||
|
... query="When is my next dentist appointment?",
|
||||||
|
... ctx=ctx,
|
||||||
|
... limit=10
|
||||||
|
... )
|
||||||
|
>>> len(result.sources) # Calendar events and related notes
|
||||||
|
3
|
||||||
"""
|
"""
|
||||||
# 1. Retrieve relevant documents via existing semantic search
|
# 1. Retrieve relevant documents via existing semantic search
|
||||||
search_response = await nc_semantic_search(
|
search_response = await nc_semantic_search(
|
||||||
|
|||||||
@@ -64,6 +64,20 @@ def configure_webdav_tools(mcp: FastMCP):
|
|||||||
- Text files are decoded to UTF-8
|
- Text files are decoded to UTF-8
|
||||||
- Documents (PDF, DOCX, etc.) are parsed and text is extracted
|
- Documents (PDF, DOCX, etc.) are parsed and text is extracted
|
||||||
- Other binary files are base64 encoded
|
- Other binary files are base64 encoded
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
# Read a text file
|
||||||
|
result = await nc_webdav_read_file("Documents/readme.txt")
|
||||||
|
logger.info(result['content']) # Decoded text content
|
||||||
|
|
||||||
|
# Read a PDF document (automatically parsed)
|
||||||
|
result = await nc_webdav_read_file("Documents/report.pdf")
|
||||||
|
logger.info(result['content']) # Extracted text from PDF
|
||||||
|
logger.info(result['parsing_metadata']) # Document parsing info
|
||||||
|
|
||||||
|
# Read a binary file
|
||||||
|
result = await nc_webdav_read_file("Images/photo.jpg")
|
||||||
|
logger.info(result['encoding']) # 'base64'
|
||||||
"""
|
"""
|
||||||
client = await get_client(ctx)
|
client = await get_client(ctx)
|
||||||
content, content_type = await client.webdav.read_file(path)
|
content, content_type = await client.webdav.read_file(path)
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "nextcloud-mcp-server"
|
name = "nextcloud-mcp-server"
|
||||||
version = "0.46.2"
|
version = "0.46.1"
|
||||||
description = "Model Context Protocol (MCP) server for Nextcloud integration - enables AI assistants to interact with Nextcloud data"
|
description = "Model Context Protocol (MCP) server for Nextcloud integration - enables AI assistants to interact with Nextcloud data"
|
||||||
authors = [
|
authors = [
|
||||||
{name = "Chris Coutinho", email = "chris@coutinho.io"}
|
{name = "Chris Coutinho", email = "chris@coutinho.io"}
|
||||||
|
|||||||
@@ -1936,7 +1936,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nextcloud-mcp-server"
|
name = "nextcloud-mcp-server"
|
||||||
version = "0.46.2"
|
version = "0.46.1"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "aiosqlite" },
|
{ name = "aiosqlite" },
|
||||||
|
|||||||
Reference in New Issue
Block a user