@causari/mcp-server 0.1.1 → 0.1.2

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/worker.js ADDED
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Causari MCP Server — Cloudflare Worker HTTP transport.
3
+ *
4
+ * Implements the MCP "Streamable HTTP" transport as a stateless JSON-RPC endpoint.
5
+ * Each POST /mcp is one request-response cycle — no session state required since
6
+ * all Causari tools are read-only queries against the in-memory CKGStore.
7
+ *
8
+ * Routes:
9
+ * POST /mcp — MCP JSON-RPC endpoint
10
+ * GET / — Info page (server stats + install docs)
11
+ * GET /health — Health check
12
+ * GET /.well-known/mcp.json — MCP server discovery manifest
13
+ * OPTIONS * — CORS preflight
14
+ *
15
+ * Auth: if CAUSARI_API_KEY env var is set, require Authorization: Bearer <key>.
16
+ * Rate limiting: handled by Cloudflare Workers platform.
17
+ */
18
+ import { CKGStore, loadSeed } from '@causari/ckg';
19
+ import { ALL_TOOLS } from './tools.js';
20
+ import { ValidationError } from './validate.js';
21
+ import { VERSION, MCP_PROTOCOL_VERSION, SERVER_NAME } from './version.js';
22
+ // Module-level singleton — initialized once per Worker isolate, shared across requests.
23
+ const store = new CKGStore(loadSeed());
24
+ const ckgStats = store.stats();
25
+ // Reject oversized bodies before parsing — tool args are tiny; anything large is abuse.
26
+ const MAX_BODY_BYTES = 64 * 1024;
27
+ // ── CORS ─────────────────────────────────────────────────────────────────────
28
+ const CORS_HEADERS = {
29
+ 'Access-Control-Allow-Origin': '*',
30
+ 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
31
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization, Mcp-Session-Id',
32
+ 'Access-Control-Max-Age': '86400',
33
+ };
34
+ function corsJson(body, status = 200) {
35
+ return new Response(JSON.stringify(body), {
36
+ status,
37
+ headers: { 'Content-Type': 'application/json', ...CORS_HEADERS },
38
+ });
39
+ }
40
+ function jsonRpcError(id, code, message) {
41
+ return corsJson({ jsonrpc: '2.0', id: id ?? null, error: { code, message } });
42
+ }
43
+ /**
44
+ * A tool-level error — returned inside a successful JSON-RPC result with isError:true,
45
+ * per the MCP spec, so the agent can read the message and self-correct rather than
46
+ * seeing a transport-level failure.
47
+ */
48
+ function toolError(id, text) {
49
+ return corsJson({
50
+ jsonrpc: '2.0',
51
+ id: id ?? null,
52
+ result: { content: [{ type: 'text', text }], isError: true },
53
+ });
54
+ }
55
+ // ── Auth ─────────────────────────────────────────────────────────────────────
56
+ function checkAuth(req, env) {
57
+ if (!env.CAUSARI_API_KEY)
58
+ return true; // no key configured = open
59
+ const header = req.headers.get('Authorization') ?? '';
60
+ const token = header.startsWith('Bearer ') ? header.slice(7) : '';
61
+ // NOTE: plain `===` is not constant-time. Acceptable for the current single
62
+ // shared key on Workers' isolated runtime; upgrade to crypto.subtle.timingSafeEqual
63
+ // when per-tenant keys + rate limiting land (Pro tier, see README roadmap).
64
+ return token === env.CAUSARI_API_KEY;
65
+ }
66
+ // ── MCP JSON-RPC handler ──────────────────────────────────────────────────────
67
+ async function handleMcp(req, env) {
68
+ if (!checkAuth(req, env)) {
69
+ return jsonRpcError(null, -32000, 'Unauthorized — provide Authorization: Bearer <api_key>');
70
+ }
71
+ // Content-Type must be JSON. Browsers/CDNs sometimes send text/plain; accept it
72
+ // leniently only if it parses, but reject obviously-wrong types early.
73
+ const contentType = req.headers.get('Content-Type') ?? '';
74
+ if (contentType && !contentType.includes('application/json') && !contentType.includes('text/plain')) {
75
+ return jsonRpcError(null, -32700, `Unsupported Content-Type "${contentType}" — send application/json`);
76
+ }
77
+ // Size guard — reject oversized bodies before reading them into memory.
78
+ const declaredLength = Number(req.headers.get('Content-Length') ?? '0');
79
+ if (Number.isFinite(declaredLength) && declaredLength > MAX_BODY_BYTES) {
80
+ return jsonRpcError(null, -32600, `Request body too large (max ${MAX_BODY_BYTES} bytes)`);
81
+ }
82
+ const raw = await req.text();
83
+ if (raw.length > MAX_BODY_BYTES) {
84
+ return jsonRpcError(null, -32600, `Request body too large (max ${MAX_BODY_BYTES} bytes)`);
85
+ }
86
+ let body;
87
+ try {
88
+ body = JSON.parse(raw);
89
+ }
90
+ catch {
91
+ return jsonRpcError(null, -32700, 'Parse error — request body must be JSON');
92
+ }
93
+ // Reject batch requests explicitly — this stateless server handles one call per POST.
94
+ if (Array.isArray(body)) {
95
+ return jsonRpcError(null, -32600, 'Batch requests are not supported — send one JSON-RPC request per POST');
96
+ }
97
+ if (typeof body !== 'object' || body === null || typeof body.method !== 'string') {
98
+ return jsonRpcError(body?.id ?? null, -32600, 'Invalid request — missing or non-string "method"');
99
+ }
100
+ const { method, params, id } = body;
101
+ try {
102
+ if (method === 'initialize') {
103
+ return corsJson({
104
+ jsonrpc: '2.0',
105
+ id,
106
+ result: {
107
+ protocolVersion: MCP_PROTOCOL_VERSION,
108
+ capabilities: { tools: {} },
109
+ serverInfo: { name: SERVER_NAME, version: VERSION },
110
+ instructions: 'Causari MCP Server provides access to a curated Causal Knowledge Graph with ' +
111
+ `${ckgStats.eventCount} events and ${ckgStats.causalLinkCount} causal links across technology history. ` +
112
+ 'Use causal_chain to trace cause-effect relationships, query_events for discovery, ' +
113
+ 'historical_resonance for analogies, and predict_scenarios for strategic planning.',
114
+ },
115
+ });
116
+ }
117
+ if (method === 'notifications/initialized') {
118
+ // Notification — no response body per spec
119
+ return new Response(null, { status: 204, headers: CORS_HEADERS });
120
+ }
121
+ if (method === 'tools/list') {
122
+ return corsJson({
123
+ jsonrpc: '2.0',
124
+ id,
125
+ result: {
126
+ tools: ALL_TOOLS.map((t) => ({
127
+ name: t.name,
128
+ description: t.description,
129
+ inputSchema: t.inputSchema,
130
+ })),
131
+ },
132
+ });
133
+ }
134
+ if (method === 'tools/call') {
135
+ const toolName = (params?.name ?? '');
136
+ const rawArgs = params?.arguments;
137
+ // Arguments must be an object (or absent). Reject arrays/scalars early.
138
+ if (rawArgs !== undefined && (typeof rawArgs !== 'object' || rawArgs === null || Array.isArray(rawArgs))) {
139
+ return toolError(id, 'Invalid params: "arguments" must be an object');
140
+ }
141
+ const toolArgs = (rawArgs ?? {});
142
+ const tool = ALL_TOOLS.find((t) => t.name === toolName);
143
+ if (!tool) {
144
+ return toolError(id, `Unknown tool: ${toolName || '(none)'}. Available: ${ALL_TOOLS.map((t) => t.name).join(', ')}`);
145
+ }
146
+ try {
147
+ const result = tool.handler(toolArgs, store);
148
+ return corsJson({
149
+ jsonrpc: '2.0',
150
+ id,
151
+ result: {
152
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
153
+ },
154
+ });
155
+ }
156
+ catch (err) {
157
+ // ValidationError = caller's bad args → return as a tool error result (isError)
158
+ // so the agent sees the remediation message and can retry, not a transport fault.
159
+ if (err instanceof ValidationError) {
160
+ return toolError(id, `Invalid arguments: ${err.message}`);
161
+ }
162
+ const message = err instanceof Error ? err.message : String(err);
163
+ return toolError(id, `Tool execution failed: ${message}`);
164
+ }
165
+ }
166
+ if (method === 'ping') {
167
+ return corsJson({ jsonrpc: '2.0', id, result: {} });
168
+ }
169
+ return jsonRpcError(id, -32601, `Method not found: ${method}`);
170
+ }
171
+ catch (err) {
172
+ const message = err instanceof Error ? err.message : String(err);
173
+ return jsonRpcError(id, -32603, `Internal error: ${message}`);
174
+ }
175
+ }
176
+ // ── Health ────────────────────────────────────────────────────────────────────
177
+ function handleHealth() {
178
+ return corsJson({
179
+ status: 'ok',
180
+ server: SERVER_NAME,
181
+ version: VERSION,
182
+ ckg: {
183
+ events: ckgStats.eventCount,
184
+ links: ckgStats.causalLinkCount,
185
+ },
186
+ transport: 'http-stateless',
187
+ protocol: MCP_PROTOCOL_VERSION,
188
+ });
189
+ }
190
+ // ── Discovery manifest ────────────────────────────────────────────────────────
191
+ function handleDiscovery(url) {
192
+ const base = `${url.protocol}//${url.host}`;
193
+ return corsJson({
194
+ name: 'Causari MCP Server',
195
+ description: 'Causal Knowledge Graph — trace cause-effect chains across tech history',
196
+ version: VERSION,
197
+ protocolVersion: MCP_PROTOCOL_VERSION,
198
+ endpoint: `${base}/mcp`,
199
+ tools: ALL_TOOLS.map((t) => ({ name: t.name, description: t.description })),
200
+ contact: 'https://causari.ai',
201
+ docs: 'https://github.com/causari/mcp-server',
202
+ });
203
+ }
204
+ // ── Root info page ────────────────────────────────────────────────────────────
205
+ function handleRoot(url) {
206
+ const base = `${url.protocol}//${url.host}`;
207
+ const body = `# Causari MCP Server
208
+
209
+ Causal Knowledge Graph — ${ckgStats.eventCount} events · ${ckgStats.causalLinkCount} causal links
210
+
211
+ ## Endpoints
212
+
213
+ POST ${base}/mcp — MCP JSON-RPC (Streamable HTTP transport)
214
+ GET ${base}/health — Health + CKG stats
215
+ GET ${base}/.well-known/mcp.json — Discovery manifest
216
+
217
+ ## Tools
218
+
219
+ ${ALL_TOOLS.map((t) => `- ${t.name}: ${t.description.slice(0, 80)}...`).join('\n')}
220
+
221
+ ## Configure in Claude Desktop
222
+
223
+ {
224
+ "mcpServers": {
225
+ "causari": {
226
+ "url": "${base}/mcp"
227
+ }
228
+ }
229
+ }
230
+
231
+ ## Docs
232
+ https://causari.ai · https://github.com/causari/mcp-server
233
+ `;
234
+ return new Response(body, {
235
+ headers: { 'Content-Type': 'text/plain; charset=utf-8', ...CORS_HEADERS },
236
+ });
237
+ }
238
+ // ── Main fetch handler ────────────────────────────────────────────────────────
239
+ export default {
240
+ async fetch(request, env) {
241
+ const url = new URL(request.url);
242
+ const method = request.method.toUpperCase();
243
+ if (method === 'OPTIONS') {
244
+ return new Response(null, { status: 204, headers: CORS_HEADERS });
245
+ }
246
+ if (url.pathname === '/health' && method === 'GET') {
247
+ return handleHealth();
248
+ }
249
+ if (url.pathname === '/.well-known/mcp.json' && method === 'GET') {
250
+ return handleDiscovery(url);
251
+ }
252
+ if (url.pathname === '/mcp' && method === 'POST') {
253
+ return handleMcp(request, env);
254
+ }
255
+ if (url.pathname === '/' && method === 'GET') {
256
+ return handleRoot(url);
257
+ }
258
+ return new Response('Not Found', { status: 404, headers: CORS_HEADERS });
259
+ },
260
+ };
261
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1E,wFAAwF;AACxF,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;AAE/B,wFAAwF;AACxF,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AAejC,gFAAgF;AAEhF,MAAM,YAAY,GAAG;IACnB,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,oBAAoB;IACpD,8BAA8B,EAAE,6CAA6C;IAC7E,wBAAwB,EAAE,OAAO;CAClC,CAAC;AAEF,SAAS,QAAQ,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC3C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE;KACjE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,EAAsC,EAAE,IAAY,EAAE,OAAe;IACzF,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,EAAsC,EAAE,IAAY;IACrE,OAAO,QAAQ,CAAC;QACd,OAAO,EAAE,KAAK;QACd,EAAE,EAAE,EAAE,IAAI,IAAI;QACd,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF,SAAS,SAAS,CAAC,GAAY,EAAE,GAAQ;IACvC,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC,CAAC,2BAA2B;IAClE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,4EAA4E;IAC5E,oFAAoF;IACpF,4EAA4E;IAC5E,OAAO,KAAK,KAAK,GAAG,CAAC,eAAe,CAAC;AACvC,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,SAAS,CAAC,GAAY,EAAE,GAAQ;IAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,wDAAwD,CAAC,CAAC;IAC9F,CAAC;IAED,gFAAgF;IAChF,uEAAuE;IACvE,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpG,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,6BAA6B,WAAW,2BAA2B,CAAC,CAAC;IACzG,CAAC;IAED,wEAAwE;IACxE,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,cAAc,EAAE,CAAC;QACvE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,+BAA+B,cAAc,SAAS,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,+BAA+B,cAAc,SAAS,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAoB,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,yCAAyC,CAAC,CAAC;IAC/E,CAAC;IAED,sFAAsF;IACtF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,uEAAuE,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjF,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,kDAAkD,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAEpC,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE;oBACN,eAAe,EAAE,oBAAoB;oBACrC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;oBACnD,YAAY,EACV,8EAA8E;wBAC9E,GAAG,QAAQ,CAAC,UAAU,eAAe,QAAQ,CAAC,eAAe,2CAA2C;wBACxG,oFAAoF;wBACpF,mFAAmF;iBACtF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;YAC3C,2CAA2C;YAC3C,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,KAAK;gBACd,EAAE;gBACF,MAAM,EAAE;oBACN,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;qBAC3B,CAAC,CAAC;iBACJ;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAW,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,CAAC;YAClC,wEAAwE;YACxE,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBACzG,OAAO,SAAS,CAAC,EAAE,EAAE,+CAA+C,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YAE5D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,SAAS,CACd,EAAE,EACF,iBAAiB,QAAQ,IAAI,QAAQ,gBAAgB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC7C,OAAO,QAAQ,CAAC;oBACd,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;qBACnE;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gFAAgF;gBAChF,kFAAkF;gBAClF,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;oBACnC,OAAO,SAAS,CAAC,EAAE,EAAE,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,SAAS,CAAC,EAAE,EAAE,0BAA0B,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY;IACnB,OAAO,QAAQ,CAAC;QACd,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE;YACH,MAAM,EAAE,QAAQ,CAAC,UAAU;YAC3B,KAAK,EAAE,QAAQ,CAAC,eAAe;SAChC;QACD,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,oBAAoB;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe,CAAC,GAAQ;IAC/B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,QAAQ,CAAC;QACd,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,wEAAwE;QACrF,OAAO,EAAE,OAAO;QAChB,eAAe,EAAE,oBAAoB;QACrC,QAAQ,EAAE,GAAG,IAAI,MAAM;QACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,uCAAuC;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,SAAS,UAAU,CAAC,GAAQ;IAC1B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG;;2BAEY,QAAQ,CAAC,UAAU,aAAa,QAAQ,CAAC,eAAe;;;;OAI5E,IAAI;OACJ,IAAI;OACJ,IAAI;;;;EAIT,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;gBAOlE,IAAI;;;;;;;CAOnB,CAAC;IACA,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,GAAG,YAAY,EAAE;KAC1E,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnD,OAAO,YAAY,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACjE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACjD,OAAO,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC7C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@causari/mcp-server",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Causari MCP Server — Causal Knowledge Graph for AI agents",
7
7
  "keywords": ["mcp", "causal", "knowledge-graph", "ai", "claude", "cursor"],
8
- "homepage": "https://github.com/causari/mcp-server",
8
+ "homepage": "https://causari.ai",
9
9
  "repository": { "type": "git", "url": "https://github.com/causari/mcp-server" },
10
10
  "license": "MIT",
11
- "files": ["dist/", "README.md", "LICENSE", "NOTICE"],
11
+ "files": ["dist/", "README.md", "LICENSE", "NOTICE", "CHANGELOG.md"],
12
12
  "bin": {
13
13
  "causari-mcp": "dist/cli.js"
14
14
  },
@@ -19,20 +19,23 @@
19
19
  }
20
20
  },
21
21
  "scripts": {
22
- "build": "pnpm --filter @causari/ckg build && tsup",
23
- "dev": "tsup --watch",
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
24
  "start": "node dist/cli.js",
25
+ "test": "tsx src/validate.test.ts && tsx src/worker.test.ts && pnpm build && node dist/smoke.js",
26
+ "test:unit": "tsx src/validate.test.ts && tsx src/worker.test.ts",
27
+ "smoke": "pnpm build && node dist/smoke.js",
25
28
  "deploy": "wrangler deploy",
26
29
  "deploy:dry": "wrangler deploy --dry-run"
27
30
  },
28
31
  "dependencies": {
29
- "@modelcontextprotocol/sdk": "^1.12.1"
32
+ "@modelcontextprotocol/sdk": "^1.12.1",
33
+ "@causari/ckg": "workspace:*"
30
34
  },
31
35
  "devDependencies": {
32
- "@causari/ckg": "workspace:*",
33
- "tsup": "^8.3.0",
34
36
  "wrangler": "^3.99.0",
35
37
  "typescript": "^5.7.0",
38
+ "tsx": "^4.19.0",
36
39
  "@types/node": "^22.0.0"
37
40
  }
38
41
  }