@openephemeris/mcp-server 3.9.3 → 3.10.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.
@@ -45,6 +45,21 @@ registerTool({
45
45
  description: "Output format. 'llm' returns compact array projection for token efficiency (available on all tiers). " +
46
46
  "'json' returns verbose full output.",
47
47
  },
48
+ include_visual: {
49
+ type: "boolean",
50
+ description: "When true, renders the Human Design bodygraph as an SVG and embeds it in the response. " +
51
+ "The bodygraph image will display in the conversation alongside the data. " +
52
+ "Costs 2 additional credits on top of the base call cost.",
53
+ },
54
+ visual_config: {
55
+ type: "object",
56
+ description: "Optional rendering preferences (only used when include_visual=true).",
57
+ properties: {
58
+ theme: { type: "string", enum: ["light", "dark"], description: "Color theme. Default: dark (HD convention)." },
59
+ size: { type: "number", description: "Canvas size in pixels, 200–4000. Default: 800." },
60
+ },
61
+ additionalProperties: false,
62
+ },
48
63
  },
49
64
  required: ["datetime"],
50
65
  additionalProperties: false,
@@ -61,6 +76,14 @@ registerTool({
61
76
  const query = {};
62
77
  if (args.format)
63
78
  query.format = args.format;
79
+ if (args.include_visual) {
80
+ body.include_visual = true;
81
+ body.visual_config = {
82
+ format: "svg",
83
+ theme: args.visual_config?.theme || "dark", // HD convention defaults to dark
84
+ size: args.visual_config?.size || 800,
85
+ };
86
+ }
64
87
  return await getActiveClient().request("POST", "/human-design/chart", {
65
88
  data: body,
66
89
  params: query,
@@ -54,6 +54,21 @@ registerTool({
54
54
  type: "boolean",
55
55
  description: "Reserved for future use. Fixed star positions are currently available via the dedicated /ephemeris/fixed-stars endpoint.",
56
56
  },
57
+ include_visual: {
58
+ type: "boolean",
59
+ description: "When true, renders the natal chart wheel as an SVG and embeds it directly in the response. " +
60
+ "The chart image will display in the conversation alongside the data. " +
61
+ "Costs 2 additional credits on top of the base call cost.",
62
+ },
63
+ visual_config: {
64
+ type: "object",
65
+ description: "Optional rendering preferences (only used when include_visual=true).",
66
+ properties: {
67
+ theme: { type: "string", enum: ["light", "dark"], description: "Color theme. Default: light." },
68
+ size: { type: "number", description: "Canvas size in pixels, 200–4000. Default: 800." },
69
+ },
70
+ additionalProperties: false,
71
+ },
57
72
  },
58
73
  required: ["datetime", "latitude", "longitude"],
59
74
  additionalProperties: false,
@@ -91,6 +106,14 @@ registerTool({
91
106
  const query = {};
92
107
  if (args.format)
93
108
  query.format = args.format;
109
+ if (args.include_visual) {
110
+ body.include_visual = true;
111
+ body.visual_config = {
112
+ format: "svg", // always SVG for MCP — no resvg dependency
113
+ theme: args.visual_config?.theme || "light",
114
+ size: args.visual_config?.size || 800,
115
+ };
116
+ }
94
117
  return await getActiveClient().request("POST", "/ephemeris/natal-chart", {
95
118
  data: body,
96
119
  params: query,
@@ -37,6 +37,21 @@ registerTool({
37
37
  type: "boolean",
38
38
  description: "Whether to include aspect grid in the response. Default false.",
39
39
  },
40
+ include_visual: {
41
+ type: "boolean",
42
+ description: "When true, renders the progressed chart wheel as an SVG and embeds it in the response. " +
43
+ "The chart image will display in the conversation alongside the data. " +
44
+ "Costs 2 additional credits on top of the base call cost.",
45
+ },
46
+ visual_config: {
47
+ type: "object",
48
+ description: "Optional rendering preferences (only used when include_visual=true).",
49
+ properties: {
50
+ theme: { type: "string", enum: ["light", "dark"], description: "Color theme. Default: light." },
51
+ size: { type: "number", description: "Canvas size in pixels, 200–4000. Default: 800." },
52
+ },
53
+ additionalProperties: false,
54
+ },
40
55
  },
41
56
  required: ["birth_datetime", "birth_latitude", "birth_longitude", "target_datetime"],
42
57
  additionalProperties: false,
@@ -60,6 +75,14 @@ registerTool({
60
75
  if (args.include_aspects != null) {
61
76
  body.options = { include_aspects: args.include_aspects };
62
77
  }
78
+ if (args.include_visual) {
79
+ body.include_visual = true;
80
+ body.visual_config = {
81
+ format: "svg",
82
+ theme: args.visual_config?.theme || "light",
83
+ size: args.visual_config?.size || 800,
84
+ };
85
+ }
63
86
  return await getActiveClient().post("/ephemeris/progressed", body);
64
87
  },
65
88
  });
@@ -40,6 +40,21 @@ registerTool({
40
40
  type: "number",
41
41
  description: "Location longitude for the return chart (optional).",
42
42
  },
43
+ include_visual: {
44
+ type: "boolean",
45
+ description: "When true, renders the solar return chart wheel as an SVG and embeds it in the response. " +
46
+ "The chart image will display in the conversation alongside the data. " +
47
+ "Costs 2 additional credits on top of the base call cost.",
48
+ },
49
+ visual_config: {
50
+ type: "object",
51
+ description: "Optional rendering preferences (only used when include_visual=true).",
52
+ properties: {
53
+ theme: { type: "string", enum: ["light", "dark"], description: "Color theme. Default: light." },
54
+ size: { type: "number", description: "Canvas size in pixels, 200–4000. Default: 800." },
55
+ },
56
+ additionalProperties: false,
57
+ },
43
58
  },
44
59
  required: ["birth_datetime"],
45
60
  additionalProperties: false,
@@ -64,6 +79,14 @@ registerTool({
64
79
  longitude: { decimal: args.return_longitude },
65
80
  };
66
81
  }
82
+ if (args.include_visual) {
83
+ body.include_visual = true;
84
+ body.visual_config = {
85
+ format: "svg",
86
+ theme: args.visual_config?.theme || "light",
87
+ size: args.visual_config?.size || 800,
88
+ };
89
+ }
67
90
  return await getActiveClient().post("/predictive/returns/solar", body);
68
91
  },
69
92
  });
@@ -28,6 +28,21 @@ registerTool({
28
28
  enum: ["json", "llm"],
29
29
  description: "Output format. 'llm' is compact and token-efficient (available on all tiers).",
30
30
  },
31
+ include_visual: {
32
+ type: "boolean",
33
+ description: "When true, renders a bi-wheel SVG comparing both charts and embeds it in the response. " +
34
+ "The chart image will display in the conversation alongside the data. " +
35
+ "Costs 2 additional credits on top of the base call cost.",
36
+ },
37
+ visual_config: {
38
+ type: "object",
39
+ description: "Optional rendering preferences (only used when include_visual=true).",
40
+ properties: {
41
+ theme: { type: "string", enum: ["light", "dark"], description: "Color theme. Default: light." },
42
+ size: { type: "number", description: "Canvas size in pixels, 200–4000. Default: 800." },
43
+ },
44
+ additionalProperties: false,
45
+ },
31
46
  },
32
47
  required: [
33
48
  "person_a_datetime", "person_a_latitude", "person_a_longitude",
@@ -63,6 +78,14 @@ registerTool({
63
78
  const query = {};
64
79
  if (args.format)
65
80
  query.format = args.format;
81
+ if (args.include_visual) {
82
+ body.include_visual = true;
83
+ body.visual_config = {
84
+ format: "svg",
85
+ theme: args.visual_config?.theme || "light",
86
+ size: args.visual_config?.size || 800,
87
+ };
88
+ }
66
89
  return await getActiveClient().request("POST", "/comparative/synastry", {
67
90
  data: body,
68
91
  params: query,