@backendkit-labs/mcp-connectors 0.1.1 → 0.1.3
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 +2 -0
- package/dist/ai-vault/server.d.ts +35 -0
- package/dist/ai-vault/server.d.ts.map +1 -0
- package/dist/ai-vault/server.js +170 -0
- package/dist/ai-vault/server.js.map +1 -0
- package/dist/gcal/server.js +3 -6
- package/dist/gcal/server.js.map +1 -1
- package/dist/hubspot/server.js +4 -7
- package/dist/hubspot/server.js.map +1 -1
- package/dist/jira/server.js +3 -8
- package/dist/jira/server.js.map +1 -1
- package/dist/odoo/server.d.ts +3 -0
- package/dist/odoo/server.d.ts.map +1 -0
- package/dist/odoo/server.js +168 -0
- package/dist/odoo/server.js.map +1 -0
- package/dist/shared/http-client.d.ts +14 -0
- package/dist/shared/http-client.d.ts.map +1 -0
- package/dist/shared/http-client.js +62 -0
- package/dist/shared/http-client.js.map +1 -0
- package/package.json +38 -34
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @backendkit-labs/mcp-connectors
|
|
2
2
|
|
|
3
|
+
> **Status: `stable`** — Maintained and production-ready. No new features during the pilot phase.
|
|
4
|
+
|
|
3
5
|
Three production-ready MCP (Model Context Protocol) servers that expose enterprise SaaS integrations as agent tools: **HubSpot CRM**, **Jira**, and **Google Calendar**.
|
|
4
6
|
|
|
5
7
|
Each connector ships as a standalone binary that runs in stdio mode (for use with any MCP client) or HTTP mode (for multi-tenant server deployments).
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* bk-mcp-ai-vault — MCP server for the AI Engineering knowledge vault
|
|
4
|
+
*
|
|
5
|
+
* Exposes the ai-vault as semantic search tools so any agent or Claude Code
|
|
6
|
+
* session can query AI/ML knowledge while working on AI projects.
|
|
7
|
+
*
|
|
8
|
+
* Required env vars:
|
|
9
|
+
* AI_VAULT_PATH — absolute path to the ai-vault
|
|
10
|
+
* default: C:/Users/mairon.cuello/development/workspace-ia/ai-vault
|
|
11
|
+
*
|
|
12
|
+
* Optional:
|
|
13
|
+
* AI_INDEX_PATH — where to store the vector index
|
|
14
|
+
* default: ~/.bk-agent/rag/ai-vault.json
|
|
15
|
+
* AI_TOP_K — default results per search (default: 5)
|
|
16
|
+
* AI_MIN_SCORE — minimum similarity score 0-1 (default: 0.2)
|
|
17
|
+
*
|
|
18
|
+
* Usage in claude_desktop_config.json / mcp settings:
|
|
19
|
+
* {
|
|
20
|
+
* "mcpServers": {
|
|
21
|
+
* "ai-vault": {
|
|
22
|
+
* "command": "npx",
|
|
23
|
+
* "args": ["-y", "@backendkit-labs/mcp-connectors", "bk-mcp-ai-vault"],
|
|
24
|
+
* "env": {
|
|
25
|
+
* "AI_VAULT_PATH": "C:/Users/mairon.cuello/development/workspace-ia/ai-vault"
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* Or run directly:
|
|
32
|
+
* AI_VAULT_PATH=... npx bk-mcp-ai-vault
|
|
33
|
+
*/
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ai-vault/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* bk-mcp-ai-vault — MCP server for the AI Engineering knowledge vault
|
|
5
|
+
*
|
|
6
|
+
* Exposes the ai-vault as semantic search tools so any agent or Claude Code
|
|
7
|
+
* session can query AI/ML knowledge while working on AI projects.
|
|
8
|
+
*
|
|
9
|
+
* Required env vars:
|
|
10
|
+
* AI_VAULT_PATH — absolute path to the ai-vault
|
|
11
|
+
* default: C:/Users/mairon.cuello/development/workspace-ia/ai-vault
|
|
12
|
+
*
|
|
13
|
+
* Optional:
|
|
14
|
+
* AI_INDEX_PATH — where to store the vector index
|
|
15
|
+
* default: ~/.bk-agent/rag/ai-vault.json
|
|
16
|
+
* AI_TOP_K — default results per search (default: 5)
|
|
17
|
+
* AI_MIN_SCORE — minimum similarity score 0-1 (default: 0.2)
|
|
18
|
+
*
|
|
19
|
+
* Usage in claude_desktop_config.json / mcp settings:
|
|
20
|
+
* {
|
|
21
|
+
* "mcpServers": {
|
|
22
|
+
* "ai-vault": {
|
|
23
|
+
* "command": "npx",
|
|
24
|
+
* "args": ["-y", "@backendkit-labs/mcp-connectors", "bk-mcp-ai-vault"],
|
|
25
|
+
* "env": {
|
|
26
|
+
* "AI_VAULT_PATH": "C:/Users/mairon.cuello/development/workspace-ia/ai-vault"
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* Or run directly:
|
|
33
|
+
* AI_VAULT_PATH=... npx bk-mcp-ai-vault
|
|
34
|
+
*/
|
|
35
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
38
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
39
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
40
|
+
}
|
|
41
|
+
Object.defineProperty(o, k2, desc);
|
|
42
|
+
}) : (function(o, m, k, k2) {
|
|
43
|
+
if (k2 === undefined) k2 = k;
|
|
44
|
+
o[k2] = m[k];
|
|
45
|
+
}));
|
|
46
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
47
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
48
|
+
}) : function(o, v) {
|
|
49
|
+
o["default"] = v;
|
|
50
|
+
});
|
|
51
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
52
|
+
var ownKeys = function(o) {
|
|
53
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
54
|
+
var ar = [];
|
|
55
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
56
|
+
return ar;
|
|
57
|
+
};
|
|
58
|
+
return ownKeys(o);
|
|
59
|
+
};
|
|
60
|
+
return function (mod) {
|
|
61
|
+
if (mod && mod.__esModule) return mod;
|
|
62
|
+
var result = {};
|
|
63
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
64
|
+
__setModuleDefault(result, mod);
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
67
|
+
})();
|
|
68
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
69
|
+
const path = __importStar(require("node:path"));
|
|
70
|
+
const os = __importStar(require("node:os"));
|
|
71
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
72
|
+
const zod_1 = require("zod");
|
|
73
|
+
const agent_enterprise_1 = require("@backendkit-labs/agent-enterprise");
|
|
74
|
+
const server_runner_js_1 = require("../shared/server-runner.js");
|
|
75
|
+
// ── Config ────────────────────────────────────────────────────────────────────
|
|
76
|
+
const VAULT_PATH = process.env.AI_VAULT_PATH
|
|
77
|
+
?? 'C:/Users/mairon.cuello/development/workspace-ia/ai-vault';
|
|
78
|
+
const INDEX_PATH = process.env.AI_INDEX_PATH
|
|
79
|
+
?? path.join(os.homedir(), '.bk-agent', 'rag', 'ai-vault.json');
|
|
80
|
+
const TOP_K = parseInt(process.env.AI_TOP_K ?? '5');
|
|
81
|
+
const MIN_SCORE = parseFloat(process.env.AI_MIN_SCORE ?? '0.2');
|
|
82
|
+
// ── RAG provider (shared across all requests) ─────────────────────────────────
|
|
83
|
+
const rag = new agent_enterprise_1.ObsidianRAGProvider({
|
|
84
|
+
vaultPath: VAULT_PATH,
|
|
85
|
+
indexPath: INDEX_PATH,
|
|
86
|
+
embedder: new agent_enterprise_1.SimpleEmbedder(),
|
|
87
|
+
topK: TOP_K,
|
|
88
|
+
minScore: MIN_SCORE,
|
|
89
|
+
});
|
|
90
|
+
let indexReady = false;
|
|
91
|
+
async function ensureIndexed() {
|
|
92
|
+
if (!indexReady) {
|
|
93
|
+
process.stderr.write('[ai-vault] Indexing vault...\n');
|
|
94
|
+
const { indexed } = await rag.index({ verbose: false });
|
|
95
|
+
process.stderr.write(`[ai-vault] Index ready — ${indexed} chunks\n`);
|
|
96
|
+
indexReady = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ── Server factory ────────────────────────────────────────────────────────────
|
|
100
|
+
function buildServer() {
|
|
101
|
+
const srv = new mcp_js_1.McpServer({ name: 'ai-vault', version: '0.1.0' });
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
+
const t = srv.tool.bind(srv);
|
|
104
|
+
// ── Tool: search_ai_kb ────────────────────────────────────────────────────
|
|
105
|
+
t('search_ai_kb', 'Search the AI Engineering knowledge base. ' +
|
|
106
|
+
'Use this when you need to recall concepts, architectures, best practices or ' +
|
|
107
|
+
'implementation patterns for: machine learning, deep learning, transformers, ' +
|
|
108
|
+
'RAG, LLMs, prompt engineering, fine-tuning, agents, vision, generative AI, MLOps. ' +
|
|
109
|
+
'Call it before designing or implementing any AI component to get relevant context.', {
|
|
110
|
+
query: zod_1.z.string().describe('Natural language query: "how does self-attention work", ' +
|
|
111
|
+
'"RAG pipeline with ChromaDB", "LoRA fine-tuning steps", ' +
|
|
112
|
+
'"multi-agent orchestration patterns"'),
|
|
113
|
+
top_k: zod_1.z.number().int().min(1).max(15).optional().describe('Max results to return (default: 5)'),
|
|
114
|
+
}, async ({ query, top_k }) => {
|
|
115
|
+
await ensureIndexed();
|
|
116
|
+
const results = await rag.search(query, top_k);
|
|
117
|
+
return { content: [{ type: 'text', text: results }] };
|
|
118
|
+
});
|
|
119
|
+
// ── Tool: list_ai_topics ──────────────────────────────────────────────────
|
|
120
|
+
t('list_ai_topics', 'List the main topics and modules available in the AI knowledge base. ' +
|
|
121
|
+
'Use this to discover what knowledge is indexed before searching.', {}, async () => {
|
|
122
|
+
const topics = [
|
|
123
|
+
'## AI Engineering Knowledge Base',
|
|
124
|
+
'',
|
|
125
|
+
'### Módulo 0 — Fundamentos',
|
|
126
|
+
' Python para IA, NumPy/Pandas, álgebra lineal, Git',
|
|
127
|
+
'',
|
|
128
|
+
'### Módulo 1 — Machine Learning',
|
|
129
|
+
' Regresión lineal/polinomial, KNN, SVM & kernels, ensemble learning',
|
|
130
|
+
' (Random Forest, Gradient Boosting), feature engineering',
|
|
131
|
+
'',
|
|
132
|
+
'### Módulo 2 — Deep Learning',
|
|
133
|
+
' Perceptrón y MLP, backpropagation, PyTorch, CNNs,',
|
|
134
|
+
' optimizadores (Adam/SGD), regularización, transfer learning',
|
|
135
|
+
'',
|
|
136
|
+
'### Módulo 3 — Computer Vision',
|
|
137
|
+
' Arquitecturas CNN (LeNet, AlexNet, VGG, ResNet),',
|
|
138
|
+
' detección de objetos (YOLO, SSD), segmentación semántica (U-Net),',
|
|
139
|
+
' Vision Transformers (ViT)',
|
|
140
|
+
'',
|
|
141
|
+
'### Módulo 4 — NLP & Transformers',
|
|
142
|
+
' Tokenización, embeddings, Word2Vec, arquitectura Transformer,',
|
|
143
|
+
' BERT, GPT, RAG con ChromaDB y LangChain',
|
|
144
|
+
'',
|
|
145
|
+
'### Módulo 5 — Generative AI',
|
|
146
|
+
' VAEs, GANs, modelos de difusión (DDPM/DDIM/LDM),',
|
|
147
|
+
' Stable Diffusion, ControlNet, LoRA, generación de video/audio',
|
|
148
|
+
'',
|
|
149
|
+
'### Módulo 6 — LLMs & Prompt Engineering',
|
|
150
|
+
' Tokenización, pre-training, RLHF, SFT, prompt engineering avanzado,',
|
|
151
|
+
' fine-tuning con LoRA/QLoRA, RAG profundo, evaluación (BLEU, ROUGE, benchmarks)',
|
|
152
|
+
'',
|
|
153
|
+
'### Módulo 7 — Agentes de IA',
|
|
154
|
+
' Ciclo percibir→razonar→actuar, ReAct, function calling, MCP,',
|
|
155
|
+
' LangGraph, memoria de agentes, multi-agentes, seguridad y alineación',
|
|
156
|
+
'',
|
|
157
|
+
'### Módulo 8 — Producción (MLOps)',
|
|
158
|
+
' Ciclo de vida MLOps, MLflow, DVC, despliegue con vLLM/Docker/FastAPI,',
|
|
159
|
+
' monitoreo y observabilidad, proyecto final RAG+agentes en producción',
|
|
160
|
+
'',
|
|
161
|
+
`Vault: ${VAULT_PATH}`,
|
|
162
|
+
].join('\n');
|
|
163
|
+
return { content: [{ type: 'text', text: topics }] };
|
|
164
|
+
});
|
|
165
|
+
return srv;
|
|
166
|
+
}
|
|
167
|
+
// ── Entry point ───────────────────────────────────────────────────────────────
|
|
168
|
+
const { httpMode, port } = (0, server_runner_js_1.parseCliArgs)();
|
|
169
|
+
(0, server_runner_js_1.runMcpServer)(buildServer, { httpMode, port, label: 'ai-vault' });
|
|
170
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ai-vault/server.ts"],"names":[],"mappings":"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"}
|
package/dist/gcal/server.js
CHANGED
|
@@ -5,6 +5,7 @@ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
7
|
const server_runner_js_1 = require("../shared/server-runner.js");
|
|
8
|
+
const http_client_js_1 = require("../shared/http-client.js");
|
|
8
9
|
let tokenCache = null;
|
|
9
10
|
async function getToken() {
|
|
10
11
|
// Return valid cached token (60 s buffer before expiry)
|
|
@@ -57,7 +58,7 @@ async function exchangeServiceAccountToken(key) {
|
|
|
57
58
|
async function gcal(method, path, body) {
|
|
58
59
|
const token = await getToken();
|
|
59
60
|
const url = path.startsWith('http') ? path : `https://www.googleapis.com/calendar/v3${path}`;
|
|
60
|
-
|
|
61
|
+
return (0, http_client_js_1.fetchJson)('Google Calendar', url, {
|
|
61
62
|
method,
|
|
62
63
|
headers: {
|
|
63
64
|
'Authorization': `Bearer ${token}`,
|
|
@@ -65,10 +66,6 @@ async function gcal(method, path, body) {
|
|
|
65
66
|
},
|
|
66
67
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
67
68
|
});
|
|
68
|
-
if (!res.ok) {
|
|
69
|
-
throw new Error(`Google Calendar ${method} ${path.split('?')[0]} → ${res.status}: ${await res.text()}`);
|
|
70
|
-
}
|
|
71
|
-
return res.json();
|
|
72
69
|
}
|
|
73
70
|
// ── Tools ─────────────────────────────────────────────────────────────────────
|
|
74
71
|
function buildServer() {
|
|
@@ -84,7 +81,7 @@ function buildServer() {
|
|
|
84
81
|
calendar_id: zod_1.z.string().optional().describe('Calendar ID (default: "primary")'),
|
|
85
82
|
time_min: zod_1.z.string().optional().describe('Start of range, ISO 8601 (default: now)'),
|
|
86
83
|
time_max: zod_1.z.string().optional().describe('End of range, ISO 8601 (default: 7 days from now)'),
|
|
87
|
-
limit: zod_1.z.number().optional().describe('Max events (default 10)'),
|
|
84
|
+
limit: zod_1.z.number().min(1).max(100).optional().describe('Max events (default 10, max 100)'),
|
|
88
85
|
}, async ({ calendar_id, time_min, time_max, limit }) => {
|
|
89
86
|
const calId = encodeURIComponent(calendar_id ?? 'primary');
|
|
90
87
|
const tMin = time_min ?? new Date().toISOString();
|
package/dist/gcal/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gcal/server.ts"],"names":[],"mappings":";;;AACA,oEAAoE;AACpE,6CAAyC;AACzC,6BAAwB;AACxB,iEAAwE;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gcal/server.ts"],"names":[],"mappings":"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"}
|
package/dist/hubspot/server.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const server_runner_js_1 = require("../shared/server-runner.js");
|
|
7
|
+
const http_client_js_1 = require("../shared/http-client.js");
|
|
7
8
|
// ── Auth ──────────────────────────────────────────────────────────────────────
|
|
8
9
|
const TOKEN = process.env.HUBSPOT_TOKEN;
|
|
9
10
|
if (!TOKEN) {
|
|
@@ -12,7 +13,7 @@ if (!TOKEN) {
|
|
|
12
13
|
}
|
|
13
14
|
const BASE = 'https://api.hubapi.com';
|
|
14
15
|
async function hs(method, path, body) {
|
|
15
|
-
|
|
16
|
+
return (0, http_client_js_1.fetchJson)('HubSpot', `${BASE}${path}`, {
|
|
16
17
|
method,
|
|
17
18
|
headers: {
|
|
18
19
|
'Authorization': `Bearer ${TOKEN}`,
|
|
@@ -20,10 +21,6 @@ async function hs(method, path, body) {
|
|
|
20
21
|
},
|
|
21
22
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
22
23
|
});
|
|
23
|
-
if (!res.ok) {
|
|
24
|
-
throw new Error(`HubSpot ${method} ${path.split('?')[0]} → ${res.status}: ${await res.text()}`);
|
|
25
|
-
}
|
|
26
|
-
return res.json();
|
|
27
24
|
}
|
|
28
25
|
// ── Tools ─────────────────────────────────────────────────────────────────────
|
|
29
26
|
function buildServer() {
|
|
@@ -34,7 +31,7 @@ function buildServer() {
|
|
|
34
31
|
const t = srv.tool.bind(srv);
|
|
35
32
|
t('crm_search_contacts', 'Search HubSpot CRM contacts by name, email, or company.', {
|
|
36
33
|
query: zod_1.z.string().describe('Search term — name, email, or company'),
|
|
37
|
-
limit: zod_1.z.number().optional().describe('Max results (default 10)'),
|
|
34
|
+
limit: zod_1.z.number().min(1).max(100).optional().describe('Max results (default 10, max 100)'),
|
|
38
35
|
}, async ({ query, limit }) => {
|
|
39
36
|
const data = await hs('POST', '/crm/v3/objects/contacts/search', {
|
|
40
37
|
query,
|
|
@@ -80,7 +77,7 @@ function buildServer() {
|
|
|
80
77
|
t('crm_search_deals', 'Search HubSpot CRM deals by name and/or deal stage.', {
|
|
81
78
|
query: zod_1.z.string().optional().describe('Deal name search term'),
|
|
82
79
|
stage: zod_1.z.string().optional().describe('Deal stage key (e.g. appointmentscheduled, closedwon)'),
|
|
83
|
-
limit: zod_1.z.number().optional().describe('Max results (default 10)'),
|
|
80
|
+
limit: zod_1.z.number().min(1).max(100).optional().describe('Max results (default 10, max 100)'),
|
|
84
81
|
}, async ({ query, stage, limit }) => {
|
|
85
82
|
const body = {
|
|
86
83
|
limit: limit ?? 10,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/hubspot/server.ts"],"names":[],"mappings":";;;AACA,oEAAoE;AACpE,6BAAwB;AACxB,iEAAwE;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/hubspot/server.ts"],"names":[],"mappings":"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"}
|
package/dist/jira/server.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
5
|
const zod_1 = require("zod");
|
|
6
6
|
const server_runner_js_1 = require("../shared/server-runner.js");
|
|
7
|
+
const http_client_js_1 = require("../shared/http-client.js");
|
|
7
8
|
// ── Auth ──────────────────────────────────────────────────────────────────────
|
|
8
9
|
const HOST = process.env.JIRA_HOST; // e.g. mycompany.atlassian.net
|
|
9
10
|
const EMAIL = process.env.JIRA_EMAIL;
|
|
@@ -16,7 +17,7 @@ if (missing.length) {
|
|
|
16
17
|
const BASE = `https://${HOST}/rest/api/3`;
|
|
17
18
|
const AUTH = Buffer.from(`${EMAIL}:${TOKEN}`).toString('base64');
|
|
18
19
|
async function jira(method, path, body) {
|
|
19
|
-
|
|
20
|
+
return (0, http_client_js_1.fetchJson)('Jira', `${BASE}${path}`, {
|
|
20
21
|
method,
|
|
21
22
|
headers: {
|
|
22
23
|
'Authorization': `Basic ${AUTH}`,
|
|
@@ -25,12 +26,6 @@ async function jira(method, path, body) {
|
|
|
25
26
|
},
|
|
26
27
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
27
28
|
});
|
|
28
|
-
if (res.status === 204)
|
|
29
|
-
return undefined;
|
|
30
|
-
if (!res.ok) {
|
|
31
|
-
throw new Error(`Jira ${method} ${path.split('?')[0]} → ${res.status}: ${await res.text()}`);
|
|
32
|
-
}
|
|
33
|
-
return res.json();
|
|
34
29
|
}
|
|
35
30
|
function adfText(node) {
|
|
36
31
|
if (!node)
|
|
@@ -55,7 +50,7 @@ function buildServer() {
|
|
|
55
50
|
const t = srv.tool.bind(srv);
|
|
56
51
|
t('jira_search', 'Search Jira issues using JQL (Jira Query Language). Returns key, summary, status, and assignee.', {
|
|
57
52
|
jql: zod_1.z.string().describe('JQL query (e.g. "project=PROJ AND status=\\"In Progress\\"")'),
|
|
58
|
-
limit: zod_1.z.number().optional().describe('Max results (default 20)'),
|
|
53
|
+
limit: zod_1.z.number().min(1).max(100).optional().describe('Max results (default 20, max 100)'),
|
|
59
54
|
}, async ({ jql, limit }) => {
|
|
60
55
|
const data = await jira('GET', `/search?jql=${encodeURIComponent(jql)}&maxResults=${limit ?? 20}&fields=summary,status,assignee,priority`);
|
|
61
56
|
const lines = data.issues.map(i => {
|
package/dist/jira/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jira/server.ts"],"names":[],"mappings":";;;AACA,oEAAoE;AACpE,6BAAwB;AACxB,iEAAwE;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jira/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/odoo/server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const server_runner_js_1 = require("../shared/server-runner.js");
|
|
7
|
+
const http_client_js_1 = require("../shared/http-client.js");
|
|
8
|
+
let _session = null;
|
|
9
|
+
// Dedupe concurrent first-calls so two simultaneous tool invocations don't
|
|
10
|
+
// both hit /web/session/authenticate before either has cached a session.
|
|
11
|
+
let _authInFlight = null;
|
|
12
|
+
function cfg() {
|
|
13
|
+
const url = process.env.ODOO_URL?.replace(/\/$/, '');
|
|
14
|
+
const db = process.env.ODOO_DB;
|
|
15
|
+
const user = process.env.ODOO_USER;
|
|
16
|
+
const pass = process.env.ODOO_PASSWORD;
|
|
17
|
+
if (!url || !db || !user || !pass) {
|
|
18
|
+
throw new Error('Set ODOO_URL, ODOO_DB, ODOO_USER, ODOO_PASSWORD');
|
|
19
|
+
}
|
|
20
|
+
return { url, db, user, pass };
|
|
21
|
+
}
|
|
22
|
+
async function doAuthenticate() {
|
|
23
|
+
const { url, db, user, pass } = cfg();
|
|
24
|
+
const data = await (0, http_client_js_1.fetchJson)('Odoo', `${url}/web/session/authenticate`, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
body: JSON.stringify({
|
|
28
|
+
jsonrpc: '2.0', method: 'call', id: 1,
|
|
29
|
+
params: { db, login: user, password: pass },
|
|
30
|
+
}),
|
|
31
|
+
});
|
|
32
|
+
if (data.error)
|
|
33
|
+
throw new Error(`Odoo auth error: ${data.error.message}`);
|
|
34
|
+
if (!data.result?.uid)
|
|
35
|
+
throw new Error('Odoo auth failed — no uid returned (wrong credentials?)');
|
|
36
|
+
_session = { uid: data.result.uid, sessionId: data.result.session_id };
|
|
37
|
+
return _session;
|
|
38
|
+
}
|
|
39
|
+
async function authenticate() {
|
|
40
|
+
if (_session)
|
|
41
|
+
return _session;
|
|
42
|
+
if (!_authInFlight) {
|
|
43
|
+
_authInFlight = doAuthenticate().finally(() => { _authInFlight = null; });
|
|
44
|
+
}
|
|
45
|
+
return _authInFlight;
|
|
46
|
+
}
|
|
47
|
+
/** Odoo returns HTTP 200 with a JSON-RPC error when the cached session has expired server-side. */
|
|
48
|
+
function isSessionExpiredError(error) {
|
|
49
|
+
if (!error)
|
|
50
|
+
return false;
|
|
51
|
+
if (error.code === 100)
|
|
52
|
+
return true; // Odoo's "Session Expired" error code
|
|
53
|
+
return /session\s*expired/i.test(error.message ?? '');
|
|
54
|
+
}
|
|
55
|
+
async function odooCall(model, method, args, kwargs = {}, _retriedAfterReauth = false) {
|
|
56
|
+
const sess = await authenticate();
|
|
57
|
+
const { url } = cfg();
|
|
58
|
+
const data = await (0, http_client_js_1.fetchJson)('Odoo', `${url}/web/dataset/call_kw`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'Cookie': `session_id=${sess.sessionId}`,
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
jsonrpc: '2.0', method: 'call', id: Date.now(),
|
|
66
|
+
params: { model, method, args, kwargs },
|
|
67
|
+
}),
|
|
68
|
+
});
|
|
69
|
+
if (data.error) {
|
|
70
|
+
if (!_retriedAfterReauth && isSessionExpiredError(data.error)) {
|
|
71
|
+
_session = null;
|
|
72
|
+
return odooCall(model, method, args, kwargs, true);
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`Odoo ${model}.${method}: ${data.error.data?.message ?? data.error.message}`);
|
|
75
|
+
}
|
|
76
|
+
return data.result;
|
|
77
|
+
}
|
|
78
|
+
// ── Tools ─────────────────────────────────────────────────────────────────────
|
|
79
|
+
function buildServer() {
|
|
80
|
+
const srv = new mcp_js_1.McpServer({ name: 'bk-mcp-odoo', version: '0.1.0' });
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
+
const t = srv.tool.bind(srv);
|
|
83
|
+
t('odoo_employee_create', 'Create a new employee record in Odoo HR.', {
|
|
84
|
+
name: zod_1.z.string().describe('Full name'),
|
|
85
|
+
work_email: zod_1.z.string().email().optional().describe('Work email address'),
|
|
86
|
+
job_title: zod_1.z.string().optional().describe('Job title'),
|
|
87
|
+
department: zod_1.z.string().optional().describe('Department name (partial match)'),
|
|
88
|
+
}, async ({ name, work_email, job_title, department }) => {
|
|
89
|
+
const vals = { name };
|
|
90
|
+
if (work_email)
|
|
91
|
+
vals.work_email = work_email;
|
|
92
|
+
if (job_title)
|
|
93
|
+
vals.job_title = job_title;
|
|
94
|
+
if (department) {
|
|
95
|
+
const ids = await odooCall('hr.department', 'search', [[['name', 'ilike', department]]]);
|
|
96
|
+
if (ids.length)
|
|
97
|
+
vals.department_id = ids[0];
|
|
98
|
+
}
|
|
99
|
+
const id = await odooCall('hr.employee', 'create', [vals]);
|
|
100
|
+
return { content: [{ type: 'text', text: `Employee created. Odoo ID: ${id}` }] };
|
|
101
|
+
});
|
|
102
|
+
t('odoo_employee_get', 'Retrieve employee records from Odoo by ID or name search.', {
|
|
103
|
+
employee_id: zod_1.z.number().optional().describe('Exact employee ID'),
|
|
104
|
+
name: zod_1.z.string().optional().describe('Name filter (partial match)'),
|
|
105
|
+
limit: zod_1.z.number().min(1).max(100).optional().describe('Maximum records to return (default 5, max 100)'),
|
|
106
|
+
}, async ({ employee_id, name, limit }) => {
|
|
107
|
+
let domain;
|
|
108
|
+
if (employee_id !== undefined) {
|
|
109
|
+
domain = [['id', '=', employee_id]];
|
|
110
|
+
}
|
|
111
|
+
else if (name) {
|
|
112
|
+
domain = [['name', 'ilike', name]];
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
domain = [['active', '=', true]];
|
|
116
|
+
}
|
|
117
|
+
const records = await odooCall('hr.employee', 'search_read', [], {
|
|
118
|
+
domain,
|
|
119
|
+
fields: ['id', 'name', 'work_email', 'job_title', 'department_id', 'active'],
|
|
120
|
+
limit: limit ?? 5,
|
|
121
|
+
});
|
|
122
|
+
if (!records.length) {
|
|
123
|
+
return { content: [{ type: 'text', text: 'No employees found.' }] };
|
|
124
|
+
}
|
|
125
|
+
const lines = records.map(r => {
|
|
126
|
+
const dept = r.department_id;
|
|
127
|
+
return [
|
|
128
|
+
`ID: ${r.id}`,
|
|
129
|
+
`Name: ${r.name}`,
|
|
130
|
+
`Title: ${r.job_title ?? '—'}`,
|
|
131
|
+
`Dept: ${dept ? dept[1] : '—'}`,
|
|
132
|
+
`Email: ${r.work_email ?? '—'}`,
|
|
133
|
+
].join(' | ');
|
|
134
|
+
});
|
|
135
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
136
|
+
});
|
|
137
|
+
t('payroll_prepare', 'Create a draft payroll slip (hr.payslip) for an employee and period.', {
|
|
138
|
+
employee_id: zod_1.z.number().describe('Odoo employee ID'),
|
|
139
|
+
date_from: zod_1.z.string().describe('Period start date (YYYY-MM-DD)'),
|
|
140
|
+
date_to: zod_1.z.string().describe('Period end date (YYYY-MM-DD)'),
|
|
141
|
+
}, async ({ employee_id, date_from, date_to }) => {
|
|
142
|
+
const payslipId = await odooCall('hr.payslip', 'create', [{
|
|
143
|
+
employee_id,
|
|
144
|
+
date_from,
|
|
145
|
+
date_to,
|
|
146
|
+
}]);
|
|
147
|
+
return {
|
|
148
|
+
content: [{ type: 'text', text: `Payslip created. ID: ${payslipId} State: draft` }],
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
t('payroll_confirm', 'Compute salary lines and confirm (validate) a payroll slip.', {
|
|
152
|
+
payslip_id: zod_1.z.number().describe('Payslip ID returned by payroll_prepare'),
|
|
153
|
+
}, async ({ payslip_id }) => {
|
|
154
|
+
await odooCall('hr.payslip', 'compute_sheet', [[payslip_id]]);
|
|
155
|
+
await odooCall('hr.payslip', 'action_payslip_done', [[payslip_id]]);
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: 'text', text: `Payslip ${payslip_id} confirmed. State: done` }],
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
return srv;
|
|
161
|
+
}
|
|
162
|
+
// ── Start ─────────────────────────────────────────────────────────────────────
|
|
163
|
+
const { httpMode, port } = (0, server_runner_js_1.parseCliArgs)();
|
|
164
|
+
(0, server_runner_js_1.runMcpServer)(buildServer, { httpMode, port, label: 'bk-mcp-odoo' }).catch(err => {
|
|
165
|
+
process.stderr.write(`[bk-mcp-odoo] Fatal: ${err.message}\n`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/odoo/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface FetchJsonOptions {
|
|
2
|
+
timeoutMs?: number;
|
|
3
|
+
maxAttempts?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* fetch() wrapper shared by connectors: hard timeout via AbortController, retry with
|
|
7
|
+
* exponential backoff on network errors and 5xx, consistent 204 → undefined handling.
|
|
8
|
+
*
|
|
9
|
+
* Callers build url/init (including their own auth headers) — this only owns the
|
|
10
|
+
* transport concern, so connectors with different auth schemes (Bearer, Basic,
|
|
11
|
+
* dynamic OAuth token, session cookie) can all use it unchanged.
|
|
12
|
+
*/
|
|
13
|
+
export declare function fetchJson<T>(serviceName: string, url: string, init: RequestInit, opts?: FetchJsonOptions): Promise<T>;
|
|
14
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/shared/http-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC7B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE,gBAAqB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAgDZ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchJson = fetchJson;
|
|
4
|
+
const retry_1 = require("@backendkit-labs/retry");
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
6
|
+
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
7
|
+
/**
|
|
8
|
+
* fetch() wrapper shared by connectors: hard timeout via AbortController, retry with
|
|
9
|
+
* exponential backoff on network errors and 5xx, consistent 204 → undefined handling.
|
|
10
|
+
*
|
|
11
|
+
* Callers build url/init (including their own auth headers) — this only owns the
|
|
12
|
+
* transport concern, so connectors with different auth schemes (Bearer, Basic,
|
|
13
|
+
* dynamic OAuth token, session cookie) can all use it unchanged.
|
|
14
|
+
*/
|
|
15
|
+
async function fetchJson(serviceName, url, init, opts = {}) {
|
|
16
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
17
|
+
const method = init.method ?? 'GET';
|
|
18
|
+
const attempt = async () => {
|
|
19
|
+
const controller = new AbortController();
|
|
20
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
21
|
+
let res;
|
|
22
|
+
try {
|
|
23
|
+
res = await fetch(url, { ...init, signal: controller.signal });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const aborted = err instanceof Error && err.name === 'AbortError';
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
28
|
+
throw {
|
|
29
|
+
type: 'network',
|
|
30
|
+
message: aborted
|
|
31
|
+
? `${serviceName} ${method} ${url.split('?')[0]} → timed out after ${timeoutMs}ms`
|
|
32
|
+
: `${serviceName} ${method} ${url.split('?')[0]} → network error: ${err.message}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
clearTimeout(timer);
|
|
37
|
+
}
|
|
38
|
+
if (res.status === 204)
|
|
39
|
+
return undefined;
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
const text = await res.text().catch(() => '');
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
43
|
+
throw {
|
|
44
|
+
type: 'http',
|
|
45
|
+
status: res.status,
|
|
46
|
+
message: `${serviceName} ${method} ${url.split('?')[0]} → ${res.status}: ${text}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return res.json();
|
|
50
|
+
};
|
|
51
|
+
const result = await (0, retry_1.retry)(attempt, {
|
|
52
|
+
maxAttempts: opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
|
|
53
|
+
backoff: { type: 'exponential', baseDelay: 500, maxDelay: 8_000, jitter: 'full' },
|
|
54
|
+
retryIf: (e) => e.type === 'network' || (e.type === 'http' && (e.status ?? 0) >= 500),
|
|
55
|
+
abortIf: (e) => e.type === 'http' && [401, 403].includes(e.status ?? 0),
|
|
56
|
+
});
|
|
57
|
+
if (!result.ok) {
|
|
58
|
+
throw new Error(result.error.message);
|
|
59
|
+
}
|
|
60
|
+
return result.value;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/shared/http-client.ts"],"names":[],"mappings":";;AAkBA,8BAqDC;AAvED,kDAA+C;AAE/C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAO/B;;;;;;;GAOG;AACI,KAAK,UAAU,SAAS,CAC3B,WAAmB,EACnB,GAAW,EACX,IAAiB,EACjB,OAAyB,EAAE;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IAEpC,MAAM,OAAO,GAAG,KAAK,IAAgB,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;YAClE,+DAA+D;YAC/D,MAAM;gBACF,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,OAAO;oBACZ,CAAC,CAAC,GAAG,WAAW,IAAI,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,SAAS,IAAI;oBAClF,CAAC,CAAC,GAAG,WAAW,IAAI,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE;aACnG,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,YAAY,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,+DAA+D;YAC/D,MAAM;gBACF,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,WAAW,IAAI,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE;aACpF,CAAC;QACN,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,OAAO,EAAE;QAChC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,oBAAoB;QACrD,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACjF,OAAO,EAAE,CAAC,CAAoC,EAAE,EAAE,CAC9C,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;QACzE,OAAO,EAAE,CAAC,CAAoC,EAAE,EAAE,CAC9C,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;KAC9D,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,38 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@backendkit-labs/mcp-connectors",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Enterprise MCP connectors — HubSpot CRM, Jira, Google Calendar",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"types": "dist/index.d.ts",
|
|
7
|
-
"bin": {
|
|
8
|
-
"bk-mcp-hubspot":
|
|
9
|
-
"bk-mcp-jira":
|
|
10
|
-
"bk-mcp-gcal":
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"@
|
|
31
|
-
"
|
|
32
|
-
},
|
|
33
|
-
"
|
|
34
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@backendkit-labs/mcp-connectors",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Enterprise MCP connectors — HubSpot CRM, Jira, Google Calendar, Odoo ERP, AI Vault",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"bk-mcp-hubspot": "./dist/hubspot/server.js",
|
|
9
|
+
"bk-mcp-jira": "./dist/jira/server.js",
|
|
10
|
+
"bk-mcp-gcal": "./dist/gcal/server.js",
|
|
11
|
+
"bk-mcp-odoo": "./dist/odoo/server.js",
|
|
12
|
+
"bk-mcp-ai-vault": "./dist/ai-vault/server.js"
|
|
13
|
+
},
|
|
14
|
+
"files": ["dist/", "README.md"],
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/BackendKit-labs/backendkit-agent-framework.git",
|
|
18
|
+
"directory": "packages/mcp-connectors"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": { "access": "public" },
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@backendkit-labs/agent-enterprise": "^0.4.0",
|
|
29
|
+
"@backendkit-labs/retry": "^0.1.2",
|
|
30
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
31
|
+
"zod": "^3.23.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^20.0.0",
|
|
35
|
+
"typescript": "^5.4.0"
|
|
36
|
+
},
|
|
37
|
+
"engines": { "node": ">=20.0.0" }
|
|
38
|
+
}
|