@kjanat/paperless-mcp 2.0.0 → 2.0.1

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 (2) hide show
  1. package/package.json +2 -2
  2. package/src/index.ts +0 -144
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kjanat/paperless-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "MCP server for interacting with Paperless-ngx document management system.",
5
5
  "keywords": [
6
6
  "mcp",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "license": "MIT",
19
19
  "author": "Kaj Kowalski",
20
- "main": "src/index.ts",
20
+ "type": "module",
21
21
  "bin": {
22
22
  "paperless-mcp": "dist/index.js"
23
23
  },
package/src/index.ts DELETED
@@ -1,144 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
2
-
3
- import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
4
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
-
8
- import { PaperlessAPI } from './api/paperless-api';
9
- import { registerCorrespondentTools } from './tools/correspondents';
10
- import { registerDocumentTools } from './tools/documents';
11
- import { registerDocumentTypeTools } from './tools/documentTypes';
12
- import { registerTagTools } from './tools/tags';
13
-
14
- // CLI argument parsing
15
- const args = process.argv.slice(2);
16
- const useHttp = args.includes('--http');
17
-
18
- function parsePort(): number {
19
- const portIndex = args.indexOf('--port');
20
- if (portIndex !== -1) {
21
- const raw = args[portIndex + 1];
22
- if (raw == null) {
23
- console.warn('--port flag provided without a value, using default 3000');
24
- return 3000;
25
- }
26
- const parsed = parseInt(raw, 10);
27
- if (isNaN(parsed)) {
28
- console.warn(`--port value "${raw}" is not a valid number, using default 3000`);
29
- return 3000;
30
- }
31
- return parsed;
32
- }
33
- return 3000;
34
- }
35
-
36
- const port = parsePort();
37
-
38
- /** Express request with parsed body attached by express.json() middleware. */
39
- interface ParsedRequest extends IncomingMessage {
40
- body?: unknown;
41
- }
42
-
43
- /** JSON-RPC error response shape. */
44
- interface JsonRpcError {
45
- readonly jsonrpc: '2.0';
46
- readonly error: { readonly code: number; readonly message: string };
47
- readonly id: null;
48
- }
49
-
50
- function jsonRpcError(code: number, message: string): JsonRpcError {
51
- return { jsonrpc: '2.0', error: { code, message }, id: null };
52
- }
53
-
54
- async function main(): Promise<void> {
55
- let baseUrl: string | undefined;
56
- let token: string | undefined;
57
-
58
- if (useHttp) {
59
- baseUrl = process.env['PAPERLESS_URL'];
60
- token = process.env['API_KEY'];
61
- if (!baseUrl || !token) {
62
- console.error(
63
- 'When using --http, PAPERLESS_URL and API_KEY environment variables must be set.',
64
- );
65
- process.exit(1);
66
- }
67
- } else {
68
- baseUrl = args[0];
69
- token = args[1];
70
- if (!baseUrl || !token) {
71
- console.error(
72
- 'Usage: paperless-mcp <baseUrl> <token> [--http] [--port <port>]',
73
- );
74
- console.error(
75
- 'Example: paperless-mcp http://localhost:8000 your-api-token --http --port 3000',
76
- );
77
- console.error(
78
- 'When using --http, PAPERLESS_URL and API_KEY environment variables must be set.',
79
- );
80
- process.exit(1);
81
- }
82
- }
83
-
84
- const api = new PaperlessAPI(baseUrl, token);
85
-
86
- /** Create a fresh McpServer with all tools registered. */
87
- function createServer(): McpServer {
88
- const server = new McpServer({ name: 'paperless-ngx', version: '1.0.0' });
89
- registerDocumentTools(server, api);
90
- registerTagTools(server, api);
91
- registerCorrespondentTools(server, api);
92
- registerDocumentTypeTools(server, api);
93
- return server;
94
- }
95
-
96
- if (useHttp) {
97
- const app = createMcpExpressApp({ host: '0.0.0.0' });
98
-
99
- app.post('/mcp', async (req: ParsedRequest, res: ServerResponse) => {
100
- try {
101
- const transport = new StreamableHTTPServerTransport({
102
- sessionIdGenerator: undefined,
103
- });
104
- res.on('close', () => {
105
- void transport.close();
106
- });
107
- const server = createServer();
108
- await server.connect(transport);
109
- await transport.handleRequest(req, res, req.body);
110
- } catch (error: unknown) {
111
- console.error('Error handling MCP request:', error);
112
- if (!res.headersSent) {
113
- res.writeHead(500, { 'Content-Type': 'application/json' });
114
- res.end(JSON.stringify(jsonRpcError(-32603, 'Internal server error')));
115
- }
116
- }
117
- });
118
-
119
- app.get('/mcp', (_req: ParsedRequest, res: ServerResponse) => {
120
- res.writeHead(405, { 'Content-Type': 'application/json' });
121
- res.end(JSON.stringify(jsonRpcError(-32000, 'Method not allowed.')));
122
- });
123
-
124
- app.delete('/mcp', (_req: ParsedRequest, res: ServerResponse) => {
125
- res.writeHead(405, { 'Content-Type': 'application/json' });
126
- res.end(JSON.stringify(jsonRpcError(-32000, 'Method not allowed.')));
127
- });
128
-
129
- app.listen(port, () => {
130
- console.log(
131
- `MCP Stateless Streamable HTTP Server listening on port ${port}`,
132
- );
133
- });
134
- } else {
135
- const server = createServer();
136
- const transport = new StdioServerTransport();
137
- await server.connect(transport);
138
- }
139
- }
140
-
141
- main().catch((e: unknown) => {
142
- const message = e instanceof Error ? e.message : String(e);
143
- console.error(message);
144
- });