/**
* Retrieves a paginated list of projects for a specified Supabase organization.
*
* @param {Object} args - The arguments for the request.
* @param {string} args.slug - The organization slug.
* @param {number} [args.offset=0] - Number of projects to skip.
* @param {number} [args.limit=100] - Number of projects to return per page.
* @param {string} [args.search] - Search projects by name.
* @param {string} [args.sort] - Sort order for projects (e.g., "name_asc").
* @param {string} [args.statuses] - Comma-separated list of project statuses to filter by (e.g., "ACTIVE_HEALTHY,INACTIVE").
* @returns {Promise<Object>} The response containing the list of projects and pagination info, or an error object.
*/
const getAllProjectsForOrganization = async ({
slug,
offset = 0,
limit = 100,
search,
sort,
statuses
}) => {
const baseUrl = 'https://api.supabase.com';
const token = process.env.SUPABASE_PUBLIC_API_API_KEY;
if (!slug) {
throw new Error('The "slug" parameter is required.');
}
const url = new URL(`${baseUrl}/v1/organizations/${encodeURIComponent(slug)}/projects`);
url.searchParams.append('offset', offset.toString());
url.searchParams.append('limit', limit.toString());
if (search !== undefined) url.searchParams.append('search', search);
if (sort !== undefined) url.searchParams.append('sort', sort);
if (statuses !== undefined) url.searchParams.append('statuses', statuses);
const headers = {
'Accept': 'application/json',
'Authorization': `Bearer ${token}`
};
try {
const response = await fetch(url.toString(), {
method: 'GET',
headers
});
if (!response.ok) {
let errorText;
try {
errorText = await response.text();
} catch {
errorText = 'Unknown error';
}
throw new Error(`Request failed with status ${response.status}: ${errorText}`);
}
return await response.json();
} catch (error) {
return {
error: error instanceof Error ? error.message : String(error)
};
}
};
/**
* Tool definition for retrieving all projects for a given organization in Supabase.
*/
const apiTool = {
function: getAllProjectsForOrganization,
definition: {
type: 'function',
function: {
name: 'get_all_projects_for_organization',
description: 'Returns a paginated list of projects for the specified Supabase organization.',
parameters: {
type: 'object',
properties: {
slug: {
type: 'string',
description: 'The organization slug.'
},
offset: {
type: 'integer',
description: 'Number of projects to skip.'
},
limit: {
type: 'integer',
description: 'Number of projects to return per page.'
},
search: {
type: 'string',
description: 'Search projects by name.'
},
sort: {
type: 'string',
description: 'Sort order for projects (e.g., "name_asc").'
},
statuses: {
type: 'string',
description: 'A comma-separated list of project statuses to filter by. Supported values: "ACTIVE_HEALTHY", "INACTIVE".'
}
},
required: ['slug']
}
}
}
};
export { apiTool };