{"_id":"pipedrive-mcp-server","_rev":"4-64a9431965347c59d6876d653c25e762","name":"pipedrive-mcp-server","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"pipedrive-mcp-server","version":"1.0.0","keywords":["pipedrive","mcp","api","claude","cursor","modelcontextprotocol"],"author":"","license":"MIT","_id":"pipedrive-mcp-server@1.0.0","maintainers":[{"name":"willdent","email":"will@dent.ly"}],"homepage":"https://github.com/WillDent/pipedrive-mcp-server#readme","bugs":{"url":"https://github.com/WillDent/pipedrive-mcp-server/issues"},"bin":{"pipedrive-mcp-server":"src/index.js"},"dist":{"shasum":"04cf3e3b5a0f0904fc8453c8907f8330cff401f9","tarball":"https://registry.npmjs.org/pipedrive-mcp-server/-/pipedrive-mcp-server-1.0.0.tgz","fileCount":21,"integrity":"sha512-r9Mg0114eLOM1YOulUlwbRAE0pO0T625O2HJx8F4MqOEt6XVCCXU+dQP4xH4r2GUc4C65/b8crqShCp6rBY+DA==","signatures":[{"sig":"MEYCIQCQgT+W0u6du48oUuUbsCVHw3a0LSNVEdXXDoCjAempvAIhAMZNAdhZlCCberb3IaIUQEJqAGHSR6jDMpxk7X8/LQz6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91029},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"0b6917de0c94c8f544a310b147942a9b4c672488","scripts":{"dev":"nodemon src/index.js","test":"echo \"No tests specified\" && exit 0","start":"node src/index.js","prepublishOnly":"npm test"},"_npmUser":{"name":"willdent","email":"will@dent.ly"},"smithery":{"type":"mcp-server","configSchema":{"pipedriveApiToken":{"type":"string","required":true,"description":"Your Pipedrive API token"}}},"repository":{"url":"git+https://github.com/WillDent/pipedrive-mcp-server.git","type":"git"},"_npmVersion":"10.5.1","description":"Model Context Protocol server for Pipedrive API integration","directories":{},"_nodeVersion":"22.0.0","dependencies":{"zod":"^3.22.4","dotenv":"^16.3.1","winston":"^3.10.0","pipedrive":"^16.0.0","@modelcontextprotocol/sdk":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nodemon":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/pipedrive-mcp-server_1.0.0_1741899063950_0.9793482761156551","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"pipedrive-mcp-server","version":"1.0.2","keywords":["pipedrive","mcp","model-context-protocol","api","crm"],"author":{"name":"Will Dent"},"license":"MIT","_id":"pipedrive-mcp-server@1.0.2","maintainers":[{"name":"willdent","email":"will@dent.ly"}],"homepage":"https://github.com/WillDent/pipedrive-mcp-server#readme","bugs":{"url":"https://github.com/WillDent/pipedrive-mcp-server/issues"},"dist":{"shasum":"e20ebebc227d0ea051e3f1f34998b32364e324ff","tarball":"https://registry.npmjs.org/pipedrive-mcp-server/-/pipedrive-mcp-server-1.0.2.tgz","fileCount":7,"integrity":"sha512-uvbQN0LQs9Tsgg37Kp4qnNCn3QxgTWKkqT1FHzK4bodjLXfG0vTXluLJtYkDxuGmkFCaGWr8emUshz83JK3d+Q==","signatures":[{"sig":"MEYCIQC4kJ3LRYpI5xq3BFFOOajaD4FmZ7O36A4KvKgG10QGAAIhAL6jS3nVjejX4zbR3npFwMAMM2RqzbQlBg0AHD/OUCfw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37244},"main":"build/index.js","type":"module","gitHead":"9e804f9c335e6713eb757ce096abb39a21cb1916","scripts":{"dev":"node --import tsx src/index.ts","build":"tsc","start":"node build/index.js"},"_npmUser":{"name":"willdent","email":"will@dent.ly"},"repository":{"url":"git+https://github.com/WillDent/pipedrive-mcp-server.git","type":"git"},"_npmVersion":"10.5.1","description":"Model Context Protocol server for Pipedrive API integration","directories":{},"_nodeVersion":"22.0.0","dependencies":{"zod":"^3.22.4","dotenv":"^16.4.7","ts-node":"^10.9.2","pipedrive":"^22.10.1","@modelcontextprotocol/sdk":"^1.7.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.2","@types/node":"^20.10.5"},"_npmOperationalInternal":{"tmp":"tmp/pipedrive-mcp-server_1.0.2_1743081453023_0.2675887319213277","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"pipedrive-mcp-server","version":"2.0.0","keywords":["pipedrive","mcp","model-context-protocol","api","crm"],"author":{"name":"Will Dent"},"license":"MIT","_id":"pipedrive-mcp-server@2.0.0","maintainers":[{"name":"willdent","email":"will@dent.ly"}],"homepage":"https://github.com/WillDent/pipedrive-mcp-server#readme","bugs":{"url":"https://github.com/WillDent/pipedrive-mcp-server/issues"},"bin":{"pipedrive-mcp-server":"build/index.js"},"dist":{"shasum":"6e76dd884ca5028a89e623fa2387e75ab6b3e24e","tarball":"https://registry.npmjs.org/pipedrive-mcp-server/-/pipedrive-mcp-server-2.0.0.tgz","fileCount":11,"integrity":"sha512-/W5QDJDeC7uFB+FHshPu6NI7jKJx2OBM21Vk0uwcYsWdd/3rxpdcCGkPjm7h3piChQYxXkHgEuSAA3O3sZmNJA==","signatures":[{"sig":"MEUCIAv2YDE1ACHad/JOkYqOazofEmzqo78TU72UPpoDxF6qAiEA4OIAcEJDU56XWdWP39mR+nsUi38F6eP/OfnD3puqhx0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pipedrive-mcp-server@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":48823},"main":"build/index.js","type":"module","engines":{"node":">=22"},"gitHead":"9a61c1b3cf4a53bfd4c00b50880850eebd088b50","scripts":{"dev":"node --import tsx src/index.ts","test":"node --import tsx --test tests/**/*.test.ts","build":"tsc -p tsconfig.build.json","check":"npm run typecheck && npm test && npm run build","start":"node build/index.js","prepack":"npm run check && npm run validate:package","typecheck":"tsc -p tsconfig.json --noEmit","validate:package":"node scripts/validate-package.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1518c78-a85d-4a5f-8525-152992a212e3"}},"repository":{"url":"git+https://github.com/WillDent/pipedrive-mcp-server.git","type":"git"},"_npmVersion":"11.16.0","description":"Model Context Protocol server for Pipedrive API integration","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.25.0","dotenv":"^16.4.7","pipedrive":"^33.4.3","bottleneck":"^2.19.5","jsonwebtoken":"^9.0.2","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","typescript":"^5.8.2","@types/node":"^24.0.0","@types/jsonwebtoken":"^9.0.6"},"_npmOperationalInternal":{"tmp":"tmp/pipedrive-mcp-server_2.0.0_1784607342684_0.22361982680315395","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"pipedrive-mcp-server","version":"2.1.0","description":"Model Context Protocol server for Pipedrive API integration","main":"build/index.js","bin":{"pipedrive-mcp-server":"build/index.js"},"type":"module","engines":{"node":">=22"},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"node --import tsx --test tests/**/*.test.ts","check":"npm run typecheck && npm test && npm run build","validate:package":"node scripts/validate-package.mjs","prepack":"npm run check && npm run validate:package","start":"node build/index.js","dev":"node --import tsx src/index.ts"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","dotenv":"^16.4.7","bottleneck":"^2.19.5","jsonwebtoken":"^9.0.2","pipedrive":"^33.4.3","zod":"^3.25.0"},"devDependencies":{"@types/jsonwebtoken":"^9.0.6","@types/node":"^24.0.0","tsx":"^4.19.3","typescript":"^5.8.2"},"repository":{"type":"git","url":"git+https://github.com/WillDent/pipedrive-mcp-server.git"},"keywords":["pipedrive","mcp","model-context-protocol","api","crm"],"author":{"name":"Will Dent"},"license":"MIT","bugs":{"url":"https://github.com/WillDent/pipedrive-mcp-server/issues"},"homepage":"https://github.com/WillDent/pipedrive-mcp-server#readme","gitHead":"f2cfc432e21fd0486153e5e221b718aad581feab","_id":"pipedrive-mcp-server@2.1.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-0Wq6XPU1LmwM7XWOTi/Ui5aHgpzYSq9iQ6RqFh3SLJR9Obz03M7wOXstr9rgj2Zwwv++SfrmNh8qmXJx68f8yA==","shasum":"b3b4e6a226c3e3a87b3a0a9b7da93cddccdba5fc","tarball":"https://registry.npmjs.org/pipedrive-mcp-server/-/pipedrive-mcp-server-2.1.0.tgz","fileCount":11,"unpackedSize":55678,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/pipedrive-mcp-server@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCpljHcsP+9QR7YRUS+UkGzWAsxaeSAiVWfH2OZD8YeyQIhAI0xTbCl4xhYhSl/ftkvsabnCDmxvJ8YWrGlQZcf1+Pb"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a1518c78-a85d-4a5f-8525-152992a212e3"}},"directories":{},"maintainers":[{"name":"willdent","email":"will@dent.ly"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pipedrive-mcp-server_2.1.0_1784607635901_0.8920641679882104"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-13T20:51:03.847Z","modified":"2026-07-21T04:20:36.328Z","1.0.0":"2025-03-13T20:51:04.141Z","1.0.2":"2025-03-27T13:17:33.206Z","2.0.0":"2026-07-21T04:15:42.832Z","2.1.0":"2026-07-21T04:20:36.048Z"},"bugs":{"url":"https://github.com/WillDent/pipedrive-mcp-server/issues"},"author":{"name":"Will Dent"},"license":"MIT","homepage":"https://github.com/WillDent/pipedrive-mcp-server#readme","keywords":["pipedrive","mcp","model-context-protocol","api","crm"],"repository":{"type":"git","url":"git+https://github.com/WillDent/pipedrive-mcp-server.git"},"description":"Model Context Protocol server for Pipedrive API integration","maintainers":[{"name":"willdent","email":"will@dent.ly"}],"readme":"# Pipedrive MCP Server\n\nA single-tenant, self-hosted Model Context Protocol server for Pipedrive. Version 2.x uses Pipedrive API v2 for deals, persons, organizations, pipelines, stages, leads, and item search. Notes and users remain isolated behind clearly scoped v1 adapters because Pipedrive has not moved those APIs to v2.\n\nThe server is read-only by default. Two narrowly scoped write tools can be enabled explicitly and remain preview-first.\n\n## Requirements\n\n- Node.js 22 or 24 (Node 24 recommended)\n- A Pipedrive API token\n\n`PIPEDRIVE_DOMAIN` is not used. The official Pipedrive client supplies the API base URL.\n\n## Install and run with stdio\n\nInstall globally:\n\n```bash\nnpm install --global pipedrive-mcp-server\nPIPEDRIVE_API_TOKEN=your-token pipedrive-mcp-server\n```\n\nOr build this repository:\n\n```bash\nnpm ci\nnpm run check\nPIPEDRIVE_API_TOKEN=your-token npm start\n```\n\nExample desktop MCP configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"pipedrive\": {\n      \"command\": \"pipedrive-mcp-server\",\n      \"env\": {\n        \"PIPEDRIVE_API_TOKEN\": \"your-token\"\n      }\n    }\n  }\n}\n```\n\n## Streamable HTTP\n\nThe modern HTTP endpoint defaults to `http://127.0.0.1:3000/mcp`:\n\n```bash\nPIPEDRIVE_API_TOKEN=your-token \\\nMCP_TRANSPORT=http \\\npipedrive-mcp-server\n```\n\n`GET /health` is unauthenticated, host-validated, and returns only service status. The server creates an independent MCP server and transport for every session and closes active sessions during shutdown.\n\nBinding to a non-loopback address requires both an HS256 JWT secret of at least 32 characters and an explicit hostname allowlist:\n\n```bash\nPIPEDRIVE_API_TOKEN=your-token \\\nMCP_TRANSPORT=http \\\nMCP_HOST=0.0.0.0 \\\nMCP_ALLOWED_HOSTS=mcp.example.com \\\nMCP_ALLOWED_ORIGINS=https://app.example.com \\\nMCP_JWT_SECRET='replace-with-at-least-32-random-characters' \\\npipedrive-mcp-server\n```\n\nThe built-in HTTP server does not terminate TLS. Never expose it directly on an untrusted network: place it behind a trusted HTTPS reverse proxy, keep the application port private, and configure the proxy to replace (not append to) forwarding headers. JWT bearer tokens are replayable if captured. Docker Compose therefore publishes the service only on host loopback by default; remote operators must add a TLS terminator before changing that binding.\n\nClients send `Authorization: Bearer <token>`. Tokens must use HS256. `MCP_JWT_ISSUER` and `MCP_JWT_AUDIENCE` add optional claim validation. There is no boot-token setting.\n\n`MCP_ALLOWED_ORIGINS` is an exact, comma-separated allowlist. When it is empty the server emits no CORS headers; wildcard CORS is not supported. `MCP_ALLOWED_HOSTS` contains hostnames only, without schemes, paths, or ports.\n\n## Legacy SSE\n\nThe deprecated compatibility routes are `GET /sse` and `POST /messages`. They are enabled by default in 2.x and can be disabled with `MCP_ENABLE_LEGACY_SSE=false`. `MCP_TRANSPORT=sse` remains an alias for HTTP mode and emits a warning. These routes are planned for removal in 3.0.\n\n## Docker\n\nCopy `.env.example` to `.env`, set `PIPEDRIVE_API_TOKEN`, and set a random `MCP_JWT_SECRET` of at least 32 characters. Then run:\n\n```bash\ndocker compose up --build -d\ndocker compose ps\n```\n\nCompose serves `/mcp` on port 3000, requires JWT for MCP routes, runs as the unprivileged `node` user, and checks `/health` with Node’s built-in `fetch`. Published images use `ghcr.io/willdent/pipedrive-mcp-server`.\n\nFor stdio in Docker, override the transport and disable the HTTP health check:\n\n```bash\ndocker run --rm -i --no-healthcheck \\\n  -e PIPEDRIVE_API_TOKEN=your-token \\\n  -e MCP_TRANSPORT=stdio \\\n  ghcr.io/willdent/pipedrive-mcp-server:latest\n```\n\n## Tools and response contract\n\nRead tools:\n\n- `get-users`\n- `get-deals`, `get-deal`, `get-deal-notes`, `search-deals`\n- `get-persons`, `get-person`, `search-persons`\n- `get-organizations`, `get-organization`, `search-organizations`\n- `get-pipelines`, `get-pipeline`, `get-stages`\n- `search-leads`, `search-all`\n\nList/search tools return JSON text and structured content shaped as:\n\n```json\n{\n  \"items\": [],\n  \"count\": 0,\n  \"nextCursor\": \"optional-cursor\",\n  \"truncated\": false,\n  \"filters\": {}\n}\n```\n\nSingle-record tools return `{ \"item\": {} }`. Stable failures return `{ \"code\", \"message\", \"retryable\" }` with MCP `isError: true`; raw API errors, credentials, and token-bearing URLs are not exposed.\n\n`get-deals` has no hidden status or activity-date defaults. It supports owner, stage, pipeline, status, updated-time, value, cursor, limit, and generic custom-field selection. Page size defaults to 100 and is capped at 500. Value filtering scans at most 2,000 deals and reports `truncated` and `nextCursor` when more records remain. Use `search-deals` for title searches.\n\n## Gated writes\n\nNo write tools are registered unless named in `PIPEDRIVE_WRITE_TOOLS`:\n\n```bash\nPIPEDRIVE_WRITE_TOOLS=move-deal,add-deal-note\n```\n\n- `move-deal` requires `dealId`, `targetStageId`, and `expectedCurrentStageId`. It performs a best-effort optimistic stale-state check immediately before the update. Pipedrive does not expose an atomic conditional stage update, so concurrent changes by another client can still race this check.\n- `add-deal-note` accepts at most 10,000 characters of plain text and HTML-escapes it before sending.\n- Both tools preview by default. A mutation happens only with `execute: true`.\n- Audit output contains only operation, entity ID, outcome, and timestamp—never note contents or credentials.\n\n## Configuration\n\n| Variable | Default | Purpose |\n|---|---:|---|\n| `PIPEDRIVE_API_TOKEN` | required | Pipedrive API token |\n| `MCP_TRANSPORT` | `stdio` | `stdio`, `http`, or deprecated `sse` alias |\n| `MCP_HOST` | `127.0.0.1` | HTTP bind address |\n| `MCP_PORT` | `3000` | HTTP port |\n| `MCP_HTTP_PATH` | `/mcp` | Streamable HTTP path |\n| `MCP_ALLOWED_HOSTS` | local hosts | Exact hostname allowlist |\n| `MCP_ALLOWED_ORIGINS` | empty | Exact CORS origin allowlist |\n| `MCP_ENABLE_LEGACY_SSE` | `true` | Keep `/sse` and `/messages` |\n| `MCP_MAX_SESSIONS` | `100` | Maximum combined HTTP/SSE sessions |\n| `MCP_SESSION_IDLE_TIMEOUT_MS` | `1800000` | Close sessions idle longer than this duration |\n| `MCP_JWT_SECRET` | empty | HS256 secret; required off loopback |\n| `MCP_JWT_ISSUER` | empty | Optional JWT issuer |\n| `MCP_JWT_AUDIENCE` | empty | Optional JWT audience |\n| `PIPEDRIVE_WRITE_TOOLS` | empty | Explicit write-tool allowlist |\n| `PIPEDRIVE_RATE_LIMIT_MIN_TIME_MS` | `250` | Minimum delay between queued calls |\n| `PIPEDRIVE_RATE_LIMIT_MAX_CONCURRENT` | `2` | Maximum concurrent calls |\n\nAll ports, paths, numeric limits, origins, hosts, boolean values, and tool names are validated at startup.\n\n## Migrating from 1.x\n\n1. Upgrade Node to 22 or 24.\n2. Remove `PIPEDRIVE_DOMAIN`, `MCP_JWT_TOKEN`, `MCP_JWT_ALGORITHM`, and `MCP_ENDPOINT`.\n3. Replace HTTP `MCP_TRANSPORT=sse` with `MCP_TRANSPORT=http`; keep the alias temporarily if a client still uses legacy SSE.\n4. Point modern clients at `/mcp`; legacy clients may use `/sse` through 2.x.\n5. Update callers for cursor pagination and the structured response contract.\n6. Review deal queries: `get-deals` no longer silently forces open status or a 365-day activity window.\n7. Leave `PIPEDRIVE_WRITE_TOOLS` empty until each write has been reviewed and sandbox-tested.\n\n## Development and release\n\n```bash\nnpm run typecheck\nnpm test\nnpm run build\nnpm run validate:package\n```\n\nSee [docs/release-checklist.md](docs/release-checklist.md) for automated, Docker, and manual Pipedrive sandbox gates. Releases are tag-driven and use npm trusted publishing plus GHCR semantic tags.\n\n## Scope\n\nVersion 2.x remains single-tenant and self-hosted. Pipedrive OAuth, MCP OAuth, persistent sessions, broad CRUD, and destructive delete tools are intentionally out of scope.\n\n## License\n\nMIT\n","readmeFilename":"readme.md"}