@baruchiro/paperless-mcp
Version:
Model Context Protocol (MCP) server for interacting with Paperless-NGX document management system. Enables AI assistants to manage documents, tags, correspondents, and document types through the Paperless-NGX API.
81 lines (80 loc) • 3.84 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const strict_1 = __importDefault(require("node:assert/strict"));
const node_test_1 = require("node:test");
const documentEnhancer_1 = require("./documentEnhancer");
const paperlessApi_1 = require("../test/mocks/paperlessApi");
const LARGE_DOCUMENT_COUNT = 709;
const MAX_RESPONSE_SIZE_BYTES = 2000;
function getTextContent(result) {
var _a;
const item = (_a = result.content) === null || _a === void 0 ? void 0 : _a[0];
if (!item || item.type !== "text") {
throw new Error("Expected text content");
}
return item.text;
}
(0, node_test_1.test)("convertDocsWithNames omits `all` and keeps paginated JSON shape", () => __awaiter(void 0, void 0, void 0, function* () {
const docsResponse = {
count: 2,
next: null,
previous: null,
all: [1, 2],
results: [(0, paperlessApi_1.createDocument)(), (0, paperlessApi_1.createDocument)({ id: 2, title: "Document 2" })],
};
const result = yield (0, documentEnhancer_1.convertDocsWithNames)(docsResponse, (0, paperlessApi_1.createPaperlessApiMock)());
const parsed = JSON.parse(getTextContent(result));
strict_1.default.ok(!("all" in parsed));
strict_1.default.deepEqual(parsed.results.map((doc) => doc.id), [1, 2]);
strict_1.default.ok(!("content" in parsed.results[0]));
}));
(0, node_test_1.test)("convertDocsWithNames keeps responses small when source has large `all` arrays", () => __awaiter(void 0, void 0, void 0, function* () {
const docsResponse = {
count: LARGE_DOCUMENT_COUNT,
next: "http://localhost:8000/api/documents/?page=2",
previous: null,
all: Array.from({ length: LARGE_DOCUMENT_COUNT }, (_, index) => index + 1),
results: [
(0, paperlessApi_1.createDocument)({
id: 123,
title: "Large all payload case",
content: "x".repeat(2700),
}),
],
};
const result = yield (0, documentEnhancer_1.convertDocsWithNames)(docsResponse, (0, paperlessApi_1.createPaperlessApiMock)());
const responseText = getTextContent(result);
strict_1.default.ok(responseText.length < MAX_RESPONSE_SIZE_BYTES);
const parsed = JSON.parse(responseText);
strict_1.default.ok(!("all" in parsed));
strict_1.default.ok(!("content" in parsed.results[0]));
}));
(0, node_test_1.test)("convertDocsWithNames returns paginated JSON for empty multi-document results", () => __awaiter(void 0, void 0, void 0, function* () {
const docsResponse = {
count: 0,
next: null,
previous: null,
all: [],
results: [],
};
const result = yield (0, documentEnhancer_1.convertDocsWithNames)(docsResponse, (0, paperlessApi_1.createPaperlessApiMock)());
const parsed = JSON.parse(getTextContent(result));
strict_1.default.deepEqual(parsed, {
count: 0,
next: null,
previous: null,
results: [],
});
}));