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. No tool can write to Ordrestyring. A GraphQL document is accepted
only if it parses, contains exactly one operation, and that operation is a
query (fragment definitions are allowed). Mutations, subscriptions, several
operations in one document and schema definitions are refused, and so are
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. Defaults to today in Copenhagen.
from after to is rejected. Every date-filtered result echoes the window it
used. toUnix is the local midnight after to, exclusive:
Row caps and truncation
list_casesreturns one page per call.limitis 1-200 (default 50).list_case_hoursandlist_case_sales_invoicesreturn up tomaxRowsrows (default 500, max 2,000).get_case_work_summarycounts up to 2,000 hour rows and 2,000 invoices.truncated: truemeans rows were left behind.
Amounts
Amounts are not converted. Every amount is passed through exactly as Ordrestyring returns it, and the results ofget_case_work_summary, list_case_hours and
list_case_sales_invoices carry an amountsNote saying so.
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.
The tool scans the most recently updated cases (sorted updatedAt DESC, pages of
200) and returns the matches. 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)
amountsNote shortened):
{ "unavailable": "<short reason>" } 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. For other fields, look up the hour
type with describe_type and query it with 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
Data the dedicated tools do not return can be read 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. The first three rows below are specific to Ordrestyring, the next two apply
to every connector, and everything else returns the generic text.
See Errors & limits for the protocol-level errors,
the other platform refusals and the rate limits shared by all connectors.