@simplechart/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.
Files changed (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/index.mjs +400 -0
  4. package/package.json +39 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Simple Chart Calculator
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # Human Design for Claude, Cursor & Cline
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@simplechart/mcp?color=c9433b&label=npm)](https://www.npmjs.com/package/@simplechart/mcp)
4
+ [![license: MIT](https://img.shields.io/badge/license-MIT-black)](./LICENSE)
5
+ [![Human Design MCP](https://img.shields.io/badge/MCP-Human%20Design-c9433b)](https://simplechartcalculator.com/mcp)
6
+
7
+ Compute Human Design charts, cycle returns, transits, synthesis, and chart
8
+ comparison **natively inside your AI assistant** — powered by
9
+ [Simple Chart Calculator](https://simplechartcalculator.com/mcp). Sub-second
10
+ precision, built on Swiss Ephemeris. 9 tools.
11
+
12
+ ---
13
+
14
+ ## ⚡ Fastest: remote connector — no install at all
15
+
16
+ Works in Claude on the **web, desktop and Cowork** (and any MCP client that
17
+ supports remote servers). In Claude: **Settings → Connectors → Add custom
18
+ connector**, then paste your personal URL:
19
+
20
+ ```
21
+ https://api.simplechartcalculator.com/mcp/YOUR_API_KEY
22
+ ```
23
+
24
+ Get a free key (and your ready-made personal URL) at
25
+ **https://simplechartcalculator.com/portal**. The URL contains your key —
26
+ treat it like a password. The remote connector exposes the 5 calculation
27
+ tools; the local install below adds a private on-device people roster.
28
+
29
+ ---
30
+
31
+ ## ✅ Local install — one click (Claude Desktop)
32
+
33
+ No config files, no terminal.
34
+
35
+ 1. **Download** `Human-Design-SimpleChartCalculator.mcpb`.
36
+ 2. **Double-click** it (or open Claude Desktop → **Settings → Extensions → Install…** and pick the file).
37
+ 3. When asked, **paste your API key** in the box. No key yet? Get a free one at
38
+ **https://simplechartcalculator.com/register** (30 seconds, no card). Keep the
39
+ key private — it counts against your plan.
40
+ 4. Done. Just chat (see *Example prompts* below).
41
+
42
+ ---
43
+
44
+ ## Other clients (Cursor, Cline) — config file
45
+
46
+ If you're not on Claude Desktop, add the server to your MCP config manually:
47
+
48
+ ```json
49
+ {
50
+ "mcpServers": {
51
+ "human-design": {
52
+ "command": "npx",
53
+ "args": ["-y", "@simplechart/mcp"],
54
+ "env": { "SCC_API_KEY": "YOUR_KEY" }
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ - **Cursor:** `~/.cursor/mcp.json` (or Settings → MCP → Add Server)
61
+ - **Cline:** MCP Servers → Configure
62
+
63
+ > The `npx @simplechart/mcp` command needs the package published to npm. The
64
+ > one-click `.mcpb` above is fully self-contained and works without npm.
65
+
66
+ ## Tools (9)
67
+
68
+ | Tool | What it does |
69
+ |------|--------------|
70
+ | `calculate_chart` | Full bodygraph from birth data — type, authority, profile, centers, channels, all 14 planets as gate.line.color.tone.base. |
71
+ | `get_synthesis` | The interpretive layer — strategy, signature, not-self, incarnation cross, variables. |
72
+ | `calculate_cycle` | Exact Solar / Saturn / Uranus-opposition / Chiron return moment (sub-second) + the chart for it. |
73
+ | `get_transit` | The live global transit chart right now. |
74
+ | `compare_charts` | Connection dynamics between two people — electromagnetic, dominance, compromise & companionship channels. |
75
+ | `save_person` | Save birth data **locally on your machine** (`~/.simplechart-mcp/people.json`) to recall or compare by name. |
76
+ | `get_person` | Recall a saved person's full chart by name. |
77
+ | `list_people` | List everyone in your local roster. |
78
+ | `remove_person` | Delete someone from your roster. |
79
+
80
+ > Your saved people live in a local JSON file on your own machine — nothing is
81
+ > stored on our servers.
82
+
83
+ ## Example prompts
84
+
85
+ Once installed, just ask your assistant in plain language:
86
+
87
+ > "Calculate the Human Design chart for Ra Uru Hu, born 9 April 1948 at 00:05 in Montreal."
88
+
89
+ > "When was Ra Uru Hu's first Saturn return? Born 9 April 1948, 00:05, Montreal."
90
+
91
+ > "Save my mum's birth data, then compare her chart with mine."
92
+
93
+ > "What's the current Human Design transit?"
94
+
95
+ ## Environment variables
96
+
97
+ | Var | Required | Default |
98
+ |-----|----------|---------|
99
+ | `SCC_API_KEY` | yes | — |
100
+ | `SCC_API_BASE` | no | `https://api.simplechartcalculator.com` |
101
+
102
+ The free tier includes 300 calls/month (6 via MCP). Pro ($33/mo) includes
103
+ 25,000 calls, full synthesis data and 600 MCP calls.
104
+
105
+ ## License
106
+
107
+ MIT © Simple Chart Calculator
package/index.mjs ADDED
@@ -0,0 +1,400 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Simple Chart Calculator — Human Design MCP Server
4
+ * ------------------------------------------------------------------
5
+ * Exposes the SCC Human Design API as MCP tools so Claude, Cursor,
6
+ * Cline, or any MCP client can compute charts natively.
7
+ *
8
+ * Auth: set SCC_API_KEY in the MCP server env (works with any tier,
9
+ * including the free key). Get one at https://simplechartcalculator.com/register
10
+ * ------------------------------------------------------------------
11
+ */
12
+
13
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
+ import { z } from "zod";
16
+ import fs from "node:fs";
17
+ import os from "node:os";
18
+ import path from "node:path";
19
+
20
+ const API_BASE = process.env.SCC_API_BASE || "https://api.simplechartcalculator.com";
21
+ const API_KEY = process.env.SCC_API_KEY || "";
22
+
23
+ if (!API_KEY) {
24
+ process.stderr.write(
25
+ "[simplechart-mcp] Missing SCC_API_KEY. Get a free key at " +
26
+ "https://simplechartcalculator.com/register and set it in your MCP env.\n"
27
+ );
28
+ }
29
+
30
+ /** GET the API with the key injected; returns parsed JSON or throws a clean error. */
31
+ async function callApi(path, params) {
32
+ const url = new URL(API_BASE + path);
33
+ for (const [k, v] of Object.entries(params)) {
34
+ if (v !== undefined && v !== null && v !== "") url.searchParams.set(k, String(v));
35
+ }
36
+ url.searchParams.set("key", API_KEY);
37
+
38
+ const res = await fetch(url, {
39
+ headers: {
40
+ Origin: "https://simplechartcalculator.com",
41
+ "X-ASCCalc-Client": "mcp", // lets the backend meter MCP calls against the per-tier MCP cap
42
+ },
43
+ });
44
+
45
+ const text = await res.text();
46
+ if (!res.ok) {
47
+ let detail = text;
48
+ try {
49
+ detail = JSON.parse(text).detail ?? text;
50
+ } catch {
51
+ /* keep raw text */
52
+ }
53
+ throw new Error(`API ${res.status}: ${detail}`);
54
+ }
55
+ return text; // already JSON string — hand straight to the model
56
+ }
57
+
58
+ function ok(text) {
59
+ return { content: [{ type: "text", text }] };
60
+ }
61
+ function fail(err) {
62
+ return {
63
+ isError: true,
64
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
65
+ };
66
+ }
67
+
68
+ // ── People roster — local JSON persistence (your data stays on your machine) ──
69
+ const ROSTER_DIR = path.join(os.homedir(), ".simplechart-mcp");
70
+ const ROSTER_FILE = path.join(ROSTER_DIR, "people.json");
71
+
72
+ function loadRoster() {
73
+ try {
74
+ return JSON.parse(fs.readFileSync(ROSTER_FILE, "utf8"));
75
+ } catch {
76
+ return {};
77
+ }
78
+ }
79
+ function saveRoster(roster) {
80
+ fs.mkdirSync(ROSTER_DIR, { recursive: true });
81
+ fs.writeFileSync(ROSTER_FILE, JSON.stringify(roster, null, 2), "utf8");
82
+ }
83
+ function personParams(p) {
84
+ return { y: p.year, m: p.month, d: p.day, h: p.hour, min: p.minute, s: p.second ?? 0, tz: p.timezone };
85
+ }
86
+
87
+ // ── Connection analysis (compare_charts) ──
88
+ // 36 canonical Human Design channels.
89
+ const CHANNELS = [
90
+ [64, 47], [61, 24], [63, 4], [17, 62], [43, 23], [11, 56], [16, 48], [20, 57],
91
+ [20, 10], [20, 34], [31, 7], [8, 1], [33, 13], [45, 21], [35, 36], [12, 22],
92
+ [10, 57], [10, 34], [15, 5], [2, 14], [46, 29], [25, 51], [18, 58], [28, 38],
93
+ [32, 54], [50, 27], [34, 57], [44, 26], [59, 6], [9, 52], [3, 60], [42, 53],
94
+ [37, 40], [19, 49], [39, 55], [41, 30],
95
+ ];
96
+
97
+ // Deep-scan an API chart response for every active gate number (robust to shape).
98
+ function collectGates(obj, acc = new Set()) {
99
+ if (obj == null || typeof obj !== "object") return acc;
100
+ for (const [k, v] of Object.entries(obj)) {
101
+ if ((k === "Gate" || k === "gate") && typeof v === "number") acc.add(v);
102
+ else if (typeof v === "object") collectGates(v, acc);
103
+ }
104
+ return acc;
105
+ }
106
+
107
+ // Classify each channel formed when combining two people's gates.
108
+ function analyzeConnection(gatesA, gatesB) {
109
+ const out = { electromagnetic: [], dominanceA: [], dominanceB: [], compromise: [], companionship: [] };
110
+ for (const [g1, g2] of CHANNELS) {
111
+ const a1 = gatesA.has(g1), a2 = gatesA.has(g2);
112
+ const b1 = gatesB.has(g1), b2 = gatesB.has(g2);
113
+ const combined1 = a1 || b1, combined2 = a2 || b2;
114
+ if (!(combined1 && combined2)) continue; // channel doesn't form
115
+ const aFull = a1 && a2, bFull = b1 && b2;
116
+ const label = `${g1}-${g2}`;
117
+ if (aFull && bFull) out.companionship.push(label);
118
+ else if (aFull && (b1 || b2)) out.compromise.push(label);
119
+ else if (bFull && (a1 || a2)) out.compromise.push(label);
120
+ else if (aFull) out.dominanceA.push(label);
121
+ else if (bFull) out.dominanceB.push(label);
122
+ else out.electromagnetic.push(label); // each contributes one gate
123
+ }
124
+ return out;
125
+ }
126
+
127
+ const server = new McpServer({
128
+ name: "human-design",
129
+ version: "1.0.0",
130
+ });
131
+
132
+ // ── calculate_chart ────────────────────────────────────────────────
133
+ server.tool(
134
+ "calculate_chart",
135
+ "Calculate a complete Human Design bodygraph chart from birth data. " +
136
+ "Returns type, authority, profile, incarnation cross, defined/open centers, " +
137
+ "channels, and every planet as gate.line.color.tone.base for both Personality and Design.",
138
+ {
139
+ year: z.number().int().describe("Birth year, e.g. 1948"),
140
+ month: z.number().int().min(1).max(12),
141
+ day: z.number().int().min(1).max(31),
142
+ hour: z.number().int().min(0).max(23),
143
+ minute: z.number().int().min(0).max(59),
144
+ second: z.number().int().min(0).max(59).optional().describe("Optional, default 0"),
145
+ timezone: z.string().describe("IANA timezone of the birth place, e.g. 'America/Toronto'"),
146
+ },
147
+ async ({ year, month, day, hour, minute, second, timezone }) => {
148
+ try {
149
+ const data = await callApi("/v1/calculate", {
150
+ y: year, m: month, d: day, h: hour, min: minute, s: second ?? 0, tz: timezone,
151
+ });
152
+ return ok(data);
153
+ } catch (e) {
154
+ return fail(e);
155
+ }
156
+ }
157
+ );
158
+
159
+ // ── calculate_cycle ────────────────────────────────────────────────
160
+ server.tool(
161
+ "calculate_cycle",
162
+ "Find the exact moment of a Human Design cycle return (Solar Return, Saturn Return, " +
163
+ "Uranus Opposition, or Chiron Return) with sub-second precision, and return the full " +
164
+ "chart for that moment. Uses Swiss Ephemeris binary search on continuous time.",
165
+ {
166
+ cycle: z
167
+ .enum(["solar-return", "saturn-return-1", "saturn-return-2", "uranus-opposition", "chiron-return"])
168
+ .describe("Which cycle to compute"),
169
+ natal_year: z.number().int(),
170
+ natal_month: z.number().int().min(1).max(12),
171
+ natal_day: z.number().int().min(1).max(31),
172
+ natal_hour: z.number().int().min(0).max(23),
173
+ natal_minute: z.number().int().min(0).max(59),
174
+ natal_second: z.number().int().min(0).max(59).optional(),
175
+ natal_timezone: z.string().describe("IANA timezone of the birth place"),
176
+ return_year: z
177
+ .number()
178
+ .int()
179
+ .optional()
180
+ .describe("Required for solar-return — which birthday (e.g. 36 = 36th)"),
181
+ result_timezone: z
182
+ .string()
183
+ .optional()
184
+ .describe("Timezone for the returned datetime (defaults to natal_timezone)"),
185
+ },
186
+ async (a) => {
187
+ try {
188
+ const data = await callApi("/v1/cycle", {
189
+ cycle: a.cycle,
190
+ natal_y: a.natal_year, natal_m: a.natal_month, natal_d: a.natal_day,
191
+ natal_h: a.natal_hour, natal_min: a.natal_minute, natal_s: a.natal_second ?? 0,
192
+ natal_tz: a.natal_timezone,
193
+ return_year: a.return_year,
194
+ result_tz: a.result_timezone,
195
+ });
196
+ return ok(data);
197
+ } catch (e) {
198
+ return fail(e);
199
+ }
200
+ }
201
+ );
202
+
203
+ // ── get_transit ────────────────────────────────────────────────────
204
+ server.tool(
205
+ "get_transit",
206
+ "Get the current global Human Design transit chart — the live planetary weather right now.",
207
+ {},
208
+ async () => {
209
+ try {
210
+ const data = await callApi("/v1/transit", {});
211
+ return ok(data);
212
+ } catch (e) {
213
+ return fail(e);
214
+ }
215
+ }
216
+ );
217
+
218
+ // ── get_synthesis ──────────────────────────────────────────────────
219
+ // Convenience alias: same endpoint as calculate_chart, framed as "interpret".
220
+ server.tool(
221
+ "get_synthesis",
222
+ "Return the interpretive synthesis for a birth chart — type, strategy, authority, " +
223
+ "signature, not-self theme, profile, definition, incarnation cross and variables. " +
224
+ "(Same engine as calculate_chart; use this when you want the meaning, not raw planets.)",
225
+ {
226
+ year: z.number().int(),
227
+ month: z.number().int().min(1).max(12),
228
+ day: z.number().int().min(1).max(31),
229
+ hour: z.number().int().min(0).max(23),
230
+ minute: z.number().int().min(0).max(59),
231
+ second: z.number().int().min(0).max(59).optional(),
232
+ timezone: z.string(),
233
+ },
234
+ async ({ year, month, day, hour, minute, second, timezone }) => {
235
+ try {
236
+ const data = await callApi("/v1/calculate", {
237
+ y: year, m: month, d: day, h: hour, min: minute, s: second ?? 0, tz: timezone,
238
+ });
239
+ return ok(data);
240
+ } catch (e) {
241
+ return fail(e);
242
+ }
243
+ }
244
+ );
245
+
246
+ // ── save_person ────────────────────────────────────────────────────
247
+ const personShape = {
248
+ name: z.string().describe("A label to save this person under, e.g. 'Mum' or 'Ra'"),
249
+ year: z.number().int(),
250
+ month: z.number().int().min(1).max(12),
251
+ day: z.number().int().min(1).max(31),
252
+ hour: z.number().int().min(0).max(23),
253
+ minute: z.number().int().min(0).max(59),
254
+ second: z.number().int().min(0).max(59).optional(),
255
+ timezone: z.string().describe("IANA timezone of the birth place"),
256
+ };
257
+
258
+ server.tool(
259
+ "save_person",
260
+ "Save a person's birth data locally (on this machine) so their chart can be recalled or compared by name later.",
261
+ personShape,
262
+ async (a) => {
263
+ try {
264
+ const roster = loadRoster();
265
+ roster[a.name] = {
266
+ year: a.year, month: a.month, day: a.day,
267
+ hour: a.hour, minute: a.minute, second: a.second ?? 0, timezone: a.timezone,
268
+ };
269
+ saveRoster(roster);
270
+ return ok(`Saved "${a.name}". Roster now has ${Object.keys(roster).length} people.`);
271
+ } catch (e) {
272
+ return fail(e);
273
+ }
274
+ }
275
+ );
276
+
277
+ // ── list_people ────────────────────────────────────────────────────
278
+ server.tool(
279
+ "list_people",
280
+ "List everyone saved in the local roster with their birth data.",
281
+ {},
282
+ async () => {
283
+ try {
284
+ const roster = loadRoster();
285
+ const names = Object.keys(roster);
286
+ if (!names.length) return ok("Roster is empty. Use save_person to add someone.");
287
+ return ok(JSON.stringify(roster, null, 2));
288
+ } catch (e) {
289
+ return fail(e);
290
+ }
291
+ }
292
+ );
293
+
294
+ // ── get_person ─────────────────────────────────────────────────────
295
+ server.tool(
296
+ "get_person",
297
+ "Recall a saved person and return their full Human Design chart by name.",
298
+ { name: z.string().describe("The saved person's name") },
299
+ async ({ name }) => {
300
+ try {
301
+ const roster = loadRoster();
302
+ const p = roster[name];
303
+ if (!p) return fail(new Error(`No saved person named "${name}". Use list_people to see the roster.`));
304
+ const data = await callApi("/v1/calculate", personParams(p));
305
+ return ok(data);
306
+ } catch (e) {
307
+ return fail(e);
308
+ }
309
+ }
310
+ );
311
+
312
+ // ── remove_person ──────────────────────────────────────────────────
313
+ server.tool(
314
+ "remove_person",
315
+ "Delete a person from the local roster.",
316
+ { name: z.string() },
317
+ async ({ name }) => {
318
+ try {
319
+ const roster = loadRoster();
320
+ if (!(name in roster)) return fail(new Error(`No saved person named "${name}".`));
321
+ delete roster[name];
322
+ saveRoster(roster);
323
+ return ok(`Removed "${name}". Roster now has ${Object.keys(roster).length} people.`);
324
+ } catch (e) {
325
+ return fail(e);
326
+ }
327
+ }
328
+ );
329
+
330
+ // ── compare_charts ─────────────────────────────────────────────────
331
+ server.tool(
332
+ "compare_charts",
333
+ "Compare two Human Design charts and return their connection dynamics — electromagnetic, " +
334
+ "dominance, compromise and companionship channels. Give two saved names, two sets of birth " +
335
+ "data, or a mix.",
336
+ {
337
+ a_name: z.string().optional().describe("Saved name for person A (instead of birth data)"),
338
+ b_name: z.string().optional().describe("Saved name for person B (instead of birth data)"),
339
+ a: z.object({
340
+ year: z.number().int(), month: z.number().int(), day: z.number().int(),
341
+ hour: z.number().int(), minute: z.number().int(), second: z.number().int().optional(),
342
+ timezone: z.string(),
343
+ }).optional().describe("Birth data for person A (if not using a_name)"),
344
+ b: z.object({
345
+ year: z.number().int(), month: z.number().int(), day: z.number().int(),
346
+ hour: z.number().int(), minute: z.number().int(), second: z.number().int().optional(),
347
+ timezone: z.string(),
348
+ }).optional().describe("Birth data for person B (if not using b_name)"),
349
+ },
350
+ async (args) => {
351
+ try {
352
+ const roster = loadRoster();
353
+ const resolve = (name, data, which) => {
354
+ if (name) {
355
+ const p = roster[name];
356
+ if (!p) throw new Error(`No saved person named "${name}".`);
357
+ return { label: name, params: personParams(p) };
358
+ }
359
+ if (data) return { label: which, params: personParams(data) };
360
+ throw new Error(`Provide ${which}_name or ${which} birth data.`);
361
+ };
362
+ const A = resolve(args.a_name, args.a, "a");
363
+ const B = resolve(args.b_name, args.b, "b");
364
+
365
+ const [rawA, rawB] = await Promise.all([
366
+ callApi("/v1/calculate", A.params),
367
+ callApi("/v1/calculate", B.params),
368
+ ]);
369
+ const gatesA = collectGates(JSON.parse(rawA));
370
+ const gatesB = collectGates(JSON.parse(rawB));
371
+ const conn = analyzeConnection(gatesA, gatesB);
372
+
373
+ const summary = {
374
+ personA: A.label,
375
+ personB: B.label,
376
+ connection: conn,
377
+ counts: {
378
+ electromagnetic: conn.electromagnetic.length,
379
+ dominanceA: conn.dominanceA.length,
380
+ dominanceB: conn.dominanceB.length,
381
+ compromise: conn.compromise.length,
382
+ companionship: conn.companionship.length,
383
+ },
384
+ legend: {
385
+ electromagnetic: "Each contributes one gate — attraction / mutual completion.",
386
+ dominance: "One person already has the full channel; they lead its theme.",
387
+ compromise: "One has the full channel, the other has one gate — needs adjustment.",
388
+ companionship: "Both have the full channel — shared, self-sufficient.",
389
+ },
390
+ };
391
+ return ok(JSON.stringify(summary, null, 2));
392
+ } catch (e) {
393
+ return fail(e);
394
+ }
395
+ }
396
+ );
397
+
398
+ const transport = new StdioServerTransport();
399
+ await server.connect(transport);
400
+ process.stderr.write("[simplechart-mcp] Human Design MCP server running on stdio (9 tools).\n");
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@simplechart/mcp",
3
+ "version": "1.0.0",
4
+ "description": "Human Design MCP server — 9 tools: charts, cycles, synthesis, transits, chart comparison & a local people roster. For Claude, Cursor, or any MCP client. Powered by Simple Chart Calculator.",
5
+ "type": "module",
6
+ "bin": {
7
+ "simplechart-mcp": "index.mjs"
8
+ },
9
+ "files": [
10
+ "index.mjs",
11
+ "README.md"
12
+ ],
13
+ "engines": {
14
+ "node": ">=18"
15
+ },
16
+ "keywords": [
17
+ "human-design",
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "bodygraph",
21
+ "astrology",
22
+ "claude",
23
+ "cursor"
24
+ ],
25
+ "author": "Simple Chart Calculator",
26
+ "license": "MIT",
27
+ "homepage": "https://simplechartcalculator.com/mcp",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/simplechartcalculator/human-design-mcp.git"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/simplechartcalculator/human-design-mcp/issues"
34
+ },
35
+ "dependencies": {
36
+ "@modelcontextprotocol/sdk": "^1.0.0",
37
+ "zod": "^3.23.8"
38
+ }
39
+ }