32 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.
Last verified against the service source on 2026-08-31.
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. Every response is deterministic, so caching on your side is safe.
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, formats a program would rather have. Kept in sync with this page by a test that fails the build when they drift.
horoscopes.today/mcp-tools.json — The tool manifest: every tool name, description and input schema as JSON. Useful for planning a call before you connect — though tools/list on the live server is always the authority.
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 whatever protocolVersion the client sent, falling back to 2024-11-05 when the client sends none.
tools/list
The authoritative tool inventory with full JSON Schemas. Call this rather than trusting any written list, including this page.
tools/call
Runs one tool. Takes name and arguments. The result comes back as MCP content: a single text part whose text is the JSON-encoded result object.
ping
Returns an empty object. Liveness.
notifications/*
Accepted and acknowledged with no response body, per JSON-RPC notification semantics.
Transport detail
The transport is JSON-RPC 2.0 over HTTP. POST your request to the endpoint and the JSON-RPC response comes straight back in the body — no session, no handshake beyond initialize.
An SSE variant exists for clients that want it: GET /mcp/sse with Accept: text/event-stream opens the stream, which emits an endpoint event followed by a session event carrying the session id. Messages are then POSTed with an X-MCP-Session-ID header and the reply is pushed down the stream as a message event, with the POST itself returning 202. A keepalive comment goes out every 25 seconds.
This is the HTTP + SSE shape of the 2024-11-05 protocol revision. 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, an unknown tool name, or birth details that fail to parse — a missing required field names the fields it is missing.
-32603
Internal error. The tool raised. The message carries the reason.
The shared inputs
Most tools identify a chart the same way, with the same six 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. Shorter forms are normalised server-side.
latitude
number
Yes
—
Birth-place latitude in decimal degrees, e.g. 13.0827
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
null
Optional birth-place name, cosmetic only.
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 32 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
The entry point. Computes the chart, then returns a compact overview — the birth details it used, the ascendant and Moon nakshatra with padas and lord, calendar info, and the list of section names every other tool can then fetch. Start here; the chart is cached, so the follow-up calls are cheap.
get_arudha_padas
The arudha padas — the perceived, as-others-see-it houses — for a chosen divisional chart.
get_chandra_arudhas
The arudha signs of the twelve houses counted from the Moon.
get_chara_karakas
The eight Jaimini chara (variable) karakas — Atma, Amatya, Bhratri and the rest — assigned by planetary degree.
get_graha_arudhas
The arudha — the reflected sign — of each graha and of the lagna.
get_house_varnadas
The varnada lagna for each of the twelve houses.
get_nakshatra_pada
Nakshatra, pada, nakshatra lord and degrees-into-nakshatra for every body in the chart.
get_planetary_states
Dignity and condition flags for the planets — retrograde, combust, exalted, debilitated and the rest.
get_sahams
The sahams — the Vedic Arabic parts — of the chart.
get_special_lagnas
The special and derived lagnas — Bhava, Hora, Ghati and the others.
get_sphutas
The special sphutas — the sensitive computed points of the chart.
get_surya_arudhas
The arudha signs of the twelve houses counted from the Sun.
get_upagrahas
The upagrahas — the shadowy sub-planets such as Gulika and Mandi.
Timing & dashas
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.
Divisional charts
get_amsa_rulers
The Nadiamsa (D-150) ruler for every point in the chart — planets, upagrahas, lagnas, varnada and sphutas.
get_divisional_chart
One varga chart by name, with every body's sign and longitude in that division.
list_divisional_charts
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
Ashtakavarga bindu scores with the rows labelled by planet instead of returned as bare arrays: binna (the un-reduced BAV), sodhita (SoAV, the reduced grid the pindas come from), samudhaya (SAV), and the rasi, graha and sodhya pindas. The prastara grid is deliberately left out to keep the payload small.
get_bhava_bala
Bhava Bala — house strength — parsed into House 1 through House 12, each with total virupas, rupas and a strength ratio.
get_other_bala
The remaining strength measures — harsha, pancha and dwadhasa vargeeya bala.
get_shad_bala
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
Vaiseshikamsa Bala — the count of good vargas each planet occupies.
get_vimsopaka_bala
Vimsopaka Bala — divisional-chart dignity strength on a twenty-point scale.
Yogas, doshas & longevity
get_doshas
The standard dosha checks for the chart — Manglik, Kaal Sarp and the rest of the set.
get_longevity
Classical Ayurdaya longevity reference computations — the band and the combinations that produced it.
get_yogas
Every yoga detected in the chart, each with its classical definition and stated effects.
Transits & muhurta
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).
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. The natal reference is computed once.
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.
get_planet_ingress
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's Sade Sati windows and the related 4th and 8th house transits.
Compatibility
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, rating and Manglik state, plus the full detail.
What a tool call returns
A tools/call result is MCP content: a single text part whose text is the JSON-encoded result object. Thirty-one of the 32 tools wrap their payload 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" (the engine spelling, with the 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. "YYYY-MM-DD HH:MM" and "YYYY-MM-DD HH:MM:SS" are also parsed.
depth
integer
No
3 for graha systems, 2 for rasi systems
1 to 4. Clamped to that range, and reduced to what the chosen system can actually produce.
maha
string
No
null
Ruler name of the maha dasha to expand. No enum — the valid set is the chosen system's rulers (planets or signs).
antar
string
No
null
Ruler name of the antar dasha to expand. Requires maha to be set.
Returns: section "dasha". The data carries dasha_type, system, as_of, depth, levels_available and maha_timeline, plus current_maha / current_antar / current_pratyantar when they apply.
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_rasi"
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. The resolver is forgiving — "D9", "9" and "navamsa" all reach D-9. An unknown value returns an error object listing the available vargas rather than failing the call.
Returns: section "divisional_charts", plus the engine key that was matched (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. The natal reference is computed once.
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. Maximum 60 days; 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, rating and Manglik state, 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 response.
Returns: section "marriage_match"
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. Maximum 90 days.
day_part_resolution_minutes
integer
No
15
Time-of-day granularity. The tool description states 5-60; the JSON schema declares no minimum or maximum, so treat 5-60 as the supported range rather than an enforced one.
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 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"]
An unrecognised planet name is an error.
from_date
string
Yes
—
Range start, YYYY-MM-DD.
to_date
string
Yes
—
Range end, YYYY-MM-DD. Maximum about five years.
timezone
number
No
0.0
Offset used to express the crossing dates. Defaults to UTC — this is NOT a birth timezone and is optional here.
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 protocol — it is the literal JSON-RPC each step sends.
Step 1 — establish the chart
The agent calls generate_horoscope first. This is the expensive step, and it populates the server's chart cache, so every later call for the same birth details is a lookup rather than a recomputation.
Now the timing question. The agent asks for Vimshottari to three levels, and the server marks which maha, antar and pratyantar contain today's date, so the model does not have to do date arithmetic over a period tree.
"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 mutates anything. An agent can call any of them without a confirmation step.
The chart is cached, so slice freely
The expensive step is computing the chart, not slicing it. The server keeps a small in-process LRU of parsed charts — 15 entries, with a 10-minute TTL that refreshes on every hit — keyed by the birth details and the calculation settings. So the intended pattern is one generate_horoscope followed by as many section tools as the question needs, not one call that drags 3.5 MB back to the model. Cache statistics are exposed at GET /mcp/health.
No authentication
The MCP router enforces no authorization header today. 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 be satisfied by this one. Do not send anything you would not put in a public request.
Rate limits apply here too
The MCP router runs inside the same FastAPI app as the REST API, so the app-wide default of 200 requests per minute per IP governs it. The per-endpoint REST limits do not apply to tool calls; the default does.
tools/list is the contract
The registry discovers tools by importing every module in its tools package at startup, so the live set can differ from any written list. Call tools/list at connect time and use the schemas it returns. This page is a snapshot for humans and crawlers; the server is the authority.
Undocumented parameters exist — do not rely on them
The birth parser accepts calculation settings that appear in no advertised schema: elevation, ayanamsa_mode, ayanamsa_value, calculation_type, bhava_madhya_method, language, pravesha_type, years, months, sixty_hours, tamil_month_method and kali_start_year. They work, but they are not part of the published contract and could change without notice. Send only what tools/list advertises. If you need a non-default ayanamsa today, the REST API exposes it as a supported, documented parameter.