cosine-astro-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cosine-astro-mcpcast my natal chart: born 1995-05-12 at 08:30 in Shanghai"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cosine-astro-mcp
An MCP server for Western (tropical) astrology calculations: natal charts, transits, synastry, Mercury retrograde, annual profections and moon phases.
Language models are poor at working out where the planets were on a given date; they tend to guess. This server computes the positions instead, offline, from the astronomy-engine ephemeris, and hands the model both a compact text summary and the full data as JSON. No API keys, no network calls, no accounts.
Made by COSINE 余弦 — cosineastro.com, a birth-chart site with AI readings. This is the same chart engine the site runs, published as an MCP server.
Install
Requires Node.js 20 or later.
Claude Code
claude mcp add cosine-astro -- npx -y cosine-astro-mcpAdd --scope user to make it available in every project.
Claude Desktop — edit claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"cosine-astro": {
"command": "npx",
"args": ["-y", "cosine-astro-mcp"]
}
}
}Cursor — ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project):
{
"mcpServers": {
"cosine-astro": {
"command": "npx",
"args": ["-y", "cosine-astro-mcp"]
}
}
}Any other MCP client that speaks stdio works the same way: the command is npx -y cosine-astro-mcp.
Related MCP server: astro-mcp
Tools
All tools are read-only and deterministic for a given input (except where a date defaults to "now").
Tool | What it returns |
| The ten planets (sign, degree, house, retrograde, daily motion), Ascendant and Midheaven, twelve house cusps, major aspects with orbs and applying/separating, and the element and modality balance with the dominant of each. |
| Planet positions for a date and time (default: now) and, given a natal chart, the aspects they make to the natal planets, Ascendant and Midheaven within an orb (default 2°), and the natal house each transiting planet is in. |
| Cross aspects between two charts (planets and Ascendant), each person's planets in the other's houses, and a plain tally of conjunctions, harmonious and challenging aspects. |
| Mercury retrograde periods overlapping a date range: pre-shadow start, station retrograde, station direct, post-shadow end (to about a minute), with the degrees of both stations. |
| For an age or a date: the profected house and sign (whole-sign from the Ascendant), the lord of the year and where it sits natally, and the dates the profection year runs. |
| Phase name, illuminated fraction, Sun–Moon angle, days since new moon, Moon and Sun signs, and the next new, first-quarter, full and last-quarter moons. |
Birth data
natal_chart, annual_profection, and the natal / person_a / person_b objects of transits and synastry take:
Field | Type | Notes |
|
| Required. Local calendar date. Years 1800–2200. |
|
| Local clock time, 24-hour. Omit if unknown: planets are then cast for local noon, with no Ascendant, Midheaven or houses, and the Moon's range for the day is reported. |
| IANA zone | e.g. |
| degrees | North and east positive. Needed for the Ascendant, Midheaven and houses. |
| string | Optional shortcut from a built-in table of about 110 large cities (English or Chinese names). Explicit coordinates and zone win. There is no geocoding service: for anywhere else, pass coordinates. |
|
| Default Placidus. Inside the polar circles, where Placidus has no solution, whole-sign houses are used and the output says so. |
Other parameters: transits takes date, time, timezone, natal, max_orb; mercury_retrograde takes start_date, end_date, timezone; annual_profection takes age or on_date; moon_phase takes date, time, timezone. Every tool's JSON schema carries a description of each field.
Output
Each call returns two text blocks and structuredContent:
a compact summary written for a model to read, ending with a short note that the positions are computed and that interpretation should be offered as reflection, not prediction;
the same data as JSON (also in
structuredContent).
Example (natal_chart, 1995-05-12 08:30, Shanghai):
Natal chart: 1995-05-12 08:30 Asia/Shanghai (UTC+08:00) · 31.23°N 121.47°E · Placidus houses
Sun 20°51′ Taurus (H11); Moon 11°41′ Libra (H4); Mercury 12°17′ Gemini (H12); Venus 24°00′ Aries (H10); Mars 24°13′ Leo (H2); Jupiter 13°00′ Sagittarius (H6) R; ...
ASC 12°04′ Cancer · MC 28°08′ Pisces
Aspects: Venus trine Mars 0.2° a; Moon trine Mercury 0.6° a; Mercury opposition Jupiter 0.7° a; ...
Balance: fire 20%, earth 20%, air 27%, water 33% → water; cardinal 40%, fixed 33%, mutable 27% → cardinalConventions
Positions are geocentric, apparent, tropical ecliptic longitudes of date.
Aspects within a chart: conjunction and opposition 8°, square and trine 6°, sextile 4°. Between two charts (synastry): 6°, 5°, 5°, 3°. Transits: one orb for all, default 2°.
Element/modality balance: Sun, Moon and Ascendant count 2 points; Mercury to Pluto and the Midheaven 1 point each. Ties go to the Sun's element, then the Moon's, then the Ascendant's.
Profections count whole signs from the Ascendant (from the Sun's sign when the birth time is unknown); the lord of the year is the traditional ruler, with the modern co-ruler (Pluto, Uranus, Neptune) noted where it differs.
Shadow periods: the pre-shadow starts when Mercury first reaches the degree where it will later station direct; the post-shadow ends when it moves back past the degree where it stationed retrograde.
Not included: asteroids, lunar nodes, Lilith, Chiron, sidereal zodiacs, house systems other than Placidus and whole-sign, and interpretation text.
Accuracy
The test suite compares the engine with Swiss Ephemeris (2.10.03, via pyswisseph) on 55 reference charts from 1900 to 2050 — northern and southern hemispheres, east and west longitudes, the equator, high latitudes up to and inside the Arctic Circle, historical daylight saving time, and unknown birth times. Every planet longitude, Ascendant, Midheaven and Placidus cusp is within 1′ of arc of the reference (largest gaps: planets 0.34′, Ascendant/Midheaven 0.20′, cusps 0.21′), and every UTC conversion matches. The angles use the true obliquity of the ecliptic (nutation included), as Swiss Ephemeris does. Only the reference numbers are included in this repository (tests/fixtures/reference-charts.json); no Swiss Ephemeris code is used or distributed.
Things to know:
Time zones come from the IANA database built into Node.js. For dates before a region adopted standard time, the database uses local mean time; if your source used a different rule, pass the zone you mean (for example
"Etc/GMT-8"for a fixed UTC+8).The Ascendant moves about a degree every four minutes: the chart is only as accurate as the birth time.
The built-in city coordinates are city centres to about 0.01°.
Retrograde stations are located to about a minute.
COSINE's methodology and accuracy notes: cosineastro.com/en/accuracy.
About interpretation
The positions are astronomy. What they mean is a tradition of interpretation, not a measurement. The server says so in every result and suggests that a model present readings as prompts for reflection rather than predictions or advice.
Development
npm install
npm test # reference charts + every tool through an MCP client
npm run build
npm run smoke # starts dist/index.js over stdio and calls each tool
npx @modelcontextprotocol/inspector --cli node dist/index.js --method tools/listCredits and license
MIT. The chart engine is ported from COSINE and uses astronomy-engine by Don Cross (MIT). Reference values for the tests were generated with Swiss Ephemeris by Astrodienst (used only to produce the numbers; not part of this package).
Made by COSINE — https://www.cosineastro.com · Free birth chart · Accuracy
繁體中文
cosine-astro-mcp 是一個 MCP 伺服器,提供西洋占星(回歸黃道)計算:本命盤、行運、合盤、水星逆行、年度小限、月相。
大型語言模型自己推算行星位置往往不準。這個伺服器改用 astronomy-engine 星曆在本機離線計算,回傳一段給模型讀的精簡文字摘要,以及完整的 JSON 資料。不需要 API 金鑰,不連網。
由 COSINE 余弦(cosineastro.com)製作,和網站使用同一套星盤引擎。
安裝
需要 Node.js 20 以上。
Claude Code:
claude mcp add cosine-astro -- npx -y cosine-astro-mcpClaude Desktop/Cursor:在設定檔的
mcpServers加入"cosine-astro": { "command": "npx", "args": ["-y", "cosine-astro-mcp"] }(完整範例見上方英文說明)
工具
工具 | 內容 |
| 本命盤:十顆行星的星座、度數、宮位、逆行;上升、天頂;十二宮頭(預設 Placidus,極圈內改用整宮制並註明);主要相位與容許度、入相/出相;元素與模式的分布及主導。 |
| 指定時刻(預設現在)的行星位置;若提供本命盤,列出行運行星對本命行星、上升、天頂的相位(預設容許度 2°)及所落本命宮位。 |
| 合盤:雙方行星(含上升)之間的相位、各自行星落入對方的宮位,以及簡單的相位統計(不是配對分數)。 |
| 日期範圍內的水星逆行:前影期開始、停滯轉逆、停滯轉順、後影期結束(精確到約一分鐘),以及兩次停滯的度數。 |
| 依年齡或日期計算年度小限:小限宮位與星座(從上升星座以整宮計;不知出生時間則從太陽星座起算)、年主星及其本命位置、該小限年的起訖日期。 |
| 月相名稱、照亮比例、日月角距、月齡,以及下一次新月、上弦、滿月、下弦。 |
出生資料:date(YYYY-MM-DD,必填)、time(HH:MM,不知道就省略:不給上升、天頂與宮位)、timezone(IANA 時區,如 Asia/Taipei,自動套用歷史夏令時間)、latitude/longitude(北緯、東經為正),或用 city 從內建約 110 個大城市(中英文名皆可,繁簡皆可)中選取。不呼叫任何地理編碼服務;其他地點請直接給經緯度。
準確度
測試以 Swiss Ephemeris(2.10.03,pyswisseph)計算的 55 張參考星盤(1900–2050 年,涵蓋南北半球、東西經、赤道、高緯度與北極圈內、歷史夏令時間、出生時間不詳)比對:所有行星黃經、上升、天頂與 Placidus 宮頭誤差都在 1 角分以內(最大:行星 0.34′、上升/天頂 0.20′、宮頭 0.21′),UTC 換算全部一致。上升與天頂使用含章動的真黃赤交角,與 Swiss Ephemeris 相同。本專案只收錄參考數值,不含也不散布任何 Swiss Ephemeris 程式碼。準確度說明見 cosineastro.com/en/accuracy。
關於解讀
行星位置是天文計算;它們代表什麼,屬於占星的詮釋傳統,而非測量結果。每次回傳都附上提示:請把解讀當作自我反思的參考,而不是預言或建議。
授權
MIT。星盤引擎移植自 COSINE,使用 Don Cross 的 astronomy-engine(MIT)。
由 COSINE 製作 — https://www.cosineastro.com · 免費排本命盤
Available Tools
6 toolsannual_profectionAnnual profectionARead-onlyIdempotent
Hellenistic annual profection for an age or a date: the profected house (whole-sign, counted from the Ascendant; from the Sun's sign if the birth time is unknown), its sign, the lord of the year (traditional ruler, with the modern co-ruler) and where that lord sits in the natal chart, plus the dates the profection year runs.
| Name | Required | Description | Default |
|---|---|---|---|
| age | No | Age in completed years. Takes precedence over `on_date`. | |
| city | No | Optional shortcut: a city from the built-in offline table (about 110 large cities, English or Chinese name, e.g. "Beijing", "上海", "London", "New York"). Explicit latitude/longitude/timezone override it. For anywhere else, pass coordinates. | |
| date | Yes | Birth date (local calendar date), YYYY-MM-DD | |
| time | No | Local clock time of birth, 24-hour HH:MM. Omit if unknown: planets are then cast for local noon and there are no Ascendant, Midheaven or houses. | |
| on_date | No | Date to find the profection year for, YYYY-MM-DD (default: today in the birth time zone) | |
| latitude | No | Birthplace latitude in degrees, north positive | |
| timezone | No | IANA time zone of the birthplace, e.g. "Asia/Shanghai", "America/New_York". Historical daylight saving time is applied automatically. Required unless `city` is given. | |
| longitude | No | Birthplace longitude in degrees, east positive (New York is about -74.0) | |
| house_system | No | House system. Placidus (default) falls back to whole-sign inside the polar circles, where it has no solution. | placidus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuine domain behavior: the whole-sign counting rule, the Sun-sign fallback when the birth time is absent, and the traditional-ruler-plus-modern-co-ruler convention. It does not discuss return format mechanics, but the substantive behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that opens with the purpose and then unpacks the returns; no filler. It is dense with stacked clauses, which is efficient but slightly hard to scan compared to a split form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and nine parameters, the description carries the return-value burden and discharges it by enumerating the house, sign, lord of the year, lord's location, and date range. Nothing an agent needs to decide to call it or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter (age, on_date, city, time, timezone, house_system, etc.) is already documented in the schema, including age's precedence over on_date. The description only restates the age-or-date framing and the unknown-birth-time behavior, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific technique (Hellenistic annual profection) and enumerates exactly what it computes: profected house, its sign, lord of the year with modern co-ruler, the lord's natal placement, and the year's start/end dates. It is unmistakably distinct from siblings like natal_chart or transits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it can be run 'for an age or a date' and gives the key conditional: whole-sign from the Ascendant, or from the Sun's sign if birth time is unknown. It does not explicitly route against the sibling tools (transits, natal_chart), so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mercury_retrogradeMercury retrogradeARead-onlyIdempotent
Mercury retrograde periods overlapping a date range (default: the next 12 months): pre-shadow start, station retrograde, station direct and post-shadow end (to about a minute, in UTC and a chosen time zone), with the degrees and signs of the two stations.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of the range, inclusive, YYYY-MM-DD (default: one year after the start). At most 30 years. | |
| timezone | No | IANA time zone for the range and the local times in the output (default UTC) | UTC |
| start_date | No | Start of the range, YYYY-MM-DD (default: today) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld=false, so safety is covered. The description adds genuine context beyond that: temporal precision ('to about a minute'), UTC plus a chosen time zone, and the fact that station degrees and signs are included in the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the parentheticals carry real information (default range, precision, time zone, station data) rather than padding. Slightly dense, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does so by naming the four time points plus degree/sign data and the time zone handling. Combined with the fully documented schema, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented with defaults, patterns, and the 30-year cap. The description only restates the default range behavior, adding little beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Mercury retrograde periods) and a precise scope (overlapping a date range), then enumerates the exact artifacts returned: pre-shadow start, both stations, and post-shadow end. This is clearly distinguishable from siblings like moon_phase or transits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the astronomy domain and the defaults ('default: the next 12 months'), but there is no explicit when-to-use guidance or routing against siblings such as transits or moon_phase. An agent can infer intent but receives no conditional steering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moon_phaseMoon phaseARead-onlyIdempotent
The Moon's phase at a moment (default: now): phase name, illuminated fraction, Sun–Moon angle, days since new moon, the Moon's and Sun's signs, and the next new, first-quarter, full and last-quarter moons.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date, YYYY-MM-DD. Omit for the current moment. | |
| time | No | Local time, HH:MM (default 12:00 when a date is given) | |
| timezone | No | IANA time zone (default UTC) | UTC |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavior: the default-to-now semantics and, importantly, the full set of computed return fields — which matters because there is no output schema to carry that information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the resource and the default, with no filler. The long tail enumerating return fields is justified given the absence of an output schema, though the comma list is dense and could be grouped more readably.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter, read-only lookup with no output schema, the description supplies both the default behavior and the shape of the result, which is precisely the information the agent lacks from structured fields. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so date/time/timezone formats and defaults are already fully documented in the schema. The description only echoes the 'default: now' behavior and adds no new syntax, format, or interaction details (e.g., how date and time combine, or timezone handling when only a date is given).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the Moon's phase) and a specific moment in time, and enumerates exactly what is computed: phase name, illuminated fraction, Sun–Moon angle, days since new moon, signs, and upcoming quarter phases. It is clearly a distinct astronomical lookup versus the natal/transit/synastry siblings, though it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: '(default: now)' signals that omitting the date yields the current moment, which is reinforced by the schema's 'Omit for the current moment.' There is no explicit when-to-use, when-not-to-use, or alternative-tool routing (e.g., versus transits for a time range).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
natal_chartNatal chartARead-onlyIdempotent
Cast a tropical natal (birth) chart: the ten planets with sign, degree, house and retrograde flag; Ascendant and Midheaven; twelve house cusps (Placidus by default); major aspects with orbs and applying/separating; and the dominant element and modality. Works without a birth time (no angles or houses then).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Optional shortcut: a city from the built-in offline table (about 110 large cities, English or Chinese name, e.g. "Beijing", "上海", "London", "New York"). Explicit latitude/longitude/timezone override it. For anywhere else, pass coordinates. | |
| date | Yes | Birth date (local calendar date), YYYY-MM-DD | |
| time | No | Local clock time of birth, 24-hour HH:MM. Omit if unknown: planets are then cast for local noon and there are no Ascendant, Midheaven or houses. | |
| latitude | No | Birthplace latitude in degrees, north positive | |
| timezone | No | IANA time zone of the birthplace, e.g. "Asia/Shanghai", "America/New_York". Historical daylight saving time is applied automatically. Required unless `city` is given. | |
| longitude | No | Birthplace longitude in degrees, east positive (New York is about -74.0) | |
| house_system | No | House system. Placidus (default) falls back to whole-sign inside the polar circles, where it has no solution. | placidus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety bar is met. The description adds genuine behavioral context: graceful degradation when time is omitted (no angles or houses), the default house system, and the Placidus fallback inside the polar circles. It stops short of stating validation errors or precision caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense output-defining sentence followed by a short caveat sentence; every clause carries information and the most important content (what the chart contains) is front-loaded. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description bears the burden of explaining return contents and does so thoroughly, including the degraded no-time case. The main remaining gap is that the schema/description interact only loosely on timezone-vs-city precedence, but that is covered by the parameter descriptions themselves.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented in the schema, including the city shortcut, coordinate conventions, and house_system enum with its polar fallback. The description adds only the no-time behavior, which the schema already states for `time`; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cast a tropical natal (birth) chart') and enumerates the exact outputs (planets with sign/degree/house/retrograde, Ascendant, Midheaven, house cusps, aspects with orbs, element/modality dominance). This clearly separates it from siblings like transits and synastry, which compute charts for other reference frames or pairs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and the closing note that the tool still works without a birth time, which tells the agent partial input is acceptable. However, it never names alternatives or states a when-to-use condition relative to siblings such as transits or synastry, so the routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
synastrySynastryARead-onlyIdempotent
Compare two natal charts: the major aspects between person A's planets (and Ascendant) and person B's, with orbs (conjunction/opposition 6°, square/trine 5°, sextile 3°), where each person's planets fall in the other's houses, and a simple descriptive tally (not a compatibility score).
| Name | Required | Description | Default |
|---|---|---|---|
| person_a | Yes | First person's birth data | |
| person_b | Yes | Second person's birth data |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds meaningful behavioral context beyond that: concrete orb thresholds per aspect type and an explicit disclaimer that the result is a descriptive tally, not a compatibility score, which manages output expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the core action and then enumerates outputs in a clear parenthetical list. It is information-rich with no filler, though the length slightly favors completeness over brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to describe return content (aspects with orbs, planet-in-house placements, tally), and the input schema fully documents the two nested birth-data parameters. Combined with annotations covering safety, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are richly documented nested objects (date, time, city shortcut, coordinates, timezone, house_system), so the schema carries the semantic load. The description adds only a passing reference to Ascendant implying time may matter, which the schema already explains in more detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Compare') and resource ('two natal charts'), and immediately scopes the output: major aspects, house overlays, and a descriptive tally. The 'two charts' framing cleanly separates it from the single-chart natal_chart sibling without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies the use case (relationship/relational analysis between two people), but there is no explicit when-to-use guidance, no exclusions, and no pointer to alternatives such as natal_chart for a single person or transits. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transitsTransitsARead-onlyIdempotent
Planet positions for a date and time (default: now), and, given a natal chart, the major aspects the transiting planets make to the natal planets, Ascendant and Midheaven within an orb (default 2°), with the natal house each transiting planet is passing through.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date of the transits, YYYY-MM-DD. Omit for the current moment. | |
| time | No | Local time of the transits, HH:MM (default 12:00 when a date is given) | |
| natal | No | The natal chart to compare against. Omit to get only the planets' positions. | |
| max_orb | No | Largest orb in degrees for transit-to-natal aspects (default 2) | |
| timezone | No | IANA time zone for the transit date and output times (default: the natal chart's zone, else UTC) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds the 'omit natal to get only positions' behavior and default scoping, which is useful, but says nothing about performance, precision limits, or how the two modes differ in output shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the core output and then qualifies it with the optional natal comparison. Nothing is wasted, though the run-on construction packs orb, aspects, and houses into one clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with a nested natal object and no output schema, the description enumerates the main returns (positions, major aspects within orb, natal houses) so an agent knows what to expect. It stops short of describing the response structure, but the rich schema and annotations carry most of the remaining burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including patterns, defaults and the Placidus fallback. The description restates the two key defaults (now, 2°) but adds no syntax or constraint detail beyond the schema, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific computation (planet positions for a date/time) and its conditional extension (transit-to-natal aspects within an orb, plus transiting-house placement), which is enough for an agent to grasp the resource. It distinguishes the tool from natal_chart by describing the comparison-against-natal behavior, but never names the siblings it should be chosen over.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'given a natal chart' signals the optional comparison mode, and defaults (now, 2° orb) are stated, but there is no explicit when-to-use-this-vs-alternatives guidance. An agent must infer that transits is for current/forward-looking positions while natal_chart handles the birth chart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
annual_profection - First observed
mercury_retrograde - First observed
moon_phase - First observed
natal_chart - First observed
synastry - First observed
transits
TDQS
Scored across 6 tools
Each tool serves a clearly distinct astrological purpose: natal chart casting, transits to a natal chart, synastry between two charts, Mercury retrograde periods, annual profection, and moon phase. There is no overlap in function and descriptions provide enough context to avoid misselection.
All tool names are lowercase snake_case and use descriptive noun-based labels, with multiword names consistently joined by underscores. Minor variation between single-word (transits, synastry) and compound names is natural and does not break the consistent pattern.
Six tools is a well-scoped set for an astrology calculation server. Each tool addresses a distinct, valuable calculation, and the count sits comfortably within the recommended 3-15 range without feeling thin or bloated.
The surface covers core natal, transit, and synastry calculations plus three specialized techniques, but notable gaps remain for common astrological operations such as secondary progressions, solar returns, and composite charts. These missing operations could cause dead ends for agents needing those calculations.
Related MCP Connectors
Western natal charts, horoscopes, transits and synastry for AI agents, verified vs NASA JPL.
Swiss Ephemeris for AI agents: exact natal charts, transits, synastry and birth-place resolution
Western, Vedic, and Chinese astrology calculations, charts, forecasts, and geocoding.
Official Divine API MCP for Western Astrology: Natal, Synastry, Transit, Composite, Progressions.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMulti-tradition astrology engine that computes real birth charts, transits, and synastry for AI agents via MCP tools.10-
- AlicenseNot gradedqualityBmaintenanceHigh-precision astrology tools for LLM agents, including natal charts, transits, progressions, synastry, and more, backed by Swiss Ephemeris.1MIT
- AlicenseAqualityAmaintenancePrecision-audited astrology MCP for natal charts, transits, synastry and moon phases. No API key.1065 npmMIT
- AlicenseNot gradedqualityDmaintenanceProvides real astrology and tarot computations using actual ephemeris and a 78-card deck, returning structured data such as natal charts, synastry, transits, and tarot draws without relying on an LLM for astrological facts.MIT