Skip to main content
Glama
sedis-ab

@sedis/mcp

Official
by sedis-ab

@sedis/mcp

CI npm version License: MIT Node.js >= 20

A Model Context Protocol (MCP) server that wraps the Sedis PartnerAPI v2 as a small set of curated, read-only tools, so AI assistants and agents (Claude Desktop, Cursor, and any MCP-capable client) can query your Sedis Bolagsanalys (listed-company financials) and Fastighetsbenchmark (real-estate comparables) data in natural language. The server is a thin pass-through: it adds shape and transport only — every tenant-isolation, authentication, rate-limit, and billing rule lives in PartnerAPI v2, not here.

Not a Sedis customer yet? This server requires a Sedis PartnerAPI v2 key — there is no free tier or trial. Get in touch: info@sedis.se · Fråga Sedis

Install

Easiest: one-click Claude Desktop bundle (.mcpb) — recommended

For non-technical users, install the Desktop Extension — a single file, no Node, no JSON, no terminal:

  1. Download sedis-mcp.mcpb from the latest release.

  2. Double-click it (or open Claude Desktop → Settings → Extensions and drag it in) and click Install.

  3. Paste your Sedis API key into the field that appears (stored in your OS keychain) and confirm.

  4. Done — start a chat and ask, e.g. "Visa nyckeltal för Fabege" (lang: "sv" for Swedish).

The bundle packages the exact server described below together with its dependencies; Claude Desktop supplies the Node runtime, so the user installs nothing else. Ask your Sedis administrator for a key — a customer-level (M2M) key needs no per-session two-factor step. Maintainers build the bundle with npm run build:mcpb (output: dist/sedis-mcp.mcpb).

Manual config (any MCP client — Claude Code, Cursor, …)

The server runs over stdio and is launched on demand via npx — no global install needed. The canonical launch command is:

npx -y @sedis/mcp

Add it to your client's MCP config and set your PartnerAPI key:

{
  "mcpServers": {
    "sedis": {
      "command": "npx",
      "args": ["-y", "@sedis/mcp"],
      "env": {
        "SEDIS_API_KEY": "your-partnerapi-v2-key"
      }
    }
  }
}
  • Claude Desktop: add the block above to claude_desktop_config.json.

  • Cursor / other clients: add it to the client's mcp.json (same shape).

Configuration

Env var

Required

Default

Purpose

SEDIS_API_KEY

yes

Your PartnerAPI v2 key. Sent only as the X-Api-Key header; never logged.

SEDIS_API_BASE_URL

no

https://api.sedis.se

Override the v2 base URL (e.g. for an alpha/beta environment).

SEDIS_API_SESSION

no

Optional startup seed for the session token (user-owned keys only). Sent as X-Api-Session; never logged. Usually you set this at runtime with the set_session tool instead — no restart needed.

The key is validated lazily — the server starts without it and returns a friendly, actionable error on the first tool call if it is missing or invalid. There is no startup ping.

Tools not showing up? MCP servers are loaded when your client starts — after editing the config, fully restart/reload the client (a new chat in the same window is not enough). If you registered it via a CLI (claude mcp add), make sure it landed in the right scope: a server added in one directory isn't visible in another project unless you use a global/user scope.

Session tokens (user-owned keys)

If your key is owned by a specific user (issued to a named person, not a machine/M2M integration key), PartnerAPI v2 requires a short-lived session token alongside X-Api-Key, refreshed periodically via two-factor auth:

  1. On a 401 with reason session_expired / session_invalid, the tool error carries a reproveUrl. Open it in a browser, complete 2FA, and copy the freshly-minted sedis_sess_… token.

  2. Paste it with the set_session tool — it is carried as X-Api-Session on the very next call, no client restart needed. Use clear_session to sign out.

  3. Optionally seed a token at startup with the SEDIS_API_SESSION env var (handy for CI / power users); at runtime set_session always takes precedence.

Machine / org-wide keys (no owner) are headlessX-Api-Key only, no session token, and you never call set_session.

Local development / testing against a non-production environment

To run a local build (unpublished) or point at a non-production environment, swap npx for the built entrypoint and override the base URL:

{
  "mcpServers": {
    "sedis-local": {
      "command": "node",
      "args": ["/absolute/path/to/sedis-mcp/build/index.js"],
      "env": {
        "SEDIS_API_KEY": "your-non-production-key",
        "SEDIS_API_BASE_URL": "https://<your-non-production-host>"
      }
    }
  }
}

Ask the Sedis team for the host name — non-production environments are not publicly documented. This is a development convenience only; production users just use the npx -y @sedis/mcp block above with a single SEDIS_API_KEY, which defaults to https://api.sedis.se.

Related MCP server: sec-edgar-mcp

Tools

All tools are read-only. Tenant scope is enforced by v2: the "YOUR …" tools only ever return data your key is entitled to, and a request for another tenant's object comes back as a friendly not found (never a 403 that would leak existence).

Bolagsanalys (listed-company financials)

Tool

What it does

bolagsanalys_list_companies

Search the catalog of listed companies by name fragment.

bolagsanalys_find_parameter

Discover the right financial parameter by name fragment.

bolagsanalys_get_data

Fetch quarterly figures. Pass one companyId, or omit it to get all companies for a parameter/quarter.

bolagsanalys_search_data

Batch-fetch figures for a specific set of companies — companyIds[] (max 50).

Fastighetsbenchmark (real-estate comparables)

Tool

What it does

fastighetsbenchmark_find_parameter

Discover the right real-estate benchmark parameter by name.

fastighetsbenchmark_search_property_units

Find YOUR property units (Fastighet) by name, municipality, zone, or property-type name (propertyTypeName, e.g. "Office"/"Kontor").

fastighetsbenchmark_list_samlingar

List YOUR collections (Samling) and their members.

fastighetsbenchmark_list_jamforelseobjekt

List YOUR comparison zones (Jämförelseobjekt).

fastighetsbenchmark_get_comp_timeseries

Pull the actual CompDatum benchmarking time-series (self-describing values).

fastighetsbenchmark_list_reference_zones

List the shared, Sedis-owned market reference zones (same for every key).

Names and descriptions are English by default; pass lang: "sv" on the parameter-discovery and property-unit tools to get Swedish.

Session (user-owned keys)

Tool

What it does

set_session

Paste a freshly-minted sedis_sess_… token (from the reprove page) — carried as X-Api-Session on the next call, no restart.

clear_session

Forget the current session token (sign out).

These are needed only for user-owned keys (see Session tokens above); machine / org-wide keys never use them.

Errors are mapped from PartnerAPI v2's RFC 7807 problem responses into short, friendly tool errors that carry a traceId for support — and never the API key or a stack trace. If a tool reports a session / two-factor re-verification error, open the reproveUrl in the message, complete 2FA, copy the new sedis_sess_… token, and paste it via the set_session tool — then retry (no client restart). See Session tokens (user-owned keys) above.

API reference

This server is a wrapper. The underlying endpoints, query conventions, multi-tenant isolation model, geometry, error shapes, rate limits, and data freshness are documented in the PartnerAPI v2 guide that Sedis provides with your API key — contact Sedis if you need access. The live OpenAPI description is served at <SEDIS_API_BASE_URL>/openapi/v2.json (default https://api.sedis.se/openapi/v2.json). This README does not duplicate that reference.

Data use

Use of Sedis data in AI/LLM contexts is subject to your Sedis agreement and the accompanying MCP data-use terms. See SECURITY.md for the key-handling and supply-chain posture.

Licence

MIT.

Available Tools

12 tools
bolagsanalys_find_parameterFind a Bolagsanalys parameterA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage for names/descriptions; English default, 'sv' for Swedish.
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
groupNoParameter group name to filter by, e.g. 'Income statement'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive parameter-name fragment, e.g. 'revenue'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesMatching Bolagsanalys parameters.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description reinforces this with 'read-only' and 'never writes.' It adds useful behavioral context by stating the data is shared reference data and by showing a concrete usage example, going slightly beyond the annotation-only signal without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the tool's purpose, followed by workflow, an example, and a safety note. The only minor redundancy is repeating 'read-only' and 'never writes' in the final sentence, but overall every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and complete input schema, the description supplies the missing context: how this tool fits into the broader Bolagsanalys workflow, what kind of data it operates on, and how to filter results. An agent has enough information to select and invoke this tool correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is already strong. The description adds extra meaning by providing a concrete example combining `nameContains` and `group`, and by explaining how the result's `parameterCode` is consumed downstream, which helps an agent understand the parameter's role in a larger workflow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a read-only parameter discovery endpoint: it finds financial parameters by name fragment or group and returns their code, English name, group, and description. It also distinguishes itself from data-retrieval tools by noting its output feeds `bolagsanalys_get_data`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit workflow guidance: use this tool to resolve `parameterCode` for `bolagsanalys_get_data`, with `companyId` coming from `bolagsanalys_list_companies`. It does not explicitly discuss when not to use search-related siblings, but the chaining context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bolagsanalys_get_dataGet Bolagsanalys quarterly figuresA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
countNofalse (default) skips totalCount for cheaper bulk paging.
toDateNoInclusive upper quarter bound, e.g. '20254' or '2025Q4'.
fromDateNoInclusive lower quarter bound, e.g. '20241' or '2024Q1'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
companyIdNoCompany id from bolagsanalys_list_companies, e.g. 'SE-VOLV-B'. Omit to fetch ALL companies for the parameter/quarter (enables one-call ranking/aggregation).
quarterIdNoSingle packed quarter, e.g. '20251' or '2025Q1'.
parameterCodeNoParameter code from bolagsanalys_find_parameter; omit for all parameters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesQuarterly figures, one row per company+parameter+quarter.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'read-only — never writes.' It adds a useful behavioral detail ('every row keeps its companyId and parameterCode') and clarifies quarter values are packed quarters, not calendar dates. No contradiction with annotations; with readOnlyHint already present, the added behavioral disclosure is adequate but not extensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose, optional narrowing, parameter provenance, quarter-format warning, and an example. Minor redundancy ('optionally' repeated; read-only stated twice), but every sentence earns its place and the key clarification is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description doesn't need to detail return values. It explains parameter origin, quarter-format pitfalls, and the all-companies behavior (omitting companyId for ranking/aggregation). It could mention pagination more explicitly, but the parameter descriptions cover that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good field descriptions, so the baseline is 3. The description adds meaningful above-schema semantics: the quarter format ('2025Q1' vs '20251') with an explicit warning that these are quarters not dates, the provenance of companyId and parameterCode, and a full example. This justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Fetch quarterly figures') and a clear resource ('Bolagsanalys data'), distinguishing it from sibling tools like bolagsanalys_search_data. Also names the companion tools that supply valid IDs, so an agent knows exactly what this tool does and how it fits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: pass companyId from bolagsanalys_list_companies, optionally narrow by parameterCode from bolagsanalys_find_parameter Joseph and quarter range. It does not explicitly state when not to use it versus bolagsanalys_search_data, but the flow is strongly implied by cross-tool provenance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bolagsanalys_list_companiesList listed companies (Bolagsanalys)A
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
countryCodeNoISO-3166 alpha-2 country code, e.g. 'SE'.
nameContainsNoCase-insensitive company-name fragment, e.g. 'Volvo'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesMatching listed companies.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds valuable context beyond the annotations: it is reference data shared across all tenants and 'never writes or ingests', which reinforces what an agent can rely on. No contradictory or missing critical behavior is apparent given the read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the read-only safety indicator and the core search action, then enriched with the flow context and a concrete example. Every sentence contributes meaningful information with no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover read-only/open-world behavior, the description completes the picture with the Bolagsanalys flow position, the use of the returned companyId, and an illustrative query example. Nothing an agent needs to invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 five parameters in detail. The description adds a useful semantic grouping ('by name fragment or country code') and a concrete example (nameContains 'Volvo', countryCode 'SE'), but it does not need to compensate for any schema gap. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search'), a precise resource ('Sedis's catalog of listed companies'), and the two filter dimensions (name fragment, country code). It also distinguishes itself from sibling bolagsanalys_get_data by positioning itself as the first step of the flow, so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear contextual guidance: it is the FIRST step of the Bolagsanalys flow and the returned companyId is meant to be passed to bolagsanalys_get_data. It does not explicitly enumerate when to avoid this tool in favor of siblings like bolagsanalys_search_data, but the flow-level instruction is strong and practical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bolagsanalys_search_dataSearch Bolagsanalys figures for many companies (batch)A
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
countNofalse (default) skips totalCount for cheaper bulk paging.
toDateNoInclusive upper quarter bound, e.g. '20254' or '2025Q4'.
fromDateNoInclusive lower quarter bound, e.g. '20241' or '2024Q1'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
companyIdNoSingle company id; OR'd with companyIds.
quarterIdNoSingle packed quarter, e.g. '20251' or '2025Q1'.
companyIdsNoUp to 50 company ids (from bolagsanalys_list_companies) to fetch in one call; over 50 is rejected.
parameterCodeNoParameter code from bolagsanalys_find_parameter; omit for all parameters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesQuarterly figures, one row per company+parameter+quarter.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint/openWorldHint, it warns quarter bounds are packed quarter ids, not calendar dates; discloses the 50 cap is rejected; and specifies the response envelope and that rows keep companyId and parameterCode. No contradiction with the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, with read-only and purpose front-loaded; each sentence adds a distinct fact (scope, alternative route, quarter encoding, cap, return behavior). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter batch tool, the description covers selection criteria, sourcing of identifiers, quarter encoding, hard cap, and return shape; pagination/sort are already documented in the schema and output schema exists. Everything an agent needs to invoke correctly is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, so baseline is 3; description adds real value by sourcing companyIds from bolagsanalys_list_companies, parameterCode from bolagsanalys_find_parameter, and clarifying quarterId/fromDate/toDate use packed quarter ids such as '20251'/'2025Q1'. It does not repeat page/count semantics, but the schema already documents those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states precise verb-resource: 'Fetch quarterly figures for a SPECIFIC SET of companies in one call' with companyIds up to 50. It explicitly distinguishes from bolagsanalys_get_data by scope, so an agent can select correctly without relying on schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ('Use this for a specific N-company subset') and names the alternative for all companies ('to fetch ALL companies instead omit companyId on bolagsanalys_get_data'). Also notes the 50 cap is rejected, preventing wasted calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_sessionClear the cached Sedis session tokenA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the mutation nature (removes token from memory and disk cache) and the impact on subsequent calls (no X-Api-Session header). This goes beyond the annotations (readOnlyHint=false already indicates a write), providing concrete behavioral context about side effects and state change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the primary action, the consequence, and the explicit use case. The most important information is front-loaded, with no redundant or vague wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with no parameters and no output schema, the description covers the action, side effects, and usage context. An agent has everything needed to invoke it correctly, including when to call it and what happens afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is empty (coverage 100%). Per calibration, a baseline of 4 is given for 0 params. The description does not add parameter-specific semantics, but none are needed since there are no parameters to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Forget the locally-cached session token' and clarifies the effect (removes from memory and disk cache). It explicitly positions itself as the counterpart to set_session by describing the absence of the X-Api-Session header afterward, making its purpose distinct among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a direct usage instruction: 'Use it to sign out of the current session.' It also explains the consequence (calls send no header until set_session again), which implicitly routes the agent to the appropriate sibling (set_session) for re-authentication. This is explicit enough for an agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_find_parameterFind a Fastighetsbenchmark parameterA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage for names/descriptions; English default, 'sv' for Swedish.
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
groupNoParameter group name to filter by, e.g. 'Return'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive parameter-name fragment, e.g. 'Total return'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesMatching Fastighetsbenchmark CompParameters.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reinforces the readOnlyHint with 'Read-only' and 'Shared reference data; never writes', and gives a concrete sense of the operation's effect (a lookup returning parameter metadata). It does not mention pagination or performance, but the read-only reference nature is clear and consistent with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loads the read-only nature and purpose, explains output fields, gives an example, and states the relationship to the downstream tool. It avoids unnecessary prose while preserving the key operational details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the readOnlyHint/openWorldHint annotationshola and a 100%-documented schema, the description covers the tool's role, how its results are consumed, and the meaning of `dataType`. No important missing context stands out for an agent selecting or invoking this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all parameters with descriptions and examples, and the description adds usage context by naming `nameContains`-style substring matching. However, it does not map each query parameter to the discovery workflow beyond the overall example, so value added over the structured schema is modest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Discover') with a clear resource ('real-estate benchmark parameter') and lists the returned fields (`code`, English name, `dataType`, enumValues). It also distinguishes this tool from the downstream consumer `fastighetsbenchmark_get_comp_timeseries` by explaining how the output is used.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly says to use it to resolve the `parameterCode` passed to `fastighetsbenchmark_get_comp_timeseries` and to read `dataType` to decide which CompDatum member to trust. It does not explicitly contrast with sibling lookup/search tools, but it gives strong contextual guidance for the main workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_get_comp_timeseriesGet the CompDatum time-seriesA
Read-only

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 sedisIds 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
countNofalse (default) skips totalCount for cheaper high-volume bulk paging, e.g. false.
toDateNoInclusive upper ISO date bound (yyyy-MM-dd), e.g. '2026-12-31'.
fromDateNoInclusive lower ISO date bound (yyyy-MM-dd), e.g. '2016-01-01'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
sedisIdInYesComma-separated Comp sedisIds to fetch (multi-value), e.g. 'PU-1,PU-2'.
parameterCodeNoCompParameter code from fastighetsbenchmark_find_parameter; omit for all parameters, e.g. 'NX71'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesSelf-describing CompDatum rows — one per Comp+parameter+valueDate; dataType + sedisId kept on every row.
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page used for this response.
totalCountNoTotal matching rows across all pages; null/absent when count=false (v2 omits the key).
totalPagesNoTotal page count; null/absent when count=false.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint=true, so the safe-read trait is covered. The description adds genuinely useful behavioral detail beyond annotations: the self-describing dataType dispatch, the enum resolution rule (use enum.name, not the raw int), the warning not to conflate Comps, and the note that each row retains its sedisId. It also reaffirms read-only and tenant-scoped access. It doesn't document rate limits or pagination quirks beyond `count`, but for this tool that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but purposeful; it front-loads the read-only nature time-series return shape, and a concrete example. It is longer than minimal but every sentence adds operational guidance. Slight redundancy with annotations ('Read-only' / 'Tenant-scoped') costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a data-retrieval tool: it names the required inputs (`sedisIdIn`, `parameterCode`, dates), explains the self-describing `dataType` pattern, warns about enum handling and row identity, and gives a concrete example. With a rich output schema present, an agent has everything needed to call and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description, so the schema already carries good semantic weight. The description adds significant cross-tool semantics: it explains the provenance of sedisIds, the meaning and usage of dataType, the rule for enum handling, and the example values. The only weak spot is that the description doesn't map parameterCode omission behavior as clearly as the schema does, but overall it adds real value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Pull the actual benchmarking numbers (CompDatum time-series)') and clearly distinguishes this from sibling tools by naming it the FINAL step of the §8 A6 flow, with explicit references to the sibling tools that produce its inputs. An agent can tell exactly what this tool returns and how it fits in the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly maps the flow: use sedisIds from three named sibling tools, a parameterCode from fastighetsbenchmark_find_parameter, and an ISO date range. It also gives a concrete example and advises `count: false` for cheap bulk paging. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_list_jamforelseobjektList your comparison zones (Jämförelseobjekt)A
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
detailNofalse (default, lean) omits lineage; true opts the tenant-filtered containsPropertyUnits array in via ?fields=.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive comparison-zone-name fragment, e.g. 'Stockholm'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesYour comparison zones (Jämförelseobjekt).
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only' and 'never writes'. It adds useful behavioral context beyond the annotations: the list is tenant-scoped to the caller's data, and `detail: true` opts into a tenant-filtered `containsPropertyUnits` lineage. There is no contradiction with 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and front-loaded with the key facts: read-only, ownership, and result content. It flows logically from purpose to workflow to detail behavior to example. The only mild issue is that 'read-only' is stated twice, once at the start and again at the end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the output schema exists and all optional parameters are fully documented in the input schema, the description only needs to supply context, and it does thoroughly: ownership, tenant scoping, default lean behavior, a concrete example, and exact next-step parameter mapping. Nothing needed to invoke or chain the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 five parameters and the baseline is 3. The description adds value with a concrete `nameContains` example ('Stockholm') and explains how the returned `sedisId` feeds the downstream parameter `belongsToJamforelseobjektSedisId`, which is not present in this tool's schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List YOUR comparison zones', and clarifies that Jämförelseobjekt are 'your clones of a Sedis-owned aggregate' returning `sedisId`. It also positions the tool as the 'FIRST step of the §8 A6 flow' and names the downstream sibling, making it easy for an agent to distinguish from related list/search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: use this as the first step of the A6 flow, find a zone by name, then pass its `sedisId` to `fastighetsbenchmark_search_property_units`. It does not explicitly name a 'when-not-to-use' alternative such as `fastighetsbenchmark_list_reference_zones`, but the ownership contrast ('YOUR' vs 'Sedis-owned') provides enough directional guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_list_reference_zonesList reference zones (shared)A
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive reference-zone-name fragment, e.g. 'Stockholm'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesShared Sedis-owned reference zones (identical for every key).
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the 'Read-only' and 'never writes' statements reinforce rather than add new safety information. However, the description adds valuable behavioral context beyond annotations: it clarifies that data is 'shared for every key' and has 'NO tenant filter', which is a non-obvious trait not captured by the readOnlyHint/openWorldHint annotations. This extra context justifies a score above baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly written with no fluff. The most critical information (read-only, shared, no tenant filter) is front-loaded in the first sentence. Each subsequent sentence adds distinct value: output fields, use case, and an example. No unnecessary repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (list with optional filters) and the output schema exists, so return values are already documented. The description covers the tool's purpose, data scope, example usage, and output field semantics. Pagination is handled by the schema (page/pageSize). Nothing an agent needs to correctly invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds a concrete usage example ('Example: nameContains 'Stockholm'') which clarifies how to apply the nameContains parameter, and it mentions the output fields (sedisId, name, sourceName), providing helpful context for what the parameters filter. This example-driven guidance adds value beyond the schema, raising the score to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('List'), a specific resource ('SHARED Sedis-owned reference zones'), and explicitly distinguishes these from private data by noting 'NO tenant filter (these are not your private data)'. This makes the tool's purpose unambiguous and differentiates it from sibling tools that likely operate on tenant-specific data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: 'Use a reference zone as a market benchmark to compare against your own comparison zones and property units.' It implies the tool is for shared reference data, not private data, but does not explicitly name alternative tools or state when NOT to use it. The distinction from private data is implicit but sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_list_samlingarList your collections (Samling)A
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive collection-name fragment, e.g. 'Stockholm offices'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesYour collections (Samling).
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces the read-only nature ('Read-only', 'never writes'). It adds useful behavioral context beyond the annotations: the response shape (each row exposes `containingCompSedisIds` as an array of ids, not nested objects), the reference-then-resolve pattern, and the note that creating/replacing/deleting a Samling is not exposed here. It doesn't describe pagination behavior, but the schema already documents page/pageSize defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: it front-loads the read-only nature and the core purpose, then explains the response shape and the recommended workflow, and ends with an example. Every sentence earns its place, though the workflow explanation is slightly long and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with a rich output schema, 100% parameter coverage, and annotations declaring read-only and open-world hints, the description is complete. It tells the agent what the tool returns, how to use the returned ids, and what the tool does not do. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 four parameters. The description adds a concrete example for `nameContains` ('Stockholm offices') and explains the purpose of the returned ids, but it doesn't add meaning to the parameters beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a resource ('your collections (Samling)'), and a key differentiator: it lists the tenant's own collections, not reference zones or comparison objects. It also names the sibling tool to use for resolving the returned ids, which distinguishes it from the other list tools in the sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool (to list your own collections) and gives a concrete workflow: take the `containingCompSedisIds` from each row and pass them to `fastighetsbenchmark_get_comp_timeseries` via `sedisIdIn` only for the collections you need. It also gives a concrete example (`nameContains 'Stockholm offices'`), which is actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fastighetsbenchmark_search_property_unitsSearch your property units (Fastighet)A
Read-only

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 sedisIds 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoLanguage for names/descriptions; English default, 'sv' for Swedish.
pageNo1-indexed result page (first page = 1), e.g. 1.
sortNoComma-separated sort fields; prefix '-' for descending, e.g. '-name'.
pageSizeNoRows per page (v2 default 50, max 500), e.g. 50.
nameContainsNoCase-insensitive property-unit-name fragment, e.g. 'Office'.
propertyTypeNoProperty-type id (int, NOT a name); discover ids from find_parameter enumValues, e.g. 1 = Kontor/Office.
municipalityIdNoMunicipality id to filter by, e.g. 180 (Stockholm).
includeGeometryNofalse (default, lean) omits geometry; true opts the heavy geometry member into the response via ?fields=.
propertyTypeNameNoProperty-type by NAME (locale-aware), e.g. 'Office'/'Kontor'; alternative to the numeric propertyType id.
belongsToJamforelseobjektSedisIdNoComparison-zone sedisId (from list_jamforelseobjekt) — returns only your units in that zone, e.g. 'JO-A'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesYour matching property units (Fastighet).
pageYesThe page you are on (1-indexed).
pageSizeNoRows per page echoed back by v2, e.g. 50.
totalCountNoTotal matching rows across all pages; null/absent when count is skipped.
totalPagesNoTotal page count; null/absent when count is skipped.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only, and the description reinforces this with 'Read-only' and 'read-only — never writes'. It adds important behavioral detail beyond the schema: tenant scoping, lean-by-default geometry behavior, and the fact that `includeGeometry: true` opts into the heavy response member.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every clause earns its place: scope, key filters, return field, workflow position, geometry default, and tenant restriction. It front-loads the most essential information before giving examples and flow context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 10 parameters, a full input schema, an output schema, and rich sibling context, the description covers what an agent needs beyond structured data: the workflow step, the default behavior, and how to chain results forward. Nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the schema already documents all 10 parameters. The description adds meaningful value on top: it explains how `belongsToJamforelseobjektSedisId` connects to the comparison-zone flow, and gives concrete examples such as propertyType 1 (Office) and 'JO-A'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Find YOUR property units'), defines the target resource, and states the primary return value (`sedisId`). It also positions the tool as the object-finding step in the §8 A6 flow, distinguishing it from sibling tools like `fastighetsbenchmark_list_jamforelseobjekt` and `fastighetsbenchmark_get_comp_timeseries`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool and how it connects to the surrounding workflow, naming the upstream sibling (`list_jamforelseobjekt`) and downstream sibling (`get_comp_timeseries`). This is near-complete usage guidance for an object-finding step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesThe 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 paste it here.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses meaningful behavior beyond the annotations: the token is cached in an owner-only file, sent on subsequent calls, never logged or echoed, and using this avoids a full restart. The annotations only indicate it is not read-only, so this extra transparency is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the main action and trigger appear first, followed by the workflow and persistence behavior. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the trigger, the input source, the action, the persistence behavior, and the security context. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the token parameter in detail, including its origin and format, so the description adds little new information about the parameter itself. It reinforces the context but does not substantially expand on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('set') and resource ('sedis session token'), and clearly distinguishes this from a full client restart. The title reinforces the purpose, and the trigger condition makes the intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool ('when a tool returns Session re-verification required') and gives a clear step-by-step workflow. It does not explicitly name alternatives or exclusions, but the trigger-based guidance is strong enough for an agent to route correctly.

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.

  1. 12 tool updatesv1.1.6
    • Changedbolagsanalys_find_parameter8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / groupName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / groupName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / period / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / period / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedbolagsanalys_get_data8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / figure / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / figure / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / text / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedbolagsanalys_list_companies8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / countryCode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / countryCode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / isInactive / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / isInactive / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / nextReportDate / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / nextReportDate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedbolagsanalys_search_data8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / figure / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / figure / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / text / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedclear_session1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedfastighetsbenchmark_find_parameter10 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / groupName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / groupName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / isBaseData / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / isBaseData / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedfastighetsbenchmark_get_comp_timeseries8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / boolean / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / boolean / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / date / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / date / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / figure / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / figure / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedfastighetsbenchmark_list_jamforelseobjekt7 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedOutput schema / properties / data / items / properties / containsPropertyUnits / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": {},
        -      "properties": {
        -        "name": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "description": "Referenced Comp display name, e.g. 'Office tower 1'."
        -        },
        -        "sedisId": {
        -          "description": "Referenced Comp sedisId; resolve via get_comp_timeseries / search, e.g. 'PU-1'.",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "sedisId"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "name": {
        +          "description": "Referenced Comp display name, e.g. 'Office tower 1'.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "sedisId": {
        +          "description": "Referenced Comp sedisId; resolve via get_comp_timeseries / search, e.g. 'PU-1'.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "sedisId"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedfastighetsbenchmark_list_reference_zones8 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / insertedOnUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / insertedOnUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / sourceName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / sourceName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedfastighetsbenchmark_list_samlingar6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedfastighetsbenchmark_search_property_units6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / properties / data / items / properties / lastUpdatedUtc / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / lastUpdatedUtc / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedset_session1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  2. 12 tool updatesv1.1.5
    • First observedbolagsanalys_find_parameter
    • First observedbolagsanalys_get_data
    • First observedbolagsanalys_list_companies
    • First observedbolagsanalys_search_data
    • First observedclear_session
    • First observedfastighetsbenchmark_find_parameter
    • First observedfastighetsbenchmark_get_comp_timeseries
    • First observedfastighetsbenchmark_list_jamforelseobjekt
    • First observedfastighetsbenchmark_list_reference_zones
    • First observedfastighetsbenchmark_list_samlingar
    • First observedfastighetsbenchmark_search_property_units
    • First observedset_session

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation3/5

The session tool and the two domains are easy to tell apart, but bolagsanalys_get_data and bolagsanalys_search_data both retrieve financial data and the real distinction (single/all vs a specific company list) is buried in the descriptions. Similarly, list_companies and search_data could be confused at a glance despite returning very different things.

Naming Consistency4/5

Most tools follow a clear `<domain>_<verb>_<object>` pattern, e.g. bolagsanalys_list_companies and fastighetsbenchmark_list_samlingar. clear_session breaks the pattern but is a sensible cross-cutting helper; the get_data/search_data pair is the only genuinely confusing naming choice.

Tool Count4/5

The ten visible tools are appropriately scoped for two read-only data domains plus a session helper. However, the declared count of 12 doesn't match the provided list, which raises a minor coherence concern.

Completeness3/5

The read-only retrieval surface is fairly complete: each domain has parameter discovery, entity lookup, and data retrieval. Obvious gaps include no set_session counterpart to clear_session (despite descriptions referencing it) and no direct get-company-by-ID or list-all-companies tool for the Bolagsanalys side.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    B
    maintenance
    MCP server for accessing SEC EDGAR filings. Connects AI assistants to company filings, financial statements, and insider trading data with exact numeric precision.
    21
    659 PyPI
    357
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Hosted MCP server that gives AI agents real-time access to SEC EDGAR filings search, 10-K/8-K reading, XBRL financial facts, and insider-trade (Form 4) alerts.
    11 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for programmatic read-only access to RiseUp cashflow data, allowing AI assistants to retrieve budget information via natural language.
    2
    96 npm
    24
    MIT