Skip to content

Commit 6ccd335

Browse files
committed
chore(release): v0.6.3
1 parent b6b16b4 commit 6ccd335

2 files changed

Lines changed: 128 additions & 78 deletions

File tree

CHANGELOG.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,56 @@ All notable changes to **mcp-creatio** are documented here. The format follows
44
[Keep a Changelog](https://keepachangelog.com/), and the project adheres to
55
[Semantic Versioning](https://semver.org/).
66

7+
## [0.6.3]
8+
9+
Security/perf/architecture remediation (from a full re-review) plus broker production-readiness.
10+
Live-regressed across all transports vs a real Creatio; 537 tests, 94.5% line coverage.
11+
12+
### Security
13+
14+
- **Broker access tokens are audience-bound**`aud` (the `/mcp` resource) + `iss` (origin) are
15+
set and verified on every `/mcp` call, so a token minted by one deployment is rejected by another
16+
sharing `CREATIO_MCP_JWT_SECRET` (token redirection / confused-deputy). `client_id` is bound and
17+
enforced on refresh.
18+
- **`refresh_token` grant** (rotating, single-use, client-bound, gated on the broker still holding
19+
the user's Creatio tokens) — replaces a previously non-redeemable refresh token; standalone
20+
clients no longer re-consent hourly.
21+
- **`CREATIO_MCP_JWT_SECRET` hardening** — minimum 32 chars enforced; **required in production**
22+
(fail-closed); ephemeral-with-warning only outside production.
23+
- **SSRF guard** for the gateway `X-Creatio-Base-Url` override — `CREATIO_MCP_ALLOWED_BASE_URLS`
24+
allowlist; cloud-metadata link-local addresses always blocked.
25+
- **OData identifier-injection guard**, **log redaction** of `code`/`state`/`token` query params,
26+
and **bounded DCR client store** (TTL + cap).
27+
- **RFC 7009 `POST /revoke`** (logout) — revokes the Creatio token upstream
28+
(`/connect/revocation`, best-effort) and purges server-side + issued-refresh tokens; always `200`.
29+
30+
### Added
31+
32+
- **Pluggable broker token store**`CREATIO_MCP_TOKEN_STORE=memory` (default) | `redis`. The
33+
Redis store (`CREATIO_MCP_REDIS_URL`) encrypts tokens at rest (AES-256-GCM;
34+
`CREATIO_MCP_TOKEN_ENC_KEY` or derived from the JWT secret) with native TTL → stateless,
35+
restart-durable, horizontally-scalable broker.
36+
- **`CREATIO_MCP_PUBLIC_URL`** — pins issuer/audience/redirects/discovery to the external origin
37+
behind a TLS-terminating proxy.
38+
- **Proactive session keep-alive** (`CREATIO_MCP_KEEPALIVE_SECONDS`, default `300`s, `0` disables)
39+
for `legacy`/`client_credentials`; reactive reconnect now also recovers from a login-page bounce,
40+
not only `401`.
41+
42+
### Changed
43+
44+
- **Performance** — tuned global undici keep-alive dispatcher for outbound Creatio calls;
45+
single-flight token refresh (no thundering herd); O(1) `describe-entity` via metadata indexes;
46+
compact (non-pretty) tool output; capability-probe negative-cache.
47+
- **Architecture/DRY**`createAuthEdge` factory (auth-strategy out of `HttpServer`);
48+
`httpServer.ts``http-server.ts`; shared identifier/probe/expiry helpers; OData read +
49+
`getCurrentUserInfo` onto the shared `request()` helper; mutation audit now records outcome.
50+
- **Lint**`@typescript-eslint/member-ordering` rule codifies the class-member convention.
51+
52+
### Tests
53+
54+
- Coverage raised to **94.5% lines** (537 tests). Added the broker full-stack API suite
55+
(supertest) and an opt-in real-Redis integration test (auto-skips without Redis).
56+
757
## [0.6.2]
858

959
### Added

package.json

Lines changed: 78 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,80 @@
11
{
2-
"name": "mcp-creatio",
3-
"version": "0.6.2",
4-
"main": "dist/index.js",
5-
"bin": {
6-
"mcp-creatio": "dist/cli.js"
7-
},
8-
"files": [
9-
"dist"
10-
],
11-
"scripts": {
12-
"test": "vitest run",
13-
"test:watch": "vitest",
14-
"test:coverage": "vitest run --coverage",
15-
"clean": "rimraf ./dist",
16-
"prebuild": "npm run clean",
17-
"build": "tsc",
18-
"start": "ts-node src/index.ts",
19-
"start:cli": "ts-node src/cli.ts",
20-
"start:stdio": "ts-node src/cli.ts",
21-
"prepack": "npm run build",
22-
"lint": "eslint --ext .ts src",
23-
"lint:fix": "eslint --ext .ts src --fix",
24-
"format": "prettier --write \"src/**/*.{ts,js,json}\" \"test/**/*.ts\" \"*.md\"",
25-
"format:check": "prettier --check \"src/**/*.{ts,js,json}\" \"test/**/*.ts\" \"*.md\""
26-
},
27-
"repository": {
28-
"type": "git",
29-
"url": "git+https://github.com/CRACKISH/mcp-creatio.git"
30-
},
31-
"keywords": [
32-
"mcp",
33-
"model-context-protocol",
34-
"creatio",
35-
"creatio-crm",
36-
"crm",
37-
"odata",
38-
"mcp-server",
39-
"chatgpt",
40-
"claude",
41-
"github-copilot",
42-
"typescript",
43-
"ai-tools"
44-
],
45-
"author": "",
46-
"license": "MIT",
47-
"bugs": {
48-
"url": "https://github.com/CRACKISH/mcp-creatio/issues"
49-
},
50-
"homepage": "https://github.com/CRACKISH/mcp-creatio#readme",
51-
"description": "MCP server for Creatio CRM. Connect Claude Desktop, ChatGPT, and GitHub Copilot to Creatio via Model Context Protocol and OData v4.",
52-
"devDependencies": {
53-
"@types/express": "5.0.6",
54-
"@types/node": "^26.0.1",
55-
"@types/supertest": "^7.2.0",
56-
"@typescript-eslint/eslint-plugin": "^8.62.0",
57-
"@typescript-eslint/parser": "^8.62.0",
58-
"@vitest/coverage-v8": "^4.1.9",
59-
"eslint": "^9.39.4",
60-
"eslint-config-prettier": "^10.1.8",
61-
"eslint-plugin-import": "^2.32.0",
62-
"eslint-plugin-prettier": "^5.5.6",
63-
"prettier": "^3.8.4",
64-
"rimraf": "^6.1.3",
65-
"supertest": "^7.2.2",
66-
"ts-node": "^10.9.2",
67-
"typescript": "^6.0.3",
68-
"vitest": "^4.1.9"
69-
},
70-
"dependencies": {
71-
"@modelcontextprotocol/sdk": "^1.29.0",
72-
"@types/jsonwebtoken": "^9.0.10",
73-
"express": "^5.2.1",
74-
"fast-xml-parser": "^5.9.3",
75-
"jsonwebtoken": "^9.0.3",
76-
"redis": "^4.7.1",
77-
"undici": "^6.27.0",
78-
"zod": "^4.4.3"
79-
}
2+
"name": "mcp-creatio",
3+
"version": "0.6.3",
4+
"main": "dist/index.js",
5+
"bin": {
6+
"mcp-creatio": "dist/cli.js"
7+
},
8+
"files": [
9+
"dist"
10+
],
11+
"scripts": {
12+
"test": "vitest run",
13+
"test:watch": "vitest",
14+
"test:coverage": "vitest run --coverage",
15+
"clean": "rimraf ./dist",
16+
"prebuild": "npm run clean",
17+
"build": "tsc",
18+
"start": "ts-node src/index.ts",
19+
"start:cli": "ts-node src/cli.ts",
20+
"start:stdio": "ts-node src/cli.ts",
21+
"prepack": "npm run build",
22+
"lint": "eslint --ext .ts src",
23+
"lint:fix": "eslint --ext .ts src --fix",
24+
"format": "prettier --write \"src/**/*.{ts,js,json}\" \"test/**/*.ts\" \"*.md\"",
25+
"format:check": "prettier --check \"src/**/*.{ts,js,json}\" \"test/**/*.ts\" \"*.md\""
26+
},
27+
"repository": {
28+
"type": "git",
29+
"url": "git+https://github.com/CRACKISH/mcp-creatio.git"
30+
},
31+
"keywords": [
32+
"mcp",
33+
"model-context-protocol",
34+
"creatio",
35+
"creatio-crm",
36+
"crm",
37+
"odata",
38+
"mcp-server",
39+
"chatgpt",
40+
"claude",
41+
"github-copilot",
42+
"typescript",
43+
"ai-tools"
44+
],
45+
"author": "",
46+
"license": "MIT",
47+
"bugs": {
48+
"url": "https://github.com/CRACKISH/mcp-creatio/issues"
49+
},
50+
"homepage": "https://github.com/CRACKISH/mcp-creatio#readme",
51+
"description": "MCP server for Creatio CRM. Connect Claude Desktop, ChatGPT, and GitHub Copilot to Creatio via Model Context Protocol and OData v4.",
52+
"devDependencies": {
53+
"@types/express": "5.0.6",
54+
"@types/node": "^26.0.1",
55+
"@types/supertest": "^7.2.0",
56+
"@typescript-eslint/eslint-plugin": "^8.62.0",
57+
"@typescript-eslint/parser": "^8.62.0",
58+
"@vitest/coverage-v8": "^4.1.9",
59+
"eslint": "^9.39.4",
60+
"eslint-config-prettier": "^10.1.8",
61+
"eslint-plugin-import": "^2.32.0",
62+
"eslint-plugin-prettier": "^5.5.6",
63+
"prettier": "^3.8.4",
64+
"rimraf": "^6.1.3",
65+
"supertest": "^7.2.2",
66+
"ts-node": "^10.9.2",
67+
"typescript": "^6.0.3",
68+
"vitest": "^4.1.9"
69+
},
70+
"dependencies": {
71+
"@modelcontextprotocol/sdk": "^1.29.0",
72+
"@types/jsonwebtoken": "^9.0.10",
73+
"express": "^5.2.1",
74+
"fast-xml-parser": "^5.9.3",
75+
"jsonwebtoken": "^9.0.3",
76+
"redis": "^4.7.1",
77+
"undici": "^6.27.0",
78+
"zod": "^4.4.3"
79+
}
8080
}

0 commit comments

Comments
 (0)