sweden-parliament-mcp-server
Server Details
Search Swedish parliamentary documents, speeches, votes, members, and statutes.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/sweden-parliament-mcp-server
- GitHub Stars
- 0
- Server Listing
- Sweden Parliament MCP Server
TDQS
Scored across 7 tools
The set splits cleanly into three verbs over distinct resources: sky search_* tools locate items, get_* tools read a single item by exact ID, and list_reference is an offline catalog lookup. Boundaries are explicitly stated in descriptions (e.g., search_documents points to get_document for status/text; search_members points to get_member for assignment history), so an agent can pick correctly. get_votes is dual-mode (report vs member) but covers a single resource and is not confusable with the others.
Every tool uses the same riksdag_ prefix followed by a verb_noun pattern (get_document, get_member, get_votes, list_reference, search_documents, search_members, search_speeches). Verb choice is meaningful and consistent across resources, with no camelCase or stylistic drift.
Seven tools is well within a sensible range and each covers a distinct need (documents, members, votes, speeches, reference data). Nothing looks redundant or padded, and the read-only surface is matched to a read-only source.
Coverage is strong: search+read for documents, members and speeches, plus votes and a reference catalog, which covers the core research workflows. Minor gaps exist — there is no dedicated session/browse tool (the reference session catalog is noted as lagging), and speech text is reached only through search get-mode rather than a standalone reader.
Available Tools
7 toolsriksdag_get_documentRead parliamentary documentARead-onlyIdempotentInspect
Read a document status, decisions, linked records and text. Select sections and follow complete continuation calls to read long reports or consolidated SFS statutes. SFS text is consolidated published text, not a point-in-time legal version.
| Name | Required | Description | Default |
|---|---|---|---|
| revision | No | Revision returned by a previous call; rejects changed records. | |
| sections | No | Select metadata, decisions, reservations, activities, properties, attachments, references, stakeholders, text or source_html. Omit for metadata, complete outline and first text page. | |
| documentId | Yes | Document ID from riksdag_search_documents, or unambiguous SFS YYYY:N identifier. | |
| htmlLength | No | Explicit source HTML length in code points; defaults start at 8000 and fit the complete response; explicit lengths are honored. | |
| htmlOffset | No | Source HTML offset in Unicode code points. | |
| textLength | No | Explicit text length in code points; defaults start at 8000 and fit the complete response; explicit lengths are honored. | |
| textOffset | No | Text offset in Unicode code points. | |
| sectionLimit | No | Requested entries per selected array section; applied maximum 100. | |
| sectionOffset | No | Offset applied independently to each selected array section. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Selected canonical text page, unchanged on both surfaces. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether the source record exists. |
| source | No | Required attribution to the Swedish Parliament. |
| notices | No | All applicable notices, including an empty list. |
| outline | No | Every selectable section and its complete size. |
| guidance | No | How to resolve a missing identifier. |
| metadata | No | Source publication metadata and links. |
| revision | No | Hash of the complete normalized record. |
| decisions | No | Selected page of authoritative report points. |
| truncated | No | At least one selected array section has more entries or a response-fitted page; follow its sectionPages continuation. |
| activities | No | Selected process-event page. |
| documentId | No | Normalized document identifier. |
| htmlOffset | No | Returned HTML offset in code points. |
| properties | No | Selected property page. |
| references | No | Selected relationship page. |
| sourceHtml | No | Separately selected original source HTML page. |
| textOffset | No | Returned text offset in Unicode code points. |
| attachments | No | Selected linked-attachment page. |
| htmlHasMore | No | Whether source HTML remains. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| textHasMore | No | Whether canonical text remains. |
| nextHtmlCall | No | Complete continuation for source HTML. |
| nextTextCall | No | Complete continuation for canonical text. |
| reservations | No | Selected reservation page. |
| sectionPages | No | Independent counts and complete continuation for every selected array. |
| stakeholders | No | Selected page of source participants, retaining entries without an IID. |
| textAvailable | No | Whether a published canonical body exists. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| htmlTotalLength | No | Complete HTML code-point length. |
| textTotalLength | No | Complete canonical text length in code points. |
| upstreamWarnings | No | Warnings supplied by the source. |
| htmlReturnedLength | No | Returned HTML code points. |
| textRepresentation | No | Source SFS text or canonical converted Markdown. |
| textReturnedLength | No | Actual returned text code points. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the extra burden is modest; the description still adds real value by disclosing pagination/continuation behavior and the consolidated-vs-historical SFS caveat, which an agent could otherwise get wrong.
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?
Three sentences, front-loaded with what is returned, then the paging mechanism, then the SFS caveat. Dense but every sentence carries information; no filler.
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 an output schema and full parameter documentation, the description only needs to cover the paging model and the SFS interpretation caveat, both of which it does. Revision-conflict semantics are left entirely to the schema, a minor gap.
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 baseline is 3, but the description adds operational meaning the schema does not: that sections can be selected and that continuation calls are the mechanism for long documents. It still leaves the offset/length and sectionLimit interplay to the schema.
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?
Specific verb ('Read') plus resource ('document') and an enumeration of what is returned (status, decisions, linked records, text). It implicitly contrasts with riksdag_search_documents by dealing with a single identified document, and the SFS note flags a distinct content type, but it does not explicitly name a sibling.
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?
Explains when to select sections, when to follow continuation calls for long reports, and warns that SFS text is consolidated rather than point-in-time. Missing an explicit 'use riksdag_search_documents first to obtain a documentId' routing statement, though the schema supplies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_get_memberRead parliamentary memberARead-onlyIdempotentInspect
Read one member register entry and assignment history by exact member ID. Assignment dates preserve source precision and do not establish historical sitting status.
| Name | Required | Description | Default |
|---|---|---|---|
| memberId | Yes | Numeric memberId from riksdag_search_members, including leading zeros. | |
| revision | No | Revision returned by the preceding assignment page. | |
| assignmentLimit | No | Requested assignments; applied maximum 100. | |
| assignmentOffset | No | Assignment offset in published source order. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Published given and family names, when present. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether the exact member IID exists. |
| party | No | Published party code. |
| source | No | Required attribution to the Swedish Parliament. |
| status | No | Unmodified source service-status label. |
| hasMore | No | Whether assignments remain. |
| notices | No | All applicable notices, including an empty list. |
| guidance | No | Next step when the member IID is absent. |
| memberId | No | Numeric register IID, including leading zeros; absent for some historical and European Parliament entries. |
| nextCall | No | Complete next-assignment call. |
| revision | No | Complete normalized member record revision. |
| givenName | No | Published given name. |
| sourceUrl | No | Public register source URL. |
| truncated | No | Whether further assignments remain available through nextCall. |
| familyName | No | Published family name. |
| assignments | No | Published assignments in source order. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| constituency | No | Published constituency label. |
| returnedCount | No | Assignments returned on this page. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| sourceRecordId | No | Source register UUID, distinct from the member IID. |
| assignmentLimit | No | Applied assignment limit. |
| assignmentTotal | No | Exact total published assignments. |
| detailAvailable | No | Whether a numeric member IID is published for riksdag_get_member. |
| assignmentOffset | No | Applied assignment offset. |
| upstreamWarnings | No | Warnings supplied by the source. |
| serviceClassification | No | Source-defined Swedish chamber service; unknown is retained. |
| requestedAssignmentLimit | No | Requested assignment limit before clamping and fitting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, so the description's added value is the domain caveat that assignment dates preserve source precision and do not establish historical sitting status. That is genuinely useful interpretation guidance beyond the annotations, though pagination/revision behavior is left to the schema.
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?
Two short sentences with the core purpose front-loaded and the interpretive caveat second. Every sentence earns its place with no filler.
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?
An output schema exists and the annotations plus full parameter coverage carry most of the burden, so the description only needs purpose and caveats. It supplies both, though it could note that revision supports paging continuity to be fully self-contained.
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 four parameters, including revision and assignment paging, are already documented in structured fields. The description adds no parameter-level detail beyond the schema, which is the expected baseline.
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 ('Read one member register entry and assignment history') and constrains the lookup to an exact member ID, which implicitly separates it from riksdag_search_members. It does not name the sibling explicitly, so a 4 rather than a 5.
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?
'By exact member ID' implies the caller must already have an ID, and the schema notes it comes from riksdag_search_members, so usage context is present but indirect. There is no explicit when-to-use/when-not statement or named alternative in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_get_votesRead parliamentary main votesARead-onlyIdempotentInspect
Read authoritative report decisions and party main-vote groups separated by avser, or a member’s session main votes. Report mode requires report or documentId; ballots true with an explicit point adds individual member ballots and independent ballotPage continuation. Member mode requires memberId. Follow complete local continuation calls. Main votes do not include every ballot round; empty rows never prove acclamation.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Report decision points or one member’s session main votes. | |
| limit | No | Member or report-ballot requested rows; default 20, applied maximum 500. | |
| party | No | Member-mode local party filter; report party groups are always complete. | |
| point | No | One authoritative report point; omit to traverse all points. | |
| offset | No | Member or explicit report-ballot local row offset; default 0. | |
| report | No | Report designation or session:designation; report mode only. | |
| ballots | No | Report mode only: include individual ballots for an explicit point; default false. | |
| session | Yes | Required parliamentary session, for example 2024/25. | |
| memberId | No | Required in member mode: numeric memberId from riksdag_search_members, including leading zeros. | |
| revision | No | Returned complete-candidate or report-catalog revision for consistent continuation. | |
| documentId | No | Report mode: documentId from riksdag_search_documents with documentType bet; alternative to report. | |
| pointLimit | No | All-points report page size; default 5, applied maximum 10. | |
| pointOffset | No | All-points report local offset; default 0. | |
| ballotRevision | No | Returned ballot-page revision for consistent report-ballot continuation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Applied workflow. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether the selected report or member-vote selection is available; empty member rows remain a successful selection. |
| limit | No | Applied member row limit after fitting. |
| party | No | Applied member-mode party filter. |
| votes | No | Whole member or explicit report-point main ballots after local pagination. |
| offset | No | Applied member row offset. |
| points | No | Whole report points with every party aggregate and complete decision evidence. |
| report | No | Normalized report designation. |
| source | No | Required attribution to the Swedish Parliament. |
| hasMore | No | More whole rows or report points remain. |
| notices | No | All applicable notices, including an empty list. |
| session | No | Normalized parliamentary session. |
| guidance | No | How to resolve a missing report. |
| memberId | No | Normalized member ID, preserving leading zeros. |
| nextCall | No | Complete continuation advancing by actual returned entries. |
| revision | No | Hash of complete normalized candidates or authoritative point catalog. |
| truncated | No | Response fitting shortened the requested local page. |
| ballotPage | No | Independent ballot pagination; report-point counts and revision retain their meanings. |
| documentId | No | Authoritative report document ID. |
| pointLimit | No | Applied report-point limit after measured fitting. |
| totalCount | No | Exact filtered member-vote total or selected report-point total. |
| pointOffset | No | Applied report-point offset. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| returnedCount | No | Actual returned whole rows or points. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| candidateCount | No | Complete validated member/session candidate count, optionally narrowed upstream by party, before local filtering. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| requestedLimit | No | Original requested member row limit. |
| pointTotalCount | No | Exact complete authoritative report-point catalog count. |
| upstreamWarnings | No | Warnings supplied by the source. |
| requestedPointLimit | No | Original requested report-point limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish a safe, idempotent read, while the description adds important behavioral caveats: report party groups are complete, continuation calls must be followed, and empty vote rows do not prove acclamation. It also warns that main votes do not include every ballot round, which is material context beyond the annotations.
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?
The description is dense but front-loaded, starting with the core resource and then covering mode requirements and caveats. It remains appropriately sized for a 14-parameter tool, though the mode-specific clauses are packed tightly into a single paragraph.
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 annotations, a full input schema, and an output schema present, the description supplies the remaining decision-critical context: mode requirements, ballot behavior, continuation expectations, and vote completeness limitations. Nothing essential for correct invocation appears to be 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 the schema already documents all 14 parameters in detail. The description reinforces key requirements and continuation behavior but does not add substantial parameter semantics beyond what the schema field descriptions provide.
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 verb-resource pair: reading authoritative report decisions, party main-vote groups, or a member’s session main votes. It also clearly separates the two supported modes, so an agent can distinguish this tool from document, member, and speech search siblings.
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?
It gives concrete mode requirements: report mode needs report or documentId, member mode needs memberId, and individual ballots require ballots=true with an explicit point. It does not explicitly compare against sibling tools, but the mode-specific use conditions are otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_list_referenceRiksdag List ReferenceARead-onlyIdempotentInspect
Look up official document types, committees, parties, constituencies, speech reply filters, sessions, identifier conventions and source coverage. The offline snapshot is dated; follow nextCall to read every entry. Document subtypes remain distinct from parent document-type codes, and the session catalog can lag current sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Requested entries; values above 100 are clamped with a notice. | |
| topic | Yes | Vocabulary or guidance topic to browse. | |
| offset | No | Zero-based local entry offset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| limit | No | Applied maximum page length after clamping and whole-entry fitting. |
| topic | No | Selected reference topic. |
| offset | No | Applied zero-based local offset. |
| source | No | Required attribution to the Swedish Parliament. |
| entries | No | Complete entries on this page, retaining Swedish source labels and distinct subtypes. |
| hasMore | No | Whether further bundled entries remain. |
| notices | No | All applicable notices, including an empty list. |
| nextCall | No | Continuation covering every remaining entry. |
| truncated | No | Whether response fitting shortened this page. |
| totalCount | No | Exact number of bundled entries for this topic. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| returnedCount | No | Actual entries on this page. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| requestedLimit | No | Caller-requested page length before clamping. |
| upstreamWarnings | No | Warnings supplied by the source. |
| referenceSourceUrl | No | Official source URL for this topic. |
| referenceVerifiedAt | No | Snapshot verification date. |
| referenceCatalogTimestamp | No | Original catalog generation timestamp without an inferred timezone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotentHint already declaring safety, the description adds real context: the snapshot is dated, the session catalog can lag, document subtypes are distinct from parent type codes, and nextCall must be followed to read all entries. These are staleness and completeness traits the annotations cannot express.
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?
Three sentences, front-loaded with the topic inventory, then staleness and subtype caveats. Dense but each clause carries a distinct warning; only the topic list is close to restating the enum.
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?
An output schema exists, so return values need not be described, and the description covers the remaining unknowns an agent needs: snapshot staleness, pagination via nextCall, subtype-vs-parent distinction, and session lag. Little is missing for a read-only reference lookup.
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 baseline is 3; the description still adds meaning by glossing the enum topics — 'speech reply filters' for speech_types, 'identifier conventions' for identifiers, and 'source coverage' for coverage — clarifying intent beyond the bare enum labels.
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 verb ('look up') and enumerates the reference resources covered (document types, committees, parties, sessions, identifier conventions, coverage). This clearly separates it from the sibling search_/get_ tools, which retrieve documents, members, votes, or speeches, even though no sibling is named explicitly.
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: an agent gathers that this is the vocabulary tool to consult before or alongside the search tools. There is no explicit 'use this when / don't use this when' or pointer to a specific alternative, so guidance remains inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_search_documentsSearch parliamentary documentsARead-onlyIdempotentInspect
Search Swedish parliamentary documents and consolidated SFS statutes by words, document type, session, committee, party, member IID or dates. Choose relevance or descending date ordering and follow complete continuation calls. Read document status and text with riksdag_get_document.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Remote page number, starting at 1. | |
| sort | No | Source ordering; relevance for nonblank queries and descending date otherwise. | |
| party | No | Party code or exact reference label. | |
| query | No | Source full-text query; narrow slow searches with session or type. | |
| dateTo | No | Inclusive latest ISO calendar date, YYYY-MM-DD. | |
| offset | No | In-page row offset; follow nextCall without changing the remote page size. | |
| session | No | Parliamentary session; omission searches all available sessions. | |
| dateFrom | No | Inclusive earliest ISO calendar date, YYYY-MM-DD. | |
| memberId | No | Numeric member IID from riksdag_search_members; leading zeros are preserved. | |
| pageSize | No | Requested remote page size; maximum applied size 50. | |
| revision | No | Remote-page revision from continuation; rejects changed pages. | |
| committee | No | Committee code or exact reference label. | |
| documentType | No | Document type code or exact reference label, including sfs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | No | Applied remote page. |
| error | No | Present when the call failed. Absent on success. |
| items | No | Complete rows selected from the fetched remote page. |
| offset | No | Applied in-page row offset. |
| source | No | Required attribution to the Swedish Parliament. |
| hasMore | No | Whether local rows or another remote page remain. |
| notices | No | All applicable notices, including an empty list. |
| nextCall | No | Complete next-page call with unchanged filters and page size. |
| pageSize | No | Applied remote page size. |
| revision | No | Hash of the complete normalized remote page. |
| truncated | No | Whether response fitting shortened this local page. |
| totalCount | No | Authoritative source hit count, when published. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| returnedCount | No | Actual rows returned. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| upstreamWarnings | No | Warnings supplied by the source. |
| remoteReturnedCount | No | Complete fetched remote-page row count. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered structurally. The description adds the pagination behavior ('follow complete continuation calls') and default ordering behavior, but says nothing about result-size limits or cost of broad queries beyond what the schema already states.
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?
Two sentences, front-loaded with the verb and resource, then the filter menu and the ordering/continuation instructions, then the sibling handoff. No filler and every clause carries operational information.
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?
Given 13 optional parameters, an output schema, and full annotations, the description covers purpose, filtering, ordering, pagination, and the follow-up retrieval tool, which is sufficient for correct invocation. It does not state default behavior when no parameters are supplied or how filters combine, leaving a minor completeness gap.
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 13 parameters are already documented with semantics such as revision, offset, and session behavior. The description only groups the filter families (words, type, session, committee, party, member IID, dates) at a high level without adding syntax or combination rules, matching the baseline 3 for a fully documented schema.
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 (Search) and resource (Swedish parliamentary documents and consolidated SFS statutes) and enumerates the filter dimensions available, so an agent knows precisely what it retrieves. It also names the sibling riksdag_get_document for the status/text follow-up, cleanly separating search from retrieval.
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?
Gives clear routing: use this to search, then read document status and text with riksdag_get_document, and it explains the relevance-vs-date ordering choice and the continuation workflow. It stops short of explicit exclusions (e.g., when to prefer riksdag_search_speeches or riksdag_search_members for related content), so there is a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_search_membersSearch parliamentary membersARead-onlyIdempotentInspect
Find members and ministers by name, party, constituency and service status. Defaults to the service register; register all includes earlier source records through a larger cold request that may time out. Use numeric memberId with riksdag_get_member for assignment history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Requested rows; applied maximum 100. | |
| party | No | Party code or exact reference label. | |
| offset | No | Local row offset. | |
| sitting | No | Source service classification; all retains unknown status. | all |
| register | No | Register scope; all includes historical records and can require a large cold request that reaches the normal timeout. | service |
| revision | No | Revision returned by a preceding page. | |
| constituency | No | Exact constituency reference label or code, applied locally. | |
| nameContains | No | Strict all-token local name filter, ignoring case and diacritics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| items | No | Filtered member-register rows. |
| limit | No | Applied row limit. |
| offset | No | Applied local offset. |
| source | No | Required attribution to the Swedish Parliament. |
| hasMore | No | Whether filtered rows remain. |
| notices | No | All applicable notices, including an empty list. |
| nextCall | No | Complete next-page call. |
| revision | No | Complete candidate-set revision. |
| truncated | No | Whether response fitting shortened the selected page. |
| totalCount | No | Exact count after local filtering. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| returnedCount | No | Rows in this page. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| candidateCount | No | Actual returned candidate records in the selected register scope. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| requestedLimit | No | Requested row limit before clamping and fitting. |
| upstreamWarnings | No | Warnings supplied by the source. |
| sourceReportedCount | No | Source-reported register hits; may differ from actual returned candidates in all scope. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and open-world, so the safety profile is covered. The description adds genuinely new behavioral context: the default register scope and the timeout risk of the larger historical request, which is operationally important and not derivable from annotations alone.
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?
Three tight sentences with no filler; the core capability comes first, then the caveat, then the sibling pointer. The phrase 'register all includes earlier source records' is slightly compressed but still readable.
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 an output schema present and full parameter documentation in the schema, the description only needs to cover invocation guidance and caveats — which it does via the register/timeout warning and the get_member pointer. Nothing essential for a correct call 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 the schema already documents all 8 parameters including register scope and timeout behavior. The description repeats the register/timeout story rather than adding new syntax or format details, so the 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 ('Find') and resource ('members and ministers') with the filterable facets (name, party, constituency, service status). It also separates itself from the sibling riksdag_get_member by assigning ID-based assignment history to that tool, so an agent can pick correctly without opening either schema.
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?
Clearly routes ID-based lookups to riksdag_get_member and explains the register=all trade-off ('larger cold request that may time out'). It lacks an explicit statement of when NOT to search at all, but the alternative routing gives strong context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
riksdag_search_speechesSearch and read parliamentary speechesARead-onlyIdempotentInspect
Search speeches within a required parliamentary session, optionally by member, party, reply exclusion and heading tokens. Heading matching searches debate headings only, never body text. Search hydrates one text page by default; use get mode with an item speechId to read all remaining text and retain the returned revision for continuation.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Search by default; get reads one retrieval speechId. | |
| limit | No | Search only: requested rows, default 5 and applied maximum 20. | |
| party | No | Search only: official party code or exact reference label. | |
| offset | No | Search only: local row offset, default 0. | |
| session | No | Required in search mode; parliamentary session such as 2024/25. | |
| memberId | No | Search only: numeric memberId from riksdag_search_members, retaining leading zeros. | |
| revision | No | Search candidate revision or get textRevision copied from the preceding page. | |
| speechId | No | Required in get mode: retrieval ID copied from a search item, never the source UUID. | |
| textCount | No | Search only: maximum speeches to request text for, default 1 and applied maximum 5; 0 returns metadata. | |
| speechType | No | Search only: all by default; speech excludes replies. | |
| textLength | No | Get only: requested Unicode code points; defaults start at 8000 and fit the complete response; explicit lengths are honored. | |
| textOffset | No | Get only: Unicode code-point offset, default 0. | |
| headingContains | No | Search only: all-token local heading and subheading filter, ignoring case and diacritics; never body search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| item | No | Get mode: exact speech metadata and text page. |
| mode | No | Applied search or detail mode. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Get mode: whether the retrieval ID exists. |
| items | No | Search mode: local speech page after heading filtering. |
| limit | No | Applied search page size after clamp and response fitting. |
| offset | No | Applied local row offset. |
| source | No | Required attribution to the Swedish Parliament. |
| hasMore | No | Whether filtered speech rows remain. |
| notices | No | All applicable notices, including an empty list. |
| guidance | No | Recovery guidance for an expected detail miss. |
| nextCall | No | Complete next local search-page call. |
| revision | No | Search candidate-set revision or complete get detail revision. |
| speechId | No | Get mode: requested retrieval ID. |
| textCount | No | Applied maximum speeches selected for text retrieval. |
| truncated | No | Whether response fitting shortened the local row page. |
| totalCount | No | Exact local heading-filtered match count. |
| retrievedAt | No | Source fetch time, retained unchanged on cache hits. |
| returnedCount | No | Speech rows returned on this page. |
| upstreamQuery | No | Upstream query echo; not proof that a filter was applied. |
| candidateCount | No | Complete validated upstream candidate count. |
| effectiveQuery | No | Deterministic normalized input, applied defaults and local filters. |
| requestedLimit | No | Original requested search page size. |
| upstreamWarnings | No | Warnings supplied by the source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the safety hints provided in annotations, the description specifies crucial operational behaviors: heading matching applies only to debate headings, never the body text. It also details the default hydration behavior of a single page.
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?
The description is dense with critical information but highly structured. Both sentences serve distinct, necessary purposes: the first establishing scope and options, and the second detailing retrieval mechanics and workflow.
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?
Given the complexity of the 13 parameters and the dual functionality (search/get), the description provides necessary boundaries and operational context (e.g., 'heading matches debate headings only') that a standalone schema cannot convey.
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?
Although the schema is comprehensive, the description adds semantic meaning by clustering the parameters into operational stages (Search options vs. Read/Hydrate mechanics). This links the parameters functionally rather than just describing them individually.
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 clearly identifies the resource (speeches) and the primary action (search within a required parliamentary session). It distinguishes itself by detailing optional filters (member, party, heading tokens) and implicitly separating its function from general document search tools via the context provided.
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?
It provides an explicit workflow, explaining the difference between 'search' mode (default, hydrating one text page) and 'get' mode (used with `speechId` to continue reading). This guides the agent on the correct sequence of tool usage.
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.
7 tool updates
- First observed
riksdag_get_document - First observed
riksdag_get_member - First observed
riksdag_get_votes - First observed
riksdag_list_reference - First observed
riksdag_search_documents - First observed
riksdag_search_members - First observed
riksdag_search_speeches
Related MCP Connectors
Search Swiss parliamentary business, votes, debates, members, and declared interests.
71Riksdagen (Swedish Parliament) open data MCP.
Search UK Parliament bills, members, votes, Hansard, written questions, and committees.
91Sveriges riksdag: vem sa vad, hur röstade ledamöter och partier — med källänkar.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query Swedish Parliament open data through natural language.8 npmMIT
- AlicenseAqualityFmaintenanceEnables querying Swedish statutes, provisions, case law, preparatory works, and EU law cross-references from any MCP-compatible client.1970 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables LLMs to query and retrieve real-time open data, documents, protocols, and records from the Swedish Parliament (Riksdag) and Government Offices through 32 specialized MCP tools.31MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search and retrieve consolidated Swedish statutes (SFS) from the Riksdagen open data API, with verifiable citations and persistent identifiers.4182 PyPIApache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.