@lionchat/mcp-server 1.4.0 → 1.6.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/docs/instructions.md +22 -0
- package/dist/docs/resources/best-practices.md +2 -1
- package/dist/docs/resources/filtros-e-relatorios.md +146 -0
- package/dist/docs/resources/reports-guide.md +24 -3
- package/dist/resources.js +6 -0
- package/dist/resources.js.map +1 -1
- package/dist/sanitize.d.ts +9 -0
- package/dist/sanitize.js +136 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/tools.js +27 -3
- package/dist/tools.js.map +1 -1
- package/dist/utils.d.ts +5 -1
- package/dist/utils.js +78 -10
- package/dist/utils.js.map +1 -1
- package/endpoints.json +354 -56
- package/package.json +1 -1
package/dist/utils.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// AIDEV-NOTE: Utility module for LionChat MCP server
|
|
2
2
|
// Path substitution, query string building, param separation, and response formatting
|
|
3
|
+
import { sanitizeResponse } from './sanitize.js';
|
|
3
4
|
// AIDEV-NOTE: Replace {account_id} and other {param} placeholders in URL path templates
|
|
4
5
|
export function substitutePath(pathTemplate, accountId, params) {
|
|
5
6
|
let result = pathTemplate.replace('{account_id}', accountId);
|
|
@@ -37,17 +38,84 @@ export function buildQueryString(params) {
|
|
|
37
38
|
// AIDEV-NOTE: Format API response data for MCP client consumption
|
|
38
39
|
// AIDEV-NOTE: [fix relatorios 18/07] Teto 80k (era 50k) — relatorios/listas gordas de conversa
|
|
39
40
|
// (partial + kanban_items com funnel.stages) estouravam 50k e cortavam o registro no meio.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
// AIDEV-NOTE: [2026-07-24] Teto configuravel por env LIONCHAT_MCP_MAX_RESPONSE (min 10k).
|
|
42
|
+
const MAX_RESPONSE_LENGTH = (() => {
|
|
43
|
+
const env = Number.parseInt(process.env.LIONCHAT_MCP_MAX_RESPONSE ?? '', 10);
|
|
44
|
+
return Number.isFinite(env) && env >= 10000 ? env : 80000;
|
|
45
|
+
})();
|
|
46
|
+
// AIDEV-NOTE: [2026-07-24] TODA resposta passa por sanitizeResponse (segredos SEMPRE redigidos;
|
|
47
|
+
// campos pesados podados por default — ver sanitize.ts). Ao estourar o teto, tenta CORTE LIMPO:
|
|
48
|
+
// remove itens inteiros do final do maior array em vez de fatiar o JSON no meio de um registro.
|
|
49
|
+
export function formatResponse(data, opts) {
|
|
50
|
+
const sanitized = typeof data === 'string'
|
|
51
|
+
? data
|
|
52
|
+
: sanitizeResponse(data, { slim: opts?.slim !== false, toolId: opts?.toolId });
|
|
53
|
+
const text = typeof sanitized === 'string' ? sanitized : JSON.stringify(sanitized, null, 2);
|
|
54
|
+
if (text.length <= MAX_RESPONSE_LENGTH) {
|
|
55
|
+
return text;
|
|
49
56
|
}
|
|
50
|
-
|
|
57
|
+
const clean = tryCleanCut(sanitized, MAX_RESPONSE_LENGTH);
|
|
58
|
+
if (clean) {
|
|
59
|
+
return clean;
|
|
60
|
+
}
|
|
61
|
+
// AIDEV-NOTE: [fix relatorios 18/07] Fallback: aviso HONESTO — o JSON acima esta cortado no
|
|
62
|
+
// meio (INCOMPLETO). Nem toda ferramenta pagina (relatorios agregados nao), entao o certo e
|
|
63
|
+
// ESTREITAR: intervalo de datas menor, mais filtros, per_page menor, ou page nas listas.
|
|
64
|
+
return (text.slice(0, MAX_RESPONSE_LENGTH) +
|
|
65
|
+
`\n\n[RESPOSTA CORTADA em ${MAX_RESPONSE_LENGTH} caracteres — os dados acima estao INCOMPLETOS e o JSON pode estar truncado no meio de um registro. Para obter tudo: reduza o intervalo de datas, adicione filtros, use per_page menor, ou pagine com page nas ferramentas de LISTA. Relatorios agregados NAO paginam — restrinja o periodo.]`);
|
|
66
|
+
}
|
|
67
|
+
// AIDEV-NOTE: [2026-07-24] Corte limpo — localiza o maior array de itens nos shapes conhecidos
|
|
68
|
+
// ({data:[...]}, {payload:[...]}, {items:[...]}, {data:{payload:[...]}} ou array na raiz) e faz
|
|
69
|
+
// busca binaria pelo maior prefixo de itens INTEIROS que cabe no teto. Shape nao reconhecido ou
|
|
70
|
+
// array com <2 itens => null (chamador usa o fallback de fatia crua).
|
|
71
|
+
function tryCleanCut(value, max) {
|
|
72
|
+
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
73
|
+
let arr = null;
|
|
74
|
+
let rebuild = null;
|
|
75
|
+
if (Array.isArray(value)) {
|
|
76
|
+
arr = value;
|
|
77
|
+
rebuild = (sliced) => sliced;
|
|
78
|
+
}
|
|
79
|
+
else if (isObj(value)) {
|
|
80
|
+
for (const key of ['data', 'payload', 'items']) {
|
|
81
|
+
const v = value[key];
|
|
82
|
+
if (Array.isArray(v) && v.length > 1) {
|
|
83
|
+
arr = v;
|
|
84
|
+
rebuild = (sliced) => ({ ...value, [key]: sliced });
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
// Shape cru aninhado de conversas: { data: { meta, payload: [...] } }
|
|
88
|
+
if (key === 'data' && isObj(v) && Array.isArray(v.payload) && v.payload.length > 1) {
|
|
89
|
+
arr = v.payload;
|
|
90
|
+
rebuild = (sliced) => ({ ...value, data: { ...v, payload: sliced } });
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!arr || !rebuild || arr.length < 2) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
let lo = 1;
|
|
99
|
+
let hi = arr.length - 1;
|
|
100
|
+
let best = null;
|
|
101
|
+
let bestKeep = 0;
|
|
102
|
+
while (lo <= hi) {
|
|
103
|
+
const mid = (lo + hi) >> 1;
|
|
104
|
+
const text = JSON.stringify(rebuild(arr.slice(0, mid)), null, 2);
|
|
105
|
+
if (text.length <= max) {
|
|
106
|
+
best = text;
|
|
107
|
+
bestKeep = mid;
|
|
108
|
+
lo = mid + 1;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
hi = mid - 1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!best) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return (best +
|
|
118
|
+
`\n\n[LISTA ENXUGADA para caber no limite: exibindo ${bestKeep} de ${arr.length} itens desta resposta (JSON acima esta INTEIRO, so com menos itens). Para o restante: pagine, adicione filtros ou reduza o periodo.]`);
|
|
51
119
|
}
|
|
52
120
|
// AIDEV-NOTE: Route each input param to path/query/body based on endpoint parameter definitions
|
|
53
121
|
// Supports nested body params via dot-notation: `config.temperature` becomes body.config.temperature
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sFAAsF;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|