33 read-only Model Context Protocol tools over the Jagannatha Hora calculation engine. An AI agent can compute a birth chart, walk 55 dasha systems, pull any of 23 divisional charts, screen yogas and doshas, read transits, rank muhurta dates and score a marriage match — without you writing an integration for any of it.
What MCP is, in one paragraph
The Model Context Protocol is an open standard for letting a language model call external tools. Instead of pasting astrological data into a prompt, you point the model's client at a server; the client asks the server what tools it has, the server answers with names, descriptions and JSON Schemas, and from then on the model can call any of them mid- conversation and reason over what comes back. This server publishes the Jagannatha Hora Vedic astrology engine that way. It is read-only — every tool computes and returns; none of them write, send, charge or change anything — so an agent can call them freely without a confirmation step in front of each one.
In a client that supports remote MCP servers, adding the endpoint URL is the entire setup. There is no package to install and no process to spawn — this is not a stdio server.
Which clients this works with
MCP clients that support remote HTTP servers
Work directly. Add the endpoint URL as a remote or custom MCP server. Because the server requires no authentication, leave any API-key or OAuth field empty — and note that a client which insists on OAuth for remote servers will not connect.
Clients that only speak stdio
Need a bridge. A stdio-to-HTTP proxy (the mcp-remote npm package is the common one) runs locally as the stdio server and forwards to this URL. Configure the proxy, not this endpoint, as the command.
Your own agent code
Nothing special required. It is HTTP and JSON — an MCP SDK's HTTP transport works, and so does a plain POST, as the examples below show.
Client support for remote MCP servers moves quickly and differs between products and versions, so the honest answer is the one above: this server is a standard HTTP JSON-RPC MCP endpoint with no authentication, and it works with any client that can talk to one. If yours only speaks stdio, put a stdio-to-HTTP bridge in front of it.
Same facts, in formats a program would rather have.
horoscopes.today/mcp-tools.json — The tool manifest: every tool name, title, description and input schema as JSON. Useful for planning a call before you connect.
Standard JSON-RPC 2.0. These are the methods the server implements; anything else returns a -32601.
initialize
Handshake. Returns protocolVersion, capabilities ({"tools": {"listChanged": false}}) and serverInfo. The server echoes back the protocolVersion the client sent, or 2024-11-05 when the client sends none.
tools/list
Every tool with its title, description, JSON Schema and annotations. Call it when you connect and use the schemas it returns.
tools/call
Runs one tool. Takes name and arguments. The result carries the output twice: as content, a single text part whose text is the JSON-encoded result, and as structuredContent, the same result as a JSON object.
ping
Returns an empty result. Use it to check the server is up.
notifications/*
Accepted, with no response body, per JSON-RPC notification semantics.
Transport detail
The transport is JSON-RPC 2.0 over HTTP. POST each request to the endpoint and the JSON-RPC response comes straight back in the body — no session, no handshake beyond initialize.
It is not a stdio server: there is no command to spawn and no package to install.
Errors
-32700
Parse error. The request body was not valid JSON.
-32601
Method not found. A method outside the list above.
-32602
Invalid params. tools/call with no name or an unknown tool name; birth details that fail to parse (a missing required field names the fields it is missing); a birth place inside the polar circles (beyond about 66.5° north or south); or a date on which the Sun does not rise or set at the place. get_marriage_match is the exception: its input problems come back as a normal result with an error field.
-32603
Internal error. The calculation failed. The message carries the reason.
The shared inputs
Most tools identify a chart the same way, with the same 7 fields. They are listed once here; the tool tables below only name what each tool adds on top.
The birth-details block every chart tool advertises
Parameter
Type
Required
Default
Notes
date
string
Yes
—
Birth date in YYYY-MM-DD format, e.g. 1985-06-15
time
string
Yes
—
Birth time in 24h HH:MM:SS format, e.g. 10:30:00. HH:MM is accepted too.
latitude
number
Yes
—
Birth-place latitude in decimal degrees, e.g. 13.0827. Birth places beyond about 66.5° north or south are not supported.
longitude
number
Yes
—
Birth-place longitude in decimal degrees, e.g. 80.2707
timezone
number
Yes
—
Timezone offset from UTC in hours, e.g. 5.5 for IST
place
string
No
""
Optional birth-place name, echoed only.
gender
string
No
null
"male" or "female". A few classical yogas depend on gender; when it is omitted they are left out rather than guessed.
Three tools take no birth details at all: list_divisional_charts takes no parameters whatsoever, get_planet_ingress works on planets and dates alone, and get_marriage_match takes two nested person objects instead.
Event location override
get_gochara, get_gochara_range and get_muhurta also accept an event location, for the common case where someone was born in one place and is asking about something happening in another. Every field is optional and falls back to the corresponding birth value.
Optional event-location fields
Parameter
Type
Required
Default
Notes
event_place
string
No
null
Event place name; defaults to the birth place.
event_latitude
number
No
null
Event latitude; defaults to the birth latitude.
event_longitude
number
No
null
Event longitude; defaults to the birth longitude.
event_timezone
number
No
null
Event timezone offset from UTC; defaults to the birth timezone.
event_elevation
number
No
null
Event elevation in metres; defaults to the birth elevation.
All 33 tools
Grouped by what they are for. Tools that take parameters beyond the birth block have those parameters tabulated in the next section.
Chart & positions
generate_horoscope
Birth Chart Summary — The entry point. Computes the chart, then returns a compact overview — the birth details it used, a summary with the ascendant, Moon and Sun nakshatras, padas and signs, the Rashi (D-1) chart with each body's sign, degree, house, nakshatra and pada, the birth panchanga, and the list of section names the other tools fetch. Start here; follow-up calls for the same birth details are fast.
get_arudha_padas
Arudha Padas — The arudha padas — the perceived, as-others-see-it houses — for a chosen divisional chart.
get_chandra_arudhas
Chandra Arudhas (from Moon) — The arudha signs of the twelve houses counted from the Moon.
get_chara_karakas
Chara Karakas (Jaimini) — The eight Jaimini chara (variable) karakas — Atma, Amatya, Bhratri and the rest — assigned by planetary degree.
get_graha_arudhas
Graha Arudhas — The arudha — the reflected sign — of each graha and of the lagna.
get_house_varnadas
House Varnadas — The varnada lagna for each of the twelve houses, V1 to V12.
get_nakshatra_pada
Nakshatra & Pada — Nakshatra, pada, nakshatra lord and degrees-into-nakshatra for every body in the chart.
get_planetary_states
Planetary States (retrograde, combust, dignity) — Dignity and condition flags for the planets — retrograde, combust, exalted, debilitated and the rest.
get_sahams
Sahams (Arabic Parts) — The 36 sahams — the Vedic Arabic parts — of the chart.
get_special_lagnas
Special Lagnas — The special and derived lagnas — Bhava, Hora, Ghati and the others.
get_sphutas
Sphuṭas (Sensitive Points) — The 14 sphutas — the sensitive computed points of the chart.
get_surya_arudhas
Surya Arudhas (from Sun) — The arudha signs of the twelve houses counted from the Sun.
get_surya_siddhanta_chart
Surya Siddhanta Chart (SSS) — The birth chart by the classical Surya Siddhanta method: the nine bodies with sign, degree, nakshatra, daily motion and retrograde flag, the Surya Siddhanta lagna and ayanamsa (with its difference from Lahiri), and its panchanga. Names are always in English. Every other tool uses modern (drik) positions.
get_upagrahas
Upagrahas (Sub-planets) — The upagrahas — the shadowy sub-planets such as Gulika and Mandi.
Timing & dashas
get_dasha
Daśā Periods — Any of 55 dasha systems as a nested tree, with the running period marked. Vimshottari by default; ask for a specific maha or antar to drill into one branch instead of the current one.
Divisional charts
get_amsa_rulers
Amsa Rulers — The Nadiamsa (D-150) ruler for every point in the chart — planets, upagrahas, lagnas, varnada and sphutas.
get_divisional_chart
Divisional Chart (Varga) — One varga chart by name, with every body's sign and longitude in that division.
list_divisional_charts
Divisional Charts — Catalog — The discovery tool: the menu of the 23 varga charts, each with the token to request it by, its name and what it is classically read for. Takes no parameters and no birth details.
Strength & ashtakavarga
get_ashtakavarga
Aṣṭakavarga — Ashtakavarga bindu scores with the rows labelled by planet instead of returned as bare arrays: binna (BAV), sodhita (SoAV, the reduced grid the pindas come from), samudhaya (SAV), and the rasi, graha and sodhya pindas. The prastara grid is left out to keep the result small.
get_bhava_bala
Bhāva Bala (House Strength) — Bhava Bala — house strength — for House 1 through House 12, each with total virupas, rupas and a strength ratio.
get_other_bala
Other Bala — The remaining strength measures for the seven planets — harsha, pancha and dwadhasa vargeeya bala, and ishta and kashta phala.
get_shad_bala
Ṣaḍbala (Planetary Strength) — Shadbala, the six-fold planetary strength, with each component labelled by planet: sthana, kala, dig, cheshta, naisargika and drik bala, plus total virupas, total rupas and the strength ratio.
get_vaiseshikamsa_bala
Vaiśeṣikāṃśa Bala — Vaiseshikamsa Bala — the count of good vargas each planet occupies.
get_vimsopaka_bala
Vimśopaka Bala — Vimsopaka Bala — divisional-chart dignity strength on a twenty-point scale.
Yogas, doshas & longevity
get_doshas
Doshas — The standard dosha checks for the chart — Manglik, Kala Sarpa and the rest of the set.
get_longevity
Longevity (Āyurdāya) reference — Classical Ayurdaya longevity reference computations — the band and the combinations that produced it.
get_yogas
Yogas — Every yoga detected in the chart, each with its classical definition and stated effects.
Transits & muhurta
get_gochara
Transit Snapshot (Gochara) — A transit snapshot for one target date read against the natal chart: panchanga, muhurta windows, all nine planets with their house from the natal Moon and Lagna, and the person-relative strengths (Tara Bala, Chandra Bala, Sade Sati).
get_gochara_range
Transit Range (Gochara) — The same natal transit detail for every day in a range, in one call — no scoring, no verdict, so the model reasons over the raw days itself.
get_muhurta
Muhūrta (Auspicious Timing) — Ranks the days in a window for a specific event, scoring the classical factors and the native's own strength on each day, and returning the score breakdown, the weights used, and the best and avoid clock windows. It ranks; it does not choose.
get_planet_ingress
Planet Ingress (Sign Changes) — Retrograde-aware sign-change timing across a date range. Takes no birth details at all — ingresses are the same for everyone.
get_saturn_transit
Saturn Transit (Sade Sati) — Saturn's Sade Sati windows and the related 4th and 8th house transits.
Compatibility
get_marriage_match
Marriage Compatibility (Guṇa Milan) — Compatibility for a couple under the North Indian Ashtakoota system, the South Indian ten-porutham system, or both. Returns a summary block with each side's score and rating, plus the full detail.
What a tool call returns
A tools/call result carries the output twice: as content, a single text part whose text is the JSON-encoded result, and as structuredContent, the same result as a JSON object. 32 of the 33 tools wrap their result in the same envelope — {"section": "...", "data": ...} — with some adding one field, such as the varga that was applied. generate_horoscope is the exception and returns its overview at the top level.
The 8 tools below take something beyond the shared birth block. Defaults are applied by the server at call time — no tool schema declares a JSON-Schema default, so a client reading the schema will not see them.
get_arudha_padas
The arudha padas — the perceived, as-others-see-it houses — for a chosen divisional chart.
Returns: section "arudha_padhas" (note the spelling, with an h), plus the varga that was applied
get_dasha
Any of 55 dasha systems as a nested tree, with the running period marked. Vimshottari by default; ask for a specific maha or antar to drill into one branch instead of the current one.
Takes the shared birth-details block, plus these:
Parameters for get_dasha
Parameter
Type
Required
Default
Notes
system
string
No
"vimsottari"
One of 55 values — 28 graha systems plus 27 rasi systems, both listed below.
as_of_date
string
No
today
YYYY-MM-DD. The tree is centred on the period running at this date. "YYYY-MM-DD HH:MM" and "YYYY-MM-DD HH:MM:SS" are also accepted.
depth
integer
No
3 for graha systems, 2 for rasi systems
1 to 4: 1 = maha, 2 = + antar, 3 = + pratyantar, 4 = + sookshma (graha systems only). Reduced to what the chosen system can produce.
maha
string
No
null
Ruler of a maha dasha to expand regardless of date, e.g. "Saturn" (a planet for graha systems, a sign for rasi systems). Returned under selected_maha.
antar
string
No
null
Ruler of an antar dasha to expand inside that maha (graha systems). Requires maha. Returned under selected_antar.
Returns: section "dasha". The data carries dasha_type, system, as_of, depth, levels_available and maha_timeline; current_maha, current_antar, current_pratyantar and current (the running path and when its deepest period ends) when they apply; and selection, selected_maha and selected_antar when you ask for maha or antar.
get_divisional_chart
One varga chart by name, with every body's sign and longitude in that division.
Takes the shared birth-details block, plus these:
Parameters for get_divisional_chart
Parameter
Type
Required
Default
Notes
varga
string
No
"D-1"
One of: D-1, D-2, D-3, D-4, D-5, D-6, D-7, D-8, D-9, D-10, D-11, D-12, D-16, D-20, D-24, D-27, D-30, D-40, D-45, D-60, D-81, D-108, D-144. "D9", "9" and "navamsa" are understood too. An unrecognised value returns an error object listing the valid charts rather than failing the call.
Returns: section "divisional_charts", plus the key of the chart returned (e.g. "D-9_navamsa")
get_gochara
A transit snapshot for one target date read against the natal chart: panchanga, muhurta windows, all nine planets with their house from the natal Moon and Lagna, and the person-relative strengths (Tara Bala, Chandra Bala, Sade Sati).
Enrichment sections. Omit for all three; pass [] for the lean snapshot.
node_type
string
No
"mean"
"mean" or "true".
event_place
string
No
null
Event place name; defaults to the birth place.
event_latitude
number
No
null
Event latitude; defaults to the birth latitude.
event_longitude
number
No
null
Event longitude; defaults to the birth longitude.
event_timezone
number
No
null
Event timezone offset from UTC; defaults to the birth timezone.
event_elevation
number
No
null
Event elevation in metres; defaults to the birth elevation.
Returns: section "gochara"
get_gochara_range
The same natal transit detail for every day in a range, in one call — no scoring, no verdict, so the model reasons over the raw days itself.
Takes the shared birth-details block, plus these:
Parameters for get_gochara_range
Parameter
Type
Required
Default
Notes
from_date
string
Yes
—
Range start, YYYY-MM-DD.
to_date
string
Yes
—
Range end, YYYY-MM-DD. At most 60 days counting both ends; a longer range is an error.
time_of_day
string
No
"12:00:00"
The time used for each day.
include
string[]
No
["ashtakavarga", "gochara_phala"]
Two sections here by default, not the three get_gochara defaults to. Pass [] for the lean snapshot.
event_place
string
No
null
Event place name; defaults to the birth place.
event_latitude
number
No
null
Event latitude; defaults to the birth latitude.
event_longitude
number
No
null
Event longitude; defaults to the birth longitude.
event_timezone
number
No
null
Event timezone offset from UTC; defaults to the birth timezone.
event_elevation
number
No
null
Event elevation in metres; defaults to the birth elevation.
Returns: section "gochara_range" — range, place, ayanamsa_mode, natal_ref, count and days
get_marriage_match
Compatibility for a couple under the North Indian Ashtakoota system, the South Indian ten-porutham system, or both. Returns a summary block with each side's score and rating, plus the full detail.
Takes no birth-details block. Its full parameter list is:
Parameters for get_marriage_match
Parameter
Type
Required
Default
Notes
boy
object
Yes
—
date, time, latitude, longitude, timezone (required) and place (optional).
girl
object
Yes
—
Same shape as boy.
system
string
No
"both"
"both", "north" or "south". Choosing one drops the other block from the result.
Returns: section "marriage_match". A problem with either person's details comes back inside it as {"error": "…"}, not as a JSON-RPC error.
get_muhurta
Ranks the days in a window for a specific event, scoring the classical factors and the native's own strength on each day, and returning the score breakdown, the weights used, and the best and avoid clock windows. It ranks; it does not choose.
Takes the shared birth-details block, plus these:
Parameters for get_muhurta
Parameter
Type
Required
Default
Notes
event_type
string
Yes
—
One of six: griha_pravesha_own, griha_pravesha_rented, travel_prayana, vehicle_purchase, business_shop_opening, property_purchase_registration.
from_date
string
Yes
—
Scan start, YYYY-MM-DD.
to_date
string
Yes
—
Scan end, YYYY-MM-DD. At most 90 days counting both ends.
day_part_resolution_minutes
integer
No
15
Echoed in the result. It does not currently change the scoring, which reads each day at midday.
respect_inauspicious_windows
boolean
No
true
Report the Rahu, Gulika and Yamaganda windows to avoid.
event_place
string
No
null
Event place name; defaults to the birth place.
event_latitude
number
No
null
Event latitude; defaults to the birth latitude.
event_longitude
number
No
null
Event longitude; defaults to the birth longitude.
event_timezone
number
No
null
Event timezone offset from UTC; defaults to the birth timezone.
event_elevation
number
No
null
Event elevation in metres; defaults to the birth elevation.
Returns: section "muhurta" — event_type, event_label, range, rules_applied, weights, day_part_resolution_minutes and the scored candidates
get_planet_ingress
Retrograde-aware sign-change timing across a date range. Takes no birth details at all — ingresses are the same for everyone.
Takes no birth-details block. Its full parameter list is:
Parameters for get_planet_ingress
Parameter
Type
Required
Default
Notes
planets
string[]
No
["Saturn", "Jupiter", "Rahu", "Ketu"]
Planet names. An unrecognised name is an error.
from_date
string
Yes
—
Range start, YYYY-MM-DD.
to_date
string
Yes
—
Range end, YYYY-MM-DD. At most about five years after from_date.
timezone
number
No
0.0
Offset the crossing times are expressed in. Defaults to UTC — this is not a birth timezone.
ayanamsa_mode
string
No
"LAHIRI"
Ayanamsa mode.
Returns: section "planet_ingress" — range, timezone, ayanamsa_mode, planets and ingresses
The 55 dasha systems
get_dasha accepts any of these as its system argument. 28 are graha (planetary) systems, where the periods belong to planets:
The other 27 are rasi (sign) systems, where the periods belong to signs. These naturally run shallower, which is why the default depth is 2 rather than 3:
A worked example: an agent answering a real question
Take the question "I was born on 27 July 1993 at 1:51pm in Hassan, India. Which dasha am I running, and is Saturn giving me trouble right now?" An agent with this server connected answers it in three calls. Nothing below is hypothetical — it is the literal JSON-RPC each step sends, and the results are real, abridged.
Step 1 — establish the chart
The agent calls generate_horoscope first. This is the expensive step; later calls for the same birth details reuse the computed chart and come back quickly.
Now the timing question. The agent asks for Vimshottari to three levels, and the server marks which maha, antar and pratyantar contain the as_of_date, so the model does not have to do date arithmetic over a period tree. as_of_date defaults to today; it is fixed here so the example can be reproduced.
"Is Saturn giving me trouble" is a Sade Sati question, so the agent calls the tool that answers it directly rather than trying to infer it from planetary positions.
Three calls, and the model now has the running period with its end date and the Saturn transit windows — the two things the question actually turned on. It writes the answer from computed data instead of from whatever it remembered about Vedic astrology.
The shape of this matters more than the specifics. Do not reach for generate_horoscope and then ask the model to find the answer in it — that is the megabyte-into-the-context-window mistake. Establish the chart, then call the one or two tools that own the question. Each returns kilobytes.
How the server behaves
Every tool is read-only
Each tool advertises readOnlyHint: true, destructiveHint: false, idempotentHint: true and openWorldHint: false. Nothing here writes, sends, charges or changes anything. An agent can call any of them without a confirmation step.
Compute the chart once, then slice it
Computing a chart is the expensive step. Follow-up calls for the same birth details reuse the computed chart and come back quickly, so the intended pattern is one generate_horoscope followed by as many section tools as the question needs — not one call that drags a multi-megabyte chart back to the model.
No authentication
There is no API key to obtain and no OAuth flow to complete — which also means an MCP client that requires OAuth for remote servers will not connect. Do not send anything you would not put in a public request.
Rate limit
30 requests a minute per client IP address. Every JSON-RPC request counts, initialize and tools/list included, not only tool calls. Over the limit, the HTTP response is 429 with the body {"error": "Rate limit exceeded: 30 per 1 minute"}.
Results change only when the engine does
The same arguments give the same result, with two exceptions: get_dasha centres on today's date unless you send as_of_date, and results change when the calculation engine is updated. The REST API's engine_revision field (on /horoscope and /marriage-match) tells you when that happens.
Send only the advertised parameters
Use the parameters each tool's schema lists. If you need a non-default ayanamsa, a different house system or other calculation settings, use the REST API, where they are documented parameters.