fixed issues

This commit is contained in:
2025-09-04 22:27:48 +03:00
parent 0a362b37b1
commit 3c23e30b0c

View File

@@ -171,6 +171,20 @@ class AppwriteMCPServer {
required: ["databaseId"] required: ["databaseId"]
} }
}, },
{
name: "update_collection",
description: "Update collection name and permissions",
inputSchema: {
type: "object",
properties: {
databaseId: { type: "string", description: "ID of the database" },
collectionId: { type: "string", description: "ID of the collection" },
name: { type: "string", description: "New collection name" },
permissions: { type: "array", description: "Collection permissions (optional)", items: { type: "string" } }
},
required: ["databaseId", "collectionId", "name"]
}
},
{ {
name: "delete_collection", name: "delete_collection",
description: "Delete a collection from a database", description: "Delete a collection from a database",
@@ -449,13 +463,15 @@ class AppwriteMCPServer {
}, },
{ {
name: "list_documents", name: "list_documents",
description: "List documents in a collection with optional queries", description: "List documents in a collection with optional queries, limit, and offset",
inputSchema: { inputSchema: {
type: "object", type: "object",
properties: { properties: {
databaseId: { type: "string", description: "ID of the database" }, databaseId: { type: "string", description: "ID of the database" },
collectionId: { type: "string", description: "ID of the collection" }, collectionId: { type: "string", description: "ID of the collection" },
queries: { type: "array", description: "Query filters (optional)", items: { type: "string" } } queries: { type: "array", description: "Query filters (optional)", items: { type: "string" } },
limit: { type: "number", description: "Maximum number of documents to return (default 25, max 5000)" },
offset: { type: "number", description: "Number of documents to skip for pagination (default 0)" }
}, },
required: ["databaseId", "collectionId"] required: ["databaseId", "collectionId"]
} }
@@ -507,11 +523,13 @@ class AppwriteMCPServer {
}, },
{ {
name: "list_users", name: "list_users",
description: "List all users", description: "List all users with pagination",
inputSchema: { inputSchema: {
type: "object", type: "object",
properties: { properties: {
queries: { type: "array", description: "Query filters (optional)", items: { type: "string" } } queries: { type: "array", description: "Query filters (optional)", items: { type: "string" } },
limit: { type: "number", description: "Maximum number of users to return (default 25, max 5000)" },
offset: { type: "number", description: "Number of users to skip for pagination (default 0)" }
} }
} }
}, },
@@ -1910,6 +1928,8 @@ class AppwriteMCPServer {
return await this.createCollection(request.params.arguments); return await this.createCollection(request.params.arguments);
case "list_collections": case "list_collections":
return await this.listCollections(request.params.arguments); return await this.listCollections(request.params.arguments);
case "update_collection":
return await this.updateCollection(request.params.arguments);
case "delete_collection": case "delete_collection":
return await this.deleteCollection(request.params.arguments); return await this.deleteCollection(request.params.arguments);
@@ -2311,6 +2331,28 @@ class AppwriteMCPServer {
}; };
} }
private async updateCollection(args: any) {
if (!this.databases) throw new Error("Databases not initialized");
const { databaseId, collectionId, name, permissions } = args;
const collection = await this.databases.updateCollection(
databaseId,
collectionId,
name,
permissions
) as any;
return {
content: [
{
type: "text",
text: `Collection updated:\n- ID: ${collection.$id}\n- Name: ${collection.name}\n- Documents: ${collection.total}\n- Permissions: ${collection.$permissions?.join(', ') || 'None'}`
}
]
};
}
private async deleteCollection(args: any) { private async deleteCollection(args: any) {
if (!this.databases) throw new Error("Databases not initialized"); if (!this.databases) throw new Error("Databases not initialized");
@@ -2800,15 +2842,29 @@ ${attribute.default !== undefined ? `- Default: ${attribute.default}` : ''}`
private async listDocuments(args: any) { private async listDocuments(args: any) {
if (!this.databases) throw new Error("Databases not initialized"); if (!this.databases) throw new Error("Databases not initialized");
const { databaseId, collectionId, queries } = args; const { databaseId, collectionId, queries, limit, offset } = args;
const documents = await this.databases.listDocuments(databaseId, collectionId, queries || []); // Build query array with limit and offset
const allQueries = [...(queries || [])];
if (limit !== undefined) {
allQueries.push(Query.limit(limit));
}
if (offset !== undefined) {
allQueries.push(Query.offset(offset));
}
const documents = await this.databases.listDocuments(databaseId, collectionId, allQueries) as any;
const currentLimit = limit || 25;
const currentOffset = offset || 0;
const showing = Math.min(documents.documents.length, currentLimit);
const totalDocs = documents.total;
return { return {
content: [ content: [
{ {
type: "text", type: "text",
text: `Documents in collection ${collectionId} (${documents.total}):\n${JSON.stringify(documents.documents, null, 2)}` text: `Documents in collection ${collectionId}:\n- Total: ${totalDocs}\n- Showing: ${showing} (offset: ${currentOffset}, limit: ${currentLimit})\n- Has more: ${currentOffset + showing < totalDocs}\n\n${JSON.stringify(documents.documents, null, 2)}`
} }
] ]
}; };
@@ -2876,9 +2932,18 @@ ${attribute.default !== undefined ? `- Default: ${attribute.default}` : ''}`
private async listUsers(args: any) { private async listUsers(args: any) {
if (!this.users) throw new Error("Users service not initialized"); if (!this.users) throw new Error("Users service not initialized");
const { queries } = args; const { queries, limit, offset } = args;
const users = await this.users.list(queries || []); // Build query array with limit and offset
const allQueries = [...(queries || [])];
if (limit !== undefined) {
allQueries.push(Query.limit(limit));
}
if (offset !== undefined) {
allQueries.push(Query.offset(offset));
}
const users = await this.users.list(allQueries) as any;
const header = `${'Name'.padEnd(20)} ${'Email'.padEnd(30)} ${'Phone'.padEnd(15)} ${'Email Ver'.padEnd(10)} ${'Phone Ver'.padEnd(10)} ID`; const header = `${'Name'.padEnd(20)} ${'Email'.padEnd(30)} ${'Phone'.padEnd(15)} ${'Email Ver'.padEnd(10)} ${'Phone Ver'.padEnd(10)} ID`;
const separator = '-'.repeat(100); const separator = '-'.repeat(100);
@@ -2892,11 +2957,16 @@ ${attribute.default !== undefined ? `- Default: ${attribute.default}` : ''}`
return `${name} ${email} ${phone} ${emailVer} ${phoneVer} ${user.$id}`; return `${name} ${email} ${phone} ${emailVer} ${phoneVer} ${user.$id}`;
}).join('\n'); }).join('\n');
const currentLimit = limit || 25;
const currentOffset = offset || 0;
const showing = users.users.length;
const totalUsers = users.total;
return { return {
content: [ content: [
{ {
type: "text", type: "text",
text: `Users (${users.total}):\n\n${header}\n${separator}\n${userList}` text: `Users:\n- Total: ${totalUsers}\n- Showing: ${showing} (offset: ${currentOffset}, limit: ${currentLimit})\n- Has more: ${currentOffset + showing < totalUsers}\n\n${header}\n${separator}\n${userList}`
} }
] ]
}; };