mkna: Ecuador's official documents
Search and quote every law, decree, resolution, ruling and ordinance Ecuador publishes.
Should I use this
Quality & Safety
Findings (1)
- LOWin fetch
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": {
"mkna": {
"url": "https://mcp.mkna.ai/mcp"
}
}
}Remote endpoints
https://mcp.mkna.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢search(query, family, kind, category, sector, ...)
Find passages in every document Ecuadorian public institutions publish. Start every question here. `query`: words or a question, best in Spanish, as the documents are ("inversión extranjera en minería", "Decreto Ejecutivo 489", "Art. 15 Ley de Minería"); English works less well. Filters, each one value or several comma-separated, all optional: `family` (a publisher key from `catalog`, e.g. 'registro_oficial'), `kind` (the kind the publisher printed, e.g. 'resolución', or a normalised one: ley, codigo, reglamento, decreto, resolucion, acuerdo, ordenanza, sentencia...), `category` (normativa | comunicacion | otros), `sector` (a sector of `catalog` such as 'ley' or 'local', or an economic one such as 'mineria'), `topic` (e.g. 'inversion_extranjera', 'tributario'), `published_from` / `published_to` (ISO dates or years), `document_id` (search inside one document), `sort` (relevance | newest), `limit` (<= 20, default 8). Returns `results`: each a passage, verbatim, with `id` (the passage id, for `fetch`), `document_id`, `title`, `instrument`, `publisher`, `family`, `kind`, `published`, `url`, `page`, `heading` and `text` (<= 1,200 chars); Court rulings also have `abstract` when their Court-written Resumen is present. `facets` counts the documents of the wider candidate set by family, kind and year: search again with one of them as a filter to narrow. Next: `fetch` the two or three best results; quote with title, page and url.
Input Schema
{
"type": "object",
"properties": {
"query": {
"title": "Query",
"type": "string"
},
"family": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Family"
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Kind"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Category"
},
"sector": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sector"
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Topic"
},
"published_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Published From"
},
"published_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Published To"
},
"document_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Document Id"
},
"sort": {
"default": "relevance",
"title": "Sort",
"type": "string"
},
"limit": {
"default": 8,
"title": "Limit",
"type": "integer"
}
},
"required": [
"query"
],
"title": "searchArguments"
}🟢fetch(id)
Read one document, or one passage in its context, by the id `search`, `documents` or `citations` gave. A passage id (the `id` of a search result) returns the document's card and that passage with the one before and after it. A document id (`document_id`) returns the document's text, verbatim, with a [p. N] marker before each page, up to 60,000 characters; beyond that the answer says `truncated: true` and `next` names the `read` call for the following pages. Returns `id`, `title`, `text`, `url` (the publisher's address: cite it) and `metadata` (the card: instrument, kind, publisher, published date, pages, classification, Court-written `abstract` for rulings when present, and `cited_by`: how many documents in the corpus amend, repeal or cite this one). Next: `read` for more pages or one article, `citations` for what it applies and what changed it.
Input Schema
{
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "string"
}
},
"required": [
"id"
],
"title": "fetchArguments"
}🟢read(document_id, page_from, page_to, article, max_chars)
Read part of a long document: a range of pages, or one article. Pass `document_id` and either `page_from` (and optionally `page_to`), as `fetch`'s `next` suggests, or `article` ('15', 'Art. 15', 'primero', 'único') for that article's full text, however many pages it spans. `max_chars` is at most 40,000 (the default). Returns the text verbatim with a [p. N] marker before each page, `path` (where the window starts in the document's structure: título, capítulo, artículo), `url`, and, when the window did not fit, `truncated: true` with `next` for the following call. To find a phrase in a long document instead of paging through it, use `search` with its `document_id`.
Input Schema
{
"type": "object",
"properties": {
"document_id": {
"title": "Document Id",
"type": "string"
},
"page_from": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Page From"
},
"page_to": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Page To"
},
"article": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Article"
},
"max_chars": {
"default": 40000,
"title": "Max Chars",
"type": "integer"
}
},
"required": [
"document_id"
],
"title": "read_windowArguments"
}🟢citations(document_id, direction, relation, limit)
What a document cites, amends or repeals, or which documents cite, amend or repeal it. `direction`: 'out' (default) for the instruments this document refers to - the law it applies, the articles it amends, what it repeals, the rulings it cites; 'in' for the documents in the corpus that refer to this one, newest first - later reforms, repeals, regulations, rulings. `relation` narrows to one of cites, amends, repeals, regulates, replaces, applies. `limit` <= 100. Returns `citations`, each edge with the verbatim `quote` and the `page` it is on. 'out' edges name the target as written (`target_label`, `target_article`) and its `target_document_id` when the target is in the corpus (then `fetch` or `read` it); 'in' edges carry the citing document's id, title, date and url. An amendment found here is evidence of a change with its source, not a statement of what is in force.
Input Schema
{
"type": "object",
"properties": {
"document_id": {
"title": "Document Id",
"type": "string"
},
"direction": {
"default": "out",
"title": "Direction",
"type": "string"
},
"relation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Relation"
},
"limit": {
"default": 50,
"title": "Limit",
"type": "integer"
}
},
"required": [
"document_id"
],
"title": "citationsArguments"
}🟢documents(family, kind, category, sector, topic, ...)
List documents newest first, without a query: "the latest resolutions of the SRI", "what did the Registro Oficial publish in March 2024", "recent ordinances on mining". Filters as in `search`, each optional, one value or several comma-separated: `family`, `kind`, `category` (normativa | comunicacion | otros), `sector`, `topic`, `published_from`, `published_to`. 20 documents a page; pass the answer's `cursor` to get the next page. Returns `documents`: `document_id`, `title`, `instrument`, `kind`, `family`, `publisher`, `published`, `url`, `pages` when its text is held (`text: false` when it is not yet), and its classification (`sectors`, `topics`, `nature`) when it has one. Court rulings carry their Court-written `abstract` when present. Next: `fetch` one.
Input Schema
{
"type": "object",
"properties": {
"family": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Family"
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Kind"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Category"
},
"sector": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sector"
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Topic"
},
"published_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Published From"
},
"published_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Published To"
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cursor"
}
},
"title": "documentsArguments"
}🟢catalog(sector)
What exists: every publisher (family) with how many documents it has and how many have text. Call it to learn the valid `family` keys and the kinds each publisher prints before filtering `search` or `documents`, or to judge whether a missing answer means a gap in the corpus. `sector` narrows to one group of families (e.g. 'ley', 'ejecutivo', 'control', 'local'). Returns `sectors`, each with its `families`: `key`, `label`, `documents` (listed), `with_text` and `newest` (latest publication date); with `sector`, also `publisher`, `stored` (file held), `classified` and `kinds` (the kinds it prints most, with counts). Families with nothing yet are named in `without_documents`. Also, over the classified documents: `instrument_kinds`, `sectors_classified` and `topics`, the values `kind`, `sector` and `topic` take.
Input Schema
{
"type": "object",
"properties": {
"sector": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sector"
}
},
"title": "catalogArguments"
}Community
Evidence