sweden-parliament-mcp-server

v0.1.1 pre-1.0

Search Swedish parliamentary documents, speeches, votes, members, and statutes via MCP. STDIO or Streamable HTTP.

sweden-parliament.caseyjhand.com/mcp
claude mcp add --transport http sweden-parliament-mcp-server https://sweden-parliament.caseyjhand.com/mcp
codex mcp add sweden-parliament-mcp-server --url https://sweden-parliament.caseyjhand.com/mcp
{
  "mcpServers": {
    "sweden-parliament-mcp-server": {
      "url": "https://sweden-parliament.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http sweden-parliament-mcp-server https://sweden-parliament.caseyjhand.com/mcp
{
  "mcpServers": {
    "sweden-parliament-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://sweden-parliament.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "sweden-parliament-mcp-server": {
      "type": "http",
      "url": "https://sweden-parliament.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://sweden-parliament.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

7

riksdag_list_reference

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_list_reference",
    "arguments": {
      "topic": "<topic>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "topic": {
      "type": "string",
      "enum": [
        "document_types",
        "committees",
        "parties",
        "constituencies",
        "speech_types",
        "sessions",
        "identifiers",
        "coverage"
      ],
      "description": "Vocabulary or guidance topic to browse."
    },
    "offset": {
      "default": 0,
      "description": "Zero-based local entry offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 20,
      "description": "Requested entries; values above 100 are clamped with a notice.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    }
  },
  "required": [
    "topic",
    "offset",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

riksdag_search_documents

open-world

Search Swedish parliamentary documents and consolidated SFS statutes by words, document type, session, committee, party or dates. Read document status and text with riksdag_get_document.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_search_documents",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Source full-text query; narrow slow searches with session or type.",
      "type": "string"
    },
    "documentType": {
      "description": "Document type code or exact reference label, including sfs.",
      "type": "string"
    },
    "session": {
      "description": "Parliamentary session; omission searches all available sessions.",
      "type": "string"
    },
    "committee": {
      "description": "Committee code or exact reference label.",
      "type": "string"
    },
    "party": {
      "description": "Party code or exact reference label.",
      "type": "string"
    },
    "dateFrom": {
      "description": "Inclusive earliest ISO calendar date, YYYY-MM-DD.",
      "type": "string"
    },
    "dateTo": {
      "description": "Inclusive latest ISO calendar date, YYYY-MM-DD.",
      "type": "string"
    },
    "page": {
      "default": 1,
      "description": "Remote page number, starting at 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "default": 10,
      "description": "Requested remote page size; maximum applied size 50.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    }
  },
  "required": [
    "page",
    "pageSize"
  ],
  "additionalProperties": false
}
view source ↗

riksdag_get_document

open-world

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_get_document",
    "arguments": {
      "documentId": "<documentId>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "documentId": {
      "type": "string",
      "minLength": 1,
      "description": "Document ID from riksdag_search_documents, or unambiguous SFS YYYY:N identifier."
    },
    "sections": {
      "description": "Select metadata, decisions, reservations, activities, properties, attachments, references, text or source_html. Omit for metadata, complete outline and first text page.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "textOffset": {
      "default": 0,
      "description": "Text offset in Unicode code points.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "textLength": {
      "description": "Explicit text length in code points; default 1000 and honored when supplied.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "htmlOffset": {
      "default": 0,
      "description": "Source HTML offset in Unicode code points.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "htmlLength": {
      "description": "Explicit source HTML length in code points; default 1000.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "sectionOffset": {
      "default": 0,
      "description": "Offset applied independently to each selected array section.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "sectionLimit": {
      "default": 20,
      "description": "Requested entries per selected array section; applied maximum 100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "revision": {
      "description": "Revision returned by a previous call; rejects changed records.",
      "type": "string"
    }
  },
  "required": [
    "documentId",
    "textOffset",
    "htmlOffset",
    "sectionOffset",
    "sectionLimit"
  ],
  "additionalProperties": false
}
view source ↗

riksdag_search_members

open-world

Find members and ministers by name, party, constituency and service status. Service-register entries include historical records; use riksdag_get_member for assignment history.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_search_members",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "nameContains": {
      "description": "Strict all-token local name filter, ignoring case and diacritics.",
      "type": "string"
    },
    "party": {
      "description": "Party code or exact reference label.",
      "type": "string"
    },
    "constituency": {
      "description": "Exact constituency reference label or code, applied locally.",
      "type": "string"
    },
    "sitting": {
      "default": "all",
      "description": "Source service classification; all retains unknown status.",
      "type": "string",
      "enum": [
        "all",
        "serving",
        "not_serving"
      ]
    },
    "offset": {
      "default": 0,
      "description": "Local row offset.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 20,
      "description": "Requested rows; applied maximum 100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "revision": {
      "description": "Revision returned by a preceding page.",
      "type": "string"
    }
  },
  "required": [
    "sitting",
    "offset",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

riksdag_get_member

open-world

Read one member register entry and assignment history by exact member ID. Assignment dates preserve source precision and do not establish historical sitting status.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_get_member",
    "arguments": {
      "memberId": "<memberId>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "memberId": {
      "type": "string",
      "minLength": 1,
      "description": "Numeric memberId from riksdag_search_members, including leading zeros."
    },
    "assignmentOffset": {
      "default": 0,
      "description": "Assignment offset in published source order.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "assignmentLimit": {
      "default": 20,
      "description": "Requested assignments; applied maximum 100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "revision": {
      "description": "Revision returned by the preceding assignment page.",
      "type": "string"
    }
  },
  "required": [
    "memberId",
    "assignmentOffset",
    "assignmentLimit"
  ],
  "additionalProperties": false
}
view source ↗

riksdag_search_speeches

open-world

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_search_speeches",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mode": {
      "description": "Search by default; get reads one retrieval speechId.",
      "type": "string",
      "enum": [
        "search",
        "get"
      ]
    },
    "session": {
      "description": "Required in search mode; parliamentary session such as 2024/25.",
      "type": "string"
    },
    "headingContains": {
      "description": "Search only: all-token local heading and subheading filter, ignoring case and diacritics; never body search.",
      "type": "string"
    },
    "memberId": {
      "description": "Search only: numeric memberId from riksdag_search_members, retaining leading zeros.",
      "type": "string"
    },
    "party": {
      "description": "Search only: official party code or exact reference label.",
      "type": "string"
    },
    "speechType": {
      "description": "Search only: all by default; speech excludes replies.",
      "type": "string",
      "enum": [
        "all",
        "speech"
      ]
    },
    "offset": {
      "description": "Search only: local row offset, default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "description": "Search only: requested rows, default 5 and applied maximum 20.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "textCount": {
      "description": "Search only: maximum speeches to request text for, default 1 and applied maximum 5; 0 returns metadata.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "speechId": {
      "description": "Required in get mode: retrieval ID copied from a search item, never the source UUID.",
      "type": "string"
    },
    "textOffset": {
      "description": "Get only: Unicode code-point offset, default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "textLength": {
      "description": "Get only: requested Unicode code points, default 1000; explicit larger lengths are honored.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "revision": {
      "description": "Search candidate revision or get textRevision copied from the preceding page.",
      "type": "string"
    }
  },
  "additionalProperties": false
}
view source ↗

riksdag_get_votes

open-world

Read authoritative report decisions and complete party main-vote groups, or a member’s session main votes. Report mode requires report or documentId; member mode requires memberId. Follow complete local continuation calls. Main votes do not include every ballot round; empty rows never prove acclamation.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "riksdag_get_votes",
    "arguments": {
      "mode": "<mode>",
      "session": "<session>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mode": {
      "type": "string",
      "enum": [
        "report",
        "member"
      ],
      "description": "Report decision points or one member’s session main votes."
    },
    "session": {
      "type": "string",
      "minLength": 1,
      "description": "Required parliamentary session, for example 2024/25."
    },
    "report": {
      "description": "Report designation or session:designation; report mode only.",
      "type": "string"
    },
    "documentId": {
      "description": "Report mode: documentId from riksdag_search_documents with documentType bet; alternative to report.",
      "type": "string"
    },
    "point": {
      "description": "One authoritative report point; omit to traverse all points.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "memberId": {
      "description": "Required in member mode: numeric memberId from riksdag_search_members, including leading zeros.",
      "type": "string"
    },
    "party": {
      "description": "Member-mode local party filter; report party groups are always complete.",
      "type": "string"
    },
    "offset": {
      "description": "Member-mode local row offset; default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "description": "Member-mode requested rows; default 20, applied maximum 500.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 10000
    },
    "pointOffset": {
      "description": "All-points report local offset; default 0.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "pointLimit": {
      "description": "All-points report page size; default 5, applied maximum 10.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 10000
    },
    "revision": {
      "description": "Returned complete-candidate or report-catalog revision for consistent continuation.",
      "type": "string"
    }
  },
  "required": [
    "mode",
    "session"
  ],
  "additionalProperties": false
}
view source ↗