# io.github.sedis-ab/mcp (npm · @sedis/mcp)

Read-only MCP tools for the Sedis PartnerAPI v2 (Bolagsanalys + Fastighetsbenchmark).

- Trust score: 74/100 (medium)
- Change this week: +24
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@sedis/mcp`: 74/100 (this document), [markdown](https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp.md), [page](https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp)

## Channel facts

- Registry: `npm`
- Package: `@sedis/mcp`
- Version: `1.1.5`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 86/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (94 of 98), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to sedis-ab/sedis-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 16 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 70/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4079 tokens (~313/item across 13 items; 12 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (83% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add sedis-ab-mcp -- npx -y @sedis/mcp
```

### Codex

```bash
codex mcp add sedis-ab-mcp -- npx -y @sedis/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sedis-ab-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@sedis/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sedis-ab-mcp --command npx --arg -y --arg @sedis/mcp
```

### Hermes

```yaml
mcp_servers:
  sedis-ab-mcp:
    command: "npx"
    args: ["-y", "@sedis/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "sedis-ab-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@sedis/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 74, +69)

- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The attested source repository moved: sedis-ab/sedis-mcp
- [functional regression] Security disclosure: unverified → fail
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 5, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-07-31 (score 5, −45)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-27 (score 50)

First indexed and scored.

## MCP tools (12)

### `bolagsanalys_list_companies` (~227 tokens)

List listed companies (Bolagsanalys)

Read-only. Search Sedis's catalog of listed companies by name fragment or country code and return each company's `companyId` and name. This is the FIRST step of the Bolagsanalys flow: take a `companyId` from here and pass it to `bolagsanalys_get_data` to fetch its quarterly figures. Example: nameContains 'Volvo', countryCode 'SE'. Reference data shared across all tenants; this tool never writes or ingests.

Input parameters:

- `countryCode` (string): ISO-3166 alpha-2 country code, e.g. 'SE'.
- `nameContains` (string): Case-insensitive company-name fragment, e.g. 'Volvo'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Matching listed companies.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `bolagsanalys_find_parameter` (~239 tokens)

Find a Bolagsanalys parameter

Read-only. Discover the right financial parameter by name fragment or group and return each parameter's `code`, English name, group and description. Use this to resolve the `parameterCode` you then pass to `bolagsanalys_get_data` (alongside a `companyId` from `bolagsanalys_list_companies`). Example: nameContains 'revenue', group 'Income statement'. Shared reference data; read-only — never writes.

Input parameters:

- `group` (string): Parameter group name to filter by, e.g. 'Income statement'.
- `lang` (string): Language for names/descriptions; English default, 'sv' for Swedish.
- `nameContains` (string): Case-insensitive parameter-name fragment, e.g. 'revenue'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Matching Bolagsanalys parameters.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `bolagsanalys_get_data` (~403 tokens)

Get Bolagsanalys quarterly figures

Read-only. Fetch quarterly figures for one company — optionally narrowed to a single parameter and a quarter range. Pass a `companyId` from `bolagsanalys_list_companies` and (optionally) a `parameterCode` from `bolagsanalys_find_parameter`. Quarter bounds use packed ids: `quarterId`, `fromDate`, `toDate` accept e.g. '20251' or '2025Q1' (these are QUARTERS, not calendar dates). Example: companyId 'SE-VOLV-B', parameterCode 'REV', fromDate '2024Q1', toDate '2025Q4'. Every row keeps its `companyId` and `parameterCode`; read-only — never writes.

Input parameters:

- `companyId` (string): Company id from bolagsanalys_list_companies, e.g. 'SE-VOLV-B'. Omit to fetch ALL companies for the parameter/quarter (enables one-call ranking/aggregation).
- `count` (boolean): false (default) skips totalCount for cheaper bulk paging.
- `fromDate` (string): Inclusive lower quarter bound, e.g. '20241' or '2024Q1'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `parameterCode` (string): Parameter code from bolagsanalys_find_parameter; omit for all parameters.
- `quarterId` (string): Single packed quarter, e.g. '20251' or '2025Q1'.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.
- `toDate` (string): Inclusive upper quarter bound, e.g. '20254' or '2025Q4'.

Output parameters:

- `data` (array): Quarterly figures, one row per company+parameter+quarter.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `bolagsanalys_search_data` (~441 tokens)

Search Bolagsanalys figures for many companies (batch)

Read-only. Fetch quarterly figures for a SPECIFIC SET of companies in one call by passing `companyIds` (up to 50, from `bolagsanalys_list_companies`), optionally narrowed to a `parameterCode` (from `bolagsanalys_find_parameter`) and a quarter range. Use this for a specific N-company subset — v2's GET has no companyIdIn, so to fetch ALL companies instead omit `companyId` on `bolagsanalys_get_data`. Quarter bounds use packed ids: `quarterId`, `fromDate`, `toDate` accept e.g. '20251' or '2025Q1' (QUARTERS, not calendar dates). The cap is 50 — more is rejected. Returns the same envelope as `bolagsanalys_get_data`; every row keeps its `companyId` and `parameterCode`; read-only — never writes.

Input parameters:

- `companyId` (string): Single company id; OR'd with companyIds.
- `companyIds` (array): Up to 50 company ids (from bolagsanalys_list_companies) to fetch in one call; over 50 is rejected.
- `count` (boolean): false (default) skips totalCount for cheaper bulk paging.
- `fromDate` (string): Inclusive lower quarter bound, e.g. '20241' or '2024Q1'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `parameterCode` (string): Parameter code from bolagsanalys_find_parameter; omit for all parameters.
- `quarterId` (string): Single packed quarter, e.g. '20251' or '2025Q1'.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.
- `toDate` (string): Inclusive upper quarter bound, e.g. '20254' or '2025Q4'.

Output parameters:

- `data` (array): Quarterly figures, one row per company+parameter+quarter.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `fastighetsbenchmark_find_parameter` (~258 tokens)

Find a Fastighetsbenchmark parameter

Read-only. Discover the right real-estate benchmark parameter by name fragment or group and return each parameter's `code`, English name, `dataType` (decimal/boolean/enum/date) and — for enum parameters — its `enumValues` legal-value domain. Use this to resolve the `parameterCode` you pass to `fastighetsbenchmark_get_comp_timeseries`, and read `dataType` to know which CompDatum value member to trust. Example: nameContains 'Total return'. Shared reference data; read-only — never writes.

Input parameters:

- `group` (string): Parameter group name to filter by, e.g. 'Return'.
- `lang` (string): Language for names/descriptions; English default, 'sv' for Swedish.
- `nameContains` (string): Case-insensitive parameter-name fragment, e.g. 'Total return'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Matching Fastighetsbenchmark CompParameters.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `fastighetsbenchmark_search_property_units` (~460 tokens)

Search your property units (Fastighet)

Read-only. Find YOUR property units (Fastighet) by name, property-type id, municipality, or comparison-zone membership, returning each unit's `sedisId`. This is the §8 A6 flow's object-finding step: take a comparison zone from `fastighetsbenchmark_list_jamforelseobjekt` and filter here with `belongsToJamforelseobjektSedisId`, then pass the resulting `sedisId`s to `fastighetsbenchmark_get_comp_timeseries` via `sedisIdIn`. Lean by default: geometry is omitted unless you set `includeGeometry: true`. Example: propertyType 1 (Office), belongsToJamforelseobjektSedisId 'JO-A'. Tenant-scoped to your data; read-only — never writes.

Input parameters:

- `belongsToJamforelseobjektSedisId` (string): Comparison-zone sedisId (from list_jamforelseobjekt) — returns only your units in that zone, e.g. 'JO-A'.
- `includeGeometry` (boolean): false (default, lean) omits geometry; true opts the heavy geometry member into the response via ?fields=.
- `lang` (string): Language for names/descriptions; English default, 'sv' for Swedish.
- `municipalityId` (integer): Municipality id to filter by, e.g. 180 (Stockholm).
- `nameContains` (string): Case-insensitive property-unit-name fragment, e.g. 'Office'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `propertyType` (integer): Property-type id (int, NOT a name); discover ids from find_parameter enumValues, e.g. 1 = Kontor/Office.
- `propertyTypeName` (string): Property-type by NAME (locale-aware), e.g. 'Office'/'Kontor'; alternative to the numeric propertyType id.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Your matching property units (Fastighet).
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `fastighetsbenchmark_list_samlingar` (~228 tokens)

List your collections (Samling)

Read-only. List YOUR collections (Samling). Each row exposes its members as `containingCompSedisIds` — an array of ids, not nested objects — so you can reference-then-resolve: take those ids and pass them to `fastighetsbenchmark_get_comp_timeseries` via `sedisIdIn` only for the collections you actually need (this keeps payloads bounded). Example: nameContains 'Stockholm offices'. Tenant-scoped to your data; read-only — never writes (creating/replacing/deleting a Samling is not exposed here).

Input parameters:

- `nameContains` (string): Case-insensitive collection-name fragment, e.g. 'Stockholm offices'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Your collections (Samling).
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `fastighetsbenchmark_list_jamforelseobjekt` (~282 tokens)

List your comparison zones (Jämförelseobjekt)

Read-only. List YOUR comparison zones (Jämförelseobjekt — your clones of a Sedis-owned aggregate), returning each zone's `sedisId`. This is the FIRST step of the §8 A6 flow: find a zone by name here, then pass its `sedisId` to `fastighetsbenchmark_search_property_units` as `belongsToJamforelseobjektSedisId` to find your units in it. Lean by default: set `detail: true` to opt into the tenant-filtered `containsPropertyUnits` lineage. Example: nameContains 'Stockholm'. Tenant-scoped to your data; read-only — never writes.

Input parameters:

- `detail` (boolean): false (default, lean) omits lineage; true opts the tenant-filtered containsPropertyUnits array in via ?fields=.
- `nameContains` (string): Case-insensitive comparison-zone-name fragment, e.g. 'Stockholm'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Your comparison zones (Jämförelseobjekt).
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `fastighetsbenchmark_get_comp_timeseries` (~472 tokens)

Get the CompDatum time-series

Read-only. Pull the actual benchmarking numbers (CompDatum time-series) for one or more Comps. This is the FINAL step of the §8 A6 flow: pass the `sedisId`s you found (from `fastighetsbenchmark_search_property_units`, `_list_samlingar`'s `containingCompSedisIds`, or `_list_jamforelseobjekt`) as a comma-separated `sedisIdIn`, plus a `parameterCode` from `fastighetsbenchmark_find_parameter` and an ISO date range. Each row is SELF-DESCRIBING via `dataType` (decimal/boolean/enum/date) — read the matching member (`figure`/`boolean`/`enum`/`date`); an enum resolves to `{ value, name, enumType }`, so use `enum.name`, never the raw int. Every row keeps its `sedisId` (do not conflate Comps). Use `count: false` for cheap bulk paging. Example: sedisIdIn 'PU-1,PU-2', parameterCode 'NX71', fromDate '2016-01-01', toDate '2026-12-31'. Tenant-scoped to your data; read-only — never writes.

Input parameters:

- `count` (boolean): false (default) skips totalCount for cheaper high-volume bulk paging, e.g. false.
- `fromDate` (string): Inclusive lower ISO date bound (yyyy-MM-dd), e.g. '2016-01-01'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `parameterCode` (string): CompParameter code from fastighetsbenchmark_find_parameter; omit for all parameters, e.g. 'NX71'.
- `sedisIdIn` (string, required): Comma-separated Comp sedisIds to fetch (multi-value), e.g. 'PU-1,PU-2'.
- `toDate` (string): Inclusive upper ISO date bound (yyyy-MM-dd), e.g. '2026-12-31'.

Output parameters:

- `data` (array): Self-describing CompDatum rows — one per Comp+parameter+valueDate; dataType + sedisId kept on every row.
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page used for this response.
- `totalCount`: Total matching rows across all pages; null/absent when count=false (v2 omits the key).
- `totalPages`: Total page count; null/absent when count=false.

### `fastighetsbenchmark_list_reference_zones` (~212 tokens)

List reference zones (shared)

Read-only. List the SHARED Sedis-owned reference zones — the same for every key, with NO tenant filter (these are not your private data). Each row exposes its `sedisId`, `name`, and `sourceName` (the external-reference provider, e.g. 'Nils Holgersson'). Use a reference zone as a market benchmark to compare against your own comparison zones and property units. Example: nameContains 'Stockholm'. Shared reference data; read-only — never writes.

Input parameters:

- `nameContains` (string): Case-insensitive reference-zone-name fragment, e.g. 'Stockholm'.
- `page` (integer): 1-indexed result page (first page = 1), e.g. 1.
- `pageSize` (integer): Rows per page (v2 default 50, max 500), e.g. 50.
- `sort` (string): Comma-separated sort fields; prefix '-' for descending, e.g. '-name'.

Output parameters:

- `data` (array): Shared Sedis-owned reference zones (identical for every key).
- `page` (integer): The page you are on (1-indexed).
- `pageSize`: Rows per page echoed back by v2, e.g. 50.
- `totalCount`: Total matching rows across all pages; null/absent when count is skipped.
- `totalPages`: Total page count; null/absent when count is skipped.

### `set_session` (~167 tokens)

Set the Sedis session token (after re-proving 2FA)

Paste the freshly-minted session token from the Sedis reprove page to refresh this session WITHOUT restarting the client. Use this when a tool returns 'Session re-verification required': open the reproveUrl, complete 2FA, copy the new token, call this tool with it, then retry the original call. The token is cached locally (owner-only file) and sent as the X-Api-Session header on every subsequent call; it is never logged or echoed back.

Input parameters:

- `token` (string, required): The freshly-minted session token from the reprove page (e.g. starts with 'sedis_sess_…'). Open the reproveUrl shown in a 'Session re-verification required' error, complete 2FA, copy the token, and pa…

### `clear_session` (~56 tokens)

Clear the cached Sedis session token

Forget the locally-cached session token (removes it from memory and the on-disk cache). After this, calls send no X-Api-Session header until you set_session again. Use it to sign out of the current session.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp#diagnostics

## Score history

- 2026-08-03: 74
- 2026-08-02: 74
- 2026-08-01: 5
- 2026-07-31: 5
- 2026-07-30: 50
- 2026-07-28: 50
- 2026-07-27: 50

## Links

- npm package: https://www.npmjs.com/package/@sedis/mcp
- Socket report: https://socket.dev/npm/package/@sedis/mcp
- Repository: https://github.com/sedis-ab/sedis-mcp
- Website: https://www.sedis.se/fraga-sedis/
- Changelog RSS feed: https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/sedis-ab-mcp/sedis-mcp
