@verygoodplugins/mcp-freescout 1.4.0 → 2.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.
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,qCAAqC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;QACzC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;KACpC,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE;QACrD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;QACzC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;KACpC,CAAC;SACD,QAAQ,EAAE;IACb,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE;IACzB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;IAClB,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,wCAAwC;IAC7E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ // ESLint flat config for VGP MCP servers
2
+ // Requires: eslint ^9.0.0, typescript-eslint ^8.0.0
3
+ import eslint from '@eslint/js';
4
+ import tseslint from 'typescript-eslint';
5
+
6
+ export default tseslint.config(
7
+ eslint.configs.recommended,
8
+ ...tseslint.configs.recommended,
9
+ {
10
+ files: ['src/**/*.ts'],
11
+ rules: {
12
+ // Allow unused vars prefixed with underscore
13
+ '@typescript-eslint/no-unused-vars': [
14
+ 'error',
15
+ { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
16
+ ],
17
+ // Allow explicit any in some cases (MCP tools often need flexibility)
18
+ '@typescript-eslint/no-explicit-any': 'warn',
19
+ },
20
+ },
21
+ {
22
+ ignores: ['dist/', 'node_modules/', '**/*.js', '**/*.mjs', '**/*.cjs'],
23
+ }
24
+ );
package/jest.setup.cjs ADDED
@@ -0,0 +1,48 @@
1
+ // Jest setup file for global test configuration
2
+
3
+ // Mock console methods to reduce noise in tests
4
+ global.console = {
5
+ ...console,
6
+ error: jest.fn(),
7
+ warn: jest.fn(),
8
+ // Keep log for debugging
9
+ log: console.log,
10
+ info: console.info,
11
+ debug: console.debug,
12
+ };
13
+
14
+ // Set test environment variables
15
+ process.env.NODE_ENV = 'test';
16
+
17
+ // Global test utilities
18
+ global.testUtils = {
19
+ // Helper to wait for async operations
20
+ wait: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
21
+
22
+ // Helper to create mock FreeScout responses
23
+ mockTicket: (overrides = {}) => ({
24
+ id: 123,
25
+ number: 456,
26
+ subject: 'Test Ticket',
27
+ status: 'active',
28
+ state: 'published',
29
+ createdBy: { id: 1, email: 'user@example.com' },
30
+ customer: { id: 10, email: 'customer@example.com' },
31
+ threads: [],
32
+ cc: [],
33
+ bcc: [],
34
+ _embedded: {},
35
+ ...overrides,
36
+ }),
37
+
38
+ mockThread: (overrides = {}) => ({
39
+ id: 1,
40
+ type: 'message',
41
+ status: 'active',
42
+ state: 'published',
43
+ body: 'Test message',
44
+ createdBy: { id: 1, email: 'user@example.com' },
45
+ createdAt: new Date().toISOString(),
46
+ ...overrides,
47
+ }),
48
+ };
package/package.json CHANGED
@@ -1,18 +1,25 @@
1
1
  {
2
2
  "name": "@verygoodplugins/mcp-freescout",
3
- "version": "1.4.0",
3
+ "version": "2.0.0",
4
4
  "description": "MCP server for FreeScout ticket management and workflow automation",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
+ "mcpName": "io.github.verygoodplugins/mcp-freescout",
7
8
  "bin": {
8
9
  "mcp-freescout": "dist/index.js"
9
10
  },
11
+ "engines": {
12
+ "node": ">=18.0.0"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
10
17
  "scripts": {
11
18
  "build": "tsc",
12
19
  "dev": "tsx watch src/index.ts",
13
20
  "start": "node dist/index.js",
14
21
  "test": "jest",
15
- "lint": "eslint src/**/*.ts",
22
+ "lint": "eslint src/",
16
23
  "format": "prettier --write src/**/*.ts",
17
24
  "prepublishOnly": "npm run build"
18
25
  },
@@ -36,21 +43,20 @@
36
43
  "url": "https://github.com/verygoodplugins/mcp-freescout/issues"
37
44
  },
38
45
  "dependencies": {
39
- "@modelcontextprotocol/sdk": "^0.5.0",
40
- "dotenv": "^16.3.1",
41
- "isomorphic-dompurify": "^2.16.0",
42
- "marked": "^17.0.0",
43
- "node-fetch": "^3.3.2",
44
- "zod": "^3.22.4"
46
+ "@modelcontextprotocol/sdk": "^1.25.1",
47
+ "dotenv": "^17.2.3",
48
+ "zod": "^4.3.5"
45
49
  },
46
50
  "devDependencies": {
47
- "@types/node": "^20.10.0",
48
- "@typescript-eslint/eslint-plugin": "^6.13.0",
49
- "@typescript-eslint/parser": "^6.13.0",
50
- "eslint": "^8.54.0",
51
+ "@eslint/js": "^9.0.0",
52
+ "@types/jest": "^29.5.14",
53
+ "@types/node": "^25.0.3",
54
+ "eslint": "^9.0.0",
51
55
  "jest": "^29.7.0",
52
56
  "prettier": "^3.1.0",
57
+ "ts-jest": "^29.4.6",
53
58
  "tsx": "^4.6.0",
54
- "typescript": "^5.3.0"
59
+ "typescript": "^5.3.0",
60
+ "typescript-eslint": "^8.0.0"
55
61
  }
56
62
  }
package/server.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.verygoodplugins/mcp-freescout",
4
+ "title": "MCP FreeScout",
5
+ "description": "FreeScout ticket management with AI-powered analysis, search filters, and structured outputs.",
6
+ "version": "2.0.0",
7
+ "websiteUrl": "https://verygoodplugins.com/?utm_source=mcp-registry",
8
+ "repository": {
9
+ "url": "https://github.com/verygoodplugins/mcp-freescout",
10
+ "source": "github"
11
+ },
12
+ "license": "GPL-3.0",
13
+ "authors": [
14
+ {
15
+ "name": "Very Good Plugins",
16
+ "url": "https://verygoodplugins.com"
17
+ }
18
+ ],
19
+ "packages": [
20
+ {
21
+ "registryType": "npm",
22
+ "identifier": "@verygoodplugins/mcp-freescout",
23
+ "version": "2.0.0",
24
+ "transport": {
25
+ "type": "stdio"
26
+ },
27
+ "environmentVariables": [
28
+ {
29
+ "name": "FREESCOUT_URL",
30
+ "description": "Your FreeScout instance URL (e.g., https://support.example.com)",
31
+ "isRequired": true,
32
+ "format": "string",
33
+ "isSecret": false
34
+ },
35
+ {
36
+ "name": "FREESCOUT_API_KEY",
37
+ "description": "FreeScout API key with read/write permissions",
38
+ "isRequired": true,
39
+ "format": "string",
40
+ "isSecret": true
41
+ },
42
+ {
43
+ "name": "FREESCOUT_DEFAULT_USER_ID",
44
+ "description": "Default user ID for ticket operations",
45
+ "isRequired": false,
46
+ "format": "string",
47
+ "isSecret": false
48
+ }
49
+ ]
50
+ }
51
+ ],
52
+ "tools": [
53
+ {
54
+ "name": "freescout_get_ticket",
55
+ "description": "Fetch a FreeScout ticket by ID or URL with full thread history"
56
+ },
57
+ {
58
+ "name": "freescout_analyze_ticket",
59
+ "description": "Analyze ticket to determine issue type, root cause, and suggested solution"
60
+ },
61
+ {
62
+ "name": "freescout_search_tickets",
63
+ "description": "Search tickets with explicit filters: assignee ('unassigned'|'any'|userId), status, updatedSince/createdSince (supports '7d', '24h'), pagination"
64
+ },
65
+ {
66
+ "name": "freescout_add_note",
67
+ "description": "Add internal note to a ticket"
68
+ },
69
+ {
70
+ "name": "freescout_update_ticket",
71
+ "description": "Update ticket status and/or assignment"
72
+ },
73
+ {
74
+ "name": "freescout_create_draft_reply",
75
+ "description": "Create a draft reply for human review before sending"
76
+ },
77
+ {
78
+ "name": "freescout_get_ticket_context",
79
+ "description": "Get ticket context and customer info for personalized replies"
80
+ },
81
+ {
82
+ "name": "freescout_get_mailboxes",
83
+ "description": "List available FreeScout mailboxes"
84
+ }
85
+ ],
86
+ "keywords": ["freescout", "helpdesk", "ticket-management", "customer-support", "automation"]
87
+ }