Skip to main content
Glama

Query the cross-source change archive

list_changes
Read-onlyIdempotent

Get created, updated, or deleted changes across polled Norwegian sources for incremental sync, with filters for source, entity, and time range.

Instructions

Read Apier's cross-source change archive — detected created / updated / deleted events across the upstreams Apier polls (Brønnøysund ingestion plus the Altinn-schema, DigDir-policy, and Norges Bank pollers) so agents drive incremental sync instead of re-fetching whole entities. observation_kind separates cache warm-up rows from genuine transitions. Filter by { source, entity_type, entity_id, change_type } and a { from }–{ to } detected_at range. Queries WITHOUT entity_id withhold personal-field rows by design (personal_fields_withheld: true); the org-scoped form returns everything. Keyset-paginated newest-first: pass { limit } (1–500, default 50) and carry next_cursor back verbatim — cursors are HMAC-signed; an edited one is rejected as CURSOR_INVALID - start over without a cursor. Failure modes: SCOPE_INSUFFICIENT (needs read:changes), VALIDATION_FAILED, CURSOR_INVALID. No sandbox mirror — a sandbox bearer gets SANDBOX_TOOL_UNAVAILABLE. Docs: https://www.apier.no/docs/guides/webhooks

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
toNoUpper bound on detected_at; must be ≥ from.
fromNoLower bound on detected_at (ISO 8601 with timezone offset).
limitNoPage size 1–500 (route default 50).
cursorNoOpaque signed cursor from a previous `next_cursor` — pass back verbatim.
sourceNoFilter to one upstream source (e.g. brreg / altinn / digdir / norges_bank). Omit for all sources.
entity_idNoFilter to one entity's change stream (e.g. a 9-digit org number).
change_typeNoFilter to created / updated / deleted events.
entity_typeNoFilter to one entity type (e.g. annual_accounts, company).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
_metaNo
resultYesThe change page: `data[]` rows (source, entity_type, entity_id, change_type, detected_at, source_snapshot_id, observation_kind), a `pagination` block, and `personal_fields_withheld`. Ordered newest-first.
metadataYes
justificationYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.2.1

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the burden is lowered, and the description exceeds it substantially. It discloses privacy behavior (personal-field rows withheld without entity_id, 'personal_fields_withheld: true'), HMAC-signed cursor rejection ('an edited one is rejected as CURSOR_INVALID'), three named failure modes (SCOPE_INSUFFICIENT requiring read:changes, VALIDATION_FAILED, CURSOR_INVALID), sandbox absence (SANDBOX_TOOL_UNAVAILABLE), and the observation_kind cache-warm-up/transition distinction. This is rich behavioral context beyond any structured field.

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

Conciseness4/5

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

A dense single paragraph where nearly every clause earns its place: purpose and sources first, then filters, privacy behavior, pagination mechanics, error modes, and a docs link. It is long (~200 words), but the complexity — 8 parameters, keyset pagination, signed cursors, failure modes — justifies the length. Minor structural improvement would be line breaks between the behavioral concerns, but the most important information is front-loaded.

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

Completeness5/5

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

For a tool this complex — 8 parameters, keyset pagination, cursor signing, privacy filtering, auth scope, sandbox behavior — the description covers everything an agent needs to call it correctly: filter semantics, offset mechanics, the verbatim cursor rule, error codes and their meaning, required scope, and the sandbox limitation. The output schema covers return values, so nothing is missing.

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

Parameters4/5

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

Schema description coverage is 100%, establishing a baseline of 3. The description adds genuine value beyond the schema: it groups the four filters ({ source, entity_type, entity_id, change_type }), frames from/to as a detected_at range, includes the route default for limit (1–500, default 50), and clarifies cursor semantics ('HMAC-signed; an edited one is rejected') beyond the schema's bare 'pass back verbatim' note.

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

Purpose5/5

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

The opening verb 'Read' names a specific resource ('Apier's cross-source change archive') and the precise content ('detected created / updated / deleted events across the upstreams Apier polls'). The stated purpose, 'so agents drive incremental sync instead of re-fetching whole entities,' tells an agent exactly what this tool is for and clearly distinguishes it from sibling read tools like search_companies or get_company_profile.

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

Usage Guidelines4/5

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

The description gives a clear use context ('drive incremental sync instead of re-fetching whole entities'), which implies when this tool is the right choice. However, it never names an alternative sibling or states an explicit exclusion — e.g., it doesn't say 'use get_company_profile when you need a current snapshot.' The guidance is present but implicit rather than explicit.

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