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.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, and the description reinforces 'Read-only' and 'never writes'. It adds useful context like 'Shared reference data', which explains the data's nature beyond the annotation. No contradictions.

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 three sentences, front-loaded with 'Read-only' and the core purpose. Every sentence adds value: purpose, workflow, and example. No fluff or redundancy.

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 tool has an output schema and 100% schema coverage, the description does not need to repeat return structure. It provides complete context for how the tool fits into the broader API workflow, which is sufficient for an agent to select and invoke it.

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 parameters are already well-documented. The description adds value with a concrete example (nameContains 'revenue', group 'Income statement') that demonstrates how to combine parameters, elevating it above the schema baseline.

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 ('Discover') and resource ('financial parameter'), and names the specific fields returned (code, English name, group, description). It distinguishes itself from siblings by explicitly connecting to `bolagsanalys_get_data`, making its role in the workflow unambiguous.

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?

Provides clear when-to-use guidance: 'Use this to resolve the `parameterCode` you then pass to `bolagsanalys_get_data`'. It also references `bolagsanalys_list_companies` for obtaining a `companyId`, establishing a workflow. It does not explicitly mention when not to use it, but the positive use case is strong enough.

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.7/5.0
Behavior5/5

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

Despite annotations already declaring readOnlyHint and openWorldHint, the description adds valuable behavioral context: quarter bounds are packed ids (e.g., '2025Q1') and are NOT calendar dates, every row retains companyId and parameterCode, and the tool never writes. This goes well beyond the annotations to clarify potential pitfalls.

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 well-structured and front-loaded with the core purpose ('Read-only. Fetch quarterly figures for one company'). It then provides necessary details in a logical order without superfluous content. Every sentence adds value, and the length is appropriate given the tool's complexity.

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?

With a rich output schema and full schema descriptions, the description focuses on usage context rather than return values. It covers prerequisites, optional narrowing, the packed quarter format, and the read-only nature. It is complete for the tool's complexity and offers clear guidance to an agent.

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 schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining the packed quarter format in detail, giving a concrete example (companyId 'SE-VOLV-B', parameterCode 'REV', fromDate '2024Q1', toDate '2025Q4'), and clarifying that quarterId, fromDate, and toDate are quarters, not dates. This enhances the schema's parameter descriptions.

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 the tool fetches quarterly figures for one company, with optional narrowing by parameter and quarter range. It specifies the verb (fetch), resource (quarterly figures), and scope (one company), and distinguishes itself from related tools by referencing prerequisites like companyId and parameterCode sourced from sibling 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 provides clear context on when to use the tool (when you have a companyId from bolagsanalys_list_companies) and explains the source of required IDs. However, it does not explicitly mention when not to use it or name alternative tools such as bolagsanalys_search_data, so it stops short of full exclusions.

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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. Description reinforces read-only behavior and adds new context: 'Reference data shared across all tenants' and 'never writes or ingests.' It also explains the chaining behavior (use result in get_data). No contradiction; adds useful context beyond 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?

Three sentences, front-loaded with 'Read-only.' Each sentence earns its place: safety, purpose, flow, example, shared-data note. No wasted words or repetition of schema fields.

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 search tool with 5 optional params and an output schema, the description covers safety, search criteria, return value, and downstream usage. It is complete enough for an agent to know when and how to invoke it correctly.

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 baseline is 3. The description adds a concrete example ('nameContains 'Volvo', countryCode 'SE'') and explains that the companyId result is intended for use in bolagsanalys_get_data, providing practical usage semantics beyond the schema's per-parameter descriptions.

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 specific action: search Sedis's catalog of listed companies by name fragment or country code, returning companyId and name. It distinguishes from sibling bolagsanalys_get_data by positioning as the first step, and mentions the next tool to use.

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?

Explicitly says this is the FIRST step of the Bolagsanalys flow and to pass the returned companyId to bolagsanalys_get_data. Clear context for when to use, though it doesn't explicitly mention alternatives like bolagsanalys_search_data or fastighetsbenchmark tools, the flow guidance is strong.

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?

Although `readOnlyHint` is already true, the description adds the explicit 'read-only — never writes' guarantee, the 50-company cap with rejection behavior, the packed quarter format (not calendar dates), and the fact that rows retain `companyId` and `parameterCode`. These exceed what annotations provide and are not contradictory.

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 entirely purposeful. Each sentence contributes a distinct piece of guidance (read-only, batch scope, alternatives, quarter format, cap, return envelope). It is front-loaded with the most important facts and contains 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?

Given the tool's complexity (10 params, batch semantics), the description covers all high-stakes points: subset vs all, quarter encoding, cap, and response envelope. The presence of an output schema eliminates the need to document return fields, and the description leverages the sibling reference to complete the context.

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% (baseline 3). The description adds valuable semantics beyond the schema: explains packed quarter format for `quarterId`/`fromDate`/`toDate`, clarifies the 50-item limit on `companyIds`, and references the return envelope of the sibling tool. This is more than just repeating schema definitions.

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 the action ('Fetch quarterly figures'), the specific resource ('a SPECIFIC SET of companies in one call'), and the mechanism (`companyIds`). It directly distinguishes from the sibling `bolagasanalys_get_data` by contrasting the batch purpose with the all-companies alternative.

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?

Explicitly says when to use this tool ('a specific N-company subset') and when not ('to fetch ALL companies instead omit companyId on bolagasanalys_get_data'). It also provides format conventions for quarter bounds, which is essential for correct usage.

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.7/5.0
Behavior5/5

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

The description discloses the full behavioral impact: it removes the token from memory and on-disk cache, and subsequent calls will omit the header until set_session is called. This goes beyond the annotations (readOnlyHint: false) by specifying exactly what gets destroyed and the side effects, which is exactly the kind of context needed.

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 two sentences, front-loaded with the core action ('Forget the locally-cached session token'), followed by the consequence and usage guidance. Every sentence earns its place with no redundant information.

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 tool has no parameters, no output schema, and clear annotations, the description completely covers the essential context: what it does, what happens to the token, how it affects subsequent calls, and when to use it. An agent can confidently invoke this tool based on the description alone.

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, so the baseline is 4. The description does not need to explain any parameter semantics, and it doesn't. It appropriately focuses on the tool's action and consequences.

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 the purpose: 'Forget the locally-cached session token (removes it from memory and the on-disk cache)'. It uses a specific verb ('forget') and resource ('session token'), and makes the tool's action distinct from sibling tools like set_session.

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 explicit guidance on when to use this tool: 'Use it to sign out of the current session.' It also explains the behavioral consequence ('calls send no X-Api-Session header until you set_session again'), giving clear context. However, it does not explicitly mention when not to use it or contrast with alternatives beyond the implied set_session.

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?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only' and 'never writes'. It adds extra context beyond annotations by explaining what the tool returns and how to interpret dataType for CompDatum values. No contradiction 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 efficient, front-loading the read-only nature and purpose, then providing a concrete usage example. Every sentence adds value, and it is well-structured for quick comprehension.

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, the description does not need to explain return values. It covers the tool's purpose, relationship to another tool, and how to interpret output data types. It is complete for an AI agent to decide when and how to use it.

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 baseline is 3. The description references nameContains and group but does not add meaning beyond the schema's parameter descriptions. It does not explain each parameter, but the schema already covers that.

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 the tool's purpose: discovering real-estate benchmark parameters by name fragment or group, and returning specific fields (code, name, dataType, enumValues). It distinguishes itself from siblings by explicitly linking to the consumer tool 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 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 to resolve the parameterCode you pass to fastighetsbenchmark_get_comp_timeseries'. It does not explicitly mention alternatives or when not to use, but the downstream usage is clearly stated, which is strong guidance.

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

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds key behavioral details: rows are self-describing via dataType, enum values resolve to { value, name, enumType } (use enum.name), every row keeps its sedisId, and count:false enables cheap bulk paging. It also confirms the tool never writes, reinforcing the 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?

The description is efficient yet comprehensive. It front-loads the read-only nature and purpose, then systematically covers inputs, data handling, pagination, and scope. Every sentence adds unique value, and the example reinforces understanding without redundancy.

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 tool's complexity (multiple parameters, enum handling, pagination) and the presence of an output schema, the description covers all essential aspects: how to interpret returned data (dataType, enum, sedisId preservation), performance tips, and tenant scoping. It leaves no critical gaps for an agent to resolve.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial meaning: it explains where to get sedisIdIn values (from sibling tools), that parameterCode comes from fastighetsbenchmark_find_parameter and is optional, and clarifies count:false for high-volume paging. The example ties all parameters together.

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 ('Pull') and names the resource ('CompDatum time-series') while explaining it is the final step of the §8 A6 flow. It clearly distinguishes from sibling tools by specifying where to get the needed inputs (search_property_units, list_samlingar, etc.).

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?

Explicitly states when to use this tool (final step of the flow), what inputs to pass (sedisIdIn, parameterCode, date range), and references alternative tools for finding those inputs. It also includes a concrete example and warns against conflating Comps, providing clear context.

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.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 description's 'Read-only' and 'never writes' are not contradictory. It adds valuable behavior context beyond annotations: tenant-scoping, lean-by-default behavior, and that detail:true opts into a tenant-filtered containsPropertyUnits lineage.

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 concise sentences with no filler. The first sentence front-loads purpose and read-only status, the second explains the workflow, the third clarifies parameter defaults with an example, and the fourth reinforces tenant scoping. 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?

For a list tool with 5 parameters, no required fields, and an output schema, the description covers purpose, usage flow, parameter nuances, tenant scoping, and read-only safety. Pagination is handled by schema. No significant gaps remain.

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 baseline is 3. The description adds extra semantics for the 'detail' parameter by explaining the lean default and the tenant-filtered lineage, and gives a concrete example for nameContains ('Stockholm'). This goes beyond the schema descriptions.

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 a specific verb+resource: 'List YOUR comparison zones' and clarifies what is returned (sedisId). It distinguishes from sibling tools by noting these are 'your clones of a Sedis-owned aggregate' and positions it as the first step of a flow.

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?

Provides clear usage context: it is the 'FIRST step of the §8 A6 flow' and explicitly names the next tool to use with the returned sedisId. It distinguishes 'your' zones from 'Sedis-owned' aggregates, though it does not explicitly name when-not-to-use sibling tools like list_reference_zones.

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.1/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 'Read-only' and 'never writes'. It adds valuable context: data is shared, same for every key, no tenant filter, and each row exposes sedisId, name, and sourceName. No contradiction 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.

Conciseness4/5

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

The description is well-structured with a leading 'Read-only', a clear scope statement, field list, usage context, and example. It is slightly redundant by repeating 'read-only' at the end, but overall it is efficient and earns its place.

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?

Given the output schema and annotations, the description covers purpose, shared scope, fields, and a usage example. It is complete for a list tool with rich structured metadata, though it could have explicitly listed sibling alternatives but that is not essential.

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 baseline is 3. The description mentions nameContains with an example, but the schema already provides the same example ('Stockholm'), so it adds little beyond what the schema already documents.

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 the tool lists 'SHARED Sedis-owned reference zones' with a specific verb (List) and resource, and distinguishes them from private data. It also notes the fields exposed and the use case, making it unambiguous and different from sibling list 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 provides a clear use case ('Use a reference zone as a market benchmark to compare against your own comparison zones and property units') and gives an example with nameContains. It does not explicitly name alternative tools, but it distinguishes shared reference data from private data, giving contextual guidance.

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.3/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 by stating 'Read-only' and 'never writes'. It adds valuable context beyond annotations: the response exposes `containingCompSedisIds` as an array of ids (not nested objects), enabling a reference-then-resolve workflow, and notes tenant-scoping. It also clarifies that write operations are not exposed here, which is useful behavioral disclosure.

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 three sentences long, with every sentence earning its place. It leads with 'Read-only', explains the key output format, gives a concrete example, and ends with an explicit write-exclusion. No fluff or repetition of schema 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 tool has an output schema, the description does not need to explain return values. It covers the essential context: tenant scoping, read-only nature, the shape of `containingCompSedisIds`, a usage pattern with another tool, and a concrete filter example. This is complete for a list operation with well-documented parameters and output.

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 provides 100% coverage with descriptions and examples for all four parameters (page, sort, pageSize, nameContains). The description does not add new parameter-specific semantics beyond repeating the nameContains example, which is already in the schema. It does provide context on how to use the output with another tool, but that does not directly enhance parameter understanding.

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 the tool lists collections (Samling), names the exact resource, and distinguishes itself as read-only. It also differentiates from sibling tools by explicitly noting that creating/replacing/deleting a Samling is not exposed here, and references how the output feeds into `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 Guidelines4/5

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

The description provides clear context for using the tool: it lists YOUR collections, is tenant-scoped, and is read-only. It gives a specific example (`nameContains 'Stockholm offices'`) and advises passing the resulting `containingCompSedisIds` to `get_comp_timeseries` only for needed collections to keep payloads bounded. It does not explicitly contrast with sibling list tools like `list_jamforelseobjekt`, but the scoping and read-only nature make the usage clear.

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?

Beyond the readOnlyHint and openWorldHint annotations, the description adds critical behavior: tenant scoping ('Tenant-scoped to your data'), explicit read-only assurance ('never writes'), and default geometry omission. No contradiction 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 dense but every sentence carries operational value: purpose, workflow, defaults, example, and scoping. It is front-loaded with the most critical info and avoids 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?

With an output schema present and 10 optional parameters, the description covers purpose, usage flow, parameter semantics via example, default behavior, and tenant scoping. It provides everything an agent needs to select and invoke the tool correctly.

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 all parameters with descriptions (100%), so baseline is 3. The description adds value with a concrete example ('propertyType 1 (Office), belongsToJamforelseobjektSedisId 'JO-A'') and clarifies the relationship between propertyType and propertyTypeName, as well as the role of belongsToJamforelseobjektSedisId in the flow.

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 the verb ('Find') and resource ('your property units') with specific filter dimensions (name, property-type id, municipality, comparison-zone membership). It distinguishes itself from siblings by positioning as the 'object-finding step' in the §8 A6 flow.

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?

Explicitly describes the full workflow: take a comparison zone from fastighetsbenchmark_list_jamforelseobjekt, filter with belongsToJamforelseobjektSedisId, and pass sedisIds to fastighetsbenchmark_get_comp_timeseries. Also notes the lean default and includeGeometry toggle.

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.9/5.0
Behavior5/5

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

Discloses important behavioral traits beyond the sparse annotations: the token is cached locally (owner-only file), sent as the X-Api-Session header on every subsequent call, and never logged or echoed. This provides critical context about statefulness and privacy.

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 concise sentences, each earning its place: the first states the core action and benefit, the second gives the trigger and workflow, the third explains side effects. Front-loaded and free of redundancy.

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 single-parameter setter with no output schema, the description fully covers the trigger condition, the exact steps to obtain the token, what the tool does with it, and post-call behavior. Nothing critical 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% and the parameter description already includes the example prefix and workflow. The tool description reinforces these but also adds behavioral context about caching and header usage, enriching the parameter's purpose beyond the schema alone.

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 the tool's function: pasting a session token to refresh the session without restarting. It distinguishes itself from the sibling 'clear_session' by being the setter counterpart, and the title adds the specific context of 'after re-proving 2FA'.

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?

Explicitly instructs when to use: when a tool returns 'Session re-verification required'. Provides a concrete step-by-step workflow (open reproveUrl, complete 2FA, copy token, call this tool, retry original call), eliminating ambiguity.

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. Dates show when Glama detected each change.

  1. 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.6/5.0
Disambiguation5/5

Each tool has a distinct role with clear domain prefixes (bolagsanalys_, fastighetsbenchmark_) and specific actions (list, find, search, get). Even similar-looking tools like bolagsanalys_get_data vs bolagsanalys_search_data are differentiated by cardinality. No two tools overlap in function.

Naming Consistency5/5

Tool names follow a consistent pattern of domain prefix + verb + noun, all in snake_case. Verbs are predictable (list, find, search, get, set, clear) and match the tool's function. The naming is uniform across both domains.

Tool Count5/5

At 12 tools, the server covers two distinct data domains plus session management without redundancy. Each tool serves a clear purpose in its respective workflow, and the count feels neither bloated nor sparse.

Completeness5/5

For the read-only Bolagsanalys and Fastighetsbenchmark use cases, the tool surface covers discovery (list/find), retrieval (get/search), and session lifecycle (set/clear). The workflows are fully traceable from finding an entity to pulling the final time-series. No critical operations appear missing.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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
    355
    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.
    15
    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
    154
    22
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sedis-ab/sedis-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server