{"_id":"freshdesk-mcp","_rev":"4-12abd595993dc09f05eedce17c56239b","name":"freshdesk-mcp","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"freshdesk-mcp","version":"1.0.0","keywords":["freshdesk","mcp","model-context-protocol","ai","llm","claude","cursor","helpdesk","typescript"],"author":{"name":"hashcott"},"license":"MIT","_id":"freshdesk-mcp@1.0.0","maintainers":[{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"}],"homepage":"https://github.com/hashcott/freshdesk-mcp#readme","bugs":{"url":"https://github.com/hashcott/freshdesk-mcp/issues"},"bin":{"freshdesk-mcp":"dist/index.js"},"dist":{"shasum":"c7b6641fb0f62cfa9f91fb469d6f556556ddaa96","tarball":"https://registry.npmjs.org/freshdesk-mcp/-/freshdesk-mcp-1.0.0.tgz","fileCount":45,"integrity":"sha512-NXJHQBK8aJKoPIf8qDVBf9z45e6hCyQoc7lK1309LYeXyXKmqm+o4gIFDIsXR7egkGtTk7iPh/Ryx4BEAeOvmA==","signatures":[{"sig":"MEYCIQDGbRUXDzJS60zNh6jhETQknj3HrzSC0MRehuiYSQN9JwIhAJzU4ThK5Kv55l9Nt8+sr6C0vyRdIA1iCWrCezvzVxy6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":454840},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ce415326b10a94df5f347a0bce436fe4eeac42b9","scripts":{"dev":"tsc --watch","build":"tsc","start":"node dist/index.js","dev:http":"tsc && MCP_TRANSPORT=http node dist/index.js","dev:stdio":"tsc && MCP_TRANSPORT=stdio node dist/index.js","start:http":"MCP_TRANSPORT=http node dist/index.js","start:stdio":"MCP_TRANSPORT=stdio node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"},"repository":{"url":"git+https://github.com/hashcott/freshdesk-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Freshdesk (TypeScript) — supports stdio and Streamable HTTP transports","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.5","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/freshdesk-mcp_1.0.0_1780652566837_0.16151785110768047","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"freshdesk-mcp","version":"1.1.0","keywords":["freshdesk","mcp","model-context-protocol","ai","llm","claude","cursor","helpdesk","typescript"],"author":{"name":"hashcott"},"license":"MIT","_id":"freshdesk-mcp@1.1.0","maintainers":[{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"}],"homepage":"https://github.com/hashcott/freshdesk-mcp#readme","bugs":{"url":"https://github.com/hashcott/freshdesk-mcp/issues"},"bin":{"freshdesk-mcp":"dist/index.js"},"dist":{"shasum":"5c8c20754561eda70161b8bffc0792c593e553ab","tarball":"https://registry.npmjs.org/freshdesk-mcp/-/freshdesk-mcp-1.1.0.tgz","fileCount":45,"integrity":"sha512-LWM0kym3p9tIkukWfbLIn6QglsfQb4LV+EhtqdRWmHdvZS0wAVQCxmBBEKYIICF7l5B177ES+a8H4HbUB+Zm2Q==","signatures":[{"sig":"MEYCIQCPRRgJlZwkTxThOqWzDOOUv5Ml0py8OSu0yPXGvgvf6AIhAI4lx69p4SE3w+2AXo6iXJ9PbAdw22JZmKWuhp64D9Kl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/freshdesk-mcp@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":453735},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"edf8fe6812ab7218648e150f2ad34d8abd23a8f6","scripts":{"dev":"tsc --watch","lint":"biome check src/","build":"tsc","start":"node dist/index.js","format":"biome format --write src/","dev:http":"tsc && MCP_TRANSPORT=http node dist/index.js","lint:fix":"biome check --write src/","dev:stdio":"tsc && MCP_TRANSPORT=stdio node dist/index.js","start:http":"MCP_TRANSPORT=http node dist/index.js","start:stdio":"MCP_TRANSPORT=stdio node dist/index.js","prepublishOnly":"npm run lint && npm run build"},"_npmUser":{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"},"repository":{"url":"git+https://github.com/hashcott/freshdesk-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Freshdesk (TypeScript) — supports stdio and Streamable HTTP transports","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.5","@biomejs/biome":"^2.4.16","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/freshdesk-mcp_1.1.0_1780654058295_0.14600514264050268","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"freshdesk-mcp","version":"1.1.1","keywords":["freshdesk","mcp","model-context-protocol","ai","llm","claude","cursor","helpdesk","typescript"],"author":{"name":"hashcott"},"license":"MIT","_id":"freshdesk-mcp@1.1.1","maintainers":[{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"}],"homepage":"https://github.com/hashcott/freshdesk-mcp#readme","bugs":{"url":"https://github.com/hashcott/freshdesk-mcp/issues"},"bin":{"freshdesk-mcp":"dist/index.js"},"dist":{"shasum":"3968bdd48748bdca41dcb3e0d87cc37e7088868d","tarball":"https://registry.npmjs.org/freshdesk-mcp/-/freshdesk-mcp-1.1.1.tgz","fileCount":45,"integrity":"sha512-ZyLywSfK4gkkGAFZoLFEc6BY5irWaBcPU3LkEGVQl1+wr30aBCIK7O8GtodhK5uH1QfSe1JS5Q1Fw39QqSXW7A==","signatures":[{"sig":"MEUCIG/mBWik8ytxNENg3vANYx7SdDBiULXeDJR1vuJSMx/BAiEAryKIVAs/q2ytZ6x2n4qbDT9uv4P+r3Vbv5dzDo36KTc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/freshdesk-mcp@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":453583},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"5a13eaf83f951e6caba4d74f14fd0bd5425773b1","scripts":{"dev":"tsc --watch","lint":"biome check src/","build":"tsc","start":"node dist/index.js","format":"biome format --write src/","dev:http":"tsc && MCP_TRANSPORT=http node dist/index.js","lint:fix":"biome check --write src/","dev:stdio":"tsc && MCP_TRANSPORT=stdio node dist/index.js","start:http":"MCP_TRANSPORT=http node dist/index.js","start:stdio":"MCP_TRANSPORT=stdio node dist/index.js","prepublishOnly":"npm run lint && npm run build"},"_npmUser":{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"},"repository":{"url":"git+https://github.com/hashcott/freshdesk-mcp.git","type":"git"},"_npmVersion":"10.9.8","description":"MCP server for Freshdesk (TypeScript) — supports stdio and Streamable HTTP transports","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.5","@biomejs/biome":"^2.4.16","@types/express":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/freshdesk-mcp_1.1.1_1780654770491_0.5906594598143624","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"freshdesk-mcp@2.0.0","bin":{"freshdesk-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/hashcott/freshdesk-mcp/issues"},"dist":{"shasum":"61ffd3aeb84aecfc97165c16c766412bd5cf7087","tarball":"https://registry.npmjs.org/freshdesk-mcp/-/freshdesk-mcp-2.0.0.tgz","fileCount":48,"integrity":"sha512-LTl1xEU9vUq4G5HdbggReSllPGQuGdi+1FUI/+4rreqFh9ZEsr9I3tD7AEQyRWr2KNATtS+ZbBMpsrSnYzBJWw==","signatures":[{"sig":"MEUCICcMrY/3SdrDb1jedwZKMTHMAgrC4WsVSkn7oC8b45NZAiEAsL9lfYZwp7sFTvntZdWTBxRWnGCOeDJVqKgtpj3qm5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDK+3mi5EaOda4uO86O/zjxXHt9HeqBzwORlxONPzE/AwIgN5jLE8Gw/VbHsINiv8AyF5C86dDF6bMTnYwFiU00BGE="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/freshdesk-mcp@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":610378},"main":"dist/index.js","name":"freshdesk-mcp","type":"module","types":"./dist/index.d.ts","author":{"name":"hashcott"},"engines":{"node":">=18.0.0"},"gitHead":"efd93761b028a15d8ea24dc548c7760b2620694f","license":"MIT","scripts":{"dev":"tsc --watch","lint":"biome check src/","test":"npm run build && node --test test/*.test.mjs","build":"tsc","start":"node dist/index.js","format":"biome format --write src/","dev:http":"tsc && MCP_TRANSPORT=http node dist/index.js","docs:api":"node scripts/gen-api-docs.mjs","lint:fix":"biome check --write src/","dev:stdio":"tsc && MCP_TRANSPORT=stdio node dist/index.js","start:http":"MCP_TRANSPORT=http node dist/index.js","start:stdio":"MCP_TRANSPORT=stdio node dist/index.js","prepublishOnly":"npm run lint && npm run build"},"version":"2.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"85a78340-3efd-4878-afc6-bc77506b1f5f"}},"homepage":"https://github.com/hashcott/freshdesk-mcp#readme","keywords":["freshdesk","mcp","model-context-protocol","ai","llm","claude","cursor","helpdesk","typescript"],"repository":{"url":"git+https://github.com/hashcott/freshdesk-mcp.git","type":"git"},"_npmVersion":"11.21.0","description":"MCP server for Freshdesk (TypeScript) — supports stdio and Streamable HTTP transports","directories":{},"maintainers":[{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"}],"_nodeVersion":"22.23.3","dependencies":{"zod":"^3.23.8","express":"^4.21.2","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.5","@biomejs/biome":"^2.4.16","@types/express":"^5.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/freshdesk-mcp_2.0.0_1791805873513_0.33927608604468484"}}},"time":{"created":"2026-06-05T09:42:46.606Z","modified":"2026-10-12T11:51:15.023Z","1.0.0":"2026-06-05T09:42:46.981Z","1.1.0":"2026-06-05T10:07:38.440Z","1.1.1":"2026-06-05T10:19:30.641Z","2.0.0":"2026-10-12T11:51:13.630Z"},"bugs":{"url":"https://github.com/hashcott/freshdesk-mcp/issues"},"author":{"name":"hashcott"},"license":"MIT","homepage":"https://github.com/hashcott/freshdesk-mcp#readme","keywords":["freshdesk","mcp","model-context-protocol","ai","llm","claude","cursor","helpdesk","typescript"],"repository":{"url":"git+https://github.com/hashcott/freshdesk-mcp.git","type":"git"},"description":"MCP server for Freshdesk (TypeScript) — supports stdio and Streamable HTTP transports","maintainers":[{"name":"duchanhstyle","email":"duchanhstyle@gmail.com"}],"readme":"<h1 align=\"center\">freshdesk-mcp</h1>\n\n<p align=\"center\">\n  <strong>Model Context Protocol server for the Freshdesk REST API</strong><br>\n  TypeScript · Zod validation · stdio &amp; Streamable HTTP transports\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/freshdesk-mcp\"><img src=\"https://img.shields.io/npm/v/freshdesk-mcp.svg\" alt=\"npm\"></a>\n  <a href=\"https://www.npmjs.com/package/freshdesk-mcp\"><img src=\"https://img.shields.io/npm/dw/freshdesk-mcp.svg\" alt=\"npm downloads\"></a>\n  <a href=\"https://nodejs.org/\"><img src=\"https://img.shields.io/badge/node-%E2%89%A518-brightgreen.svg\" alt=\"Node\"></a>\n  <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-5.7-blue.svg\" alt=\"TypeScript\"></a>\n  <a href=\"https://github.com/modelcontextprotocol/typescript-sdk\"><img src=\"https://img.shields.io/badge/MCP%20SDK-1.29-purple.svg\" alt=\"MCP SDK\"></a>\n  <a href=\"docs/API.md\"><img src=\"https://img.shields.io/badge/tools-255-orange.svg\" alt=\"Tools\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-green.svg\" alt=\"License\"></a>\n</p>\n\n<p align=\"center\">\n  Exposes the full <a href=\"https://developers.freshdesk.com/api/\">Freshdesk public API</a> as MCP tools —\n  compatible with Claude Desktop, Cursor, Continue, and any MCP-capable LLM client.\n</p>\n\n---\n\n## Table of Contents\n\n- [Highlights](#highlights)\n- [Quick Start](#quick-start)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Running the Server](#running-the-server)\n  - [stdio (local)](#stdio-local)\n  - [Streamable HTTP (remote / hosted)](#streamable-http-remote--hosted)\n  - [Docker](#docker)\n- [Client Integration](#client-integration)\n- [Tool & Prompt Catalog](#tool--prompt-catalog)\n- [Project Layout](#project-layout)\n- [Development](#development)\n- [Documentation](#documentation)\n- [Contributing](#contributing)\n- [Security](#security)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n---\n\n## Highlights\n\n| | |\n|---|---|\n| **255 tools** | Tickets, Conversations, Attachments & inline images, Ticket Forms, Contacts, Agents, Availability, Skills, Roles, Groups, Companies, Discussions, Solutions, CSAT Surveys, FSM, Time Entries, Email Configs & Settings, Products, Business Hours, SLA, Automations, Custom Objects, Canned Responses, Outbound Email & WhatsApp, and more |\n| **2 prompts** | `create_ticket`, `create_reply` |\n| **Strict Zod validation** | Derived from official Freshdesk docs — invalid input is rejected before hitting the API, with structured `{path, code, message}` errors |\n| **Dual transport** | `stdio` for local clients (Claude Desktop, Cursor) or `Streamable HTTP` for hosted/remote agents |\n| **Pagination** | Link-header parsing + `page` / `per_page` on every list endpoint |\n| **Single binary** | `node dist/index.js` — zero runtime dependencies on Python or Freshdesk SDKs |\n| **No deprecation warnings** | Built on `@modelcontextprotocol/sdk@^1.29.0` using `registerTool` / `registerPrompt` |\n\n---\n\n## Quick Start\n\n```bash\n# 1. Set credentials\nexport FRESHDESK_API_KEY=your_api_key\nexport FRESHDESK_DOMAIN=yourcompany.freshdesk.com\n\n# 2a. Run via npx (no install needed)\nnpx freshdesk-mcp\n\n# 2b. Or install globally\nnpm install -g freshdesk-mcp && freshdesk-mcp\n\n# 2c. Or run as HTTP server\nMCP_TRANSPORT=http PORT=3000 npx freshdesk-mcp\n# → POST  http://localhost:3000/mcp\n# → GET   http://localhost:3000/health\n```\n\n---\n\n## Installation\n\nRequires **Node.js ≥ 18** (uses the native `fetch` API).\n\n**From npm (recommended)**\n\n```bash\nnpm install -g freshdesk-mcp\nfreshdesk-mcp\n```\n\n**Using npx (no install needed)**\n\n```bash\nnpx freshdesk-mcp\n```\n\n**From source**\n\n```bash\ngit clone <this-repo>\ncd freshdesk-mcp\nnpm install && npm run build\n```\n\nBuild artifacts land in `dist/`. Runnable as `node dist/index.js` or via the `freshdesk-mcp` bin shortcut when installed globally.\n\n---\n\n## Configuration\n\n| Env Var | Required | Default | Description |\n|---|---|---|---|\n| `FRESHDESK_API_KEY` | ✅ | — | API key from your Freshdesk profile → **Profile → API Key** |\n| `FRESHDESK_DOMAIN` | ✅ | — | Account domain, e.g. `acme.freshdesk.com` (no scheme, no trailing `/`) |\n| `MCP_TRANSPORT` | ❌ | `stdio` | `stdio` or `http` |\n| `PORT` | ❌ | `3000` | HTTP listen port (only when `MCP_TRANSPORT=http`) |\n\nCopy `.env.example` to `.env` and load via your runner for a file-based workflow.\n\n> Full reference: **[docs/CONFIGURATION.md](docs/CONFIGURATION.md)**\n\n---\n\n## Running the Server\n\n### stdio (local)\n\nDefault mode — reads/writes JSON-RPC on stdin/stdout. This is what Claude Desktop, Cursor, and Continue expect.\n\n```bash\nnode dist/index.js\n# equivalently:\nMCP_TRANSPORT=stdio node dist/index.js\nnode dist/index.js --transport=stdio\n```\n\n### Streamable HTTP (remote / hosted)\n\nConforms to the MCP **Streamable HTTP** transport spec (single endpoint, session-based via `mcp-session-id` header).\n\n```bash\nMCP_TRANSPORT=http PORT=3000 node dist/index.js\n```\n\n| Method | Path | Purpose |\n|---|---|---|\n| `POST` | `/mcp` | Initialize a session or send a JSON-RPC request |\n| `GET` | `/mcp` | SSE stream for server-initiated messages (per-session) |\n| `DELETE` | `/mcp` | Terminate a session |\n| `GET` | `/health` | Liveness probe — `{ status: \"ok\", ... }` |\n\n### Docker\n\n```bash\ndocker build -t freshdesk-mcp .\n\n# stdio mode\ndocker run --rm -i \\\n  -e FRESHDESK_API_KEY=xxx \\\n  -e FRESHDESK_DOMAIN=acme.freshdesk.com \\\n  freshdesk-mcp\n\n# HTTP mode\ndocker run --rm -p 3000:3000 \\\n  -e MCP_TRANSPORT=http \\\n  -e FRESHDESK_API_KEY=xxx \\\n  -e FRESHDESK_DOMAIN=acme.freshdesk.com \\\n  freshdesk-mcp\n```\n\n---\n\n## Client Integration\n\nAll stdio-based MCP clients accept the same shape: a `command` + `args` + `env`. The examples below assume you've either installed globally (`npm install -g freshdesk-mcp`) or you let `npx -y freshdesk-mcp` fetch on demand. Replace credentials with your own.\n\n### Claude Desktop\n\n`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) · `%APPDATA%/Claude/claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"freshdesk\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"freshdesk-mcp\"],\n      \"env\": {\n        \"FRESHDESK_API_KEY\": \"xxx\",\n        \"FRESHDESK_DOMAIN\": \"acme.freshdesk.com\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code (CLI)\n\n```bash\nclaude mcp add freshdesk \\\n  --env FRESHDESK_API_KEY=xxx \\\n  --env FRESHDESK_DOMAIN=acme.freshdesk.com \\\n  -- npx -y freshdesk-mcp\n```\n\nOr edit `~/.claude.json` (project-level) → `mcpServers` with the same shape as Claude Desktop above.\n\n### Cursor\n\n`~/.cursor/mcp.json` (global) or `<project>/.cursor/mcp.json` (per project):\n\n```json\n{\n  \"mcpServers\": {\n    \"freshdesk\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"freshdesk-mcp\"],\n      \"env\": {\n        \"FRESHDESK_API_KEY\": \"xxx\",\n        \"FRESHDESK_DOMAIN\": \"acme.freshdesk.com\"\n      }\n    }\n  }\n}\n```\n\nEnable it under **Settings → Cursor Settings → MCP**.\n\n### OpenAI Codex CLI\n\n`~/.codex/config.toml`:\n\n```toml\n[mcp_servers.freshdesk]\ncommand = \"npx\"\nargs = [\"-y\", \"freshdesk-mcp\"]\nenv = { FRESHDESK_API_KEY = \"xxx\", FRESHDESK_DOMAIN = \"acme.freshdesk.com\" }\n```\n\n### Windsurf (Codeium)\n\n`~/.codeium/windsurf/mcp_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"freshdesk\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"freshdesk-mcp\"],\n      \"env\": {\n        \"FRESHDESK_API_KEY\": \"xxx\",\n        \"FRESHDESK_DOMAIN\": \"acme.freshdesk.com\"\n      }\n    }\n  }\n}\n```\n\n### Continue\n\n`~/.continue/config.json` (or `.continue/config.json` in a workspace) under the `mcpServers` array:\n\n```json\n{\n  \"mcpServers\": [\n    {\n      \"name\": \"freshdesk\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"freshdesk-mcp\"],\n      \"env\": {\n        \"FRESHDESK_API_KEY\": \"xxx\",\n        \"FRESHDESK_DOMAIN\": \"acme.freshdesk.com\"\n      }\n    }\n  ]\n}\n```\n\n### Zed\n\nIn Zed's `settings.json` under `context_servers`:\n\n```json\n{\n  \"context_servers\": {\n    \"freshdesk\": {\n      \"command\": {\n        \"path\": \"npx\",\n        \"args\": [\"-y\", \"freshdesk-mcp\"],\n        \"env\": {\n          \"FRESHDESK_API_KEY\": \"xxx\",\n          \"FRESHDESK_DOMAIN\": \"acme.freshdesk.com\"\n        }\n      }\n    }\n  }\n}\n```\n\n### Generic stdio client\n\nAny client that follows the [MCP stdio transport spec](https://modelcontextprotocol.io/specification#stdio-transport) can spawn:\n\n```bash\nFRESHDESK_API_KEY=xxx FRESHDESK_DOMAIN=acme.freshdesk.com npx -y freshdesk-mcp\n```\n\n### Remote / HTTP (Streamable HTTP)\n\nFor hosted setups (web agents, multi-user gateways), run the server in HTTP mode and point clients at the `/mcp` endpoint:\n\n```bash\nMCP_TRANSPORT=http PORT=3000 npx -y freshdesk-mcp\n```\n\nSessions begin with `POST /mcp` containing an `initialize` body; the server returns an `mcp-session-id` header that the client must echo on every subsequent request. Run behind an authenticated reverse proxy — the server itself has no built-in auth.\n\n---\n\n## Tool & Prompt Catalog\n\n> Full tool index with parameter signatures: **[docs/API.md](docs/API.md)**\n\n| Group | Tools | Highlights |\n|---|---|---|\n| Tickets | 33 | CRUD, search (query language), restore, bulk create/update/delete, merge, archived, summary, watchers, parent/child & tracker associations, portal user access |\n| Conversations & Attachments | 10 | Reply, note, forward, reply_to_forward, update/delete; full-thread pagination; read attachments and inline screenshots |\n| Ticket Fields, Sections & Forms | 19 | Field CRUD, dynamic sections, portal ticket forms (+ clone) |\n| Contacts | 23 | CRUD, filter, merge, make_agent, restore, hard_delete, invite, export/import, contact fields |\n| Companies | 18 | CRUD, autocomplete, filter, contacts, export/import, company fields |\n| Agents & Groups | 23 | Agents CRUD + `me` + bulk, availability/load settings, groups, admin groups, group membership |\n| Canned Responses | 11 | Folders + responses CRUD, bulk create |\n| Solutions | 18 | Categories / folders / subfolders / articles, search, translations |\n| Discussions | 24 | Forum categories / forums / topics / comments CRUD, follow/monitor |\n| Surveys & CSAT | 7 | New CSAT surveys + responses, classic satisfaction ratings |\n| Automations & Scenarios | 8 | Rules CRUD per type, scenario automations |\n| Custom Objects | 8 | Schemas, records CRUD, filter, count |\n| FSM | 5 | Service tasks (tickets of type `Service Task`) |\n| Outbound | 3 | Outbound email, proactive WhatsApp templates + status |\n| Threads | 9 | Collaboration threads + messages |\n| Time Entries | 5 | CRUD + toggle timer |\n| Admin & misc | 31 | Skills, roles, products, business hours, SLA, email configs, mailboxes, email settings, auto-BCC, helpdesk settings, account + export, jobs, contact activities |\n\nZod schema reference: **[docs/SCHEMAS.md](docs/SCHEMAS.md)**\n\n---\n\n## Project Layout\n\n```\nfreshdesk-mcp/\n├── src/\n│   ├── index.ts              # Entry — picks stdio | http from env/argv\n│   ├── server.ts             # Builds McpServer, registers all tools + prompts\n│   ├── freshdesk.ts          # Fetch-based HTTP client + Link header parser\n│   ├── util.ts               # text(), validate(), tool() wrapper\n│   ├── prompts.ts            # create_ticket, create_reply prompts\n│   ├── schemas/\n│   │   └── index.ts          # Zod schemas for every Freshdesk resource\n│   └── tools/\n│       ├── tickets.ts        # Tickets, conversations, ticket fields/sections/forms\n│       ├── attachments.ts    # Attachment + inline image download (SSRF-guarded)\n│       ├── contacts.ts       # Contacts + contact fields\n│       ├── companies.ts      # Companies + company fields\n│       ├── agents.ts         # Agents, availability, groups, admin-groups\n│       ├── canned.ts         # Canned responses + folders\n│       ├── solutions.ts      # Categories / folders / articles\n│       ├── admin_misc.ts     # Skills, roles, products, BH, SLA, mailboxes,\n│       │                     # email configs, settings, account, threads, time entries\n│       └── extras.ts         # Discussions, surveys, automations, scenario,\n│                             # custom objects, FSM, outbound, jobs,\n│                             # contact activities\n├── docs/\n│   ├── API.md                # Full tool reference\n│   ├── SCHEMAS.md            # Zod schema reference\n│   ├── CONFIGURATION.md      # Env vars + transports\n│   └── DEVELOPMENT.md        # Dev workflow + architecture\n├── dist/                     # Build output (gitignored)\n├── Dockerfile\n├── package.json\n├── tsconfig.json\n├── CHANGELOG.md\n├── CONTRIBUTING.md\n├── CODE_OF_CONDUCT.md\n├── SECURITY.md\n└── LICENSE\n```\n\n---\n\n## Development\n\n```bash\nnpm install\nnpm run dev:stdio    # build + run stdio mode\nnpm run dev:http     # build + run HTTP mode on PORT (default 3000)\nnpm run build        # type-check + emit dist/\nnpm run start        # run from dist/\n```\n\n> Architecture notes, adding tools, schema authoring: **[docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)**\n\n---\n\n## Documentation\n\n| Doc | Purpose |\n|---|---|\n| [docs/API.md](docs/API.md) | Complete tool index, parameter signatures, return shapes |\n| [docs/SCHEMAS.md](docs/SCHEMAS.md) | Zod schema reference for every Freshdesk resource |\n| [docs/CONFIGURATION.md](docs/CONFIGURATION.md) | Env vars, transports, runtime tuning |\n| [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | Architecture, adding tools, schema authoring |\n| [CHANGELOG.md](CHANGELOG.md) | Version history |\n| [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute |\n| [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Community guidelines |\n| [SECURITY.md](SECURITY.md) | Reporting vulnerabilities |\n\n**Upstream references**\n\n- [Freshdesk API](https://developers.freshdesk.com/api/)\n- [Model Context Protocol](https://modelcontextprotocol.io/)\n- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)\n\n---\n\n## Contributing\n\nContributions are welcome. Read **[CONTRIBUTING.md](CONTRIBUTING.md)** before opening a PR and abide by the **[Code of Conduct](CODE_OF_CONDUCT.md)**.\n\n**Quick checklist**\n\n1. Fork and branch off `main`\n2. `npm install && npm run build` — must pass cleanly\n3. New tools: add Zod schema → register in `src/tools/*.ts` → document in `docs/API.md`\n4. Open a PR using the provided template\n\n---\n\n## Security\n\nFound a vulnerability? **Do not open a public issue.** Report via the channels in **[SECURITY.md](SECURITY.md)**.\n\nThis server transmits your Freshdesk API key to `*.freshdesk.com` over HTTPS only. The key is never logged. Run the HTTP transport behind an authenticated reverse proxy when exposing it beyond `localhost`.\n\n---\n\n## License\n\n[MIT](LICENSE) © hashcott contributors\n\n---\n\n## Acknowledgments\n\n- The Freshdesk team for the well-documented public API\n- The Model Context Protocol authors and `@modelcontextprotocol/sdk` maintainers\n","readmeFilename":"README.md"}