Good Morning Maldives
Read-only Maldives news, researched entity records, source documents and economy data.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"newsroom": {
"url": "https://www.goodmorningmaldives.com/mcp"
}
}
}Remote endpoints
https://www.goodmorningmaldives.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
π’search_site(q, limit, cursor, lang)
Searches the whole publication at once and says what kind each hit is: news articles, First Light items, entity records, projects, source documents and tracker pages. This is the broad search β prefer it when the question is not already about one kind of thing, because search_articles and the other per-kind tools look only in their own kind. Matching ignores case AND accents, so "Male" finds "MalΓ©"; a query wrapped in slashes (/min(istry|ister)/) is a regular expression. Every hit carries the canonical URL to cite. Searches the most recent 400 stories and 45 First Light editions, and all reference records. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value. The cursor moves every kind on together: each page shows the next `limit` hits of each kind.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words to look for, or /a regular expression/."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 8,
"description": "Hits to return per kind (1-25, default 8)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"q"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Every hit across all kinds, not just this page."
},
"groups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"description": "What the hits are, e.g. \"News articles\" or \"Projects\"."
},
"found": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Hits of this kind in all."
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"note": {
"type": "string"
},
"snippet": {
"type": [
"string",
"null"
]
}
},
"required": [
"title",
"url"
],
"additionalProperties": false
}
}
},
"required": [
"kind",
"found",
"rows"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"query",
"total",
"groups"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’search_articles(q, section, from, to, limit, ...)
Full-text search of published GMM news articles (title, summary, body), newest first, with an optional desk (section slug) and date range. Partner content is excluded. Matching is the content store's: the words are matched as whole-word prefixes and accents count, so "Male" does NOT find "MalΓ©". For a forgiving search, or one that also covers First Light, entity records, projects, documents and tracker pages, use search_site. Each result carries the canonical URL to cite. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words to search for."
},
"section": {
"type": "string",
"description": "Desk slug, e.g. economy."
},
"from": {
"type": "string",
"description": "Earliest publication date, YYYY-MM-DD (Maldives time)."
},
"to": {
"type": "string",
"description": "Latest publication date, YYYY-MM-DD, inclusive."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10,
"description": "Results to return (1-50, default 10)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"q"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"articles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"slug": {
"type": [
"string",
"null"
]
},
"url": {
"type": [
"string",
"null"
]
},
"publishedAt": {
"type": [
"string",
"null"
]
},
"section": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
}
},
"required": [
"title",
"slug",
"url",
"publishedAt",
"section",
"author",
"summary"
],
"additionalProperties": false
}
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "All matching stories, not just this page."
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"articles",
"total"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_recent_articles(section, limit, cursor, lang)
The newest published GMM news articles, optionally from one desk (section slug). Partner content is excluded. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"section": {
"type": "string",
"description": "Desk slug, e.g. economy."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10,
"description": "Results to return (1-50, default 10)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"articles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"slug": {
"type": [
"string",
"null"
]
},
"url": {
"type": [
"string",
"null"
]
},
"publishedAt": {
"type": [
"string",
"null"
]
},
"section": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
}
},
"required": [
"title",
"slug",
"url",
"publishedAt",
"section",
"author",
"summary"
],
"additionalProperties": false
}
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "All matching stories, not just this page."
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"articles",
"total"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_article(slug, lang)
The full text of one published article as markdown, with headline, byline, key takeaways and references, ending in its canonical URL. Partner content is returned labelled as partner content, not GMM journalism.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The article slug, the last part of its /news/ URL."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"partner": {
"type": "boolean",
"description": "True for partner content, which is not GMM journalism."
}
},
"required": [
"url",
"partner"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_page_markdown(path, lang)
Reads any public GMM page as clean markdown, the same text the site serves at the page address with .md appended. Use it to follow a link from another result: /news/<slug>, /partner/<slug>, /briefs/<YYYY-MM-DD>, /entities (index) and /entities/<slug> (a researched dossier), /documents and /documents/<slug>, /projects and /projects/<slug>, /sections/<slug>, /topics/<slug>, /news and the home page /. Every page ends with its canonical URL. Paths outside that set are refused with a message.
Input Schema
{
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "A site path starting with /, e.g. /entities/eagle-hills. A /dv prefix selects Dhivehi."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"path"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_first_light(date, lang)
One edition of First Light, the daily morning brief, as markdown: its key number and numbered snippets with links. Omit date for the latest published edition. Only editions already released to readers are available.
Input Schema
{
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Edition date YYYY-MM-DD. Default: the latest published edition."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"date": {
"type": "string"
},
"title": {
"type": [
"string",
"null"
]
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"previous": {
"description": "Date of the previous edition.",
"type": [
"string",
"null"
]
},
"next": {
"description": "Date of the next edition.",
"type": [
"string",
"null"
]
}
},
"required": [
"date",
"url",
"previous",
"next"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_first_light(limit, cursor, lang)
The archive of published First Light morning briefs, newest first, with each edition date, title and snippet count. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 45,
"default": 10,
"description": "Results to return (1-45, default 10)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"editions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"title": {
"type": "string"
},
"standfirst": {
"type": [
"string",
"null"
]
},
"snippets": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"keyNumber": {
"type": [
"string",
"null"
]
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"date",
"title",
"snippets",
"keyNumber",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"editions"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_entity_categories(lang)
The categories GMM files its entity records under β people, companies, institutions, places and the rest β with each one's slug and how many records it holds. Read this first when you want to narrow a search: the slug is what the `type` argument of list_entities and search_entities takes.
Input Schema
{
"type": "object",
"properties": {
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"label": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"records": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"slug",
"label",
"records"
],
"additionalProperties": false
}
},
"uncategorised": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Records with no category set."
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"categories",
"uncategorised",
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’search_entities(q, type, limit, cursor, lang)
Searches GMM's researched entity records (people, companies, institutions, places) by name, role or summary. Open a match with get_entity_record. Filter by type slug. Matching is the content store's substring match and accents count, so "Male" does not find "MalΓ©"; search_site folds accents and searches every kind at once. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Name or words to look for."
},
"type": {
"type": "string",
"description": "Category slug, e.g. company or person. list_entity_categories has the slugs in use."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10,
"description": "Results to return (1-25, default 10)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"q"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"entities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"type": {
"type": [
"string",
"null"
]
},
"typeSlug": {
"type": [
"string",
"null"
]
},
"role": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"summary": {
"type": [
"string",
"null"
]
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "All matching records, not just this page."
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"entities",
"total"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_entities(type, limit, cursor, lang)
The index of GMM entity records, grouped by category (people, companies, institutions, places), optionally limited to one category slug β list_entity_categories has the slugs. Each record has a canonical URL, and says whether it carries a graded dossier. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Entity type slug."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Results to return (1-100, default 50)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "All matching records, not just this page."
},
"entities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"type": {
"type": [
"string",
"null"
]
},
"typeSlug": {
"type": [
"string",
"null"
]
},
"role": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"dossier": {
"description": "True when the record carries a graded dossier.",
"type": [
"boolean",
"null"
]
},
"coverage": {
"description": "Published stories that reference the record.",
"type": [
"number",
"null"
]
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"total",
"entities"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_entity_record(slug, lang)
GMM's researched record of one entity: the dossier as markdown, plus the full record as structured data. Each fact carries a #fact-<id> anchor (cite as <canonical URL>#fact-<id>) and a grade, and the record has a recordRevision; cite both per the guide at /about/citing-gmm. This is GMM's own graded research, not company-supplied material.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The entity slug, the last part of its /entities/ URL."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"citingGuide": {
"type": "string"
},
"recordRevision": {
"type": [
"number",
"null"
]
},
"record": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The full structured record, as the content store holds it."
}
},
"required": [
"url",
"citingGuide",
"recordRevision",
"record"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’search_documents(q, limit, cursor, lang)
Searches primary-source documents (laws, budgets, contracts, reports) by title, summary or reference. Open a match with get_document. Matching is the content store's substring match and accents count; search_site folds accents and searches every kind at once. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words or a reference number."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25,
"default": 10,
"description": "Results to return (1-25, default 10)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"q"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"reference": {
"type": [
"string",
"null"
]
},
"issuingBody": {
"type": [
"string",
"null"
]
},
"dateIssued": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "All matching documents, not just this page."
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"documents",
"total"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_documents(limit, cursor, lang)
The independent source library, newest first. Company-supplied documents are not listed here. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 30,
"description": "Results to return (1-100, default 30)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"type": {
"type": [
"string",
"null"
]
},
"issuingBody": {
"type": [
"string",
"null"
]
},
"reference": {
"type": [
"string",
"null"
]
},
"dateIssued": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"total",
"documents"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_document(slug, lang)
One primary-source document: issuer, reference, dates, GMM plain-language summary, the file link and the news coverage that cites it, as markdown ending in its canonical URL.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The document slug, the last part of its /documents/ URL."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"document": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"reference": {
"type": [
"string",
"null"
]
},
"fileUrl": {
"type": [
"string",
"null"
]
}
},
"required": [
"fileUrl"
],
"additionalProperties": false
}
},
"required": [
"url",
"document"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_projects(status, limit, cursor, lang)
GMM project tracker: public projects with status, value, employer and contractor, newest first. Optionally one status, e.g. under-construction or delayed. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "announced, procurement, contracted, under-construction, delayed, on-hold, completed or cancelled."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 30,
"description": "Results to return (1-100, default 30)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"projects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
]
},
"value": {
"type": [
"number",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"employer": {
"type": [
"string",
"null"
]
},
"contractor": {
"type": [
"string",
"null"
]
},
"expectedCompletion": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"employer",
"contractor",
"slug",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"total",
"projects"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_project(slug, lang)
One tracked project: parties, value, financing, status against schedule, variations, documents and coverage, as markdown ending in its canonical URL.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The project slug, the last part of its /projects/ URL."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"required": [
"slug"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"status": {
"type": [
"string",
"null"
]
},
"value": {
"type": [
"number",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_tracker_series(theme, limit, cursor)
The economy tracker's catalogue: Maldives Monetary Authority statistical series grouped by theme, each with its latest figure and year-on-year change. Open one with get_tracker_series. Says so plainly if the tracker database is unavailable. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"theme": {
"type": "string",
"description": "Theme id: growth, tourism, prices, fiscal, money or external."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"default": 100,
"description": "Results to return (1-200, default 100)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "False when the tracker database could not be reached; the other fields are then absent."
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"name": {
"type": "string"
},
"theme": {
"type": "string"
},
"group": {
"type": "string"
},
"unit": {
"type": "string"
},
"frequency": {
"type": "string"
},
"latest": {
"anyOf": [
{
"type": "object",
"properties": {
"date": {
"type": "string"
},
"value": {
"type": "number"
}
},
"required": [
"date",
"value"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"yearOnYear": {
"type": [
"number",
"null"
]
},
"stale": {
"type": "boolean"
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
}
},
"required": [
"id",
"name",
"theme",
"group",
"unit",
"frequency",
"latest",
"yearOnYear",
"stale",
"url"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"available",
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’get_tracker_series(id, points)
One economy tracker series: unit, frequency, source, the revision versions MMA has published and the latest observations. Says so plainly if the tracker database is unavailable.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Series id from list_tracker_series."
},
"points": {
"type": "integer",
"minimum": 1,
"maximum": 240,
"default": 60,
"description": "Latest observations to return (1-240, default 60)."
}
},
"required": [
"id"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"available": {
"type": "boolean",
"description": "False when the tracker database could not be reached; the other fields are then absent."
},
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"meta": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"name": {
"type": "string"
},
"sector": {
"type": "string"
},
"path": {
"type": "array",
"items": {
"type": "string"
}
},
"unit": {
"type": "string"
},
"frequency": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"isFlow": {
"type": "boolean"
},
"isStock": {
"type": "boolean"
},
"isInt": {
"type": "boolean"
},
"isLatestMissing": {
"type": "boolean"
},
"conversionMethod": {
"type": [
"string",
"null"
]
},
"source": {
"type": "array",
"items": {
"type": "string"
}
},
"sourceUpdatedAt": {
"type": [
"string",
"null"
]
},
"currentVersion": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"lastCheckedAt": {
"type": [
"string",
"null"
]
},
"lastChangedAt": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"name",
"sector",
"path",
"unit",
"frequency",
"description",
"isFlow",
"isStock",
"isInt",
"isLatestMissing",
"conversionMethod",
"source",
"sourceUpdatedAt",
"currentVersion",
"lastCheckedAt",
"lastChangedAt"
],
"additionalProperties": false
},
"versions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"fetchedAt": {
"type": "string"
},
"sourceUpdatedAt": {
"type": [
"string",
"null"
]
},
"pointCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"firstDate": {
"type": [
"string",
"null"
]
},
"lastDate": {
"type": [
"string",
"null"
]
},
"added": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"revised": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"removed": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"maxAbsRevision": {
"type": "number"
}
},
"required": [
"version",
"fetchedAt",
"sourceUpdatedAt",
"pointCount",
"firstDate",
"lastDate",
"added",
"revised",
"removed",
"maxAbsRevision"
],
"additionalProperties": false
}
},
"points": {
"description": "Latest observations as [date, value], oldest first.",
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "number"
}
],
"items": false,
"minItems": 2,
"maxItems": 2
}
}
},
"required": [
"available",
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}π’list_indicators(dashboard, limit, cursor, lang)
The indicators GMM charts in its articles and dashboards (tourism, fiscal, trade, state-owned enterprises), each with its unit, source note and the latest 24 observations. Pages are at /dashboard. Paginates: when more results remain, the structured answer has a nextCursor (absent on the last page). To continue, call this tool again with the same arguments and cursor set to that value.
Input Schema
{
"type": "object",
"properties": {
"dashboard": {
"type": "string",
"description": "Dashboard group: tourism-economy, sovereign-fiscal, trade-external, soe or other."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 30,
"description": "Results to return (1-100, default 30)."
},
"cursor": {
"type": "string",
"description": "Continue a previous result: the nextCursor it returned, unchanged. Only valid with the same other arguments (limit may differ)."
},
"lang": {
"type": "string",
"enum": [
"en",
"dv"
],
"default": "en",
"description": "en (English) or dv (Dhivehi)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL to cite."
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"indicators": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"dashboard": {
"type": [
"string",
"null"
]
},
"unit": {
"type": [
"string",
"null"
]
},
"frequency": {
"type": [
"string",
"null"
]
},
"sourceNote": {
"type": [
"string",
"null"
]
},
"points": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"value": {
"type": "number"
},
"provisional": {
"type": "boolean"
}
},
"required": [
"date",
"value",
"provisional"
],
"additionalProperties": false
},
"description": "The latest 24 observations, oldest first."
}
},
"required": [
"slug",
"points"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Opaque cursor for the next page: pass it back as the cursor argument, with the same other arguments. Absent on the last page.",
"type": "string"
}
},
"required": [
"url",
"total",
"indicators"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}Community
Evidence