littlesis-mcp
Version:
MCP server for LittleSis API - track corporate power and accountability
85 lines • 3.35 kB
JavaScript
const BASE_URL = 'https://littlesis.org/api';
class LittleSisApiError extends Error {
statusCode;
errors;
constructor(statusCode, errors) {
super(`LittleSis API Error (${statusCode}): ${errors.map(e => e.title).join(', ')}`);
this.statusCode = statusCode;
this.errors = errors;
this.name = 'LittleSisApiError';
}
}
async function makeApiRequest(endpoint) {
const url = `${BASE_URL}${endpoint}`;
try {
const response = await fetch(url);
if (!response.ok) {
const errorData = await response.json();
throw new LittleSisApiError(response.status, errorData.errors);
}
return await response.json();
}
catch (error) {
if (error instanceof LittleSisApiError) {
throw error;
}
throw new Error(`Failed to fetch from LittleSis API: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
export class LittleSisApi {
// Entity endpoints
static async getEntity(id) {
return makeApiRequest(`/entities/${id}`);
}
static async getEntities(ids) {
if (ids.length > 300) {
throw new Error('Maximum 300 entities per request');
}
return makeApiRequest(`/entities?ids=${ids.join(',')}`);
}
static async searchEntities(params) {
const searchParams = new URLSearchParams();
searchParams.append('q', params.q);
if (params.page)
searchParams.append('page', params.page.toString());
if (params.regions)
searchParams.append('regions', params.regions.toString());
if (params.tags)
searchParams.append('tags', params.tags);
return makeApiRequest(`/entities/search?${searchParams.toString()}`);
}
static async getEntityExtensions(id, details = false) {
const detailsParam = details ? '?details=TRUE' : '';
return makeApiRequest(`/entities/${id}/extensions${detailsParam}`);
}
static async getEntityRelationships(id, params) {
const searchParams = new URLSearchParams();
if (params?.category_id)
searchParams.append('category_id', params.category_id.toString());
if (params?.sort)
searchParams.append('sort', params.sort);
if (params?.page)
searchParams.append('page', params.page.toString());
const paramString = searchParams.toString();
const endpoint = `/entities/${id}/relationships${paramString ? '?' + paramString : ''}`;
return makeApiRequest(endpoint);
}
static async getEntityConnections(id, params) {
const searchParams = new URLSearchParams();
if (params?.category_id)
searchParams.append('category_id', params.category_id.toString());
if (params?.page)
searchParams.append('page', params.page.toString());
const paramString = searchParams.toString();
const endpoint = `/entities/${id}/connections${paramString ? '?' + paramString : ''}`;
return makeApiRequest(endpoint);
}
static async getEntityLists(id) {
return makeApiRequest(`/entities/${id}/lists`);
}
// Relationship endpoints
static async getRelationship(id) {
return makeApiRequest(`/relationships/${id}`);
}
}
//# sourceMappingURL=api.js.map