{"$schema":"https://raw.githubusercontent.com/modelcontextprotocol/modelcontextprotocol/main/schema/server-card.json","protocolVersion":"2026-07-28","serverInfo":{"name":"fateread","title":"FateRead","version":"1.0.0"},"description":"FateRead exposes a deterministic Chinese astrology engine (BaZi Four Pillars + Zi Wei Dou Shu, true solar time, classical sources) as MCP tools, so a third-party agent can cast charts, read the almanac, pick auspicious dates and discuss a chart without sending the user to a web page.","transport":{"type":"streamable-http","url":"https://fateread.cc/api/mcp","session":"stateless"},"capabilities":{"tools":{"listChanged":false},"resources":{},"prompts":{}},"instructions":"Send JSON-RPC 2.0 over POST. `tools/list` and `tools/call` need no handshake; an `initialize` call is answered if your client sends one. Tool results are structured JSON — read the response fields before concluding that something is missing.","tools":[{"name":"cast_chart","title":"Cast a BaZi + Zi Wei chart","description":"Cast a Chinese astrology chart (BaZi Four Pillars + Zi Wei Dou Shu) from a birth date, time and place.\n\nWHEN TO USE: any question about a chart, day master, five-element balance, pattern (ge ju), useful element\n(yong shen), luck pillars (da yun) or Zi Wei palaces must start here. Call this first and then reason over\nthe structured result — do not derive pillars from a birth date yourself.\n\nENGINE CONTRACT (read before filling in the arguments):\n- `city` takes free text (\"上饒\"/\"上饶\", \"江西上饶\", \"Hangzhou\", \"Taipei\"). The server resolves it to a\n  longitude and an IANA time zone. DO NOT look up coordinates or time zones yourself — the city table\n  exists only on the server, and a self-computed longitude shifts the hour pillar near a time boundary.\n- `timezoneId` defaults to mainland China. For births in Hong Kong, Macao, Taiwan or overseas between 1986\n  and 1991 you MUST pass it: those regions had no daylight saving then, and the default would apply the\n  mainland DST rules and shift the whole hour pillar by one hour.\n- `calendarType` defaults to a solar date. For a lunar date pass \"lunar\" (either case is accepted) and use a\n  NEGATIVE `month` for the leap month, or set `isLeapMonth: true`.\n- `enableTrueSolarTime` only controls the longitude + equation-of-time correction. Turning it off still\n  converts daylight saving — it is not a \"disable every time adjustment\" switch.\n- `hour` is the local civil hour 0-23 and is required; a chart always has an hour pillar.\n\nOUTPUT: structured JSON, never prose. It carries two version stamps you should surface when caching:\n`chart.engine.version` (which charting rules produced this chart) and `schemaVersion` (the shape of this\nresponse). If the same birth details later yield a different chart, compare these two before reporting a bug.\n\nDETAIL: `detail: \"summary\"` (the default) keeps the four pillars, hidden stems, ten gods, void branches,\nfive-element counts, pattern/useful element and the first 3 luck pillars, and drops nà yīn, twelve stages,\nshen sha, the current year pillar and the Zi Wei palaces. Use `detail: \"full\"` only when you need them;\nthe response lists what it skipped under `omitted`.\n\nBOUNDARY: FateRead describes personality types and timing, not future events, and gives no medical, legal,\nfinancial or psychological advice. Where schools of thought disagree, state the disagreement.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"year":{"type":"integer","minimum":1900,"maximum":2100},"month":{"type":"integer","minimum":-12,"maximum":12},"day":{"type":"integer","minimum":1,"maximum":31},"hour":{"type":"integer","minimum":0,"maximum":23,"description":"Birth hour in local civil time, 0-23. Always required."},"minute":{"type":"integer","minimum":0,"maximum":59},"gender":{"type":"string","enum":["male","female"]},"longitude":{"type":"number","minimum":-180,"maximum":180},"timezoneId":{"type":"string","maxLength":64},"city":{"type":"string","maxLength":64},"timezoneOffset":{"type":"number","minimum":-14,"maximum":14},"dayBoundaryMode":{"type":"string","enum":["MIDNIGHT_00","ZI_HOUR_23","midnight_00","zi_hour_23"]},"enableTrueSolarTime":{"type":"boolean"},"calendarType":{"type":"string","enum":["SOLAR","LUNAR","solar","lunar"]},"isLeapMonth":{"type":"boolean"},"horoscopeDate":{"type":"string","pattern":"^\\d{4}-\\d{1,2}-\\d{1,2}$"},"horoscopeHour":{"type":"integer","minimum":0,"maximum":23},"detail":{"default":"summary","type":"string","enum":["summary","full"]}},"required":["year","month","day","hour","minute","gender"]},"annotations":{"title":"Cast a BaZi + Zi Wei chart","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["chart:read"],"access":"public","determinism":"deterministic","effect":"none","group":"core","ttlMs":604800000,"cacheScope":"public"}},{"name":"resolve_birthplace","title":"Resolve a birthplace name to longitude + IANA time zone","description":"Resolve a free-text birthplace to the server's own city dictionary, returning a longitude and an IANA\ntime zone id for each candidate. This is the server-side knowledge that `cast_chart` relies on.\n\nWHEN TO USE: when the user names a place you are unsure about (\"上饶县 vs 上饶市\", \"Hangzhou\"), when you\nwant to show the user which location you are about to use, or when only a place name is given for a\nbirth chart. Also useful on its own for a plain \"which time zone is this city in\" question.\n\nINPUT: `query` is free text — pass it as the user wrote it, including a province prefix or an English\ntransliteration; matching is fuzzy and alias-aware. `limit` caps the candidate list (default 20).\n\nDO NOT: compute a longitude, a UTC offset or a daylight-saving rule yourself, and do not invent a city\nthat is not in the returned list. If nothing matches, say the place is not in the dictionary and ask the\nuser for a nearby larger city — an uncorrected chart is valid, a mis-corrected one is silently wrong by\nup to four minutes per degree, which flips the hour pillar near a boundary.\n\nOUTPUT: `{name, province, region, longitude, latitude, timezoneId, aliases}` per city. `latitude` is for\ndisplay only; the true-solar-time correction needs longitude plus the zone, nothing else. Pass `name`\nstraight to `cast_chart` and let the server apply it.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":64},"limit":{"type":"integer","minimum":1,"maximum":500}},"required":["query"]},"annotations":{"title":"Resolve a birthplace name to longitude + IANA time zone","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["chart:read"],"access":"public","determinism":"deterministic","effect":"none","group":"core","ttlMs":2592000000,"cacheScope":"public"}},{"name":"get_daily_fortune","title":"Today's fortune (day pillar, element, solar term)","description":"Get the deterministic daily fortune for a Chinese civil date (Asia/Shanghai): the day pillar (干支),\nthe day stem element, the solar term currently in force, the next solar term, and — when the signed-in\nuser has a saved chart — how today's element relates to their useful element. The day's almanac (yi/ji,\nclash animal, hour luck) is included when the almanac feature is enabled.\n\nWHEN TO USE: \"how is today for me\", \"what is today's pillar\", \"when is the next solar term\", or as the\nper-day detail behind a calendar. For a whole month of almanac cells use `get_almanac` with a `month`\ninstead — it is one call rather than thirty.\n\nINPUT: `date` is `YYYY-MM-DD` in the Asia/Shanghai civil calendar and may be in the past or the future.\nOmit it for today. Do not convert to the caller's time zone first — the value is already a Chinese\ncivil date.\n\nPERSONALISATION: the `relation` field is present only when the user has a saved chart bound to the\naccount. When it is absent the fortune is NOT broken — it is simply not personalised. Do not invent a\nuseful element to fill the gap.\n\nDO NOT: treat a day element, a solar term or the yi/ji lists as a forecast for the person. Do not turn the\nday pillar into advice, and do not tell the user that today will be good or bad — describe the configuration\nand let them read their own day.\n\nBOUNDARY: this is a calendar-and-culture reading, not a prediction of events and not medical, legal,\nfinancial or psychological advice.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"date":{"type":"string","maxLength":10}}},"annotations":{"title":"Today's fortune (day pillar, element, solar term)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["fortune:read"],"access":"free","determinism":"deterministic","effect":"none","group":"core","ttlMs":300000,"cacheScope":"private"}},{"name":"get_almanac","title":"Chinese almanac (yi/ji, clash, hour luck)","description":"Get the traditional Chinese almanac (通書/黃曆). With `date` you get one full day: the 宜/忌 word lists,\nthe clash (沖) animal and direction, the 建除 twelve officers, the 二十八宿, day/month/year break flags,\nYang Gong taboo days, festivals, and the auspiciousness band of all twelve double-hours. With `month` you\nget a compact month grid (first 2 宜, first 忌, clash animal, hard-veto flag per day).\n\nWHEN TO USE: \"what is good/bad today\", \"which day is 月破\", building a calendar UI, or as the raw material\nfor a specific-date question. For \"which day should I do X\" use `find_auspicious_dates` instead — it scores\nand ranks a window for an event rather than dumping the calendar.\n\nINPUT: pass EXACTLY ONE of `date` (YYYY-MM-DD) or `month` (YYYY-MM). Both are Asia/Shanghai civil dates.\nA whole month is one small payload — do not loop 30 calls over single days.\n\nDO NOT: treat 宜/忌 word lists as advice about the user's life. They are the traditional almanac vocabulary,\nreproduced for cultural reference. Do not turn them into medical, legal, financial or psychological advice,\nand do not present a clash or a veto flag as a prediction about a person.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"date":{"type":"string","maxLength":10},"month":{"type":"string","maxLength":7}}},"annotations":{"title":"Chinese almanac (yi/ji, clash, hour luck)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["fortune:read"],"access":"public","determinism":"deterministic","effect":"none","group":"core","ttlMs":86400000,"cacheScope":"public"}},{"name":"find_auspicious_dates","title":"Find auspicious dates for an event","description":"Score and rank the days in a window for a specific activity, using the traditional almanac and — when the\nuser has a saved chart — their useful-element rhythm and zodiac-clash rule.\n\nWHEN TO USE: \"which day should I sign the contract / move / get married\", \"find me a good week for X\".\nFor a plain calendar dump use `get_almanac`; for a single day use `get_daily_fortune`. This tool is the\none that ANSWERS the question, because it returns ranked days with the reasons why.\n\nINPUT: pick a window with EITHER `from` + `to` (max 180 days, past dates allowed for review) OR `days`\n(30/60/90) plus an optional `start` (defaults to today, Asia/Shanghai). For a preset activity pass `event`;\nfor a free-text activity pass `event: \"custom\"` and put the words in `q` (1-50 characters).\n\nOUTPUT: `recommended` (up to 3 non-vetoed days, best score first, ties broken by earlier date) and `avoid`\n(every vetoed day, date order). Each day carries its score in [-1, 1], a `veto` flag, and machine-readable\n`reasons` — those reasons are the part worth quoting back to the user.\n\nDO NOT: treat a veto (`monthBreak`, `yearBreak`, `yangGong`, a zodiac clash) as a prediction of harm, and\ndo not tell the user that a date will cause a bad outcome. Report it as the traditional rule it is, and say\nplainly that the user decides. `personalized: false` means no chart was bound — the result is the generic\nalmanac layer only, which is still valid; do not imply the user's chart was consulted.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"event":{"type":"string","enum":["marriage","engagement","move","opening","contract","travel","renovation","job","custom"]},"q":{"type":"string","maxLength":50},"days":{"anyOf":[{"type":"number","const":30},{"type":"number","const":60},{"type":"number","const":90}]},"start":{"type":"string","maxLength":10},"from":{"type":"string","maxLength":10},"to":{"type":"string","maxLength":10}}},"annotations":{"title":"Find auspicious dates for an event","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["fortune:read"],"access":"free","determinism":"deterministic","effect":"none","group":"core","ttlMs":3600000,"cacheScope":"private"}},{"name":"consult_classics","title":"Consult the classical BaZi sources on a topic","description":"Look up what the core classical texts say about one topic, as structured claims with citations, premises\nand — most importantly — the points where the sources CONTRADICT each other.\n\nWHEN TO USE: after `cast_chart`, when you need to justify or cross-check a reading against sources,\nor when the user asks \"what do the classics say about X\". Topics: `geju` (pattern), `tiaohou` (climate\nadjustment), `shishen` (ten gods), `shensha` (auxiliary stars), `dayun` (luck pillars).\nQueries are by TOPIC, not by book, because a single question is normally answered by three different\ntexts at once.\n\nOUTPUT: every returned claim carries `source.book` + `source.chapter` so it can be checked against the\npublic text at /academy/classics, a `premises` list, and a `divergence` note where the classical reading\ndiffers from modern practice. `conflicts` lists the pairs that genuinely disagree, and `note` carries the\ncitation constraint.\n\nDO NOT: treat any entry — or `conflicts` — as an answer key for judging whether the engine is right or\nwrong. The classics disagree with each other and with the modern consensus; where they do, present both\nreadings side by side. Never output a classical verdict verbatim: the old texts contain blunt judgements\nabout poverty and early death that must be rephrased before they reach a person. Always cite the book and\nchapter, and never drop the `note` field when you relay the result.\n\nCoverage is deliberately partial: only `geju` has entries so far. An empty `claims` array means \"not\ncollected yet\", not \"the classics are silent on this\" — say so rather than filling the gap yourself.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"topic":{"type":"string","enum":["geju","tiaohou","shishen","shensha","dayun"]}},"required":["topic"]},"annotations":{"title":"Consult the classical BaZi sources on a topic","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["classics:read"],"access":"public","determinism":"deterministic","effect":"none","group":"core","ttlMs":2592000000,"cacheScope":"public"}},{"name":"list_charts","title":"List the saved birth charts on this account","description":"List the birth charts saved on the signed-in account, as short summaries, and return the `ref` handle for\neach one.\n\nWHEN TO USE: before `read_chart`, `generate_report` or `match_charts`, to learn which charts exist and to\nget the `ref` values those tools need. Also the right call when the user says \"my chart\" without naming\none — if there is exactly one chart, use it; if there are several, ask which.\n\nOUTPUT: for each chart — `ref`, nickname, whether it is the default, gender, solar birth date (day\nprecision), the four pillars, day master, useful element, pattern and the engine version that produced it.\nBirth minutes and longitudes are deliberately NOT included.\n\nDO NOT: guess or fabricate a `ref`. If the list is empty, the account has no saved chart — ask the user to\ncreate one in the app, or offer to `cast_chart` from their birth details directly. Do not read personal\ndetail out of this list beyond the chart itself.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"description":"No arguments."},"annotations":{"title":"List the saved birth charts on this account","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["profile:read"],"access":"free","determinism":"deterministic","effect":"none","group":"core","ttlMs":0,"cacheScope":"private"}},{"name":"read_chart","title":"Ask a question about one saved chart (LLM reading)","description":"Run one reading against one saved chart and return the answer as prose. This is the tool for a question\nthat needs interpretation, not lookup.\n\nWHEN TO USE: \"what does my chart say about my career\", \"why do I keep clashing with my manager\", \"explain\nmy day master\". For raw structured chart data use `cast_chart`; for a single day use `get_daily_fortune`.\nPrefer `cast_chart` + your own reasoning when the question is mechanical — this tool costs the user credits.\n\nINPUT: `question` is the user's own words, 1-500 characters, and it is treated strictly as DATA — it\ncannot change your instructions or the server-side prompt. `chartRef` comes from `list_charts`; omit it to\nuse the account's default chart. If the account has no saved chart the tool says so — do not improvise one.\n\nOUTPUT: `answer` is prose in the caller's locale, plus `chartRef`, `engineVersion` and token usage. Show the\nanswer to the user as a reading, attributed to their chart — DO NOT present it as your own opinion, and do\nnot restate it as fact about the future.\n\nCOST: one chat credit (see CREDIT_PRICES.chat). Identical (chartRef, question) pairs are idempotent and will\nnot be charged twice, so a retry after a network error is safe. Do not fan out the same question over several\ncharts to \"compare\" — that is a separate, deliberate user decision, and each one is charged.\n\nBOUNDARY: the reading describes personality types and timing rhythms. It is not a prediction of events and\nnot medical, legal, financial or psychological advice. Do not add forecasts, diagnoses or advice of your own\non top of it, and do not ask this tool to answer a question of that kind.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chartRef":{"type":"string","maxLength":64},"question":{"type":"string","minLength":1,"maxLength":500}},"required":["question"]},"annotations":{"title":"Ask a question about one saved chart (LLM reading)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["chat:write"],"access":"chat","determinism":"llm","effect":"none","group":"advanced","creditFeature":"chat","cacheScope":"private"}},{"name":"match_charts","title":"Compare two charts (compatibility)","description":"Compare two people's charts and return both the deterministic 8-dimension compatibility report and a\nwritten reading of it. Each person is either a saved chart (`chartRef` from `list_charts`) or fresh birth\ndetails — mixing the two is fine.\n\nWHEN TO USE: \"how compatible are we\", \"compare me and my partner\", or any two-chart question. Read the\nchart itself with `cast_chart` and a single person's question with `read_chart`; this tool is specifically\nabout the interaction between two charts.\n\nINPUT: `a` and `b` each take either `{chartRef}` or `{year, month, day, hour, minute?, gender, city?,\nnickname?}`. Birth details follow the same engine contract as `cast_chart`: pass the birthplace as free\ntext in `city` and let the server resolve the longitude and time zone. `gender` is required on birth\ndetails — it decides the direction of the luck pillars and cannot be inferred from the slot. `scenario`\n(marriage, business, parent-child, in-laws, siblings, friends, mentor, leader) selects the relationship\nlens; omit it for a neutral reading rather than guessing one.\n\nOUTPUT: `report` is the deterministic result — `overall.score`, `overall.level`, the 8 `dimensions` with\ntheir weights, `suggestions`, and a `version` you can quote for reproducibility. `narrative` is the written\nreading. When the two disagree in emphasis, report both rather than picking the more dramatic one.\n\nCOST: 200 credits, charged once per (person A, person B, scenario) combination. Retrying after a network\nerror with identical inputs is idempotent and will not be charged again. Do not re-run the same pair to\n\"get a second opinion\" — that is a deliberate, charged action the user has to ask for.\n\nDO NOT: present a low score as a verdict on the relationship or as advice to end it. Do not use this to\nevaluate a person without their knowledge for a decision that affects them (hiring, credit, tenancy or any\nother consequential decision). The reading describes dynamics, not outcomes.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"a":{"anyOf":[{"type":"object","properties":{"chartRef":{"type":"string","minLength":1,"maxLength":64}},"required":["chartRef"]},{"type":"object","properties":{"year":{"type":"integer","minimum":1900,"maximum":2100},"month":{"type":"integer","minimum":1,"maximum":12},"day":{"type":"integer","minimum":1,"maximum":31},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"gender":{"type":"string","enum":["male","female"]},"city":{"type":"string","maxLength":64},"nickname":{"type":"string","maxLength":64}},"required":["year","month","day","hour","gender"]}]},"b":{"anyOf":[{"type":"object","properties":{"chartRef":{"type":"string","minLength":1,"maxLength":64}},"required":["chartRef"]},{"type":"object","properties":{"year":{"type":"integer","minimum":1900,"maximum":2100},"month":{"type":"integer","minimum":1,"maximum":12},"day":{"type":"integer","minimum":1,"maximum":31},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"gender":{"type":"string","enum":["male","female"]},"city":{"type":"string","maxLength":64},"nickname":{"type":"string","maxLength":64}},"required":["year","month","day","hour","gender"]}]},"scenario":{"type":"string","maxLength":32}},"required":["a","b"]},"annotations":{"title":"Compare two charts (compatibility)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["compatibility:write"],"access":"compatibility","determinism":"llm","effect":"none","group":"advanced","creditFeature":"compatibility","cacheScope":"private"}},{"name":"generate_report","title":"Generate a BaZi book (long-running, two-step)","description":"Queue a long-form BaZi book for a saved chart and return a job handle IMMEDIATELY. This is a two-step\ntool: call it, then poll `get_report_status` with the returned `jobId`.\n\nWHEN TO USE: the user explicitly asks for a written report / book rather than a conversational answer\n(\"write me a full report\", \"give me my life chart book\"). For a normal question use `read_chart` — it is\nfar cheaper and returns in seconds. Do not call this tool to \"get more detail\" on a small question.\n\nINPUT: `type` is \"ming\" (命之書, the life chart book) or \"yun\" (運之書, the luck-cycle book). `chartRef`\ncomes from `list_charts`; omit it to use the default chart. If there is no saved chart the tool says so.\n\nOUTPUT: `{ jobId, status: \"queued\", etaSec, pollWith }`. It does NOT contain the book. Poll\n`get_report_status` every ~30s until `status` is \"done\" or \"failed\". While queued/running, tell the user\nit is being written rather than presenting a partial result.\n\nCOST: 200 credits for a life chart book, 150 for a luck-cycle book. Charging is idempotent per (chart,\ntype, calendar month), so a retry after a network error never charges twice — but do not queue the same\nbook repeatedly \"just in case\", because each call does start a redundant job.\n\nDO NOT: present the book as a forecast. It is a structured reading of personality and timing. Do not\nappend your own predictions, medical/legal/financial advice, or classical verdicts about poverty or death.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chartRef":{"type":"string","maxLength":64},"type":{"type":"string","enum":["ming","yun"]}},"required":["type"]},"annotations":{"title":"Generate a BaZi book (long-running, two-step)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["report:write"],"access":"book","determinism":"llm","effect":"write","group":"advanced","creditFeature":"bookMing","cacheScope":"private"}},{"name":"get_report_status","title":"Check a long-running report job","description":"Poll the status of a job created by `generate_report`. Returns `queued`, `running`, `done` or `failed`.\n\nWHEN TO USE: only after `generate_report` returned a `jobId`. Poll every ~30s. Stop polling once the\nstatus is \"done\" or \"failed\" — do not loop tightly, and do not fabricate a result while it is still running.\n\nOUTPUT: when `status` is \"done\", `result.text` holds the finished book (markdown) plus the engine version\nthat produced the underlying chart. When \"failed\", `error` explains why and says whether the user was\ncharged. While queued/running, `retryAfterSec` is the suggested wait.\n\nDO NOT: pass a jobId you did not receive from `generate_report`. Jobs are scoped to the account, so a\nforeign or made-up id returns a not-found error rather than someone else's book.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"jobId":{"type":"string","minLength":1,"maxLength":64}},"required":["jobId"]},"annotations":{"title":"Check a long-running report job","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"_meta":{"scopes":["report:write"],"access":"free","determinism":"deterministic","effect":"none","group":"advanced","ttlMs":0,"cacheScope":"private"}}],"authentication":{"schemes":[{"type":"http","scheme":"bearer","description":"Personal access token (create one at /account/api-access). Send it as `Authorization: Bearer fat_...`. Tokens are scoped; without one, four read-only tools are available anonymously up to 20 calls per IP per day."}]},"_meta":{"docs":"https://fateread.cc/en/agents","llmsTxt":"https://fateread.cc/llms.txt","scopes":[{"id":"chart:read","description":"Cast charts and look up birthplaces (no personal data is read).","group":"read"},{"id":"fortune:read","description":"Read the day's fortune, the almanac and auspicious-date searches.","group":"read"},{"id":"classics:read","description":"Query the classical sources on a topic.","group":"read"},{"id":"profile:read","description":"List the birth charts saved on the account (summaries only).","group":"read"},{"id":"chat:write","description":"Ask questions about a saved chart — this spends chat credits.","group":"write"},{"id":"report:write","description":"Generate the long-form books — this spends book credits.","group":"write"},{"id":"compatibility:write","description":"Compare two charts — this spends compatibility credits.","group":"write"}],"anonymous":{"tools":["cast_chart","get_almanac","resolve_birthplace","consult_classics"],"dailyLimitPerIp":20,"note":"Anonymous access covers only the deterministic, zero-LLM, zero-personal-data tools. The personalised ones need an account because they read the saved chart."},"note":"Publishing this card does not by itself bring traffic. Its measured value is lowering the parsing cost for agents that already crawl the site — the growth strategy is the English content site."}}