@wagnergpnc/charactercounter-mcp 1.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/README.md +97 -0
- package/build/index.js +86 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Unicode Precision MCP: O Guardião da Escrita Exata para I.A.
|
|
2
|
+
|
|
3
|
+
## O que é?
|
|
4
|
+
O **Unicode Precision MCP** é um servidor de infraestrutura analítica projetado para fornecer a verdade absoluta sobre a dimensão espacial de qualquer texto. Ao contrário de contadores comuns, ele opera sob o rigor matemático do **Unicode 16.0** e o padrão **UAX #29**, tratando o texto não como uma sequência de bytes ou unidades de memória, mas como **Aglomerados de Grafemas Estendidos** — exatamente o que o olho humano enxerga.
|
|
5
|
+
|
|
6
|
+
## Por que é Vital para I.A. de Escrita?
|
|
7
|
+
Modelos de Linguagem (LLMs) são, por natureza, motores estatísticos de predição de tokens. Eles **não possuem consciência espacial**.
|
|
8
|
+
Quando você pede a uma I.A. para escrever "exatamente 100 caracteres" ou criar um título que caiba em um espaço visual restrito, ela falha sistematicamente ao encontrar:
|
|
9
|
+
- **Emojis Complexos:** Um emoji de família pode valer 11 ou mais no contador da I.A., mas conta como apenas 1 visualmente.
|
|
10
|
+
- **Acentuação Decomposta:** Sequências de caracteres que se unem visualmente confundem o cálculo de tokens da I.A.
|
|
11
|
+
- **Limites Rígidos de UI:** Plataformas como Google Ads, Twitter ou meta-tags de SEO exigem precisão que a I.A. orgânica não consegue garantir sozinha.
|
|
12
|
+
|
|
13
|
+
Este MCP atua como a **ferramenta de medição externa** (a "régua física") que permite à I.A. validar e corrigir sua própria saída em um loop de feedback perfeito.
|
|
14
|
+
|
|
15
|
+
## O Diferencial: Rigor Analítico Humano
|
|
16
|
+
- **Normalização NFC:** Unifica automaticamente strings decompostas antes do cálculo, garantindo que `é` seja sempre um único ponto de código, não importa como foi gerado.
|
|
17
|
+
- **Conformidade UAX #29:** Diferencia o que é "unidade de código" do que é "caractere visual". Identifica tons de pele, junções de largura zero (ZWJ) e alfabetos complexos como uma única unidade visual.
|
|
18
|
+
- **Payload Multi-Métrico:** Retorna simultaneamente Graphemes (visual), Code Points (lógico), UTF-16 (memória) e UTF-8 (disco).
|
|
19
|
+
|
|
20
|
+
## Guia Universal de Instalação e Execução
|
|
21
|
+
|
|
22
|
+
Para todas as plataformas, o servidor utiliza o protocolo **MCP nativo via Stdio**. O caminho do executável gerado é:
|
|
23
|
+
`W:/Bitcurioso/unicode-mcp/build/index.js`
|
|
24
|
+
|
|
25
|
+
### 1. Preparação (Build)
|
|
26
|
+
Antes de configurar, garanta que o projeto está compilado:
|
|
27
|
+
```bash
|
|
28
|
+
cd W:/Bitcurioso/unicode-mcp
|
|
29
|
+
npm install
|
|
30
|
+
npm run build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### 2. Configuração por Plataforma
|
|
36
|
+
|
|
37
|
+
#### **Antigravity**
|
|
38
|
+
1. Abra o arquivo `c:\Users\SERVIDOR\.gemini\antigravity\mcp_config.json`.
|
|
39
|
+
2. Adicione a entrada `unicode-mcp` dentro do objeto `mcpServers`:
|
|
40
|
+
```json
|
|
41
|
+
"unicode-mcp": {
|
|
42
|
+
"command": "node",
|
|
43
|
+
"args": ["W:/Bitcurioso/unicode-mcp/build/index.js"]
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### **Cursor / Codex**
|
|
48
|
+
1. Vá em **Settings** > **Cursor Settings** > **Features** > **MCP Servers**.
|
|
49
|
+
2. Clique em **+ Add New MCP Server**.
|
|
50
|
+
3. Escolha o tipo **stdio**.
|
|
51
|
+
4. Nome: `UnicodeChecker`
|
|
52
|
+
5. Command: `node`
|
|
53
|
+
6. Arguments: `W:/Bitcurioso/unicode-mcp/build/index.js`
|
|
54
|
+
|
|
55
|
+
#### **Claude Code (CLI)**
|
|
56
|
+
Adicione a configuração no seu arquivo de recursos ou no init do Claude Code:
|
|
57
|
+
```bash
|
|
58
|
+
claude mcp add unicode-mcp node W:/Bitcurioso/unicode-mcp/build/index.js
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### **Gemini CLI / Outros Clientes Go/Python**
|
|
62
|
+
Configure o arquivo `config.yaml` ou `mcp_config.json` do respectivo cliente apontando para o binário do node:
|
|
63
|
+
```yaml
|
|
64
|
+
mcpServers:
|
|
65
|
+
unicode:
|
|
66
|
+
command: "node"
|
|
67
|
+
args: ["W:/Bitcurioso/unicode-mcp/build/index.js"]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### **VS Code (via Cline / Roo Code / Claude Dev)**
|
|
71
|
+
1. Abra as configurações da extensão (ícone de engrenagem no chat da extensão).
|
|
72
|
+
2. Procure por **MCP Config** ou **Edit MCP Settings**.
|
|
73
|
+
3. Adicione o JSON:
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"mcpServers": {
|
|
77
|
+
"unicode-mcp": {
|
|
78
|
+
"command": "node",
|
|
79
|
+
"args": ["W:/Bitcurioso/unicode-mcp/build/index.js"]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### 3. Como Rodar e Testar
|
|
88
|
+
|
|
89
|
+
Uma vez configurado, o servidor será iniciado automaticamente pelo seu editor/cliente. Para testar:
|
|
90
|
+
|
|
91
|
+
1. **Via Chat:** Pergunte ao Agente: *"Qual a contagem de grafemas de '👨👩👧👦'?"*
|
|
92
|
+
2. **Via Prompt Sistêmico:** Integre o arquivo `system_prompt.md` nas instruções de projeto para que a I.A. use o servidor como validador automático de loop em tarefas de escrita.
|
|
93
|
+
3. **Log de Erros:** O servidor emite logs detalhados via `stderr`. Se houver falha na conexão, verifique se o caminho do `index.js` está correto.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
*Desenvolvido sob os preceitos de Engenharia de IA Sênior para o ecossistema Bitcurioso.*
|
package/build/index.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
// Configuração do Servidor MCP
|
|
7
|
+
const server = new Server({
|
|
8
|
+
name: "unicode-mcp-server",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
}, {
|
|
11
|
+
capabilities: {
|
|
12
|
+
tools: {}
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
// A Matriz Otimizada do Modelo Esquemático da Ferramenta de Análise
|
|
16
|
+
const ToolInputSchema = z.object({
|
|
17
|
+
conteudo_textual: z.string().describe("A cadeia textual a ser analisada quantitativamente baseada em Unicode.")
|
|
18
|
+
});
|
|
19
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
20
|
+
return {
|
|
21
|
+
tools: [
|
|
22
|
+
{
|
|
23
|
+
name: "contagem_exata_caracteres_unicode",
|
|
24
|
+
description: "Realiza a contagem milimétrica e algorítmica exata de uma cadeia textual (métrica visual humana e bytes).",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
conteudo_textual: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "A cadeia textual a ser analisada"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
required: ["conteudo_textual"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
// Manipulador de Execução da Ferramenta
|
|
40
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
41
|
+
if (request.params.name !== "contagem_exata_caracteres_unicode") {
|
|
42
|
+
throw new Error(`Ferramenta desconhecida mapeada no roteador lógico: ${request.params.name}`);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const { conteudo_textual } = ToolInputSchema.parse(request.params.arguments);
|
|
46
|
+
// Regra de Ouro de Higienização Inter-sistêmica de Normalização:
|
|
47
|
+
// Equivalência de Composição Canônica Unicode na Forma 'NFC'
|
|
48
|
+
const normalizedText = conteudo_textual.normalize("NFC");
|
|
49
|
+
// Regra Absoluta da Segmentação Textual Estruturada (Diretriz Node.js)
|
|
50
|
+
// Utilizando ECMA Intl.Segmenter com granularidade focada em grafemas visuais (UAX #29)
|
|
51
|
+
const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" });
|
|
52
|
+
const segments = Array.from(segmenter.segment(normalizedText));
|
|
53
|
+
// 1. referencial numérico visual primordial
|
|
54
|
+
const grapheme_clusters = segments.length;
|
|
55
|
+
// 2. registro algorítmico do modelo das métricas dos (code_points)
|
|
56
|
+
const code_points = [...normalizedText].length;
|
|
57
|
+
// 3. densidade total estruturada (utf16_units)
|
|
58
|
+
const utf16_units = normalizedText.length;
|
|
59
|
+
// 4. consumo absoluto em disco (utf8_bytes)
|
|
60
|
+
const utf8_bytes = Buffer.byteLength(normalizedText, 'utf8');
|
|
61
|
+
return {
|
|
62
|
+
content: [{
|
|
63
|
+
type: "text",
|
|
64
|
+
text: JSON.stringify({
|
|
65
|
+
grapheme_clusters,
|
|
66
|
+
code_points,
|
|
67
|
+
utf16_units,
|
|
68
|
+
utf8_bytes
|
|
69
|
+
}, null, 2)
|
|
70
|
+
}]
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
throw new Error(`Erro na computacao rigorosa do payload: ${e instanceof Error ? e.message : String(e)}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// A Parametrização dos Modos Estritos de Escuta e Canais Físicos de Comunicação (Stdio)
|
|
78
|
+
async function start() {
|
|
79
|
+
const transport = new StdioServerTransport();
|
|
80
|
+
await server.connect(transport);
|
|
81
|
+
console.error("Unicode MCP Server isolado e enraizado ativamente no host via transporte estrito StdioServerTransport.");
|
|
82
|
+
}
|
|
83
|
+
start().catch(error => {
|
|
84
|
+
console.error("Erro fatal durante escuta processual da topologia:", error);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wagnergpnc/charactercounter-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "build/index.js",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
7
|
+
"build": "tsc"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [],
|
|
10
|
+
"author": "wagnergpnc",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"description": "Unicode character counter MCP server",
|
|
13
|
+
"files": [
|
|
14
|
+
"build"
|
|
15
|
+
],
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
18
|
+
"zod": "^4.3.6"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^25.3.0",
|
|
22
|
+
"typescript": "^5.9.3"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"charactercounter-mcp": "./build/index.js"
|
|
27
|
+
}
|
|
28
|
+
}
|