kundali-chart-mcp 0.2.6 → 0.2.7

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 (2) hide show
  1. package/kundali-chart-mcp.js +500 -69
  2. package/package.json +2 -2
@@ -34,12 +34,14 @@ if (!existsSync(nodeModules)) {
34
34
 
35
35
  // ─── Load MCP SDK ──────────────────────────────────────────────────────────
36
36
  const { McpServer } = await import("@modelcontextprotocol/sdk/server/mcp.js");
37
- const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js");
37
+ const { StdioServerTransport } =
38
+ await import("@modelcontextprotocol/sdk/server/stdio.js");
38
39
  const { z } = await import("zod");
39
40
 
40
41
  // ─── Config ────────────────────────────────────────────────────────────────
41
42
  const DEFAULT_URL = "https://kundali-mcp-func.azurewebsites.net";
42
- const FUNCTION_URL = process.argv[2] || process.env.KUNDALI_FUNCTION_URL || DEFAULT_URL;
43
+ const FUNCTION_URL =
44
+ process.argv[2] || process.env.KUNDALI_FUNCTION_URL || DEFAULT_URL;
43
45
 
44
46
  if (!FUNCTION_URL) {
45
47
  console.error("Usage: kundali-chart-mcp <function-url>");
@@ -77,14 +79,31 @@ function jsonContent(data) {
77
79
 
78
80
  const standardBirthInput = {
79
81
  name: z.string().optional().describe("Person's name."),
80
- city: z.string().optional().describe("Birth city. Used for geocoding if coordinates not provided."),
81
- date_of_birth: z.string().describe("Birth date YYYY-MM-DD."),
82
- time_of_birth: z.string().describe("Birth time HH:MM or HH:MM:SS, local to birthplace."),
83
- latitude: z.number().optional().describe("Birth latitude. Must come with longitude."),
84
- longitude: z.number().optional().describe("Birth longitude. Must come with latitude."),
82
+ city: z
83
+ .string()
84
+ .optional()
85
+ .describe("Birth city. Used for geocoding if coordinates not provided."),
86
+ date_of_birth: z.string().describe("Birth date in YYYY-MM-DD format."),
87
+ time_of_birth: z
88
+ .string()
89
+ .describe("Birth time in HH:MM or HH:MM:SS, local to birthplace."),
90
+ latitude: z
91
+ .number()
92
+ .optional()
93
+ .describe("Birth latitude. Must come with longitude."),
94
+ longitude: z
95
+ .number()
96
+ .optional()
97
+ .describe("Birth longitude. Must come with latitude."),
85
98
  timezone: z.string().optional().describe("IANA timezone, e.g. Asia/Kolkata."),
86
- ayanamsa_mode: z.string().optional().describe("Ayanamsa, default 'lahiri'."),
87
- house_system: z.string().optional().describe("House system code, default 'P'."),
99
+ ayanamsa_mode: z
100
+ .string()
101
+ .optional()
102
+ .describe("Sidereal calculation mode. Default: lahiri."),
103
+ house_system: z
104
+ .string()
105
+ .optional()
106
+ .describe("House system code. Default: P (Placidus)."),
88
107
  };
89
108
 
90
109
  // ─── Server ────────────────────────────────────────────────────────────────
@@ -93,66 +112,478 @@ const server = new McpServer({
93
112
  version: "0.2.0",
94
113
  });
95
114
 
96
- server.tool("generate_kundali", "Generate a Vedic Kundali birth chart from birth details.", {
97
- name: z.string().describe("Person's name."),
98
- city: z.string().describe("Birth city/place."),
99
- date_of_birth: z.string().describe("Birth date in YYYY-MM-DD format."),
100
- time_of_birth: z.string().describe("Birth time in HH:MM or HH:MM:SS format."),
101
- latitude: z.number().optional(),
102
- longitude: z.number().optional(),
103
- timezone: z.string().optional(),
104
- chart_type: z.string().optional().describe("Optional chart type. Default: lagna."),
105
- ayanamsa_mode: z.string().optional().describe("Optional sidereal mode. Default: lahiri."),
106
- house_system: z.string().optional().describe("Optional house system code. Default: P."),
107
- }, async (args) => jsonContent(await callRemote("generate_kundali", args)));
108
-
109
- server.tool("list_available_chart_types", "List supported Kundali chart types and aliases.", {}, async (a) => jsonContent(await callRemote("list_available_chart_types", a)));
110
- server.tool("list_ayanamsa_modes", "List all sidereal (ayanamsa) modes.", {}, async (a) => jsonContent(await callRemote("list_ayanamsa_modes", a)));
111
- server.tool("list_house_systems", "List all house systems.", {}, async (a) => jsonContent(await callRemote("list_house_systems", a)));
112
- server.tool("search_birth_places", "Search birth-place suggestions.", { query: z.string(), limit: z.number().int().min(1).max(10).optional() }, async (a) => jsonContent(await callRemote("search_birth_places", a)));
113
- server.tool("get_timezone_for_coordinates", "Get IANA timezone for lat/lon.", { latitude: z.number(), longitude: z.number() }, async (a) => jsonContent(await callRemote("get_timezone_for_coordinates", a)));
114
- server.tool("get_transit_positions", "Get sidereal planetary transit positions.", { datetime_utc: z.string().optional() }, async (a) => jsonContent(await callRemote("get_transit_positions", a)));
115
- server.tool("get_extended_chart", "Get enhanced Kundali chart with SubLord/KP data.", { year: z.number(), month: z.number(), day: z.number(), hour: z.number(), minute: z.number(), second: z.number().optional(), utc_offset: z.string(), latitude: z.number(), longitude: z.number(), ayanamsa: z.string().optional(), house_system: z.string().optional() }, async (a) => jsonContent(await callRemote("get_extended_chart", a)));
116
- server.tool("get_vimshottari_dasha", "Get Vimshottari Dasha periods.", { year: z.number(), month: z.number(), day: z.number(), hour: z.number(), minute: z.number(), second: z.number().optional(), utc_offset: z.string(), latitude: z.number(), longitude: z.number(), ayanamsa: z.string().optional(), house_system: z.string().optional() }, async (a) => jsonContent(await callRemote("get_vimshottari_dasha", a)));
117
- server.tool("get_planetary_aspects", "Get all planetary aspects.", { year: z.number(), month: z.number(), day: z.number(), hour: z.number(), minute: z.number(), second: z.number().optional(), utc_offset: z.string(), latitude: z.number(), longitude: z.number(), ayanamsa: z.string().optional(), house_system: z.string().optional() }, async (a) => jsonContent(await callRemote("get_planetary_aspects", a)));
118
- server.tool("get_significators", "Get planet-wise and house-wise significators (KP system).", { year: z.number(), month: z.number(), day: z.number(), hour: z.number(), minute: z.number(), second: z.number().optional(), utc_offset: z.string(), latitude: z.number(), longitude: z.number(), ayanamsa: z.string().optional(), house_system: z.string().optional() }, async (a) => jsonContent(await callRemote("get_significators", a)));
119
- server.tool("list_extended_options", "List supported ayanamsas and house systems for extended tools.", {}, async (a) => jsonContent(await callRemote("list_extended_options", a)));
120
- server.tool("get_panchanga", "Get Panchanga (5 Vedic time limbs) for any datetime and location.", { datetime: z.string().optional(), timezone: z.string().optional(), ayanamsa_mode: z.string().optional() }, async (a) => jsonContent(await callRemote("get_panchanga", a)));
121
- server.tool("get_doshas", "Check all major doshas: Mangal Dosha, Kaal Sarp Dosha, Sade Sati, Graha Yuddha, Combustion.", { ...standardBirthInput, current_saturn_rashi: z.string().optional() }, async (a) => jsonContent(await callRemote("get_doshas", a)));
122
- server.tool("get_yogas", "Identify all major Vedic Yogas.", standardBirthInput, async (a) => jsonContent(await callRemote("get_yogas", a)));
123
- server.tool("get_compatibility", "Ashtakoot Milan: 36-point Vedic marriage compatibility scoring.", { chart1: z.object(standardBirthInput), chart2: z.object(standardBirthInput) }, async (a) => jsonContent(await callRemote("get_compatibility", a)));
124
- server.tool("get_special_conditions", "Check Vargottama, Pushkara Navamsha, Dig Bala, Jaimini Karakas.", standardBirthInput, async (a) => jsonContent(await callRemote("get_special_conditions", a)));
125
- server.tool("get_pratyantar_dasha", "Get 3-level Vimshottari Dasha: MD AD PD.", standardBirthInput, async (a) => jsonContent(await callRemote("get_pratyantar_dasha", a)));
126
- server.tool("get_yogini_dasha", "Get Yogini Dasha (8-yogini, 36-year cycle).", standardBirthInput, async (a) => jsonContent(await callRemote("get_yogini_dasha", a)));
127
- server.tool("get_varshaphal", "Get Varshaphal (Solar Return chart).", { ...standardBirthInput, year_of_life: z.number(), query_latitude: z.number().optional(), query_longitude: z.number().optional(), query_timezone: z.string().optional() }, async (a) => jsonContent(await callRemote("get_varshaphal", a)));
128
- server.tool("get_ashtakavarga", "Get Ashtakavarga benefic point scores.", standardBirthInput, async (a) => jsonContent(await callRemote("get_ashtakavarga", a)));
129
- server.tool("get_shadbala", "Get Shadbala — six-fold planetary strength.", standardBirthInput, async (a) => jsonContent(await callRemote("get_shadbala", a)));
130
- server.tool("get_jaimini", "Get full Jaimini astrology: Chara Karakas, aspects, Karakamsha.", standardBirthInput, async (a) => jsonContent(await callRemote("get_jaimini", a)));
131
- server.tool("get_muhurta", "Score a datetime for Muhurta (auspicious timing).", { datetime: z.string().optional(), timezone: z.string().optional(), event_type: z.string().optional() }, async (a) => jsonContent(await callRemote("get_muhurta", a)));
132
- server.tool("get_best_muhurta", "Find top 5 auspicious Muhurta windows in a date range.", { start_datetime: z.string(), end_datetime: z.string(), timezone: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), event_type: z.string().optional() }, async (a) => jsonContent(await callRemote("get_best_muhurta", a)));
133
- server.tool("get_avasthas", "Get planetary Avasthas (9 states + Baladi Avasthas).", standardBirthInput, async (a) => jsonContent(await callRemote("get_avasthas", a)));
134
- server.tool("get_upagrahas", "Get Upagrahas (shadow sub-planets): Gulika, Mandi, Dhuma, etc.", standardBirthInput, async (a) => jsonContent(await callRemote("get_upagrahas", a)));
135
- server.tool("get_gandanta", "Check Gandanta zones (water-fire junctions).", standardBirthInput, async (a) => jsonContent(await callRemote("get_gandanta", a)));
136
- server.tool("get_kartari", "Check Kartari Yoga (hemmed between benefics/malefics).", standardBirthInput, async (a) => jsonContent(await callRemote("get_kartari", a)));
137
- server.tool("get_nakshatra_analysis", "Get deep Nakshatra information for each planet.", { ...standardBirthInput, nakshatra_name: z.string().optional() }, async (a) => jsonContent(await callRemote("get_nakshatra_analysis", a)));
138
- server.tool("get_gochara", "Get Gochara (Vedic transit analysis).", { ...standardBirthInput, transit_datetime: z.string().optional() }, async (a) => jsonContent(await callRemote("get_gochara", a)));
139
- server.tool("get_bhava_chalit", "Get Bhava Chalit chart (actual house positions).", standardBirthInput, async (a) => jsonContent(await callRemote("get_bhava_chalit", a)));
140
- server.tool("get_hora", "Get Planetary Hour (Hora) for datetime and location.", { datetime: z.string().optional(), timezone: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional() }, async (a) => jsonContent(await callRemote("get_hora", a)));
141
- server.tool("get_sudarshana_chakra", "Get Sudarshana Chakra triple-layer chart analysis.", standardBirthInput, async (a) => jsonContent(await callRemote("get_sudarshana_chakra", a)));
142
- server.tool("get_ashtottari_dasha", "Get Ashtottari Dasha (108-year, 8-planet cycle).", standardBirthInput, async (a) => jsonContent(await callRemote("get_ashtottari_dasha", a)));
143
- server.tool("get_sookshma_dasha", "Get Sookshma Dasha (4th level of Vimshottari).", standardBirthInput, async (a) => jsonContent(await callRemote("get_sookshma_dasha", a)));
144
- server.tool("get_prana_dasha", "Get Prana Dasha (5th level of Vimshottari).", standardBirthInput, async (a) => jsonContent(await callRemote("get_prana_dasha", a)));
145
- server.tool("get_char_dasha", "Get Char Dasha (Jaimini).", standardBirthInput, async (a) => jsonContent(await callRemote("get_char_dasha", a)));
146
- server.tool("get_narayana_dasha", "Get Narayana Dasha (Jaimini).", standardBirthInput, async (a) => jsonContent(await callRemote("get_narayana_dasha", a)));
147
- server.tool("get_tajaka", "Get Tajaka analysis for Varshaphal.", { ...standardBirthInput, year_of_life: z.number(), query_latitude: z.number().optional(), query_longitude: z.number().optional(), query_timezone: z.string().optional() }, async (a) => jsonContent(await callRemote("get_tajaka", a)));
148
- server.tool("get_nabhasha_yogas", "Get Nabhasha Yogas (Ashrayas, Dala, Akriti).", standardBirthInput, async (a) => jsonContent(await callRemote("get_nabhasha_yogas", a)));
149
- server.tool("get_arishta", "Get Arishta Yogas (longevity assessment).", standardBirthInput, async (a) => jsonContent(await callRemote("get_arishta", a)));
150
- server.tool("get_lunar_return", "Get Lunar Return (Chandraphal).", { ...standardBirthInput, target_year: z.number(), target_month: z.number(), query_latitude: z.number().optional(), query_longitude: z.number().optional(), query_timezone: z.string().optional() }, async (a) => jsonContent(await callRemote("get_lunar_return", a)));
151
- server.tool("get_prasna", "Get Prasna (Horary/Question) chart.", { datetime: z.string().optional(), timezone: z.string().optional(), latitude: z.number().optional(), longitude: z.number().optional(), question: z.string().optional() }, async (a) => jsonContent(await callRemote("get_prasna", a)));
152
- server.tool("get_kalachakra_dasha", "Get Kalachakra Dasha (9-group, 112-year sign-based dasha).", standardBirthInput, async (a) => jsonContent(await callRemote("get_kalachakra_dasha", a)));
153
- server.tool("get_kurmachakra", "Get Kurmachakra directional analysis.", { ...standardBirthInput, current_moon_nakshatra: z.string().optional(), event_type: z.enum(["travel", "construction", "marriage", "general"]).optional() }, async (a) => jsonContent(await callRemote("get_kurmachakra", a)));
154
- server.tool("get_travel_direction_score", "Score a specific travel direction for auspiciousness.", { ...standardBirthInput, intended_direction: z.string(), current_moon_nakshatra: z.string().optional(), weekday: z.enum(["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]).optional() }, async (a) => jsonContent(await callRemote("get_travel_direction_score", a)));
155
- server.tool("get_full_kurmachakra_chart", "Return the full Kurmachakra reference chart (all 9 directions).", {}, async (a) => jsonContent(await callRemote("get_full_kurmachakra_chart", a)));
115
+ // ─── Tool Definitions ──────────────────────────────────────────────────────
116
+ // Each description is written in plain language so AI models can explain
117
+ // what each tool does to users who may not know Vedic astrology terms.
118
+
119
+ server.tool(
120
+ "generate_kundali",
121
+ "Create a complete Vedic birth chart (Kundali) showing where all 9 planets were positioned at the exact moment of birth. This is the foundation of Vedic astrology — it shows planetary positions in 12 houses and 12 zodiac signs, including nakshatras (lunar mansions). Input: person's name, birth date, birth time, and birth location (city or coordinates + timezone).",
122
+ {
123
+ name: z.string().describe("Person's name."),
124
+ city: z.string().describe("Birth city/place."),
125
+ date_of_birth: z.string().describe("Birth date in YYYY-MM-DD format."),
126
+ time_of_birth: z
127
+ .string()
128
+ .describe("Birth time in HH:MM or HH:MM:SS format."),
129
+ latitude: z.number().optional(),
130
+ longitude: z.number().optional(),
131
+ timezone: z.string().optional(),
132
+ chart_type: z.string().optional().describe("Chart type. Default: lagna."),
133
+ ayanamsa_mode: z
134
+ .string()
135
+ .optional()
136
+ .describe("Sidereal mode. Default: lahiri."),
137
+ house_system: z.string().optional().describe("House system. Default: P."),
138
+ },
139
+ async (args) => jsonContent(await callRemote("generate_kundali", args)),
140
+ );
141
+
142
+ server.tool(
143
+ "list_available_chart_types",
144
+ "List all supported chart types (vargas) like D1 (main birth chart), D9 (Navamsha — marriage and relationships), D10 (Dashamsha — career), D60 (Shastiamsha — past life). Each chart type zooms into a different life area.",
145
+ {},
146
+ async (a) => jsonContent(await callRemote("list_available_chart_types", a)),
147
+ );
148
+
149
+ server.tool(
150
+ "list_ayanamsa_modes",
151
+ "List all sidereal calculation modes (ayanamsas). Ayanamsa is the correction used to convert tropical (Western) positions to sidereal (Vedic) positions. The most common is Lahiri. Different modes give slightly different planet positions.",
152
+ {},
153
+ async (a) => jsonContent(await callRemote("list_ayanamsa_modes", a)),
154
+ );
155
+
156
+ server.tool(
157
+ "list_house_systems",
158
+ "List all house systems (Placidus, Koch, Equal, Whole Sign, etc.). House systems determine how the 12 houses of the chart are calculated from the birth location and time.",
159
+ {},
160
+ async (a) => jsonContent(await callRemote("list_house_systems", a)),
161
+ );
162
+
163
+ server.tool(
164
+ "search_birth_places",
165
+ "Search for a city or place name to get its coordinates and timezone. Use this when you have a city name but not the exact latitude/longitude.",
166
+ { query: z.string(), limit: z.number().int().min(1).max(10).optional() },
167
+ async (a) => jsonContent(await callRemote("search_birth_places", a)),
168
+ );
169
+
170
+ server.tool(
171
+ "get_timezone_for_coordinates",
172
+ "Get the IANA timezone name (like Asia/Kolkata) for a given latitude and longitude. Useful when you have coordinates but need the timezone for chart calculation.",
173
+ { latitude: z.number(), longitude: z.number() },
174
+ async (a) => jsonContent(await callRemote("get_timezone_for_coordinates", a)),
175
+ );
176
+
177
+ server.tool(
178
+ "get_transit_positions",
179
+ "Get the current positions of all planets in the sky right now (or at a specific date/time). Transits show where planets are today and how they affect the birth chart.",
180
+ { datetime_utc: z.string().optional() },
181
+ async (a) => jsonContent(await callRemote("get_transit_positions", a)),
182
+ );
183
+
184
+ server.tool(
185
+ "get_extended_chart",
186
+ "Get an enhanced birth chart with SubLord and KP (Krishnamurti Paddhati) data. This includes precise nakshatra subdivision information used for timing events. Input: year, month, day, hour, minute, utc_offset, latitude, longitude.",
187
+ {
188
+ year: z.number(),
189
+ month: z.number(),
190
+ day: z.number(),
191
+ hour: z.number(),
192
+ minute: z.number(),
193
+ second: z.number().optional(),
194
+ utc_offset: z.string(),
195
+ latitude: z.number(),
196
+ longitude: z.number(),
197
+ ayanamsa: z.string().optional(),
198
+ house_system: z.string().optional(),
199
+ },
200
+ async (a) => jsonContent(await callRemote("get_extended_chart", a)),
201
+ );
202
+
203
+ server.tool(
204
+ "get_vimshottari_dasha",
205
+ "Calculate Vimshottari Dasha — the main planetary period system in Vedic astrology. Shows which planet's period is currently active and when it started/ends, plus sub-periods (bhuktis). Each planet rules a fixed number of years (Sun=6, Moon=10, Mars=7, Rahu=18, Jupiter=16, Saturn=19, Mercury=17, Ketu=7, Venus=20). Input: year, month, day, hour, minute, utc_offset, latitude, longitude.",
206
+ {
207
+ year: z.number(),
208
+ month: z.number(),
209
+ day: z.number(),
210
+ hour: z.number(),
211
+ minute: z.number(),
212
+ second: z.number().optional(),
213
+ utc_offset: z.string(),
214
+ latitude: z.number(),
215
+ longitude: z.number(),
216
+ ayanamsa: z.string().optional(),
217
+ house_system: z.string().optional(),
218
+ },
219
+ async (a) => jsonContent(await callRemote("get_vimshottari_dasha", a)),
220
+ );
221
+
222
+ server.tool(
223
+ "get_planetary_aspects",
224
+ "Get all planetary aspects — which planets are influencing each other from their positions. In Vedic astrology, Jupiter, Mars, and Saturn have special aspects beyond the standard 7th house aspect.",
225
+ {
226
+ year: z.number(),
227
+ month: z.number(),
228
+ day: z.number(),
229
+ hour: z.number(),
230
+ minute: z.number(),
231
+ second: z.number().optional(),
232
+ utc_offset: z.string(),
233
+ latitude: z.number(),
234
+ longitude: z.number(),
235
+ ayanamsa: z.string().optional(),
236
+ house_system: z.string().optional(),
237
+ },
238
+ async (a) => jsonContent(await callRemote("get_planetary_aspects", a)),
239
+ );
240
+
241
+ server.tool(
242
+ "get_significators",
243
+ "Get significators — which planets signify (rule/own) which houses, and which houses each planet signifies. Used in KP astrology for precise event prediction.",
244
+ {
245
+ year: z.number(),
246
+ month: z.number(),
247
+ day: z.number(),
248
+ hour: z.number(),
249
+ minute: z.number(),
250
+ second: z.number().optional(),
251
+ utc_offset: z.string(),
252
+ latitude: z.number(),
253
+ longitude: z.number(),
254
+ ayanamsa: z.string().optional(),
255
+ house_system: z.string().optional(),
256
+ },
257
+ async (a) => jsonContent(await callRemote("get_significators", a)),
258
+ );
259
+
260
+ server.tool(
261
+ "list_extended_options",
262
+ "List all supported ayanamsa modes and house systems for the extended chart tools (get_extended_chart, get_vimshottari_dasha, etc.).",
263
+ {},
264
+ async (a) => jsonContent(await callRemote("list_extended_options", a)),
265
+ );
266
+
267
+ server.tool(
268
+ "get_panchanga",
269
+ "Get the Panchanga — the 5 Vedic time limbs for any date and location: Tithi (lunar day), Vara (weekday), Nakshatra (lunar mansion), Yoga, and Karana. Used for muhurta (auspicious timing).",
270
+ {
271
+ datetime: z.string().optional(),
272
+ timezone: z.string().optional(),
273
+ ayanamsa_mode: z.string().optional(),
274
+ },
275
+ async (a) => jsonContent(await callRemote("get_panchanga", a)),
276
+ );
277
+
278
+ server.tool(
279
+ "get_doshas",
280
+ "Check all major doshas (afflictions) in the birth chart: Mangal Dosha (Mars affliction affecting marriage), Kaal Sarp Dosha (all planets between Rahu-Ketu), Sade Sati (Saturn's 7.5-year transit over Moon), Graha Yuddha (planetary war), and Combustion (planet too close to Sun).",
281
+ { ...standardBirthInput, current_saturn_rashi: z.string().optional() },
282
+ async (a) => jsonContent(await callRemote("get_doshas", a)),
283
+ );
284
+
285
+ server.tool(
286
+ "get_yogas",
287
+ "Identify all major Vedic Yogas (planetary combinations) in the birth chart. Yogas show special results: Raj Yoga (power/wealth), Gaja Kesari Yoga (wisdom/success), Dhana Yoga (financial prosperity), Viparita Raja Yoga (turning challenges into success), and 50+ more.",
288
+ standardBirthInput,
289
+ async (a) => jsonContent(await callRemote("get_yogas", a)),
290
+ );
291
+
292
+ server.tool(
293
+ "get_compatibility",
294
+ "Ashtakoot Milan — the 36-point Vedic marriage compatibility scoring system between two people. Checks 8 factors: Varna (temperament), Vashya (attraction), Tara (nakshatra compatibility), Yoni (physical compatibility), Graha Maitri (mental compatibility), Gana (temperament type), Bhakoot (love/relationship), Nadi (health/children). Score above 18 is considered compatible.",
295
+ {
296
+ chart1: z.object(standardBirthInput),
297
+ chart2: z.object(standardBirthInput),
298
+ },
299
+ async (a) => jsonContent(await callRemote("get_compatibility", a)),
300
+ );
301
+
302
+ server.tool(
303
+ "get_special_conditions",
304
+ "Check special planetary conditions: Vargottama (planet in same sign in D1 and D9 — very strong), Pushkara Navamsha (auspicious D9 position), Dig Bala (directional strength — planets strong in certain directions), and Jaimini Karakas (Jaimini system significators).",
305
+ standardBirthInput,
306
+ async (a) => jsonContent(await callRemote("get_special_conditions", a)),
307
+ );
308
+
309
+ server.tool(
310
+ "get_pratyantar_dasha",
311
+ "Get 3-level Vimshottari Dasha breakdown: Mahadasha (main period) → Antardasha (sub-period) → Pratyantar Dasha (sub-sub-period). This gives the most precise timing of events.",
312
+ standardBirthInput,
313
+ async (a) => jsonContent(await callRemote("get_pratyantar_dasha", a)),
314
+ );
315
+
316
+ server.tool(
317
+ "get_yogini_dasha",
318
+ "Get Yogini Dasha — an alternative dasha system based on 8 yoginis (female deities) with a 36-year cycle. Each nakshatra maps to one of 8 yoginis. Used for timing events alongside Vimshottari.",
319
+ standardBirthInput,
320
+ async (a) => jsonContent(await callRemote("get_yogini_dasha", a)),
321
+ );
322
+
323
+ server.tool(
324
+ "get_varshaphal",
325
+ "Get Varshaphal (Solar Return chart) — the chart cast for the exact moment the Sun returns to its natal position each birthday. Used to predict the entire year ahead from birthday to birthday.",
326
+ {
327
+ ...standardBirthInput,
328
+ year_of_life: z.number(),
329
+ query_latitude: z.number().optional(),
330
+ query_longitude: z.number().optional(),
331
+ query_timezone: z.string().optional(),
332
+ },
333
+ async (a) => jsonContent(await callRemote("get_varshaphal", a)),
334
+ );
335
+
336
+ server.tool(
337
+ "get_ashtakavarga",
338
+ "Get Ashtakavarga — a point-based system that scores each house from each planet's perspective (benefic points 0-8). Shows which houses are strongest in the chart overall. Used to judge house strength and transit results.",
339
+ standardBirthInput,
340
+ async (a) => jsonContent(await callRemote("get_ashtakavarga", a)),
341
+ );
342
+
343
+ server.tool(
344
+ "get_shadbala",
345
+ "Get Shadbala — the six-fold planetary strength calculation. Measures how strong each planet is based on: Sthana Bala (positional), Dig Bala (directional), Kala Bala (temporal), Cheshta Bala (motional), Naisargika Bala (natural), and Drik Bala (aspectual) strength.",
346
+ standardBirthInput,
347
+ async (a) => jsonContent(await callRemote("get_shadbala", a)),
348
+ );
349
+
350
+ server.tool(
351
+ "get_jaimini",
352
+ "Get full Jaimini astrology analysis — an alternative Vedic system using Chara Karakas (temporary significators based on planet degrees), Jaimini aspects (different from Parasari aspects), and Karakamsha (soul's desire sign in D9).",
353
+ standardBirthInput,
354
+ async (a) => jsonContent(await callRemote("get_jaimini", a)),
355
+ );
356
+
357
+ server.tool(
358
+ "get_muhurta",
359
+ "Score a specific date and time for auspiciousness (Muhurta). Rates how good a moment is for starting something new — marriage, business, travel, etc. Based on Panchanga quality, planetary positions, and weekday.",
360
+ {
361
+ datetime: z.string().optional(),
362
+ timezone: z.string().optional(),
363
+ event_type: z.string().optional(),
364
+ },
365
+ async (a) => jsonContent(await callRemote("get_muhurta", a)),
366
+ );
367
+
368
+ server.tool(
369
+ "get_best_muhurta",
370
+ "Find the top 5 most auspicious time windows within a date range. Use this to pick the best date and time for an event like a wedding, housewarming, or business launch.",
371
+ {
372
+ start_datetime: z.string(),
373
+ end_datetime: z.string(),
374
+ timezone: z.string().optional(),
375
+ latitude: z.number().optional(),
376
+ longitude: z.number().optional(),
377
+ event_type: z.string().optional(),
378
+ },
379
+ async (a) => jsonContent(await callRemote("get_best_muhurta", a)),
380
+ );
381
+
382
+ server.tool(
383
+ "get_avasthas",
384
+ "Get planetary Avasthas — the 9 states of each planet (like a planet's 'mood'): Baladi Avastha (child/youth/adult/old), Jagratadi Avastha (awake/dreaming/sleeping), and more. Shows how effectively a planet can deliver its results.",
385
+ standardBirthInput,
386
+ async (a) => jsonContent(await callRemote("get_avasthas", a)),
387
+ );
388
+
389
+ server.tool(
390
+ "get_upagrahas",
391
+ "Get Upagrahas — shadow sub-planets (invisible mathematical points): Gulika, Mandi, Dhuma, Vyatipata, Parivesha, Indrachapa, Upaketu. These affect health, obstacles, and hidden influences.",
392
+ standardBirthInput,
393
+ async (a) => jsonContent(await callRemote("get_upagrahas", a)),
394
+ );
395
+
396
+ server.tool(
397
+ "get_gandanta",
398
+ "Check Gandanta zones — sensitive points where the Moon transitions between water and fire signs (last degree of Pisces/Leo/Scorpio, first degree of Aries/Cancer/Sagittarius). Gandanta indicates karmic knots, emotional challenges, and spiritual growth areas.",
399
+ standardBirthInput,
400
+ async (a) => jsonContent(await callRemote("get_gandanta", a)),
401
+ );
402
+
403
+ server.tool(
404
+ "get_kartari",
405
+ "Check Kartari Yoga — whether a planet is hemmed between benefics (good results) or malefics (challenges). A planet surrounded by Jupiter and Venus gives protection; surrounded by Saturn and Mars creates obstacles.",
406
+ standardBirthInput,
407
+ async (a) => jsonContent(await callRemote("get_kartari", a)),
408
+ );
409
+
410
+ server.tool(
411
+ "get_nakshatra_analysis",
412
+ "Get deep Nakshatra (lunar mansion) information for each planet. There are 27 nakshatras, each with its own deity, symbol, and qualities. Shows how each planet's nakshatra modifies its results.",
413
+ { ...standardBirthInput, nakshatra_name: z.string().optional() },
414
+ async (a) => jsonContent(await callRemote("get_nakshatra_analysis", a)),
415
+ );
416
+
417
+ server.tool(
418
+ "get_gochara",
419
+ "Get Gochara (transit analysis) — how the current positions of planets affect the natal Moon and other natal planets. Shows which transits are favorable or challenging right now, and when they started/will end.",
420
+ { ...standardBirthInput, transit_datetime: z.string().optional() },
421
+ async (a) => jsonContent(await callRemote("get_gochara", a)),
422
+ );
423
+
424
+ server.tool(
425
+ "get_bhava_chalit",
426
+ "Get Bhava Chalit chart — the actual house positions of planets (different from the equal 30-degree Rasi chart). Shows which house each planet truly occupies, which changes some planet-house assignments.",
427
+ standardBirthInput,
428
+ async (a) => jsonContent(await callRemote("get_bhava_chalit", a)),
429
+ );
430
+
431
+ server.tool(
432
+ "get_hora",
433
+ "Get the Planetary Hour (Hora) — which planet rules the current hour based on Vedic timekeeping. Each day is ruled by a planet (Sunday=Sun, Monday=Moon, etc.), and each hour within the day cycles through planets. Used for timing activities.",
434
+ {
435
+ datetime: z.string().optional(),
436
+ timezone: z.string().optional(),
437
+ latitude: z.number().optional(),
438
+ longitude: z.number().optional(),
439
+ },
440
+ async (a) => jsonContent(await callRemote("get_hora", a)),
441
+ );
442
+
443
+ server.tool(
444
+ "get_sudarshana_chakra",
445
+ "Get Sudarshana Chakra — a triple-layer chart analysis combining the Sun chart (soul/purpose), Moon chart (mind/emotions), and Lagna chart (body/life). Shows the three dimensions of a person's existence.",
446
+ standardBirthInput,
447
+ async (a) => jsonContent(await callRemote("get_sudarshana_chakra", a)),
448
+ );
449
+
450
+ server.tool(
451
+ "get_ashtottari_dasha",
452
+ "Get Ashtottari Dasha — a 108-year dasha system based on 8 planets. Used when certain chart conditions are met (specifically for those born in specific nakshatra-day combinations). Alternative to Vimshottari.",
453
+ standardBirthInput,
454
+ async (a) => jsonContent(await callRemote("get_ashtottari_dasha", a)),
455
+ );
456
+
457
+ server.tool(
458
+ "get_sookshma_dasha",
459
+ "Get Sookshma Dasha — the 4th level of Vimshottari (Mahadasha → Antardasha → Pratyantar → Sookshma). Provides very fine-grained timing for specific events within a sub-sub-period.",
460
+ standardBirthInput,
461
+ async (a) => jsonContent(await callRemote("get_sookshma_dasha", a)),
462
+ );
463
+
464
+ server.tool(
465
+ "get_prana_dasha",
466
+ "Get Prana Dasha — the 5th and deepest level of Vimshottari (Mahadasha → Antardasha → Pratyantar → Sookshma → Prana). Used for the most precise event timing by advanced practitioners.",
467
+ standardBirthInput,
468
+ async (a) => jsonContent(await callRemote("get_prana_dasha", a)),
469
+ );
470
+
471
+ server.tool(
472
+ "get_char_dasha",
473
+ "Get Char Dasha — the Jaimini dasha system based on movable (Char), fixed (Sthir), and dual (Dvishbhava) signs. Different from Vimshottari, it uses sign-based periods rather than nakshatra-based periods.",
474
+ standardBirthInput,
475
+ async (a) => jsonContent(await callRemote("get_char_dasha", a)),
476
+ );
477
+
478
+ server.tool(
479
+ "get_narayana_dasha",
480
+ "Get Narayana Dasha — another Jaimini dasha system based on the direction of counting from the birth sign (forward or backward) depending on whether it's odd or even. Used for timing life events.",
481
+ standardBirthInput,
482
+ async (a) => jsonContent(await callRemote("get_narayana_dasha", a)),
483
+ );
484
+
485
+ server.tool(
486
+ "get_tajaka",
487
+ "Get Tajaka analysis — the annual chart analysis system (also called Varshaphal or Solar Return). Shows the major themes, challenges, and opportunities for a specific year of life based on the solar return chart.",
488
+ {
489
+ ...standardBirthInput,
490
+ year_of_life: z.number(),
491
+ query_latitude: z.number().optional(),
492
+ query_longitude: z.number().optional(),
493
+ query_timezone: z.string().optional(),
494
+ },
495
+ async (a) => jsonContent(await callRemote("get_tajaka", a)),
496
+ );
497
+
498
+ server.tool(
499
+ "get_nabhasha_yogas",
500
+ "Get Nabhasha Yogas — pattern-based yogas: Ashraya (grouping by sign quality), Dala (hemispheric balance), and Akriti (geometric patterns like bow, lotus, bird). These show overall life patterns.",
501
+ standardBirthInput,
502
+ async (a) => jsonContent(await callRemote("get_nabhasha_yogas", a)),
503
+ );
504
+
505
+ server.tool(
506
+ "get_arishta",
507
+ "Get Arishta Yogas — longevity assessment combinations. Checks for Balarishta (childhood challenges), Madhyarishta (mid-life), and Yogarishta (obstacles). Also identifies yogas that cancel arishta (Arishta Bhanga).",
508
+ standardBirthInput,
509
+ async (a) => jsonContent(await callRemote("get_arishta", a)),
510
+ );
511
+
512
+ server.tool(
513
+ "get_lunar_return",
514
+ "Get Lunar Return (Chandraphal) — the chart cast for the exact moment the Moon returns to its natal position each month. Used to predict the month ahead, similar to how Varshaphal predicts the year.",
515
+ {
516
+ ...standardBirthInput,
517
+ target_year: z.number(),
518
+ target_month: z.number(),
519
+ query_latitude: z.number().optional(),
520
+ query_longitude: z.number().optional(),
521
+ query_timezone: z.string().optional(),
522
+ },
523
+ async (a) => jsonContent(await callRemote("get_lunar_return", a)),
524
+ );
525
+
526
+ server.tool(
527
+ "get_prasna",
528
+ "Get Prasna (Horary) chart — cast for the exact moment a question is asked. Used when birth details are unknown. The chart at the time of asking reveals the answer to the question.",
529
+ {
530
+ datetime: z.string().optional(),
531
+ timezone: z.string().optional(),
532
+ latitude: z.number().optional(),
533
+ longitude: z.number().optional(),
534
+ question: z.string().optional(),
535
+ },
536
+ async (a) => jsonContent(await callRemote("get_prasna", a)),
537
+ );
538
+
539
+ server.tool(
540
+ "get_kalachakra_dasha",
541
+ "Get Kalachakra Dasha — a 112-year sign-based dasha system grouping the 12 signs into 9 groups. Used in Jaimini astrology for long-term life timing.",
542
+ standardBirthInput,
543
+ async (a) => jsonContent(await callRemote("get_kalachakra_dasha", a)),
544
+ );
545
+
546
+ server.tool(
547
+ "get_kurmachakra",
548
+ "Get Kurmachakra — a directional analysis system based on the current Moon nakshatra. Shows which directions are auspicious or inauspicious for travel, construction, or other activities right now.",
549
+ {
550
+ ...standardBirthInput,
551
+ current_moon_nakshatra: z.string().optional(),
552
+ event_type: z
553
+ .enum(["travel", "construction", "marriage", "general"])
554
+ .optional(),
555
+ },
556
+ async (a) => jsonContent(await callRemote("get_kurmachakra", a)),
557
+ );
558
+
559
+ server.tool(
560
+ "get_travel_direction_score",
561
+ "Score a specific travel direction (North, South, East, West, NE, NW, SE, SW) for auspiciousness based on the Kurmachakra system. Returns a 0-100 score indicating how favorable that direction is for travel right now.",
562
+ {
563
+ ...standardBirthInput,
564
+ intended_direction: z.string(),
565
+ current_moon_nakshatra: z.string().optional(),
566
+ weekday: z
567
+ .enum([
568
+ "Sunday",
569
+ "Monday",
570
+ "Tuesday",
571
+ "Wednesday",
572
+ "Thursday",
573
+ "Friday",
574
+ "Saturday",
575
+ ])
576
+ .optional(),
577
+ },
578
+ async (a) => jsonContent(await callRemote("get_travel_direction_score", a)),
579
+ );
580
+
581
+ server.tool(
582
+ "get_full_kurmachakra_chart",
583
+ "Return the full Kurmachakra reference chart showing all 9 directions and their current auspiciousness status. Useful for seeing the complete directional picture at a glance.",
584
+ {},
585
+ async (a) => jsonContent(await callRemote("get_full_kurmachakra_chart", a)),
586
+ );
156
587
 
157
588
  // ─── Start ─────────────────────────────────────────────────────────────────
158
589
  const transport = new StdioServerTransport();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kundali-chart-mcp",
3
- "version": "0.2.6",
4
- "description": "The most comprehensive Vedic Astrology MCP server — 48 tools, zero setup. Works with Claude, Cursor, VS Code, Windsurf, Zed, and any MCP client.",
3
+ "version": "0.2.7",
4
+ "description": "The most comprehensive Vedic Astrology MCP server — 48 tools, zero setup. Works with Claude, Cursor, VS Code, Windsurf, Zed, and any MCP client.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "kundali-chart-mcp": "kundali-chart-mcp.js",