fynsight: MCP server for DATEV
de.fynsight/datevVersion 1.0.1DATEV financial data for AI assistants: P&L, KPIs, bookings, budgets and monthly reporting.
Status
Responds377 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:24 UTC
- Latency
- 377 ms
- Remotes responding
- 1 of 1
- Sign-in
- No sign-in
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 21:12 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://mcp.fynsight.de/mcpResponds377 msNo sign-in
Claude Code
claude mcp add --transport http datev https://mcp.fynsight.de/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: datev
Remote MCP server URL: https://mcp.fynsight.de/mcpCursor
{
"mcpServers": {
"datev": {
"url": "https://mcp.fynsight.de/mcp"
}
}
}VS Code
code --add-mcp '{"name":"datev","type":"http","url":"https://mcp.fynsight.de/mcp"}'Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
29 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
aggregate_pnl_by_cost_centerP&L metrics per cost center and period across the full history, paginated over cost_center via after_cost_center and pagination.next_cursor (with categories each row counts several times against the page budget; the response states the weight). Amounts are result effect (revenue +, expense −). `revenue` is the sum of all labels in the tenant's revenue group; sales deductions and penalties booked on revenue-group labels are already netted in. include_categories=true adds the split per label (category_totals), and revenue is then the sum of the revenue-group categories. granularity quarter, year or total returns the finished rolled-up figures. available_range gives the overall time range. Hidden cost centers stay included and are marked as hidden on each row. Every number in cost_centers must be a known cost center (unknown numbers are rejected); a known cost center without P&L bookings in the range is listed in `warnings`. period_from/period_to must be valid (YYYY-MM or YYYY-MM-DD) and period_from must not be after period_to. | Not declared | Yes | Not declared | No |
answer-clarificationRecords the answer to an open clarification question raised for an anomaly case. It does NOT approve any correction (corrections are approved in the app). | No | No | No | No |
compute_aggregatesAggregates bookings and account balances (sum, avg, mom, yoy, cumulative, share, count) by period, cost center, account or category. Amounts are ledger amounts (sign_convention "ledger", see sign_convention_note): revenue and expense are both positive as booked, a negative value reduces the account. Sums are therefore not result figures; get_periodic_summaries and aggregate_pnl_by_cost_center return the result effect (revenue +, expense −). A group that contains revenue and expense accounts has mixes_revenue_and_expense=true, and the response adds a warning. With group_by=account every sub-account is its own group; the group key carries account, sub_account (null = none) and account_ref. totals.sum covers all periods in scope regardless of granularity. mom/yoy compare with the previous bucket inside the requested window; the calendar previous month comes from get_periodic_summaries with include_previous. Groups are paged via after_group and pagination.next_cursor. available_range gives the tenant's full data range; an empty page does not mean there is no data. scope.pnl_reconciled=true means each month was cross-checked against the P&L; a warning then names period, both amounts and the difference. With text_query, cost_centers or categories the result is a subset by design and not reconciled. With text_query, scope.text_match gives matched_sum, unfiltered_sum (same accounts, cost centers and months without the search term) and matched_share_pct. | Not declared | Yes | Not declared | No |
create-budget-planCreates a new budget plan. The version is incremented automatically for plans with the same name and year. A plan with type=forecast holds the ACTUAL values of the already closed months plus the forecast for the remaining months of the year; otherwise year and YTD comparisons against actuals are wrong. The closed months can be read via get_periodic_summaries (category_totals) and are loaded together with the forecast via upload-budget-entries as category entries. | No | No | No | No |
draft-report-commentCreates an AI DRAFT explanation (status ai_draft) for a position of the month report. The draft has a short form (`summary`: one sentence saying why the number deviates, no figures) and an optional `detail` (may name single amounts from the material). The material is the position's figures plus the notes and clarification answers of the decided cases of the run that belong to it. Drafts are created only on request (here or by a click in the app), never automatically; list-comment-status shows which positions are still open. A draft is never published automatically: a person reviews and publishes it in the app. The response returns `summary` and `detail`. An existing explanation is never overwritten silently (see replace_published). | Yes | No | No | No |
export-reportGenerates a structured financial report as JSON. Pass either period (one month) or date_from/date_to (a range), never both; invalid or contradictory values are rejected with an error. report_type=pnl: the P&L lines of the period or range as one list ordered by period, without a period argument ALL months (a long history can be large). report_type=category-breakdown: summary figures and category totals. Default is the latest month with data and the output carries one month. For a range of several months it returns months[] (one entry per month, each with summary, categories and category_totals) plus total (the sum of the months with summary re-derived from the summed buckets, not added up from the monthly summaries). report_type=kpi-dashboard: the KPI values with change against the previous month. Default is the latest month with data; for a range of several months it returns months[] with the KPIs of each month, at most 12 months per call (more is rejected). category-breakdown and kpi-dashboard answer with an error naming the available data range when the period or range has no data; in a multi-month range, months without data are listed in missing_periods. | Not declared | Yes | Not declared | No |
generate-month-reportCreates the first report draft of a run whose figures a person has already approved in the app (run status approved). Any other status is rejected with the status named; regenerating an existing report is not possible here (it can mark edited texts for review or drop them) and stays in the app. Fynsight's own AI writes the driver sentences of the headlines and the three summary sentences from the computed figures and the published explanations, so the figures and explanation texts of this period are sent to Fynsight's AI provider (see data flows in the documentation). The result is a DRAFT: it is reviewed, published and signed off in the app. If building the report fails, the run goes to failed (a new run and a new approval are then needed). Returns the deeplink to the report. | Yes | No | No | No |
get_all_accountsLists the tenant's accounts with label, category, sub_account, account_ref ("8400" or "8400/130", the notation of the accounts filters in other tools), is_pnl_account, is_revenue_account and knw_row_number. Each sub-account is its own row. Categories are the tenant's own P&L labels and balance-sheet categories. Filters: exact category, account number range (account_from/account_to) and is_pnl (P&L vs. balance sheet accounts). Without limit every matching account is returned (paginated internally, no row cap); with limit the response reports limit and truncated=true when more accounts exist. | Not declared | Yes | Not declared | No |
get_budget_vs_actualBudget (Soll) vs. actual (Ist) with variance and YTD summary for one plan (plan_id from list_budget_plans). detail=summary omits period_rows and row_count. Besides the per-category rows (period_rows, ytd_summary) the response carries derived P&L metrics for plan and actual: `metrics` (per period) and `metrics_ytd` (all periods of the response) with revenue, other_income, cogs, opex, depreciation, financial, tax, gross_margin, ebitda, ebit, ebt and net_income (= Jahresueberschuss), each with budget, actual, variance and variance_pct. They are computed from tenant_config.pnl_labels exactly like get_periodic_summaries.metrics. `unmapped_categories` lists categories with amounts but no subtotal_group (not part of any metric). With cost_center set, actuals of the metrics are tenant-wide (see metrics_note). Account level (granularity=account): one row per account/sub-account of the plan, key "8400" (the main account = sub-account 000, compared against the actuals of the main account only) or "8400/130" (a specific sub-account, compared against that sub-account only); the two never overlap and are not summed. All granularities (category, account and BAB row) use the result view: revenue positive, expense negative, plan and actual alike (budget plans stored with positive expenses are normalized), so the account rows of a category add up to that category's value and a positive variance always means better for the result. | Not declared | Yes | Not declared | No |
get_cost_center_listLists all cost centers of the tenant with id and name, plus total_count and hidden_count. Rows carry `hidden: true` when the tenant has hidden that cost center in the app; it still holds bookings and still counts towards company-wide figures, but is no longer selectable. | Not declared | Yes | Not declared | No |
get_metric_trendTime series of a single named metric across periods, with month-over-month and year-over-year change per point (value, change, change_percentage, yoy_change, yoy_change_percentage, compared_period). The metric is one bucket (revenue, other_income, cogs, opex, depreciation, financial, tax), one derived P&L aggregate (gross_margin, ebitda, ebit, ebt, net_income) or one P&L category from tenant_config.pnl_labels. get_periodic_summaries returns all metrics of a period at once (including sort_order and include_previous); compute_aggregates covers account/cost-center/category sums with grouping, share or cumulative but cannot compute the derived aggregates (ebitda etc.). Time range: `periods` (a count of the most recent periods, default 12) or `date_from`/`date_to`; not a period list as in other tools. | Not declared | Yes | Not declared | No |
get_periodic_summariesP&L summaries per period: metrics (EBIT, EBITDA, margins, depreciation, financial, tax) and category_totals, as result effect (revenue +, expense −). Each summary's metrics.category_totals_sort_order gives the GuV-Explorer display order per category (lower sorts first). granularity quarter, year or total sums the months in the tool and re-derives the metrics. Per-account balances are omitted by default; include_account_totals=true adds `totals` per summary. include_previous compares each summary with its CALENDAR predecessor (loaded automatically; granularity total has none): previous_period, previous_comparison (per headline figure: current, previous, delta_absolute, delta_percentage) and delta_category_totals (same keys as category_totals, with label_ids, current, previous and the deltas). A category without bookings in a period that has computed metrics counts as 0, not null; delta_percentage is null when the previous value is 0. All deltas are null (not 0) when a side has no computed metrics. For quarter/year, if the bucket or its predecessor covers fewer months than the bucket length (3/12; see months_covered and previous_months_covered), all deltas are null and a warning names the period. Every response carries available_range ({from, to}, YYYY-MM); requested months without a ledger row are listed in missing_periods and named in a warning. An invalid period such as 2026-13 is rejected. | Not declared | Yes | Not declared | No |
get-month-run-statusReturns the status of a Monatsreporting run (month-end close): its phase plus the number of open anomaly cases, open clarification questions and open follow_up checks (follow_ups_open). period (YYYY-MM) selects the active run of that month (not superseded or failed); without a run for it the answer says so. run_id takes precedence over period; with neither, the most recent run is returned. READ ONLY. A run is started with start-month-run; approving, publishing and closing happen only in the app. | Not declared | Yes | Not declared | No |
get-variance-bridgeResult bridge for a month: EBITDA, EBIT and net income from a comparison value to actual, step by step per P&L category. READ ONLY. compare_to: previous_month, previous_quarter_month, previous_year or budget (plan_id optional, only with budget; default is the active plan of the year of the period, without one the call fails with NO_ACTIVE_BUDGET_PLAN). All amounts are result impact (revenue +, expense -, positive = improves the result; deltas = actual - comparison). start/end come from the computed metrics, the steps from category deltas, check.reconciles proves they add up (on unrounded values). unassigned = result change no category of this metric explains (labels without id or subtotal group, accounts without label); excluded lists what is left out (unlabeled_accounts, labels_without_group) and a warning appears when either is non-empty. rounding_difference = end - (start + steps + other + unassigned) on the rounded figures. Steps carry sort_order (P&L order) and auffaellig; the list is sorted by absolute delta. Small steps (below other_threshold, share of the absolute total change, default 0.05) are collapsed into other with their list. | Not declared | Yes | Not declared | No |
list_budget_plansLists the tenant's budget plans with id (the plan_id that get_budget_vs_actual takes), name, year, version, status and type, optionally filtered by year and status. | Not declared | Yes | Not declared | No |
list_organizationsList every organisation the authenticated user is a member of. Each entry reports the user's role, whether the org is a holding (is_holding, derived from its holding entitlement), and which org is currently active for this MCP session (is_active=true). parent_organization_id holds the parent organisation's ID for a child organisation, and null otherwise; parent_relation says what kind of child it is: 'client' (client tenant of a service provider) or 'subsidiary' (subsidiary of a holding), null for an organisation without a parent. | Not declared | Yes | Not declared | No |
list-comment-statusFor a Monatsreporting run, lists every P&L position and whether it is commented, has an AI draft, or is still open. Covers P&L lines, summary metrics, cost centers and the total, each with a shareable deeplink and the published/draft comment text (body). Optional filters target_type and state. READ ONLY. | Not declared | Yes | Not declared | No |
list-manual-adjustmentsLists the tenant's manual correction bookings. status is one of pending, approved, rejected or superseded; period (YYYY-MM or YYYY-MM-DD) restricts the list to one month. Without filters all statuses are returned. | Not declared | Yes | Not declared | No |
list-open-anomaly-casesLists the anomaly cases of a Monatsreporting run: view summary (default) gives counts, sums and top cases, view cases lists single cases, filtered and paginated. status: open (default), decided (resolved/dismissed) or all. by_cost_center entries carry hidden (hidden in the app) and are never dropped. Amounts (actual, reference, delta = actual - reference, delta_pct) are taken unchanged from the detection rules; only budget_deviation and mom_outlier carry delta (sign_flip: actual = current, duplicate_suspicion: actual = amount, missing_account: no amount). sum_abs_delta is per kind, never mixed across kinds (null plus cases_without_delta for kinds without delta). commentary is the case note (Reporting-Vermerk): material for the comment of the position while the case is open, the short form of that comment once a person accepts it in the app. The report shows comments (list-comment-status), not case notes. commentary_source: ai = AI review, user = a person, null = older case. A follow_up case checks an earlier watch item: watch holds the original statement and the result (recurred true/false/null; position_missing true = position not assessable this month, which is not "did not recur"). Each case carries clarification (open or answered question with context, suggestions, answer) or null; the summary counts open_clarifications and follow_ups. updated_at is the last change of the case, not the decision time. | Not declared | Yes | Not declared | No |
note-anomaly-caseWrites the reporting note (Reporting-Vermerk) of an open anomaly case, e.g. "one-off consulting invoice". The month report shows explanations, not case notes: once the case is decided in the app, the note becomes material from which the explanation draft of the position is written. It changes ONLY this note, never the case status; deciding a case (resolved/dismissed) happens in the app. A case that already has a note is rejected (CASE_NOTE_EXISTS, existing_note returned) unless replace is true, which overwrites the existing note. Only possible before the figures are approved (run status up to awaiting_approval); from approved on, and for decided cases, the call is rejected. The internal processing note is never touched. | Yes | No | Yes | No |
propose-manual-adjustmentProposes a manual correction booking (Korrekturbuchung) for a month, e.g. an unbooked invoice or an anomaly correction on a specific account and cost center. This does NOT post to the ledger: it creates a PENDING proposal that a human approves in the web app. | No | No | No | No |
propose-transaction-correctionProposes a correction to an EXISTING ledger booking: wrong cost center, wrong account, wrong amount or wrong month. This does NOT change the original booking and does NOT post to the ledger: it creates a PENDING proposal that a human approves in the web app. On approval a reversal of the original booking plus a corrected re-booking are written. The transaction id is the `id` of a row from `search_cost_center_transactions`. A booking that does not exist yet is proposed with `propose-manual-adjustment`. | No | No | No | No |
query_kpisCalculates the values of the tenant's active KPIs for a period: value, unit, format_type, previous_value, change and change_percentage (month-over-month change) and positive_trend_is_good per KPI. | Not declared | Yes | Not declared | No |
search_cost_center_transactionsSearches individual bookings. Each row has period, cost_center, account, sub_account, contra_account, contra_sub_account (null if none), amount, description, transaction_date (day-exact booking date), `id` (the transaction_id for propose-transaction-correction) and `source` ("upload" or "manual"), plus correction_status ("none" | "pending" | "corrected") and correction_role (null | "reversal" | "rebooking"): whether a booking has an open or approved correction, or is itself the reversal/re-booking line of one. accounts takes "8400" (main account) or "8400/130"; each entry matches exactly that variant and unknown accounts are rejected. text_query is a case-insensitive substring of description OR reference; % and _ are searched as characters, not as wildcards. limit_count is a whole number of at least 1 (default 200, values above 1000 are capped at 1000; anything else is rejected). With truncated=true more bookings match than were returned; beyond 1000 only narrowing the filters helps. available_range gives the tenant's data range. With group_by the response carries `groups` (by period and/or cost center, each with transaction_count and transactions_truncated) instead of `rows`. Counts are reported in total_count (returned bookings), group_count (groups) and transaction_count per group; limit_count is a cap, not a count. The tool returns single bookings; sums per month, cost center or account come from compute_aggregates. | Not declared | Yes | Not declared | No |
start-month-runStarts the Monatsreporting run (month-end close) for a month, only when that month has NO run yet (any status except failed/superseded counts, including signed-off months). Otherwise nothing is written and the existing run is returned with already_exists true, its status and a deeplink, so calling it twice is safe. It never replaces a run; restarting happens only in the app, with confirmation. The month must have booking data, otherwise NO_DATA_FOR_PERIOD is returned and no run is created. Starting normalizes the figures, collects anomaly cases and checks due watch items against them (no approval). Nothing runs in the background afterwards: AI reviews and comment drafts are created only when a person asks for them in the app. Follow-up tools: get-month-run-status, list-open-anomaly-cases. | No | No | No | No |
switch_organizationSwitch the active organisation for subsequent MCP tool calls (e.g. get_periodic_summaries, query_kpis). The user must be a member and the target org must have an active subscription. The switch applies to this MCP client only, for every agent that uses it. Agents that work in parallel should not switch; they pass organization_id with each tool call instead, which runs that single call in the named organisation and leaves the active one unchanged. | No | No | Yes | No |
update-manual-adjustmentEdits a PENDING manual correction proposal (amount, account, cost center, description, note, period). Approved bookings cannot be edited; they are deleted in the app. | Yes | No | Yes | No |
upload-budget-entriesInserts or updates budget entries (monthly values) of a plan; a value that already exists for the same entry and month is overwritten. Exactly one of category, account or knw_row_number is set per entry. An account entry may name one sub-account as part of the account, e.g. "8400/130" (slash, as shown in the app); there is no separate sub_account parameter. The main account is sub-account 000: "8400" and "8400/000" mean the same and are compared against the actuals of the main account ONLY (not the sum of the sub-accounts; main-account and sub-account entries never overlap). If the account has no main account but exactly ONE sub-account, that one is used; with SEVERAL the entry is rejected (BUDGET_ACCOUNT_AMBIGUOUS, sub-accounts listed). A sub-account that does not exist for the tenant is rejected (BUDGET_ACCOUNT_UNKNOWN). An account unknown to the tenant is still accepted. Amounts are signed (expenses negative); plans created from a file upload that store expenses as positive magnitudes are rejected. For a forecast plan (type=forecast) the entries cover the ACTUAL values of the closed months plus the forecast of the remaining months (see create-budget-plan); without the closed months the year/YTD comparison is wrong. A category name that matches no P&L label is rejected with the list of valid category names and nothing is written. | Yes | No | Yes | No |
withdraw-manual-adjustmentWithdraws (deletes) a PENDING manual correction proposal that has not been approved yet. Approved bookings are deleted in the app. | Yes | No | Yes | No |
Details
- Registry status
- Active
- Published
- Nov 5, 2026
- Updated
- Nov 5, 2026
- Repository
- Not given
- Categories (suggested)
- Data and analyticsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared