Skip to main content
All Ordrestyring tools are read-only and are called via tools/call over POST /ordrestyring/mcp. The connector is connected with an API key that Ordrestyring’s support issues per agreement. There is no OAuth and there are no scopes. See Forbind Ordrestyring.
Endpoint: https://mcp.consile.ai/ordrestyring/mcp. Ordrestyring is its own named connector with only its own tools. The transport namespaces each tool as ordrestyring__<tool> (e.g. ordrestyring__list_cases). The headings below use the bare tool names; in a tools/call request always send the namespaced name, as in the examples. A bare name returns Unknown tool.The connector is multi-instance: each additional Ordrestyring agreement the customer adds as a portal is served on its own endpoint, e.g. https://mcp.consile.ai/ordrestyring-2/mcp, with tools named ordrestyring-2__<tool>. Each portal uses only its own agreement’s key.Besides these 9 tools, tools/list on every Ordrestyring endpoint also returns one unprefixed system tool, connect_account (no arguments). It returns { connect_url, instructions }: a link, valid for 10 minutes, that opens the Consile portal’s connect form for that endpoint, where the API key is pasted. It does not read any Ordrestyring data.
Read-only by construction. The Ordrestyring API key grants full access upstream, so the connector checks every GraphQL document before it is sent. This includes the documents behind the fixed tools. A document is accepted only if it parses, contains exactly one operation, and that operation is a query (fragment definitions are allowed). The following are refused before any request is made: mutations, subscriptions, several operations in one document, schema definitions, unparseable documents, and documents longer than 65,536 characters or with more than 20,000 tokens. Every tool is annotated readOnlyHint: true, destructiveHint: false, openWorldHint: false. There are no confirm-gated tools.

Shared conventions

One key, one company

One API key belongs to exactly one Ordrestyring agreement (one company). No tool takes a company or agreement parameter, because the key scopes every request. A customer with several agreements connects one portal (one key) per agreement.

Case id vs. case number

get_case, get_case_work_summary, list_case_hours and list_case_sales_invoices take the numeric Ordrestyring case id, not the human-facing caseNumber. Resolve a case number to its id with find_cases, or read id from list_cases.
integer
required
Positive integer: the Ordrestyring case id (not the caseNumber).

Date ranges

The hour and invoice tools filter by calendar day in Europe/Copenhagen local time.
string (YYYY-MM-DD)
First day, inclusive from local midnight. Defaults to 2000-01-01.
string (YYYY-MM-DD)
Last day, inclusive as a whole day. The bound sent upstream is the following local midnight, exclusive. Defaults to today in Copenhagen.
A from after to is rejected. Every date-filtered result echoes the window it used:

Row caps and truncation

  • list_cases returns one page per call. limit is 1-200 (default 50).
  • list_case_hours and list_case_sales_invoices follow pages of 200 internally and accumulate up to maxRows (default 500, max 2,000).
  • get_case_work_summary reads up to 2,000 hour rows and 2,000 invoices.
  • truncated: true means rows were left behind.

Amounts

Ordrestyring does not document the unit of its amounts (its legacy REST API used øre). Every amount is passed through exactly as Ordrestyring returns it, and every money-bearing result carries an amountsNote saying so. Check one known case against the Ordrestyring UI before treating a number as DKK.

The case object

Returned by list_cases, find_cases and get_case:

Cases

list_cases

List cases, one page per call, with the case object above. Pass the returned nextCursor back as cursor. hasMore: false means every case has been seen.
string
Non-empty cursor from a previous call’s nextCursor. Omit for the first page.
integer
default:"50"
Rows per page, 1-200.
enum
default:"updatedAt"
updatedAt or id.
enum
default:"DESC"
ASC or DESC (DESC = newest first).
Returns { count, items, nextCursor, hasMore }.

find_cases

Case-insensitive substring match on caseNumber, description and customer.name. Ordrestyring has no confirmed server-side case search, so the tool scans the most recently updated cases (sorted updatedAt DESC, pages of 200) and filters them in the connector. A case updated before the scanned window is not found.
string
required
Substring to match (case-insensitive).
integer
default:"3"
Pages of 200 recently updated cases to scan, 1-5 (600 cases by default, 1,000 at most).
Returns { count, items, scanned, pagesScanned, truncated, note? }. truncated: true means older cases exist that were not scanned, and note says so.

get_case

One case by its numeric id, with the case object above.
integer
required
Case id (not the case number).
Returns the case object, or null. An id that does not exist comes back as an Ordrestyring validation error naming the field (see Errors).

Economy per case

get_case_work_summary

One combined picture of what has been spent on and invoiced from a case. Hour registrations are filtered on their start time and sales invoices on their date, both by the date range. The material total is an aggregate for the whole case and is not date-filtered. The hours section reports how many hour registrations exist and their total cost price. It does not report the number of hours worked or a sales price.
integer
required
Case id.
string (YYYY-MM-DD)
string (YYYY-MM-DD)
Example result (illustrative values):
The three sections are read independently. If one section fails, it comes back as { "unavailable": "<ErrorName>: <message>" } (message cut at 200 characters) and the other sections still answer. Two cases fail the whole call instead: a rejected key or a rate limit in any section, and all three sections failing.

list_case_hours

The hour registrations on a case in a date range, filtered on the registration’s start time. Each row contains only costPrice, which is the only verified field. For employee, hour type, duration or sales price, use describe_type and graphql_query.
integer
required
Case id.
string (YYYY-MM-DD)
string (YYYY-MM-DD)
integer
default:"500"
Rows to accumulate across pages, 1-2,000.
Returns { caseId, period, count, costPriceTotal, items: [{ costPrice }], truncated, amountsNote }.

list_case_sales_invoices

The sales invoices raised on a case in a date range, filtered on the invoice date. Each row contains id and amount.
integer
required
Case id.
string (YYYY-MM-DD)
string (YYYY-MM-DD)
integer
default:"500"
Rows to accumulate across pages, 1-2,000.
Returns { caseId, period, count, amountTotal, items: [{ id, amount }], truncated, amountsNote }.

Schema discovery and free queries

The dedicated tools cover the fields verified against the live API. Everything else in Ordrestyring’s GraphQL schema is reachable through these three tools. Use them in this order: introspect_schema, then describe_type, then graphql_query.

introspect_schema

Lists the top-level query fields with their arguments and result types as one-line signatures (field(arg: Type): Result). It never returns the whole schema.
Case-insensitive filter on field name and description.
integer
default:"25"
Maximum query fields to return, 1-100.
boolean
default:"false"
Also return matching type names (max 100) to pass to describe_type.
Returns { queryTypeName, total, returned, truncated, fields: [{ name, description, signature }], typeNames?, typeNamesTruncated? }. Results over 40,000 characters are refused. If introspection is disabled for the account, the call fails. In that case, use the conventions listed under graphql_query.

describe_type

Describes one GraphQL type: kind, output fields (with argument and result types), input fields (for filter and pagination inputs) and enum values.
string
required
Exact type name, case-sensitive (e.g. Case).
integer
default:"60"
Maximum entries per section, 1-200.
Returns { name, kind, description, found: true, fields, inputFields, enumValues, interfaces?, possibleTypes? }. Each section has the form { total, returned, truncated, items }. An unknown name returns { name, found: false }. Results over 40,000 characters are refused.

graphql_query

Runs an arbitrary read-only GraphQL query and returns the data object unchanged.
string
required
A GraphQL document with exactly one query operation (fragments allowed). Never a mutation or subscription.
object
Optional variables for the document.
Conventions:
  • Collections take pagination: { cursor, limit } (limit max 200) and return { items, nextCursor }.
  • orderBy: { field: "updatedAt", direction: DESC }: field is a quoted string and direction an enum.
  • Some collections take between: { field: startTime, from: <unix seconds>, to: <unix seconds> }: here field is an unquoted enum.
Results over 100,000 characters (serialized JSON) are refused: narrow the selection set or lower limit. A response that contains any GraphQL error fails the call, even if partial data came back.

Errors and timeouts

Tool failures come back as a normal tool result with isError: true and one text block. Ordrestyring is one of the connectors that returns explanatory messages: the first three rows below are the connector’s own, the next two come from the platform, and everything else returns the generic text. Each upstream request times out after 20 s. Only throttling is retried, once. See Errors & limits for the protocol-level errors, the other platform refusals and the rate limits shared by all connectors.

Code examples