@baruchiro/paperless-mcp 0.0.0-test1 → 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/build/api/PaperlessAPI.d.ts +26 -0
  2. package/build/api/PaperlessAPI.js +233 -0
  3. package/build/api/types.d.ts +89 -0
  4. package/build/api/types.js +2 -0
  5. package/build/api/utils.d.ts +1 -0
  6. package/build/api/utils.js +16 -0
  7. package/build/index.d.ts +1 -0
  8. package/build/index.js +160 -0
  9. package/build/tools/correspondents.d.ts +2 -0
  10. package/build/tools/correspondents.js +117 -0
  11. package/build/tools/documentTypes.d.ts +1 -0
  12. package/build/tools/documentTypes.js +117 -0
  13. package/build/tools/documents.d.ts +3 -0
  14. package/build/tools/documents.js +281 -0
  15. package/build/tools/tags.d.ts +3 -0
  16. package/build/tools/tags.js +125 -0
  17. package/build/tools/utils/middlewares.d.ts +3 -0
  18. package/build/tools/utils/middlewares.js +32 -0
  19. package/build/tools/utils/queryString.d.ts +1 -0
  20. package/build/tools/utils/queryString.js +12 -0
  21. package/package.json +11 -6
  22. package/.changeset/README.md +0 -8
  23. package/.changeset/config.json +0 -11
  24. package/.cursor/rules/http-transport.mdc +0 -13
  25. package/.cursor/rules/types-usage.mdc +0 -18
  26. package/.cursor/rules/typescript-mcp-migration.mdc +0 -12
  27. package/.dockerignore +0 -2
  28. package/.github/FUNDING.yml +0 -15
  29. package/.github/workflows/docker-publish.yml +0 -57
  30. package/.github/workflows/release.yml +0 -40
  31. package/CODE_OF_CONDUCT.md +0 -5
  32. package/CONTRIBUTING.md +0 -17
  33. package/Dockerfile +0 -19
  34. package/Paperless-ngx-REST-API.yaml +0 -9975
  35. package/src/api/PaperlessAPI.ts +0 -257
  36. package/src/api/types.ts +0 -97
  37. package/src/api/utils.ts +0 -11
  38. package/src/index.ts +0 -165
  39. package/src/tools/correspondents.ts +0 -137
  40. package/src/tools/documentTypes.ts +0 -137
  41. package/src/tools/documents.ts +0 -316
  42. package/src/tools/tags.ts +0 -143
  43. package/src/tools/utils/middlewares.ts +0 -23
  44. package/src/tools/utils/queryString.ts +0 -9
  45. package/tsconfig.json +0 -108
@@ -0,0 +1,26 @@
1
+ import { BulkEditDocumentsResult, Correspondent, Document, DocumentsResponse, DocumentType, GetCorrespondentsResponse, GetDocumentTypesResponse, GetTagsResponse, Tag } from "./types";
2
+ export declare class PaperlessAPI {
3
+ private readonly baseUrl;
4
+ private readonly token;
5
+ constructor(baseUrl: string, token: string);
6
+ request<T = any>(path: string, options?: RequestInit): Promise<T>;
7
+ bulkEditDocuments(documents: number[], method: string, parameters?: {}): Promise<BulkEditDocumentsResult>;
8
+ postDocument(file: File, metadata?: Record<string, string | string[] | number | number[]>): Promise<string>;
9
+ getDocuments(query?: string): Promise<DocumentsResponse>;
10
+ getDocument(id: number): Promise<Document>;
11
+ searchDocuments(query: string): Promise<DocumentsResponse>;
12
+ downloadDocument(id: number, asOriginal?: boolean): Promise<import("axios").AxiosResponse<any, any>>;
13
+ getTags(): Promise<GetTagsResponse>;
14
+ createTag(data: Partial<Tag>): Promise<Tag>;
15
+ updateTag(id: number, data: Partial<Tag>): Promise<Tag>;
16
+ deleteTag(id: number): Promise<void>;
17
+ getCorrespondents(): Promise<GetCorrespondentsResponse>;
18
+ createCorrespondent(data: Partial<Correspondent>): Promise<Correspondent>;
19
+ updateCorrespondent(id: number, data: Partial<Correspondent>): Promise<Correspondent>;
20
+ deleteCorrespondent(id: number): Promise<void>;
21
+ getDocumentTypes(): Promise<GetDocumentTypesResponse>;
22
+ createDocumentType(data: Partial<DocumentType>): Promise<DocumentType>;
23
+ updateDocumentType(id: number, data: Partial<DocumentType>): Promise<DocumentType>;
24
+ deleteDocumentType(id: number): Promise<void>;
25
+ bulkEditObjects(objects: any, objectType: any, operation: any, parameters?: {}): Promise<any>;
26
+ }
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PaperlessAPI = void 0;
16
+ const axios_1 = __importDefault(require("axios"));
17
+ const form_data_1 = __importDefault(require("form-data"));
18
+ const utils_1 = require("./utils");
19
+ class PaperlessAPI {
20
+ constructor(baseUrl, token) {
21
+ this.baseUrl = baseUrl;
22
+ this.token = token;
23
+ this.baseUrl = baseUrl;
24
+ this.token = token;
25
+ }
26
+ request(path_1) {
27
+ return __awaiter(this, arguments, void 0, function* (path, options = {}) {
28
+ const url = `${this.baseUrl}/api${path}`;
29
+ const isJson = !options.body || typeof options.body === "string";
30
+ const mergedHeaders = Object.assign(Object.assign({ Authorization: `Token ${this.token}`, Accept: "application/json; version=5", "Accept-Language": "en-US,en;q=0.9" }, (isJson ? { "Content-Type": "application/json" } : {})), (0, utils_1.headersToObject)(options.headers));
31
+ try {
32
+ const response = yield (0, axios_1.default)({
33
+ url,
34
+ method: options.method || "GET",
35
+ headers: mergedHeaders,
36
+ data: options.body,
37
+ });
38
+ const body = response.data;
39
+ if (response.status < 200 || response.status >= 300) {
40
+ console.error({
41
+ error: "Error executing request",
42
+ url,
43
+ options,
44
+ status: response.status,
45
+ response: body,
46
+ });
47
+ throw new Error(`HTTP error! status: ${response.status}`);
48
+ }
49
+ return body;
50
+ }
51
+ catch (error) {
52
+ console.error({
53
+ error: "Error executing request",
54
+ message: error instanceof Error ? error.message : String(error),
55
+ url,
56
+ options,
57
+ });
58
+ throw error;
59
+ }
60
+ });
61
+ }
62
+ // Document operations
63
+ bulkEditDocuments(documents_1, method_1) {
64
+ return __awaiter(this, arguments, void 0, function* (documents, method, parameters = {}) {
65
+ return this.request("/documents/bulk_edit/", {
66
+ method: "POST",
67
+ body: JSON.stringify({
68
+ documents,
69
+ method,
70
+ parameters,
71
+ }),
72
+ });
73
+ });
74
+ }
75
+ postDocument(file_1) {
76
+ return __awaiter(this, arguments, void 0, function* (file, metadata = {}) {
77
+ const formData = new form_data_1.default();
78
+ formData.append("document", file);
79
+ // Add optional metadata fields
80
+ if (metadata.title)
81
+ formData.append("title", metadata.title);
82
+ if (metadata.created)
83
+ formData.append("created", metadata.created);
84
+ if (metadata.correspondent)
85
+ formData.append("correspondent", metadata.correspondent);
86
+ if (metadata.document_type)
87
+ formData.append("document_type", metadata.document_type);
88
+ if (metadata.storage_path)
89
+ formData.append("storage_path", metadata.storage_path);
90
+ if (metadata.tags) {
91
+ metadata.tags.forEach((tag) => formData.append("tags", tag));
92
+ }
93
+ if (metadata.archive_serial_number) {
94
+ formData.append("archive_serial_number", metadata.archive_serial_number);
95
+ }
96
+ if (metadata.custom_fields) {
97
+ metadata.custom_fields.forEach((field) => formData.append("custom_fields", field));
98
+ }
99
+ const response = yield axios_1.default.post(`${this.baseUrl}/api/documents/post_document/`, formData, {
100
+ headers: Object.assign({ Authorization: `Token ${this.token}` }, formData.getHeaders()),
101
+ });
102
+ if (response.status < 200 || response.status >= 300) {
103
+ throw new Error(`HTTP error! status: ${response.status}`);
104
+ }
105
+ return response.data;
106
+ });
107
+ }
108
+ getDocuments() {
109
+ return __awaiter(this, arguments, void 0, function* (query = "") {
110
+ return this.request(`/documents/${query}`);
111
+ });
112
+ }
113
+ getDocument(id) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ return this.request(`/documents/${id}/`);
116
+ });
117
+ }
118
+ searchDocuments(query) {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ const response = yield this.request(`/documents/?query=${encodeURIComponent(query)}`);
121
+ return response;
122
+ });
123
+ }
124
+ downloadDocument(id_1) {
125
+ return __awaiter(this, arguments, void 0, function* (id, asOriginal = false) {
126
+ const query = asOriginal ? "?original=true" : "";
127
+ const response = yield axios_1.default.get(`${this.baseUrl}/api/documents/${id}/download/${query}`, {
128
+ headers: {
129
+ Authorization: `Token ${this.token}`,
130
+ },
131
+ responseType: "arraybuffer",
132
+ });
133
+ return response;
134
+ });
135
+ }
136
+ // Tag operations
137
+ getTags() {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ return this.request("/tags/");
140
+ });
141
+ }
142
+ createTag(data) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ return this.request("/tags/", {
145
+ method: "POST",
146
+ body: JSON.stringify(data),
147
+ });
148
+ });
149
+ }
150
+ updateTag(id, data) {
151
+ return __awaiter(this, void 0, void 0, function* () {
152
+ return this.request(`/tags/${id}/`, {
153
+ method: "PUT",
154
+ body: JSON.stringify(data),
155
+ });
156
+ });
157
+ }
158
+ deleteTag(id) {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ return this.request(`/tags/${id}/`, {
161
+ method: "DELETE",
162
+ });
163
+ });
164
+ }
165
+ // Correspondent operations
166
+ getCorrespondents() {
167
+ return __awaiter(this, void 0, void 0, function* () {
168
+ return this.request("/correspondents/");
169
+ });
170
+ }
171
+ createCorrespondent(data) {
172
+ return __awaiter(this, void 0, void 0, function* () {
173
+ return this.request("/correspondents/", {
174
+ method: "POST",
175
+ body: JSON.stringify(data),
176
+ });
177
+ });
178
+ }
179
+ updateCorrespondent(id, data) {
180
+ return __awaiter(this, void 0, void 0, function* () {
181
+ return this.request(`/correspondents/${id}/`, {
182
+ method: "PUT",
183
+ body: JSON.stringify(data),
184
+ });
185
+ });
186
+ }
187
+ deleteCorrespondent(id) {
188
+ return __awaiter(this, void 0, void 0, function* () {
189
+ return this.request(`/correspondents/${id}/`, {
190
+ method: "DELETE",
191
+ });
192
+ });
193
+ }
194
+ // Document type operations
195
+ getDocumentTypes() {
196
+ return __awaiter(this, void 0, void 0, function* () {
197
+ return this.request("/document_types/");
198
+ });
199
+ }
200
+ createDocumentType(data) {
201
+ return __awaiter(this, void 0, void 0, function* () {
202
+ return this.request("/document_types/", {
203
+ method: "POST",
204
+ body: JSON.stringify(data),
205
+ });
206
+ });
207
+ }
208
+ updateDocumentType(id, data) {
209
+ return __awaiter(this, void 0, void 0, function* () {
210
+ return this.request(`/document_types/${id}/`, {
211
+ method: "PUT",
212
+ body: JSON.stringify(data),
213
+ });
214
+ });
215
+ }
216
+ deleteDocumentType(id) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ return this.request(`/document_types/${id}/`, {
219
+ method: "DELETE",
220
+ });
221
+ });
222
+ }
223
+ // Bulk object operations
224
+ bulkEditObjects(objects_1, objectType_1, operation_1) {
225
+ return __awaiter(this, arguments, void 0, function* (objects, objectType, operation, parameters = {}) {
226
+ return this.request("/bulk_edit_objects/", {
227
+ method: "POST",
228
+ body: JSON.stringify(Object.assign({ objects, object_type: objectType, operation }, parameters)),
229
+ });
230
+ });
231
+ }
232
+ }
233
+ exports.PaperlessAPI = PaperlessAPI;
@@ -0,0 +1,89 @@
1
+ export interface Tag {
2
+ id: number;
3
+ slug: string;
4
+ name: string;
5
+ color: string;
6
+ text_color: string;
7
+ match: string;
8
+ matching_algorithm: number;
9
+ is_insensitive: boolean;
10
+ is_inbox_tag: boolean;
11
+ document_count: number;
12
+ owner: number | null;
13
+ user_can_change: boolean;
14
+ }
15
+ export interface PaginationResponse<T> {
16
+ count: number;
17
+ next: string | null;
18
+ previous: string | null;
19
+ all: number[];
20
+ results: T[];
21
+ }
22
+ export interface GetTagsResponse extends PaginationResponse<Tag> {
23
+ }
24
+ export interface DocumentsResponse extends PaginationResponse<Document> {
25
+ }
26
+ export interface Document {
27
+ id: number;
28
+ correspondent: number | null;
29
+ document_type: number | null;
30
+ storage_path: string | null;
31
+ title: string;
32
+ content: string | null;
33
+ tags: number[];
34
+ created: string;
35
+ created_date: string;
36
+ modified: string;
37
+ added: string;
38
+ deleted_at: string | null;
39
+ archive_serial_number: string | null;
40
+ original_file_name: string;
41
+ archived_file_name: string;
42
+ owner: number | null;
43
+ user_can_change: boolean;
44
+ is_shared_by_requester: boolean;
45
+ notes: any[];
46
+ custom_fields: any[];
47
+ page_count: number;
48
+ mime_type: string;
49
+ __search_hit__?: SearchHit;
50
+ }
51
+ export interface SearchHit {
52
+ score: number;
53
+ highlights: string;
54
+ note_highlights: string;
55
+ rank: number;
56
+ }
57
+ export interface Correspondent {
58
+ id: number;
59
+ slug: string;
60
+ name: string;
61
+ match: string;
62
+ matching_algorithm: number;
63
+ is_insensitive: boolean;
64
+ document_count: number;
65
+ last_correspondence: string;
66
+ owner: number | null;
67
+ permissions: any;
68
+ user_can_change: boolean;
69
+ }
70
+ export interface GetCorrespondentsResponse extends PaginationResponse<Correspondent> {
71
+ }
72
+ export interface DocumentType {
73
+ id: number;
74
+ slug: string;
75
+ name: string;
76
+ match: string;
77
+ matching_algorithm: number;
78
+ is_insensitive: boolean;
79
+ document_count: number;
80
+ last_correspondence: string;
81
+ owner: number | null;
82
+ permissions: any;
83
+ user_can_change: boolean;
84
+ }
85
+ export interface GetDocumentTypesResponse extends PaginationResponse<DocumentType> {
86
+ }
87
+ export interface BulkEditDocumentsResult {
88
+ result: string;
89
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const headersToObject: (headers: any) => Record<string, string>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.headersToObject = void 0;
4
+ const headersToObject = (headers) => {
5
+ if (!headers)
6
+ return {};
7
+ if (typeof headers.forEach === "function") {
8
+ const obj = {};
9
+ headers.forEach((value, key) => {
10
+ obj[key] = value;
11
+ });
12
+ return obj;
13
+ }
14
+ return headers;
15
+ };
16
+ exports.headersToObject = headersToObject;
@@ -0,0 +1 @@
1
+ export {};
package/build/index.js ADDED
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
16
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
17
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
18
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
19
+ const express_1 = __importDefault(require("express"));
20
+ const PaperlessAPI_1 = require("./api/PaperlessAPI");
21
+ const correspondents_1 = require("./tools/correspondents");
22
+ const documents_1 = require("./tools/documents");
23
+ const documentTypes_1 = require("./tools/documentTypes");
24
+ const tags_1 = require("./tools/tags");
25
+ // Simple CLI argument parsing
26
+ const args = process.argv.slice(2);
27
+ const useHttp = args.includes("--http");
28
+ let port = 3000;
29
+ const portIndex = args.indexOf("--port");
30
+ if (portIndex !== -1 && args[portIndex + 1]) {
31
+ const parsed = parseInt(args[portIndex + 1], 10);
32
+ if (!isNaN(parsed))
33
+ port = parsed;
34
+ }
35
+ function main() {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ let baseUrl;
38
+ let token;
39
+ if (useHttp) {
40
+ baseUrl = process.env.PAPERLESS_URL;
41
+ token = process.env.API_KEY;
42
+ if (!baseUrl || !token) {
43
+ console.error("When using --http, PAPERLESS_URL and API_KEY environment variables must be set.");
44
+ process.exit(1);
45
+ }
46
+ }
47
+ else {
48
+ baseUrl = args[0];
49
+ token = args[1];
50
+ if (!baseUrl || !token) {
51
+ console.error("Usage: paperless-mcp <baseUrl> <token> [--http] [--port <port>]");
52
+ console.error("Example: paperless-mcp http://localhost:8000 your-api-token --http --port 3000");
53
+ console.error("When using --http, PAPERLESS_URL and API_KEY environment variables must be set.");
54
+ process.exit(1);
55
+ }
56
+ }
57
+ // Initialize API client and server once
58
+ const api = new PaperlessAPI_1.PaperlessAPI(baseUrl, token);
59
+ const server = new mcp_js_1.McpServer({ name: "paperless-ngx", version: "1.0.0" });
60
+ (0, documents_1.registerDocumentTools)(server, api);
61
+ (0, tags_1.registerTagTools)(server, api);
62
+ (0, correspondents_1.registerCorrespondentTools)(server, api);
63
+ (0, documentTypes_1.registerDocumentTypeTools)(server, api);
64
+ if (useHttp) {
65
+ const app = (0, express_1.default)();
66
+ app.use(express_1.default.json());
67
+ // Store transports for each session
68
+ const sseTransports = {};
69
+ app.post("/mcp", (req, res) => __awaiter(this, void 0, void 0, function* () {
70
+ try {
71
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
72
+ sessionIdGenerator: undefined,
73
+ });
74
+ res.on("close", () => {
75
+ transport.close();
76
+ });
77
+ yield server.connect(transport);
78
+ yield transport.handleRequest(req, res, req.body);
79
+ }
80
+ catch (error) {
81
+ console.error("Error handling MCP request:", error);
82
+ if (!res.headersSent) {
83
+ res.status(500).json({
84
+ jsonrpc: "2.0",
85
+ error: {
86
+ code: -32603,
87
+ message: "Internal server error",
88
+ },
89
+ id: null,
90
+ });
91
+ }
92
+ }
93
+ }));
94
+ app.get("/mcp", (req, res) => __awaiter(this, void 0, void 0, function* () {
95
+ res.writeHead(405).end(JSON.stringify({
96
+ jsonrpc: "2.0",
97
+ error: {
98
+ code: -32000,
99
+ message: "Method not allowed.",
100
+ },
101
+ id: null,
102
+ }));
103
+ }));
104
+ app.delete("/mcp", (req, res) => __awaiter(this, void 0, void 0, function* () {
105
+ res.writeHead(405).end(JSON.stringify({
106
+ jsonrpc: "2.0",
107
+ error: {
108
+ code: -32000,
109
+ message: "Method not allowed.",
110
+ },
111
+ id: null,
112
+ }));
113
+ }));
114
+ app.get("/sse", (req, res) => __awaiter(this, void 0, void 0, function* () {
115
+ console.log("SSE request received");
116
+ try {
117
+ const transport = new sse_js_1.SSEServerTransport("/messages", res);
118
+ sseTransports[transport.sessionId] = transport;
119
+ res.on("close", () => {
120
+ delete sseTransports[transport.sessionId];
121
+ transport.close();
122
+ });
123
+ yield server.connect(transport);
124
+ }
125
+ catch (error) {
126
+ console.error("Error handling SSE request:", error);
127
+ if (!res.headersSent) {
128
+ res.status(500).json({
129
+ jsonrpc: "2.0",
130
+ error: {
131
+ code: -32603,
132
+ message: "Internal server error",
133
+ },
134
+ id: null,
135
+ });
136
+ }
137
+ }
138
+ }));
139
+ app.post("/messages", (req, res) => __awaiter(this, void 0, void 0, function* () {
140
+ const sessionId = req.query.sessionId;
141
+ const transport = sseTransports[sessionId];
142
+ if (transport) {
143
+ yield transport.handlePostMessage(req, res, req.body);
144
+ }
145
+ else {
146
+ res.status(400).send("No transport found for sessionId");
147
+ }
148
+ }));
149
+ app.listen(port, () => {
150
+ console.log(`MCP Stateless Streamable HTTP Server listening on port ${port}`);
151
+ });
152
+ }
153
+ else {
154
+ const transport = new stdio_js_1.StdioServerTransport();
155
+ yield server.connect(transport);
156
+ console.log("MCP server running with stdio transport");
157
+ }
158
+ });
159
+ }
160
+ main().catch((e) => console.error(e.message));
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp";
2
+ export declare function registerCorrespondentTools(server: McpServer, api: any): void;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.registerCorrespondentTools = registerCorrespondentTools;
13
+ const zod_1 = require("zod");
14
+ const middlewares_1 = require("./utils/middlewares");
15
+ const queryString_1 = require("./utils/queryString");
16
+ function registerCorrespondentTools(server, api) {
17
+ server.tool("list_correspondents", {
18
+ page: zod_1.z.number().optional(),
19
+ page_size: zod_1.z.number().optional(),
20
+ name__icontains: zod_1.z.string().optional(),
21
+ name__iendswith: zod_1.z.string().optional(),
22
+ name__iexact: zod_1.z.string().optional(),
23
+ name__istartswith: zod_1.z.string().optional(),
24
+ ordering: zod_1.z.string().optional(),
25
+ }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
26
+ if (!api)
27
+ throw new Error("Please configure API connection first");
28
+ const queryString = (0, queryString_1.buildQueryString)(args);
29
+ const response = yield api.request(`/correspondents/${queryString ? `?${queryString}` : ""}`);
30
+ return {
31
+ content: [
32
+ {
33
+ type: "text",
34
+ text: JSON.stringify(response),
35
+ },
36
+ ],
37
+ };
38
+ })));
39
+ server.tool("get_correspondent", { id: zod_1.z.number() }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
40
+ if (!api)
41
+ throw new Error("Please configure API connection first");
42
+ const response = yield api.request(`/correspondents/${args.id}/`);
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(response) }],
45
+ };
46
+ })));
47
+ server.tool("create_correspondent", {
48
+ name: zod_1.z.string(),
49
+ match: zod_1.z.string().optional(),
50
+ matching_algorithm: zod_1.z
51
+ .enum(["any", "all", "exact", "regular expression", "fuzzy"])
52
+ .optional(),
53
+ }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
54
+ if (!api)
55
+ throw new Error("Please configure API connection first");
56
+ const response = yield api.createCorrespondent(args);
57
+ return {
58
+ content: [{ type: "text", text: JSON.stringify(response) }],
59
+ };
60
+ })));
61
+ server.tool("update_correspondent", {
62
+ id: zod_1.z.number(),
63
+ name: zod_1.z.string(),
64
+ match: zod_1.z.string().optional(),
65
+ matching_algorithm: zod_1.z
66
+ .enum(["any", "all", "exact", "regular expression", "fuzzy"])
67
+ .optional(),
68
+ }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
69
+ if (!api)
70
+ throw new Error("Please configure API connection first");
71
+ const response = yield api.request(`/correspondents/${args.id}/`, {
72
+ method: "PUT",
73
+ body: JSON.stringify(args),
74
+ });
75
+ return {
76
+ content: [{ type: "text", text: JSON.stringify(response) }],
77
+ };
78
+ })));
79
+ server.tool("delete_correspondent", { id: zod_1.z.number() }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
80
+ if (!api)
81
+ throw new Error("Please configure API connection first");
82
+ yield api.request(`/correspondents/${args.id}/`, { method: "DELETE" });
83
+ return {
84
+ content: [
85
+ { type: "text", text: JSON.stringify({ status: "deleted" }) },
86
+ ],
87
+ };
88
+ })));
89
+ server.tool("bulk_edit_correspondents", {
90
+ correspondent_ids: zod_1.z.array(zod_1.z.number()),
91
+ operation: zod_1.z.enum(["set_permissions", "delete"]),
92
+ owner: zod_1.z.number().optional(),
93
+ permissions: zod_1.z
94
+ .object({
95
+ view: zod_1.z.object({
96
+ users: zod_1.z.array(zod_1.z.number()).optional(),
97
+ groups: zod_1.z.array(zod_1.z.number()).optional(),
98
+ }),
99
+ change: zod_1.z.object({
100
+ users: zod_1.z.array(zod_1.z.number()).optional(),
101
+ groups: zod_1.z.array(zod_1.z.number()).optional(),
102
+ }),
103
+ })
104
+ .optional(),
105
+ merge: zod_1.z.boolean().optional(),
106
+ }, (0, middlewares_1.errorMiddleware)((args, extra) => __awaiter(this, void 0, void 0, function* () {
107
+ if (!api)
108
+ throw new Error("Please configure API connection first");
109
+ return api.bulkEditObjects(args.correspondent_ids, "correspondents", args.operation, args.operation === "set_permissions"
110
+ ? {
111
+ owner: args.owner,
112
+ permissions: args.permissions,
113
+ merge: args.merge,
114
+ }
115
+ : {});
116
+ })));
117
+ }
@@ -0,0 +1 @@
1
+ export declare function registerDocumentTypeTools(server: any, api: any): void;