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.
from after to is rejected. Every date-filtered result echoes the window it used:
Row caps and truncation
list_casesreturns one page per call.limitis 1-200 (default 50).list_case_hoursandlist_case_sales_invoicesfollow pages of 200 internally and accumulate up tomaxRows(default 500, max 2,000).get_case_work_summaryreads up to 2,000 hour rows and 2,000 invoices.truncated: truemeans 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 anamountsNote saying so. Check one known case
against the Ordrestyring UI before treating a number as DKK.
The case object
Returned bylist_cases, find_cases and get_case:
Cases
list_cases
List cases, one page per call, with the case object above. Pass the returnednextCursor 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).{ count, items, nextCursor, hasMore }.
find_cases
Case-insensitive substring match oncaseNumber, 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).
{ 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).
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)
{ "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 onlycostPrice, 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.
{ 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 containsid 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.
{ 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.
string
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.{ 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.
{ 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 thedata 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.
- Collections take
pagination: { cursor, limit }(limit max 200) and return{ items, nextCursor }. orderBy: { field: "updatedAt", direction: DESC }:fieldis a quoted string anddirectionan enum.- Some collections take
between: { field: startTime, from: <unix seconds>, to: <unix seconds> }: herefieldis an unquoted enum.
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 withisError: 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.