@sedis/mcp
OfficialThis server lets MCP-capable AI assistants read-only query Sedis PartnerAPI v2 data for listed-company financials and real-estate benchmarking, and manage session tokens.
Search/list listed companies (Bolagsanalys) and discover financial parameters.
Fetch quarterly financial figures for one company, a batch of up to 50 companies, or all companies, with parameter/quarter filters.
Discover real-estate benchmark parameters and look up shared reference data: municipalities, property types, reference zones.
Search your property units (Fastighet), collections (Samling), and comparison zones (Jämförelseobjekt) using name, type, municipality, or zone filters.
Fetch CompDatum benchmarking time-series for selected Comps, with self-describing decimal/boolean/enum/date values.
Set or clear a cached session token for user-owned keys after 2FA, without restarting the client.
All tools are read-only; tenant isolation, auth, and billing are enforced by PartnerAPI v2.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@sedis/mcpVisa nyckeltal för Fabege"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@sedis/mcp
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:
Download
sedis-mcp.mcpbfrom the latest release.Double-click it (or open Claude Desktop → Settings → Extensions and drag it in) and click Install.
Paste your Sedis API key into the field that appears (stored in your OS keychain) and confirm.
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/mcpAdd 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 |
| yes | — | Your PartnerAPI v2 key. Sent only as the |
| no |
| Override the v2 base URL (e.g. for an alpha/beta environment). |
| no | — | Optional startup seed for the session token (user-owned keys only). Sent as |
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:
On a
401with reasonsession_expired/session_invalid, the tool error carries areproveUrl. Open it in a browser, complete 2FA, and copy the freshly-mintedsedis_sess_…token.Paste it with the
set_sessiontool — it is carried asX-Api-Sessionon the very next call, no client restart needed. Useclear_sessionto sign out.Optionally seed a token at startup with the
SEDIS_API_SESSIONenv var (handy for CI / power users); at runtimeset_sessionalways takes precedence.
Machine / org-wide keys (no owner) are headless — X-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 |
| Search the catalog of listed companies by name fragment. |
| Discover the right financial parameter by name fragment. |
| Fetch quarterly figures. Pass one |
| Batch-fetch figures for a specific set of companies — |
Fastighetsbenchmark (real-estate comparables)
Tool | What it does |
| Discover the right real-estate benchmark parameter by name. |
| Find YOUR property units (Fastighet) by exact |
| List YOUR collections (Samling) and their members. |
| List YOUR comparison zones (Jämförelseobjekt). |
| Pull the actual CompDatum benchmarking time-series (self-describing values). |
| List the shared, Sedis-owned market reference zones (same for every key). |
| Look up municipality ids for the |
| Look up property-type ids for the |
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 |
| Paste a freshly-minted |
| 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
14 toolsbolagsanalys_find_parameterFind a Bolagsanalys parameterARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language for names/descriptions; English default, 'sv' for Swedish. | |
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| group | No | Parameter group name to filter by, e.g. 'Income statement'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive parameter-name fragment, e.g. 'revenue'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Matching Bolagsanalys parameters. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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 figuresARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| count | No | false (default) skips totalCount for cheaper bulk paging. | |
| toDate | No | Inclusive upper quarter bound, e.g. '20254' or '2025Q4'. | |
| fromDate | No | Inclusive lower quarter bound, e.g. '20241' or '2024Q1'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| companyId | No | Company id from bolagsanalys_list_companies, e.g. 'SE-VOLV-B'. Omit to fetch ALL companies for the parameter/quarter (enables one-call ranking/aggregation). | |
| quarterId | No | Single packed quarter, e.g. '20251' or '2025Q1'. | |
| parameterCode | No | Parameter code from bolagsanalys_find_parameter; omit for all parameters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Quarterly figures, one row per company+parameter+quarter. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| countryCode | No | ISO-3166 alpha-2 country code, e.g. 'SE'. | |
| nameContains | No | Case-insensitive company-name fragment, e.g. 'Volvo'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Matching listed companies. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| count | No | false (default) skips totalCount for cheaper bulk paging. | |
| toDate | No | Inclusive upper quarter bound, e.g. '20254' or '2025Q4'. | |
| fromDate | No | Inclusive lower quarter bound, e.g. '20241' or '2024Q1'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| companyId | No | Single company id; OR'd with companyIds. | |
| quarterId | No | Single packed quarter, e.g. '20251' or '2025Q1'. | |
| companyIds | No | Up to 50 company ids (from bolagsanalys_list_companies) to fetch in one call; over 50 is rejected. | |
| parameterCode | No | Parameter code from bolagsanalys_find_parameter; omit for all parameters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Quarterly figures, one row per company+parameter+quarter. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 parameterARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language for names/descriptions; English default, 'sv' for Swedish. | |
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| group | No | Parameter group name to filter by, e.g. 'Return'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive parameter-name fragment, e.g. 'Total return'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Matching Fastighetsbenchmark CompParameters. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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-seriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| count | No | false (default) skips totalCount for cheaper high-volume bulk paging, e.g. false. | |
| toDate | No | Inclusive upper ISO date bound (yyyy-MM-dd), e.g. '2026-12-31'. | |
| fromDate | No | Inclusive lower ISO date bound (yyyy-MM-dd), e.g. '2016-01-01'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| sedisIdIn | Yes | Comma-separated Comp sedisIds to fetch (multi-value), e.g. 'PU-1,PU-2'. | |
| parameterCode | No | CompParameter code from fastighetsbenchmark_find_parameter; omit for all parameters, e.g. 'NX71'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Self-describing CompDatum rows — one per Comp+parameter+valueDate; dataType + sedisId kept on every row. |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page used for this response. |
| totalCount | No | Total matching rows across all pages; null/absent when count=false (v2 omits the key). |
| totalPages | No | Total page count; null/absent when count=false. |
TDQS
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 genuine behavioral context (rows are self-describing via dataType, enum resolves to {value,name,enumType}, count:false enables cheap bulk paging). It only partially covers return/paging mechanics, but output schema carries that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope and the flow position, and every sentence carries signal. Slight redundancy in repeating 'read-only — never writes' at both the start and end keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values need not be re-explained; the description covers inputs, sourcing, ordering in the flow, and the dataType self-description pattern. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: comma-separated multi-value sedisIdIn, the source of parameterCode, the ISO date range semantics, and a concrete worked example. It goes beyond restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull the actual benchmarking numbers (CompDatum time-series) for one or more Comps'), scoping it to Comps and distinguishing it from the search/list siblings. An agent can immediately tell what this returns versus the discovery tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions this as 'the FINAL step of the §8 A6 flow' and names the three upstream tools that supply sedisId plus find_parameter for parameterCode. It gives the exact when-to-use and the dependency chain, leaving no routing inference.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| detail | No | false (default, lean) omits lineage; true opts the tenant-filtered containsPropertyUnits array in via ?fields=. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive comparison-zone-name fragment, e.g. 'Stockholm'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Your comparison zones (Jämförelseobjekt). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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_municipalitiesList municipalities (shared)ARead-only
Read-only. Look up municipality ids — the municipalityId filter of fastighetsbenchmark_search_property_units. Shared reference data, the same for every key. Each row has id, name, countryCode and code (the official municipality code; for Sweden the SCB kommunkod, e.g. '0180'). Example: nameContains 'Stockholm' → id 21. Read-only — never writes.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Exact official municipality code (Sweden: SCB kommunkod), e.g. '0180'. | |
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| countryCode | No | ISO 3166-1 alpha-2 country, e.g. 'SE'. | |
| nameContains | No | Case-insensitive municipality-name fragment, e.g. 'Stockholm'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Municipalities (shared reference data). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the doubled 'Read-only / never writes' phrasing is largely redundant. However, the description adds genuinely non-annotated context: this is shared reference data, identical for every key (i.e. no per-key or permission scoping), and it gives a concrete lookup example ('Stockholm' → id 21).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the sibling linkage, and takes only a few sentences. Slight waste in stating read-only twice ('Read-only.' and 'never writes'), which duplicates the annotation and buys nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description correctly focuses on purpose, shared-reference semantics, and id resolution. Nothing essential for correct invocation is missing, though a note on how paging interacts with filtering would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented with examples. The description reinforces the meaning of `code` (official municipality code, SCB kommunkod) and illustrates nameContains, but adds no syntax or behavioral detail the schema lacks. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Look up municipality ids') and ties it directly to the consuming parameter (`municipalityId` filter of `fastighetsbenchmark_search_property_units`), making it trivially distinguishable from the other list_* siblings. An agent knows exactly what it returns (id, name, countryCode, code).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly ties usage to resolving ids for the `municipalityId` filter of a named sibling tool, which is strong when-to-use guidance. It does not state exclusions or say when the other reference-list siblings would be preferred, but the context is clear rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fastighetsbenchmark_list_property_typesList property types (shared)ARead-only
Read-only. Look up property-type ids — the propertyType filter of fastighetsbenchmark_search_property_units and the domain of the EB0 parameter. Shared reference data, the same for every key; names are Swedish. Example: nameContains 'Kontor'. Read-only — never writes.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive property-type-name fragment (names are Swedish), e.g. 'Kontor'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Property types (shared reference data). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description repeats 'Read-only' twice, adding no credit. It does contribute genuinely new context — that this is shared reference data identical across keys and that names are Swedish — which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is front-loaded and short, but 'Read-only' is stated twice (opening and closing) with no added information, which is wasted space against an annotation that already conveys it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description is complete enough for a read-only reference lookup, covering the cross-tool usage rationale, though it omits any note on pagination scale for a list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (page, sort, pageSize, nameContains) are already documented, including the 'Kontor' example. The description adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('look up property-type ids') and immediately frames it relative to a sibling ('the propertyType filter of fastighetsbenchmark_search_property_units'), so the agent can distinguish it from the other list_* reference tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context: this is the lookup you perform before using propertyType in search_property_units or the EB0 parameter, with a concrete example filter ('Kontor'). It does not name when *not* to use it or compare against fastighetsbenchmark_find_parameter, so it falls short of a 5.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive reference-zone-name fragment, e.g. 'Stockholm'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Shared Sedis-owned reference zones (identical for every key). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive collection-name fragment, e.g. 'Stockholm offices'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Your collections (Samling). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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.
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.
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.
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.
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.
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)ARead-only
Read-only. Find YOUR property units (Fastighet) by exact name, name fragment, property-type id, municipality, or comparison-zone membership, returning each unit's sedisId — the stable, case-sensitive key to use in every later call. name is the customer's own designation; an official property designation (fastighetsbeteckning, e.g. 'Klara 1:1') is not a name and is not searchable. Look up property-type and municipality ids with fastighetsbenchmark_list_property_types / fastighetsbenchmark_list_municipalities. 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 2, belongsToJamforelseobjektSedisId 'JO-A'. Tenant-scoped to your data; read-only — never writes.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language for names/descriptions; English default, 'sv' for Swedish. | |
| name | No | Exact property-unit name (your own designation), case-insensitive — returns that one unit, e.g. 'Kontoret Gladan 4'. | |
| page | No | 1-indexed result page (first page = 1), e.g. 1. | |
| sort | No | Comma-separated sort fields; prefix '-' for descending, e.g. '-name'. | |
| pageSize | No | Rows per page (v2 default 50, max 500), e.g. 50. | |
| nameContains | No | Case-insensitive property-unit-name fragment, e.g. 'Office'. | |
| propertyType | No | Property-type id (int, NOT a name); look ids up with fastighetsbenchmark_list_property_types, e.g. 2. | |
| municipalityId | No | Municipality id to filter by; look ids up with fastighetsbenchmark_list_municipalities (e.g. Stockholm = 21). | |
| includeGeometry | No | false (default, lean) omits geometry; true opts the heavy geometry member into the response via ?fields=. | |
| propertyTypeName | No | Property-type by NAME (locale-aware), e.g. 'Office'/'Kontor'; alternative to the numeric propertyType id. | |
| belongsToJamforelseobjektSedisId | No | Comparison-zone sedisId (from list_jamforelseobjekt) — returns only your units in that zone, e.g. 'JO-A'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Your matching property units (Fastighet). |
| page | Yes | The page you are on (1-indexed). |
| pageSize | No | Rows per page echoed back by v2, e.g. 50. |
| totalCount | No | Total matching rows across all pages; null/absent when count is skipped. |
| totalPages | No | Total page count; null/absent when count is skipped. |
TDQS
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 usefully reinforces it ('never writes') and adds real behavioral context the annotations do not carry: tenant scoping to 'your data', a lean-by-default response with geometry opt-in, and the important constraint that an official fastighetsbeteckning is not a name and is not searchable. It does not cover pagination limits or ordering guarantees, but those live in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the highest-value facts (read-only, what it finds, the sedisId key) and then the flow context; every sentence carries routing or semantic information. It is a dense single paragraph rather than a skimmable list, and 'Read-only' / 'read-only — never writes' is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required search tool with an output schema present, the description covers purpose, id-resolution dependencies, downstream handoff, scoping, and the geometry-lean default — everything needed to invoke it correctly without explaining return values. Minor omissions (pagination defaults, sort behavior) are already documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds conceptual semantics beyond the field docs: sedisId is described as the stable, case-sensitive key to use in every later call, name is the customer's own designation (not the official designation), and belongsToJamforelseobjektSedisId is framed as the zone-to-units bridge. The worked example (propertyType 2, 'JO-A') further anchors usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find/search) and resource (YOUR property units / Fastighet) plus the exact match modes accepted: exact name, name fragment, property-type id, municipality, comparison-zone membership. It also explicitly distinguishes itself from siblings by naming the id-lookup tools and the downstream consumer (get_comp_timeseries), so an agent can place it in the pipeline without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: it is 'the §8 A6 flow's object-finding step', take a comparison zone from list_jamforelseobjekt, filter here with belongsToJamforelseobjektSedisId, then pass the resulting sedisIds to get_comp_timeseries via sedisIdIn. It also names the alternatives for id resolution (list_property_types, list_municipalities), leaving nothing to inference.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The freshly-minted session token from the reprove page (e.g. starts with 'sedis_sess_…'). Open the reproveUrl shown in a 'Session re-verification required' error, complete 2FA, copy the token, and paste it here. |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v1.2.0- Changed
fastighetsbenchmark_get_comp_timeseries1 field changed- changed
Output schema / properties / data / items / properties / valueDate / descriptionPrevious value: -"ISO date (yyyy-MM-dd) of the period the value applies to (part of the natural key), e.g. '2025-12-31'."New value: +"ISO date (yyyy-MM-dd) of the period the value applies to (part of the natural key), e.g. '2025-12-31'. Usually 31 December, but it can be any quarter-end (e.g. '2026-06-30') — do NOT assume one row per year; flows on a quarter-end are rolling 12 months."
- Added
fastighetsbenchmark_list_municipalities - Added
fastighetsbenchmark_list_property_types - Changed
fastighetsbenchmark_search_property_units6 fields changed- changed
Input schema / properties / municipalityId / descriptionPrevious value: -"Municipality id to filter by, e.g. 180 (Stockholm)."New value: +"Municipality id to filter by; look ids up with fastighetsbenchmark_list_municipalities (e.g. Stockholm = 21)." - added
Input schema / properties / nameAdded value: +{ + "description": "Exact property-unit name (your own designation), case-insensitive — returns that one unit, e.g. 'Kontoret Gladan 4'.", + "type": "string" +} - changed
Input schema / properties / propertyType / descriptionPrevious value: -"Property-type id (int, NOT a name); discover ids from find_parameter enumValues, e.g. 1 = Kontor/Office."New value: +"Property-type id (int, NOT a name); look ids up with fastighetsbenchmark_list_property_types, e.g. 2." - added
Output schema / properties / data / items / properties / addressAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "countryCode": { + "description": "ISO 3166-1 alpha-2 country, e.g. 'SE'.", + "type": [ + "string", + "null" + ] + }, + "postalCode": { + "description": "Postal code, e.g. '111 57'.", + "type": [ + "string", + "null" + ] + }, + "postalTown": { + "description": "Postal town, e.g. 'Stockholm'.", + "type": [ + "string", + "null" + ] + }, + "streetNameAndNumber": { + "description": "Street name and number, e.g. 'Sveavägen 12'.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The unit's postal address { streetNameAndNumber, postalCode, postalTown, countryCode }." +} - added
Output schema / properties / data / items / properties / municipalityAdded value: +{ + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "code": { + "description": "Official municipality code (Sweden: SCB kommunkod), e.g. '0180'.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "Municipality id; use as the municipalityId filter, e.g. 21.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "name": { + "description": "Municipality name, e.g. 'Stockholm'.", + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The unit's municipality as { id, name, code }." +} - removed
Output schema / properties / data / items / properties / municipalityIdRemoved value: -{ - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "Municipality id." -}
12 tool updates
v1.1.6- Changed
bolagsanalys_find_parameter8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / groupName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / groupName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / period / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / period / typeAdded value: +[ + "string", + "null" +]
- Changed
bolagsanalys_get_data8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / figure / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / figure / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / text / typeAdded value: +[ + "string", + "null" +]
- Changed
bolagsanalys_list_companies8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / countryCode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / countryCode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / isInactive / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / isInactive / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / data / items / properties / nextReportDate / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / nextReportDate / typeAdded value: +[ + "string", + "null" +]
- Changed
bolagsanalys_search_data8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / figure / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / figure / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / text / typeAdded value: +[ + "string", + "null" +]
- Changed
clear_session1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
fastighetsbenchmark_find_parameter10 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / groupName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / groupName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / isBaseData / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / isBaseData / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / data / items / properties / unit / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / unit / typeAdded value: +[ + "string", + "null" +]
- Changed
fastighetsbenchmark_get_comp_timeseries8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / boolean / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / boolean / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / data / items / properties / date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / figure / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / figure / typeAdded value: +[ + "number", + "null" +]
- Changed
fastighetsbenchmark_list_jamforelseobjekt7 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Output schema / properties / data / items / properties / containsPropertyUnits / anyOfPrevious 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" + } +] - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
fastighetsbenchmark_list_reference_zones8 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / insertedOnUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / insertedOnUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / sourceName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / sourceName / typeAdded value: +[ + "string", + "null" +]
- Changed
fastighetsbenchmark_list_samlingar6 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
fastighetsbenchmark_search_property_units6 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / properties / data / items / properties / lastUpdatedUtc / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / lastUpdatedUtc / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
set_session1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
12 tool updates
v1.1.5- First observed
bolagsanalys_find_parameter - First observed
bolagsanalys_get_data - First observed
bolagsanalys_list_companies - First observed
bolagsanalys_search_data - First observed
clear_session - First observed
fastighetsbenchmark_find_parameter - First observed
fastighetsbenchmark_get_comp_timeseries - First observed
fastighetsbenchmark_list_jamforelseobjekt - First observed
fastighetsbenchmark_list_reference_zones - First observed
fastighetsbenchmark_list_samlingar - First observed
fastighetsbenchmark_search_property_units - First observed
set_session
TDQS
Scored across 14 tools
Most tools target clearly distinct resources and steps; the two closest pairs (bolagsanalys_get_data vs bolagsanalys_search_data, and list_jamforelseobjekt vs list_reference_zones) are explicitly differentiated in their descriptions. There is still mild overlap in purpose between the two data-fetch tools, so an agent must read carefully to pick the right one.
Strong, predictable verb_noun pattern within each domain prefix (fastighetsbenchmark_* and bolagsanalys_*), and the two session tools (set_session/clear_session) are clean and readable. The only deviation is that session tools don't share a domain prefix, but they're a distinct cross-cutting concern so this is a minor issue.
14 tools split across two coherent domains (real-estate benchmarking and company analysis) plus session handling is well-scoped. Each tool earns its place as a distinct step in the documented flows, with no redundant or trivial tools.
Both domains have complete read paths: reference lookups, parameter discovery, object search, and terminal data fetches, plus session lifecycle management. The main gap is the absence of write operations (e.g. creating/editing Samlingar or zones), which is acknowledged as intentional in the descriptions.
Maintenance
Related MCP Connectors
MCP server giving AI agents one-connection access to China A-share market intelligence: financials,
Hosted MCP server exposing US hospital procedure cost data to AI assistants
The Octagon MCP server provides specialized AI-powered financial research and analysis by integrating with the Octagon Market Intelligence API. It enables users to analyze public market data (SEC filings, earnings transcripts, financial metrics, and stock data for 8000+ companies), private market data (3M+ companies, 500k+ funding rounds, 2M+ M&A/IPO transactions), and conduct deep research including web scraping capabilities. The server also features autonomous research agents that search hundreds of sources and return fully cited reports in approximately one minute.
Token-free MCP server for structured RevoGrid Core, Pro, and Enterprise knowledge retrieval.
Related MCP Servers
- AlicenseCqualityBmaintenanceMCP server for accessing SEC EDGAR filings. Connects AI assistants to company filings, financial statements, and insider trading data with exact numeric precision.21523 PyPI363AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceHosted 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.14 npm1MIT

RiseUp MCP Serverofficial
AlicenseAqualityCmaintenanceMCP server for programmatic read-only access to RiseUp cashflow data, allowing AI assistants to retrieve budget information via natural language.2244 npm27MIT- AlicenseNot gradedqualityDmaintenanceMCP server for Swedish company data. Enables AI agents to lookup companies, analyze financials, assess health, screen compliance, and get industry stats.10 npmMIT